From 91b0ada6981123391357e1963ddde425b3c65ab4 Mon Sep 17 00:00:00 2001 From: dapregi Date: Mon, 21 Sep 2020 09:27:58 +0100 Subject: [PATCH 001/412] template: fixed python script for 1000G template #1472 --- ...ml_generator.py => 1000G_yml_generator.py} | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) rename opencga-app/app/misc/demo/{1000g_yml_generator.py => 1000G_yml_generator.py} (90%) diff --git a/opencga-app/app/misc/demo/1000g_yml_generator.py b/opencga-app/app/misc/demo/1000G_yml_generator.py similarity index 90% rename from opencga-app/app/misc/demo/1000g_yml_generator.py rename to opencga-app/app/misc/demo/1000G_yml_generator.py index af0ecee41ba..b60cd7065aa 100644 --- a/opencga-app/app/misc/demo/1000g_yml_generator.py +++ b/opencga-app/app/misc/demo/1000G_yml_generator.py @@ -17,7 +17,7 @@ } _VARIABLE_FIELDS = ['Relationship', 'Siblings', 'Second Order', 'Third Order', 'Other Comments'] -FNAME_TEMPLATE = 'ALL.chr{}_GRCh38_sites.20170504.vcf.gz' +FNAME_TEMPLATE = 'ALL.chr{}.shapeit2_integrated_snvindels_v2a_27022019.GRCh38.phased.vcf.gz' def to_camel_case(text): @@ -108,12 +108,22 @@ def create_families(ind_info): def create_files(): text = [] text.append('files:') - for chrom in list(range(1, 23)) + ['X', 'Y']: + for chrom in list(range(1, 23)) + ['X']: text.append('{}- name: {}'.format(' '*2, FNAME_TEMPLATE.format(chrom))) text.append('{}path: {}'.format(' '*4, 'data')) return '\n'.join(text) +def create_attributes(): + text = [] + text.append('attributes:') + text.append('{}variant-index-run:'.format(' '*2)) + text.append('{}loadArchive: NO'.format(' '*4)) + text.append('{}loadHomRef: NO'.format(' '*4)) + text.append('{}loadSplitData: CHROMOSOME'.format(' '*4)) + return '\n'.join(text) + + def _setup_argparse(): desc = 'This script creates automatically all Python RestClients files' parser = argparse.ArgumentParser( @@ -139,17 +149,18 @@ def main(): yml_fhand.write('---\n') yml_fhand.write('# WARNING: AUTOGENERATED CONTENT\n') - yml_fhand.write('id: 1000g\n') + yml_fhand.write('id: 1000G\n') yml_fhand.write('name: 1000 Genomes phase 3\n') yml_fhand.write('description: The 1000 Genomes Project\n') yml_fhand.write(create_variable_sets(header) + '\n') yml_fhand.write(create_individuals(ind_info) + '\n') yml_fhand.write(create_families(ind_info) + '\n') yml_fhand.write(create_files() + '\n') + yml_fhand.write(create_attributes() + '\n') ped_fhand.close() yml_fhand.close() if __name__ == '__main__': - sys.exit(main()) \ No newline at end of file + sys.exit(main()) From e93f0d5141405325bb23bf33688d920394da03e8 Mon Sep 17 00:00:00 2001 From: Nacho <1427327+imedina@users.noreply.github.com> Date: Fri, 27 Nov 2020 12:02:48 +0000 Subject: [PATCH 002/412] Update README.md --- docs/using-opencga/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/using-opencga/README.md b/docs/using-opencga/README.md index a16be064016..e3cf8d4f883 100644 --- a/docs/using-opencga/README.md +++ b/docs/using-opencga/README.md @@ -126,3 +126,5 @@ To be documented soon. To be documented soon. +#### Test +test From 1ccc027c05668b09b4cc077885c997c4aef6141e Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Fri, 27 Nov 2020 12:10:19 +0000 Subject: [PATCH 003/412] GitBook: [develop] 3 pages and one asset modified --- .../analysis.alignment.webservices (1).png | Bin 0 -> 187384 bytes docs/README.md | 4 +--- docs/components/alignment-and-coverage.md | 2 +- docs/using-opencga/README.md | 20 +++++++++++++++--- 4 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 docs/.gitbook/assets/analysis.alignment.webservices (1).png diff --git a/docs/.gitbook/assets/analysis.alignment.webservices (1).png b/docs/.gitbook/assets/analysis.alignment.webservices (1).png new file mode 100644 index 0000000000000000000000000000000000000000..17ccaa57aa9d7cc075a606421fe44583d532581b GIT binary patch literal 187384 zcmcHgV|XUdwg(J%Y+DmeY@0L5Ol;e>otfCSt%>bSY}>Z&Jo)c^_Bs3g`d-iT;l8T7 z`mWWhYOPwe@aqs+=^qHNxUc{KAc+0^E)M_@Pyhf10uB1vvo@a~`q{wP{#0`S0940+ zejw|{gsuQU1c-eXQglr}ZTC?{Q@MZina3qZCEJ<*`ja}m0>mG7sX-T(-;Yv`XQh(86g%dquCq5PsE-xrs&e+#zY3L*z`@bkeF$~g({x3b~-W|CAcZV~37DHfv z9}NBD=!ORXanXY$0gu^@f+f2UWU#SR@!vyX_On$4IAuduZ&5KIfKBSyq27wZoldB& z|C_}2)^*W__lp(d2`P=e14jN)QW>TEGmx&pLmBJuBUKCubO|dQ?_Tv1EyxV*v=?2N zf&;n}AL0pkPm`=HGlVw{1z{m%6s7=B+4-TE^cCFqhp_Aat%>U`_O7a(hET5Mklylb z93PYl#;e{dgSgUy@q1Az!e$PQGvPjg`xYS;WlcmrklaKQ*}eat749_{+pM6mrWs0@ z!R%zaUPYa@KH9)*`l`G?0SSys;L_ZAKZ34CxdmxH{s;|a%dIvTh$PdOD9*uz_+Kf& z)A=1^q_wk;`h*HV0@*QGgCCsM)n%+&LhsH89HsOs?D5i9zN0+7-2&pW*MELL=V1O@ z;=LFCBS{QM_0Yi`LTmm_gpe$LsjMDW-Gi=n=Xi5-Kx(We7gd6K!HK+8Xec)-U~5x7 ziQy}+6hBCFyi8eG*7%bIrFnVSj7$jw10$3>p){h`u3L#RHaLJCPMtl!v{)9$?^l0= zWrjW~NsQeKRgE-#rR;2dJxJ5Gf1~VIRFt)vI466Nw6SAfbA`b@3@7Rugs!=SOU%$0 z%!@Bam2PKR);g|4C%a_!0ipT6A!z=MWzGELGjkfd5gLmlN|g8gbQQWSuzjc@PEPv` z;fV#y=+~&txe=hNN|cG>ZC78$mjC3pvMU8>YRfH%f}l~fiL}$LP#SV!&_` zqf3mArI^zEWH4oYuN9^rNCCPWF+$xFzx}UHM?rKV;Bs`N_OQ<$p}6diU%BwX3oPCs ztya^!TDedfQ@fl!Cdwj>3V#_jklrUNgFAn%^LR)90?F6KEBxX88ff%4tKl(iJfKkX z>2v#?!y*gflwGqEnQ3+Qe@L5nKU_U53U#=i{ zZmmZof7(XW!V|v%b$xrIxY6V3-gq=?M5rID%0p6H!c2>`KN`+yqT(G9PWHL|MUzO9 zyxgrl*k(`V(BbrE`O)-k!MoLdbB)TfOuVfHVU2DrW$oszJQN4PqO-X&x12#&CgkJ` zIfwVK=YqO3^mft@nqL&cj+4*IzOl8GpwXiix>q&2CIbz=Dh!EniOdzA(wP$>Y zM!-_D^u2~F3h`t-Ng{5Q z;|HNVNSOMVOMcvU;(`Fn60qn*m^jk17!aarAiVj^OlX6@RgXfu@3oaCf3dKnRl zr;TE=(kE}Zr8ydy2z1S1dxKOG=9ySlQBS>k+f3O%zDU44v8& zIvkxEXq7cpNKQ)V>11NX73U(9Gm1*qiQ}kk`$F8ydK|r+E&r%m%E1);jQxo^e$Ps` z=Bgj0D2%CSDCQ3CV&)dBSX$apq2l2D!|+cNy-FyUELlkP2lt8vCGo#3H6S08kSeEM zHjn4c-3l={UxDcW;#f{y0K35N3WHmd=;f;3bHWokPd5=L z;=w-F4I)T0vDl`9(ZX(#GAXJAnZiTZHrg(C8f&EtUO5qbRiF4Xrrj;5n}Xg!t18Z~ z%t@WDN)=Juk+NfSkh(uC4!;hK?W6bc$S2%Qxu|vq5O_-F*n6?$1Op= zJ5*1HET$)+t?ld$s?^4y3bYt_`p&p+6|3W!qGxk=XUPlcokfP{>(d0=c@xG)RJ7vF zq7^YuFP+Fq*K;{60$MG%GdXk&*gamjZsyh*U^&V9YWYc58xhx_4h5m8%|jsfv7(^> zrJMDyD`h*PQBV z5-6;7JTPXPtYZ7PaC3v4RtzT$dl9X3PX)?3(&sKV`IuRSp#Ecb1P}4s#I=;xk97j0 z`N3LP#df^xlQKLr?ZZ~8Ru%=?-*smuGP5&<;@X#o6}|QkRV}xR-}59!;oe?;Ni0}v zz8ndr6L(22m<&)TEt*$k?gwfDJKkRBE5Qx;Grx}1_>#DbyMHD+qL6$%UFQ8sNijBgoc8ALq$~DSz+RZ zYGd=@I~!7PX6|)gO+lEUUT;t0&buv~7H;Ek`019HjC1xOZil31V`KVPV+O5OHZr4= zekD1O?7^ir>!fYsw#MUM$0JUJyR6AR@9TwzGLSUNlEYF{Dw1DOSU}*tHMDaev$Zm5 zioP~@N!-I7U4y330E1sgxi2sR1v5)4B0+PWKnppQ^tQ-7D#gMj1={jZfJ1H(0*Lkd zHRTw|{g03>(taoVW>|l4fD(4M->G1eEFlE&B^g`CmJSvXw!v>}570NWG|viEFit{$ zzzp+Wm;5|mzQ$Y~d1<*Zz|XdM$rcr}fJ-ywC`tmrCTa=v2u(gncKO)2sCL_v8kw3r zK42(3{PIL_2LO&*0kHZZ>jmxGu;TI}l0ft(^|sZFOF;`w$k*jytlAY2z*I?#!1phb zieUj>Udtk!ShJYC3SgU1SU52J@hrv$%pUA3e+_YOcR94Ck0lzro2ODlrUEDWT3sC* z8=CKv!PW+Unb_Zt$T}YRZvjJ<*NB%q1P8}J+<*YSml%)_^aV4{#bRAgn#vanhC%9Z zoIxj)<44e1R%QwPbdsk_8*r+b+iDH|w%eC>6u#^Fhjj$z(=Z1+?FByAoG5>5q030s zYXWAORq^Sq(Ur@hX;`}&Rs5u55|rkSm`r90A^f*s`LizX$YOU~b`9}i8espV9WN}M z(*+eWYA&oLG(0yn7B|^cz8^X$nhs&go9F>FPq*-RCXhIqMDU3C!8Dc|zXQeeRUAF2 zc~Ujk>d;NlIk=&Et<(uD<5Oi^VZE-LPGDK=yXEzH%Pr<&2+T9$q~yZKmX2@bX&-nCcoUDCm&0tdR<+qJf;i08N&9qzHZFcF^D_E-XgHKs zfG{W`9=nfm*jNH%fIe}e)ny{p^lV{iuCUQ7#nzel{2Y#!Be_sjjyf1%<>X{FSsO*0 zY5*&;uIk)cy)G~=efTeD5uP937If0$?p~reGJggjb4GR zS3k23pcTeT$CcMMr)y)EMDvm=#21OiJjq7JhOO-5Nh^zSi;1xtVpDV^^>pU^1Hw^akW!jP*%=h@J435>FQ46< zGQ)$FcfsBRv%QB7lL<%RAAP`97cqY|hVU^n&&7rUOsQ1ggd+JZca&3#6eRv0BT2*U zbkA}1j~l=lGiX@BGBx6hNsU#Svl_E&WZM6!nX}b}GyVa6+74@463cPCw*MVm1Hpzu znEH-t-L9pMeOciUd@>rPHbpZ*GPP1}n~apF`@v3TtYQI(3wYL|cac()sSP(~#wuGdV_Rlb8C~t` zdKz8-CP1!LC)!BRDVqZGt<`mYRZq#ukmiQjSY_Q!*=^a5uhj;kglht;`D->)nL$mCzVv3+pV;teO zLMi2>-CY(3Z6oGc(H(j|Wz_iSJGO$gPLeal>O^+U{;7ev`Q4`YDmFH0 zl@QQ2xjdm0hTPsDz9{SdPf%zBQq3d&RjsJ2-6$MMR%Hq)^B?mUu6FVq60lNm5n?q- z(|lE_0X?(a8_gijJMUFCrweXDoPpbsY z9IRl!(|$36ys{zb@d~40m4efu)mpZ|;$eZDbN&^(uUuT6O31ZNGW(hFO@No%@;-wS zn1!h=(H;(tQg~H84-3mfzNIDx2Bx6xUpmXXLQ_JZaS89?bg9zuGTumAe%cdhYu~%L6~ug zOZSTAnUVB@^nOD;tMzAM5(-~tV3D=}$=>-X>P>2LKTWBCuDqd|uG|~CSV!^6!84_| zgxxXyjETG*{T5!e`^os|=xDr>9<7p{sE~_$wO4{rLRPwR1(IrulZ^5H_+xhBtNzK} zxN%)6E*mGDXNWd4oWJ#C$saSeM&-2HvUEnrn^MMu<@8-zg~0j-W~-TXNa@-BjFc2A ziyqa`_Ms)VeX&XvjISmoo<7fu)s^T1u1kfz~jG*3H;L6UIOC?o1OJ0rV5VjK;PlnlFE7G0&`%uzm`#)=3SxO=CQ zvI)o_p{vl6^ZI((thfFf^7Y50qq3^|*M<%PteUUNU)?=^Y%PfzRK<_oTwdy~Y_K(B zRmi9GZZ=F`gK~)s!-abjvXjZ1ug`=9(?$CjH48AUxo+!7WMYLXU_=r~7urgRh0IA0 zr9SuYtRuq|s6{67Zh(Pt*yteFu*C$n|6vO<5FrUsq>aaArvMujU{|(0!3`g3ODe8A zQz7tD5nc*WL@MU`cUB?tZ{L-jUV7rT)d1;D!&(Bmn9LBwdwrT%XbRSFJ7nfCoi- ztU4W|ZKT7+vu!$r`!osDxEeMJ>HRLQ``2!$_yT(j!Hq&$zl&*3v#LspzXKV7FJ6=G zuf?ROT2)TsM95~LvKoIuLdeH(ffJlsv@e#D!H1+Zl zs&#h3JiMHxgGU#lzZYCcNjWiBBr_(j?luGjNcS_E`U^g;Z|7COBp)??JUs*HlSLLk zYzzZKAJ(@GB|1tjST3(NPRc{g5kIVf10u(y|1D!{gv1lOpD>yjtxel_Jr2D4B5(w6IL2Xr~GbVp)Y-K*lVTp=BRL>PjU>G;5=3xxZ5BCbo z{NCi|k_`=Tu!HnPgF9Hp1?3izlgo3Em6T-s^*K`%d^FO2JP9~zI_(w|lq-3^;J$M%`IGMkGNwRB|+O07psb6X=)}Y75x}{WWTlR0}Kf&!3$I}aj zI1lLkZMicJ3P!^Cg4O*mm07b7b|p9}C6cH*$weTOgA%*;rQL@*aHOQ|bfHY`q%$=6 zS7b+GA!5xY5j;$dS*oNG=rpnT=LLab`VJT|7O>NCs0ufw2!+{ra0Ui5efAm>Rv^ie z@U`}*1lapRsaQ$*NuCff)k|}@Emx;{3gDS%gc;gZ{gLAj%Y$93v(}9`X{bqQh9_~O zO=GI;|C1BMhIZAJtg%@<`u!W!&2BlUKt!)>p)Xkr6_S`p5+Xx&9DdRTH+@AtVSQvUaIKC483vQtI)x)rD?hv7icNl02-D@OUE1-r6C4c ztf5}N$;Ap64icsB8EnvS}9Z;Te(s$?8<_ zLrXIyKf4&t9+s}61r5X(@uj?a(Gor64opP4t#6Ft3H9a3rs(jEgV@gf890K+cYrTk z&uhj^&4QJAL~t~u8~c zBU_i$-Ch^2R;9+d=6i(B;ed?zBxQw8j~i_M?>y=`0wziu5kDu%v19*!-SjN&2jA7N zz#w@O(TOoz_>UQLo?m}!;B~lbvEhk^q=C)n=cc2*dTQuNWh$HwJHhrxkOkdlErp&+0K`V6`>OhSW@rAeR zt}FB-yKn^(l5mSR4TS(rr{e%r9~XbEK_Wf!efv1hfZb%A`Sj_p6yi^_1sz6N6IVc& zZU=eD1IHTlcT}zKX%r9SjH>W~dkhqlC-vL_h1FQnP)T3C zyCxA4C#~#*Bhgv$pR-wzDpkw_)uxQUAv>I4>XvRo`Kfi0BpOnx6qtS>+~r?@+YEKS zLk;s?b%)I_56G8xwc_LB%61za@ijpe3LD=HC=yw~>M#k@^*L9ZU7NS(G_JPO8Q`Y* zY2W3M$u*vj|}6QTk|WkRtTKYRcwBn`!^yFU9~P{ zUfCN^r7Cjv)=bFDSaPER#Py*3b3&DBMSlW*AuvG$YkhZ5v9>+wo%m8=5MdN1B9)Y- zH)Ej!b1AEp7kmU(`SZYh_>S740Hu)PA?d^?0Oz$vdPTez>{0z8ifmP#5 zZ}g7uD-mb{u76uLgA<2e!^69G$Er#$E?!$;piPS9DeJfR8mN@1;xhyvReSdwKQ$<> zc0ug;*RNXa2Xk00BW3lHRMq%c&M-J&QogE%x>IME>kEdLwp6eIYM)%`3|A|&Jv#+Y z+Okh^acJ#sei~F!J&^>xw#gCaNxiz4i)M#H8AKq<2uwDyK)Gzl534o9MT7|6Sk;2l z2@CMVS~Op63oh58@$>cC-Vo#_p#=FU8qK2eax)0$Xq!fr)uocNbv*T=x#PbfeV{-f zOBjgj<+Pz%C%Xq>v3%Dyr=RwMSx$oVN=f7W``LCchWJiEZJxO}%XE#4B_uCdVb+F4 zE5o^m7L$^k?)`G_w6-?RKRG>x06YnM4JR2?1Hf6t=e7pO8$!_)FvMc7IEiBix8vkzW@h3HYw~LgwTk?Oq0;0U6aJt?xsZLI zUStz1IXWt_ATg+wY+hU6enD*JSG{qrTrb}sCid4SMGaBJ%sO`Mse(d8F;l;RPer5o zE-ZGMnm;?6&vwOJ5^PJrAdP>ilG@%5lQ(u)Ytj4Zo>61E|JcvfD*adSh%sm37$n`Q zT(3Ux^1<<3ky>#dY&q~4a}ycVkB}7Eoq4ui3D&5Hs4EEq`0mTFu1;EMcGe5g5y*^C zpkywcy?7PmNw7mslzvyLp5Qj7A0}>eKV&QO3$IRjjz84rFyrwTT%tI{vvPqr901RA zA{G%4unjbHa0_()HUCzJ_>^Q{U)wpCdpeJsz(xLpopP>=`0cTDW$mt+juQfu7=R)lC{v7|&vZwK@ryP4p{Z%Tu zWcE{ezM-M`7b!Ywp;bY`+p9mTG_s{>iITcw@~}44m0vHYXxXcT#V<#MCx|(BY1`yJ z{OQKo)W-E`DhnldNa9Vv7wz*TnPsbgL#se4zy`Q^_?dM!hai=t8VekUmm%A0yNW(| zOt|d4dQ^TqvCJYQf?a^vcUJ3{=JIr^e65f9?Hfi$@@EqHhK8ybxN3*^DpFlTbp&H# z24v$QU8ve&1HJ^fSWrhi(vx1AmP((AzRsS@EqzALzIIKmPlsdcv^J==9PxVpE7?8H zuQ}FCy4Qsz;WC5dg;ud@#3a%OKPW40US=vb6%>udpMHha&;ETQfjt3BMRnhKCk( zvKiu4VyyN0e}bS8>ENt4ayn^o%KkqfZgTbi`gp-?zYHR1~(p7zWemn=yCjIK~` zB<$5%HWWFSNa-bN_8`K->4E^ZeJDZ@X*Y2$TqE6HT=0BL)7i2P1zYS2Y^sO}+m~Fn zxrJ?kyPxrk$7$0Zj|O%0fnh$(b}nf1WX|A3v`foa;{DsT1ldPTAPUj#-VVIgh*`7v z#p#K$floD5*PDAEMl+eH3M`sfZ-ahm1!@U0k6j|9Z~yPrP{pbCC#!V}dk3YMYPG_% z%EkAaxSDAL7&nc1Q!1YC|G@%;@JbP4X^_OH@@v9(CEnVGrmUkL#kc&fjlhg#@4rdv zry%Q-!1r!gRQj6mSSDV&LRWd4jEa*Lk8b0T(cLb{r+X8Naa7Xml%LTE=V-8=n!h;c zc-0QW=en88b`2|MuCH(YH$*h7!`MSI=6gTlYD-1U?QeGRMAyaHHSCp@6%0Dfe=7K& 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 literal 0 HcmV?d00001 diff --git a/docs/README.md b/docs/README.md index 2cf2c5a2d95..d419a7b0f40 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,7 +8,7 @@ OpenCGA is an open-source project that implements a high-performance, scalable a OpenCGA provides the most advanced and complete genomic data platform. The performance, scalability and huge number features makes of OpenCGA an unique full-stack solution today. OpenCGA takes care of security and implements a high-performance query engine and analysis frameworks for _Big Data_ analysis and visualisation in current genomics. OpenCGA uses the most modern and advanced technologies, and has been designed and implemented to scale to hundreds of thousands if genomes accounting for petabytes of variant data. It is built on top of three main components: _Catalog Metadata Database_, _Variant Storage Engine_ and _Analysis Framework_. -### Main Features +## Main Features * **Authenticated** and **secure** platform to query and visualise data. An advanced **permission** system has been implemented to ensure data privacy. * A **metadata database** to keep track of registered users, projects, studies, files, samples, families, jobs, ... @@ -23,5 +23,3 @@ OpenCGA provides the most advanced and complete genomic data platform. The perfo * Interactive **web-based application** to query, analyse and visualise variants, alignments and clinical data * **Zetta Genomics** start-up is being launched in 2019 to offer official support and customisation. **OpenCB Enterprise** will be launched in 2020 with many new features! - - diff --git a/docs/components/alignment-and-coverage.md b/docs/components/alignment-and-coverage.md index d35ceaf881c..79cc66dc9ca 100644 --- a/docs/components/alignment-and-coverage.md +++ b/docs/components/alignment-and-coverage.md @@ -39,5 +39,5 @@ The tutorial [Working with Alignment Data](http://docs.opencb.org/display/opencg Next image shows the OpenCGA RESTfull web services to manage alignment data: -![](../.gitbook/assets/analysis.alignment.webservices.png) +![](../.gitbook/assets/analysis.alignment.webservices%20%281%29.png) diff --git a/docs/using-opencga/README.md b/docs/using-opencga/README.md index e3cf8d4f883..5d0a7cca51c 100644 --- a/docs/using-opencga/README.md +++ b/docs/using-opencga/README.md @@ -18,7 +18,7 @@ We have deployed a public _**demo**_ installation to facilitate the testing and OpenCGA _demo_ REST URL is available at [http://bioinfo.hpc.cam.ac.uk/opencga-prod/](http://bioinfo.hpc.cam.ac.uk/opencga-prod/). You can check REST API and documentation at [http://bioinfo.hpc.cam.ac.uk/opencga-prod/webservices/](http://bioinfo.hpc.cam.ac.uk/opencga-prod/webservices/). -We have created a read-only user called _**demouser**_ with password _**demouser**_. As in most OpenCGA installations where normal users are not the owners of the data, _demouser_ has been given VIEW access to all _demo_ user data, this is a very common configuration in OpenCGA where the owner of the data grant access to other users. In this _demo_ installation the owner of the data is _demo_ user, while _demouser_ user is the public user created to query data. +We have created a read-only user called _**demouser**_ with password _**demouser**_. As in most OpenCGA installations where normal users are not the owners of the data, _demouser_ has been given VIEW access to all _demo_ user data, this is a very common configuration in OpenCGA where the owner of the data grant access to other users. In this _demo_ installation the owner of the data is _demo_ user, while _demouser_ user is the public user created to query data. ### Genomic Data @@ -108,11 +108,11 @@ In order to make this _demo_ more useful to users we have loaded or simulated so #### 1000g -We loaded the 1000 Genomes pedigree file, you can find a copy at [http://resources.opencb.org/opencb/opencga/templates/demo/20130606\_g1k.ped](http://resources.opencb.org/opencb/opencga/templates/demo/20130606_g1k.ped) +We loaded the 1000 Genomes pedigree file, you can find a copy at [http://resources.opencb.org/opencb/opencga/templates/demo/20130606\_g1k.ped](http://resources.opencb.org/opencb/opencga/templates/demo/20130606_g1k.ped) #### uk10k -There is no possible clinical data in this study. This is a _WGS aggregated_ dataset so no samples or genotypes were present in the dataset and, therefore, no _Individuals_ or _Samples_ have been created. +There is no possible clinical data in this study. This is a _WGS aggregated_ dataset so no samples or genotypes were present in the dataset and, therefore, no _Individuals_ or _Samples_ have been created. #### corpasome @@ -127,4 +127,18 @@ To be documented soon. To be documented soon. #### Test + test + +#### Test2 + +test2 + +#### Test 3 + +aaa + + + + + From 3bd744b80c94c50853fa8a389c23ad096bbd17df Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Sun, 29 Nov 2020 01:01:14 +0000 Subject: [PATCH 004/412] GitBook: [develop] 27 pages and 3 assets modified --- ... analysis.alignment.webservices (1) (1).png} | Bin docs/.gitbook/assets/opencga_architecture.png | Bin 0 -> 83987 bytes docs/components/alignment-and-coverage.md | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename docs/.gitbook/assets/{analysis.alignment.webservices.png => analysis.alignment.webservices (1) (1).png} (100%) create mode 100644 docs/.gitbook/assets/opencga_architecture.png diff --git a/docs/.gitbook/assets/analysis.alignment.webservices.png b/docs/.gitbook/assets/analysis.alignment.webservices (1) (1).png similarity index 100% rename from docs/.gitbook/assets/analysis.alignment.webservices.png rename to docs/.gitbook/assets/analysis.alignment.webservices (1) (1).png diff --git a/docs/.gitbook/assets/opencga_architecture.png b/docs/.gitbook/assets/opencga_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..029a688e986b575fbbc1d9d4b06b88f03f3636f2 GIT binary patch literal 83987 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 literal 0 HcmV?d00001 diff --git a/docs/components/alignment-and-coverage.md b/docs/components/alignment-and-coverage.md index 79cc66dc9ca..36cadeba5ad 100644 --- a/docs/components/alignment-and-coverage.md +++ b/docs/components/alignment-and-coverage.md @@ -39,5 +39,5 @@ The tutorial [Working with Alignment Data](http://docs.opencb.org/display/opencg Next image shows the OpenCGA RESTfull web services to manage alignment data: -![](../.gitbook/assets/analysis.alignment.webservices%20%281%29.png) +![](../.gitbook/assets/analysis.alignment.webservices%20%281%29%20%281%29.png) From 0100d4670c7151b2d80b0e124a599a65839538ff Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Sun, 29 Nov 2020 02:58:53 +0000 Subject: [PATCH 005/412] GitBook: [develop] 27 pages modified From 61a73a34aaca4847e3d4d227307081d41e21cfac Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Sun, 29 Nov 2020 03:58:12 +0000 Subject: [PATCH 006/412] GitBook: [develop] 27 pages and one asset modified --- docs/.gitbook/assets/opencga_binary-github.png | Bin 0 -> 162954 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/.gitbook/assets/opencga_binary-github.png diff --git a/docs/.gitbook/assets/opencga_binary-github.png b/docs/.gitbook/assets/opencga_binary-github.png new file mode 100644 index 0000000000000000000000000000000000000000..6c9f6626e6687d44dfbadc03575e72989937ffaa GIT binary patch literal 162954 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 K_c7X!|M)*ziT-f_ literal 0 HcmV?d00001 From 2379d36e38dbd1ee9f0357dea5451fde0c119fd4 Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Sun, 29 Nov 2020 04:50:14 +0000 Subject: [PATCH 007/412] GitBook: [develop] 27 pages and one asset modified --- docs/.gitbook/assets/opencga-rest-example.png | Bin 0 -> 118933 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/.gitbook/assets/opencga-rest-example.png diff --git a/docs/.gitbook/assets/opencga-rest-example.png b/docs/.gitbook/assets/opencga-rest-example.png new file mode 100644 index 0000000000000000000000000000000000000000..3a39b8d97fd7e20adb47cb457bb047d430047e4d GIT binary patch literal 118933 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

de novo Analysis +

de novo Analysis

filter = PASS

consequence type = LoF + missense_variant

@@ -338,7 +338,7 @@ Several user interfaces have been developed to query and analyse data from OpenC ### IVA -[IVA](http://docs.opencb.org/display/iva/Welcome+to+IVA) v1.0.3 was installed to provide a friendly web-based analysis tool to browse variants and execute clinical analysis. +[IVA](http://docs.opencb.org/display/iva/Welcome+to+IVA) v1.0.3 was installed to provide a friendly web-based analysis tool to browse variants and execute clinical analysis. ![](http://docs.opencb.org/download/attachments/15598206/GEL_IVA_RD38_grid.png?version=1&modificationDate=1560259726188&api=v2) diff --git a/docs/installation/README.md b/docs/installation/README.md index 2bbcf627397..511ddf6feee 100644 --- a/docs/installation/README.md +++ b/docs/installation/README.md @@ -6,15 +6,7 @@ OpenCGA has been designed and implemented to run natively in both _cloud environ ### Cloud Environment - - ### HPC Cluster on-prem - - ### Docker - - - - diff --git a/docs/installation/compute-cluster/README.md b/docs/installation/compute-cluster/README.md index 98206054dcf..a024b0be358 100644 --- a/docs/installation/compute-cluster/README.md +++ b/docs/installation/compute-cluster/README.md @@ -1,6 +1,6 @@ # On-Premise HPC Cluster -You can install OpenCGA on a local HPC cluster. Installing and configuring OpenCGA consists of different steps, as you will see on this page you must first make sure that the server\(s\) have all dependencies installed, then you can configure and complete the installation. +You can install OpenCGA on a local HPC cluster. Installing and configuring OpenCGA consists of different steps, as you will see on this page you must first make sure that the server\(s\) have all dependencies installed, then you can configure and complete the installation. ## Installation and Configuration diff --git a/docs/installation/compute-cluster/building-from-source.md b/docs/installation/compute-cluster/building-from-source.md index 7182704bd6d..55d6831e112 100644 --- a/docs/installation/compute-cluster/building-from-source.md +++ b/docs/installation/compute-cluster/building-from-source.md @@ -21,7 +21,7 @@ You can learn how to install them in this section at [Server Configuration](serv OpenCGA as any other software has dependencies, some of them come from other OpenCB projects such as CellBase while others are third-party dependencies such as MongoDB. All OpenCGA _**stable**_ releases are always merged and tagged at _**master**_ branch \(users are encouraged to use latest stable release for production\), you can find all releases at [OpenCGA Releases](https://github.com/opencb/opencga/releases). We guarantee that all the dependencies needed for building stable releases are deployed at [Maven Central Repository](http://search.maven.org/), this is true for both OpenCB and third-party dependencies. Therefore for building a stable release you only need to clone OpenCGA repository itself since all the dependencies will be fetched form Maven Central repository. -This is different for development branches. Active OpenCGA development is carried out at _**develop**_ branch, in this branch third-party dependencies will be still fetched from Maven Central Repository **but** this is not true for OpenCB dependencies since it is very likely they are still in development and therefore they are not deployed. Keep in mind that we only guarantee that _develop_ compiles and that bugs are expected, use this branch for development or for testing new functionalities. So, for building _**develop**_ branch you may require to download and install the following OpenCB repositories in this order: +This is different for development branches. Active OpenCGA development is carried out at _**develop**_ branch, in this branch third-party dependencies will be still fetched from Maven Central Repository **but** this is not true for OpenCB dependencies since it is very likely they are still in development and therefore they are not deployed. Keep in mind that we only guarantee that _develop_ compiles and that bugs are expected, use this branch for development or for testing new functionalities. So, for building _**develop**_ branch you may require to download and install the following OpenCB repositories in this order: * _java-common-libs:_[https://github.com/opencb/java-common-libs](https://github.com/opencb/java-common-libs) \(branch 'develop'\) * _biodata_: [https://github.com/opencb/biodata](https://github.com/opencb/biodata) \(branch 'develop'\) @@ -36,7 +36,7 @@ git clone -b develop https://github.com/opencb/java-common-libs.git git clone -b develop https://github.com/opencb/biodata.git git clone -b develop https://github.com/opencb/cellbase.git git clone -b develop https://github.com/opencb/oskar.git - + ## Now you can execute the following command in each of the folders the specified order above mvn clean install -DskipTests ``` @@ -48,7 +48,7 @@ You can clone OpenCGA from GitHub by executing: ```bash ## Latest stable version git clone -b master https://github.com/opencb/opencga.git - + ## Develop branch, for this to work remember to clone and build OpenCB dependencies (see above) git clone -b develop https://github.com/opencb/opencga.git ``` @@ -167,286 +167,286 @@ The first time this command can take some minutes since it has to fetched and st ```bash build/ ├── analysis -│   ├── clinical-variant-query.yml -│   ├── individual-qc -│   ├── interpretation-zetta -│   ├── R -│   └── resources +│ ├── clinical-variant-query.yml +│ ├── individual-qc +│ ├── interpretation-zetta +│ ├── R +│ └── resources ├── bin -│   ├── opencga-admin.sh -│   ├── opencga-internal.sh -│   ├── opencga.sh -│   └── utils +│ ├── opencga-admin.sh +│ ├── opencga-internal.sh +│ ├── opencga.sh +│ └── utils ├── clients -│   ├── python -│   └── R +│ ├── python +│ └── R ├── cloud -│   ├── aws -│   ├── azure -│   ├── docker -│   └── kubernetes +│ ├── aws +│ ├── azure +│ ├── docker +│ └── kubernetes ├── conf -│   ├── client-configuration.yml -│   ├── configuration.yml -│   ├── hadoop -│   ├── log4j2.internal.xml -│   ├── log4j2.service.xml -│   ├── log4j2.xml -│   ├── opencga-env.sh -│   └── storage-configuration.yml +│ ├── client-configuration.yml +│ ├── configuration.yml +│ ├── hadoop +│ ├── log4j2.internal.xml +│ ├── log4j2.service.xml +│ ├── log4j2.xml +│ ├── opencga-env.sh +│ └── storage-configuration.yml ├── libs -│   ├── accessors-smart-1.2.jar -│   ├── activation-1.1.jar -│   ├── adal4j-1.6.3.jar -│   ├── adapter-rxjava-2.4.0.jar -│   ├── animal-sniffer-annotations-1.17.jar -│   ├── annotations-2.0.1.jar -│   ├── annotations-4.1.1.4.jar -│   ├── ant-1.8.2.jar -│   ├── ant-launcher-1.8.2.jar -│   ├── aopalliance-repackaged-2.5.0-b32.jar -│   ├── asm-5.0.4.jar -│   ├── automaton-1.11-8.jar -│   ├── avro-1.7.7.jar -│   ├── avro-ipc-1.7.7.jar -│   ├── azure-1.13.0.jar -│   ├── azure-annotations-1.2.0.jar -│   ├── azure-batch-4.0.1.jar -│   ├── azure-client-authentication-1.5.4.jar -│   ├── azure-client-runtime-1.6.4.jar -│   ├── azure-keyvault-1.0.0.jar -│   ├── azure-keyvault-core-0.8.0.jar -│   ├── azure-keyvault-webkey-1.0.0.jar -│   ├── azure-mgmt-appservice-1.13.0.jar -│   ├── azure-mgmt-batch-1.13.0.jar -│   ├── azure-mgmt-batchai-1.13.0.jar -│   ├── azure-mgmt-cdn-1.13.0.jar -│   ├── azure-mgmt-compute-1.13.0.jar -│   ├── azure-mgmt-containerinstance-1.13.0.jar -│   ├── azure-mgmt-containerregistry-1.13.0.jar -│   ├── azure-mgmt-containerservice-1.13.0.jar -│   ├── azure-mgmt-cosmosdb-1.13.0.jar -│   ├── azure-mgmt-dns-1.13.0.jar -│   ├── azure-mgmt-eventhub-1.13.0.jar -│   ├── azure-mgmt-graph-rbac-1.13.0.jar -│   ├── azure-mgmt-keyvault-1.13.0.jar -│   ├── azure-mgmt-locks-1.13.0.jar -│   ├── azure-mgmt-monitor-1.13.0.jar -│   ├── azure-mgmt-msi-1.13.0.jar -│   ├── azure-mgmt-network-1.13.0.jar -│   ├── azure-mgmt-redis-1.13.0.jar -│   ├── azure-mgmt-resources-1.13.0.jar -│   ├── azure-mgmt-search-1.13.0.jar -│   ├── azure-mgmt-servicebus-1.13.0.jar -│   ├── azure-mgmt-sql-1.13.0.jar -│   ├── azure-mgmt-storage-1.13.0.jar -│   ├── azure-mgmt-trafficmanager-1.13.0.jar -│   ├── azure-storage-6.1.0.jar -│   ├── BigWig-1.0.jar -│   ├── biodata-formats-2.0.4.jar -│   ├── biodata-models-2.0.4.jar -│   ├── biodata-tools-2.0.4.jar -│   ├── biojava-alignment-4.1.0.jar -│   ├── biojava-core-4.1.0.jar -│   ├── biojava-phylo-4.1.0.jar -│   ├── caffeine-2.6.1.jar -│   ├── cellbase-client-4.8.0.jar -│   ├── cellbase-core-4.8.0.jar -│   ├── client-runtime-1.6.4.jar -│   ├── commons-codec-1.11.jar -│   ├── commons-collections-3.2.1.jar -│   ├── commons-compress-1.4.1.jar -│   ├── commons-datastore-core-4.0.4-20201126.222923-7.jar -│   ├── commons-datastore-mongodb-4.0.4-20201126.222937-7.jar -│   ├── commons-datastore-solr-4.0.4-20201126.222939-7.jar -│   ├── commons-io-2.5.jar -│   ├── commons-jexl-2.1.1.jar -│   ├── commons-lang-2.4.jar -│   ├── commons-lang3-3.8.1.jar -│   ├── commons-lib-4.0.4-20201126.222926-5.jar -│   ├── commons-logging-1.2.jar -│   ├── commons-math3-3.6.1.jar -│   ├── commons-rdf-api-0.5.0.jar -│   ├── converter-jackson-2.4.0.jar -│   ├── error_prone_annotations-2.3.2.jar -│   ├── forester-1.005.jar -│   ├── ga4gh-0.6.0a5.jar -│   ├── generex-1.0.2.jar -│   ├── google-auth-library-credentials-0.13.0.jar -│   ├── grpc-all-1.23.0.jar -│   ├── grpc-api-1.23.0.jar -│   ├── grpc-auth-1.23.0.jar -│   ├── grpc-context-1.23.0.jar -│   ├── grpc-core-1.23.0.jar -│   ├── grpc-netty-1.23.0.jar -│   ├── grpc-okhttp-1.23.0.jar -│   ├── grpc-protobuf-1.23.0.jar -│   ├── grpc-protobuf-lite-1.23.0.jar -│   ├── grpc-stub-1.23.0.jar -│   ├── grpc-testing-1.23.0.jar -│   ├── gson-2.8.0.jar -│   ├── guava-19.0.jar -│   ├── hk2-api-2.5.0-b32.jar -│   ├── hk2-locator-2.5.0-b32.jar -│   ├── hk2-utils-2.5.0-b32.jar -│   ├── hppcrt-0.7.5.jar -│   ├── htsjdk-2.21.3.jar -│   ├── http2-client-9.4.19.v20190610.jar -│   ├── http2-common-9.4.19.v20190610.jar -│   ├── http2-hpack-9.4.19.v20190610.jar -│   ├── http2-http-client-transport-9.4.19.v20190610.jar -│   ├── httpclient-4.5.6.jar -│   ├── httpcore-4.4.10.jar -│   ├── httpmime-4.5.6.jar -│   ├── jackson-annotations-2.10.1.jar -│   ├── jackson-core-2.10.1.jar -│   ├── jackson-core-asl-1.9.13.jar -│   ├── jackson-databind-2.10.1.jar -│   ├── jackson-dataformat-cbor-2.10.1.jar -│   ├── jackson-dataformat-yaml-2.10.1.jar -│   ├── jackson-datatype-joda-2.10.1.jar -│   ├── jackson-jaxrs-base-2.10.1.jar -│   ├── jackson-jaxrs-json-provider-2.10.1.jar -│   ├── jackson-mapper-asl-1.9.13.jar -│   ├── jackson-module-jaxb-annotations-2.10.1.jar -│   ├── jakarta.activation-api-1.2.1.jar -│   ├── jakarta.xml.bind-api-2.3.2.jar -│   ├── jansi-1.18.jar -│   ├── javassist-3.20.0-GA.jar -│   ├── javax.annotation-api-1.2.jar -│   ├── javax.el-3.0.1-b11.jar -│   ├── javax.inject-1.jar -│   ├── javax.inject-2.5.0-b32.jar -│   ├── javax.mail-1.6.1.jar -│   ├── javax.servlet-api-3.1.0.jar -│   ├── javax.ws.rs-api-2.0.1.jar -│   ├── jcip-annotations-1.0-1.jar -│   ├── jcl-over-slf4j-1.7.24.jar -│   ├── jcommander-1.64.jar -│   ├── jersey-client-2.25.1.jar -│   ├── jersey-common-2.25.1.jar -│   ├── jersey-container-servlet-2.25.1.jar -│   ├── jersey-container-servlet-core-2.25.1.jar -│   ├── jersey-entity-filtering-2.25.1.jar -│   ├── jersey-guava-2.25.1.jar -│   ├── jersey-media-jaxb-2.25.1.jar -│   ├── jersey-media-json-jackson-2.25.1.jar -│   ├── jersey-media-multipart-2.25.1.jar -│   ├── jersey-server-2.25.1.jar -│   ├── jetty-6.1.26.jar -│   ├── jetty-alpn-client-9.4.17.v20190418.jar -│   ├── jetty-alpn-java-client-9.4.17.v20190418.jar -│   ├── jetty-client-9.4.17.v20190418.jar -│   ├── jetty-http-9.4.17.v20190418.jar -│   ├── jetty-io-9.4.17.v20190418.jar -│   ├── jetty-security-9.4.17.v20190418.jar -│   ├── jetty-server-9.4.17.v20190418.jar -│   ├── jetty-servlet-9.4.17.v20190418.jar -│   ├── jetty-util-6.1.26.jar -│   ├── jetty-util-9.4.17.v20190418.jar -│   ├── jetty-webapp-9.4.17.v20190418.jar -│   ├── jetty-xml-9.4.17.v20190418.jar -│   ├── jjwt-0.9.1.jar -│   ├── joda-time-2.1.jar -│   ├── json-smart-2.3.jar -│   ├── jsr305-3.0.2.jar -│   ├── jul-to-slf4j-1.7.26.jar -│   ├── kryo-2.23.0.jar -│   ├── kubernetes-client-4.3.0.jar -│   ├── kubernetes-model-4.3.0.jar -│   ├── kubernetes-model-common-4.3.0.jar -│   ├── lang-tag-1.5.jar -│   ├── log4j-api-2.13.3.jar -│   ├── log4j-core-2.13.3.jar -│   ├── log4j-slf4j-impl-2.13.3.jar -│   ├── logging-interceptor-3.12.0.jar -│   ├── mail-1.4.7.jar -│   ├── microsoft-graph-1.4.0.jar -│   ├── mimepull-1.9.6.jar -│   ├── minlog-1.2.jar -│   ├── mongo-java-driver-3.11.2.jar -│   ├── netty-3.4.0.Final.jar -│   ├── netty-buffer-4.1.29.Final.jar -│   ├── netty-codec-4.1.29.Final.jar -│   ├── netty-codec-http2-4.1.38.Final.jar -│   ├── netty-codec-http-4.1.38.Final.jar -│   ├── netty-codec-socks-4.1.38.Final.jar -│   ├── netty-common-4.1.29.Final.jar -│   ├── netty-handler-4.1.29.Final.jar -│   ├── netty-handler-proxy-4.1.38.Final.jar -│   ├── netty-resolver-4.1.29.Final.jar -│   ├── netty-transport-4.1.29.Final.jar -│   ├── netty-transport-native-epoll-4.1.29.Final.jar -│   ├── netty-transport-native-unix-common-4.1.29.Final.jar -│   ├── ngs-java-2.9.0.jar -│   ├── nimbus-jose-jwt-9.1.3.jar -│   ├── oauth2-oidc-sdk-5.64.4.jar -│   ├── objenesis-2.1.jar -│   ├── okhttp-2.5.0.jar -│   ├── okhttp-3.12.0.jar -│   ├── okhttp-urlconnection-3.11.0.jar -│   ├── okio-1.15.0.jar -│   ├── opencensus-api-0.21.0.jar -│   ├── opencensus-contrib-grpc-metrics-0.21.0.jar -│   ├── opencga-analysis-2.0.0.jar -│   ├── opencga-app-2.0.0.jar -│   ├── opencga-catalog-2.0.0.jar -│   ├── opencga-client-2.0.0.jar -│   ├── opencga-core-2.0.0.jar -│   ├── opencga-master-2.0.0.jar -│   ├── opencga-server-2.0.0.jar -│   ├── opencga-storage-app-2.0.0.jar -│   ├── opencga-storage-core-2.0.0.jar -│   ├── opencga-storage-mongodb-2.0.0.jar -│   ├── opencga-storage-server-2.0.0.jar -│   ├── osgi-resource-locator-1.0.1.jar -│   ├── oskar-analysis-0.2.0-20191017.131623-2.jar -│   ├── oskar-core-0.2.0-20191017.131625-2.jar -│   ├── owlapi-api-5.1.13.jar -│   ├── owlapi-oboformat-5.1.13.jar -│   ├── owlapi-parsers-5.1.13.jar -│   ├── paranamer-2.3.jar -│   ├── perfmark-api-0.17.0.jar -│   ├── protobuf-java-3.9.0.jar -│   ├── protobuf-java-util-3.9.0.jar -│   ├── proto-google-common-protos-1.12.0.jar -│   ├── reactive-streams-1.0.0.jar -│   ├── reactor-core-2.0.7.RELEASE.jar -│   ├── reactor-stream-2.0.7.RELEASE.jar -│   ├── redisson-2.2.0.jar -│   ├── reflections-0.9.10.jar -│   ├── retrofit-2.4.0.jar -│   ├── rocksdbjni-4.5.1.jar -│   ├── rxjava-1.2.4.jar -│   ├── slf4j-api-1.7.25.jar -│   ├── snakeyaml-1.24.jar -│   ├── snappy-java-1.0.5.jar -│   ├── solr-solrj-8.4.1.jar -│   ├── stax2-api-3.1.4.jar -│   ├── swagger-annotations-1.5.22.jar -│   ├── swagger-core-1.5.22.jar -│   ├── swagger-jaxrs-1.5.22.jar -│   ├── swagger-jersey2-jaxrs-1.5.22.jar -│   ├── swagger-models-1.5.22.jar -│   ├── validation-api-1.1.0.Final.jar -│   ├── velocity-1.7.jar -│   ├── woodstox-core-asl-4.4.1.jar -│   ├── xz-1.8.jar -│   ├── zjsonpatch-0.3.0.jar -│   ├── zookeeper-3.5.5.jar -│   └── zookeeper-jute-3.5.5.jar +│ ├── accessors-smart-1.2.jar +│ ├── activation-1.1.jar +│ ├── adal4j-1.6.3.jar +│ ├── adapter-rxjava-2.4.0.jar +│ ├── animal-sniffer-annotations-1.17.jar +│ ├── annotations-2.0.1.jar +│ ├── annotations-4.1.1.4.jar +│ ├── ant-1.8.2.jar +│ ├── ant-launcher-1.8.2.jar +│ ├── aopalliance-repackaged-2.5.0-b32.jar +│ ├── asm-5.0.4.jar +│ ├── automaton-1.11-8.jar +│ ├── avro-1.7.7.jar +│ ├── avro-ipc-1.7.7.jar +│ ├── azure-1.13.0.jar +│ ├── azure-annotations-1.2.0.jar +│ ├── azure-batch-4.0.1.jar +│ ├── azure-client-authentication-1.5.4.jar +│ ├── azure-client-runtime-1.6.4.jar +│ ├── azure-keyvault-1.0.0.jar +│ ├── azure-keyvault-core-0.8.0.jar +│ ├── azure-keyvault-webkey-1.0.0.jar +│ ├── azure-mgmt-appservice-1.13.0.jar +│ ├── azure-mgmt-batch-1.13.0.jar +│ ├── azure-mgmt-batchai-1.13.0.jar +│ ├── azure-mgmt-cdn-1.13.0.jar +│ ├── azure-mgmt-compute-1.13.0.jar +│ ├── azure-mgmt-containerinstance-1.13.0.jar +│ ├── azure-mgmt-containerregistry-1.13.0.jar +│ ├── azure-mgmt-containerservice-1.13.0.jar +│ ├── azure-mgmt-cosmosdb-1.13.0.jar +│ ├── azure-mgmt-dns-1.13.0.jar +│ ├── azure-mgmt-eventhub-1.13.0.jar +│ ├── azure-mgmt-graph-rbac-1.13.0.jar +│ ├── azure-mgmt-keyvault-1.13.0.jar +│ ├── azure-mgmt-locks-1.13.0.jar +│ ├── azure-mgmt-monitor-1.13.0.jar +│ ├── azure-mgmt-msi-1.13.0.jar +│ ├── azure-mgmt-network-1.13.0.jar +│ ├── azure-mgmt-redis-1.13.0.jar +│ ├── azure-mgmt-resources-1.13.0.jar +│ ├── azure-mgmt-search-1.13.0.jar +│ ├── azure-mgmt-servicebus-1.13.0.jar +│ ├── azure-mgmt-sql-1.13.0.jar +│ ├── azure-mgmt-storage-1.13.0.jar +│ ├── azure-mgmt-trafficmanager-1.13.0.jar +│ ├── azure-storage-6.1.0.jar +│ ├── BigWig-1.0.jar +│ ├── biodata-formats-2.0.4.jar +│ ├── biodata-models-2.0.4.jar +│ ├── biodata-tools-2.0.4.jar +│ ├── biojava-alignment-4.1.0.jar +│ ├── biojava-core-4.1.0.jar +│ ├── biojava-phylo-4.1.0.jar +│ ├── caffeine-2.6.1.jar +│ ├── cellbase-client-4.8.0.jar +│ ├── cellbase-core-4.8.0.jar +│ ├── client-runtime-1.6.4.jar +│ ├── commons-codec-1.11.jar +│ ├── commons-collections-3.2.1.jar +│ ├── commons-compress-1.4.1.jar +│ ├── commons-datastore-core-4.0.4-20201126.222923-7.jar +│ ├── commons-datastore-mongodb-4.0.4-20201126.222937-7.jar +│ ├── commons-datastore-solr-4.0.4-20201126.222939-7.jar +│ ├── commons-io-2.5.jar +│ ├── commons-jexl-2.1.1.jar +│ ├── commons-lang-2.4.jar +│ ├── commons-lang3-3.8.1.jar +│ ├── commons-lib-4.0.4-20201126.222926-5.jar +│ ├── commons-logging-1.2.jar +│ ├── commons-math3-3.6.1.jar +│ ├── commons-rdf-api-0.5.0.jar +│ ├── converter-jackson-2.4.0.jar +│ ├── error_prone_annotations-2.3.2.jar +│ ├── forester-1.005.jar +│ ├── ga4gh-0.6.0a5.jar +│ ├── generex-1.0.2.jar +│ ├── google-auth-library-credentials-0.13.0.jar +│ ├── grpc-all-1.23.0.jar +│ ├── grpc-api-1.23.0.jar +│ ├── grpc-auth-1.23.0.jar +│ ├── grpc-context-1.23.0.jar +│ ├── grpc-core-1.23.0.jar +│ ├── grpc-netty-1.23.0.jar +│ ├── grpc-okhttp-1.23.0.jar +│ ├── grpc-protobuf-1.23.0.jar +│ ├── grpc-protobuf-lite-1.23.0.jar +│ ├── grpc-stub-1.23.0.jar +│ ├── grpc-testing-1.23.0.jar +│ ├── gson-2.8.0.jar +│ ├── guava-19.0.jar +│ ├── hk2-api-2.5.0-b32.jar +│ ├── hk2-locator-2.5.0-b32.jar +│ ├── hk2-utils-2.5.0-b32.jar +│ ├── hppcrt-0.7.5.jar +│ ├── htsjdk-2.21.3.jar +│ ├── http2-client-9.4.19.v20190610.jar +│ ├── http2-common-9.4.19.v20190610.jar +│ ├── http2-hpack-9.4.19.v20190610.jar +│ ├── http2-http-client-transport-9.4.19.v20190610.jar +│ ├── httpclient-4.5.6.jar +│ ├── httpcore-4.4.10.jar +│ ├── httpmime-4.5.6.jar +│ ├── jackson-annotations-2.10.1.jar +│ ├── jackson-core-2.10.1.jar +│ ├── jackson-core-asl-1.9.13.jar +│ ├── jackson-databind-2.10.1.jar +│ ├── jackson-dataformat-cbor-2.10.1.jar +│ ├── jackson-dataformat-yaml-2.10.1.jar +│ ├── jackson-datatype-joda-2.10.1.jar +│ ├── jackson-jaxrs-base-2.10.1.jar +│ ├── jackson-jaxrs-json-provider-2.10.1.jar +│ ├── jackson-mapper-asl-1.9.13.jar +│ ├── jackson-module-jaxb-annotations-2.10.1.jar +│ ├── jakarta.activation-api-1.2.1.jar +│ ├── jakarta.xml.bind-api-2.3.2.jar +│ ├── jansi-1.18.jar +│ ├── javassist-3.20.0-GA.jar +│ ├── javax.annotation-api-1.2.jar +│ ├── javax.el-3.0.1-b11.jar +│ ├── javax.inject-1.jar +│ ├── javax.inject-2.5.0-b32.jar +│ ├── javax.mail-1.6.1.jar +│ ├── javax.servlet-api-3.1.0.jar +│ ├── javax.ws.rs-api-2.0.1.jar +│ ├── jcip-annotations-1.0-1.jar +│ ├── jcl-over-slf4j-1.7.24.jar +│ ├── jcommander-1.64.jar +│ ├── jersey-client-2.25.1.jar +│ ├── jersey-common-2.25.1.jar +│ ├── jersey-container-servlet-2.25.1.jar +│ ├── jersey-container-servlet-core-2.25.1.jar +│ ├── jersey-entity-filtering-2.25.1.jar +│ ├── jersey-guava-2.25.1.jar +│ ├── jersey-media-jaxb-2.25.1.jar +│ ├── jersey-media-json-jackson-2.25.1.jar +│ ├── jersey-media-multipart-2.25.1.jar +│ ├── jersey-server-2.25.1.jar +│ ├── jetty-6.1.26.jar +│ ├── jetty-alpn-client-9.4.17.v20190418.jar +│ ├── jetty-alpn-java-client-9.4.17.v20190418.jar +│ ├── jetty-client-9.4.17.v20190418.jar +│ ├── jetty-http-9.4.17.v20190418.jar +│ ├── jetty-io-9.4.17.v20190418.jar +│ ├── jetty-security-9.4.17.v20190418.jar +│ ├── jetty-server-9.4.17.v20190418.jar +│ ├── jetty-servlet-9.4.17.v20190418.jar +│ ├── jetty-util-6.1.26.jar +│ ├── jetty-util-9.4.17.v20190418.jar +│ ├── jetty-webapp-9.4.17.v20190418.jar +│ ├── jetty-xml-9.4.17.v20190418.jar +│ ├── jjwt-0.9.1.jar +│ ├── joda-time-2.1.jar +│ ├── json-smart-2.3.jar +│ ├── jsr305-3.0.2.jar +│ ├── jul-to-slf4j-1.7.26.jar +│ ├── kryo-2.23.0.jar +│ ├── kubernetes-client-4.3.0.jar +│ ├── kubernetes-model-4.3.0.jar +│ ├── kubernetes-model-common-4.3.0.jar +│ ├── lang-tag-1.5.jar +│ ├── log4j-api-2.13.3.jar +│ ├── log4j-core-2.13.3.jar +│ ├── log4j-slf4j-impl-2.13.3.jar +│ ├── logging-interceptor-3.12.0.jar +│ ├── mail-1.4.7.jar +│ ├── microsoft-graph-1.4.0.jar +│ ├── mimepull-1.9.6.jar +│ ├── minlog-1.2.jar +│ ├── mongo-java-driver-3.11.2.jar +│ ├── netty-3.4.0.Final.jar +│ ├── netty-buffer-4.1.29.Final.jar +│ ├── netty-codec-4.1.29.Final.jar +│ ├── netty-codec-http2-4.1.38.Final.jar +│ ├── netty-codec-http-4.1.38.Final.jar +│ ├── netty-codec-socks-4.1.38.Final.jar +│ ├── netty-common-4.1.29.Final.jar +│ ├── netty-handler-4.1.29.Final.jar +│ ├── netty-handler-proxy-4.1.38.Final.jar +│ ├── netty-resolver-4.1.29.Final.jar +│ ├── netty-transport-4.1.29.Final.jar +│ ├── netty-transport-native-epoll-4.1.29.Final.jar +│ ├── netty-transport-native-unix-common-4.1.29.Final.jar +│ ├── ngs-java-2.9.0.jar +│ ├── nimbus-jose-jwt-9.1.3.jar +│ ├── oauth2-oidc-sdk-5.64.4.jar +│ ├── objenesis-2.1.jar +│ ├── okhttp-2.5.0.jar +│ ├── okhttp-3.12.0.jar +│ ├── okhttp-urlconnection-3.11.0.jar +│ ├── okio-1.15.0.jar +│ ├── opencensus-api-0.21.0.jar +│ ├── opencensus-contrib-grpc-metrics-0.21.0.jar +│ ├── opencga-analysis-2.0.0.jar +│ ├── opencga-app-2.0.0.jar +│ ├── opencga-catalog-2.0.0.jar +│ ├── opencga-client-2.0.0.jar +│ ├── opencga-core-2.0.0.jar +│ ├── opencga-master-2.0.0.jar +│ ├── opencga-server-2.0.0.jar +│ ├── opencga-storage-app-2.0.0.jar +│ ├── opencga-storage-core-2.0.0.jar +│ ├── opencga-storage-mongodb-2.0.0.jar +│ ├── opencga-storage-server-2.0.0.jar +│ ├── osgi-resource-locator-1.0.1.jar +│ ├── oskar-analysis-0.2.0-20191017.131623-2.jar +│ ├── oskar-core-0.2.0-20191017.131625-2.jar +│ ├── owlapi-api-5.1.13.jar +│ ├── owlapi-oboformat-5.1.13.jar +│ ├── owlapi-parsers-5.1.13.jar +│ ├── paranamer-2.3.jar +│ ├── perfmark-api-0.17.0.jar +│ ├── protobuf-java-3.9.0.jar +│ ├── protobuf-java-util-3.9.0.jar +│ ├── proto-google-common-protos-1.12.0.jar +│ ├── reactive-streams-1.0.0.jar +│ ├── reactor-core-2.0.7.RELEASE.jar +│ ├── reactor-stream-2.0.7.RELEASE.jar +│ ├── redisson-2.2.0.jar +│ ├── reflections-0.9.10.jar +│ ├── retrofit-2.4.0.jar +│ ├── rocksdbjni-4.5.1.jar +│ ├── rxjava-1.2.4.jar +│ ├── slf4j-api-1.7.25.jar +│ ├── snakeyaml-1.24.jar +│ ├── snappy-java-1.0.5.jar +│ ├── solr-solrj-8.4.1.jar +│ ├── stax2-api-3.1.4.jar +│ ├── swagger-annotations-1.5.22.jar +│ ├── swagger-core-1.5.22.jar +│ ├── swagger-jaxrs-1.5.22.jar +│ ├── swagger-jersey2-jaxrs-1.5.22.jar +│ ├── swagger-models-1.5.22.jar +│ ├── validation-api-1.1.0.Final.jar +│ ├── velocity-1.7.jar +│ ├── woodstox-core-asl-4.4.1.jar +│ ├── xz-1.8.jar +│ ├── zjsonpatch-0.3.0.jar +│ ├── zookeeper-3.5.5.jar +│ └── zookeeper-jute-3.5.5.jar ├── LICENSE ├── misc -│   ├── catalog -│   ├── clients -│   ├── completion -│   ├── demo -│   ├── examples -│   ├── migration -│   ├── scripts -│   └── solr +│ ├── catalog +│ ├── clients +│ ├── completion +│ ├── demo +│ ├── examples +│ ├── migration +│ ├── scripts +│ └── solr ├── monitor -│   └── README.md +│ └── README.md ├── opencga-client-2.0.0.tar.gz ├── opencga.war ├── README.md @@ -457,6 +457,5 @@ build/ └── README.md 32 directories, 257 files - ``` diff --git a/docs/installation/compute-cluster/configuration.md b/docs/installation/compute-cluster/configuration.md index ca44186f348..5f82ecb2281 100644 --- a/docs/installation/compute-cluster/configuration.md +++ b/docs/installation/compute-cluster/configuration.md @@ -9,9 +9,5 @@ For Hadoop configuration ... ## configuration.yml - - ## storage-configuration.yml - - diff --git a/docs/installation/compute-cluster/server-configuration.md b/docs/installation/compute-cluster/server-configuration.md index 5be565b0b03..fe1c6850656 100644 --- a/docs/installation/compute-cluster/server-configuration.md +++ b/docs/installation/compute-cluster/server-configuration.md @@ -22,11 +22,11 @@ Then you have to uncompress it, move it to an installation folder such as _/opt, ```bash ## You can uncompress from the Download directory tar -zxvf jdk-8u91-linux-x64.tar.gz - + ## You need root permissions for the following sudo mv jdk1.8.0_91 /opt sudo ln -s /opt/jdk1.8.0_91 java - + ## Then you should have something like this: lrwxrwxrwx 1 root root 11 Jun 13 2016 java -> jdk1.8.0_91/ drwxr-xr-x 8 imedina imedina 4.0K Jan 6 13:31 jdk1.8.0_91/ @@ -40,7 +40,7 @@ export JAVA_HOME="/opt/java" PATH="$JAVA_HOME/bin:$M2:$PATH" ``` -Independently of the installation procedure followed above you can check is Java properly installed by executing _java -version_, you should get something like this: +Independently of the installation procedure followed above you can check is Java properly installed by executing _java -version_, you should get something like this: ```bash java version "1.8.0_91" @@ -57,19 +57,19 @@ Installing _**via package manager**_ can be more or less easy to do depending on ```bash ## You need root permissions sudo apt-get install tomcat8 - + ## You can check that Tomcat is running by executing sudo service tomcat8 status - + ## Run the following to set Tomcat to run with user opencga cd /var/lib/tomcat8/ sudo service tomcat8 stop sudo chown -RL opencga:opencga ./* - + ## Edit the files /etc/init.d/tomcat8 and /etc/default/tomcat8 TOMCAT8_USER=opencga TOMCAT8_GROUP=opencga - + ## Then reload the service and restart sudo systemctl daemon-reload sudo service tomcat8 start @@ -82,11 +82,11 @@ We recommend to make same changes in the Tomcat configuration: ```bash ## You can uncompress from the Download directory tar -zxvf apache-tomcat-8.5.3.tar.gz - + ## You need root permissions to move to /opt and create a symbolic link sudo mv apache-tomcat-8.5.3 /opt sudo ln -s /opt/apache-tomcat-8.5.3 tomcat - + ## You can start and stop Tomcat executing /opt/tomcat/bin/startup.sh /opt/tomcat/bin/shutdown.sh @@ -149,7 +149,7 @@ Maven can be easily installed in Linux **via the package manager**, you can exec ```bash ## Ubuntu 16.04 sudo apt-get install maven - + ## CentOS 7.x sudo yum install maven ``` @@ -164,7 +164,6 @@ Maven home: /opt/maven Java version: 1.8.0_231, vendor: Oracle Corporation, runtime: /opt/jdk1.8.0_231/jre Default locale: en_GB, platform encoding: UTF-8 OS name: "linux", version: "5.4.0-54-generic", arch: "amd64", family: "unix" - ``` You need to add a Maven Profile to set up some variables that will be injected during the building, you can learn more about this at [**Installation Guide > Building from Source Code**](http://docs.opencb.org/display/opencga/Building+from+Source+Code). @@ -182,7 +181,7 @@ OpenCGA uses **HAProxy 1.5+** in the cluster installation to balance all REST we ```bash ## Ubuntu 16.04 sudo apt-get install haproxy - + ## CentOS 7.x sudo yum install haproxy ``` @@ -196,8 +195,8 @@ frontend http-in acl webservices path_beg -i /opencga ## Redirect ACL 'webservices' to backend 'tomcat_prod' use_backend tomcat_prod if webservices - - + + ## backend definition balancing two Tomcat instances backend tomcat_prod cookie SERVERID insert nocache indirect diff --git a/docs/installation/docker.md b/docs/installation/docker.md index 2dcafd6a131..56e9f13c765 100644 --- a/docs/installation/docker.md +++ b/docs/installation/docker.md @@ -16,11 +16,11 @@ You can use OpenCGA Docker image to run a complete OpenCGA platform locally. You OpenCGA publishes a number of images into [DockerHub](https://hub.docker.com/u/opencb) for user ease. These images are based on _Alpine JRE_ images to keep sizes as small as possible, contains OpenCGA binaries, for complete contents of image, please have a look at Dockerfile in github. A typical image name will follow the following structure : * opencga:{_OPENCGA\_VERSION\_NUMBER_}-{_VARIANT\_STORAGE\_FLAVOUR_} - * OPENCGA\_VERSION\_NUMBER __ will be like 1.4.0, 1.4.2, 2.0 etc + * OPENCGA\_VERSION\_NUMBER \_\_ will be like 1.4.0, 1.4.2, 2.0 etc * VARIANT\_STORAGE\_FLAVOUR can be mongoDB 4.0, hdinshigh, emr etc * e.g. **opencga:1.4.0-mongo4.0** -OpenCGA has published a docker image for quick testing and playing without going through hassle to learn, wait and install each and every OpenCGA components. The docker image is available at the public docker registry under the repository _**opencb/opencga-demo**._ +OpenCGA has published a docker image for quick testing and playing without going through hassle to learn, wait and install each and every OpenCGA components. The docker image is available at the public docker registry under the repository _**opencb/opencga-demo**._ The OpenCGA demo docker image contains the following components: @@ -43,5 +43,3 @@ This mode is not intended for production but for a user demo. ## Build Docker Images - - diff --git a/docs/overview/data-management.md b/docs/overview/data-management.md index fccd8ee1099..50dc72747ea 100644 --- a/docs/overview/data-management.md +++ b/docs/overview/data-management.md @@ -4,8 +4,6 @@ OpenCGA implements an advanced Metadata Database \([OpenCGA Catalog](../components-1/catalog/)\) that keeps track of ... - - ## Clinical Data OpenCGA provides a rich set of data models covering the most commons needs for any genomic analysis... diff --git a/docs/overview/data-models/README.md b/docs/overview/data-models/README.md index 09fcec728d5..ba1432b56c3 100644 --- a/docs/overview/data-models/README.md +++ b/docs/overview/data-models/README.md @@ -8,8 +8,6 @@ All OpenCGA Data Models have been designed to follow some principles: 2. Chid-Parent reference 3. Annotation Sets - - ## Implementation ### Diagram @@ -95,15 +93,9 @@ Describe a phenotype following an OBO ontology. ### Creation and Modification Date - - ### Status - - ### File ID File IDs contain the path using `:` - - diff --git a/docs/overview/data-models/sample.md b/docs/overview/data-models/sample.md index ffd3f4a17fe..7c1fa64e1e2 100644 --- a/docs/overview/data-models/sample.md +++ b/docs/overview/data-models/sample.md @@ -2,7 +2,7 @@ ## Overview -Sample data model ... +Sample data model ... ## Data Models @@ -262,12 +262,8 @@ This object describes how the sample was processed in the lab. ### SampleCollection - - ### SampleQualityControl - - ## Example This is a full JSON example: diff --git a/docs/overview/features.md b/docs/overview/features.md index 0c04586cafd..473de439248 100644 --- a/docs/overview/features.md +++ b/docs/overview/features.md @@ -6,45 +6,45 @@ description: Overview of main features In this section, you will find a summary of the main features of OpenCGA. -### Metadata Catalog and Security +## Metadata Catalog and Security OpenCGA Catalog is one of the most important components. Catalog implements the data models, allow custom annotations, implement permissions, ... An audit system has also been implemented. -#### Catalog Data Models and Annotations +### Catalog Data Models and Annotations * **Rich data models** implemented for studies, files, samples, individuals, families, ... * Advanced **free data model** implemented for storing **custom annotations** such as stats or clinical data from patients. Users can define **confidential annotations** as only visible for authorised users. -#### Catalog Database +### Catalog Database * Catalog database has been implemented using MongoDB to provide a **high-performance** and **scalable query engine**. * Catalog can use Solr as a secondary index to calculate **complex annotations** and **stats**. -#### Authentication and Permissions +### Authentication and Permissions * OpenCGA comes with a built-in **authentication** system. Other systems are also supported such as LDAP or Microsoft Azure AD \(_under development_\). Authentication **tokens** use [**JWT**](https://jwt.io/) standard which facilitates the creation of federated systems. * Advanced and efficient resource **permission** system implemented in Catalog. You can define different permissions such as VIEW, WRITE or DELETE at study level or at any specific document. This allow to **share** data with other users. More information at [Sharing and Permissions](http://docs.opencb.org/display/opencga/Sharing+and+Permissions). -### Alignment Storage +## Alignment Storage OpenCGA can manage alignment data. BAM files can be indexed and coverage calculated. -#### Fetching alignments +### Fetching alignments * **Query indexed BAM files**, allowed filters include by region, mapping quality, number of mismatches, properly paired, ... * GA4GH data model used for alignments * **Google gRPC** is used as an alternative to REST \(JSON\) to improve performance. -#### Coverage +### Coverage * **Coverage** can be calculated and stored in a _BigWig_ file. * **Coverage queries** at any window size or zoom. -### Variant Storage +## Variant Storage -OpenCGA provides a framework for implementing _big data_ variant storage engines which support: real-time queries, interactive complex data aggregations, full-text search, variant analysis, ... The framework takes care of several common operations such as variant normalisation, sample genotype aggregation, variant stats calculation, variant annotation, secondary indexing or in-memory cache. Two different engines are implemented using NoSQL databases: MongoDB and HBase. A secondary index using Solr is nicely integrated with the two implementations. By implementing variant storage engines with NoSQL databases we ensure a fast response time and high concurrent queries. +OpenCGA provides a framework for implementing _big data_ variant storage engines which support: real-time queries, interactive complex data aggregations, full-text search, variant analysis, ... The framework takes care of several common operations such as variant normalisation, sample genotype aggregation, variant stats calculation, variant annotation, secondary indexing or in-memory cache. Two different engines are implemented using NoSQL databases: MongoDB and HBase. A secondary index using Solr is nicely integrated with the two implementations. By implementing variant storage engines with NoSQL databases we ensure a fast response time and high concurrent queries. -#### Data Management +### Data Management * Advanced **variant normalisation** implemented supporting multi-allelic split or left-alignment of INDELs among others. * High quality **sample genotype aggregation** supporting multi-allelic variants, overlapping SNV-INDEL or structural variants. HBase storage engine can aggregate tens of thousands of samples efficiently. Current design and implementation should scale to hundreds of thousands of samples. @@ -56,7 +56,7 @@ OpenCGA provides a framework for implementing _big data_ variant storage engines * Custom **variant scores** from external analysis tools such as GWAS association can be loaded, indexed and queried by. * **Export** variant data in different formats such as VCF or Parquet. You can filter which variants and samples are exported. -#### Query Engine +### Query Engine * OpenCGA implements a **very sophisticated query engine** supporting the combination of more than 25 filters: region, genes, type, file attributes, sample genotypes, consequence types, population frequencies, biotype, conservation scores, variant and gene clinical traits, mode of inheritance, disease panels, ... **Full-text search** is also implemented. * Other **query options** supported such as _include, exclude, limit, skip, count,_ ... @@ -64,35 +64,35 @@ OpenCGA provides a framework for implementing _big data_ variant storage engines * Variant query engine supports filtering by **sample clinical data** thanks to the integration with _Catalog._ * MongoDB or HBase are fully integrated with **Solr secondary indexes** to provide a real-time query engine for all queries and use cases. -#### Aggregation and Stats +### Aggregation and Stats * Solr integration allows the execution of **complex aggregations** \(faceted search\) interactively. Nested and range aggregations are supported. For instance, you can aggregate variants by chromosome and type over 46 million variants in just 2 seconds: [http://bioinfo.hpc.cam.ac.uk/hgva/webservices/rest/v1/analysis/variant/stats?timeout=60000&study=reference\_grch37%3AUK10K&fields=chromosome%3E%3Etype](http://bioinfo.hpc.cam.ac.uk/hgva/webservices/rest/v1/analysis/variant/stats?timeout=60000&study=reference_grch37%3AUK10K&fields=chromosome%3E%3Etype) * **Variant query filters** – for filtering variants – and **aggregation** analysis can be combined to calculate the aggregation of any variant query result. * **Aggregation stats** such as average, median, percentile, min, max, ... are also supported -#### Big Data Analysis +### Big Data Analysis * Variants can be exported to **parquet** file which is an efficient columnar file format. This parquet file can be used by Hive or Spark big data technologies. * Some **complex analysis** such as IBS are implemented using a custom Spark library to extend the number of uses cases supported. Note that this analysis can take some time and Spark is not a highly concurrent technology, therefore this analysis are queued by OpenCGA. * Variant data model store genotypes efficiently ensuring we can execute analysis with tens of thousands of samples. -#### Performance and scalability +### Performance and scalability * HBase storage engine have been implemented to provide **real-time queries** and **interactive aggregations** _\(faceted\)_ even with tens of thousands of whole genomes. * **Google gRPC** is used as an alternative to REST \(JSON\) to improve performance. * Some benchmarks with more than 11,000 whole genomes accounting for 25TB show that we can load more than 2,000 files a day and execute most queries in less than 1-2 seconds in a small Hadoop cluster of 20 nodes. * You can go to [HGVA](http://hgva.opencb.org/#home/reference_grch37/UK10K) to test OpenCGA query engine performance. HGVA uses OpenCGA and IVA and load about 700 million unique variants from different human studies. -### Clinical Analysis +## Clinical Analysis -OpenCGA aims to provide a full solution for Clinical Genomics analysis, this covers patient clinical data, interpretation algorithms and a pathogenic variant database. +OpenCGA aims to provide a full solution for Clinical Genomics analysis, this covers patient clinical data, interpretation algorithms and a pathogenic variant database. -#### Clinical Data +### Clinical Data * Catalog can **store and index any clinical data model** for samples, individuals or families. Models are defined by users. * User can configure the **permission** and **visibility** of clinical data using _Catalog_ permissions. -#### Clinical Interpretation Analysis +### Clinical Interpretation Analysis * Open a **patient case** study by creating a _clinical analysis_, this contains all the patient and family data from Catalog at that moment, the phenotype to be analysed or the files among other information. A rich **interpretation data model** has also been modelled – combining GEL and other data models – to capture all the relevant information from the interpretation. * Complete **disease panel** management implemented: create, update and delete disease panels. You can also import them automatically from [**PanelApp \(GEL\)**](https://panelapp.genomicsengland.co.uk/). Updated panels are **versioned** to keep track of existing interpreted analysis. @@ -100,64 +100,64 @@ OpenCGA aims to provide a full solution for Clinical Genomics analysis, this cov * You can save more than one interpretation analysis result in the _clinical analysis_ to create one or more **clinical reports**. * Together with a tier classification a **semi-automatic ACMG classification** has been also implemented. -#### Pathogenic Variant Database +### Pathogenic Variant Database * Interpreted variants – and their variant annotation – can be indexed in a high-performance **pathogenic variant database**. Clinical data from _catalog,_ the _clinical analysis_ and _interpretation_ are also indexed together with interpreted variants. * Real-time **queries** and **complex aggregations** have been implemented. -### RESTful Web Services +## RESTful Web Services OpenCGA implements more than 150 RESTful web services to allow users to manipulate and query Catalog metadata and data such as _alignment_, _variants_ and _pathogenic variants_. REST web services are documented using [Swagger](https://swagger.io/), you can see OpenCGA Swagger documentation at [http://bioinfo.hpc.cam.ac.uk/hgva/webservices/](http://bioinfo.hpc.cam.ac.uk/hgva/webservices/). To facilitate the usage all of these web services we have implemented different client libraries and a command line \(see below in _Usability\)._ -REST web services can be grouped in different categories: _Catalog, Alignment, Variant, Clinical_ and _Admin._ +REST web services can be grouped in different categories: _Catalog, Alignment, Variant, Clinical_ and _Admin._ -#### Catalog +### Catalog * Catalog **data manipulation**, you can create, update, delete change permission of data. * **Advanced search** web services to query any resource \(file, samples, ...\) -#### Alignment +### Alignment * You can **index** BAM files to query reads and calculate **coverage** in BigWig format * **Query** endpoint to fetch alignments in GA4GH format from several files. Filters implemented include: region, mapping quality, number of mismatches, number of hits, properly paired, ... -#### Variant +### Variant * Query variant endpoint allows to query variants by any variant filter. Full control of which fields are returned * Aggregation stats implemented. * Others: fetch old variant annotation, variant study metadata, ... -#### Clinical +### Clinical * Several web services to create clinical analysis, execute interpretations or query pathogenic variant database. -#### Admin +### Admin * Administrative web services, only OpenCGA root user can execute them -### Usability +## Usability -#### REST Clients +### REST Clients * Four REST clients have been implemented in different programming language: Java, Pythong, R and JavaScript. -#### Command-line Interface \(CLI\) +### Command-line Interface \(CLI\) * A fully functional command-line has been implemented -### Visualisation +## Visualisation -#### OpenCGA web catalog +### OpenCGA web catalog * Web-based application to query and aggregate metadata from catalog -#### IVA +### IVA * Web-based application for Intercative Variant Analysis * Highly customisable * Plugin oriented -#### Genome Browser +### Genome Browser * Genome browser for NGS diff --git a/docs/using-opencga/README.md b/docs/using-opencga/README.md index 39186c44f52..fe54d115432 100644 --- a/docs/using-opencga/README.md +++ b/docs/using-opencga/README.md @@ -136,7 +136,3 @@ test2 aaa - - - - diff --git a/docs/using-opencga/client-libraries/README.md b/docs/using-opencga/client-libraries/README.md index bc3b393f24d..4f085d272d2 100644 --- a/docs/using-opencga/client-libraries/README.md +++ b/docs/using-opencga/client-libraries/README.md @@ -4,7 +4,7 @@ description: 'Java, Python, R and Javascript clients are implemented' # Client Libraries -OpenCGA implements four client libraries: +OpenCGA implements four client libraries: * [Java](java.md) * [Python](python.md) diff --git a/docs/using-opencga/iva-web-app.md b/docs/using-opencga/iva-web-app.md index beb64f21839..3b28205eaf5 100644 --- a/docs/using-opencga/iva-web-app.md +++ b/docs/using-opencga/iva-web-app.md @@ -6,13 +6,7 @@ description: A rich web app front-end to work with OpenCGA ## Overview - - ## Uses Cases - - ## Gallery - - diff --git a/docs/using-opencga/public-demo.md b/docs/using-opencga/public-demo.md index 9d0cff23981..4c0a5a25a03 100644 --- a/docs/using-opencga/public-demo.md +++ b/docs/using-opencga/public-demo.md @@ -10,7 +10,7 @@ OpenCGA public _demo_ REST URL is available at [http://bioinfo.hpc.cam.ac.uk/ope ### Credentials -We have created a read-only user called _**demouser**_ with password _**demouser**_. As in most OpenCGA installations where normal users are not the owners of the data, _demouser_ has been given VIEW access to all _demo_ user data, this is a very common configuration in OpenCGA where the owner of the data grant access to other users. In this _demo_ installation the owner of the data is _demo_ user, while _demouser_ user is the public user created to query data. +We have created a read-only user called _**demouser**_ with password _**demouser**_. As in most OpenCGA installations where normal users are not the owners of the data, _demouser_ has been given VIEW access to all _demo_ user data, this is a very common configuration in OpenCGA where the owner of the data grant access to other users. In this _demo_ installation the owner of the data is _demo_ user, while _demouser_ user is the public user created to query data. ## Datasets @@ -106,11 +106,11 @@ In order to make this _demo_ more useful to users we have loaded or simulated so #### 1000g
-We loaded the 1000 Genomes pedigree file, you can find a copy at [http://resources.opencb.org/opencb/opencga/templates/demo/20130606\_g1k.ped](http://resources.opencb.org/opencb/opencga/templates/demo/20130606_g1k.ped) +We loaded the 1000 Genomes pedigree file, you can find a copy at [http://resources.opencb.org/opencb/opencga/templates/demo/20130606\_g1k.ped](http://resources.opencb.org/opencb/opencga/templates/demo/20130606_g1k.ped) #### uk10k -There is no possible clinical data in this study. This is a _WGS aggregated_ dataset so no samples or genotypes were present in the dataset and, therefore, no _Individuals_ or _Samples_ have been created. +There is no possible clinical data in this study. This is a _WGS aggregated_ dataset so no samples or genotypes were present in the dataset and, therefore, no _Individuals_ or _Samples_ have been created. #### corpasome diff --git a/docs/using-opencga/restful-web-service-api.md b/docs/using-opencga/restful-web-service-api.md index 87f0ed22c03..b85f9f81cee 100644 --- a/docs/using-opencga/restful-web-service-api.md +++ b/docs/using-opencga/restful-web-service-api.md @@ -8,7 +8,7 @@ description: Understanding REST web service API ### Understanding the URL -The general format of the REST API web services is: +The general format of the REST API web services is: ```http https://HOST_URL/APPLICATION/webservices/rest/{apiVersion}/{resource}/{ids}/{endpoint}?{options} @@ -25,7 +25,7 @@ http://bioinfo.hpc.cam.ac.uk/opencga-prod/webservices/rest/v1/samples/HG01879,HG As it is explained later in this documentation, this RESTful web service will return the information stored in OpenCGA of the user _**demo**_. * **apiVersion \(**v2**\):** indicates OpenCGA version to retrieve information from, data models and API may change between versions. -* **resource:** specifies the data type of what the user wants to query by, in this example the resources are _samples_. This is one of the different _resources_ listed below. __ +* **resource:** specifies the data type of what the user wants to query by, in this example the resources are _samples_. This is one of the different _resources_ listed below. \_\_ * **id:** the ID of the resources we want to query by_._ In this example are HG01879 and HG01880. Path parameters are limited to 100 IDs. * **endpoint \(**info**\):** these parameters must be specified depending on the nature of your input data. For instance, info is used to fetch the information stored in the database regarding the id's passed. * **options \(**study=1000g**\) :** variables in key-value pair form, passed as query parameters. @@ -58,7 +58,7 @@ These query parameters can modify the behavior of the query \(_exclude_, _includ Note that the **Response** object has changed in OpenCGA 2.0 {% endhint %} -REST web services return the response wrapped in a _**RestResponse**_ object \([view data model](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/response/RestResponse.java)\). This consists of some _metadata_ and a list of _**OpenCGAResult**_ objects \([view data model](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java)\) called _**responses**_ containing the data _**results**_ and _metadata_ requested. The first response of the list will always contain the response of the OpenCGA federation being directly queried. Any additional response in the list will belong to other federated servers that could be connected. Each federated response will contain a list of _**results**_ ****\(_**OpenCGAResult**_\) containing the data that has been queried. +REST web services return the response wrapped in a _**RestResponse**_ object \([view data model](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/response/RestResponse.java)\). This consists of some _metadata_ and a list of _**OpenCGAResult**_ objects \([view data model](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java)\) called _**responses**_ containing the data _**results**_ and _metadata_ requested. The first response of the list will always contain the response of the OpenCGA federation being directly queried. Any additional response in the list will belong to other federated servers that could be connected. Each federated response will contain a list of _**results**_ **\*\*\(\_**OpenCGAResult\*\*\_\) containing the data that has been queried. ```javascript { @@ -109,7 +109,7 @@ where: * **Line 9-14:** show an events array where _info, warning_ and _error_ messages will be shown: For instance, when having network issues you could get "Catalog database not accessible". * **Line 15**: list of _DataResults_ called _**responses**_. In this example, because federation is disabled, it only contains a single _DataResult._ * **Line 17**: database duration time \(ms\) for each _DataResult._ -* **Line 18**: list of _events_ where _info, warning_ and _error_ messages will be shown. For instance, it can show messages such as "Permission denied to access sample xxx". __ +* **Line 18**: list of _events_ where _info, warning_ and _error_ messages will be shown. For instance, it can show messages such as "Permission denied to access sample xxx". \_\_ * **Line 19**: number of elements returned in the _**results**_ list. * **Line 20-30**: List of _**results**_ for this query. * **Line 31**: resource type of _**results**_. @@ -118,7 +118,7 @@ where: ### OpenCGA 1.x -Most web services return the results encapsulated in a single _**QueryResponse**_ object \([view data model](https://github.com/opencb/java-common-libs/blob/develop/commons-datastore/commons-datastore-core/src/main/java/org/opencb/commons/datastore/core/QueryResponse.java)\) consisting of some metadata and a list of _**QueryResult**_ objects \([view data model](https://github.com/opencb/java-common-libs/blob/develop/commons-datastore/commons-datastore-core/src/main/java/org/opencb/commons/datastore/core/QueryResult.java)\) called _**response**_ containing the data and metadata requested. The reason for this two-level response is that some REST web services allow to pass multiple IDs as input parameter, this improves significantly the performance by reducing the number of calls, for instance a calling _**/info**_ method with three sample IDs will return a _**QueryResponse**_ object with three **QueryResults**_**.**_ Then, each _**QueryResult**_ can contain multiple _**results,**_ for instance when getting all samples from an individual or when fetching all variants from a gene. +Most web services return the results encapsulated in a single _**QueryResponse**_ object \([view data model](https://github.com/opencb/java-common-libs/blob/develop/commons-datastore/commons-datastore-core/src/main/java/org/opencb/commons/datastore/core/QueryResponse.java)\) consisting of some metadata and a list of _**QueryResult**_ objects \([view data model](https://github.com/opencb/java-common-libs/blob/develop/commons-datastore/commons-datastore-core/src/main/java/org/opencb/commons/datastore/core/QueryResult.java)\) called _**response**_ containing the data and metadata requested. The reason for this two-level response is that some REST web services allow to pass multiple IDs as input parameter, this improves significantly the performance by reducing the number of calls, for instance a calling _**/info**_ method with three sample IDs will return a _**QueryResponse**_ object with three **QueryResults**_**.**_ Then, each _**QueryResult**_ can contain multiple _**results,**_ for instance when getting all samples from an individual or when fetching all variants from a gene. However, most of the web services will return a _**QueryResponse**_ with one single _**QueryResult**_ with one or more _**result.**_ In general the response object looks like: @@ -213,7 +213,7 @@ OpenCGA has been documented using [Swagger](http://swagger.io/) project. Detaile ## Client Libraries -Currently OpenCGA implements the following four client libraries: +Currently OpenCGA implements the following four client libraries: 1. [Java](http://docs.opencb.org/display/opencga/Java) 2. [Python](http://docs.opencb.org/display/opencga/Python) From 0c10b785ca5343020d110f19d6b3319f119d0674 Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Thu, 4 Feb 2021 01:49:26 +0000 Subject: [PATCH 033/412] GitBook: [develop] one page modified --- docs/about/roadmap.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/about/roadmap.md b/docs/about/roadmap.md index f3e0d201bdf..612f6e5b478 100644 --- a/docs/about/roadmap.md +++ b/docs/about/roadmap.md @@ -14,24 +14,32 @@ You can track GitHub issues at [GitHub Issues 2.1.0](https://github.com/opencb/o #### General -* Implement a **Centralised Log** analytic solution, we are planning to use Kibana _\*\*_ +* Implement a **Centralised Log** analytic solution +* Migrate **CI/CD** to GitHub Actions #### Catalog -* Implement a new **Action** system, Catalog will notify to a message queue _\(RabbitMQ, Apache Kafka\),_ this will allow other applications to know what's going on +* Implement a new **Action** system to reduce human interaction +* Allow the definition and execution of **Pipelines** * Improve **RESTful** web services by adding standardise **error codes** to the response, this will improve debugging **Variant Storage Engine** -* Extend consequence type and population frequency filter in the sample genotype index -* Improve sample genotype index for clinical and cancer by filtering by cosmic or VAF -* Allow the index of custom INFO or FORMAT fields +* Allow the implementation of **extension** in the Variant Index pipeline. Implement a first **variant index extension** to parse VAF, DEPTH and SVTYPE from several callers not following the VCF specification +* Make some **sample genotype indexes configurable**, such as population frequency filter +* Improve some **sample genotype indexes** * Implement a new **Cache** functionality, some sample and family-based variant queries and analysis can take up to few seconds, since this data is read-only this could be easily cached #### Clinical +* Implement a new component **Recessive Gene Analyse** to analyze knockout genes +* Implement a **pathogenic variant database** for all the reported variants + #### Analysis Framework +* Improve the **queue configuration** allowing the definition of different queues +* Improve the **Job execution** daemon + #### Others * Implement **FIHR Genomics** API, this will allow FIHR applications to query genomic variants in OpenCGA From 4995053c3190a3c598dcfd968b3ceecc18bf867e Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Thu, 4 Feb 2021 01:53:04 +0000 Subject: [PATCH 034/412] GitBook: [develop] one page modified --- docs/about/roadmap.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/about/roadmap.md b/docs/about/roadmap.md index 612f6e5b478..8d8f9a8acb0 100644 --- a/docs/about/roadmap.md +++ b/docs/about/roadmap.md @@ -34,6 +34,7 @@ You can track GitHub issues at [GitHub Issues 2.1.0](https://github.com/opencb/o * Implement a new component **Recessive Gene Analyse** to analyze knockout genes * Implement a **pathogenic variant database** for all the reported variants +* Implement a **case re-analysis** to automatically check clinical cases #### Analysis Framework From c966d13b776b90ef182a210a324bfaba1bc21c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 4 Feb 2021 13:01:37 +0000 Subject: [PATCH 035/412] storage: Add variantTraitAssociation to VariantAnnotationMixin. Do not hide annotation parse exceptions. --- .../io/json/mixin/VariantAnnotationMixin.java | 2 +- .../HBaseToVariantAnnotationConverter.java | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/json/mixin/VariantAnnotationMixin.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/json/mixin/VariantAnnotationMixin.java index 2f56fc6e064..df2740867bf 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/json/mixin/VariantAnnotationMixin.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/json/mixin/VariantAnnotationMixin.java @@ -22,6 +22,6 @@ * Created by jacobo on 2/02/15. */ -@JsonIgnoreProperties({"proteinSubstitutionScores"}) +@JsonIgnoreProperties({"proteinSubstitutionScores", "variantTraitAssociation"}) public abstract class VariantAnnotationMixin { } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java index a1e2ace9b3c..8ccfaeeaecb 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java @@ -297,10 +297,15 @@ public VariantAnnotation convert(byte[] valueArray, int valueOffset, int valueLe variantAnnotation = objectMapper.readValue(valueArray, valueOffset, valueLength, VariantAnnotation.class); } catch (IOException e) { - byte[] destination = new byte[valueLength]; - System.arraycopy(valueArray, valueOffset, destination, 0, valueLength); - byte[] value = CompressionUtils.decompress(destination); - variantAnnotation = objectMapper.readValue(value, VariantAnnotation.class); + try { + byte[] destination = new byte[valueLength]; + System.arraycopy(valueArray, valueOffset, destination, 0, valueLength); + byte[] value = CompressionUtils.decompress(destination); + variantAnnotation = objectMapper.readValue(value, VariantAnnotation.class); + } catch (Exception e1) { + e1.addSuppressed(e); + throw e1; + } } } else { // Value is compressed. Decompress and parse From 0b9aaf5e3244b58d7ef0c921cb5356e35d394234 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 18 Feb 2021 16:16:08 +0100 Subject: [PATCH 036/412] storage: support includes/excludes in RGA, #1693 --- .../storage/core/rga/GeneRgaConverter.java | 108 ++++++- .../core/rga/IndividualRgaConverter.java | 107 ++++++- .../opencga/storage/core/rga/RgaEngine.java | 42 ++- .../storage/core/rga/RgaQueryParser.java | 13 - .../storage/core/rga/VariantRgaConverter.java | 83 ++++++ .../storage/core/rga/RgaEngineTest.java | 266 +++++++++++++++++- 6 files changed, 572 insertions(+), 47 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java index 52a8281ccad..c4d75c42505 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java @@ -16,6 +16,49 @@ public class GeneRgaConverter implements ComplexTypeConverter> CONVERTER_MAP; + + static { + CONVERTER_MAP = new HashMap<>(); + CONVERTER_MAP.put("id", Collections.singletonList(RgaDataModel.GENE_ID)); + CONVERTER_MAP.put("name", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.GENE_NAME)); + CONVERTER_MAP.put("chromosome", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.CHROMOSOME)); + CONVERTER_MAP.put("start", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.START)); + CONVERTER_MAP.put("end", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.END)); + CONVERTER_MAP.put("strand", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.STRAND)); + CONVERTER_MAP.put("biotype", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.GENE_BIOTYPE)); + CONVERTER_MAP.put("annotation", Collections.emptyList()); + CONVERTER_MAP.put("individuals.id", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SAMPLE_ID)); + CONVERTER_MAP.put("individuals.transcriptsMap.id", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID)); + CONVERTER_MAP.put("individuals.transcriptsMap.chromosome", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CHROMOSOME)); + CONVERTER_MAP.put("individuals.transcriptsMap.start", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.START)); + CONVERTER_MAP.put("individuals.transcriptsMap.end", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.END)); + CONVERTER_MAP.put("individuals.transcriptsMap.biotype", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_BIOTYPE)); + CONVERTER_MAP.put("individuals.transcriptsMap.strand", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); + CONVERTER_MAP.put("individuals.transcriptsMap.variants.id", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_JSON)); + CONVERTER_MAP.put("individuals.transcriptsMap.variants.genotype", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON)); + CONVERTER_MAP.put("individuals.transcriptsMap.variants.filter", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.FILTERS)); + CONVERTER_MAP.put("individuals.transcriptsMap.variants.qual", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON)); + CONVERTER_MAP.put("individuals.transcriptsMap.variants.knockoutType", Arrays.asList(RgaDataModel.GENE_ID, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.KNOCKOUT_TYPES)); + CONVERTER_MAP.put("individuals.transcriptsMap.variants.populationFrequencies", Arrays.asList(RgaDataModel.GENE_ID, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.POPULATION_FREQUENCIES)); + CONVERTER_MAP.put("individuals.transcriptsMap.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.GENE_ID, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.CONSEQUENCE_TYPES)); + } + public GeneRgaConverter() { this.logger = LoggerFactory.getLogger(GeneRgaConverter.class); } @@ -57,23 +100,27 @@ public List convertToDataModelType(List rgaDataMod knockoutByGene.addIndividual(knockoutIndividual); } - // Add new transcript - KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId()); - knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); + if (StringUtils.isNotEmpty(rgaDataModel.getTranscriptId())) { + // Add new transcript + KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId()); + knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); - knockoutIndividual.addTranscripts(Collections.singletonList(knockoutTranscript)); + knockoutIndividual.addTranscripts(Collections.singletonList(knockoutTranscript)); - List knockoutVariantList = new LinkedList<>(); - for (String variantJson : rgaDataModel.getVariantJson()) { - try { - KnockoutVariant knockoutVariant = JacksonUtils.getDefaultObjectMapper().readValue(variantJson, - KnockoutVariant.class); - knockoutVariantList.add(knockoutVariant); - } catch (JsonProcessingException e) { - logger.warn("Could not parse KnockoutVariants: {}", e.getMessage(), e); + if (rgaDataModel.getVariantJson() != null) { + List knockoutVariantList = new LinkedList<>(); + for (String variantJson : rgaDataModel.getVariantJson()) { + try { + KnockoutVariant knockoutVariant = JacksonUtils.getDefaultObjectMapper().readValue(variantJson, + KnockoutVariant.class); + knockoutVariantList.add(knockoutVariant); + } catch (JsonProcessingException e) { + logger.warn("Could not parse KnockoutVariants: {}", e.getMessage(), e); + } + } + knockoutTranscript.setVariants(knockoutVariantList); } } - knockoutTranscript.setVariants(knockoutVariantList); } return new ArrayList<>(result.values()); @@ -84,4 +131,39 @@ public List convertToStorageType(List object) { return null; } + + public List getIncludeFields(List includeFields) { + Set toInclude = new HashSet<>(); + for (String includeField : includeFields) { + for (String fieldKey : CONVERTER_MAP.keySet()) { + if (fieldKey.startsWith(includeField)) { + toInclude.addAll(CONVERTER_MAP.get(fieldKey)); + } + } + } + return new ArrayList<>(toInclude); + } + + public List getIncludeFromExcludeFields(List excludeFields) { + Set excludedFields = new HashSet<>(); + + for (String excludeField : excludeFields) { + for (String fieldKey : CONVERTER_MAP.keySet()) { + if (fieldKey.startsWith(excludeField)) { + excludedFields.add(fieldKey); + } + } + } + + // Add everything that was not excluded + Set toInclude = new HashSet<>(); + for (String field : CONVERTER_MAP.keySet()) { + if (!excludedFields.contains(field)) { + toInclude.addAll(CONVERTER_MAP.get(field)); + } + } + + return new ArrayList<>(toInclude); + } + } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index 06fe6fda9f0..addb9d0dbb1 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -23,6 +23,45 @@ public class IndividualRgaConverter implements ComplexTypeConverter> CONVERTER_MAP; + + static { + CONVERTER_MAP = new HashMap<>(); + CONVERTER_MAP.put("id", Collections.singletonList(RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("sampleId", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SAMPLE_ID)); + CONVERTER_MAP.put("sex", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SEX)); + CONVERTER_MAP.put("phenotypes", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.PHENOTYPES, RgaDataModel.PHENOTYPE_JSON)); + CONVERTER_MAP.put("disorders", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.DISORDERS, RgaDataModel.DISORDER_JSON)); + CONVERTER_MAP.put("stats", Collections.emptyList()); + CONVERTER_MAP.put("genesMap.id", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID)); + CONVERTER_MAP.put("genesMap.name", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_NAME)); + CONVERTER_MAP.put("genesMap.chromosome", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.CHROMOSOME)); + CONVERTER_MAP.put("genesMap.biotype", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_BIOTYPE)); + CONVERTER_MAP.put("genesMap.transcriptsMap.id", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID)); + CONVERTER_MAP.put("genesMap.transcriptsMap.chromosome", + Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CHROMOSOME)); + CONVERTER_MAP.put("genesMap.transcriptsMap.start", + Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.START)); + CONVERTER_MAP.put("genesMap.transcriptsMap.end", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.END)); + CONVERTER_MAP.put("genesMap.transcriptsMap.biotype", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_BIOTYPE)); + CONVERTER_MAP.put("genesMap.transcriptsMap.strand", + Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); + CONVERTER_MAP.put("genesMap.transcriptsMap.variants.id", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_JSON)); + CONVERTER_MAP.put("genesMap.transcriptsMap.variants.filter", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS, RgaDataModel.VARIANT_JSON)); + CONVERTER_MAP.put("genesMap.transcriptsMap.variants.knockoutType", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.KNOCKOUT_TYPES, RgaDataModel.VARIANT_JSON)); + CONVERTER_MAP.put("genesMap.transcriptsMap.variants.populationFrequencies", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.POPULATION_FREQUENCIES, RgaDataModel.VARIANT_JSON)); + CONVERTER_MAP.put("genesMap.transcriptsMap.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CONSEQUENCE_TYPES, RgaDataModel.VARIANT_JSON)); + } + public IndividualRgaConverter() { this.logger = LoggerFactory.getLogger(IndividualRgaConverter.class); } @@ -39,7 +78,7 @@ public List convertToDataModelType(List rgaD KnockoutByIndividual knockoutByIndividual = new KnockoutByIndividual(); knockoutByIndividual.setId(rgaDataModel.getIndividualId()); knockoutByIndividual.setSampleId(rgaDataModel.getSampleId()); - knockoutByIndividual.setSex(IndividualProperty.Sex.valueOf(rgaDataModel.getSex())); + knockoutByIndividual.setSex(rgaDataModel.getSex() != null ? IndividualProperty.Sex.valueOf(rgaDataModel.getSex()) : null); if (rgaDataModel.getPhenotypeJson() != null) { List phenotypes = new ArrayList<>(rgaDataModel.getPhenotypeJson().size()); for (String phenotype : rgaDataModel.getPhenotypeJson()) { @@ -96,22 +135,26 @@ public List convertToDataModelType(List rgaD knockoutByIndividual.addGene(knockoutGene); } - // Add new transcript - KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId()); - knockoutGene.addTranscripts(Collections.singletonList(knockoutTranscript)); - - knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); - List knockoutVariantList = new LinkedList<>(); - for (String variantJson : rgaDataModel.getVariantJson()) { - try { - KnockoutVariant knockoutVariant = JacksonUtils.getDefaultObjectMapper().readValue(variantJson, - KnockoutVariant.class); - knockoutVariantList.add(knockoutVariant); - } catch (JsonProcessingException e) { - logger.warn("Could not parse KnockoutVariants: {}", e.getMessage(), e); + if (StringUtils.isNotEmpty(rgaDataModel.getTranscriptId())) { + // Add new transcript + KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId()); + knockoutGene.addTranscripts(Collections.singletonList(knockoutTranscript)); + + knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); + if (rgaDataModel.getVariantJson() != null) { + List knockoutVariantList = new LinkedList<>(); + for (String variantJson : rgaDataModel.getVariantJson()) { + try { + KnockoutVariant knockoutVariant = JacksonUtils.getDefaultObjectMapper().readValue(variantJson, + KnockoutVariant.class); + knockoutVariantList.add(knockoutVariant); + } catch (JsonProcessingException e) { + logger.warn("Could not parse KnockoutVariants: {}", e.getMessage(), e); + } + } + knockoutTranscript.setVariants(knockoutVariantList); } } - knockoutTranscript.setVariants(knockoutVariantList); } List knockoutByIndividualList = new ArrayList<>(knockoutByIndividualOrder.size()); @@ -516,4 +559,38 @@ private List populateDisorders(List disorders) { } return new ArrayList(disorderIds); } + + public List getIncludeFields(List includeFields) { + Set toInclude = new HashSet<>(); + for (String includeField : includeFields) { + for (String fieldKey : CONVERTER_MAP.keySet()) { + if (fieldKey.startsWith(includeField)) { + toInclude.addAll(CONVERTER_MAP.get(fieldKey)); + } + } + } + return new ArrayList<>(toInclude); + } + + public List getIncludeFromExcludeFields(List excludeFields) { + Set excludedFields = new HashSet<>(); + + for (String excludeField : excludeFields) { + for (String fieldKey : CONVERTER_MAP.keySet()) { + if (fieldKey.startsWith(excludeField)) { + excludedFields.add(fieldKey); + } + } + } + + // Add everything that was not excluded + Set toInclude = new HashSet<>(); + for (String field : CONVERTER_MAP.keySet()) { + if (!excludedFields.contains(field)) { + toInclude.addAll(CONVERTER_MAP.get(field)); + } + } + + return new ArrayList<>(toInclude); + } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index b8d5d3ac6a4..d1155727631 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -139,6 +139,7 @@ public void insert(String collection, List knockoutByIndiv public OpenCGAResult individualQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { SolrQuery solrQuery = fixQuery(collection, query, queryOptions); + fixIndividualOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; @@ -154,6 +155,42 @@ public OpenCGAResult individualQuery(String collection, Qu return new OpenCGAResult<>(queryResult); } + private void fixIndividualOptions(QueryOptions queryOptions, SolrQuery solrQuery) { + if (queryOptions.containsKey(QueryOptions.INCLUDE)) { + for (String include : individualRgaConverter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { + solrQuery.addField(include); + } + } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { + for (String include : individualRgaConverter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { + solrQuery.addField(include); + } + } + } + + private void fixGeneOptions(QueryOptions queryOptions, SolrQuery solrQuery) { + if (queryOptions.containsKey(QueryOptions.INCLUDE)) { + for (String include : geneConverter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { + solrQuery.addField(include); + } + } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { + for (String include : geneConverter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { + solrQuery.addField(include); + } + } + } + + private void fixVariantOptions(QueryOptions queryOptions, SolrQuery solrQuery) { + if (queryOptions.containsKey(QueryOptions.INCLUDE)) { + for (String include : variantConverter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { + solrQuery.addField(include); + } + } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { + for (String include : variantConverter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { + solrQuery.addField(include); + } + } + } + private SolrQuery fixQuery(String collection, Query query, QueryOptions queryOptions) throws IOException, RgaException { int limit = queryOptions.getInt(QueryOptions.LIMIT); int skip = queryOptions.getInt(QueryOptions.SKIP); @@ -172,7 +209,6 @@ private SolrQuery fixQuery(String collection, Query query, QueryOptions queryOpt } SolrQuery solrQuery = parser.parseQuery(query); - parser.parseOptions(queryOptions, solrQuery); return solrQuery; } @@ -189,7 +225,7 @@ private SolrQuery fixQuery(String collection, Query query, QueryOptions queryOpt public OpenCGAResult geneQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { SolrQuery solrQuery = parser.parseQuery(query); - parser.parseOptions(queryOptions, solrQuery); + fixGeneOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; @@ -218,7 +254,7 @@ public OpenCGAResult geneQuery(String collection, Query query, Q public OpenCGAResult variantQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { SolrQuery solrQuery = parser.parseQuery(query); - parser.parseOptions(queryOptions, solrQuery); + fixVariantOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java index 86aba6bbd18..7379092715c 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java @@ -4,7 +4,6 @@ import org.apache.solr.client.solrj.SolrQuery; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; import org.opencb.commons.datastore.core.Query; -import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.solr.FacetQueryParser; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.storage.core.exceptions.RgaException; @@ -62,18 +61,6 @@ public SolrQuery parseQuery(Query query) throws RgaException { return solrQuery; } - public SolrQuery parseOptions(QueryOptions queryOptions, SolrQuery solrQuery) { - if (queryOptions.containsKey(QueryOptions.INCLUDE)) { - for (String include : queryOptions.getAsStringList(QueryOptions.INCLUDE)) { - solrQuery.addField(include); - } - } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { -// includes = getSolrIncludeFromExclude(queryOptions.getAsStringList(QueryOptions.EXCLUDE)); - } - - return solrQuery; - } - private void fixQuery(Query query) { if (query.containsKey(CONSEQUENCE_TYPE.key())) { // Convert CONSEQUENCE TYPES to full SO Terms so they can be successfully processed diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java index e05f471f6a4..afb3a73d664 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java @@ -15,6 +15,54 @@ public class VariantRgaConverter implements ComplexTypeConverter> CONVERTER_MAP; + + static { + CONVERTER_MAP = new HashMap<>(); + CONVERTER_MAP.put("id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); + CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.SAMPLE_ID)); + CONVERTER_MAP.put("individuals.sex", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.SEX)); + CONVERTER_MAP.put("individuals.phenotypes", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.PHENOTYPES, RgaDataModel.PHENOTYPE_JSON)); + CONVERTER_MAP.put("individuals.disorders", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.DISORDERS, RgaDataModel.DISORDER_JSON)); + CONVERTER_MAP.put("individuals.stats", Collections.emptyList()); + CONVERTER_MAP.put("individuals.genesMap.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID)); + CONVERTER_MAP.put("individuals.genesMap.name", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.GENE_NAME)); + CONVERTER_MAP.put("individuals.genesMap.chromosome", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CHROMOSOME)); + CONVERTER_MAP.put("individuals.genesMap.biotype", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.GENE_BIOTYPE)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.chromosome", Arrays.asList(RgaDataModel.VARIANT_JSON, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CHROMOSOME)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.start", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.START)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.end", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.END)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.biotype", Arrays.asList(RgaDataModel.VARIANT_JSON, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_BIOTYPE)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.strand", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.id", Arrays.asList(RgaDataModel.VARIANT_JSON, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.filter", Arrays.asList(RgaDataModel.VARIANT_JSON, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.knockoutType", Arrays.asList(RgaDataModel.VARIANT_JSON, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.KNOCKOUT_TYPES)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.populationFrequencies", Arrays.asList(RgaDataModel.VARIANT_JSON, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.POPULATION_FREQUENCIES)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.VARIANT_JSON, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CONSEQUENCE_TYPES)); + } + public VariantRgaConverter() { this.logger = LoggerFactory.getLogger(VariantRgaConverter.class); this.individualRgaConverter = new IndividualRgaConverter(); @@ -132,4 +180,39 @@ private KnockoutByIndividual getFilteredKnockoutByIndividual(KnockoutByIndividua public List convertToStorageType(List knockoutByVariants) { return null; } + + + public List getIncludeFields(List includeFields) { + Set toInclude = new HashSet<>(); + for (String includeField : includeFields) { + for (String fieldKey : CONVERTER_MAP.keySet()) { + if (fieldKey.startsWith(includeField)) { + toInclude.addAll(CONVERTER_MAP.get(fieldKey)); + } + } + } + return new ArrayList<>(toInclude); + } + + public List getIncludeFromExcludeFields(List excludeFields) { + Set excludedFields = new HashSet<>(); + + for (String excludeField : excludeFields) { + for (String fieldKey : CONVERTER_MAP.keySet()) { + if (fieldKey.startsWith(excludeField)) { + excludedFields.add(fieldKey); + } + } + } + + // Add everything that was not excluded + Set toInclude = new HashSet<>(); + for (String field : CONVERTER_MAP.keySet()) { + if (!excludedFields.contains(field)) { + toInclude.addAll(CONVERTER_MAP.get(field)); + } + } + + return new ArrayList<>(toInclude); + } } diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java index de906b1a57d..d070082a5b9 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java @@ -8,15 +8,14 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.core.common.JacksonUtils; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; +import org.opencb.opencga.core.models.analysis.knockout.*; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.config.StorageConfiguration; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -95,6 +94,90 @@ public void testIndividualQuery() throws Exception { assertEquals(1, result.getNumResults()); } + @Test + public void testIncludeExcludeIndividualQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + + QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name")); + OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), options); + assertEquals(2, result.getNumResults()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertNotNull(result.getResults().get(i).getId()); + assertTrue(result.getResults().get(i).getPhenotypes().isEmpty()); + assertNotNull(result.getResults().get(i).getSampleId()); + assertNotNull(result.getResults().get(i).getDisorders()); + assertNotNull(result.getResults().get(i).getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { + assertNotNull(gene.getId()); + assertNotNull(gene.getName()); + assertNull(gene.getStrand()); + assertTrue(gene.getTranscripts().isEmpty()); + } + } + + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", + "genesMap.transcriptsMap.variants")); + result = rgaEngine.individualQuery(collection, new Query(), options); + assertEquals(2, result.getNumResults()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertNotNull(result.getResults().get(i).getId()); + assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); + assertNull(result.getResults().get(i).getSampleId()); + assertTrue(result.getResults().get(i).getDisorders().isEmpty()); + assertNotNull(result.getResults().get(i).getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + for (KnockoutTranscript transcript : gene.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNotNull(transcript.getBiotype()); + assertTrue(transcript.getVariants().isEmpty()); + } + } + } + + // It should be not possible to completely exclude knockoutType without excluding the whole variant information + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", + "genesMap.transcriptsMap.variants.knockoutType")); + result = rgaEngine.individualQuery(collection, new Query(), options); + assertEquals(2, result.getNumResults()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertNotNull(result.getResults().get(i).getId()); + assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); + assertNull(result.getResults().get(i).getSampleId()); + assertTrue(result.getResults().get(i).getDisorders().isEmpty()); + assertNotNull(result.getResults().get(i).getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + for (KnockoutTranscript transcript : gene.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNotNull(transcript.getBiotype()); + assertFalse(transcript.getVariants().isEmpty()); + for (KnockoutVariant variant : transcript.getVariants()) { + assertNotNull(variant.getId()); + assertNotNull(variant.getKnockoutType()); + assertFalse(variant.getPopulationFrequencies().isEmpty()); + } + } + } + } + + } + @Test public void testLimitAndSkip() throws Exception { RgaEngine rgaEngine = solr.configure(storageConfiguration); @@ -191,6 +274,85 @@ public void testGeneQuery() throws Exception { assertEquals(2, result.getNumResults()); } + @Test + public void testIncludeExcludeGeneQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + + QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome")); + OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), options); + assertEquals(4, result.getNumResults()); + for (KnockoutByGene gene : result.getResults()) { + assertNotNull(gene.getId()); + assertNotNull(gene.getName()); + assertNull(gene.getBiotype()); + for (KnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { + assertNotNull(individual.getId()); + assertNull(individual.getSampleId()); + for (KnockoutTranscript transcript : individual.getTranscripts()) { + assertNotNull(transcript.getId()); +// assertNotNull(transcript.getChromosome()); + assertNull(transcript.getBiotype()); + assertTrue(transcript.getVariants().isEmpty()); + } + } + } + + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", + "individuals.transcriptsMap.variants")); + result = rgaEngine.geneQuery(collection, new Query(), options); + assertEquals(4, result.getNumResults()); + for (KnockoutByGene gene : result.getResults()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getBiotype()); + for (KnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { + assertNotNull(individual.getId()); + assertNotNull(individual.getSampleId()); + for (KnockoutTranscript transcript : individual.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNull(transcript.getChromosome()); + assertNotNull(transcript.getBiotype()); + assertTrue(transcript.getVariants().isEmpty()); + } + } + } + + // It should be not possible to completely exclude knockoutType without excluding the whole variant information + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", + "individuals.transcriptsMap.variants.knockoutType")); + result = rgaEngine.geneQuery(collection, new Query(), options); + assertEquals(4, result.getNumResults()); + for (KnockoutByGene gene : result.getResults()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getBiotype()); + for (KnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { + assertNotNull(individual.getId()); + assertNotNull(individual.getSampleId()); + for (KnockoutTranscript transcript : individual.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNull(transcript.getChromosome()); + assertNotNull(transcript.getBiotype()); + assertFalse(transcript.getVariants().isEmpty()); + for (KnockoutVariant variant : transcript.getVariants()) { + assertNotNull(variant.getId()); + assertNotNull(variant.getKnockoutType()); + assertFalse(variant.getPopulationFrequencies().isEmpty()); + } + } + } + } + } + @Test public void testVariantQuery() throws Exception { RgaEngine rgaEngine = solr.configure(storageConfiguration); @@ -208,6 +370,104 @@ public void testVariantQuery() throws Exception { assertEquals(6, result.getNumResults()); } + @Test + public void testIncludeExcludeVariantQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + + QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", + "individuals.genesMap.name")); + OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), options); + assertEquals(6, result.getNumResults()); + for (KnockoutByVariant variant : result.getResults()) { + assertNotNull(variant.getId()); + for (KnockoutByIndividual individual : variant.getIndividuals()) { + assertNotNull(individual.getId()); + assertTrue(individual.getPhenotypes().isEmpty()); + assertNotNull(individual.getSampleId()); + assertNotNull(individual.getDisorders()); + assertNotNull(individual.getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { + assertNotNull(gene.getId()); + assertNotNull(gene.getName()); + assertNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + } + + } + } + + // Not possible excluding variants object because that's basic for this data model + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", + "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants")); + result = rgaEngine.variantQuery(collection, new Query(), options); + assertEquals(6, result.getNumResults()); + for (KnockoutByVariant variant : result.getResults()) { + assertNotNull(variant.getId()); + for (KnockoutByIndividual individual : variant.getIndividuals()) { + assertNotNull(individual.getId()); + assertFalse(individual.getPhenotypes().isEmpty()); + assertNull(individual.getSampleId()); + assertTrue(individual.getDisorders().isEmpty()); + assertNotNull(individual.getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + for (KnockoutTranscript transcript : gene.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNotNull(transcript.getBiotype()); + assertFalse(transcript.getVariants().isEmpty()); + } + + } + } + } + + // It should be not possible to completely exclude knockoutType without excluding the whole variant information + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", + "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants.knockoutType")); + result = rgaEngine.variantQuery(collection, new Query(), options); + assertEquals(6, result.getNumResults()); + for (KnockoutByVariant variant : result.getResults()) { + assertNotNull(variant.getId()); + for (KnockoutByIndividual individual : variant.getIndividuals()) { + assertNotNull(individual.getId()); + assertFalse(individual.getPhenotypes().isEmpty()); + assertNull(individual.getSampleId()); + assertTrue(individual.getDisorders().isEmpty()); + assertNotNull(individual.getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + for (KnockoutTranscript transcript : gene.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNotNull(transcript.getBiotype()); + assertFalse(transcript.getVariants().isEmpty()); + for (KnockoutVariant tmpVariant : transcript.getVariants()) { + assertNotNull(tmpVariant.getId()); + assertNotNull(tmpVariant.getKnockoutType()); + assertFalse(tmpVariant.getPopulationFrequencies().isEmpty()); + } + } + } + } + } + + } + + @Test public void testFacet() throws Exception { RgaEngine rgaEngine = solr.configure(storageConfiguration); From 55c7119ddbd0339486af1ab2c07da9151468b828 Mon Sep 17 00:00:00 2001 From: Antonio Altamura Date: Thu, 18 Feb 2021 16:54:35 +0000 Subject: [PATCH 037/412] GitBook: [develop] 2 pages and 2 assets modified --- ...sis.alignment.webservices (1) (1) (1).png} | Bin docs/components-1/alignment-and-coverage.md | 2 +- .../client-libraries/javascript.md | 32 ++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) rename docs/.gitbook/assets/{analysis.alignment.webservices (1).png => analysis.alignment.webservices (1) (1) (1).png} (100%) diff --git a/docs/.gitbook/assets/analysis.alignment.webservices (1).png b/docs/.gitbook/assets/analysis.alignment.webservices (1) (1) (1).png similarity index 100% rename from docs/.gitbook/assets/analysis.alignment.webservices (1).png rename to docs/.gitbook/assets/analysis.alignment.webservices (1) (1) (1).png diff --git a/docs/components-1/alignment-and-coverage.md b/docs/components-1/alignment-and-coverage.md index 36cadeba5ad..6a39ea6709b 100644 --- a/docs/components-1/alignment-and-coverage.md +++ b/docs/components-1/alignment-and-coverage.md @@ -39,5 +39,5 @@ The tutorial [Working with Alignment Data](http://docs.opencb.org/display/opencg Next image shows the OpenCGA RESTfull web services to manage alignment data: -![](../.gitbook/assets/analysis.alignment.webservices%20%281%29%20%281%29.png) +![](../.gitbook/assets/analysis.alignment.webservices%20%281%29%20%281%29%20%281%29.png) diff --git a/docs/using-opencga/client-libraries/javascript.md b/docs/using-opencga/client-libraries/javascript.md index 8020a2c003b..30471ec0785 100644 --- a/docs/using-opencga/client-libraries/javascript.md +++ b/docs/using-opencga/client-libraries/javascript.md @@ -1,2 +1,34 @@ # JavaScript +### Fetching the first 10 samples of the defined Study + +```text +import {OpenCGAClient} from "./opencga-client.js"; +import {RestResponse} from "./../rest-response.js"; + +const host = ""; // add your host +const study = ""; // add your study +const token = ""; // add a valid token + +const client = new OpenCGAClient({ + host: host, + version: "v2", + cookies: {active: false}, + token: token +}); + + +(async () => { + try { + const restResponse = await client.samples().search({limit:10, study: study}); + console.table(restResponse.getResults()); + } catch (response) { + if (response instanceof RestResponse) { + console.error(response.getEvents()) + } else { + console.error(response) + } + } +})() +``` + From bae4df62015ab9ac86424415b816dff230a78e0b Mon Sep 17 00:00:00 2001 From: Laura Date: Tue, 23 Feb 2021 16:30:05 +0000 Subject: [PATCH 038/412] GitBook: [develop] 70 pages modified --- docs/overview/data-models/README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/overview/data-models/README.md b/docs/overview/data-models/README.md index ba1432b56c3..71daab2eab7 100644 --- a/docs/overview/data-models/README.md +++ b/docs/overview/data-models/README.md @@ -1,12 +1,22 @@ +--- +description: >- + Remarkable data models from openCGA resources that can be relevant for + operating with OpenCGA through their web services. +--- + # Data Models ## Design Principles All OpenCGA Data Models have been designed to follow some principles: -1. Parent-Child List -2. Chid-Parent reference +1. Parent-Child List - Parent resources have a list of Child resources objects in their data models. +2. Chid-Parent reference - String ids from Parents referenced in Child data model. 3. Annotation Sets +4. String id is mandatory for any resource. A unique uuid is generated for each instance of a resource created, which is immutable. ​ +5. Each resource has a version, release, creationDate and modificationDate attribute which is immutable. + + ## Implementation From b90e48358c45de48b52a6ce1af3f25cf560082dd Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Tue, 23 Feb 2021 17:12:14 +0000 Subject: [PATCH 039/412] GitBook: [develop] 9 pages modified --- docs/SUMMARY.md | 10 +++--- .../data-models/README.md | 6 ++-- .../data-models/individual.md | 0 .../data-models/sample.md | 0 docs/overview/clinical-data-analysis.md | 26 +++++++++++++- docs/overview/data-management.md | 34 ++++++++++++++++--- 6 files changed, 63 insertions(+), 13 deletions(-) rename docs/{overview => manual}/data-models/README.md (95%) rename docs/{overview => manual}/data-models/individual.md (100%) rename docs/{overview => manual}/data-models/sample.md (100%) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index d00d223a32e..6f7ebc52564 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -5,13 +5,10 @@ * [Features](overview/features.md) * [Architecture Diagram](overview/architecture.md) * [Security](overview/security.md) - * [Metadata and Clinical Data](overview/data-management.md) - * [Data Models](overview/data-models/README.md) - * [Sample](overview/data-models/sample.md) - * [Individual](overview/data-models/individual.md) + * [Metadata](overview/data-management.md) * [Alignment and Coverage](overview/alignment-and-coverage.md) * [Variant Query and Analysis](overview/variant-query-and-analysis.md) - * [Clinical Data Analysis](overview/clinical-data-analysis.md) + * [Clinical Analysis](overview/clinical-data-analysis.md) * [Running Analysis](overview/running-analysis.md) * [Scalability and Performance](overview/scalability-and-performance.md) * [Sizing OpenCGA](overview/sizing-opencga.md) @@ -68,6 +65,9 @@ * [Clinical Genomics](manual/clinical-genomics/README.md) * [Clinical Interpretation](manual/clinical-genomics/clinical-interpretation.md) * [Clinical Analysis](manual/clinical-genomics/clinical-analysis.md) +* [Data Models](manual/data-models/README.md) + * [Sample](manual/data-models/sample.md) + * [Individual](manual/data-models/individual.md) * [Using JupyterLab](manual/using-jupyterlab.md) * [Administrator](manual/administrator/README.md) * [User Management](manual/administrator/user-management.md) diff --git a/docs/overview/data-models/README.md b/docs/manual/data-models/README.md similarity index 95% rename from docs/overview/data-models/README.md rename to docs/manual/data-models/README.md index 71daab2eab7..4d04c3ebae5 100644 --- a/docs/overview/data-models/README.md +++ b/docs/manual/data-models/README.md @@ -13,19 +13,19 @@ All OpenCGA Data Models have been designed to follow some principles: 1. Parent-Child List - Parent resources have a list of Child resources objects in their data models. 2. Chid-Parent reference - String ids from Parents referenced in Child data model. 3. Annotation Sets -4. String id is mandatory for any resource. A unique uuid is generated for each instance of a resource created, which is immutable. ​ +4. String id is mandatory for any resource. A unique UUID is generated for each instance of a resource created, which is immutable. ​ 5. Each resource has a version, release, creationDate and modificationDate attribute which is immutable. -## Implementation - ### Diagram ![](../../.gitbook/assets/catalog_data_models_v13.png) ## Common Data Models +Some data models are used ... + ### Annotation Set | Field | Description | diff --git a/docs/overview/data-models/individual.md b/docs/manual/data-models/individual.md similarity index 100% rename from docs/overview/data-models/individual.md rename to docs/manual/data-models/individual.md diff --git a/docs/overview/data-models/sample.md b/docs/manual/data-models/sample.md similarity index 100% rename from docs/overview/data-models/sample.md rename to docs/manual/data-models/sample.md diff --git a/docs/overview/clinical-data-analysis.md b/docs/overview/clinical-data-analysis.md index 9651e7d0f3c..cf23a211943 100644 --- a/docs/overview/clinical-data-analysis.md +++ b/docs/overview/clinical-data-analysis.md @@ -1,2 +1,26 @@ -# Clinical Data Analysis +# Clinical Analysis + +## Case Registration + +OpenCGA provides a rich set of data models covering the most commons needs for any genomic analysis... + +### Security + + + +## Interpretation Analysis + +multiple interpretations and restore allowed, comments, sharing, ... + + + +## Clinical Report + + + +## Clinical Pathogenic Database + + + + diff --git a/docs/overview/data-management.md b/docs/overview/data-management.md index 50dc72747ea..58e313404a8 100644 --- a/docs/overview/data-management.md +++ b/docs/overview/data-management.md @@ -1,10 +1,36 @@ -# Metadata and Clinical Data +# Metadata -## Metadata +## Data Models OpenCGA implements an advanced Metadata Database \([OpenCGA Catalog](../components-1/catalog/)\) that keeps track of ... -## Clinical Data +### Main features + +#### Rich + + + +#### Customizable + + + +#### Versioned + + + +#### UUID + + + +#### Permission + + + +#### Clinical Case Studies + + + + + -OpenCGA provides a rich set of data models covering the most commons needs for any genomic analysis... From 423f0c02462f89df01f0eac5e335832b3396aacf Mon Sep 17 00:00:00 2001 From: Laura Date: Wed, 24 Feb 2021 09:58:26 +0000 Subject: [PATCH 040/412] GitBook: [develop] one page and 7 assets modified --- docs/.gitbook/assets/image (1).png | Bin 0 -> 1268 bytes docs/.gitbook/assets/image (2).png | Bin 0 -> 49760 bytes docs/.gitbook/assets/image (3).png | Bin 0 -> 1268 bytes docs/.gitbook/assets/image (4).png | Bin 0 -> 1268 bytes docs/.gitbook/assets/image (5).png | Bin 0 -> 1268 bytes docs/.gitbook/assets/image (6).png | Bin 0 -> 1268 bytes docs/.gitbook/assets/image.png | Bin 0 -> 1268 bytes .../sharing-and-permissions.md | 70 ++++++++++++++++++ 8 files changed, 70 insertions(+) create mode 100644 docs/.gitbook/assets/image (1).png create mode 100644 docs/.gitbook/assets/image (2).png create mode 100644 docs/.gitbook/assets/image (3).png create mode 100644 docs/.gitbook/assets/image (4).png create mode 100644 docs/.gitbook/assets/image (5).png create mode 100644 docs/.gitbook/assets/image (6).png create mode 100644 docs/.gitbook/assets/image.png diff --git a/docs/.gitbook/assets/image (1).png b/docs/.gitbook/assets/image (1).png new file mode 100644 index 0000000000000000000000000000000000000000..b550f3764b0a062bba13ffcf40c11fa368d201af GIT binary patch literal 1268 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 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/image (3).png b/docs/.gitbook/assets/image (3).png new file mode 100644 index 0000000000000000000000000000000000000000..b550f3764b0a062bba13ffcf40c11fa368d201af GIT binary patch literal 1268 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 eJM%w1&;JFcFQXx&{LyLv0000 + + + Category + + Permission + + +

Users and +

+

Groups +

+ + Admins (users in admins group) + + Owner + + + + + + Study + + Delete + + + + + + + Create new admins + + + + + + + Groups + + + + + + + Variable sets + + + + + + + Set permissions (share) + + + + + + + Run analyses (Execution) + + + + + + + +![Decision Algorithm for granting permissions ](../../.gitbook/assets/image%20%282%29.png) + + + From 67536556cacd08b19bdac47cf7f5a8380494054e Mon Sep 17 00:00:00 2001 From: Laura Date: Wed, 24 Feb 2021 09:58:49 +0000 Subject: [PATCH 041/412] GitBook: [develop] one page modified --- docs/manual/data-management/sharing-and-permissions.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/manual/data-management/sharing-and-permissions.md b/docs/manual/data-management/sharing-and-permissions.md index 98d3738433e..9752a027238 100644 --- a/docs/manual/data-management/sharing-and-permissions.md +++ b/docs/manual/data-management/sharing-and-permissions.md @@ -1,5 +1,7 @@ # Sharing and Permissions +[http://docs.opencb.org/display/opencga/Sharing+and+Permissions](http://docs.opencb.org/display/opencga/Sharing+and+Permissions) + From 393640e784af6fbad58eef140a10027e1c44cb25 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 1 Mar 2021 13:52:27 +0100 Subject: [PATCH 042/412] clinical: consider permissions in RGA, #1693 --- opencga-analysis/pom.xml | 6 + .../analysis/clinical/rga/RgaAnalysis.java | 1 + ...atalogSampleToSolrSampleConverterTest.java | 2 +- opencga-clinical/pom.xml | 95 +++ .../opencga/clinical/StorageManager.java | 76 ++ .../opencga}/clinical/rga/RgaManager.java | 189 ++++- .../opencga/clinical/rga/RgaManagerTest.java | 667 ++++++++++++++++++ .../rest/analysis/ClinicalWebService.java | 2 +- .../opencga/storage/core/rga/RgaEngine.java | 3 +- pom.xml | 1 + 10 files changed, 1027 insertions(+), 15 deletions(-) create mode 100644 opencga-clinical/pom.xml create mode 100644 opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java rename {opencga-analysis/src/main/java/org/opencb/opencga/analysis => opencga-clinical/src/main/java/org/opencb/opencga}/clinical/rga/RgaManager.java (61%) create mode 100644 opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java diff --git a/opencga-analysis/pom.xml b/opencga-analysis/pom.xml index f11deb6e7a4..a51f65bed9f 100644 --- a/opencga-analysis/pom.xml +++ b/opencga-analysis/pom.xml @@ -116,6 +116,12 @@ junit junit + + org.opencb.opencga + opencga-clinical + 2.1.0-SNAPSHOT + compile + diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java index 5233bf451ff..ecf47aa71e5 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java @@ -1,6 +1,7 @@ package org.opencb.opencga.analysis.clinical.rga; import org.opencb.opencga.analysis.variant.operations.OperationTool; +import org.opencb.opencga.clinical.rga.RgaManager; import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.tools.annotations.Tool; diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java index 5d15bec20f9..c51b8234914 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java @@ -72,7 +72,7 @@ public void SampleToSolrTest() throws JsonProcessingException { .setAnnotationSets(AnnotationHelper.createAnnotation()); List sampleAclEntry = Arrays.asList( - objectMapper.readValue(objectMapper.writeValueAsString(new SampleAclEntry("user1", EnumSet.of(SampleAclEntry.SamplePermissions.VIEW, SampleAclEntry.SamplePermissions.UPDATE))), Map.class), + objectMapper.readValue(objectMapper.writeValueAsString(new SampleAclEntry("user1", EnumSet.of(SampleAclEntry.SamplePermissions.VIEW, SampleAclEntry.SamplePermissions.WRITE))), Map.class), objectMapper.readValue(objectMapper.writeValueAsString(new SampleAclEntry("user2", EnumSet.noneOf(SampleAclEntry.SamplePermissions.class))), Map.class) ); attributes = new HashMap<>(); diff --git a/opencga-clinical/pom.xml b/opencga-clinical/pom.xml new file mode 100644 index 00000000000..c217f91eb48 --- /dev/null +++ b/opencga-clinical/pom.xml @@ -0,0 +1,95 @@ + + + + opencga + org.opencb.opencga + 2.1.0-SNAPSHOT + ../pom.xml + + 4.0.0 + + opencga-clinical + ${opencga.version} + jar + + + + org.opencb.opencga + opencga-storage-core + + + org.opencb.opencga + opencga-catalog + + + org.opencb.commons + commons-datastore-core + + + + org.opencb.opencga + opencga-catalog + ${opencga.version} + test-jar + test + + + org.opencb.opencga + opencga-storage-core + ${opencga.version} + test-jar + test + + + org.opencb.opencga + opencga-storage-mongodb + ${opencga.version} + test + + + org.opencb.opencga + opencga-storage-mongodb + ${opencga.version} + test-jar + test + + + + org.mockito + mockito-core + + + junit + junit + + + org.apache.solr + solr-solrj + + + org.apache.solr + solr-test-framework + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + test-jar + + test-jar + + + + + + + + + \ No newline at end of file diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java new file mode 100644 index 00000000000..1033ed7721f --- /dev/null +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java @@ -0,0 +1,76 @@ +package org.opencb.opencga.clinical; + +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.storage.core.StorageEngineFactory; +import org.opencb.opencga.storage.core.cache.CacheManager; +import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.storage.core.exceptions.StorageEngineException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class StorageManager { + + protected final CatalogManager catalogManager; + protected final CacheManager cacheManager; + protected final StorageConfiguration storageConfiguration; + protected final StorageEngineFactory storageEngineFactory; + + protected final Logger logger; + + public StorageManager(Configuration configuration, StorageConfiguration storageConfiguration) throws CatalogException { + this(new CatalogManager(configuration), StorageEngineFactory.get(storageConfiguration)); + } + + public StorageManager(CatalogManager catalogManager, StorageEngineFactory storageEngineFactory) { + this(catalogManager, null, storageEngineFactory.getStorageConfiguration(), storageEngineFactory); + } + + protected StorageManager(CatalogManager catalogManager, CacheManager cacheManager, StorageConfiguration storageConfiguration, + StorageEngineFactory storageEngineFactory) { + this.catalogManager = catalogManager; + this.cacheManager = cacheManager == null ? new CacheManager(storageConfiguration) : cacheManager; + this.storageConfiguration = storageConfiguration; + this.storageEngineFactory = storageEngineFactory == null + ? StorageEngineFactory.get(storageConfiguration) + : storageEngineFactory; + logger = LoggerFactory.getLogger(getClass()); + } + + + public void clearCache(String sessionId) throws CatalogException { + String userId = catalogManager.getUserManager().getUserId(sessionId); + + } + + + public void clearCache(String studyId, String sessionId) throws CatalogException { + String userId = catalogManager.getUserManager().getUserId(sessionId); + + } + + public abstract void testConnection() throws StorageEngineException; + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("StorageEngine{"); + sb.append("catalogManager=").append(catalogManager); + sb.append(", cacheManager=").append(cacheManager); + sb.append(", storageConfiguration=").append(storageConfiguration); + sb.append('}'); + return sb.toString(); + } + + public CatalogManager getCatalogManager() { + return catalogManager; + } + + public CacheManager getCacheManager() { + return cacheManager; + } + + public StorageConfiguration getStorageConfiguration() { + return storageConfiguration; + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java similarity index 61% rename from opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index a0e26d36c90..06f10528adf 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -1,20 +1,20 @@ -package org.opencb.opencga.analysis.clinical.rga; +package org.opencb.opencga.clinical.rga; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrException; +import org.opencb.commons.datastore.core.DataResult; +import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.CollectionUtils; -import org.opencb.opencga.analysis.StorageManager; import org.opencb.opencga.catalog.db.api.DBAdaptor; +import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.catalog.managers.FileManager; -import org.opencb.opencga.catalog.managers.IndividualManager; -import org.opencb.opencga.catalog.managers.SampleManager; +import org.opencb.opencga.catalog.managers.*; +import org.opencb.opencga.clinical.StorageManager; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; @@ -31,6 +31,7 @@ import org.opencb.opencga.storage.core.exceptions.RgaException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; +import org.opencb.opencga.storage.core.rga.RgaDataModel; import org.opencb.opencga.storage.core.rga.RgaEngine; import java.io.BufferedReader; @@ -39,6 +40,10 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; public class RgaManager extends StorageManager implements AutoCloseable { @@ -56,28 +61,179 @@ public RgaManager(Configuration configuration, StorageConfiguration storageConfi this.rgaEngine = new RgaEngine(storageConfiguration); } + public RgaManager(Configuration configuration, StorageConfiguration storageConfiguration, RgaEngine rgaEngine) throws CatalogException { + super(configuration, storageConfiguration); + this.rgaEngine = rgaEngine; + } + public OpenCGAResult individualQuery(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - // TODO: Check Permissions + String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); - return rgaEngine.individualQuery(collection, query, options); + + Query auxQuery = query != null ? new Query(query) : new Query(); + + if (!auxQuery.containsKey("sampleId") && !auxQuery.containsKey("individualId")) { + // 1st. we perform a facet to get the different sample ids matching the user query + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, + new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID)); + List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + + if (sampleIds.isEmpty()) { + return OpenCGAResult.empty(KnockoutByIndividual.class); + } + auxQuery.put("sampleId", sampleIds); + } + + // From the list of sample ids the user wants to retrieve data from, we filter those for which the user has permissions + Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); + if (auxQuery.containsKey("individualId")) { + sampleQuery.put(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), auxQuery.get("individualId")); + } else { + sampleQuery.put(SampleDBAdaptor.QueryParams.ID.key(), auxQuery.get("sampleId")); + } + + OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + if (authorisedSampleIdResult.getNumResults() == 0) { + return OpenCGAResult.empty(KnockoutByIndividual.class); + } + + int limit = options.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); + int skip = options.getInt(QueryOptions.SKIP); + + List sampleIds; + if (skip == 0 && limit > authorisedSampleIdResult.getNumResults()) { + sampleIds = (List) authorisedSampleIdResult.getResults(); + } else if (skip > authorisedSampleIdResult.getNumResults()) { + return OpenCGAResult.empty(KnockoutByIndividual.class); + } else { + int to = Math.min(authorisedSampleIdResult.getNumResults(), skip + limit); + sampleIds = (List) authorisedSampleIdResult.getResults().subList(skip, to); + } + auxQuery.put("sampleId", sampleIds); + + return rgaEngine.individualQuery(collection, auxQuery, options); } public OpenCGAResult geneQuery(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - // TODO: Check Permissions + String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); - return rgaEngine.geneQuery(collection, query, options); + + Query auxQuery = query != null ? new Query(query) : new Query(); + + // 1st. we perform a facet to get the different gene ids matching the user query and using the skip and limit values + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.GENE_ID); + facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); + facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); + + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + List geneIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + +// ExecutorService threadPool = Executors.newFixedThreadPool(2); +// List> futureList = new ArrayList<>(2); +// futureList.add(threadPool.submit(getNamedThread("Authorised sample ids", +// () -> { +// System.out.println("hello"); +// return true; +// }))); +// futureList.add(threadPool.submit(getNamedThread("Solr Gene query", +// () -> { +// return true; +// }))); +// threadPool.shutdown(); +// +// try { +// threadPool.awaitTermination(20, TimeUnit.SECONDS); +// if (!threadPool.isTerminated()) { +// for (Future future : futureList) { +// future.cancel(true); +// } +// } +// } catch (InterruptedException e) { +// throw new RgaException("Error launching threads when executing gene query analysis", e); +// } + + // 2. Check permissions + auxQuery.put(RgaDataModel.GENE_ID, geneIds); + // TODO: This should be done with Futures so it is done in parallel with step 4 (Also, this can be skipped if the user is admin) + result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID)); + List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + + // 3. Get list of sample ids for which the user has permissions + Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); + OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + Set authorisedSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + + // 4. Solr gene query + OpenCGAResult knockoutResult = rgaEngine.geneQuery(collection, auxQuery, options); + + // 5. Filter out individual or samples for which user does not have permissions + for (KnockoutByGene knockout : knockoutResult.getResults()) { + List individualList = new ArrayList<>(knockout.getIndividuals().size()); + for (KnockoutByGene.KnockoutIndividual individual : knockout.getIndividuals()) { + if (authorisedSampleIds.contains(individual.getSampleId())) { + individualList.add(individual); + } + } + knockout.setIndividuals(individualList); + } + + return knockoutResult; } public OpenCGAResult variantQuery(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - // TODO: Check Permissions + String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); - return rgaEngine.variantQuery(collection, query, options); + + Query auxQuery = query != null ? new Query(query) : new Query(); + + // 1st. we perform a facet to get the different variant ids matching the user query and using the skip and limit values + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS); + facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); + facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); + + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + + // 2. Check permissions + auxQuery.put(RgaDataModel.VARIANTS, variantIds); + // TODO: This should be done with Futures so it is done in parallel with step 4 (Also, this can be skipped if the user is admin) + result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID)); + List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + + // 3. Get list of sample ids for which the user has permissions + Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); + OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + Set authorisedSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + + // 4. Solr gene query + OpenCGAResult knockoutResult = rgaEngine.variantQuery(collection, auxQuery, options); + + // 5. Filter out individual or samples for which user does not have permissions + for (KnockoutByVariant knockout : knockoutResult.getResults()) { + List individualList = new ArrayList<>(knockout.getIndividuals().size()); + for (KnockoutByIndividual individual : knockout.getIndividuals()) { + if (authorisedSampleIds.contains(individual.getSampleId())) { + individualList.add(individual); + } + } + knockout.setIndividuals(individualList); + } + + return knockoutResult; } public void index(String studyStr, String fileStr, String token) throws CatalogException, RgaException, IOException { @@ -292,4 +448,13 @@ private String getCollectionName(String study) { public void close() throws Exception { rgaEngine.close(); } + + private Callable getNamedThread(String name, Callable c) { + String parentThreadName = Thread.currentThread().getName(); + return () -> { + Thread.currentThread().setName(parentThreadName + "-" + name); + return c.call(); + }; + } + } diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java new file mode 100644 index 00000000000..bb7af7f8245 --- /dev/null +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java @@ -0,0 +1,667 @@ +package org.opencb.opencga.clinical.rga; + +import org.apache.solr.client.solrj.SolrServerException; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.opencb.commons.datastore.core.DataResult; +import org.opencb.commons.datastore.core.FacetField; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.catalog.managers.CatalogManagerExternalResource; +import org.opencb.opencga.catalog.utils.ParamUtils; +import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.models.analysis.knockout.*; +import org.opencb.opencga.core.models.individual.Individual; +import org.opencb.opencga.core.models.individual.IndividualAclEntry; +import org.opencb.opencga.core.models.individual.IndividualAclParams; +import org.opencb.opencga.core.models.sample.Sample; +import org.opencb.opencga.core.models.sample.SampleAclEntry; +import org.opencb.opencga.core.models.sample.SampleAclParams; +import org.opencb.opencga.core.models.user.Account; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.storage.core.rga.*; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.Assert.*; +import static org.opencb.opencga.storage.core.rga.RgaUtilsTest.createKnockoutByIndividual; + +public class RgaManagerTest { + + private StorageConfiguration storageConfiguration; + + @Rule + public RgaSolrExtenalResource solr = new RgaSolrExtenalResource(); + + @Rule + public CatalogManagerExternalResource catalogManagerResource = new CatalogManagerExternalResource(); + + private CatalogManager catalogManager; + private RgaEngine rgaEngine; + private RgaManager rgaManager; + + private String ownerToken; + private String userToken; + private String study; + + @Before + public void before() throws IOException, CatalogException, RgaException, SolrServerException { + try (InputStream is = RgaEngineTest.class.getClassLoader().getResourceAsStream("storage-configuration.yml")) { + storageConfiguration = StorageConfiguration.load(is); + } + + catalogManager = catalogManagerResource.getCatalogManager(); + + rgaEngine = solr.configure(storageConfiguration); + rgaManager = new RgaManager(catalogManagerResource.getConfiguration(), storageConfiguration, rgaEngine); + + loadCatalog(); + loadSolr(); + } + + private void loadCatalog() throws CatalogException { + catalogManager.getUserManager().create("user", "User Name", "mail@ebi.ac.uk", "user", "", null, Account.AccountType.FULL, null); + ownerToken = catalogManager.getUserManager().login("user", "user").getToken(); + + catalogManager.getUserManager().create("user2", "User Name", "mail@ebi.ac.uk", "user", "", null, Account.AccountType.FULL, null); + userToken = catalogManager.getUserManager().login("user2", "user").getToken(); + + String projectId = catalogManager.getProjectManager().create("1000G", "Project about some genomes", "", "Homo sapiens", + null, "GRCh38", new QueryOptions(), ownerToken).first().getId(); + study = catalogManager.getStudyManager().create(projectId, "phase1", null, "Phase 1", "Done", null, null, null, null, null, ownerToken) + .first().getFqn(); + + catalogManager.getIndividualManager().create(study, + new Individual() + .setId("id1") + .setSamples(Collections.singletonList(new Sample().setId("sample1"))), + QueryOptions.empty(), ownerToken); + catalogManager.getIndividualManager().create(study, + new Individual() + .setId("id2") + .setSamples(Collections.singletonList(new Sample().setId("sample2"))), + QueryOptions.empty(), ownerToken); + } + + private void loadSolr() throws RgaException, IOException, SolrServerException { + String collection = getCollectionName(); + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + } + + private String getCollectionName() { + return catalogManager.getConfiguration().getDatabasePrefix() + "-rga-" + study.replace("@", "_").replace(":", "_"); + } + + @Test + public void testIndividualQueryPermissions() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.individualQuery(study, new Query(), QueryOptions.empty(), ownerToken); + assertEquals(2, result.getNumResults()); + + // Grant permissions to sample1 + catalogManager.getIndividualManager().updateAcl(study, Collections.emptyList(), "user2", new IndividualAclParams("sample1", + IndividualAclEntry.IndividualPermissions.VIEW.name()), ParamUtils.AclAction.ADD, false, ownerToken); + catalogManager.getSampleManager().updateAcl(study, Collections.singletonList("sample1"), "user2", new SampleAclParams("", "", "", "", + SampleAclEntry.SamplePermissions.VIEW.name() + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name()), + ParamUtils.AclAction.ADD, ownerToken); + result = rgaManager.individualQuery(study, new Query(), QueryOptions.empty(), userToken); + assertEquals(1, result.getNumResults()); + assertEquals("sample1", result.first().getSampleId()); + assertEquals("id1", result.first().getId()); + } + + @Test + public void testIndividualQueryLimit() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.individualQuery(study, new Query(), new QueryOptions(QueryOptions.LIMIT, 1), + ownerToken); + assertEquals(1, result.getNumResults()); + assertEquals("sample1", result.first().getSampleId()); + } + + @Test + public void testIndividualQuerySkip() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.individualQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1), + ownerToken); + assertEquals(1, result.getNumResults()); + assertEquals("sample2", result.first().getSampleId()); + } + + @Test + public void testGeneQueryPermissions() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.geneQuery(study, new Query(), QueryOptions.empty(), ownerToken); + assertEquals(4, result.getNumResults()); + for (KnockoutByGene gene : result.getResults()) { + assertEquals(1, gene.getIndividuals().size()); + } + + // Grant permissions to sample1 + catalogManager.getIndividualManager().updateAcl(study, Collections.emptyList(), "user2", new IndividualAclParams("sample1", + IndividualAclEntry.IndividualPermissions.VIEW.name()), ParamUtils.AclAction.ADD, false, ownerToken); + catalogManager.getSampleManager().updateAcl(study, Collections.singletonList("sample1"), "user2", new SampleAclParams("", "", "", "", + SampleAclEntry.SamplePermissions.VIEW.name() + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name()), + ParamUtils.AclAction.ADD, ownerToken); + result = rgaManager.geneQuery(study, new Query(), QueryOptions.empty(), userToken); + assertEquals(4, result.getNumResults()); + List genes = result.getResults().stream().filter(g -> !g.getIndividuals().isEmpty()).collect(Collectors.toList()); + assertEquals(2, genes.size()); + for (KnockoutByGene gene : genes) { + assertEquals(1, gene.getIndividuals().size()); + assertEquals("sample1", gene.getIndividuals().get(0).getSampleId()); + } + } + + @Test + public void testGeneQueryLimit() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.geneQuery(study, new Query(), new QueryOptions(QueryOptions.LIMIT, 1), + ownerToken); + assertEquals("geneId1", result.first().getId()); + assertEquals(1, result.getNumResults()); + assertEquals(1, result.first().getIndividuals().size()); + } + + @Test + public void testGeneQuerySkip() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.geneQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1), + ownerToken); + assertEquals(3, result.getNumResults()); + assertTrue(result.getResults().stream().map(KnockoutByGene::getId).collect(Collectors.toSet()) + .containsAll(Arrays.asList("geneId11", "geneId12", "geneId2"))); + for (KnockoutByGene gene : result.getResults()) { + assertEquals(1, gene.getIndividuals().size()); + } + } + + @Test + public void testVariantQueryPermissions() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.variantQuery(study, new Query(), QueryOptions.empty(), ownerToken); + assertEquals(6, result.getNumResults()); + assertEquals(4, result.getResults().stream().filter(v -> v.getIndividuals().size() == 2).count()); + assertEquals(2, result.getResults().stream().filter(v -> v.getIndividuals().size() == 1).count()); + + // Grant permissions to sample1 + catalogManager.getIndividualManager().updateAcl(study, Collections.emptyList(), "user2", new IndividualAclParams("sample1", + IndividualAclEntry.IndividualPermissions.VIEW.name()), ParamUtils.AclAction.ADD, false, ownerToken); + catalogManager.getSampleManager().updateAcl(study, Collections.singletonList("sample1"), "user2", new SampleAclParams("", "", "", "", + SampleAclEntry.SamplePermissions.VIEW.name() + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name()), + ParamUtils.AclAction.ADD, ownerToken); + result = rgaManager.variantQuery(study, new Query(), QueryOptions.empty(), userToken); + assertEquals(6, result.getNumResults()); + assertEquals(5, result.getResults().stream().filter(v -> v.getIndividuals().size() == 1).count()); + assertEquals(1, result.getResults().stream().filter(v -> v.getIndividuals().size() == 0).count()); + + for (KnockoutByVariant variant : result.getResults()) { + if (variant.getIndividuals().size() == 1) { + assertEquals("sample1", variant.getIndividuals().get(0).getSampleId()); + } + } + } + + @Test + public void testVariantQueryLimit() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.variantQuery(study, new Query(), new QueryOptions(QueryOptions.LIMIT, 1), + ownerToken); + assertEquals("variant2", result.first().getId()); + assertEquals(1, result.getNumResults()); + assertEquals(2, result.first().getIndividuals().size()); + } + + @Test + public void testVariantQuerySkip() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.variantQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1), + ownerToken); + assertEquals(5, result.getNumResults()); + assertTrue(result.getResults().stream().map(KnockoutByVariant::getId).collect(Collectors.toSet()) + .containsAll(Arrays.asList("variant1", "variant3", "variant13", "variant12", "variant11"))); + assertEquals(3, result.getResults().stream().filter(v -> v.getIndividuals().size() == 2).count()); + assertEquals(2, result.getResults().stream().filter(v -> v.getIndividuals().size() == 1).count()); + + result = rgaManager.variantQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1).append(QueryOptions.LIMIT, 2), + ownerToken); + assertEquals(2, result.getNumResults()); + assertTrue(result.getResults().stream().map(KnockoutByVariant::getId).collect(Collectors.toSet()) + .containsAll(Arrays.asList("variant1", "variant3"))); + for (KnockoutByVariant variant : result.getResults()) { + assertEquals(2, variant.getIndividuals().size()); + } + } + + @Test + public void testIndividualQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); + + assertEquals(2, result.getNumResults()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertEquals(JacksonUtils.getDefaultObjectMapper().writeValueAsString(knockoutByIndividualList.get(i)), + JacksonUtils.getDefaultObjectMapper().writeValueAsString(result.getResults().get(i))); + } + + result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); + assertEquals(2, result.getNumResults()); + + Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(1, result.getNumResults()); + assertEquals("id1", result.first().getId()); + + query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(1, result.getNumResults()); + assertEquals("id2", result.first().getId()); + + query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(0, result.getNumResults()); + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(0, result.getNumResults()); + + query = new Query() + .append(RgaQueryParams.DISORDERS.key(), "disorderId1") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(1, result.getNumResults()); + + query = new Query() + .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(1, result.getNumResults()); + } + + @Test + public void testIncludeExcludeIndividualQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + + QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name")); + OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), options); + assertEquals(2, result.getNumResults()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertNotNull(result.getResults().get(i).getId()); + assertTrue(result.getResults().get(i).getPhenotypes().isEmpty()); + assertNotNull(result.getResults().get(i).getSampleId()); + assertNotNull(result.getResults().get(i).getDisorders()); + assertNotNull(result.getResults().get(i).getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { + assertNotNull(gene.getId()); + assertNotNull(gene.getName()); + assertNull(gene.getStrand()); + assertTrue(gene.getTranscripts().isEmpty()); + } + } + + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", + "genesMap.transcriptsMap.variants")); + result = rgaEngine.individualQuery(collection, new Query(), options); + assertEquals(2, result.getNumResults()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertNotNull(result.getResults().get(i).getId()); + assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); + assertNull(result.getResults().get(i).getSampleId()); + assertTrue(result.getResults().get(i).getDisorders().isEmpty()); + assertNotNull(result.getResults().get(i).getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + for (KnockoutTranscript transcript : gene.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNotNull(transcript.getBiotype()); + assertTrue(transcript.getVariants().isEmpty()); + } + } + } + + // It should be not possible to completely exclude knockoutType without excluding the whole variant information + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", + "genesMap.transcriptsMap.variants.knockoutType")); + result = rgaEngine.individualQuery(collection, new Query(), options); + assertEquals(2, result.getNumResults()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertNotNull(result.getResults().get(i).getId()); + assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); + assertNull(result.getResults().get(i).getSampleId()); + assertTrue(result.getResults().get(i).getDisorders().isEmpty()); + assertNotNull(result.getResults().get(i).getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + for (KnockoutTranscript transcript : gene.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNotNull(transcript.getBiotype()); + assertFalse(transcript.getVariants().isEmpty()); + for (KnockoutVariant variant : transcript.getVariants()) { + assertNotNull(variant.getId()); + assertNotNull(variant.getKnockoutType()); + assertFalse(variant.getPopulationFrequencies().isEmpty()); + } + } + } + } + + } + + @Test + public void testGeneQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), new QueryOptions()); + + assertEquals(4, result.getNumResults()); + for (KnockoutByGene resultResult : result.getResults()) { + assertEquals(1, resultResult.getIndividuals().size()); + assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") + || resultResult.getIndividuals().get(0).getId().equals("id2")); + } + + Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + for (KnockoutByGene resultResult : result.getResults()) { + assertEquals(1, resultResult.getIndividuals().size()); + assertEquals("id1", resultResult.getIndividuals().get(0).getId()); + } + + query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + for (KnockoutByGene resultResult : result.getResults()) { + assertEquals(1, resultResult.getIndividuals().size()); + assertEquals("id2", resultResult.getIndividuals().get(0).getId()); + } + + query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(0, result.getNumResults()); + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(4, result.getNumResults()); + for (KnockoutByGene resultResult : result.getResults()) { + assertEquals(1, resultResult.getIndividuals().size()); + assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") + || resultResult.getIndividuals().get(0).getId().equals("id2")); + } + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(0, result.getNumResults()); + + query = new Query() + .append(RgaQueryParams.DISORDERS.key(), "disorderId1") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + + query = new Query() + .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + } + + @Test + public void testIncludeExcludeGeneQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + + QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome")); + OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), options); + assertEquals(4, result.getNumResults()); + for (KnockoutByGene gene : result.getResults()) { + assertNotNull(gene.getId()); + assertNotNull(gene.getName()); + assertNull(gene.getBiotype()); + for (KnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { + assertNotNull(individual.getId()); + assertNull(individual.getSampleId()); + for (KnockoutTranscript transcript : individual.getTranscripts()) { + assertNotNull(transcript.getId()); +// assertNotNull(transcript.getChromosome()); + assertNull(transcript.getBiotype()); + assertTrue(transcript.getVariants().isEmpty()); + } + } + } + + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", + "individuals.transcriptsMap.variants")); + result = rgaEngine.geneQuery(collection, new Query(), options); + assertEquals(4, result.getNumResults()); + for (KnockoutByGene gene : result.getResults()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getBiotype()); + for (KnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { + assertNotNull(individual.getId()); + assertNotNull(individual.getSampleId()); + for (KnockoutTranscript transcript : individual.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNull(transcript.getChromosome()); + assertNotNull(transcript.getBiotype()); + assertTrue(transcript.getVariants().isEmpty()); + } + } + } + + // It should be not possible to completely exclude knockoutType without excluding the whole variant information + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", + "individuals.transcriptsMap.variants.knockoutType")); + result = rgaEngine.geneQuery(collection, new Query(), options); + assertEquals(4, result.getNumResults()); + for (KnockoutByGene gene : result.getResults()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getBiotype()); + for (KnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { + assertNotNull(individual.getId()); + assertNotNull(individual.getSampleId()); + for (KnockoutTranscript transcript : individual.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNull(transcript.getChromosome()); + assertNotNull(transcript.getBiotype()); + assertFalse(transcript.getVariants().isEmpty()); + for (KnockoutVariant variant : transcript.getVariants()) { + assertNotNull(variant.getId()); + assertNotNull(variant.getKnockoutType()); + assertFalse(variant.getPopulationFrequencies().isEmpty()); + } + } + } + } + } + + @Test + public void testVariantQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), new QueryOptions()); + + assertEquals(6, result.getNumResults()); + } + + @Test + public void testIncludeExcludeVariantQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + + QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", + "individuals.genesMap.name")); + OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), options); + assertEquals(6, result.getNumResults()); + for (KnockoutByVariant variant : result.getResults()) { + assertNotNull(variant.getId()); + for (KnockoutByIndividual individual : variant.getIndividuals()) { + assertNotNull(individual.getId()); + assertTrue(individual.getPhenotypes().isEmpty()); + assertNotNull(individual.getSampleId()); + assertNotNull(individual.getDisorders()); + assertNotNull(individual.getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { + assertNotNull(gene.getId()); + assertNotNull(gene.getName()); + assertNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + } + + } + } + + // Not possible excluding variants object because that's basic for this data model + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", + "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants")); + result = rgaEngine.variantQuery(collection, new Query(), options); + assertEquals(6, result.getNumResults()); + for (KnockoutByVariant variant : result.getResults()) { + assertNotNull(variant.getId()); + for (KnockoutByIndividual individual : variant.getIndividuals()) { + assertNotNull(individual.getId()); + assertFalse(individual.getPhenotypes().isEmpty()); + assertNull(individual.getSampleId()); + assertTrue(individual.getDisorders().isEmpty()); + assertNotNull(individual.getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + for (KnockoutTranscript transcript : gene.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNotNull(transcript.getBiotype()); + assertFalse(transcript.getVariants().isEmpty()); + } + + } + } + } + + // It should be not possible to completely exclude knockoutType without excluding the whole variant information + options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", + "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants.knockoutType")); + result = rgaEngine.variantQuery(collection, new Query(), options); + assertEquals(6, result.getNumResults()); + for (KnockoutByVariant variant : result.getResults()) { + assertNotNull(variant.getId()); + for (KnockoutByIndividual individual : variant.getIndividuals()) { + assertNotNull(individual.getId()); + assertFalse(individual.getPhenotypes().isEmpty()); + assertNull(individual.getSampleId()); + assertTrue(individual.getDisorders().isEmpty()); + assertNotNull(individual.getGenes()); + for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { + assertNotNull(gene.getId()); + assertNull(gene.getName()); +// assertNotNull(gene.getStrand()); + assertFalse(gene.getTranscripts().isEmpty()); + for (KnockoutTranscript transcript : gene.getTranscripts()) { + assertNotNull(transcript.getId()); + assertNotNull(transcript.getBiotype()); + assertFalse(transcript.getVariants().isEmpty()); + for (KnockoutVariant tmpVariant : transcript.getVariants()) { + assertNotNull(tmpVariant.getId()); + assertNotNull(tmpVariant.getKnockoutType()); + assertFalse(tmpVariant.getPopulationFrequencies().isEmpty()); + } + } + } + } + } + + } + + + @Test + public void testFacet() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + + QueryOptions options = new QueryOptions(QueryOptions.FACET, RgaQueryParams.DISORDERS.key()); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, new Query(), options); + assertEquals(1, facetFieldDataResult.getNumResults()); + assertEquals(RgaDataModel.DISORDERS, facetFieldDataResult.first().getName()); + assertEquals(4, facetFieldDataResult.first().getBuckets().size()); + } + +} \ No newline at end of file diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 9c642c244a4..aaafed6693f 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -26,7 +26,6 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.clinical.ClinicalInterpretationManager; import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; -import org.opencb.opencga.analysis.clinical.rga.RgaManager; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.CancerTieringInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.TieringInterpretationAnalysis; @@ -39,6 +38,7 @@ import org.opencb.opencga.catalog.managers.InterpretationManager; import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.catalog.utils.ParamUtils; +import org.opencb.opencga.clinical.rga.RgaManager; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.VersionException; import org.opencb.opencga.core.models.AclParams; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index d1155727631..f0c6ae74403 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -138,7 +138,7 @@ public void insert(String collection, List knockoutByIndiv */ public OpenCGAResult individualQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { - SolrQuery solrQuery = fixQuery(collection, query, queryOptions); + SolrQuery solrQuery = parser.parseQuery(query); fixIndividualOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); @@ -191,6 +191,7 @@ private void fixVariantOptions(QueryOptions queryOptions, SolrQuery solrQuery) { } } + @Deprecated private SolrQuery fixQuery(String collection, Query query, QueryOptions queryOptions) throws IOException, RgaException { int limit = queryOptions.getInt(QueryOptions.LIMIT); int skip = queryOptions.getInt(QueryOptions.SKIP); diff --git a/pom.xml b/pom.xml index 0766e0091ac..1121820315f 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,7 @@ opencga-storage opencga-client opencga-server + opencga-clinical From 9cc2cdb44d61018c7eb18dd6d5d24de17f60f9ef Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 1 Mar 2021 14:48:05 +0100 Subject: [PATCH 043/412] clinical: improve performance for admins, #1693 --- .../opencga/clinical/rga/RgaManager.java | 168 +++++++++--------- 1 file changed, 83 insertions(+), 85 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 06f10528adf..2cb0148249b 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -72,6 +72,7 @@ public OpenCGAResult individualQuery(String studyStr, Quer String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); + Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); if (!auxQuery.containsKey("sampleId") && !auxQuery.containsKey("individualId")) { @@ -87,31 +88,40 @@ public OpenCGAResult individualQuery(String studyStr, Quer } // From the list of sample ids the user wants to retrieve data from, we filter those for which the user has permissions - Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); - if (auxQuery.containsKey("individualId")) { - sampleQuery.put(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), auxQuery.get("individualId")); - } else { - sampleQuery.put(SampleDBAdaptor.QueryParams.ID.key(), auxQuery.get("sampleId")); + Query sampleQuery = new Query(); + if (!isOwnerOrAdmin) { + sampleQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); } + List samples; + if (!isOwnerOrAdmin || !auxQuery.containsKey("sampleId")) { + if (auxQuery.containsKey("individualId")) { + sampleQuery.put(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), auxQuery.get("individualId")); + } else { + sampleQuery.put(SampleDBAdaptor.QueryParams.ID.key(), auxQuery.get("sampleId")); + } - OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); - if (authorisedSampleIdResult.getNumResults() == 0) { - return OpenCGAResult.empty(KnockoutByIndividual.class); + OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + if (authorisedSampleIdResult.getNumResults() == 0) { + return OpenCGAResult.empty(KnockoutByIndividual.class); + } + samples = (List) authorisedSampleIdResult.getResults(); + } else { + samples = auxQuery.getAsStringList("sampleId"); } int limit = options.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); int skip = options.getInt(QueryOptions.SKIP); List sampleIds; - if (skip == 0 && limit > authorisedSampleIdResult.getNumResults()) { - sampleIds = (List) authorisedSampleIdResult.getResults(); - } else if (skip > authorisedSampleIdResult.getNumResults()) { + if (skip == 0 && limit > samples.size()) { + sampleIds = samples; + } else if (skip > samples.size()) { return OpenCGAResult.empty(KnockoutByIndividual.class); } else { - int to = Math.min(authorisedSampleIdResult.getNumResults(), skip + limit); - sampleIds = (List) authorisedSampleIdResult.getResults().subList(skip, to); + int to = Math.min(samples.size(), skip + limit); + sampleIds = samples.subList(skip, to); } auxQuery.put("sampleId", sampleIds); @@ -124,6 +134,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Que String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); + Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); // 1st. we perform a facet to get the different gene ids matching the user query and using the skip and limit values @@ -133,60 +144,41 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Que DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); List geneIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - -// ExecutorService threadPool = Executors.newFixedThreadPool(2); -// List> futureList = new ArrayList<>(2); -// futureList.add(threadPool.submit(getNamedThread("Authorised sample ids", -// () -> { -// System.out.println("hello"); -// return true; -// }))); -// futureList.add(threadPool.submit(getNamedThread("Solr Gene query", -// () -> { -// return true; -// }))); -// threadPool.shutdown(); -// -// try { -// threadPool.awaitTermination(20, TimeUnit.SECONDS); -// if (!threadPool.isTerminated()) { -// for (Future future : futureList) { -// future.cancel(true); -// } -// } -// } catch (InterruptedException e) { -// throw new RgaException("Error launching threads when executing gene query analysis", e); -// } - - // 2. Check permissions auxQuery.put(RgaDataModel.GENE_ID, geneIds); - // TODO: This should be done with Futures so it is done in parallel with step 4 (Also, this can be skipped if the user is admin) - result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID)); - List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - - // 3. Get list of sample ids for which the user has permissions - Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) - .append(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); - OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); - Set authorisedSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + + Set authorisedSampleIds = Collections.emptySet(); + if (!isOwnerOrAdmin) { + // 2. Check permissions + result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID)); + List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + + // 3. Get list of sample ids for which the user has permissions + Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); + OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + authorisedSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + } // 4. Solr gene query OpenCGAResult knockoutResult = rgaEngine.geneQuery(collection, auxQuery, options); - - // 5. Filter out individual or samples for which user does not have permissions - for (KnockoutByGene knockout : knockoutResult.getResults()) { - List individualList = new ArrayList<>(knockout.getIndividuals().size()); - for (KnockoutByGene.KnockoutIndividual individual : knockout.getIndividuals()) { - if (authorisedSampleIds.contains(individual.getSampleId())) { - individualList.add(individual); + if (isOwnerOrAdmin) { + return knockoutResult; + } else { + // 5. Filter out individual or samples for which user does not have permissions + for (KnockoutByGene knockout : knockoutResult.getResults()) { + List individualList = new ArrayList<>(knockout.getIndividuals().size()); + for (KnockoutByGene.KnockoutIndividual individual : knockout.getIndividuals()) { + if (authorisedSampleIds.contains(individual.getSampleId())) { + individualList.add(individual); + } } + knockout.setIndividuals(individualList); } - knockout.setIndividuals(individualList); - } - return knockoutResult; + return knockoutResult; + } } public OpenCGAResult variantQuery(String studyStr, Query query, QueryOptions options, String token) @@ -195,6 +187,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); + Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); // 1st. we perform a facet to get the different variant ids matching the user query and using the skip and limit values @@ -204,36 +197,41 @@ public OpenCGAResult variantQuery(String studyStr, Query quer DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - - // 2. Check permissions auxQuery.put(RgaDataModel.VARIANTS, variantIds); - // TODO: This should be done with Futures so it is done in parallel with step 4 (Also, this can be skipped if the user is admin) - result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID)); - List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - - // 3. Get list of sample ids for which the user has permissions - Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) - .append(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); - OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); - Set authorisedSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + + Set authorisedSampleIds = Collections.emptySet(); + if (!isOwnerOrAdmin) { + // 2. Check permissions + result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID)); + List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + + // 3. Get list of sample ids for which the user has permissions + Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); + OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + authorisedSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + } // 4. Solr gene query OpenCGAResult knockoutResult = rgaEngine.variantQuery(collection, auxQuery, options); - - // 5. Filter out individual or samples for which user does not have permissions - for (KnockoutByVariant knockout : knockoutResult.getResults()) { - List individualList = new ArrayList<>(knockout.getIndividuals().size()); - for (KnockoutByIndividual individual : knockout.getIndividuals()) { - if (authorisedSampleIds.contains(individual.getSampleId())) { - individualList.add(individual); + if (isOwnerOrAdmin) { + return knockoutResult; + } else { + // 5. Filter out individual or samples for which user does not have permissions + for (KnockoutByVariant knockout : knockoutResult.getResults()) { + List individualList = new ArrayList<>(knockout.getIndividuals().size()); + for (KnockoutByIndividual individual : knockout.getIndividuals()) { + if (authorisedSampleIds.contains(individual.getSampleId())) { + individualList.add(individual); + } } + knockout.setIndividuals(individualList); } - knockout.setIndividuals(individualList); - } - return knockoutResult; + return knockoutResult; + } } public void index(String studyStr, String fileStr, String token) throws CatalogException, RgaException, IOException { From 7e4b9292423595cc9213021c4313e14d3e19ab45 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 1 Mar 2021 15:16:35 +0100 Subject: [PATCH 044/412] clinical: remove repeated tests, #1693 --- .../opencga/clinical/rga/RgaManagerTest.java | 437 +----------------- .../storage/core/rga/RgaEngineTest.java | 29 -- 2 files changed, 8 insertions(+), 458 deletions(-) diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java index bb7af7f8245..6e53577ce02 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java @@ -4,16 +4,15 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.opencb.commons.datastore.core.DataResult; -import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.managers.CatalogManagerExternalResource; import org.opencb.opencga.catalog.utils.ParamUtils; -import org.opencb.opencga.core.common.JacksonUtils; -import org.opencb.opencga.core.models.analysis.knockout.*; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.individual.IndividualAclEntry; import org.opencb.opencga.core.models.individual.IndividualAclParams; @@ -24,7 +23,9 @@ import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.RgaException; -import org.opencb.opencga.storage.core.rga.*; +import org.opencb.opencga.storage.core.rga.RgaEngine; +import org.opencb.opencga.storage.core.rga.RgaEngineTest; +import org.opencb.opencga.storage.core.rga.RgaSolrExtenalResource; import java.io.IOException; import java.io.InputStream; @@ -34,7 +35,8 @@ import java.util.List; import java.util.stream.Collectors; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.opencb.opencga.storage.core.rga.RgaUtilsTest.createKnockoutByIndividual; public class RgaManagerTest { @@ -241,427 +243,4 @@ public void testVariantQuerySkip() throws CatalogException, IOException, RgaExce } } - @Test - public void testIndividualQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); - OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); - - assertEquals(2, result.getNumResults()); - for (int i = 0; i < knockoutByIndividualList.size(); i++) { - assertEquals(JacksonUtils.getDefaultObjectMapper().writeValueAsString(knockoutByIndividualList.get(i)), - JacksonUtils.getDefaultObjectMapper().writeValueAsString(result.getResults().get(i))); - } - - result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); - assertEquals(2, result.getNumResults()); - - Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(1, result.getNumResults()); - assertEquals("id1", result.first().getId()); - - query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(1, result.getNumResults()); - assertEquals("id2", result.first().getId()); - - query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(0, result.getNumResults()); - - query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - - query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(0, result.getNumResults()); - - query = new Query() - .append(RgaQueryParams.DISORDERS.key(), "disorderId1") - .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(1, result.getNumResults()); - - query = new Query() - .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") - .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(1, result.getNumResults()); - } - - @Test - public void testIncludeExcludeIndividualQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); - - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name")); - OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), options); - assertEquals(2, result.getNumResults()); - for (int i = 0; i < knockoutByIndividualList.size(); i++) { - assertNotNull(result.getResults().get(i).getId()); - assertTrue(result.getResults().get(i).getPhenotypes().isEmpty()); - assertNotNull(result.getResults().get(i).getSampleId()); - assertNotNull(result.getResults().get(i).getDisorders()); - assertNotNull(result.getResults().get(i).getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { - assertNotNull(gene.getId()); - assertNotNull(gene.getName()); - assertNull(gene.getStrand()); - assertTrue(gene.getTranscripts().isEmpty()); - } - } - - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", - "genesMap.transcriptsMap.variants")); - result = rgaEngine.individualQuery(collection, new Query(), options); - assertEquals(2, result.getNumResults()); - for (int i = 0; i < knockoutByIndividualList.size(); i++) { - assertNotNull(result.getResults().get(i).getId()); - assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); - assertNull(result.getResults().get(i).getSampleId()); - assertTrue(result.getResults().get(i).getDisorders().isEmpty()); - assertNotNull(result.getResults().get(i).getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - for (KnockoutTranscript transcript : gene.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNotNull(transcript.getBiotype()); - assertTrue(transcript.getVariants().isEmpty()); - } - } - } - - // It should be not possible to completely exclude knockoutType without excluding the whole variant information - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", - "genesMap.transcriptsMap.variants.knockoutType")); - result = rgaEngine.individualQuery(collection, new Query(), options); - assertEquals(2, result.getNumResults()); - for (int i = 0; i < knockoutByIndividualList.size(); i++) { - assertNotNull(result.getResults().get(i).getId()); - assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); - assertNull(result.getResults().get(i).getSampleId()); - assertTrue(result.getResults().get(i).getDisorders().isEmpty()); - assertNotNull(result.getResults().get(i).getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - for (KnockoutTranscript transcript : gene.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNotNull(transcript.getBiotype()); - assertFalse(transcript.getVariants().isEmpty()); - for (KnockoutVariant variant : transcript.getVariants()) { - assertNotNull(variant.getId()); - assertNotNull(variant.getKnockoutType()); - assertFalse(variant.getPopulationFrequencies().isEmpty()); - } - } - } - } - - } - - @Test - public void testGeneQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); - OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), new QueryOptions()); - - assertEquals(4, result.getNumResults()); - for (KnockoutByGene resultResult : result.getResults()) { - assertEquals(1, resultResult.getIndividuals().size()); - assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") - || resultResult.getIndividuals().get(0).getId().equals("id2")); - } - - Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - for (KnockoutByGene resultResult : result.getResults()) { - assertEquals(1, resultResult.getIndividuals().size()); - assertEquals("id1", resultResult.getIndividuals().get(0).getId()); - } - - query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - for (KnockoutByGene resultResult : result.getResults()) { - assertEquals(1, resultResult.getIndividuals().size()); - assertEquals("id2", resultResult.getIndividuals().get(0).getId()); - } - - query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(0, result.getNumResults()); - - query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(4, result.getNumResults()); - for (KnockoutByGene resultResult : result.getResults()) { - assertEquals(1, resultResult.getIndividuals().size()); - assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") - || resultResult.getIndividuals().get(0).getId().equals("id2")); - } - - query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(0, result.getNumResults()); - - query = new Query() - .append(RgaQueryParams.DISORDERS.key(), "disorderId1") - .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - - query = new Query() - .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") - .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - } - - @Test - public void testIncludeExcludeGeneQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); - - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome")); - OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), options); - assertEquals(4, result.getNumResults()); - for (KnockoutByGene gene : result.getResults()) { - assertNotNull(gene.getId()); - assertNotNull(gene.getName()); - assertNull(gene.getBiotype()); - for (KnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { - assertNotNull(individual.getId()); - assertNull(individual.getSampleId()); - for (KnockoutTranscript transcript : individual.getTranscripts()) { - assertNotNull(transcript.getId()); -// assertNotNull(transcript.getChromosome()); - assertNull(transcript.getBiotype()); - assertTrue(transcript.getVariants().isEmpty()); - } - } - } - - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", - "individuals.transcriptsMap.variants")); - result = rgaEngine.geneQuery(collection, new Query(), options); - assertEquals(4, result.getNumResults()); - for (KnockoutByGene gene : result.getResults()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getBiotype()); - for (KnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { - assertNotNull(individual.getId()); - assertNotNull(individual.getSampleId()); - for (KnockoutTranscript transcript : individual.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNull(transcript.getChromosome()); - assertNotNull(transcript.getBiotype()); - assertTrue(transcript.getVariants().isEmpty()); - } - } - } - - // It should be not possible to completely exclude knockoutType without excluding the whole variant information - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", - "individuals.transcriptsMap.variants.knockoutType")); - result = rgaEngine.geneQuery(collection, new Query(), options); - assertEquals(4, result.getNumResults()); - for (KnockoutByGene gene : result.getResults()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getBiotype()); - for (KnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { - assertNotNull(individual.getId()); - assertNotNull(individual.getSampleId()); - for (KnockoutTranscript transcript : individual.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNull(transcript.getChromosome()); - assertNotNull(transcript.getBiotype()); - assertFalse(transcript.getVariants().isEmpty()); - for (KnockoutVariant variant : transcript.getVariants()) { - assertNotNull(variant.getId()); - assertNotNull(variant.getKnockoutType()); - assertFalse(variant.getPopulationFrequencies().isEmpty()); - } - } - } - } - } - - @Test - public void testVariantQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); - OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), new QueryOptions()); - - assertEquals(6, result.getNumResults()); - } - - @Test - public void testIncludeExcludeVariantQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); - - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", - "individuals.genesMap.name")); - OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), options); - assertEquals(6, result.getNumResults()); - for (KnockoutByVariant variant : result.getResults()) { - assertNotNull(variant.getId()); - for (KnockoutByIndividual individual : variant.getIndividuals()) { - assertNotNull(individual.getId()); - assertTrue(individual.getPhenotypes().isEmpty()); - assertNotNull(individual.getSampleId()); - assertNotNull(individual.getDisorders()); - assertNotNull(individual.getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { - assertNotNull(gene.getId()); - assertNotNull(gene.getName()); - assertNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - } - - } - } - - // Not possible excluding variants object because that's basic for this data model - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", - "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants")); - result = rgaEngine.variantQuery(collection, new Query(), options); - assertEquals(6, result.getNumResults()); - for (KnockoutByVariant variant : result.getResults()) { - assertNotNull(variant.getId()); - for (KnockoutByIndividual individual : variant.getIndividuals()) { - assertNotNull(individual.getId()); - assertFalse(individual.getPhenotypes().isEmpty()); - assertNull(individual.getSampleId()); - assertTrue(individual.getDisorders().isEmpty()); - assertNotNull(individual.getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - for (KnockoutTranscript transcript : gene.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNotNull(transcript.getBiotype()); - assertFalse(transcript.getVariants().isEmpty()); - } - - } - } - } - - // It should be not possible to completely exclude knockoutType without excluding the whole variant information - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", - "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants.knockoutType")); - result = rgaEngine.variantQuery(collection, new Query(), options); - assertEquals(6, result.getNumResults()); - for (KnockoutByVariant variant : result.getResults()) { - assertNotNull(variant.getId()); - for (KnockoutByIndividual individual : variant.getIndividuals()) { - assertNotNull(individual.getId()); - assertFalse(individual.getPhenotypes().isEmpty()); - assertNull(individual.getSampleId()); - assertTrue(individual.getDisorders().isEmpty()); - assertNotNull(individual.getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - for (KnockoutTranscript transcript : gene.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNotNull(transcript.getBiotype()); - assertFalse(transcript.getVariants().isEmpty()); - for (KnockoutVariant tmpVariant : transcript.getVariants()) { - assertNotNull(tmpVariant.getId()); - assertNotNull(tmpVariant.getKnockoutType()); - assertFalse(tmpVariant.getPopulationFrequencies().isEmpty()); - } - } - } - } - } - - } - - - @Test - public void testFacet() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); - - QueryOptions options = new QueryOptions(QueryOptions.FACET, RgaQueryParams.DISORDERS.key()); - DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, new Query(), options); - assertEquals(1, facetFieldDataResult.getNumResults()); - assertEquals(RgaDataModel.DISORDERS, facetFieldDataResult.first().getName()); - assertEquals(4, facetFieldDataResult.first().getBuckets().size()); - } - } \ No newline at end of file diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java index d070082a5b9..b582fa48d5f 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java @@ -178,35 +178,6 @@ public void testIncludeExcludeIndividualQuery() throws Exception { } - @Test - public void testLimitAndSkip() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); - OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); - - assertEquals(2, result.getNumResults()); - for (int i = 0; i < knockoutByIndividualList.size(); i++) { - assertEquals(JacksonUtils.getDefaultObjectMapper().writeValueAsString(knockoutByIndividualList.get(i)), - JacksonUtils.getDefaultObjectMapper().writeValueAsString(result.getResults().get(i))); - } - - result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions(QueryOptions.LIMIT, 1)); - assertEquals(1, result.getNumResults()); - String individualId = result.first().getId(); - - result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions(QueryOptions.LIMIT, 1).append(QueryOptions.SKIP, 1)); - assertEquals(1, result.getNumResults()); - assertNotEquals(individualId, result.first().getId()); - } - @Test public void testGeneQuery() throws Exception { RgaEngine rgaEngine = solr.configure(storageConfiguration); From 2fa9b017b9a30ef7740b06f1a045735e8c2916df Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 1 Mar 2021 15:31:39 +0100 Subject: [PATCH 045/412] clinical: remove permission integration in solr, #1693 --- .../opencga/clinical/rga/RgaManager.java | 146 +----------------- .../opencga/clinical/rga/RgaManagerTest.java | 2 +- .../core/rga/IndividualRgaConverter.java | 19 +-- .../storage/core/rga/RgaDataModel.java | 30 +--- .../opencga/storage/core/rga/RgaEngine.java | 10 +- .../src/main/resources/rga/managed-schema | 2 - .../storage/core/rga/RgaEngineTest.java | 15 +- 7 files changed, 19 insertions(+), 205 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 2cb0148249b..acd837b512b 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -9,20 +9,17 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.CollectionUtils; -import org.opencb.opencga.catalog.db.api.DBAdaptor; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; -import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.catalog.managers.*; +import org.opencb.opencga.catalog.managers.AbstractManager; +import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.catalog.managers.FileManager; import org.opencb.opencga.clinical.StorageManager; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.file.File; -import org.opencb.opencga.core.models.individual.Individual; -import org.opencb.opencga.core.models.individual.IndividualAclEntry; -import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; @@ -40,7 +37,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; -import java.util.concurrent.Callable; import java.util.stream.Collectors; import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; @@ -279,8 +275,6 @@ private void load(String study, Path path, String token) throws IOException, Rga // This opens json and json.gz files automatically try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( ioConnectorProvider.newInputStream(path.toUri())))) { - Map> grantedPermissionMemberList = new HashMap<>(); - Map> deniedPermissionMemberList = new HashMap<>(); List knockoutByIndividualList = new ArrayList<>(KNOCKOUT_INSERT_BATCH_SIZE); int count = 0; @@ -291,9 +285,7 @@ private void load(String study, Path path, String token) throws IOException, Rga knockoutByIndividualList.add(knockoutByIndividual); count++; if (count % KNOCKOUT_INSERT_BATCH_SIZE == 0) { - checkMemberPermissions(knockoutByIndividualList, grantedPermissionMemberList, deniedPermissionMemberList, study, - token); - rgaEngine.insert(collection, knockoutByIndividualList, grantedPermissionMemberList, deniedPermissionMemberList); + rgaEngine.insert(collection, knockoutByIndividualList); logger.debug("Loaded {} knockoutByIndividual entries from '{}'", count, path); knockoutByIndividualList.clear(); } @@ -301,9 +293,7 @@ private void load(String study, Path path, String token) throws IOException, Rga // Insert the remaining entries if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { - checkMemberPermissions(knockoutByIndividualList, grantedPermissionMemberList, deniedPermissionMemberList, study, - token); - rgaEngine.insert(collection, knockoutByIndividualList, grantedPermissionMemberList, deniedPermissionMemberList); + rgaEngine.insert(collection, knockoutByIndividualList); logger.debug("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); } } @@ -315,124 +305,6 @@ private void load(String study, Path path, String token) throws IOException, Rga } } - /** - * Check VIEW_SAMPLE, VIEW_VARIANT and VIEW_INDIVIDUAL permissions for each individual/sample of the KnockoutByIndividual objects. - * If a member has all 3 permissions, it will be added to the grantedPermissionMemberList. - * If a member has some permissions set but missing any of the 3, it will be added to the deniedPermissionMemberList. - * - * @param knockoutByIndividualList List of KnockoutByIndividual objects. - * @param grantedPermissionMemberList Map containing the list of members for which permissions are satisfied. - * @param deniedPermissionMemberList Map containing the list of members for which permissions are revoked. - * @param study Study id. - * @param token Must be a valid 'opencga' administrator token. - * @throws RgaException if there is any problem retrieving the list of permissions from Catalog. - */ - private void checkMemberPermissions(List knockoutByIndividualList, - Map> grantedPermissionMemberList, - Map> deniedPermissionMemberList, String study, String token) - throws RgaException { - // Fetch all individual and sample ids - List individualIds = new ArrayList<>(knockoutByIndividualList.size()); - List sampleIds = new ArrayList<>(knockoutByIndividualList.size()); - for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividualList) { - individualIds.add(knockoutByIndividual.getId()); - sampleIds.add(knockoutByIndividual.getSampleId()); - } - - // Retrieve permissions for each individual/sample - QueryOptions options = new QueryOptions(SampleManager.INCLUDE_SAMPLE_IDS) - .append(DBAdaptor.INCLUDE_ACLS, true); - OpenCGAResult sampleResult; - try { - sampleResult = catalogManager.getSampleManager().get(study, sampleIds, options, token); - } catch (CatalogAuthorizationException e) { - throw new RgaException("Missing permissions to retrieve list of sample permissions", e.getCause()); - } catch (CatalogException e) { - throw new RgaException("Some samples were not found in catalog", e.getCause()); - } - - options = new QueryOptions(IndividualManager.INCLUDE_INDIVIDUAL_IDS) - .append(DBAdaptor.INCLUDE_ACLS, true); - OpenCGAResult individualResult; - try { - individualResult = catalogManager.getIndividualManager().get(study, individualIds, options, token); - } catch (CatalogAuthorizationException e) { - throw new RgaException("Missing permissions to retrieve list of individual permissions", e.getCause()); - } catch (CatalogException e) { - throw new RgaException("Some individuals were not found in catalog", e.getCause()); - } - - // Set that will contain all member ids that were granted specific permissions - Set memberIds = new HashSet<>(); - - // Generate a map permissions>> - Map>> samplePermissions = new HashMap<>(); - Map>> individualPermissions = new HashMap<>(); - - for (Sample sample : sampleResult.getResults()) { - generateIntermediatePermissionMap(sample.getId(), sample.getAttributes(), samplePermissions, memberIds); - } - for (Individual individual : individualResult.getResults()) { - generateIntermediatePermissionMap(individual.getId(), individual.getAttributes(), individualPermissions, memberIds); - } - - if (!memberIds.isEmpty()) { - // Check permissions - for (int i = 0; i < individualIds.size(); i++) { - String individualId = individualIds.get(i); - String sampleId = sampleIds.get(i); - - Map> auxSamplePermissions = samplePermissions.get(sampleId); - Map> auxIndividualPermissions = individualPermissions.get(individualId); - for (String memberId : memberIds) { - Set individualAcls = auxIndividualPermissions.get(memberId); - Set sampleAcls = auxSamplePermissions.get(memberId); - - if (individualAcls != null && sampleAcls != null) { - // Only grant permissions at the document level if it has been granted all 3 permissions - if (individualAcls.contains(IndividualAclEntry.IndividualPermissions.VIEW.name()) - && sampleAcls.contains(SampleAclEntry.SamplePermissions.VIEW.name()) - && sampleAcls.contains(SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name())) { - addMemberToAclList(individualId, memberId, grantedPermissionMemberList); - } else { - addMemberToAclList(individualId, memberId, deniedPermissionMemberList); - } - } else if (individualAcls != null) { - // If VIEW_INDIVIDUAL permission is not granted, we will add this member to the list of revoked users - if (!individualAcls.contains(IndividualAclEntry.IndividualPermissions.VIEW.name())) { - addMemberToAclList(individualId, memberId, deniedPermissionMemberList); - } - } else if (sampleAcls != null) { - // If VIEW_SAMPLE or VIEW_VARIANTS permissions are not granted, we will add this member to the list of revoked users - if (!sampleAcls.contains(SampleAclEntry.SamplePermissions.VIEW.name()) - || !sampleAcls.contains(SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name())) { - addMemberToAclList(individualId, memberId, deniedPermissionMemberList); - } - } - } - } - } - } - - private void addMemberToAclList(String entryId, String memberId, Map> entryMemberListMap) { - if (!entryMemberListMap.containsKey(entryId)) { - entryMemberListMap.put(entryId, new LinkedList<>()); - } - entryMemberListMap.get(entryId).add(memberId); - } - - private void generateIntermediatePermissionMap(String id, Map attributes, - Map>> permissionMap, Set memberIds) { - Map> permissions = new HashMap<>(); - List> aclEntries = (List>) attributes.get("OPENCGA_ACL"); - for (Map entry : aclEntries) { - String memberId = (String) entry.get("member"); - permissions.put(memberId, new HashSet<>((List) entry.get("permissions"))); - memberIds.add(memberId); - } - permissionMap.put(id, permissions); - } - @Override public void testConnection() throws StorageEngineException { rgaEngine.isAlive("test"); @@ -447,12 +319,4 @@ public void close() throws Exception { rgaEngine.close(); } - private Callable getNamedThread(String name, Callable c) { - String parentThreadName = Thread.currentThread().getName(); - return () -> { - Thread.currentThread().setName(parentThreadName + "-" + name); - return c.call(); - }; - } - } diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java index 6e53577ce02..a57268b72cf 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java @@ -104,7 +104,7 @@ private void loadSolr() throws RgaException, IOException, SolrServerException { knockoutByIndividualList.add(createKnockoutByIndividual(1)); knockoutByIndividualList.add(createKnockoutByIndividual(2)); - rgaEngine.insert(collection, knockoutByIndividualList, Collections.emptyMap(), Collections.emptyMap()); + rgaEngine.insert(collection, knockoutByIndividualList); } private String getCollectionName() { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index addb9d0dbb1..343c79fb4c7 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -164,20 +164,11 @@ public List convertToDataModelType(List rgaD return knockoutByIndividualList; } - @Override public List convertToStorageType(List knockoutByIndividualList) { - throw new UnsupportedOperationException("Must call to overloaded method passing map of permissions"); - } - - public List convertToStorageType(List knockoutByIndividualList, - Map> grantedPermissionMemberList, - Map> deniedPermissionMemberList) { List result = new LinkedList<>(); for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividualList) { - String id = knockoutByIndividual.getId(); try { - result.addAll(convertToStorageType(knockoutByIndividual, grantedPermissionMemberList.get(id), - deniedPermissionMemberList.get(id))); + result.addAll(convertToStorageType(knockoutByIndividual)); } catch (RgaException | JsonProcessingException e) { logger.warn("Could not parse KnockoutByIndividualList: {}", e.getMessage(), e); } @@ -185,14 +176,10 @@ public List convertToStorageType(List knocko return result; } - private List convertToStorageType(KnockoutByIndividual knockoutByIndividual, List authorisedMembers, - List unauthorisedMembers) + private List convertToStorageType(KnockoutByIndividual knockoutByIndividual) throws RgaException, JsonProcessingException { List result = new LinkedList<>(); - List authorisedList = authorisedMembers != null ? authorisedMembers : Collections.emptyList(); - List unauthorisedList = unauthorisedMembers != null ? unauthorisedMembers : Collections.emptyList(); - if (knockoutByIndividual.getGenes() != null) { for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { for (KnockoutTranscript transcript : gene.getTranscripts()) { @@ -237,7 +224,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI RgaDataModel model = new RgaDataModel(id, individualId, knockoutByIndividual.getSampleId(), knockoutByIndividual.getSex().name(), phenotypes, disorders, gene.getId(), gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, knockoutTypes, filters, consequenceTypes, popFreqs, - compoundFilters, phenotypeJson, disorderJson, variantJson, authorisedList, unauthorisedList); + compoundFilters, phenotypeJson, disorderJson, variantJson); result.add(model); } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java index 6df15d8692a..48c287ee39a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java @@ -79,12 +79,6 @@ public class RgaDataModel { @Field private List variantJson; - @Field - private List authorised; - - @Field - private List unauthorised; - public static final String ID = "id"; public static final String INDIVIDUAL_ID = "individualId"; public static final String SAMPLE_ID = "sampleId"; @@ -119,8 +113,7 @@ public RgaDataModel(String id, String individualId, String sampleId, String sex, String geneId, String geneName, String geneBiotype, String chromosome, String strand, int start, int end, String transcriptId, String transcriptBiotype, List variants, List knockoutTypes, List filters, List consequenceTypes, Map> populationFrequencies, - List compoundFilters, List phenotypeJson, List disorderJson, List variantJson, - List authorised, List unauthorised) { + List compoundFilters, List phenotypeJson, List disorderJson, List variantJson) { this.id = id; this.individualId = individualId; this.sampleId = sampleId; @@ -145,8 +138,6 @@ public RgaDataModel(String id, String individualId, String sampleId, String sex, this.phenotypeJson = phenotypeJson; this.disorderJson = disorderJson; this.variantJson = variantJson; - this.authorised = authorised; - this.unauthorised = unauthorised; } @Override @@ -176,8 +167,6 @@ public String toString() { sb.append(", phenotypeJson=").append(phenotypeJson); sb.append(", disorderJson=").append(disorderJson); sb.append(", variantJson=").append(variantJson); - sb.append(", authorised=").append(authorised); - sb.append(", unauthorised=").append(unauthorised); sb.append('}'); return sb.toString(); } @@ -398,21 +387,4 @@ public RgaDataModel setVariantJson(List variantJson) { return this; } - public List getAuthorised() { - return authorised; - } - - public RgaDataModel setAuthorised(List authorised) { - this.authorised = authorised; - return this; - } - - public List getUnauthorised() { - return unauthorised; - } - - public RgaDataModel setUnauthorised(List unauthorised) { - this.unauthorised = unauthorised; - return this; - } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index f0c6ae74403..cc81fd10eaf 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -25,7 +25,6 @@ import java.io.Closeable; import java.io.IOException; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; public class RgaEngine implements Closeable { @@ -104,17 +103,12 @@ public boolean existsCollection(String collectionName) throws RgaException { * * @param collection Solr collection where to insert * @param knockoutByIndividualList List of knockoutByIndividual to insert - * @param grantedPermissionMemberList Map containing the list of members for which permissions are satisfied. - * @param deniedPermissionMemberList Map containing the list of members for which permissions are revoked. * @throws IOException IOException * @throws SolrServerException SolrServerException */ - public void insert(String collection, List knockoutByIndividualList, - Map> grantedPermissionMemberList, Map> deniedPermissionMemberList) - throws IOException, SolrServerException { + public void insert(String collection, List knockoutByIndividualList) throws IOException, SolrServerException { if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { - List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList, - grantedPermissionMemberList, deniedPermissionMemberList); + List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); if (!rgaDataModelList.isEmpty()) { UpdateResponse updateResponse; diff --git a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema index 2417593ac56..0a144c034ad 100644 --- a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema +++ b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema @@ -590,8 +590,6 @@ - - Mix PASS and other filters. Can not use index } } - if (filterPassCovered && !partialFilesIndex) { - query.remove(FILTER.key()); - } - RangeQuery qualQuery = null; if (isValidParam(query, QUAL)) { - String qualValue = query.getString(QUAL.key()); - List qualValues = VariantQueryUtils.splitValues(qualValue).getValues(); - if (qualValues.size() == 1) { - - fileIndexMask |= VariantFileIndexConverter.QUAL_MASK; - - OpValue opValue = parseOpValue(qualValue); - double value = Double.parseDouble(opValue.getValue()); - qualQuery = getRangeQuery(opValue.getOp(), value, SampleIndexConfiguration.QUAL_THRESHOLDS, 0, IndexUtils.MAX); - - if (qualQuery.isExactQuery() && !partialFilesIndex) { + IndexField qualIndexField = configuration.getFileIndex() + .getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL); + if (qualIndexField != null) { + OpValue opValue = parseOpValue(query.getString(QUAL.key())); + IndexFieldFilter indexFieldFilter = qualIndexField.buildFilter(opValue); + filtersList.add(indexFieldFilter); + if (indexFieldFilter.isExactFilter() && !partialFilesIndex) { query.remove(QUAL.key()); } } } boolean fileDataCovered = true; - RangeQuery dpQuery = null; if (isValidParam(query, FILE_DATA)) { //ParsedQuery>> ParsedQuery>> parsedQuery = parseFileData(query); @@ -725,42 +699,17 @@ protected SampleFileIndexQuery parseFileQuery(Query query, String sample, boolea continue; } for (KeyOpValue keyOpValue : keyValues.getValues()) { - if (keyOpValue.getKey().equals(VCFConstants.DEPTH_KEY)) { - String op = keyOpValue.getOp(); - double dpValue = Double.parseDouble(keyOpValue.getValue()); - dpQuery = getRangeQuery(op, dpValue, SampleIndexConfiguration.DP_THRESHOLDS, 0, IndexUtils.MAX); - fileIndexMask |= VariantFileIndexConverter.DP_MASK; - if (!dpQuery.isExactQuery()) { - fileDataCovered = false; - } - } else if (keyOpValue.getKey().equals(StudyEntry.FILTER)) { - if (keyOpValue.getValue().equals(VCFConstants.PASSES_FILTERS_v4)) { - filterPass = true; - fileIndexMask |= VariantFileIndexConverter.FILTER_PASS_MASK; - } else { - // Only covered when filtering by PASS - fileDataCovered = false; - Values filterValues = splitValues(keyOpValue.getValue()); - if (!filterValues.contains(VCFConstants.PASSES_FILTERS_v4)) { - if (filterValues.getValues().stream().noneMatch(VariantQueryUtils::isNegated)) { - // None negated filter, without PASS - filterPass = false; - fileIndexMask |= VariantFileIndexConverter.FILTER_PASS_MASK; - } - } // else --> Mix PASS and other filters. Can not use index - } - } else if (keyOpValue.getKey().equals(StudyEntry.QUAL)) { - fileIndexMask |= VariantFileIndexConverter.QUAL_MASK; - - double value = Double.parseDouble(keyOpValue.getValue()); - qualQuery = getRangeQuery(keyOpValue.getOp(), value, - SampleIndexConfiguration.QUAL_THRESHOLDS, 0, IndexUtils.MAX); - if (!qualQuery.isExactQuery()) { - fileDataCovered = false; - } - } else { + IndexField fileDataIndexField = configuration.getFileIndex() + .getCustomField(IndexFieldConfiguration.Source.FILE, keyOpValue.getKey()); + if (fileDataIndexField == null) { // Unknown key fileDataCovered = false; + } else { + IndexFieldFilter indexFieldFilter = fileDataIndexField.buildFilter(keyOpValue); + filtersList.add(indexFieldFilter); + if (!indexFieldFilter.isExactFilter()) { + fileDataCovered = false; + } } } } @@ -779,15 +728,13 @@ protected SampleFileIndexQuery parseFileQuery(Query query, String sample, boolea if (!sampleDataFilter.isEmpty() && sampleDataOp != QueryOperation.OR) { for (KeyOpValue keyOpValue : sampleDataFilter) { - if (keyOpValue.getKey().equals(VCFConstants.DEPTH_KEY)) { - String op = keyOpValue.getOp(); - double dpValue = Double.parseDouble(keyOpValue.getValue()); - dpQuery = getRangeQuery(op, dpValue, SampleIndexConfiguration.DP_THRESHOLDS, 0, IndexUtils.MAX); - fileIndexMask |= VariantFileIndexConverter.DP_MASK; - if (dpQuery.isExactQuery() && !partialFilesIndex) { - if (sampleDataFilter.size() == 1) { - sampleDataQuery.getValues().remove(sampleDataFilter); - } + IndexField sampleDataIndexField = configuration.getFileIndex() + .getCustomField(IndexFieldConfiguration.Source.SAMPLE, keyOpValue.getKey()); + if (sampleDataIndexField != null) { + IndexFieldFilter indexFieldFilter = sampleDataIndexField.buildFilter(keyOpValue); + filtersList.add(indexFieldFilter); + if (indexFieldFilter.isExactFilter() && !partialFilesIndex) { + sampleDataQuery.getValues().remove(sampleDataFilter); } } } @@ -801,53 +748,9 @@ protected SampleFileIndexQuery parseFileQuery(Query query, String sample, boolea } } - // Build validFileIndex array - boolean[] validFileIndex1 = new boolean[1 << Byte.SIZE]; - boolean[] validFileIndex2 = new boolean[1 << Byte.SIZE]; - - if (fileIndexMask != IndexUtils.EMPTY_MASK) { - boolean hasFileIndexMask1 = IndexUtils.getByte1(fileIndexMask) != IndexUtils.EMPTY_MASK; - boolean hasFileIndexMask2 = IndexUtils.getByte2(fileIndexMask) != IndexUtils.EMPTY_MASK; - int qualMin = qualQuery == null ? 0 : qualQuery.getMinCodeInclusive(); - int qualMax = qualQuery == null ? 1 : qualQuery.getMaxCodeExclusive(); - int dpMin = dpQuery == null ? 0 : dpQuery.getMinCodeInclusive(); - int dpMax = dpQuery == null ? 1 : dpQuery.getMaxCodeExclusive(); - if (typeCodes.isEmpty()) { - typeCodes = Collections.singleton(0); - } - if (sampleFilesFilter.isEmpty()) { - sampleFilesFilter = Collections.singletonList(null); - } - for (Integer typeCode : typeCodes) { - for (Integer fileId : sampleFilesFilter) { - for (int q = qualMin; q < qualMax; q++) { - for (int dp = dpMin; dp < dpMax; dp++) { - - int validFile = 0; - if (filterPass) { - validFile |= VariantFileIndexConverter.FILTER_PASS_MASK; - } - - if (fileId != null) { - validFile |= fileId << VariantFileIndexConverter.FILE_POSITION_SHIFT; - } - validFile |= typeCode << VariantFileIndexConverter.TYPE_SHIFT; - validFile |= q << VariantFileIndexConverter.QUAL_SHIFT; - validFile |= dp << VariantFileIndexConverter.DP_SHIFT; - - if (hasFileIndexMask1) { - validFileIndex1[IndexUtils.getByte1(validFile)] = true; - } - if (hasFileIndexMask2) { - validFileIndex2[IndexUtils.getByte2(validFile)] = true; - } - } - } - } - } - } + filtersList.removeIf(f -> f instanceof NoOpIndexFieldFilter); - return new SampleFileIndexQuery(sample, fileIndexMask, qualQuery, dpQuery, validFileIndex1, validFileIndex2); + return new SampleFileIndexQuery(sample, filtersList); } private boolean hasCopyNumberGainFilter(List types) { @@ -1100,7 +1003,7 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool if (populationRange.getStudyAndPopulation().equals(studyPop)) { populationInSampleIndex = true; RangeQuery rangeQuery = getRangeQuery(keyOpValue.getOp(), freqFilter, populationRange.getThresholds(), - 0, 1 + IndexUtils.DELTA); + 0, 1 + RangeIndexFieldFilter.DELTA); popFreqQuery.add(new PopulationFrequencyQuery(rangeQuery, popFreqIdx, populationRange.getStudy(), @@ -1188,26 +1091,26 @@ private boolean simpleCombination(BiotypeConsquenceTypeFlagCombination combinati || combination.equals(BiotypeConsquenceTypeFlagCombination.CT); } - protected RangeQuery getRangeQuery(String op, double value, double[] thresholds) { - return getRangeQuery(op, value, thresholds, Double.MIN_VALUE, Double.MAX_VALUE); - } - + @Deprecated protected RangeQuery getRangeQuery(String op, double value, double[] thresholds, double min, double max) { - double[] range = IndexUtils.queryRange(op, value, min, max); + double[] range = RangeIndexFieldFilter.queryRange(op, value, min, max); return getRangeQuery(range, thresholds, min, max); } + @Deprecated private RangeQuery getRangeQuery(double[] range, double[] thresholds, double min, double max) { - byte[] rangeCode = IndexUtils.getRangeCodes(range, thresholds); + byte[] rangeCode = RangeIndexFieldFilter.getRangeCodes(range, thresholds); boolean exactQuery; if (rangeCode[0] == 0) { if (rangeCode[1] - 1 == thresholds.length) { - exactQuery = IndexUtils.equalsTo(range[0], min) && IndexUtils.equalsTo(range[1], max); + exactQuery = RangeIndexFieldFilter.equalsTo(range[0], min) && RangeIndexFieldFilter.equalsTo(range[1], max); } else { - exactQuery = IndexUtils.equalsTo(range[1], thresholds[rangeCode[1] - 1]) && IndexUtils.equalsTo(range[0], min); + exactQuery = RangeIndexFieldFilter.equalsTo(range[1], thresholds[rangeCode[1] - 1]) + && RangeIndexFieldFilter.equalsTo(range[0], min); } } else if (rangeCode[1] - 1 == thresholds.length) { - exactQuery = IndexUtils.equalsTo(range[0], thresholds[rangeCode[0] - 1]) && IndexUtils.equalsTo(range[1], max); + exactQuery = RangeIndexFieldFilter.equalsTo(range[0], thresholds[rangeCode[0] - 1]) + && RangeIndexFieldFilter.equalsTo(range[1], max); } else { exactQuery = false; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java index 8d1a44a03ac..c694f24c156 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java @@ -5,9 +5,9 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.schema.types.PVarchar; import org.opencb.biodata.models.variant.Variant; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.io.bit.BitInputStream; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory; -import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; @@ -16,7 +16,6 @@ import java.util.*; import static org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema.isGenotypeColumn; -import static org.opencb.opencga.storage.hadoop.variant.index.sample.VariantFileIndexConverter.MULTI_FILE_MASK; /** * Created on 11/04/19. @@ -165,19 +164,21 @@ public SampleIndexEntryIterator toVariantsCountIterator(SampleIndexEntry entry, private abstract static class SampleIndexGtEntryIterator implements SampleIndexEntryIterator { protected SampleIndexEntry.SampleIndexGtEntry gtEntry; - private SampleIndexConfiguration configuration; + private final SampleIndexConfiguration configuration; private BitInputStream popFreq; private BitInputStream ctBtIndex; private int nonIntergenicCount; private int clinicalCount; + private BitInputStream fileIndex; private int fileIndexCount; // Number of fileIndex elements visited private int fileIndexIdx; // Index over file index array. Index of last visited fileIndex // Reuse the annotation index entry. Avoid create a new instance for each variant. private final AnnotationIndexEntry annotationIndexEntry; private int annotationIndexEntryIdx; + private int fileDataIndexesBitsLength; - SampleIndexGtEntryIterator() { + SampleIndexGtEntryIterator(SampleIndexConfiguration configuration) { nonIntergenicCount = 0; clinicalCount = 0; annotationIndexEntry = new AnnotationIndexEntry(); @@ -185,10 +186,12 @@ private abstract static class SampleIndexGtEntryIterator implements SampleIndexE annotationIndexEntryIdx = -1; fileIndexIdx = 0; fileIndexCount = 0; + this.configuration = configuration; + fileDataIndexesBitsLength = configuration.getFileIndex().getBitsLength(); } SampleIndexGtEntryIterator(SampleIndexEntry.SampleIndexGtEntry gtEntry, SampleIndexConfiguration configuration) { - this(); + this(configuration); this.gtEntry = gtEntry; this.ctBtIndex = gtEntry.getCtBtIndex() == null ? null @@ -198,7 +201,11 @@ private abstract static class SampleIndexGtEntryIterator implements SampleIndexE : new BitInputStream(gtEntry.getPopulationFrequencyIndex(), gtEntry.getPopulationFrequencyIndexOffset(), gtEntry.getPopulationFrequencyIndexLength()); - this.configuration = configuration; + this.fileIndex = gtEntry.getFileIndex() == null + ? null + : new BitInputStream(gtEntry.getFileIndex(), + gtEntry.getFileIndexOffset(), + gtEntry.getFileIndexLength()); } @Override @@ -213,20 +220,19 @@ public boolean hasFileIndex() { @Override public boolean isMultiFileIndex() { - short fileIndex = gtEntry.getFileIndex(nextFileIndex()); - return isMultiFileIndex(fileIndex); + return isMultiFileIndex(nextFileIndex()); } - public boolean isMultiFileIndex(short fileIndex) { - return IndexUtils.testIndexAny(fileIndex, MULTI_FILE_MASK); + public boolean isMultiFileIndex(int i) { +// configuration.getFileIndex().getMultiFileIndex().readAndDecode() + return FileIndex.isMultiFile(fileIndex, i * fileDataIndexesBitsLength); } private int nextFileIndex() { while (nextIndex() != fileIndexCount) { // Move index fileIndexIdx++; - short prevFileIndex = gtEntry.getFileIndex(fileIndexIdx - 1); - if (!isMultiFileIndex(prevFileIndex)) { + if (!isMultiFileIndex(fileIndexIdx - 1)) { // If the previous fileIndex was not multifile, move counter fileIndexCount++; } @@ -235,12 +241,12 @@ private int nextFileIndex() { } @Override - public short nextFileIndexEntry() { - return gtEntry.getFileIndex(nextFileIndex()); + public BitBuffer nextFileIndexEntry() { + return getFileIndex(nextFileIndex()); } @Override - public short nextMultiFileIndexEntry() { + public BitBuffer nextMultiFileIndexEntry() { if (isMultiFileIndex()) { fileIndexIdx++; return nextFileIndexEntry(); @@ -249,6 +255,10 @@ public short nextMultiFileIndexEntry() { } } + private BitBuffer getFileIndex(int i) { + return fileIndex.getBitBuffer(i * fileDataIndexesBitsLength, fileDataIndexesBitsLength); + } + @Override public boolean hasParentsIndex() { return gtEntry.getParentsIndex() != null; @@ -411,7 +421,7 @@ public boolean hasFileIndex() { } @Override - public short nextFileIndexEntry() { + public BitBuffer nextFileIndexEntry() { throw new NoSuchElementException("Empty iterator"); } @@ -421,7 +431,7 @@ public boolean isMultiFileIndex() { } @Override - public short nextMultiFileIndexEntry() { + public BitBuffer nextMultiFileIndexEntry() { throw new NoSuchElementException("Empty iterator"); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java index da5302eca80..4707b043ed6 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java @@ -3,31 +3,31 @@ import org.apache.commons.collections4.CollectionUtils; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAvro; -import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; import java.util.Objects; import static org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema.INTRA_CHROMOSOME_VARIANT_COMPARATOR; -import static org.opencb.opencga.storage.hadoop.variant.index.sample.VariantFileIndexConverter.MULTI_FILE_MASK; +import static org.opencb.opencga.storage.hadoop.variant.index.sample.FileIndex.isMultiFile; public class SampleVariantIndexEntry implements Comparable { private final Variant variant; private final String genotype; - private final short fileIndex; + private final BitBuffer fileIndex; private final AnnotationIndexEntry annotationIndexEntry; private final Integer meCode; - public SampleVariantIndexEntry(Variant variant, short fileIndex) { + public SampleVariantIndexEntry(Variant variant, BitBuffer fileIndex) { this(variant, fileIndex, null, null); } - public SampleVariantIndexEntry(Variant variant, short fileIndex, String genotype, AnnotationIndexEntry annotationIndexEntry) { + public SampleVariantIndexEntry(Variant variant, BitBuffer fileIndex, String genotype, AnnotationIndexEntry annotationIndexEntry) { this(variant, fileIndex, genotype, annotationIndexEntry, null); } - public SampleVariantIndexEntry(Variant variant, short fileIndex, String genotype, AnnotationIndexEntry annotationIndexEntry, + public SampleVariantIndexEntry(Variant variant, BitBuffer fileIndex, String genotype, AnnotationIndexEntry annotationIndexEntry, Integer meCode) { if (CollectionUtils.isEmpty(variant.getImpl().getStudies())) { this.variant = variant; @@ -56,7 +56,7 @@ public Variant getVariant() { return variant; } - public short getFileIndex() { + public BitBuffer getFileIndex() { return fileIndex; } @@ -76,12 +76,12 @@ public AnnotationIndexEntry getAnnotationIndexEntry() { public int compareTo(SampleVariantIndexEntry o) { int compare = INTRA_CHROMOSOME_VARIANT_COMPARATOR.compare(variant, o.variant); if (compare == 0) { - if (IndexUtils.testIndexAny(fileIndex, MULTI_FILE_MASK)) { + if (isMultiFile(fileIndex)) { return -1; - } else if (IndexUtils.testIndexAny(o.fileIndex, MULTI_FILE_MASK)) { + } else if (isMultiFile(o.fileIndex)) { return 1; } else { - return Short.compare(fileIndex, o.fileIndex); + return fileIndex.compareTo(o.fileIndex); } } return compare; @@ -96,7 +96,7 @@ public boolean equals(Object o) { return false; } SampleVariantIndexEntry that = (SampleVariantIndexEntry) o; - return fileIndex == that.fileIndex && Objects.equals(variant, that.variant); + return fileIndex.equals(that.fileIndex) && Objects.equals(variant, that.variant); } @Override diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java index cdd58774768..66a2357bd87 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java @@ -2,62 +2,24 @@ import htsjdk.variant.vcf.VCFConstants; import org.apache.commons.lang3.StringUtils; -import org.apache.hadoop.hbase.util.Bytes; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.FileEntry; import org.opencb.biodata.models.variant.avro.VariantType; -import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; +import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; +import org.opencb.opencga.storage.hadoop.variant.index.core.IndexFieldConfiguration; +import java.util.List; import java.util.Map; public class VariantFileIndexConverter { - public static final int FILE_POSITION_SIZE = 4; - public static final int FILE_IDX_MAX = 1 << FILE_POSITION_SIZE; - public static final int TYPE_SIZE = 3; - public static final int QUAL_SIZE = 2; - public static final int DP_SIZE = 3; - - public static final int FILE_POSITION_SHIFT = 1; - public static final int TYPE_SHIFT = FILE_POSITION_SHIFT + FILE_POSITION_SIZE; - public static final int FILTER_PASS_SHIFT = TYPE_SHIFT + TYPE_SIZE; - public static final int QUAL_SHIFT = FILTER_PASS_SHIFT + 1; - public static final int DP_SHIFT = QUAL_SHIFT + QUAL_SIZE; - - public static final short MULTI_FILE_MASK = (short) (1 << 0); - public static final short FILE_POSITION_1_MASK = (short) (1 << FILE_POSITION_SHIFT + 0); - public static final short FILE_POSITION_2_MASK = (short) (1 << FILE_POSITION_SHIFT + 1); - public static final short FILE_POSITION_3_MASK = (short) (1 << FILE_POSITION_SHIFT + 2); - public static final short FILE_POSITION_4_MASK = (short) (1 << FILE_POSITION_SHIFT + 3); - public static final short TYPE_1_MASK = (short) (1 << TYPE_SHIFT); - public static final short TYPE_2_MASK = (short) (1 << TYPE_SHIFT + 1); - public static final short TYPE_3_MASK = (short) (1 << TYPE_SHIFT + 2); - public static final short FILTER_PASS_MASK = (short) (1 << FILTER_PASS_SHIFT); - public static final short QUAL_1_MASK = (short) (1 << QUAL_SHIFT); - public static final short QUAL_2_MASK = (short) (1 << QUAL_SHIFT + 1); - public static final short DP_1_MASK = (short) (1 << DP_SHIFT); - public static final short DP_2_MASK = (short) (1 << DP_SHIFT + 1); - public static final short DP_3_MASK = (short) (1 << DP_SHIFT + 2); -// public static final short DISCREPANCY_MASK = (short) (1 << DP_SHIFT+DP_SIZE); - - public static final short FILE_IDX_MASK = (short) (FILE_POSITION_1_MASK | FILE_POSITION_2_MASK - | FILE_POSITION_3_MASK | FILE_POSITION_4_MASK); - public static final short TYPE_MASK = (short) (TYPE_1_MASK | TYPE_2_MASK | TYPE_3_MASK); - public static final short QUAL_MASK = (short) (QUAL_1_MASK | QUAL_2_MASK); - public static final short DP_MASK = (short) (DP_1_MASK | DP_2_MASK | DP_3_MASK); - - public static final int TYPE_SNV_CODE = 0; - public static final int TYPE_INDEL_CODE = 1; - public static final int TYPE_MNV_CODE = 2; - public static final int TYPE_INS_CODE = 3; - public static final int TYPE_DEL_CODE = 4; - public static final int TYPE_CNV_CODE = 5; - public static final int TYPE_REAR_CODE = 6; - public static final int TYPE_OTHER_CODE = 7; - - public static final int BYTES = Short.BYTES; + private final FileIndex fileIndex; + public VariantFileIndexConverter(SampleIndexConfiguration configuration) { + fileIndex = configuration.getFileIndex(); + } /** * Create the FileIndex value for this specific sample and variant. @@ -67,72 +29,59 @@ public class VariantFileIndexConverter { * @param variant Full variant. * @return 16 bits of file index. */ - public short createFileIndexValue(int sampleIdx, int filePosition, Variant variant) { + public BitBuffer createFileIndexValue(int sampleIdx, int filePosition, Variant variant) { // Expecting only one study and only one file StudyEntry study = variant.getStudies().get(0); FileEntry file = study.getFiles().get(0); - Integer dpIdx = study.getSampleDataKeyPosition(VCFConstants.DEPTH_KEY); - String dpStr; - if (dpIdx != null) { - dpStr = study.getSampleData(sampleIdx).get(dpIdx); - } else { - dpStr = null; - } + return createFileIndexValue(variant.getType(), filePosition, file.getData(), + study.getSampleDataKeyPositions(), study.getSampleData(sampleIdx)); + } - return createFileIndexValue(variant.getType(), filePosition, file.getData(), dpStr); + @Deprecated + public BitBuffer createFileIndexValue(VariantType type, int filePosition, Map fileAttributes, String dpStr) { + throw new UnsupportedOperationException("Deprecated method"); } /** * Create the FileIndex value for this specific sample and variant. * * @param type Variant type - * @param filePosition In case of having multiple files for the same sample, the cardinal value of the load order of the file. + * @param filePosition In case of having multiple files for the same sample, the cardinal value of the load order of the file. * @param fileAttributes File attributes - * @param dpStr DP in String format. - * @return 16 bits of file index. + * @param sampleDataKeyPositions Sample data key positions + * @param sampleData Sample data values + * @return BitBuffer of file index. */ - public short createFileIndexValue(VariantType type, int filePosition, Map fileAttributes, String dpStr) { - short fileIndex = 0; - - if (filePosition > FILE_IDX_MAX) { - throw new IllegalArgumentException("Error converting filePosition. Unable to load more than 16 files for the same sample."); - } - fileIndex |= filePosition << FILE_POSITION_SHIFT; - - String filter = fileAttributes.get(StudyEntry.FILTER); - if (VCFConstants.PASSES_FILTERS_v4.equals(filter)) { - fileIndex |= FILTER_PASS_MASK; + public BitBuffer createFileIndexValue(VariantType type, int filePosition, Map fileAttributes, + Map sampleDataKeyPositions, List sampleData) { + BitBuffer bitBuffer = new BitBuffer(fileIndex.getBitsLength()); + +// setMultiFile(bos, false); + fileIndex.getFilePositionIndex().write(filePosition, bitBuffer); + fileIndex.getTypeIndex().write(type, bitBuffer); + + for (IndexField fileDataIndexField : fileIndex.getCustomFields()) { + String key = fileDataIndexField.getKey(); + String value; + if (fileDataIndexField.getSource().equals(IndexFieldConfiguration.Source.FILE)) { + value = fileAttributes.get(key); + } else if (fileDataIndexField.getSource().equals(IndexFieldConfiguration.Source.SAMPLE)) { + Integer position = sampleDataKeyPositions.get(key); + if (position == null) { + value = null; + } else { + value = sampleData.get(position); + } + } else { + throw new IllegalArgumentException("Unable to build file index with index source " + + fileDataIndexField.getSource() + + " for index " + + fileDataIndexField.getId()); + } + fileDataIndexField.write(value, bitBuffer); } - - fileIndex |= getTypeCode(type) << TYPE_SHIFT; - - double qual = getQual(fileAttributes); - byte qualCode = IndexUtils.getRangeCode(qual, SampleIndexConfiguration.QUAL_THRESHOLDS); - fileIndex |= qualCode << QUAL_SHIFT; - - int dp = getDp(fileAttributes, dpStr); - byte dpCode = IndexUtils.getRangeCode(dp, SampleIndexConfiguration.DP_THRESHOLDS); - fileIndex |= dpCode << DP_SHIFT; - - return fileIndex; - } - - public static boolean isMultiFile(short fileIndex) { - return IndexUtils.testIndexAny(fileIndex, MULTI_FILE_MASK); - } - - public static short setMultiFile(short fileIndex) { - return (short) (fileIndex | MULTI_FILE_MASK); - } - - public static void setMultiFile(byte[] bytes, int offset) { - // TODO: Could be improved - Bytes.putShort(bytes, offset, setMultiFile(Bytes.toShort(bytes, offset))); - } - - public static short setFilePosition(short fileIndex, int filePosition) { - return ((short) (fileIndex | filePosition << FILE_POSITION_SHIFT)); + return bitBuffer; } private int getDp(Map fileAttributes, String dpStr) { @@ -163,37 +112,4 @@ private double getQual(Map fileAttributes) { return qual; } - public static int getTypeCode(VariantType type) { - switch (type) { - case SNV: - case SNP: - return TYPE_SNV_CODE; - case INDEL: - return TYPE_INDEL_CODE; - case MNP: - case MNV: - return TYPE_MNV_CODE; - case INSERTION: - return TYPE_INS_CODE; - case DELETION: - return TYPE_DEL_CODE; - case CNV: - case COPY_NUMBER: - case COPY_NUMBER_GAIN: - case COPY_NUMBER_LOSS: - return TYPE_CNV_CODE; - case BREAKEND: - return TYPE_REAR_CODE; - case SV: - case TRANSLOCATION: - case INVERSION: - case DUPLICATION: - case NO_VARIATION: - case SYMBOLIC: - case MIXED: - default: - return TYPE_OTHER_CODE; - } - } - } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantTypeIndexCodec.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantTypeIndexCodec.java new file mode 100644 index 00000000000..25b5ba1e273 --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantTypeIndexCodec.java @@ -0,0 +1,66 @@ +package org.opencb.opencga.storage.hadoop.variant.index.sample; + +import org.opencb.biodata.models.variant.avro.VariantType; +import org.opencb.opencga.storage.hadoop.variant.index.core.IndexCodec; + +public class VariantTypeIndexCodec implements IndexCodec { + public static final int TYPE_NUM_VALUES = 8; + + public static final int TYPE_SNV_CODE = 0; + public static final int TYPE_INDEL_CODE = 1; + public static final int TYPE_MNV_CODE = 2; + public static final int TYPE_INS_CODE = 3; + public static final int TYPE_DEL_CODE = 4; + public static final int TYPE_CNV_CODE = 5; + public static final int TYPE_REAR_CODE = 6; + public static final int TYPE_OTHER_CODE = 7; + + public static int getTypeCode(VariantType type) { + switch (type) { + case SNV: + case SNP: + return TYPE_SNV_CODE; + case INDEL: + return TYPE_INDEL_CODE; + case MNP: + case MNV: + return TYPE_MNV_CODE; + case INSERTION: + return TYPE_INS_CODE; + case DELETION: + return TYPE_DEL_CODE; + case CNV: + case COPY_NUMBER: + case COPY_NUMBER_GAIN: + case COPY_NUMBER_LOSS: + return TYPE_CNV_CODE; + case BREAKEND: + return TYPE_REAR_CODE; + case SV: + case TRANSLOCATION: + case INVERSION: + case DUPLICATION: + case NO_VARIATION: + case SYMBOLIC: + case MIXED: + default: + return TYPE_OTHER_CODE; + } + } + + @Override + public int encode(VariantType value) { + return getTypeCode(value); + } + + @Override + public VariantType decode(int code) { + // TODO + return null; + } + + @Override + public boolean ambiguous(int code) { + return code == TYPE_OTHER_CODE || code == TYPE_CNV_CODE; + } +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtilsTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtilsTest.java index 0a233e6f016..aa042c68f49 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtilsTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtilsTest.java @@ -1,6 +1,7 @@ package org.opencb.opencga.storage.hadoop.variant.index; import org.junit.Test; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; import static org.junit.Assert.*; @@ -35,12 +36,4 @@ public void testCountPerBit() { assertArrayEquals(expectedCounts, IndexUtils.countPerBitToObject(bytes)); } - @Test - public void testNumericMethods() { - assertTrue(IndexUtils.lessThan(1.0, 3.0)); - assertFalse(IndexUtils.lessThan(2, 2 + IndexUtils.DELTA - IndexUtils.DELTA)); - assertTrue(IndexUtils.equalsTo(2, 2 + IndexUtils.DELTA - IndexUtils.DELTA)); - assertNotEquals(2.0, 2 + IndexUtils.DELTA - IndexUtils.DELTA, 0); - assertEquals(2.0, 2 + IndexUtils.DELTA - IndexUtils.DELTA, IndexUtils.DELTA); - } } \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java index 9dc45eec7aa..cba97e10ee3 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java @@ -11,7 +11,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -37,8 +36,8 @@ public void setUp() throws Exception { "STUDY:POP_5", "STUDY:POP_6" ); - SampleIndexConfiguration configuration = new SampleIndexConfiguration().setPopulationRanges( - populations.stream().map(SampleIndexConfiguration.PopulationFrequencyRange::new).collect(Collectors.toList())); + SampleIndexConfiguration configuration = new SampleIndexConfiguration(); + populations.stream().map(SampleIndexConfiguration.PopulationFrequencyRange::new).forEach(configuration::addPopulationRange); converter = new AnnotationIndexConverter(configuration); } @@ -166,8 +165,8 @@ public void testPopFreqNone() { @Test(expected = IllegalArgumentException.class) public void testDuplicatedPopulations() { List populations = Arrays.asList("1kG_phase3:ALL", "GNOMAD_GENOMES:ALL", "1kG_phase3:ALL"); - SampleIndexConfiguration configuration = new SampleIndexConfiguration().setPopulationRanges( - populations.stream().map(SampleIndexConfiguration.PopulationFrequencyRange::new).collect(Collectors.toList())); + SampleIndexConfiguration configuration = new SampleIndexConfiguration(); + populations.stream().map(SampleIndexConfiguration.PopulationFrequencyRange::new).forEach(configuration::addPopulationRange); new AnnotationIndexConverter(configuration); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java new file mode 100644 index 00000000000..67ef81b17ce --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java @@ -0,0 +1,17 @@ +package org.opencb.opencga.storage.hadoop.variant.index.core.filters; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class RangeIndexFieldFilterTest { + + @Test + public void testNumericMethods() { + assertTrue(RangeIndexFieldFilter.lessThan(1.0, 3.0)); + assertFalse(RangeIndexFieldFilter.lessThan(2, 2 + RangeIndexFieldFilter.DELTA - RangeIndexFieldFilter.DELTA)); + assertTrue(RangeIndexFieldFilter.equalsTo(2, 2 + RangeIndexFieldFilter.DELTA - RangeIndexFieldFilter.DELTA)); + assertNotEquals(2.0, 2 + RangeIndexFieldFilter.DELTA - RangeIndexFieldFilter.DELTA, 0); + assertEquals(2.0, 2 + RangeIndexFieldFilter.DELTA - RangeIndexFieldFilter.DELTA, RangeIndexFieldFilter.DELTA); + } +} \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java index 1acf025030c..cb7b4da2043 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java @@ -1,8 +1,10 @@ package org.opencb.opencga.storage.hadoop.variant.index.sample; import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.util.Bytes; import org.junit.Test; import org.opencb.biodata.models.variant.Variant; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; import java.util.Collections; @@ -14,33 +16,40 @@ public class SampleIndexEntryPutBuilderTest { @Test public void testContains() { - SampleIndexEntryPutBuilder builder = new SampleIndexEntryPutBuilder(1, "1", 10); + SampleIndexEntryPutBuilder builder = new SampleIndexEntryPutBuilder(1, "1", 10, SampleIndexConfiguration.defaultConfiguration()); - builder.add("0/1", new SampleVariantIndexEntry(new Variant("1:100:A:C"), (short) 20)); - builder.add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), (short) 20)); - builder.add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), (short) 30)); - builder.add("1/1", new SampleVariantIndexEntry(new Variant("1:300:A:C"), (short) 20)); - builder.add("1/1", new SampleVariantIndexEntry(new Variant("1:400:A:C"), (short) 20)); + builder.add("0/1", newVariantIndexEntry("1:100:A:C", (short) 20)); + builder.add("0/1", newVariantIndexEntry("1:200:A:C", (short) 20)); + builder.add("0/1", newVariantIndexEntry("1:200:A:C", (short) 30)); + builder.add("1/1", newVariantIndexEntry("1:300:A:C", (short) 20)); + builder.add("1/1", newVariantIndexEntry("1:400:A:C", (short) 20)); - assertTrue(builder.containsVariant(new SampleVariantIndexEntry(new Variant("1:100:A:C"), (short) 30))); - assertTrue(builder.containsVariant(new SampleVariantIndexEntry(new Variant("1:200:A:C"), (short) 30))); - assertTrue(builder.containsVariant(new SampleVariantIndexEntry(new Variant("1:300:A:C"), (short) 30))); - assertTrue(builder.containsVariant(new SampleVariantIndexEntry(new Variant("1:400:A:C"), (short) 30))); + assertTrue(builder.containsVariant(newVariantIndexEntry("1:100:A:C", (short) 30))); + assertTrue(builder.containsVariant(newVariantIndexEntry("1:200:A:C", (short) 30))); + assertTrue(builder.containsVariant(newVariantIndexEntry("1:300:A:C", (short) 30))); + assertTrue(builder.containsVariant(newVariantIndexEntry("1:400:A:C", (short) 30))); - assertFalse(builder.containsVariant(new SampleVariantIndexEntry(new Variant("1:50:A:C"), (short) 30))); - assertFalse(builder.containsVariant(new SampleVariantIndexEntry(new Variant("1:500:A:C"), (short) 30))); + assertFalse(builder.containsVariant(newVariantIndexEntry("1:50:A:C", (short) 30))); + assertFalse(builder.containsVariant(newVariantIndexEntry("1:500:A:C", (short) 30))); + } + + protected SampleVariantIndexEntry newVariantIndexEntry(String s, short i) { + byte[] v = new byte[2]; + Bytes.putShort(v, 0, i); + return new SampleVariantIndexEntry(new Variant(s), new BitBuffer(v)); } @Test public void testBuild() { - VariantFileIndexConverter c = new VariantFileIndexConverter(); - - Put build = new SampleIndexEntryPutBuilder(1, "1", 10) - .add("0/1", new SampleVariantIndexEntry(new Variant("1:100:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), null))) - .add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 1, Collections.emptyMap(), null))) - .add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), null))) - .add("1/1", new SampleVariantIndexEntry(new Variant("1:300:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), null))) - .add("1/1", new SampleVariantIndexEntry(new Variant("1:400:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), null))) + SampleIndexConfiguration configuration = SampleIndexConfiguration.defaultConfiguration(); + VariantFileIndexConverter c = new VariantFileIndexConverter(configuration); + + Put build = new SampleIndexEntryPutBuilder(1, "1", 10, configuration) + .add("0/1", new SampleVariantIndexEntry(new Variant("1:100:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) + .add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 1, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) + .add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) + .add("1/1", new SampleVariantIndexEntry(new Variant("1:300:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) + .add("1/1", new SampleVariantIndexEntry(new Variant("1:400:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) .build(); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java index a7d9c8ba32d..91b89cc17a5 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java @@ -1,24 +1,30 @@ package org.opencb.opencga.storage.hadoop.variant.index.sample; +import htsjdk.variant.vcf.VCFConstants; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.Pair; import org.junit.Before; import org.junit.Test; import org.opencb.biodata.models.core.Region; +import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.biodata.models.variant.metadata.VariantFileHeaderComplexLine; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.TaskMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; -import org.opencb.opencga.storage.core.variant.query.Values; -import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.opencga.storage.core.variant.dummy.DummyVariantStorageMetadataDBAdaptorFactory; +import org.opencb.opencga.storage.core.variant.query.Values; import org.opencb.opencga.storage.core.variant.query.VariantQueryParser; -import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; +import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; +import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; +import org.opencb.opencga.storage.hadoop.variant.index.core.IndexFieldConfiguration; +import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.family.GenotypeCodec; import org.opencb.opencga.storage.hadoop.variant.index.query.RangeQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleAnnotationIndexQuery; @@ -33,8 +39,9 @@ import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.ANTISENSE; import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.PROTEIN_CODING; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.*; -import static org.opencb.opencga.storage.hadoop.variant.index.IndexUtils.*; +import static org.opencb.opencga.storage.hadoop.variant.index.IndexUtils.EMPTY_MASK; import static org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter.*; +import static org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter.DELTA; import static org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexQueryParser.groupRegions; import static org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexQueryParser.validSampleIndexQuery; @@ -48,16 +55,21 @@ public class SampleIndexQueryParserTest { private SampleIndexQueryParser sampleIndexQueryParser; private VariantStorageMetadataManager mm; private int studyId; + private FileIndex fileIndex; + private double[] qualThresholds; + private double[] dpThresholds; @Before public void setUp() throws Exception { - SampleIndexConfiguration configuration = new SampleIndexConfiguration() - .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("1kG_phase3", "ALL")) - .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("GNOMAD_GENOMES", "ALL")) + SampleIndexConfiguration configuration = SampleIndexConfiguration.defaultConfiguration() .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s1", "ALL")) .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s2", "ALL")) .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s3", "ALL")) .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s4", "ALL")); + fileIndex = configuration.getFileIndex(); + qualThresholds = fileIndex.getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL).getConfiguration().getThresholds(); + dpThresholds = fileIndex.getCustomField(IndexFieldConfiguration.Source.SAMPLE, VCFConstants.DEPTH_KEY).getConfiguration().getThresholds(); + DummyVariantStorageMetadataDBAdaptorFactory.clear(); mm = new VariantStorageMetadataManager(new DummyVariantStorageMetadataDBAdaptorFactory()); sampleIndexQueryParser = new SampleIndexQueryParser(mm, configuration); @@ -233,13 +245,17 @@ public void parseVariantTpeQuery() { @Test public void parseFileFilterTest() { testFilter("PASS", true, true); - testFilter("!PASS", false, true); testFilter("LowQual", false, false); - testFilter("!LowQual", null, false); testFilter( "LowGQX,LowQual", false, false); testFilter( "LowGQX;LowQual", false, false); testFilter( "PASS,LowQual", null, false); - testFilter( "PASS;LowQual", null, false); +// testFilter( "PASS;LowQual", null, false); + } + + @Test + public void parseFileFilterNegatedTest() { + testFilter("!PASS", false, true); + testFilter("!LowQual", null, false); testFilter("!LowGQX;!LowQual", null, false); } @@ -247,13 +263,14 @@ private void testFilter(String value, Boolean pass, boolean covered) { Query query = new Query(FILTER.key(), value); SampleFileIndexQuery q = parseFileQuery(query, "", null); if (pass == null) { - assertEquals(EMPTY_MASK, q.getFileIndexMask()); + assertTrue(q.isEmpty()); } else { - assertEquals(VariantFileIndexConverter.FILTER_PASS_MASK, q.getFileIndexMask()); + IndexFieldFilter filter = q.getFilters().stream().filter(f -> f.getIndex().getKey().equals(StudyEntry.FILTER)).findFirst().orElse(null); + assertNotNull(filter); if (pass) { - assertTrue(q.getValidFileIndex2()[getByte2(VariantFileIndexConverter.FILTER_PASS_MASK)]); + assertTrue(filter.test(((IndexField) filter.getIndex()).encode("PASS"))); } else { - assertFalse(q.getValidFileIndex2()[getByte2(VariantFileIndexConverter.FILTER_PASS_MASK)]); + assertFalse(filter.test(((IndexField) filter.getIndex()).encode("PASS"))); } } assertEquals(!covered, isValidParam(query, FILTER)); @@ -261,7 +278,6 @@ private void testFilter(String value, Boolean pass, boolean covered) { @Test public void parseFileQualTest() { - int qualThresholdMatches = 0; for (Double qual : Arrays.asList(0.0, 5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 40.0)) { Query query; @@ -269,30 +285,18 @@ public void parseFileQualTest() { query = new Query(QUAL.key(), "=" + qual); fileQuery = parseFileQuery(query, "", null); - assertEquals("=" + qual, new RangeQuery(qual, qual + DELTA, - IndexUtils.getRangeCode(qual, SampleIndexConfiguration.QUAL_THRESHOLDS), - IndexUtils.getRangeCodeExclusive(qual + DELTA, SampleIndexConfiguration.QUAL_THRESHOLDS)), - fileQuery.getQualQuery()); - assertEquals(VariantFileIndexConverter.QUAL_MASK, fileQuery.getFileIndexMask()); + checkQualFilter("=" + qual, qual, qual + DELTA, fileQuery); assertTrue(isValidParam(query, QUAL)); query = new Query(QUAL.key(), "<=" + qual); fileQuery = parseFileQuery(query, "", null); - assertEquals("<=" + qual, new RangeQuery(Double.MIN_VALUE, qual + DELTA, - (byte) 0, - IndexUtils.getRangeCodeExclusive(qual + DELTA, SampleIndexConfiguration.QUAL_THRESHOLDS)), - fileQuery.getQualQuery()); - assertEquals(VariantFileIndexConverter.QUAL_MASK, fileQuery.getFileIndexMask()); + checkQualFilter("<=" + qual, Double.MIN_VALUE, qual + DELTA, fileQuery); assertTrue(isValidParam(query, QUAL)); query = new Query(QUAL.key(), "<" + qual); fileQuery = parseFileQuery(query, "", null); - assertEquals("<" + qual, new RangeQuery(Double.MIN_VALUE, qual, - (byte) 0, - IndexUtils.getRangeCodeExclusive(qual, SampleIndexConfiguration.QUAL_THRESHOLDS)), - fileQuery.getQualQuery()); - assertEquals(VariantFileIndexConverter.QUAL_MASK, fileQuery.getFileIndexMask()); - if (Arrays.binarySearch(SampleIndexConfiguration.QUAL_THRESHOLDS, qual) >= 0) { + checkQualFilter("<" + qual, Double.MIN_VALUE, qual, fileQuery); + if (Arrays.binarySearch(qualThresholds, qual) >= 0) { assertFalse(isValidParam(query, QUAL)); qualThresholdMatches++; } else { @@ -301,13 +305,8 @@ public void parseFileQualTest() { query = new Query(QUAL.key(), ">=" + qual); fileQuery = parseFileQuery(query, "", null); - assertEquals(">=" + qual, new RangeQuery(qual, IndexUtils.MAX, - IndexUtils.getRangeCode(qual, SampleIndexConfiguration.QUAL_THRESHOLDS), - (byte) 4), - fileQuery.getQualQuery()); - assertEquals(VariantFileIndexConverter.QUAL_MASK, fileQuery.getFileIndexMask()); - assertEquals(VariantFileIndexConverter.QUAL_MASK, fileQuery.getFileIndexMask()); - if (qual == 0 || Arrays.binarySearch(SampleIndexConfiguration.QUAL_THRESHOLDS, qual) >= 0) { + checkQualFilter(">=" + qual, qual, RangeIndexField.MAX, fileQuery); + if (qual == 0 || Arrays.binarySearch(qualThresholds, qual) >= 0) { assertFalse(isValidParam(query, QUAL)); } else { assertTrue(isValidParam(query, QUAL)); @@ -315,110 +314,99 @@ public void parseFileQualTest() { query = new Query(QUAL.key(), ">" + qual); fileQuery = parseFileQuery(query, "", null); - assertEquals(">" + qual, new RangeQuery(qual + DELTA, IndexUtils.MAX, - IndexUtils.getRangeCode(qual + DELTA, SampleIndexConfiguration.QUAL_THRESHOLDS), - (byte) 4), - fileQuery.getQualQuery()); - assertEquals(VariantFileIndexConverter.QUAL_MASK, fileQuery.getFileIndexMask()); + checkQualFilter(">" + qual, qual + DELTA, RangeIndexField.MAX, fileQuery); assertTrue(isValidParam(query, QUAL)); } - assertEquals(SampleIndexConfiguration.QUAL_THRESHOLDS.length, qualThresholdMatches); + assertEquals(qualThresholds.length, qualThresholdMatches); + } + + protected void checkQualFilter(String message, double minValueInclusive, double maxValueExclusive, SampleFileIndexQuery fileQuery) { + RangeIndexFieldFilter qualQuery = (RangeIndexFieldFilter) fileQuery.getFilter(IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL); + + assertEquals(message, minValueInclusive, qualQuery.getMinValueInclusive(), 0); + assertEquals(message, maxValueExclusive, qualQuery.getMaxValueExclusive(), 0); + assertEquals(message, RangeIndexFieldFilter.getRangeCode(minValueInclusive, qualThresholds), qualQuery.getMinCodeInclusive()); + assertEquals(message, RangeIndexFieldFilter.getRangeCodeExclusive(maxValueExclusive, qualThresholds), qualQuery.getMaxCodeExclusive()); } @Test public void parseFileDPTest() { SampleFileIndexQuery fileQuery; for (Double dp : Arrays.asList(3.0, 5.0, 10.0, 15.0, 20.0, 30.0, 35.0)) { - for (Pair pair : Arrays.asList(Pair.of(FILE_DATA.key(), "F1"), Pair.of(SAMPLE_DATA.key(), "S1"))) { + for (Pair pair : Arrays.asList(/*Pair.of(FILE_DATA.key(), "F1"), */Pair.of(SAMPLE_DATA.key(), "S1"))) { fileQuery = parseFileQuery(new Query(pair.getKey(), pair.getValue() + ":DP=" + dp), "S1", n -> Collections.singletonList("F1")); - assertEquals("=" + dp, new RangeQuery(dp, dp + DELTA, - IndexUtils.getRangeCode(dp, SampleIndexConfiguration.DP_THRESHOLDS), - IndexUtils.getRangeCodeExclusive(dp + DELTA, SampleIndexConfiguration.DP_THRESHOLDS)), - fileQuery.getDpQuery()); - assertEquals(VariantFileIndexConverter.DP_MASK, fileQuery.getFileIndexMask()); + checkDPFilter("=" + dp, dp, dp + DELTA, fileQuery); fileQuery = parseFileQuery(new Query(pair.getKey(), pair.getValue() + ":DP<=" + dp), "S1", n -> Collections.singletonList("F1")); - assertEquals("<=" + dp, new RangeQuery(Double.MIN_VALUE, dp + DELTA, - (byte) 0, - IndexUtils.getRangeCodeExclusive(dp + DELTA, SampleIndexConfiguration.DP_THRESHOLDS)), - fileQuery.getDpQuery()); - assertEquals(VariantFileIndexConverter.DP_MASK, fileQuery.getFileIndexMask()); + checkDPFilter("<=" + dp, Double.MIN_VALUE, dp + DELTA, fileQuery); fileQuery = parseFileQuery(new Query(pair.getKey(), pair.getValue() + ":DP<" + dp), "S1", n -> Collections.singletonList("F1")); - assertEquals("<" + dp, new RangeQuery(Double.MIN_VALUE, dp, - (byte) 0, - IndexUtils.getRangeCodeExclusive(dp, SampleIndexConfiguration.DP_THRESHOLDS)), - fileQuery.getDpQuery()); - assertEquals(VariantFileIndexConverter.DP_MASK, fileQuery.getFileIndexMask()); + checkDPFilter("<" + dp, Double.MIN_VALUE, dp, fileQuery); fileQuery = parseFileQuery(new Query(pair.getKey(), pair.getValue() + ":DP>=" + dp), "S1", n -> Collections.singletonList("F1")); - assertEquals(">=" + dp, new RangeQuery(dp, IndexUtils.MAX, - IndexUtils.getRangeCode(dp, SampleIndexConfiguration.DP_THRESHOLDS), - (byte) 8), - fileQuery.getDpQuery()); - assertEquals(VariantFileIndexConverter.DP_MASK, fileQuery.getFileIndexMask()); + checkDPFilter(">=" + dp, dp, RangeIndexField.MAX, fileQuery); fileQuery = parseFileQuery(new Query(pair.getKey(), pair.getValue() + ":DP>" + dp), "S1", n -> Collections.singletonList("F1")); - assertEquals(">" + dp, new RangeQuery(dp + DELTA, IndexUtils.MAX, - IndexUtils.getRangeCode(dp + DELTA, SampleIndexConfiguration.DP_THRESHOLDS), - (byte) 8), - fileQuery.getDpQuery()); - assertEquals(VariantFileIndexConverter.DP_MASK, fileQuery.getFileIndexMask()); + checkDPFilter(">" + dp, dp + DELTA, RangeIndexField.MAX, fileQuery); } } Query query = new Query(SAMPLE_DATA.key(), "S1:DP>=15"); fileQuery = parseFileQuery(query, "S1", n -> Collections.singletonList("F1")); - assertTrue(fileQuery.getDpQuery().isExactQuery()); + assertTrue(getDPFilter(fileQuery).isExactFilter()); assertFalse(isValidParam(query, SAMPLE_DATA)); query = new Query(SAMPLE_DATA.key(), "S1:DP>=15;S2:DP>34"); fileQuery = parseFileQuery(query, "S1", n -> Collections.singletonList("F1")); - assertTrue(fileQuery.getDpQuery().isExactQuery()); + assertTrue(getDPFilter(fileQuery).isExactFilter()); fileQuery = parseFileQuery(query, "S2", n -> Collections.singletonList("F1")); - assertFalse(fileQuery.getDpQuery().isExactQuery()); + assertFalse(getDPFilter(fileQuery).isExactFilter()); assertEquals("S2:DP>34", query.getString(SAMPLE_DATA.key())); query = new Query(SAMPLE_DATA.key(), "S1:DP>=15,S2:DP>34"); fileQuery = parseFileQuery(query, "S1", n -> Collections.singletonList("F1")); - assertNull(fileQuery.getDpQuery()); + assertNull(getDPFilter(fileQuery)); fileQuery = parseFileQuery(query, "S2", n -> Collections.singletonList("F1")); - assertNull(fileQuery.getDpQuery()); + assertNull(getDPFilter(fileQuery)); assertEquals("S1:DP>=15,S2:DP>34", query.getString(SAMPLE_DATA.key())); query = new Query(SAMPLE_DATA.key(), "S2:DP>34;S1:DP>=15;S3:DP>16"); fileQuery = parseFileQuery(query, "S2", n -> Collections.singletonList("F1")); - assertFalse(fileQuery.getDpQuery().isExactQuery()); + assertFalse(getDPFilter(fileQuery).isExactFilter()); fileQuery = parseFileQuery(query, "S1", n -> Collections.singletonList("F1")); - assertTrue(fileQuery.getDpQuery().isExactQuery()); + assertTrue(getDPFilter(fileQuery).isExactFilter()); assertEquals("S2:DP>34;S3:DP>16", query.getString(SAMPLE_DATA.key())); } + protected void checkDPFilter(String message, double minValueInclusive, double maxValueExclusive, SampleFileIndexQuery fileQuery) { + RangeIndexFieldFilter qualQuery = getDPFilter(fileQuery); + + assertEquals(message, minValueInclusive, qualQuery.getMinValueInclusive(), 0); + assertEquals(message, maxValueExclusive, qualQuery.getMaxValueExclusive(), 0); + assertEquals(message, RangeIndexFieldFilter.getRangeCode(minValueInclusive, dpThresholds), qualQuery.getMinCodeInclusive()); + assertEquals(message, RangeIndexFieldFilter.getRangeCodeExclusive(maxValueExclusive, dpThresholds), qualQuery.getMaxCodeExclusive()); + } + + private RangeIndexFieldFilter getDPFilter(SampleFileIndexQuery fileQuery) { + return (RangeIndexFieldFilter) fileQuery.getFilter(IndexFieldConfiguration.Source.SAMPLE, VCFConstants.DEPTH_KEY); + } + @Test public void parseFileTest() { Query query = new Query(FILE.key(), "F1"); SampleFileIndexQuery fileQuery = parseFileQuery(query, "S2", n -> Arrays.asList("F1", "F2"), true); - assertTrue(fileQuery.getValidFileIndex1()[0]); - assertEquals(1, countValidFileIndex(fileQuery)); + assertTrue(fileQuery.getFilter(fileIndex.getFilePositionIndex().getSource(), fileIndex.getFilePositionIndex().getKey()).test(0)); + assertFalse(fileQuery.getFilter(fileIndex.getFilePositionIndex().getSource(), fileIndex.getFilePositionIndex().getKey()).test(1)); print(fileQuery); query = new Query(FILE.key(), "F2"); fileQuery = parseFileQuery(query, "S2", n -> Arrays.asList("F1", "F2"), true); - assertTrue(fileQuery.getValidFileIndex1()[1 << VariantFileIndexConverter.FILE_POSITION_SHIFT]); - assertEquals(1, countValidFileIndex(fileQuery)); + assertFalse(fileQuery.getFilter(fileIndex.getFilePositionIndex().getSource(), fileIndex.getFilePositionIndex().getKey()).test(0)); + assertTrue(fileQuery.getFilter(fileIndex.getFilePositionIndex().getSource(), fileIndex.getFilePositionIndex().getKey()).test(1)); print(fileQuery); } - private int countValidFileIndex(SampleFileIndexQuery fileQuery) { - int n = 0; - for (boolean b : fileQuery.getValidFileIndex1()) - if (b) n++; - for (boolean b : fileQuery.getValidFileIndex2()) - if (b) n++; - return n; - } - @Test public void parseFileDataTest() { Query query; @@ -446,22 +434,9 @@ public void parseFileDataTest() { } private void print(SampleFileIndexQuery fileQuery) { - System.out.println("Mask: " + IndexUtils.shortToString(fileQuery.getFileIndexMask())); - if (fileQuery.hasFileIndexMask1()) { - boolean[] validFileIndex = fileQuery.getValidFileIndex1(); - for (int i = 0; i < validFileIndex.length; i++) { - if (validFileIndex[i]) { - System.out.println("FileIndex1 = " + IndexUtils.maskToString((fileQuery.getFileIndexMask1()), (byte) i)); - } - } - } - if (fileQuery.hasFileIndexMask2()) { - boolean[] validFileIndex2 = fileQuery.getValidFileIndex2(); - for (int i = 0; i < validFileIndex2.length; i++) { - if (validFileIndex2[i]) { - System.out.println("FileIndex2 = " + IndexUtils.maskToString((fileQuery.getFileIndexMask2()), (byte) i)); - } - } + System.out.println("File query for sample '" + fileQuery.getSampleName() + "' with " + fileQuery.getFilters().size() + " filters"); + for (IndexFieldFilter filter : fileQuery.getFilters()) { + System.out.println("Filter : " + filter); } } @@ -527,7 +502,7 @@ public void parseFamilyQuery_dp() { assertEquals(Collections.singleton("fam1_child"), indexQuery.getSamplesMap().keySet()); assertEquals(1, indexQuery.getFatherFilterMap().size()); - assertTrue(indexQuery.getSampleFileIndexQuery("fam1_child").get(0).getDpQuery().isExactQuery()); + assertTrue(indexQuery.getSampleFileIndexQuery("fam1_child").get(0).getFilter(IndexFieldConfiguration.Source.SAMPLE, "DP").isExactFilter()); assertEquals("fam1_father:DP>15;fam1_mother:DP>15", query.getString(SAMPLE_DATA.key())); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntryTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntryTest.java index 9856f0ee268..1feb40d9b41 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntryTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntryTest.java @@ -1,8 +1,10 @@ package org.opencb.opencga.storage.hadoop.variant.index.sample; +import org.apache.hadoop.hbase.util.Bytes; import org.junit.Assert; import org.junit.Test; import org.opencb.biodata.models.variant.Variant; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; import java.util.ArrayList; import java.util.Arrays; @@ -16,11 +18,11 @@ public class SampleVariantIndexEntryTest { public void testComparator() { List expected = Arrays.asList( - new SampleVariantIndexEntry(new Variant("1:100:A:C"), (short) 0), - new SampleVariantIndexEntry(new Variant("1:200:A:C"), VariantFileIndexConverter.setMultiFile((short) (1 << 4))), - new SampleVariantIndexEntry(new Variant("1:200:A:C"), (short) (2 << 4)), - new SampleVariantIndexEntry(new Variant("1:200:A:C"), (short) (3 << 4)), - new SampleVariantIndexEntry(new Variant("1:300:A:C"), (short) 0) + newVariantIndexEntry("1:100:A:C", 0), + newVariantIndexEntry("1:200:A:C", ((1 << 4)), true), + newVariantIndexEntry("1:200:A:C", (2 << 4)), + newVariantIndexEntry("1:200:A:C", (3 << 4)), + newVariantIndexEntry("1:300:A:C", 0) ); for (int i = 0; i < 10; i++) { @@ -34,4 +36,18 @@ public void testComparator() { } + + protected SampleVariantIndexEntry newVariantIndexEntry(String s, int i) { + return newVariantIndexEntry(s, i, false); + } + + protected SampleVariantIndexEntry newVariantIndexEntry(String s, int i, boolean multiFileIndex) { + byte[] v = new byte[4]; + Bytes.putInt(v, 0, i); + BitBuffer fileIndex = new BitBuffer(v); + if (multiFileIndex) { + FileIndex.setMultiFile(fileIndex, 0); + } + return new SampleVariantIndexEntry(new Variant(s), fileIndex); + } } \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java index b1b2136406a..26aa09f660a 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java @@ -2,58 +2,82 @@ import org.junit.Before; import org.junit.Test; +import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.VariantBuilder; import org.opencb.biodata.models.variant.avro.VariantType; -import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; +import org.opencb.opencga.storage.hadoop.variant.index.core.IndexFieldConfiguration; import java.util.Arrays; -import static org.junit.Assert.*; -import static org.opencb.opencga.storage.hadoop.variant.index.sample.VariantFileIndexConverter.*; +import static org.junit.Assert.assertEquals; public class VariantFileIndexEntryConverterTest { private VariantFileIndexConverter fileIndexConverter; + private FileIndex fileIndex; @Before public void setUp() throws Exception { - fileIndexConverter = new VariantFileIndexConverter(); + fileIndexConverter = new VariantFileIndexConverter(SampleIndexConfiguration.defaultConfiguration()); + fileIndex = SampleIndexConfiguration.defaultConfiguration().getFileIndex(); } @Test public void testConvert() { + BitBuffer bitBuffer = new BitBuffer(fileIndex.getBitsLength()); - int snv = VariantFileIndexConverter.getTypeCode(VariantType.SNV) << TYPE_SHIFT; - assertEquals(snv, + fileIndex.getTypeIndex().write(VariantType.SNV, bitBuffer); + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:C").addSample("s1", "0/1", "0").build())); - assertEquals(VariantFileIndexConverter.getTypeCode(VariantType.INDEL) << TYPE_SHIFT, + + fileIndex.getTypeIndex().write(VariantType.INDEL, bitBuffer); + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:-").addSample("s1", "0/1", "0").build())); - assertEquals(VariantFileIndexConverter.getTypeCode(VariantType.DELETION) << TYPE_SHIFT, + + fileIndex.getTypeIndex().write(VariantType.DELETION, bitBuffer); + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100-200:A:").addSample("s1", "0/1", "0").build())); - assertEquals(VariantFileIndexConverter.getTypeCode(VariantType.INSERTION) << TYPE_SHIFT, + + fileIndex.getTypeIndex().write(VariantType.INSERTION, bitBuffer); + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100-200:A:").addSample("s1", "0/1", "0").build())); - assertEquals(snv | FILTER_PASS_MASK, + fileIndex.getTypeIndex().write(VariantType.SNV, bitBuffer); + fileIndex.getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.FILTER).write("PASS", bitBuffer); + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:C").addSample("s1", "0/1", "0").setFilter("PASS").build())); - assertEquals(snv | IndexUtils.getRangeCode(2000, SampleIndexConfiguration.QUAL_THRESHOLDS) << QUAL_SHIFT, + fileIndex.getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.FILTER).write(null, bitBuffer); + fileIndex.getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL).write("2000.0", bitBuffer); + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:C").addSample("s1", "0/1", "0").setQuality(2000.0).build())); - assertEquals(snv | IndexUtils.getRangeCode(10, SampleIndexConfiguration.QUAL_THRESHOLDS) << QUAL_SHIFT, + + fileIndex.getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL).write("10.0", bitBuffer); + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:C").addSample("s1", "0/1", "0").setQuality(10.0).build())); + bitBuffer.clear(); + fileIndex.getTypeIndex().write(VariantType.SNV, bitBuffer); + fileIndex.getFilePositionIndex().write(3, bitBuffer); + fileIndex.getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL).write("10.0", bitBuffer); + assertEquals(bitBuffer, + fileIndexConverter.createFileIndexValue(0, 3, v("1:100:A:C").addSample("s1", "0/1", "0").setQuality(10.0).build())); + + bitBuffer.clear(); + fileIndex.getTypeIndex().write(VariantType.SNV, bitBuffer); for (Integer dp : Arrays.asList(1, 5, 10, 20, 50)) { - assertEquals((short) (snv | (IndexUtils.getRangeCode(dp, SampleIndexConfiguration.DP_THRESHOLDS) << DP_SHIFT)), + fileIndex.getCustomField(IndexFieldConfiguration.Source.SAMPLE, "DP").write(String.valueOf(dp), bitBuffer); + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:C").addSample("s1", "0/1", dp.toString()).build())); - assertEquals((short) (snv | (IndexUtils.getRangeCode(dp, SampleIndexConfiguration.DP_THRESHOLDS) << DP_SHIFT)), + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:C").addSample("s1", "0/1", dp.toString()).addFileData("DP", 10000).build())); - assertEquals((short) (snv | (IndexUtils.getRangeCode(dp, SampleIndexConfiguration.DP_THRESHOLDS) << DP_SHIFT)), + assertEquals(bitBuffer, fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:C").addSample("s1", "0/1", dp.toString()).addFileData("DP", 0).build())); - assertEquals((short) (snv | (IndexUtils.getRangeCode(dp, SampleIndexConfiguration.DP_THRESHOLDS) << DP_SHIFT)), - fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:C").setSampleDataKeys("GT").addSample("s1", "0/1").addFileData("DP", dp).build())); +// assertEquals(bitBuffer, +// fileIndexConverter.createFileIndexValue(0, 0, v("1:100:A:C").setSampleDataKeys("GT").addSample("s1", "0/1").addFileData("DP", dp).build())); } - - } private VariantBuilder v(String s) { From c8921fdf147b7dc0cf648a30a3026b2bb17e2dd8 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 4 Mar 2021 12:24:50 +0100 Subject: [PATCH 055/412] clinical: fix variant converter, #1693 --- .../opencga/clinical/rga/RgaManager.java | 35 +++++--- .../storage/core/rga/GeneRgaConverter.java | 1 - .../storage/core/rga/VariantRgaConverter.java | 85 ++++++++++--------- 3 files changed, 68 insertions(+), 53 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 5aa59088f8f..de94e632988 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -75,6 +75,8 @@ public OpenCGAResult individualQuery(String studyStr, Quer Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); + QueryOptions queryOptions = setDefaultLimit(options); + if (!auxQuery.containsKey("sampleId") && !auxQuery.containsKey("individualId")) { // 1st. we perform a facet to get the different sample ids matching the user query DataResult result = rgaEngine.facetedQuery(collection, auxQuery, @@ -111,8 +113,8 @@ public OpenCGAResult individualQuery(String studyStr, Quer samples = auxQuery.getAsStringList("sampleId"); } - int limit = options.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); - int skip = options.getInt(QueryOptions.SKIP); + int limit = queryOptions.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); + int skip = queryOptions.getInt(QueryOptions.SKIP); List sampleIds; if (skip == 0 && limit > samples.size()) { @@ -125,7 +127,7 @@ public OpenCGAResult individualQuery(String studyStr, Quer } auxQuery.put("sampleId", sampleIds); - return rgaEngine.individualQuery(collection, auxQuery, options); + return rgaEngine.individualQuery(collection, auxQuery, queryOptions); } public OpenCGAResult geneQuery(String studyStr, Query query, QueryOptions options, String token) @@ -134,7 +136,8 @@ public OpenCGAResult geneQuery(String studyStr, Query query, String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); - List includeIndividuals = options.getAsStringList(RgaQueryParams.INCLUDE_INDIVIDUAL); + QueryOptions queryOptions = setDefaultLimit(options); + List includeIndividuals = queryOptions.getAsStringList(RgaQueryParams.INCLUDE_INDIVIDUAL); Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); @@ -143,8 +146,8 @@ public OpenCGAResult geneQuery(String studyStr, Query query, if (!auxQuery.containsKey(RgaDataModel.GENE_ID)) { // 1st. we perform a facet to get the different gene ids matching the user query and using the skip and limit values QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.GENE_ID); - facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); - facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); + facetOptions.putIfNotNull(QueryOptions.LIMIT, queryOptions.get(QueryOptions.LIMIT)); + facetOptions.putIfNotNull(QueryOptions.SKIP, queryOptions.get(QueryOptions.SKIP)); DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); if (result.getNumResults() == 0) { @@ -183,7 +186,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, } // 4. Solr gene query - OpenCGAResult knockoutResult = rgaEngine.geneQuery(collection, auxQuery, options); + OpenCGAResult knockoutResult = rgaEngine.geneQuery(collection, auxQuery, queryOptions); if (isOwnerOrAdmin && includeIndividualIds.isEmpty()) { return knockoutResult; } else { @@ -208,7 +211,9 @@ public OpenCGAResult variantQuery(String studyStr, Query quer String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); - List includeIndividuals = options.getAsStringList(RgaQueryParams.INCLUDE_INDIVIDUAL); + QueryOptions queryOptions = setDefaultLimit(options); + + List includeIndividuals = queryOptions.getAsStringList(RgaQueryParams.INCLUDE_INDIVIDUAL); Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); @@ -217,8 +222,8 @@ public OpenCGAResult variantQuery(String studyStr, Query quer if (!auxQuery.containsKey(RgaDataModel.VARIANTS)) { // 1st. we perform a facet to get the different variant ids matching the user query and using the skip and limit values QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS); - facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); - facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); + facetOptions.putIfNotNull(QueryOptions.LIMIT, queryOptions.get(QueryOptions.LIMIT)); + facetOptions.putIfNotNull(QueryOptions.SKIP, queryOptions.get(QueryOptions.SKIP)); DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); @@ -255,7 +260,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer } // 4. Solr gene query - OpenCGAResult knockoutResult = rgaEngine.variantQuery(collection, auxQuery, options); + OpenCGAResult knockoutResult = rgaEngine.variantQuery(collection, auxQuery, queryOptions); if (isOwnerOrAdmin && includeIndividualIds.isEmpty()) { return knockoutResult; } else { @@ -274,6 +279,14 @@ public OpenCGAResult variantQuery(String studyStr, Query quer } } + private QueryOptions setDefaultLimit(QueryOptions options) { + QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); + if (!queryOptions.containsKey(QueryOptions.LIMIT)) { + queryOptions.put(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); + } + return queryOptions; + } + public void index(String studyStr, String fileStr, String token) throws CatalogException, RgaException, IOException { String userId = catalogManager.getUserManager().getUserId(token); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java index 4826562b5bf..52414304bb8 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java @@ -4,7 +4,6 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.core.common.JacksonUtils; -import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java index efa000fe9d0..5dd7083bd68 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java @@ -22,46 +22,51 @@ public class VariantRgaConverter implements ComplexTypeConverter(); CONVERTER_MAP.put("id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS)); - CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.SAMPLE_ID)); - CONVERTER_MAP.put("individuals.sex", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SEX)); - CONVERTER_MAP.put("individuals.numParents", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.NUM_PARENTS)); - CONVERTER_MAP.put("individuals.phenotypes", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.PHENOTYPES, RgaDataModel.PHENOTYPE_JSON)); - CONVERTER_MAP.put("individuals.disorders", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.DISORDERS, RgaDataModel.DISORDER_JSON)); + CONVERTER_MAP.put("individuals.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SAMPLE_ID)); + CONVERTER_MAP.put("individuals.sex", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, + RgaDataModel.SEX)); + CONVERTER_MAP.put("individuals.numParents", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.NUM_PARENTS)); + CONVERTER_MAP.put("individuals.phenotypes", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.PHENOTYPES, RgaDataModel.PHENOTYPE_JSON)); + CONVERTER_MAP.put("individuals.disorders", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.DISORDERS, RgaDataModel.DISORDER_JSON)); CONVERTER_MAP.put("individuals.stats", Collections.emptyList()); - CONVERTER_MAP.put("individuals.genesMap.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID)); - CONVERTER_MAP.put("individuals.genesMap.name", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.GENE_NAME)); - CONVERTER_MAP.put("individuals.genesMap.chromosome", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.CHROMOSOME)); - CONVERTER_MAP.put("individuals.genesMap.biotype", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.GENE_BIOTYPE)); - CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID)); - CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.chromosome", Arrays.asList(RgaDataModel.VARIANT_JSON, + CONVERTER_MAP.put("individuals.genesMap.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID)); + CONVERTER_MAP.put("individuals.genesMap.name", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_NAME)); + CONVERTER_MAP.put("individuals.genesMap.chromosome", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.CHROMOSOME)); + CONVERTER_MAP.put("individuals.genesMap.biotype", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_BIOTYPE)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.chromosome", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CHROMOSOME)); - CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.start", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.START)); - CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.end", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.END)); - CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.biotype", Arrays.asList(RgaDataModel.VARIANT_JSON, + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.start", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.START)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.end", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.END)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.biotype", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_BIOTYPE)); - CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.strand", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); - CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.id", Arrays.asList(RgaDataModel.VARIANT_JSON, + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.strand", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); + CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.filter", Arrays.asList(RgaDataModel.VARIANT_JSON, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS)); + RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS)); CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.knockoutType", Arrays.asList(RgaDataModel.VARIANT_JSON, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.KNOCKOUT_TYPES)); + RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.KNOCKOUT_TYPES)); CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.populationFrequencies", Arrays.asList(RgaDataModel.VARIANT_JSON, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.POPULATION_FREQUENCIES)); + RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.POPULATION_FREQUENCIES)); CONVERTER_MAP.put("individuals.genesMap.transcriptsMap.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.VARIANT_JSON, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CONSEQUENCE_TYPES)); + RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.CONSEQUENCE_TYPES)); } public VariantRgaConverter() { @@ -88,24 +93,22 @@ public List convertToDataModelType(List rgaData if (variantIds.isEmpty() || variantIds.contains(variant)) { auxVariantIds.add(variant); if (!result.containsKey(variant)) { + result.put(variant, new HashSet<>()); + // The variant will be processed, so we add it to the order list variantOrder.add(variant); } - break; } } if (!auxVariantIds.isEmpty()) { IndividualRgaConverter.extractKnockoutByIndividualMap(rgaDataModel, variantIds, individualMap); - } - for (String auxVariantId : auxVariantIds) { - if (!result.containsKey(auxVariantId)) { - result.put(auxVariantId, new HashSet<>()); - } - if (StringUtils.isNotEmpty(rgaDataModel.getIndividualId())) { - result.get(auxVariantId).add(rgaDataModel.getIndividualId()); + + for (String auxVariantId : auxVariantIds) { + if (StringUtils.isNotEmpty(rgaDataModel.getIndividualId())) { + result.get(auxVariantId).add(rgaDataModel.getIndividualId()); + } } } - } List knockoutVariantList = new ArrayList<>(variantOrder.size()); From 15309d270e004cd7b594dd5088285f503a6ddd38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 4 Mar 2021 12:01:05 +0000 Subject: [PATCH 056/412] storage: Enable default sample file index backward compatibility. #1699 --- .../variant/index/sample/FileIndex.java | 86 +++++++++++-------- .../sample/HBaseToSampleIndexConverter.java | 8 +- .../sample/SampleIndexConfiguration.java | 65 ++++++++++++-- .../index/sample/SampleIndexDBLoader.java | 2 +- .../sample/SampleIndexEntryPutBuilder.java | 2 +- .../sample/SampleIndexVariantBiConverter.java | 2 +- .../index/sample/SampleVariantIndexEntry.java | 7 +- .../sample/SampleVariantIndexEntryTest.java | 9 +- 8 files changed, 128 insertions(+), 53 deletions(-) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndex.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndex.java index 298d11f7a4d..b6c1746adbe 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndex.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndex.java @@ -15,30 +15,41 @@ public class FileIndex extends Index { - private static final int DEFAULT_FILE_POSITION_SIZE_BITS = 4; - - private static final IndexField MULTI_FILE_INDEX = new CategoricalIndexField<>( - new IndexFieldConfiguration(IndexFieldConfiguration.Source.FILE, "multiFile", IndexFieldConfiguration.Type.CATEGORICAL), 0, - new Boolean[]{false, true}, false); - private final List> fixedFields; private final List> customFields; + private final IndexField multiFileIndex; private final IndexField typeIndex; private final IndexField filePositionIndex; - public FileIndex(SampleIndexConfiguration configuration) { - this(configuration.getFileIndexFieldsConfiguration(), DEFAULT_FILE_POSITION_SIZE_BITS); - } - - public FileIndex(List customFieldConfigurations, int filePositionSizeBits) { - filePositionIndex = buildFilePositionIndexField(MULTI_FILE_INDEX, filePositionSizeBits); - typeIndex = buildVariantTypeIndexField(filePositionIndex); - this.fixedFields = Arrays.asList( - MULTI_FILE_INDEX, - filePositionIndex, - typeIndex); + public FileIndex(SampleIndexConfiguration.FileIndexConfiguration fileIndexConfiguration) { + this(fileIndexConfiguration.getCustomFields(), + fileIndexConfiguration.getFilePositionBits(), + fileIndexConfiguration.isFixedFieldsFirst()); + } + + public FileIndex(List customFieldConfigurations, int filePositionSizeBits, boolean fixedFieldsFirst) { + if (fixedFieldsFirst) { + multiFileIndex = buildMultiFile(null); + filePositionIndex = buildFilePositionIndexField(multiFileIndex, filePositionSizeBits); + typeIndex = buildVariantTypeIndexField(filePositionIndex); + this.fixedFields = Arrays.asList( + multiFileIndex, + filePositionIndex, + typeIndex); + + this.customFields = buildCustomIndexFields(this.fixedFields, customFieldConfigurations); + } else { + this.customFields = buildCustomIndexFields(Collections.emptyList(), customFieldConfigurations); + + multiFileIndex = buildMultiFile(customFields.get(customFields.size() - 1)); + filePositionIndex = buildFilePositionIndexField(multiFileIndex, filePositionSizeBits); + typeIndex = buildVariantTypeIndexField(filePositionIndex); + this.fixedFields = Arrays.asList( + multiFileIndex, + filePositionIndex, + typeIndex); - this.customFields = buildStringIndexFields(this.fixedFields, customFieldConfigurations); + } this.fields = new ArrayList<>(fixedFields.size() + customFields.size()); this.fields.addAll(fixedFields); @@ -60,7 +71,7 @@ public List> getCustomFields() { } public IndexField getMultiFileIndex() { - return MULTI_FILE_INDEX; + return multiFileIndex; } public IndexField getFilePositionIndex() { @@ -75,22 +86,22 @@ public boolean hasMoreValues(BitBuffer bitBuffer) { return getMultiFileIndex().readAndDecode(bitBuffer); } - public static boolean isMultiFile(BitBuffer fileIndex) { - return MULTI_FILE_INDEX.readAndDecode(fileIndex); + public boolean isMultiFile(BitBuffer fileIndex) { + return getMultiFileIndex().readAndDecode(fileIndex); } - public static boolean isMultiFile(BitBuffer fileIndex, int bitOffset) { - int code = fileIndex.getIntPartial(bitOffset + MULTI_FILE_INDEX.getBitOffset(), MULTI_FILE_INDEX.getBitLength()); - return MULTI_FILE_INDEX.decode(code); + public boolean isMultiFile(BitBuffer fileIndex, int bitOffset) { + int code = fileIndex.getIntPartial(bitOffset + getMultiFileIndex().getBitOffset(), getMultiFileIndex().getBitLength()); + return getMultiFileIndex().decode(code); } - public static void setMultiFile(BitBuffer bitBuffer, int bitOffset) { + public void setMultiFile(BitBuffer bitBuffer, int bitOffset) { setMultiFile(bitBuffer, bitOffset, true); } - public static void setMultiFile(BitBuffer bitBuffer, int bitOffset, boolean value) { - bitBuffer.setIntPartial(MULTI_FILE_INDEX.encode(value), - MULTI_FILE_INDEX.getBitOffset() + bitOffset, MULTI_FILE_INDEX.getBitLength()); + public void setMultiFile(BitBuffer bitBuffer, int bitOffset, boolean value) { + bitBuffer.setIntPartial(getMultiFileIndex().encode(value), + getMultiFileIndex().getBitOffset() + bitOffset, getMultiFileIndex().getBitLength()); } @Deprecated @@ -99,11 +110,18 @@ public static void setFilePosition(BitBuffer fileIndex, int filePosition) { // fileIndex.setBytePartial(((byte) filePosition), FILE_POSITION_SHIFT, FILE_POSITION_SIZE); } + protected CategoricalIndexField buildMultiFile(IndexField prevIndex) { + return new CategoricalIndexField<>( + new IndexFieldConfiguration(IndexFieldConfiguration.Source.FILE, "multiFile", IndexFieldConfiguration.Type.CATEGORICAL), + prevIndex == null ? 0 : (prevIndex.getBitOffset() + prevIndex.getBitLength()), + new Boolean[]{false, true}, false); + } + private CategoricalIndexField buildVariantTypeIndexField(IndexField prevIndex) { return new CategoricalIndexField<>( new IndexFieldConfiguration(IndexFieldConfiguration.Source.VARIANT, VariantQueryParam.TYPE.key(), IndexFieldConfiguration.Type.CATEGORICAL), - prevIndex.getBitOffset() + prevIndex.getBitLength(), + prevIndex == null ? 0 : (prevIndex.getBitOffset() + prevIndex.getBitLength()), VariantTypeIndexCodec.TYPE_NUM_VALUES, new VariantTypeIndexCodec()); } @@ -112,7 +130,7 @@ private static CategoricalIndexField buildFilePositionIndexField(IndexF return new CategoricalIndexField<>( new IndexFieldConfiguration(IndexFieldConfiguration.Source.META, "filePosition", IndexFieldConfiguration.Type.CATEGORICAL), - prevIndex.getBitOffset() + prevIndex.getBitLength(), maxValues, + prevIndex == null ? 0 : (prevIndex.getBitOffset() + prevIndex.getBitLength()), maxValues, new IndexCodec() { @Override public int encode(Integer value) { @@ -135,8 +153,8 @@ public boolean ambiguous(int code) { }); } - private static List> buildStringIndexFields(List> fixedIndexFields, - List configurations) { + private static List> buildCustomIndexFields(List> fixedIndexFields, + List configurations) { int bitOffset = 0; for (IndexField indexField : fixedIndexFields) { if (indexField.getBitOffset() != bitOffset) { @@ -148,14 +166,14 @@ private static List> buildStringIndexFields(List> list = new ArrayList<>(); for (IndexFieldConfiguration conf : configurations) { - IndexField stringIndexField = buildStringIndexField(conf, bitOffset); + IndexField stringIndexField = buildCustomIndexField(conf, bitOffset); list.add(stringIndexField); bitOffset += stringIndexField.getBitLength(); } return list; } - private static IndexField buildStringIndexField(IndexFieldConfiguration conf, int bitOffset) { + private static IndexField buildCustomIndexField(IndexFieldConfiguration conf, int bitOffset) { switch (conf.getType()) { case RANGE: return new RangeIndexField(conf, bitOffset, conf.getThresholds()).from(s -> { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java index 9d3b020dae8..f7ff78068e8 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java @@ -27,12 +27,12 @@ public class HBaseToSampleIndexConverter implements Converter parsePendingColumn(byte[] column) { @@ -149,9 +149,9 @@ public Map> convertToMapSampleVariantIn for (Variant variant : map.get(gt)) { BitBuffer fileIndex; do { - fileIndex = bis.readBitBuffer(fileDataIndexesBitsLength); + fileIndex = bis.readBitBuffer(this.fileIndex.getBitsLength()); values.add(new SampleVariantIndexEntry(variant, fileIndex)); - } while (FileIndex.isMultiFile(fileIndex)); + } while (this.fileIndex.isMultiFile(fileIndex)); } } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConfiguration.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConfiguration.java index 7d3de8ec1ba..aa1d9189f49 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConfiguration.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConfiguration.java @@ -16,11 +16,13 @@ */ public class SampleIndexConfiguration { + private static final int DEFAULT_FILE_POSITION_SIZE_BITS = 4; private static final double[] QUAL_THRESHOLDS = new double[]{10, 20, 30}; private static final double[] DP_THRESHOLDS = new double[]{5, 10, 15, 20, 30, 40, 50}; private final List populationRanges = new ArrayList<>(); - private final List fileIndexFieldsConfiguration = new ArrayList<>(); + private final FileIndexConfiguration fileIndexConfiguration = new FileIndexConfiguration(); + private FileIndex fileIndex; private PopulationFrequencyIndex popFreqIndex; @@ -28,7 +30,7 @@ public SampleIndexConfiguration() { } public static SampleIndexConfiguration defaultConfiguration() { - return new SampleIndexConfiguration() + SampleIndexConfiguration sampleIndexConfiguration = new SampleIndexConfiguration() .addPopulationRange(new PopulationFrequencyRange("1kG_phase3", "ALL")) .addPopulationRange(new PopulationFrequencyRange("GNOMAD_GENOMES", "ALL")) .addFileIndexField(new IndexFieldConfiguration( @@ -37,8 +39,14 @@ public static SampleIndexConfiguration defaultConfiguration() { Source.FILE, StudyEntry.QUAL, QUAL_THRESHOLDS)) .addFileIndexField(new IndexFieldConfiguration( Source.SAMPLE, VCFConstants.DEPTH_KEY, DP_THRESHOLDS)); -// .addFileIndexField(new IndexFieldConfiguration( -// Source.SAMPLE, "padding", Type.CATEGORICAL, "add_two_extra_bits", "to_allow_backward", "compatibility")); + sampleIndexConfiguration.getFileIndexConfiguration().setFilePositionBits(DEFAULT_FILE_POSITION_SIZE_BITS); + + // Ensure backward compatibility with these two params: + sampleIndexConfiguration.addFileIndexField(new IndexFieldConfiguration( + Source.SAMPLE, "padding", Type.CATEGORICAL, "add_two_extra_bits", "to_allow_backward", "compatibility")); + sampleIndexConfiguration.getFileIndexConfiguration().setFixedFieldsFirst(false); + + return sampleIndexConfiguration; } public List getPopulationRanges() { @@ -63,26 +71,67 @@ public SampleIndexConfiguration addPopulationRange(PopulationFrequencyRange popu } public List getFileIndexFieldsConfiguration() { - return fileIndexFieldsConfiguration; + return fileIndexConfiguration.customFields; + } + + public FileIndexConfiguration getFileIndexConfiguration() { + return fileIndexConfiguration; } public FileIndex getFileIndex() { if (fileIndex == null) { - fileIndex = new FileIndex(this); + fileIndex = new FileIndex(this.getFileIndexConfiguration()); } return fileIndex; } public SampleIndexConfiguration addFileIndexField(IndexFieldConfiguration fileIndex) { - if (fileIndexFieldsConfiguration.contains(fileIndex)) { + if (fileIndexConfiguration.customFields.contains(fileIndex)) { throw new IllegalArgumentException("Duplicated file index '" + fileIndex.getKey() + "' in SampleIndexConfiguration"); } this.fileIndex = null; - this.fileIndexFieldsConfiguration.add(fileIndex); + this.fileIndexConfiguration.customFields.add(fileIndex); return this; } + public static class FileIndexConfiguration { + + private final List customFields = new ArrayList<>(); + private int filePositionBits = DEFAULT_FILE_POSITION_SIZE_BITS; + private boolean fixedFieldsFirst = true; + + public FileIndexConfiguration() { + } + + public FileIndexConfiguration(int filePositionBits, boolean fixedFieldsFirst) { + this.filePositionBits = filePositionBits; + this.fixedFieldsFirst = fixedFieldsFirst; + } + + public List getCustomFields() { + return customFields; + } + + public int getFilePositionBits() { + return filePositionBits; + } + + public FileIndexConfiguration setFilePositionBits(int filePositionBits) { + this.filePositionBits = filePositionBits; + return this; + } + + public boolean isFixedFieldsFirst() { + return fixedFieldsFirst; + } + + public FileIndexConfiguration setFixedFieldsFirst(boolean fixedFieldsFirst) { + this.fixedFieldsFirst = fixedFieldsFirst; + return this; + } + } + public static class PopulationFrequencyRange extends IndexFieldConfiguration { @Deprecated //TODO: This field should be private diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java index 53e3e56f8b1..8969b133d1d 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java @@ -141,7 +141,7 @@ public void addVariant(int sampleIdx, String gt, SampleVariantIndexEntry variant throw new IllegalArgumentException("Already loaded variant " + variantIndexEntry.getVariant()); } } - if (FileIndex.isMultiFile(variantIndexEntry.getFileIndex())) { + if (configuration.getFileIndex().isMultiFile(variantIndexEntry.getFileIndex())) { throw new IllegalArgumentException("Unexpected multi-file at variant " + variantIndexEntry.getVariant()); } sampleEntry.add(gt, variantIndexEntry); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java index ac97d2b13cd..64946dcd8ba 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java @@ -93,7 +93,7 @@ public Put build() { variants.add(variant); } else { // Mark previous variant as MultiFile - FileIndex.setMultiFile(fileIndexBuffer, offset - fileIndex.getBitsLength()); + fileIndex.setMultiFile(fileIndexBuffer, offset - fileIndex.getBitsLength()); } fileIndexBuffer.setBitBuffer(gtEntry.getFileIndex(), offset); offset += fileIndex.getBitsLength(); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java index c694f24c156..e3d104651d0 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java @@ -225,7 +225,7 @@ public boolean isMultiFileIndex() { public boolean isMultiFileIndex(int i) { // configuration.getFileIndex().getMultiFileIndex().readAndDecode() - return FileIndex.isMultiFile(fileIndex, i * fileDataIndexesBitsLength); + return configuration.getFileIndex().isMultiFile(fileIndex, i * fileDataIndexesBitsLength); } private int nextFileIndex() { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java index 4707b043ed6..2f59c73c9b9 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java @@ -9,7 +9,6 @@ import java.util.Objects; import static org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema.INTRA_CHROMOSOME_VARIANT_COMPARATOR; -import static org.opencb.opencga.storage.hadoop.variant.index.sample.FileIndex.isMultiFile; public class SampleVariantIndexEntry implements Comparable { @@ -18,6 +17,8 @@ public class SampleVariantIndexEntry implements Comparable Date: Mon, 8 Mar 2021 14:48:43 +0100 Subject: [PATCH 057/412] storage: fix rga filter conversion, #1693 --- .../core/rga/IndividualRgaConverter.java | 28 ++++++++++++++----- .../opencga/storage/core/rga/RgaUtils.java | 7 +++-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index eafbb071421..fd32eb7e70c 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -217,13 +217,23 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI List phenotypes = populatePhenotypes(knockoutByIndividual.getPhenotypes()); List disorders = populateDisorders(knockoutByIndividual.getDisorders()); - List phenotypeJson = new ArrayList<>(knockoutByIndividual.getPhenotypes().size()); - for (Phenotype phenotype : knockoutByIndividual.getPhenotypes()) { - phenotypeJson.add(JacksonUtils.getDefaultObjectMapper().writeValueAsString(phenotype)); + List phenotypeJson; + if (knockoutByIndividual.getPhenotypes() != null) { + phenotypeJson = new ArrayList<>(knockoutByIndividual.getPhenotypes().size()); + for (Phenotype phenotype : knockoutByIndividual.getPhenotypes()) { + phenotypeJson.add(JacksonUtils.getDefaultObjectMapper().writeValueAsString(phenotype)); + } + } else { + phenotypeJson = Collections.emptyList(); } - List disorderJson = new ArrayList<>(knockoutByIndividual.getDisorders().size()); - for (Disorder disorder : knockoutByIndividual.getDisorders()) { - disorderJson.add(JacksonUtils.getDefaultObjectMapper().writeValueAsString(disorder)); + List disorderJson; + if (knockoutByIndividual.getDisorders() != null) { + disorderJson = new ArrayList<>(knockoutByIndividual.getDisorders().size()); + for (Disorder disorder : knockoutByIndividual.getDisorders()) { + disorderJson.add(JacksonUtils.getDefaultObjectMapper().writeValueAsString(disorder)); + } + } else { + disorderJson = Collections.emptyList(); } List variantIds = transcript.getVariants().stream().map(KnockoutVariant::getId) @@ -322,7 +332,11 @@ private List processFilters(KnockoutTranscript transcript) throws RgaExc } // F - Filters if (StringUtils.isNotEmpty(variant.getFilter())) { - independentTerms.add(Collections.singletonList(RgaUtils.encode(variant.getFilter()))); + if (variant.getFilter().equalsIgnoreCase(RgaUtils.PASS)) { + independentTerms.add(Collections.singletonList(RgaUtils.encode(RgaUtils.PASS))); + } else { + independentTerms.add(Collections.singletonList(RgaUtils.encode(RgaUtils.NOT_PASS))); + } } // CT - Consequence types if (variant.getSequenceOntologyTerms() != null) { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java index e150ad98ef0..19ec7f0ec31 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java @@ -26,6 +26,9 @@ class RgaUtils { public static final String THOUSAND_GENOMES_STUDY = "1kG_phase3"; public static final String GNOMAD_GENOMES_STUDY = "GNOMAD_GENOMES"; + public static final String PASS = "PASS"; + public static final String NOT_PASS = "NOT_PASS"; + public static final Set ALL_PARAMS; public static final Map> PARAM_TYPES; @@ -39,8 +42,8 @@ class RgaUtils { ENCODE_MAP.put(KnockoutVariant.KnockoutType.DELETION_OVERLAP.name(), "DO"); // FILTER - ENCODE_MAP.put("PASS", "P"); - ENCODE_MAP.put("NOT_PASS", "NP"); + ENCODE_MAP.put(PASS, "P"); + ENCODE_MAP.put(NOT_PASS, "NP"); // CONSEQUENCE TYPE List consequenceTypeList = Arrays.asList("start_retained_variant", "upstream_variant", "3_prime_UTR_variant", From 967bc28edf275fdf42a21137bff2af44c461c948 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 8 Mar 2021 16:24:06 +0100 Subject: [PATCH 058/412] storage: avoid possible NPE, #1693 --- .../storage/core/rga/IndividualRgaConverter.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index fd32eb7e70c..803487b72bd 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -266,10 +266,13 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI numParents++; } - RgaDataModel model = new RgaDataModel(id, individualId, knockoutByIndividual.getSampleId(), - knockoutByIndividual.getSex().name(), phenotypes, disorders, knockoutByIndividual.getFatherId(), - knockoutByIndividual.getMotherId(), numParents, gene.getId(), gene.getName(), "", "", - "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, knockoutTypes, + String sex = knockoutByIndividual.getSex() != null + ? knockoutByIndividual.getSex().name() + : IndividualProperty.Sex.UNKNOWN.name(); + + RgaDataModel model = new RgaDataModel(id, individualId, knockoutByIndividual.getSampleId(), sex, phenotypes, disorders, + knockoutByIndividual.getFatherId(), knockoutByIndividual.getMotherId(), numParents, gene.getId(), + gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, knockoutTypes, filters, consequenceTypes, popFreqs, compoundFilters, phenotypeJson, disorderJson, variantJson); result.add(model); } From 0396658d3d61139a87c065eefda3ffb300b2d443 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 9 Mar 2021 11:07:28 +0100 Subject: [PATCH 059/412] catalog: move cohort creation implementation to manager --- .../VariantFileIndexerOperationManager.java | 6 +- .../VariantStatsOperationManager.java | 5 +- ...atalogStorageMetadataSynchronizerTest.java | 4 +- .../analysis/variant/VariantAnalysisTest.java | 7 +- .../operations/StatsVariantStorageTest.java | 6 +- .../app/cli/analysis/InternalMainTest.java | 28 +-- .../opencga/catalog/audit/AuditManager.java | 5 + .../catalog/managers/CohortManager.java | 163 +++++++++++++++--- .../catalog/managers/CatalogManagerTest.java | 2 +- .../opencga/server/rest/CohortWSServer.java | 75 +------- 10 files changed, 178 insertions(+), 123 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManager.java index 3d70332ad55..7527746a65e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManager.java @@ -37,6 +37,7 @@ import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.models.cohort.Cohort; +import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.core.models.cohort.CohortStatus; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.Enums; @@ -538,8 +539,9 @@ private Cohort createDefaultCohortIfNeeded(String studyFqn, String sessionId) th } private Cohort createDefaultCohort(String studyFqn, String sessionId) throws CatalogException { - return catalogManager.getCohortManager().create(studyFqn, StudyEntry.DEFAULT_COHORT, Enums.CohortType.COLLECTION, - DEFAULT_COHORT_DESCRIPTION, Collections.emptyList(), null, null, sessionId).first(); + return catalogManager.getCohortManager().create(studyFqn, new CohortCreateParams(StudyEntry.DEFAULT_COHORT, + Enums.CohortType.COLLECTION, DEFAULT_COHORT_DESCRIPTION, Collections.emptyList(), null, null, null), null, null, + QueryOptions.empty(), sessionId).first(); } private void updateDefaultCohortStatus(Study study, StorageEngineException exception, String sessionId) throws CatalogException { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantStatsOperationManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantStatsOperationManager.java index 10faa7eb162..d8203855aa4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantStatsOperationManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantStatsOperationManager.java @@ -29,6 +29,7 @@ import org.opencb.opencga.catalog.db.api.CohortDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.core.models.cohort.Cohort; +import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.core.models.cohort.CohortStatus; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.sample.Sample; @@ -237,8 +238,8 @@ private List createCohortsIfNeeded(String studyId, Set cohortNam .collect(Collectors.toSet()); for (String cohortName : cohortNames) { if (!catalogCohorts.contains(cohortName)) { - DataResult cohort = catalogManager.getCohortManager().create(studyId, cohortName, Enums.CohortType.COLLECTION, "", - Collections.emptyList(), null, null, sessionId); + DataResult cohort = catalogManager.getCohortManager().create(studyId, new CohortCreateParams(cohortName, + Enums.CohortType.COLLECTION, "", Collections.emptyList(), null, null, null), null, null, null, sessionId); logger.info("Creating cohort {}", cohortName); cohorts.add(cohort.first().getId()); } else { diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/CatalogStorageMetadataSynchronizerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/CatalogStorageMetadataSynchronizerTest.java index a751ff5e777..55d6c4692b8 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/CatalogStorageMetadataSynchronizerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/CatalogStorageMetadataSynchronizerTest.java @@ -27,6 +27,7 @@ import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.catalog.utils.FileMetadataReader; import org.opencb.opencga.core.models.cohort.Cohort; +import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.core.models.cohort.CohortStatus; import org.opencb.opencga.core.models.cohort.CohortUpdateParams; import org.opencb.opencga.core.models.file.File; @@ -108,7 +109,8 @@ public static void beforeClass() throws Exception { // files.add(create("1000g_batches/1501-2000.filtered.10k.chr22.phase3_shapeit2_mvncall_integrated_v5.20130502.genotypes.vcf.gz", true)); // files.add(create("1000g_batches/2001-2504.filtered.10k.chr22.phase3_shapeit2_mvncall_integrated_v5.20130502.genotypes.vcf.gz")); String cohortName = "ALL"; - Cohort cohort = catalogManager.getCohortManager().create(studyId, cohortName, null, null, Collections.emptyList(), null, null, sessionId).first(); + Cohort cohort = catalogManager.getCohortManager().create(studyId, new CohortCreateParams().setId(cohortName), null, null, null, + sessionId).first(); cohortId = cohort.getId(); cohortUid = cohort.getUid(); files.add(create("platinum/1K.end.platinum-genomes-vcf-NA12877_S1.genome.vcf.gz")); diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java index 7aa7acb7d17..b9a7ebf935e 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java @@ -29,6 +29,7 @@ import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; +import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; @@ -162,10 +163,8 @@ public void setUp() throws Throwable { } } - List samples = catalogManager.getSampleManager().get(STUDY, file.getSampleIds().subList(0, 2), QueryOptions.empty(), token).getResults(); - catalogManager.getCohortManager().create(STUDY, "c1", null, null, samples, null, null, token); - samples = catalogManager.getSampleManager().get(STUDY, file.getSampleIds().subList(2, 4), QueryOptions.empty(), token).getResults(); - catalogManager.getCohortManager().create(STUDY, "c2", null, null, samples, null, null, token); + catalogManager.getCohortManager().create(STUDY, new CohortCreateParams().setId("c1").setSamples(file.getSampleIds().subList(0, 2)), null, null, null, token); + catalogManager.getCohortManager().create(STUDY, new CohortCreateParams().setId("c2").setSamples(file.getSampleIds().subList(2, 4)), null, null, null, token); Phenotype phenotype = new Phenotype("phenotype", "phenotype", ""); Disorder disorder = new Disorder("disorder", "disorder", "", "", Collections.singletonList(phenotype), Collections.emptyMap()); diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/StatsVariantStorageTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/StatsVariantStorageTest.java index 9b14351358d..291da4113bb 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/StatsVariantStorageTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/StatsVariantStorageTest.java @@ -32,6 +32,7 @@ import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.cohort.Cohort; +import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.core.models.cohort.CohortStatus; import org.opencb.opencga.core.models.cohort.CohortUpdateParams; import org.opencb.opencga.core.models.common.Enums; @@ -78,9 +79,8 @@ public void before () throws Exception { for (int i = 0; i < coh.length; i++) { List sampleIds = file.getSampleIds().subList(file.getSampleIds().size() / coh.length * i, file.getSampleIds().size() / coh.length * (i + 1)); - List samples = catalogManager.getSampleManager().get(studyId, sampleIds, QueryOptions.empty(), sessionId).getResults(); - Cohort cohort = catalogManager.getCohortManager().create(studyId, "coh" + i, Enums.CohortType.CONTROL_SET, "", samples, null, - null, sessionId).first(); + Cohort cohort = catalogManager.getCohortManager().create(studyId, new CohortCreateParams("coh" + i, + Enums.CohortType.CONTROL_SET, "", sampleIds, null, null, null), null, null, null, sessionId).first(); coh[i] = cohort.getId(); } QueryOptions queryOptions = new QueryOptions(VariantStorageOptions.ANNOTATE.key(), false); diff --git a/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java b/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java index 515a871a814..38e6f61c149 100644 --- a/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java +++ b/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java @@ -36,6 +36,7 @@ import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.core.models.cohort.CohortStatus; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; @@ -231,11 +232,10 @@ public void testVariantIndex() throws Exception { "-o", opencga.createTmpOutdir(studyId, "stats_all", sessionId)); assertEquals(CohortStatus.READY, catalogManager.getCohortManager().search(studyId, new Query(CohortDBAdaptor.QueryParams.ID.key(), "ALL"), null, sessionId).first().getInternal().getStatus().getName()); - List file1Samples = catalogManager.getSampleManager().get(studyId, file1.getSampleIds(), QueryOptions.empty(), sessionId).getResults(); - List file2Samples = catalogManager.getSampleManager().get(studyId, file2.getSampleIds(), QueryOptions.empty(), sessionId).getResults(); - - catalogManager.getCohortManager().create(studyId, "coh1", Enums.CohortType.CONTROL_SET, "", file1Samples, null, null, sessionId); - catalogManager.getCohortManager().create(studyId, "coh2", Enums.CohortType.CONTROL_SET, "", file2Samples, null, null, sessionId); + catalogManager.getCohortManager().create(studyId, new CohortCreateParams("coh1", Enums.CohortType.CONTROL_SET, "", + file1.getSampleIds(), null, null, null), null, null, null, sessionId); + catalogManager.getCohortManager().create(studyId, new CohortCreateParams("coh2", Enums.CohortType.CONTROL_SET, "", + file2.getSampleIds(), null, null, null), null, null, null, sessionId); execute("variant", "stats", "--session-id", sessionId, @@ -257,15 +257,17 @@ public void testVariantIndexAndQuery() throws CatalogException, IOException { // File file1 = opencga.createFile(studyId, "10k.chr22.phase3_shapeit2_mvncall_integrated_v5.20130502.genotypes.vcf.gz", sessionId); DataResult allSamples = catalogManager.getSampleManager().search(studyId, new Query(), new QueryOptions(), sessionId); - String c1 = catalogManager.getCohortManager().create(studyId, "C1", Enums.CohortType.CONTROL_SET, "", allSamples.getResults().subList(0, - allSamples.getResults().size() / 2), null, null, sessionId).first().getId(); - String c2 = catalogManager.getCohortManager().create(studyId, "C2", Enums.CohortType.CONTROL_SET, "", allSamples.getResults().subList(allSamples.getResults().size() - / 2 + 1, allSamples.getResults().size()), null, null, sessionId).first().getId(); - String c3 = catalogManager.getCohortManager().create(studyId, "C3", Enums.CohortType.CONTROL_SET, "", allSamples.getResults().subList(0, 1), null, - null, sessionId).first().getId(); + List sampleIds = allSamples.getResults().stream().map(Sample::getId).collect(Collectors.toList()); + + String c1 = catalogManager.getCohortManager().create(studyId, new CohortCreateParams("C1", Enums.CohortType.CONTROL_SET, "", + sampleIds.subList(0, allSamples.getResults().size() / 2), null, null, null), null, null, null, sessionId).first().getId(); + String c2 = catalogManager.getCohortManager().create(studyId, new CohortCreateParams("C2", Enums.CohortType.CONTROL_SET, "", + sampleIds.subList(sampleIds.size() / 2 + 1, allSamples.getResults().size()), null, null, null), null, null, null, sessionId).first().getId(); + String c3 = catalogManager.getCohortManager().create(studyId, new CohortCreateParams("C3", Enums.CohortType.CONTROL_SET, "", + sampleIds.subList(0, 1), null, null, null), null, null, null, sessionId).first().getId(); Sample sample = catalogManager.getSampleManager().create(studyId, new Sample().setId("Sample"), null, sessionId).first(); - String c4 = catalogManager.getCohortManager().create(studyId, "C4", Enums.CohortType.CONTROL_SET, "", Collections.singletonList(sample), - null, null, sessionId).first().getId(); + String c4 = catalogManager.getCohortManager().create(studyId, new CohortCreateParams("C4", Enums.CohortType.CONTROL_SET, "", + Collections.singletonList(sample.getId()), null, null, null), null, null, null, sessionId).first().getId(); // Index file1 execute("variant", "index", diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java index fd59c9cf73d..0fdcbd47250 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java @@ -174,6 +174,11 @@ public void audit(String userId, Enums.Action action, Enums.Resource resource, S params, status, attributes); } + public void audit(String operationId, String userId, Enums.Action action, Enums.Resource resource, String resourceId, + String resourceUuid, String studyId, String studyUuid, ObjectMap params, AuditRecord.Status status) { + audit(operationId, userId, action, resource, resourceId, resourceUuid, studyId, studyUuid, params, status, new ObjectMap()); + } + public void audit(String operationId, String userId, Enums.Action action, Enums.Resource resource, String resourceId, String resourceUuid, String studyId, String studyUuid, ObjectMap params, AuditRecord.Status status, ObjectMap attributes) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java index 8f411f329dd..c63aa64600b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java @@ -17,7 +17,9 @@ package org.opencb.opencga.catalog.managers; import com.fasterxml.jackson.core.JsonProcessingException; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.StopWatch; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; @@ -29,6 +31,7 @@ import org.opencb.opencga.catalog.db.api.*; import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.exceptions.CatalogParameterException; import org.opencb.opencga.catalog.models.InternalGetDataResult; import org.opencb.opencga.catalog.stats.solr.CatalogSolrManager; import org.opencb.opencga.catalog.utils.AnnotationUtils; @@ -45,6 +48,7 @@ import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.study.StudyAclEntry; +import org.opencb.opencga.core.models.study.Variable; import org.opencb.opencga.core.models.study.VariableSet; import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.Logger; @@ -53,6 +57,7 @@ import javax.annotation.Nullable; import java.io.IOException; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; @@ -146,24 +151,128 @@ private OpenCGAResult getCohort(long studyUid, String cohortUuid, QueryO return cohortDBAdaptor.get(query, options); } - @Deprecated - public OpenCGAResult create(long studyId, String name, Enums.CohortType type, String description, List samples, - List annotationSetList, Map attributes, String sessionId) - throws CatalogException { - return create(String.valueOf(studyId), name, type, description, samples, annotationSetList, attributes, sessionId); - } + public OpenCGAResult create(String studyStr, CohortCreateParams cohortParams, String variableSetId, String variableId, + QueryOptions options, String token) throws CatalogException { + ParamUtils.checkObj(cohortParams, "CohortCreateParams"); + options = ParamUtils.defaultObject(options, QueryOptions::new); - public OpenCGAResult create(String studyId, String name, Enums.CohortType type, String description, List samples, - List annotationSetList, Map attributes, String sessionId) - throws CatalogException { - Cohort cohort = new Cohort(name, type, "", description, samples, annotationSetList, -1, attributes); - return create(studyId, cohort, QueryOptions.empty(), sessionId); + String userId = userManager.getUserId(token); + Study study = studyManager.resolveId(studyStr, userId, StudyManager.INCLUDE_VARIABLE_SET); + authorizationManager.checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.WRITE_COHORTS); + + String operationId = UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.AUDIT); + + ObjectMap auditParams = new ObjectMap() + .append("study", studyStr) + .append("cohortParams", cohortParams) + .append("variableSetId", variableSetId) + .append("variableId", variableId) + .append("options", options) + .append("token", token); + + List cohorts = new LinkedList<>(); + try { + if (StringUtils.isNotEmpty(variableId) && CollectionUtils.isNotEmpty(cohortParams.getSamples())) { + throw new CatalogParameterException("Can only create a cohort given list of sampleIds or a categorical variable name"); + } + + if (CollectionUtils.isNotEmpty(cohortParams.getSamples())) { + List sampleList = catalogManager.getSampleManager().internalGet(study.getUid(), cohortParams.getSamples(), + SampleManager.INCLUDE_SAMPLE_IDS, userId, false).getResults(); + cohorts.add(new Cohort(cohortParams.getId(), cohortParams.getType(), "", cohortParams.getDescription(), sampleList, 0, + cohortParams.getAnnotationSets(), 1, + cohortParams.getStatus() != null ? cohortParams.getStatus().toCustomStatus() : new CustomStatus(), null, + cohortParams.getAttributes())); + + } else if (StringUtils.isNotEmpty(variableSetId)) { + // Look for variable set + VariableSet variableSet = null; + for (VariableSet auxVariableSet : study.getVariableSets()) { + if (auxVariableSet.equals(variableSetId)) { + variableSet = auxVariableSet; + break; + } + } + if (variableSet == null) { + throw new CatalogException("VariableSet '" + variableSetId + "' not found."); + } + + // Look for variable + // TODO: We should also look in nested variables + Variable variable = null; + for (Variable v : variableSet.getVariables()) { + if (v.getId().equals(variableId)) { + variable = v; + break; + } + } + if (variable == null) { + throw new CatalogException("Variable '" + variableId + "' does not exist in VariableSet " + variableSet.getId()); + } + if (variable.getType() != Variable.VariableType.CATEGORICAL) { + throw new CatalogException("Variable '" + variableId + "' is not a categorical variable. Please, choose a categorical " + + "variable"); + } + for (String value : variable.getAllowedValues()) { + OpenCGAResult sampleResults = catalogManager.getSampleManager().search(study.getFqn(), + new Query(Constants.ANNOTATION, variableSetId + ":" + variableId + "=" + value), + SampleManager.INCLUDE_SAMPLE_IDS, token); + + cohorts.add(new Cohort(cohortParams.getId(), cohortParams.getType(), "", cohortParams.getDescription(), + sampleResults.getResults(), 0, cohortParams.getAnnotationSets(), 1, + cohortParams.getStatus() != null ? cohortParams.getStatus().toCustomStatus() : new CustomStatus(), null, + cohortParams.getAttributes())); + } + } else { + //Create empty cohort + cohorts.add(new Cohort(cohortParams.getId(), cohortParams.getType(), "", cohortParams.getDescription(), + Collections.emptyList(), cohortParams.getAnnotationSets(), -1, null)); + } + } catch (CatalogException e) { + auditManager.audit(operationId, userId, Enums.Action.CREATE, Enums.Resource.COHORT, "", "", study.getId(), + study.getUuid(), auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + throw e; + } + + auditManager.initAuditBatch(operationId); + List eventList = new LinkedList<>(); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + for (Cohort cohort : cohorts) { + try { + validateNewCohort(study, cohort); + cohortDBAdaptor.insert(study.getUid(), cohort, study.getVariableSets(), options); + auditManager.audit(operationId, userId, Enums.Action.CREATE, Enums.Resource.COHORT, cohort.getId(), cohort.getUuid(), + study.getId(), study.getUuid(), auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + } catch (CatalogException e) { + Event event = new Event(Event.Type.ERROR, cohort.getId(), e.getMessage()); + eventList.add(event); + + logger.error("Could not create cohort {}: {}", cohort.getId(), e.getMessage(), e); + auditManager.audit(operationId, userId, Enums.Action.CREATE, Enums.Resource.COHORT, cohort.getId(), cohort.getUuid(), + study.getId(), study.getUuid(), auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + } + } + auditManager.finishAuditBatch(operationId); + stopWatch.stop(); + + Query query = new Query(CohortDBAdaptor.QueryParams.STUDY_UID.key(), study.getUid()) + .append(CohortDBAdaptor.QueryParams.UID.key(), cohorts.stream() + .map(Cohort::getUid) + .filter(uid -> uid > 0) + .collect(Collectors.toList())); + OpenCGAResult result = cohortDBAdaptor.get(study.getUid(), query, options, userId); + result.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + result.setEvents(eventList); + + return result; } public OpenCGAResult generate(String studyStr, Query sampleQuery, Cohort cohort, QueryOptions options, String token) throws CatalogException { String userId = userManager.getUserId(token); Study study = studyManager.resolveId(studyStr, userId, StudyManager.INCLUDE_VARIABLE_SET); + authorizationManager.checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.WRITE_COHORTS); ObjectMap auditParams = new ObjectMap() .append("studyId", studyStr) @@ -201,6 +310,7 @@ public OpenCGAResult create(String studyStr, Cohort cohort, QueryOptions String userId = userManager.getUserId(token); Study study = studyManager.resolveId(studyStr, userId, StudyManager.INCLUDE_VARIABLE_SET); + authorizationManager.checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.WRITE_COHORTS); ObjectMap auditParams = new ObjectMap() .append("study", studyStr) @@ -208,6 +318,14 @@ public OpenCGAResult create(String studyStr, Cohort cohort, QueryOptions .append("options", options) .append("token", token); try { + if (CollectionUtils.isNotEmpty(cohort.getSamples())) { + // Look for the samples + InternalGetDataResult sampleResult = catalogManager.getSampleManager().internalGet(study.getUid(), + cohort.getSamples().stream().map(Sample::getId).collect(Collectors.toList()), SampleManager.INCLUDE_SAMPLE_IDS, + userId, false); + cohort.setSamples(sampleResult.getResults()); + } + OpenCGAResult cohortResult = privateCreate(study, cohort, options, userId); auditManager.auditCreate(userId, Enums.Resource.COHORT, cohort.getId(), cohort.getUuid(), study.getId(), study.getUuid(), auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); @@ -222,13 +340,13 @@ public OpenCGAResult create(String studyStr, Cohort cohort, QueryOptions OpenCGAResult privateCreate(Study study, Cohort cohort, QueryOptions options, String userId) throws CatalogException { authorizationManager.checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.WRITE_COHORTS); - validateNewCohort(study, cohort, userId); + validateNewCohort(study, cohort); cohortDBAdaptor.insert(study.getUid(), cohort, study.getVariableSets(), options); return getCohort(study.getUid(), cohort.getUuid(), options); } - void validateNewCohort(Study study, Cohort cohort, String userId) throws CatalogException { + void validateNewCohort(Study study, Cohort cohort) throws CatalogException { ParamUtils.checkObj(cohort, "Cohort"); ParamUtils.checkParameter(cohort.getId(), "id"); ParamUtils.checkObj(cohort.getSamples(), "Sample list"); @@ -248,22 +366,15 @@ void validateNewCohort(Study study, Cohort cohort, String userId) throws Catalog validateNewAnnotationSets(study.getVariableSets(), cohort.getAnnotationSets()); if (!cohort.getSamples().isEmpty()) { - // Remove possible duplicates - Map sampleMap = new HashMap<>(); + // Remove possible duplicates and ensure we have all the internal uids + Map sampleMap = new HashMap<>(); for (Sample sample : cohort.getSamples()) { - sampleMap.put(sample.getId(), sample); + if (sample.getUid() <= 0) { + throw new CatalogException("Internal error. Missing sample uid."); + } + sampleMap.put(sample.getUid(), sample); } cohort.setSamples(new ArrayList<>(sampleMap.values())); - - Query query = new Query() - .append(SampleDBAdaptor.QueryParams.STUDY_UID.key(), study.getUid()) - .append(SampleDBAdaptor.QueryParams.UID.key(), cohort.getSamples().stream() - .map(Sample::getUid) - .collect(Collectors.toList())); - OpenCGAResult count = sampleDBAdaptor.count(query); - if (count.getNumMatches() != cohort.getSamples().size()) { - throw new CatalogException("Error: Some samples do not exist in the study " + study.getFqn()); - } } cohort.setNumSamples(cohort.getSamples().size()); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java index 0f5146195d4..b02bf5b6c8a 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java @@ -1154,7 +1154,7 @@ public void testGetAllCohorts() throws CatalogException { @Test public void testCreateCohortFail() throws CatalogException { thrown.expect(CatalogException.class); - List sampleList = Arrays.asList(new Sample().setUid(23L), new Sample().setUid(4L), new Sample().setUid(5L)); + List sampleList = Arrays.asList(new Sample().setId("a"), new Sample().setId("b"), new Sample().setId("c")); catalogManager.getCohortManager().create(studyFqn, new Cohort().setId("MyCohort").setType(Enums.CohortType.FAMILY).setSamples(sampleList), null, token); } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/CohortWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/CohortWSServer.java index 97786b61ea4..da9d1f3a7b0 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/CohortWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/CohortWSServer.java @@ -18,36 +18,29 @@ import io.swagger.annotations.*; import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.*; -import org.opencb.commons.utils.ListUtils; import org.opencb.opencga.analysis.cohort.CohortTsvAnnotationLoader; import org.opencb.opencga.catalog.db.api.CohortDBAdaptor; -import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CohortManager; -import org.opencb.opencga.catalog.managers.SampleManager; import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.VersionException; import org.opencb.opencga.core.models.AclParams; import org.opencb.opencga.core.models.cohort.*; -import org.opencb.opencga.core.models.common.AnnotationSet; -import org.opencb.opencga.core.models.common.CustomStatus; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.common.TsvAnnotationParams; import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.core.models.sample.Sample; -import org.opencb.opencga.core.models.study.Variable; -import org.opencb.opencga.core.models.study.VariableSet; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.QueryParam; import javax.ws.rs.*; import javax.ws.rs.core.*; import java.io.IOException; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Created by jacobo on 15/12/14. @@ -65,58 +58,6 @@ public CohortWSServer(@Context UriInfo uriInfo, @Context HttpServletRequest http cohortManager = catalogManager.getCohortManager(); } - private Response createCohort(String studyStr, String variableSetId, CohortCreateParams cohortParams, String variableName) { - try { - List> cohorts = new LinkedList<>(); - if (StringUtils.isNotEmpty(variableName) && ListUtils.isNotEmpty(cohortParams.getSamples())) { - return createErrorResponse("", "Can only create a cohort given list of sampleIds or a categorical variable name"); - } - - if (ListUtils.isNotEmpty(cohortParams.getSamples())) { - DataResult queryResult = catalogManager.getSampleManager().get(studyStr, cohortParams.getSamples(), - SampleManager.INCLUDE_SAMPLE_IDS, token); - List sampleList = queryResult.getResults(); - Cohort cohort = new Cohort(cohortParams.getId(), cohortParams.getType(), "", cohortParams.getDescription(), sampleList, 0, - cohortParams.getAnnotationSets(), 1, - cohortParams.getStatus() != null ? cohortParams.getStatus().toCustomStatus() : new CustomStatus(), null, - cohortParams.getAttributes()); - DataResult cohortQueryResult = catalogManager.getCohortManager().create(studyStr, cohort, null, token); - cohorts.add(cohortQueryResult); - } else if (StringUtils.isNotEmpty(variableSetId)) { - VariableSet variableSet = catalogManager.getStudyManager().getVariableSet(studyStr, variableSetId, null, token).first(); - Variable variable = null; - for (Variable v : variableSet.getVariables()) { - if (v.getId().equals(variableName)) { - variable = v; - break; - } - } - if (variable == null) { - return createErrorResponse("", "Variable " + variableName + " does not exist in variableSet " + variableSet.getId()); - } - if (variable.getType() != Variable.VariableType.CATEGORICAL) { - return createErrorResponse("", "Can only create cohorts by variable, when is a categorical variable"); - } - for (String s : variable.getAllowedValues()) { - QueryOptions samplesQOptions = new QueryOptions(QueryOptions.INCLUDE, "projects.studies.samples.id"); - Query samplesQuery = new Query(SampleDBAdaptor.QueryParams.ANNOTATION.key() + "." + variableName, s) - .append("variableSetId", variableSet.getUid()); - - cohorts.add(createCohort(studyStr, cohortParams.getId() + "_" + s, cohortParams.getType(), cohortParams.getDescription(), - cohortParams.getAnnotationSets(), samplesQuery, samplesQOptions)); - } - } else { - //Create empty cohort - Cohort cohort = new Cohort(cohortParams.getId(), cohortParams.getType(), "", cohortParams.getDescription(), - Collections.emptyList(), cohortParams.getAnnotationSets(), -1, null); - cohorts.add(catalogManager.getCohortManager().create(studyStr, cohort, null, token)); - } - return createOkResponse(cohorts); - } catch (Exception e) { - return createErrorResponse(e); - } - } - @POST @Path("/create") @ApiOperation(value = "Create a cohort", notes = "A cohort can be created by providing a list of SampleIds, " + @@ -131,7 +72,7 @@ public Response createCohort( @ApiParam(value = "JSON containing cohort information", required = true) CohortCreateParams params) { try { params = ObjectUtils.defaultIfNull(params, new CohortCreateParams()); - return createCohort(studyStr, variableSet, params, variableName); + return createOkResponse(cohortManager.create(studyStr, params, variableSet, variableName, queryOptions, token)); } catch (Exception e) { return createErrorResponse(e); } @@ -258,14 +199,6 @@ public Response distinct( } } - private DataResult createCohort(String studyStr, String cohortId, Enums.CohortType type, String cohortDescription, - List annotationSetList, Query query, QueryOptions queryOptions) - throws CatalogException { - DataResult queryResult = catalogManager.getSampleManager().search(studyStr, query, queryOptions, token); - Cohort cohort = new Cohort(cohortId, type, "", cohortDescription, queryResult.getResults(), annotationSetList, -1, null); - return catalogManager.getCohortManager().create(studyStr, cohort, null, token); - } - @POST @Path("/update") @Consumes(MediaType.APPLICATION_JSON) From c778cdfb005d99ab75182629173077ca74a0272d Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 9 Mar 2021 15:25:42 +0100 Subject: [PATCH 060/412] server: populate FederationNode object, closes #1715 --- .../opencga/core/response/FederationNode.java | 18 ++++++++++++++- .../opencga/server/rest/OpenCGAWSServer.java | 23 ++++++++++++------- .../server/rest/ParamExceptionMapper.java | 2 +- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/response/FederationNode.java b/opencga-core/src/main/java/org/opencb/opencga/core/response/FederationNode.java index 54bc82f3e80..70231f41673 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/response/FederationNode.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/response/FederationNode.java @@ -19,14 +19,20 @@ public class FederationNode { private String id; + private String uri; private String commit; private String version; public FederationNode() { } - public FederationNode(String id, String commit, String version) { + public FederationNode(String uri, String commit, String version) { + this("primary", uri, commit, version); + } + + public FederationNode(String id, String uri, String commit, String version) { this.id = id; + this.uri = uri; this.commit = commit; this.version = version; } @@ -35,6 +41,7 @@ public FederationNode(String id, String commit, String version) { public String toString() { final StringBuilder sb = new StringBuilder("FederationNode{"); sb.append("id='").append(id).append('\''); + sb.append(", uri='").append(uri).append('\''); sb.append(", commit='").append(commit).append('\''); sb.append(", version='").append(version).append('\''); sb.append('}'); @@ -50,6 +57,15 @@ public FederationNode setId(String id) { return this; } + public String getUri() { + return uri; + } + + public FederationNode setUri(String uri) { + this.uri = uri; + return this; + } + public String getCommit() { return commit; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java index acbceb3fc1d..140dfdd30fd 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java @@ -49,6 +49,7 @@ import org.opencb.opencga.core.models.common.GenericRecordAvroJsonMixin; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.study.Study; +import org.opencb.opencga.core.response.FederationNode; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.response.RestResponse; import org.opencb.opencga.core.tools.ToolParams; @@ -509,10 +510,11 @@ protected void addParamIfTrue(Map params, String key, boolean va } protected Response createErrorResponse(Throwable e) { - return createErrorResponse(e, startTime, apiVersion, requestDescription, params); + return createErrorResponse(e, startTime, apiVersion, requestDescription, params, uriInfo); } - public static Response createErrorResponse(Throwable e, long startTime, String apiVersion, String requestDescription, ObjectMap params) { + public static Response createErrorResponse(Throwable e, long startTime, String apiVersion, String requestDescription, ObjectMap params, + UriInfo uriInfo) { // First we print the exception in Server logs logger.error("Catch error: " + e.getMessage(), e); @@ -524,7 +526,8 @@ public static Response createErrorResponse(Throwable e, long startTime, String a addErrorEvent(queryResponse, e); OpenCGAResult result = OpenCGAResult.empty(); - queryResponse.setResponses(Arrays.asList(result)); + setFederationServer(result, uriInfo); + queryResponse.setResponses(Collections.singletonList(result)); Response.StatusType errorStatus; if (e instanceof WebApplicationException @@ -549,6 +552,7 @@ protected Response createErrorResponse(String errorMessage, OpenCGAResult result dataResponse.setApiVersion(apiVersion); dataResponse.setParams(params); addErrorEvent(dataResponse, errorMessage); + setFederationServer(result, uriInfo); dataResponse.setResponses(Arrays.asList(result)); Response response = Response.fromResponse(createJsonResponse(dataResponse)).status(Response.Status.INTERNAL_SERVER_ERROR).build(); @@ -631,6 +635,9 @@ protected Response createOkResponse(Object obj, List events) { list.add(new OpenCGAResult<>(0, Collections.emptyList(), 1, Collections.singletonList(obj), 1)); } } + for (OpenCGAResult openCGAResult : list) { + setFederationServer(openCGAResult, uriInfo); + } queryResponse.setResponses(list); Response response = createJsonResponse(queryResponse); @@ -652,15 +659,15 @@ protected Response createRawOkResponse(Object obj) { } } - //Response methods - protected Response createOkResponse(Object o1, MediaType o2) { - return buildResponse(Response.ok(o1, o2)); - } - protected Response createOkResponse(InputStream o1, MediaType o2, String fileName) { return buildResponse(Response.ok(o1, o2).header("content-disposition", "attachment; filename =" + fileName)); } + private static void setFederationServer(OpenCGAResult result, UriInfo uriInfo) { + result.setNode(new FederationNode(uriInfo.getBaseUri().toString(), GitRepositoryState.get().getCommitId(), + GitRepositoryState.get().getBuildVersion())); + } + void logResponse(Response.StatusType statusInfo) { logResponse(statusInfo, null, startTime, requestDescription); } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/ParamExceptionMapper.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/ParamExceptionMapper.java index 5ad3a9befc4..df787e7b219 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/ParamExceptionMapper.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/ParamExceptionMapper.java @@ -61,7 +61,7 @@ public Response toResponse(Exception exception) { } } - return OpenCGAWSServer.createErrorResponse(exception, startTime, apiVersion, requestDescription, params); + return OpenCGAWSServer.createErrorResponse(exception, startTime, apiVersion, requestDescription, params, uriInfo); } } \ No newline at end of file From 231c2839e506ff124afe83958e9d7a6e0ed4e472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 9 Mar 2021 14:41:21 +0000 Subject: [PATCH 061/412] analysis: Allow skip genes file. Add clinical significance field. --- .../analysis/tools/OpenCgaToolScopeStudy.java | 5 + .../variant/knockout/KnockoutAnalysis.java | 139 ++++++++++-------- .../knockout/KnockoutAnalysisExecutor.java | 10 ++ .../KnockoutLocalAnalysisExecutor.java | 134 +++++++++-------- .../VariantInternalCommandExecutor.java | 1 + .../options/VariantCommandOptions.java | 3 + .../analysis/VariantCommandExecutor.java | 1 + .../analysis/knockout/KnockoutVariant.java | 89 ++++++++++- .../variant/KnockoutAnalysisParams.java | 14 +- .../storage/core/rga/RgaUtilsTest.java | 12 +- 10 files changed, 272 insertions(+), 136 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaToolScopeStudy.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaToolScopeStudy.java index c3f7f9a62d4..2b4180212b4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaToolScopeStudy.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaToolScopeStudy.java @@ -36,6 +36,11 @@ public OpenCgaToolScopeStudy setStudy(String study) { return this; } + /** + * Get the study Fully Qualified Name. + * The study is validated during {@link #check()} + * @return study FQN + */ public String getStudy() { return study; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index 09638d848a8..de8e84681cc 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -26,6 +26,7 @@ import org.opencb.biodata.models.clinical.interpretation.DiseasePanel; import org.opencb.biodata.models.core.Gene; import org.opencb.biodata.models.core.Transcript; +import org.opencb.opencga.core.tools.annotations.ToolParams; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -59,8 +60,8 @@ public class KnockoutAnalysis extends OpenCgaToolScopeStudy { protected static final String KNOCKOUT_INDIVIDUALS_JSON = "knockout.individuals.json.gz"; protected static final String KNOCKOUT_GENES_JSON = "knockout.genes.json.gz"; - private final KnockoutAnalysisParams analysisParams = new KnockoutAnalysisParams(); - private String studyFqn; + @ToolParams + protected final KnockoutAnalysisParams analysisParams = new KnockoutAnalysisParams(); @Override protected List getSteps() { @@ -73,13 +74,12 @@ protected List getSteps() { @Override protected void check() throws Exception { - analysisParams.updateParams(params); - studyFqn = getStudyFqn(); + super.check(); executorParams.put("executionMethod", params.getString("executionMethod", "auto")); if (CollectionUtils.isEmpty(analysisParams.getSample()) || analysisParams.getSample().size() == 1 && analysisParams.getSample().get(0).equals(ParamConstants.ALL)) { - analysisParams.setSample(new ArrayList<>(getVariantStorageManager().getIndexedSamples(studyFqn, getToken()))); + analysisParams.setSample(new ArrayList<>(getVariantStorageManager().getIndexedSamples(getStudy(), getToken()))); } if (StringUtils.isEmpty(analysisParams.getBiotype())) { @@ -102,7 +102,7 @@ protected void run() throws Exception { List otherGenes = new LinkedList<>(); step("list-genes", () -> { - CellBaseUtils cellBaseUtils = getVariantStorageManager().getCellBaseUtils(studyFqn, token); + CellBaseUtils cellBaseUtils = getVariantStorageManager().getCellBaseUtils(getStudy(), token); QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id,name,chromosome,start,end,biotype,transcripts.biotype"); boolean allProteinCoding = false; @@ -135,7 +135,7 @@ protected void run() throws Exception { if (CollectionUtils.isNotEmpty(analysisParams.getPanel())) { List panels = getCatalogManager() .getPanelManager() - .get(studyFqn, analysisParams.getPanel(), new QueryOptions(), getToken()) + .get(getStudy(), analysisParams.getPanel(), new QueryOptions(), getToken()) .getResults(); for (Panel panel : panels) { for (DiseasePanel.GenePanel gene : panel.getGenes()) { @@ -171,15 +171,20 @@ protected void run() throws Exception { step("list-families", () -> { Query familyQuery = new Query(IndividualDBAdaptor.QueryParams.SAMPLES.key(), analysisParams.getSample()); for (Family family : getCatalogManager().getFamilyManager() - .search(studyFqn, familyQuery, new QueryOptions(), getToken()).getResults()) { + .search(getStudy(), familyQuery, new QueryOptions(), getToken()).getResults()) { if (family == null || StringUtils.isEmpty(family.getId())) { continue; } - List> trios = variantStorageManager.getTriosFromFamily(studyFqn, family, true, getToken()); + List> trios = variantStorageManager.getTriosFromFamily(getStudy(), family, true, getToken()); for (List trio : trios) { String child = trio.get(2); if (analysisParams.getSample().contains(child)) { - triosMap.put(child, new Trio(family.getId(), trio.get(0), trio.get(1), child)); + String father = trio.get(0); + String mother = trio.get(1); + triosMap.put(child, new Trio(family.getId(), + "-".equals(father) ? null : father, + "-".equals(mother) ? null : mother, + child)); } } } @@ -202,11 +207,11 @@ protected void run() throws Exception { }); step(() -> { - setUpStorageEngineExecutor(studyFqn); + setUpStorageEngineExecutor(getStudy()); // MappingIterator objectMappingIterator = JacksonUtils.getDefaultObjectMapper().reader().readValues(genesFile); // List genes = objectMappingIterator.readAll(new ArrayList<>()); getToolExecutor(KnockoutAnalysisExecutor.class) - .setStudy(studyFqn) + .setStudy(getStudy()) .setSamples(analysisParams.getSample()) .setSampleFileNamePattern(getScratchDir().resolve("knockout.sample.{sample}.json.gz").toString()) .setGeneFileNamePattern(getScratchDir().resolve("knockout.gene.{gene}.json.gz").toString()) @@ -217,6 +222,7 @@ protected void run() throws Exception { .setQual(analysisParams.getQual()) .setCt(analysisParams.getConsequenceType()) .setTrios(triosMap) + .setSkipGenesFile(analysisParams.isSkipGenesFile()) .execute(); }); @@ -230,12 +236,14 @@ protected void run() throws Exception { .writer(new MinimalPrettyPrinter("\n")) .forType(KnockoutByIndividual.class) .writeValues(bufferedWriter)) { + int samples = 0; + int samplesWithoutIndividual = 0; for (File file : FileUtils.listFiles(getScratchDir().toFile(), new RegexFileFilter("knockout.sample..*.json.gz"), null)) { KnockoutByIndividual knockoutByIndividual = reader.readValue(org.opencb.commons.utils.FileUtils.newBufferedReader(file.toPath())); - + samples++; Individual individual = catalogManager .getIndividualManager() - .search(studyFqn, new Query(IndividualDBAdaptor.QueryParams.SAMPLES.key(), knockoutByIndividual.getSampleId()), + .search(getStudy(), new Query(IndividualDBAdaptor.QueryParams.SAMPLES.key(), knockoutByIndividual.getSampleId()), new QueryOptions(QueryOptions.INCLUDE, Arrays.asList( IndividualDBAdaptor.QueryParams.ID.key(), IndividualDBAdaptor.QueryParams.SEX.key(), @@ -246,7 +254,12 @@ protected void run() throws Exception { )), getToken()) .first(); - if (individual != null) { + if (individual == null) { + samplesWithoutIndividual++; + logger.warn("Individual not found for sample '{}'", knockoutByIndividual.getSampleId()); + // Empty value for missing VariantFileIndexerOperationManagerindividuals + sampleIdToIndividualIdMap.put(knockoutByIndividual.getSampleId(), ""); + } else { sampleIdToIndividualIdMap.put(knockoutByIndividual.getSampleId(), individual.getId()); knockoutByIndividual.setId(individual.getId()); if (individual.getFather() != null) { @@ -258,61 +271,67 @@ protected void run() throws Exception { knockoutByIndividual.setSex(individual.getSex()); knockoutByIndividual.setDisorders(individual.getDisorders()); knockoutByIndividual.setPhenotypes(individual.getPhenotypes()); - } else { - // Empty value for missing individuals - sampleIdToIndividualIdMap.put(knockoutByIndividual.getSampleId(), ""); } writer.write(knockoutByIndividual); } + addAttribute("samples", samples); + // get unique individuals + Set individuals = new HashSet<>(sampleIdToIndividualIdMap.values()); + individuals.remove(""); + addAttribute("individuals", individuals.size()); + addAttribute("samplesWithoutIndividual", samplesWithoutIndividual); } - reader = JacksonUtils.getDefaultObjectMapper().readerFor(KnockoutByGene.class); - - try (BufferedWriter bufferedWriter = org.opencb.commons.utils.FileUtils.newBufferedWriter(getGenesOutputFile()); - SequenceWriter writer = JacksonUtils.getDefaultObjectMapper() + if (analysisParams.isSkipGenesFile()) { + logger.info("Skip genes file generation"); + } else { + reader = JacksonUtils.getDefaultObjectMapper().readerFor(KnockoutByGene.class); + try (BufferedWriter bufferedWriter = org.opencb.commons.utils.FileUtils.newBufferedWriter(getGenesOutputFile()); + SequenceWriter writer = JacksonUtils.getDefaultObjectMapper() // .writerWithDefaultPrettyPrinter() - .writer(new MinimalPrettyPrinter("\n")) - .forType(KnockoutByGene.class) - .writeValues(bufferedWriter)) { - CellBaseUtils cellBaseUtils = getVariantStorageManager().getCellBaseUtils(studyFqn, getToken()); - for (File file : FileUtils.listFiles(getScratchDir().toFile(), new RegexFileFilter("knockout.gene..*.json.gz"), null)) { - KnockoutByGene knockoutByGene = reader.readValue(org.opencb.commons.utils.FileUtils.newBufferedReader(file.toPath())); - QueryOptions queryOptions = new QueryOptions(QueryOptions.EXCLUDE, "transcripts,annotation.expression"); - Gene gene = cellBaseUtils.getCellBaseClient().getGeneClient() - .search(new Query("name", knockoutByGene.getName()), queryOptions).firstResult(); - knockoutByGene.setId(gene.getId()); - knockoutByGene.setName(gene.getName()); - knockoutByGene.setChromosome(gene.getChromosome()); - knockoutByGene.setStart(gene.getStart()); - knockoutByGene.setEnd(gene.getEnd()); - knockoutByGene.setStrand(gene.getStrand()); - knockoutByGene.setBiotype(gene.getBiotype()); - knockoutByGene.setAnnotation(gene.getAnnotation()); - for (KnockoutByGene.KnockoutIndividual individual : knockoutByGene.getIndividuals()) { - if (individual.getId() == null) { - String individualId = sampleIdToIndividualIdMap.get(individual.getSampleId()); - if (individualId == null) { - Individual individualObj = catalogManager - .getIndividualManager() - .search(studyFqn, - new Query(IndividualDBAdaptor.QueryParams.SAMPLES.key(), individual.getSampleId()), - new QueryOptions(QueryOptions.INCLUDE, IndividualDBAdaptor.QueryParams.ID.key()), - getToken()) - .first(); - if (individualObj == null) { - // Empty value for missing individuals - individualId = ""; - } else { - individualId = individualObj.getId(); + .writer(new MinimalPrettyPrinter("\n")) + .forType(KnockoutByGene.class) + .writeValues(bufferedWriter)) { + CellBaseUtils cellBaseUtils = getVariantStorageManager().getCellBaseUtils(getStudy(), getToken()); + for (File file : FileUtils.listFiles(getScratchDir().toFile(), new RegexFileFilter("knockout.gene..*.json.gz"), null)) { + KnockoutByGene knockoutByGene = reader.readValue(org.opencb.commons.utils.FileUtils.newBufferedReader(file.toPath())); + QueryOptions queryOptions = new QueryOptions(QueryOptions.EXCLUDE, "transcripts,annotation.expression"); + Gene gene = cellBaseUtils.getCellBaseClient().getGeneClient() + .search(new Query("name", knockoutByGene.getName()), queryOptions).firstResult(); + knockoutByGene.setId(gene.getId()); + knockoutByGene.setName(gene.getName()); + knockoutByGene.setChromosome(gene.getChromosome()); + knockoutByGene.setStart(gene.getStart()); + knockoutByGene.setEnd(gene.getEnd()); + knockoutByGene.setStrand(gene.getStrand()); + knockoutByGene.setBiotype(gene.getBiotype()); + knockoutByGene.setAnnotation(gene.getAnnotation()); + for (KnockoutByGene.KnockoutIndividual individual : knockoutByGene.getIndividuals()) { + if (individual.getId() == null) { + String individualId = sampleIdToIndividualIdMap.get(individual.getSampleId()); + if (individualId == null) { + Individual individualObj = catalogManager + .getIndividualManager() + .search(getStudy(), + new Query(IndividualDBAdaptor.QueryParams.SAMPLES.key(), individual.getSampleId()), + new QueryOptions(QueryOptions.INCLUDE, IndividualDBAdaptor.QueryParams.ID.key()), + getToken()) + .first(); + if (individualObj == null) { + // Empty value for missing individuals + individualId = ""; + } else { + individualId = individualObj.getId(); + } + sampleIdToIndividualIdMap.put(individual.getSampleId(), individualId); + } + if (!individualId.isEmpty()) { + individual.setId(individualId); } - sampleIdToIndividualIdMap.put(individual.getSampleId(), individualId); - } - if (!individualId.isEmpty()) { - individual.setId(individualId); } } + writer.write(knockoutByGene); } - writer.write(knockoutByGene); } } }); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysisExecutor.java index 7df74631830..527787e3bae 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysisExecutor.java @@ -52,6 +52,7 @@ public abstract class KnockoutAnalysisExecutor extends OpenCgaToolExecutor { private String sampleFileNamePattern; private String geneFileNamePattern; private String biotype; + private boolean skipGenesFile; public String getStudy() { return study; @@ -152,6 +153,15 @@ public KnockoutAnalysisExecutor setDisorder(String disorder) { return this; } + public KnockoutAnalysisExecutor setSkipGenesFile(boolean skipGenesFile) { + this.skipGenesFile = skipGenesFile; + return this; + } + + public boolean getSkipGenesFile() { + return skipGenesFile; + } + public String getSampleFileNamePattern() { return sampleFileNamePattern; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index 4d8394d760e..71287a03104 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -85,6 +85,10 @@ protected void run() throws Exception { bySample = true; break; case "byGene": + if (getSkipGenesFile()) { + throw new IllegalArgumentException("Unable to execute '" + executionMethod + "' " + + "when excluding genes file"); + } if (allProteinCoding) { throw new IllegalArgumentException("Unable to execute '" + executionMethod + "' " + "when analysing all protein coding genes"); @@ -93,7 +97,7 @@ protected void run() throws Exception { break; case "auto": case "": - if (allProteinCoding) { + if (allProteinCoding || getSkipGenesFile()) { bySample = true; } else if (getSamples().size() < (getProteinCodingGenes().size() + getOtherGenes().size())) { bySample = true; @@ -177,7 +181,11 @@ public void run() throws Exception { logger.info("-----------------------------------------------------------"); } - transposeSampleToGeneOutputFiles(); + if (getSkipGenesFile()) { + logger.info("Skip genes file transpose"); + } else { + transposeSampleToGeneOutputFiles(); + } } private void transposeSampleToGeneOutputFiles() throws IOException { @@ -252,9 +260,9 @@ protected void homAltKnockouts(String sample, FileEntry fileEntry = studyEntry.getFiles().get(sampleEntry.getFileIndex()); for (ConsequenceType consequenceType : v.getAnnotation().getConsequenceTypes()) { if (validCt(consequenceType, ctFilter, biotypeFilter, geneFilter)) { - addGene(v.toString(), sampleEntry.getData().get(0), + addGene(v, sampleEntry.getData().get(0), KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), fileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.HOM_ALT, - v.getAnnotation().getPopulationFrequencies()); + v.getAnnotation()); } } }); @@ -281,12 +289,15 @@ protected void multiAllelicKnockouts(String sample, FileEntry fileEntry = studyEntry.getFiles().get(sampleEntry.getFileIndex()); KnockoutVariant knockoutVariant = new KnockoutVariant( variant.toString(), + variant.getType(), sampleEntry.getData().get(0), + KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), KnockoutVariant.KnockoutType.HET_ALT, null, - variant.getAnnotation().getPopulationFrequencies() + variant.getAnnotation().getPopulationFrequencies(), + KnockoutVariant.getClinicalSignificance(variant.getAnnotation()) ); if (variants.put(variant.toString(), knockoutVariant) == null) { // Variant not seen @@ -301,14 +312,18 @@ protected void multiAllelicKnockouts(String sample, // The variant was already seen. i.e. there was a variant with this variant as secondary alternate for (ConsequenceType consequenceType : variant.getAnnotation().getConsequenceTypes()) { if (validCt(consequenceType, ctFilter, biotypeFilter, geneFilter)) { - String gt = studyEntry.getSampleData(0).get(0); - addGene(variant.toString(), gt, knockoutVariant.getFilter(), knockoutVariant.getQual(), + addGene(variant, knockoutVariant.getGenotype(), knockoutVariant.getDepth(), + knockoutVariant.getFilter(), knockoutVariant.getQual(), consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.HET_ALT, - variant.getAnnotation().getPopulationFrequencies() + knockoutVariant.getPopulationFrequencies(), + knockoutVariant.getClinicalSignificance() ); - addGene(secVar.toString(), secKnockoutVar.getGenotype(), secKnockoutVar.getFilter(), secKnockoutVar.getQual(), + addGene(secVar, + secKnockoutVar.getGenotype(), secKnockoutVar.getDepth(), + secKnockoutVar.getFilter(), secKnockoutVar.getQual(), consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.HET_ALT, - secKnockoutVar.getPopulationFrequencies() + secKnockoutVar.getPopulationFrequencies(), + secKnockoutVar.getClinicalSignificance() ); } } @@ -337,9 +352,9 @@ protected void compHetKnockouts(String sample, Trio family, FileEntry fileEntry = studyEntry.getFiles().get(sampleEntry.getFileIndex()); for (ConsequenceType consequenceType : v.getAnnotation().getConsequenceTypes()) { if (validCt(consequenceType, ctFilter, biotypeFilter, geneFilter)) { - addGene(v.toString(), sampleEntry.getData().get(0), + addGene(v, sampleEntry.getData().get(0), KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), fileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.COMP_HET, - v.getAnnotation().getPopulationFrequencies()); + v.getAnnotation()); } } }); @@ -361,8 +376,9 @@ protected void structuralKnockouts(String sample, // cts.add(VariantAnnotationUtils.FEATURE_TRUNCATION); iterate(query, svVariant -> { - Set transcripts = new HashSet<>(svVariant.getAnnotation().getConsequenceTypes().size()); - for (ConsequenceType consequenceType : svVariant.getAnnotation().getConsequenceTypes()) { + VariantAnnotation svAnnotation = svVariant.getAnnotation(); + Set transcripts = new HashSet<>(svAnnotation.getConsequenceTypes().size()); + for (ConsequenceType consequenceType : svAnnotation.getConsequenceTypes()) { if (validCt(consequenceType, ctFilter, biotypeFilter, geneFilter)) { transcripts.add(consequenceType.getEnsemblTranscriptId()); } @@ -371,8 +387,9 @@ protected void structuralKnockouts(String sample, .append(VariantQueryParam.SAMPLE.key(), sample) .append(VariantQueryParam.REGION.key(), new Region(svVariant.getChromosome(), svVariant.getStart(), svVariant.getEnd())); - SampleEntry svSample = svVariant.getStudies().get(0).getSample(0); - FileEntry svFileEntry = svVariant.getStudies().get(0).getFiles().get(svSample.getFileIndex()); + StudyEntry svStudy = svVariant.getStudies().get(0); + SampleEntry svSample = svStudy.getSample(0); + FileEntry svFileEntry = svStudy.getFiles().get(svSample.getFileIndex()); iterate(thisSvQuery, variant -> { if (variant.sameGenomicVariant(svVariant)) { @@ -384,12 +401,16 @@ protected void structuralKnockouts(String sample, for (ConsequenceType consequenceType : variant.getAnnotation().getConsequenceTypes()) { if (validCt(consequenceType, ctFilter, biotypeFilter, geneFilter)) { if (transcripts.contains(consequenceType.getEnsemblTranscriptId())) { - addGene(variant.toString(), svSample.getData().get(0), svFileEntry, consequenceType, knockoutGenes, + addGene(variant, + sampleEntry.getData().get(0), KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), + fileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.DELETION_OVERLAP, - variant.getAnnotation().getPopulationFrequencies()); - addGene(svVariant.toString(), sampleEntry.getData().get(0), fileEntry, consequenceType, knockoutGenes, + variant.getAnnotation()); + addGene(svVariant, + svSample.getData().get(0), KnockoutVariant.getDepth(svStudy, svFileEntry, svSample), + svFileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.DELETION_OVERLAP, - variant.getAnnotation().getPopulationFrequencies()); + svAnnotation); } } } @@ -488,12 +509,8 @@ private void knockoutGene(Query baseQuery, String gene, Predicate ctFilt knockoutTranscript.setBiotype(ct.getBiotype()); knockoutTranscript.setStrand(ct.getStrand()); knockoutTranscript.addVariant(new KnockoutVariant( - variant.toString(), genotype, - fileEntry.getData().get(StudyEntry.FILTER), - fileEntry.getData().get(StudyEntry.QUAL), - KnockoutVariant.KnockoutType.HOM_ALT, - ct.getSequenceOntologyTerms(), - annotation.getPopulationFrequencies() + variant, studyEntry, fileEntry, sampleEntry, variant.getAnnotation(), ct, + KnockoutVariant.KnockoutType.HOM_ALT )); } } else if (GenotypeClass.HET_REF.test(genotype)) { @@ -561,12 +578,8 @@ private void compHetKnockout(Query baseQuery, KnockoutByGene knockoutByGene, Str knockoutTranscript.setBiotype(ct.getBiotype()); knockoutTranscript.setStrand(ct.getStrand()); knockoutTranscript.addVariant(new KnockoutVariant( - variant.toString(), sampleEntry.getData().get(0), - fileEntry.getData().get(StudyEntry.FILTER), - fileEntry.getData().get(StudyEntry.QUAL), - KnockoutVariant.KnockoutType.COMP_HET, - ct.getSequenceOntologyTerms(), - variant.getAnnotation().getPopulationFrequencies())); + variant, studyEntry, fileEntry, sampleEntry, variant.getAnnotation(), ct, + KnockoutVariant.KnockoutType.COMP_HET)); } } } @@ -590,11 +603,8 @@ private void multiAllelicKnockout(Query baseQuery, KnockoutByGene knockout, Stri Variant secVar = getSecondaryVariant(variant); KnockoutVariant knockoutVariant = new KnockoutVariant( - variant.toString(), - variant.getStudies().get(0).getSampleData(0).get(0), - fileEntry.getData().get(StudyEntry.FILTER), - fileEntry.getData().get(StudyEntry.QUAL), - KnockoutVariant.KnockoutType.HET_ALT, null, variant.getAnnotation().getPopulationFrequencies() + variant, studyEntry, fileEntry, sampleEntry, variant.getAnnotation(), null, + KnockoutVariant.KnockoutType.HET_ALT ); if (variants.put(variant.toString(), knockoutVariant) == null) { // Variant not seen @@ -613,22 +623,23 @@ private void multiAllelicKnockout(Query baseQuery, KnockoutByGene knockout, Stri knockoutTranscript.setBiotype(ct.getBiotype()); knockoutTranscript.setStrand(ct.getStrand()); - String gt = sampleEntry.getData().get(0); knockoutTranscript.addVariant(new KnockoutVariant( - variant.toString(), gt, null, null, - KnockoutVariant.KnockoutType.HET_ALT, - ct.getSequenceOntologyTerms(), - variant.getAnnotation().getPopulationFrequencies())); + variant, studyEntry, fileEntry, sampleEntry, variant.getAnnotation(), ct, + KnockoutVariant.KnockoutType.HET_ALT)); KnockoutVariant secKnockoutVar = variants.get(secVar.toString()); knockoutTranscript.addVariant(new KnockoutVariant( secKnockoutVar.getId(), + secKnockoutVar.getType(), secKnockoutVar.getGenotype(), + secKnockoutVar.getDepth(), secKnockoutVar.getFilter(), secKnockoutVar.getQual(), KnockoutVariant.KnockoutType.HET_ALT, ct.getSequenceOntologyTerms(), - variant.getAnnotation().getPopulationFrequencies())); + variant.getAnnotation().getPopulationFrequencies(), + KnockoutVariant.getClinicalSignificance(variant.getAnnotation()) + )); } } } @@ -653,8 +664,9 @@ protected void structuralKnockouts(Query baseQuery, KnockoutByGene knockout, Str } } - List svSampleData = svVariant.getStudies().get(0).getSampleData(0); - FileEntry svFileEntry = svVariant.getStudies().get(0).getFiles().get(Integer.parseInt(svSampleData.get(1))); + StudyEntry svStudyEntry = svVariant.getStudies().get(0); + SampleEntry svSampleEntry = svStudyEntry.getSample(0); + FileEntry svFileEntry = svStudyEntry.getFiles().get(svSampleEntry.getFileIndex()); Query thisSvQuery = new Query(baseQuery) .append(VariantQueryParam.SAMPLE.key(), sampleId) @@ -678,20 +690,12 @@ protected void structuralKnockouts(Query baseQuery, KnockoutByGene knockout, Str FileEntry fileEntry = studyEntry.getFiles().get(sampleEntry.getFileIndex()); knockoutTranscript.addVariant(new KnockoutVariant( - variant.toString(), sampleEntry.getData().get(0), - fileEntry.getData().get(StudyEntry.FILTER), - fileEntry.getData().get(StudyEntry.QUAL), - KnockoutVariant.KnockoutType.DELETION_OVERLAP, - ct.getSequenceOntologyTerms(), - variant.getAnnotation().getPopulationFrequencies())); + variant, studyEntry, fileEntry, sampleEntry, variant.getAnnotation(), ct, + KnockoutVariant.KnockoutType.DELETION_OVERLAP)); knockoutTranscript.addVariant(new KnockoutVariant( - svVariant.toString(), svSampleData.get(0), - svFileEntry.getData().get(StudyEntry.FILTER), - svFileEntry.getData().get(StudyEntry.QUAL), - KnockoutVariant.KnockoutType.DELETION_OVERLAP, - ct.getSequenceOntologyTerms(), - variant.getAnnotation().getPopulationFrequencies())); + svVariant, svStudyEntry, svFileEntry, svSampleEntry, variant.getAnnotation(), ct, + KnockoutVariant.KnockoutType.DELETION_OVERLAP)); } } } @@ -752,16 +756,16 @@ private int iterate(Query query, QueryOptions queryOptions, VariantConsumer c) return numVariants; } - private void addGene(String variant, String gt, FileEntry fileEntry, ConsequenceType consequenceType, + private void addGene(Variant variant, String gt, Integer depth, FileEntry fileEntry, ConsequenceType consequenceType, Map knockoutGenes, - KnockoutVariant.KnockoutType knockoutType, List populationFrequencies) { - addGene(variant, gt, fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), - consequenceType, knockoutGenes, knockoutType, populationFrequencies); + KnockoutVariant.KnockoutType knockoutType, VariantAnnotation variantAnnotation) { + addGene(variant, gt, depth, fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), + consequenceType, knockoutGenes, knockoutType, variantAnnotation.getPopulationFrequencies(), KnockoutVariant.getClinicalSignificance(variantAnnotation)); } - private void addGene(String variant, String gt, String filter, String qual, ConsequenceType consequenceType, + private void addGene(Variant variant, String gt, Integer depth, String filter, String qual, ConsequenceType consequenceType, Map knockoutGenes, - KnockoutVariant.KnockoutType knockoutType, List populationFrequencies) { + KnockoutVariant.KnockoutType knockoutType, List populationFrequencies, List clinicalSignificance) { KnockoutGene gene = knockoutGenes.computeIfAbsent(consequenceType.getGeneName(), KnockoutGene::new); gene.setId(consequenceType.getEnsemblGeneId()); gene.setBiotype(consequenceType.getBiotype()); @@ -770,8 +774,8 @@ private void addGene(String variant, String gt, String filter, String qual, Cons KnockoutTranscript t = gene.getTranscript(consequenceType.getEnsemblTranscriptId()); t.setBiotype(consequenceType.getBiotype()); t.setStrand(consequenceType.getStrand()); - t.addVariant(new KnockoutVariant(variant, gt, filter, qual, knockoutType, - consequenceType.getSequenceOntologyTerms(), populationFrequencies)); + t.addVariant(new KnockoutVariant(variant.toString(), variant.getType(), gt, depth, filter, qual, knockoutType, + consequenceType.getSequenceOntologyTerms(), populationFrequencies, clinicalSignificance)); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index 4e5790aea49..f2ae494d44d 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -679,6 +679,7 @@ private void knockout() throws Exception { cliOptions.consequenceType, cliOptions.filter, cliOptions.qual, + cliOptions.skipGenesFile, cliOptions.outdir) .toObjectMap(cliOptions.commonOptions.params) .append(ParamConstants.STUDY_PARAM, cliOptions.study); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index c5553598b5c..6b8c299359f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1166,6 +1166,9 @@ public class KnockoutCommandOptions { @Parameter(names = {"--qual"}, description = VariantQueryParam.QUAL_DESCR) public String qual; + + @Parameter(names = {"--skip-genes-file"}, description = "Do not generate the results file by gene") + public boolean skipGenesFile; } @Parameters(commandNames = SampleEligibilityCommandOptions.SAMPLE_ELIGIBILITY_RUN_COMMAND, commandDescription = SampleEligibilityAnalysis.DESCRIPTION) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index a9cc6fa6a7f..35bb89274c1 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -314,6 +314,7 @@ private RestResponse knockout() throws ClientException { variantCommandOptions.knockoutCommandOptions.consequenceType, variantCommandOptions.knockoutCommandOptions.filter, variantCommandOptions.knockoutCommandOptions.qual, + variantCommandOptions.knockoutCommandOptions.skipGenesFile, variantCommandOptions.knockoutCommandOptions.outdir), getParams(variantCommandOptions.knockoutCommandOptions.study) ); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java index 38c4cc04d4b..396a3b7dfeb 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java @@ -16,20 +16,26 @@ package org.opencb.opencga.core.models.analysis.knockout; -import org.opencb.biodata.models.variant.avro.PopulationFrequency; -import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; +import htsjdk.variant.vcf.VCFConstants; +import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.variant.StudyEntry; +import org.opencb.biodata.models.variant.Variant; +import org.opencb.biodata.models.variant.avro.*; -import java.util.List; +import java.util.*; public class KnockoutVariant { private String id; + private VariantType type; private String genotype; + private Integer depth; private String filter; private String qual; private KnockoutType knockoutType; private List populationFrequencies; private List sequenceOntologyTerms; + private List clinicalSignificance; public enum KnockoutType { HOM_ALT, @@ -41,15 +47,33 @@ public enum KnockoutType { public KnockoutVariant() { } - public KnockoutVariant(String id, String genotype, String filter, String qual, KnockoutType knockoutType, - List sequenceOntologyTerms, List populationFrequencies) { + public KnockoutVariant(Variant variant, StudyEntry study, FileEntry file, SampleEntry sample, VariantAnnotation annotation, + ConsequenceType ct, KnockoutType knockoutType) { + this.id = variant.toString(); + this.type = variant.getType(); + this.genotype = sample.getData().get(0); + this.depth = getDepth(study, file, sample); + this.filter = file.getData().get(StudyEntry.FILTER); + this.qual = file.getData().get(StudyEntry.QUAL); + this.knockoutType = knockoutType; + this.sequenceOntologyTerms = ct == null ? null : ct.getSequenceOntologyTerms(); + this.populationFrequencies = annotation.getPopulationFrequencies(); + this.clinicalSignificance = getClinicalSignificance(annotation); + } + + public KnockoutVariant(String id, VariantType type, String genotype, Integer depth, String filter, String qual, + KnockoutType knockoutType, List sequenceOntologyTerms, + List populationFrequencies, List clinicalSignificance) { this.id = id; + this.type = type; this.genotype = genotype; + this.depth = depth; this.filter = filter; this.qual = qual; this.knockoutType = knockoutType; - this.populationFrequencies = populationFrequencies; this.sequenceOntologyTerms = sequenceOntologyTerms; + this.populationFrequencies = populationFrequencies; + this.clinicalSignificance = clinicalSignificance; } @Override @@ -75,6 +99,15 @@ public KnockoutVariant setId(String id) { return this; } + public VariantType getType() { + return type; + } + + public KnockoutVariant setType(VariantType type) { + this.type = type; + return this; + } + public String getGenotype() { return genotype; } @@ -84,6 +117,15 @@ public KnockoutVariant setGenotype(String genotype) { return this; } + public Integer getDepth() { + return depth; + } + + public KnockoutVariant setDepth(Integer depth) { + this.depth = depth; + return this; + } + public String getFilter() { return filter; } @@ -128,4 +170,39 @@ public KnockoutVariant setPopulationFrequencies(List popula this.populationFrequencies = populationFrequencies; return this; } + + public List getClinicalSignificance() { + return clinicalSignificance; + } + + public KnockoutVariant setClinicalSignificance(List clinicalSignificance) { + this.clinicalSignificance = clinicalSignificance; + return this; + } + + + public static Integer getDepth(StudyEntry study, FileEntry file, SampleEntry sample) { + Integer dpId = study.getSampleDataKeyPosition(VCFConstants.DEPTH_KEY); + if (dpId != null) { + String dpStr = sample.getData().get(dpId); + if (StringUtils.isNumeric(dpStr)) { + return Integer.valueOf(dpStr); + } + } + return null; + } + + public static List getClinicalSignificance(VariantAnnotation annotation) { + if (annotation.getTraitAssociation() != null) { + Set uniqueValues = new HashSet<>(); + for (EvidenceEntry evidenceEntry : annotation.getTraitAssociation()) { + if (evidenceEntry.getVariantClassification() != null + && evidenceEntry.getVariantClassification().getClinicalSignificance() != null) { + uniqueValues.add(evidenceEntry.getVariantClassification().getClinicalSignificance()); + } + } + return new ArrayList<>(uniqueValues); + } + return Collections.emptyList(); + } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java index afe1e6d22c1..f810739d746 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java @@ -42,6 +42,8 @@ public class KnockoutAnalysisParams extends ToolParams { private String filter; private String qual; + // Do not generate genes file + private boolean skipGenesFile; private String outdir; @@ -49,7 +51,7 @@ public KnockoutAnalysisParams() { } public KnockoutAnalysisParams(List sample, List gene, List panel, String biotype, String consequenceType, - String filter, String qual, String outdir) { + String filter, String qual, boolean skipGenesFile, String outdir) { this.sample = sample; this.gene = gene; this.panel = panel; @@ -57,6 +59,7 @@ public KnockoutAnalysisParams(List sample, List gene, List clinicalSignificance = Collections.emptyList(); + KnockoutTranscript knockoutTranscript = new KnockoutTranscript("transcriptId" + count); knockoutTranscript.setBiotype("biotype" + count); @@ -63,15 +67,15 @@ public static KnockoutTranscript createTranscript(int count) { sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0001891", "regulatory_region_amplification")); sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0000685", "DNAseI_hypersensitive_site")); - knockoutVariantList.add(new KnockoutVariant("variant" + count, "Genotype", "PASS", "10", KnockoutVariant.KnockoutType.COMP_HET, - sequenceOntologyTermList, populationFrequencyList)); + knockoutVariantList.add(new KnockoutVariant("variant" + count, VariantType.SNV, "Genotype", 10, "PASS", "10", KnockoutVariant.KnockoutType.COMP_HET, + sequenceOntologyTermList, populationFrequencyList, clinicalSignificance)); populationFrequencyList = new ArrayList<>(3); populationFrequencyList.add(new PopulationFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, "ALL", "", "", 1f, 0.2f, 1f, 0.04f, 0.02f)); populationFrequencyList.add(new PopulationFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, "ALL", "", "", 1f, 0.01f, 1f, 0.01f, 0.01f)); populationFrequencyList.add(new PopulationFrequency("otherStudy", "ALL", "", "", 1f, 0.04f, 1f, 0.004f, 0.2f)); - knockoutVariantList.add(new KnockoutVariant("variant" + (count + 1), "Genotype", "NOT_PASS", "1", - KnockoutVariant.KnockoutType.COMP_HET, sequenceOntologyTermList, populationFrequencyList)); + knockoutVariantList.add(new KnockoutVariant("variant" + (count + 1), VariantType.SNV, "Genotype", 2, "NOT_PASS", "1", + KnockoutVariant.KnockoutType.COMP_HET, sequenceOntologyTermList, populationFrequencyList, clinicalSignificance)); knockoutTranscript.setVariants(knockoutVariantList); return knockoutTranscript; } From 0668b349a65c97c70814a4553e856a32f66a7963 Mon Sep 17 00:00:00 2001 From: Laura Date: Tue, 9 Mar 2021 15:45:41 +0000 Subject: [PATCH 062/412] GitBook: [develop] one page and 2 assets modified --- docs/.gitbook/assets/image (7).png | Bin 0 -> 359391 bytes docs/.gitbook/assets/image (8).png | Bin 0 -> 359391 bytes docs/using-opencga/client-libraries/python.md | 280 ++++++++++++++++++ 3 files changed, 280 insertions(+) create mode 100644 docs/.gitbook/assets/image (7).png create mode 100644 docs/.gitbook/assets/image (8).png diff --git a/docs/.gitbook/assets/image (7).png b/docs/.gitbook/assets/image (7).png new file mode 100644 index 0000000000000000000000000000000000000000..6de63522f615ab8113d686258f46d7340b56cddc GIT binary patch literal 359391 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

WK{q2&n|mew6o4eQ{ja_a%fZ+x>Yg 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

eB9iju}2|*a$CA$;8NkgiG~OZ=NNW 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 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/image (8).png b/docs/.gitbook/assets/image (8).png new file mode 100644 index 0000000000000000000000000000000000000000..6de63522f615ab8113d686258f46d7340b56cddc GIT binary patch literal 359391 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

eB9iju}2|*a$CA$;8NkgiG~OZ=NNW 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 literal 0 HcmV?d00001 diff --git a/docs/using-opencga/client-libraries/python.md b/docs/using-opencga/client-libraries/python.md index 2ad3d8ac800..a3249a45d46 100644 --- a/docs/using-opencga/client-libraries/python.md +++ b/docs/using-opencga/client-libraries/python.md @@ -1,2 +1,282 @@ # Python +## Overview + +OpenCGA implements a Python REST client library called **PyOpenCGA** to execute any query or operation through the REST web services API. **PyOpenCGA** provides programmatic access to **all the implemented** REST web services, providing an easy, lightweight, fast and intuitive solution to access OpenCGA data. The library offers the convenience of an object-oriented scripting language and provides the ability to integrate the obtained results into other Python applications. + +Some of the main features include: + +* full RESTful web service API implemented, all endpoints are supported including new alignment or clinical functionality. +* data is returned in a new _RestResponse_ object which contains metadata and the results, some handy methods and iterators implemented. +* it uses the OpenCGA _client-configuration.yml_ file. +* several Jupyter Notebooks implemented. + +[**PyOpenCGA**](https://pypi.org/project/pyopencga/) has been implemented by Daniel Perez, Pablo Marin and David Gomez and it is based on a previous library called _pyCGA_ implemented by Antonio Rueda and Daniel Perez from Genomics England. The code is open-source and can be found at [https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/pyOpenCGA](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/pyOpenCGA). It can be installed using [PyPI](https://pypi.org/) and . Please, find more details on how to use the python library at [Using the Python client](http://docs.opencb.org/display/opencga/Using+the+Python+client). + +## Installation + +Python client requires at least **Python 3.x,** although most of the code is fully compatible with Python 2.7. You can install PyOpenCGA either from [PyPI](https://pypi.org/project/pyopencga/) repository or from source code. + +### PyPI + +PyOpenCGA client is available at PyPI repository at [https://pypi.org/project/pyopencga/](https://pypi.org/project/pyopencga/). Installation is as simple as running the following command line: + +```text +## Latest stable version +pip install pyopencga +``` + +### Source Code + +From OpenCGA v2.0.0 the Python client source code can be found at GitHub Release at [https://github.com/opencb/opencga/releases](https://github.com/opencb/opencga/releases). You can easily install _pyOpenCGA_ using the _setup.py_ file. + +```text +## Get latest stable version from https://github.com/opencb/opencga/releases. You can use wget from the terminal +wget https://github.com/opencb/opencga/releases/download/v2.0.0/opencga-2.0.0.tar.gz + +## Decompress +tar -zxvf opencga-2.0.0.tar.gz + +## Move to the pyOpenCGA client folder +cd opencga-2.0.0/clients/python + +## Install the library +python setup.py install +``` + +## Getting started + +### Client Configuration + +Configuration is handled by the _ClientConfiguration_ class. You can create a _ClientConfiguration_ using either the _conf/client-configuration.yml_ file or by passing a dictionary. + +```text +## Import ClientConfiguration class +from pyopencga.opencga_config import ClientConfiguration + +## You can create a ClientConfiguration by using the path to the client-configuration.yml file (it can also accept a JSON file) +config = ClientConfiguration('opencga-2.0.0/conf/client-configuration.yml') + +## Additionally, you can pass a dictionary using the same structure as the client-configuration.yml (the only required parameter is REST host) +config = ClientConfiguration({"rest": {"host": "http://bioinfo.hpc.cam.ac.uk/opencga-prod"}}) +``` + +### OpenCGA Client + +_OpencgaClient_ is the main class in _pyOpenCGA_. It manages login/logout authentication, REST clients initialisation and provides a set of other utilities. + +To create an _OpencgaClient_ instance, a _ClientConfiguration_ instance must be passed as an argument. You can authenticate in two different ways. First, you can login by providing the user and optionally the password. Second, you can provide a valid token when creating _OpencgaClient_. Remember that tokens are only valid for a period of time. + +```text +## Import ClientConfiguration and OpencgaClient class +from pyopencga.opencga_config import ClientConfiguration +from pyopencga.opencga_client import OpencgaClient + +## Create an instance of OpencgaClient passing the configuration +config = ClientConfiguration('opencga-2.0.0/conf/client-configuration.yml') +oc = OpencgaClient(config) + +### Two authentication options: +## Option 1. If the user has a valid token, it can be passed to start doing calls as an authenticated user +oc = OpencgaClient(config, token='TOKEN') + +## Option 2. If no token is provided, the user must login with valid credentials. Password is optional (if it is not passed to the login method, it will be prompted to the user) +oc.login(user='USER') ## The password will be asked +# or +oc.login(user='USER', password='PASSWORD') + +## You can logout by executing the following command, the token will be deleted. +oc.logout() +``` + +The _OpencgaClient_ class works as a _client factory_ containing all the different _clients,_ one per REST resource, that are necessary to call any REST web service. Below is a list of available clients: + +```text +## Create main clients +users = oc.users +projects = oc.projects +studies = oc.studies +files = oc.files +jobs = oc.jobs +families = oc.families +individuals = oc.individuals +samples = oc.samples +cohorts = oc.cohorts +panels = oc.panels + +## Create analysis clients +alignments = oc.alignment +variants = oc.variant +clinical = oc.clinical +ga4gh = oc.ga4gh + +## Create administrative clients +admin = oc.admin +meta = oc.meta +variant_operations = oc.variant_operations +``` + +### Client API + +Clients implements **all** available REST API endpoints, one method has been implemented for each REST web service. The list of available actions that can be performed with all those clients can be checked in Swagger as explained in [RESTful Web Services\#Swagger](http://docs.opencb.org/display/opencga/RESTful+Web+Services#RESTfulWebServices-Swagger). Each particular client has a method defined for each available web service implemented for the resource. For instance, the whole list of actions available for the **Sample** resource are shown below. + +![](../../.gitbook/assets/image%20%288%29.png) + +For all those actions, there is a method available in the sample client. For instance, to search for samples using the _/search_ web service, you need to execute: + +```text +## Look for the first 5 sample IDs of the study "study" +sample_result = oc.samples.search(study='study', limit=5, include='id') +``` + +### Working with the _RestResponse_ + +As described in [RESTful Web Services\#RESTResponse](http://docs.opencb.org/display/opencga/RESTful+Web+Services#RESTfulWebServices-RESTResponse), all REST web services return a _RestResponse_ object containing some metadata and a list of _OpenCGAResults_. Each of these _OpenCGAResults_ contain some other metadata and the actual data results. + +To work with these REST responses in an easier way, _RestResponse_ class has been implemented to wrap the web service _RetResponse_ object and to offer some useful methods to process the results. For instance, the _sample\_result_ variable from the example above is a _RestResponse_ instance. This object defines several methods to navigate through the data. + +The implemented _RestResponse_ methods are: + +```text +## Returns the list of results for the response in position "response_pos" (response_pos=0 by default) +sample_response.get_results(response_pos) + +## Returns the result in position "result_pos" for the response in position "response_pos" (response_pos=0 by default) +sample_response.get_result(result_pos, response_pos) + +## Returns the list of responses +sample_response.get_responses() + +## Returns the response in position "response_pos" (response_pos=0 by default) +sample_response.get_response(response_pos) + +## Returns all results from the response in position "response_pos" as an iterator (response_pos=None returns all results for all QueryResponses) +sample_response.result_iterator(response_pos) + +## Returns all response events by type "event_type" ('INFO', 'WARNING' or 'ERROR') (event_type=None returns all types of event) +sample_response.get_response_events(event_type) + +## Returns all response events by type "event_type" ('INFO', 'WARNING or 'ERROR') for the response in position "response_pos" (event_type=None returns all types of event; response_pos=0 by default) +sample_response.get_result_events(event_type, response_pos) + +## Return number of matches for the response in position "response_pos" (response_pos=None returns the number for all QueryResponses) +sample_response.get_num_matches(response_pos) + +## Return number of results for the response in position "response_pos" (response_pos=None returns the number for all QueryResponses) +sample_response.get_num_results(response_pos) + +## Return number of insertions for the response in position "response_pos" (response_pos=None returns the number for all QueryResponses) +sample_response.get_num_inserted(response_pos) + +## Return number of updates for the response in position "response_pos" (response_pos=None returns the number for all QueryResponses) +sample_response.get_num_updated(response_pos) + +## Return number of deletions for the response in position "response_pos" (response_pos=None returns the number for all QueryResponses) +sample_response.get_num_deleted(response_pos) +``` + +To explore the data in an easier way, a method named _**print\_results**_ has also been implemented to show the response in a more human-readable format. + +```text +## Print results of the query for the response in position "response_pos" (response_pos=None returns the results for all QueryResponses) +sample_response.print_results(fields='id', response_pos=0, limit=5, separator='\t', metadata=True, outfile='path/to/output.tsv') +``` + +## Examples and tutorials + +### Setting up OpencgaClient and logging in + +```text +# First, we need to import both the ClientConfiguration and the OpencgaClient +from pyopencga.opencga_config import ClientConfiguration +from pyopencga.opencga_client import OpencgaClient + +# Second, we need to set up the configuration +# The main client-configuration.yml file has a "host" section to point to the REST OpenCGA endpoints +# We need to either pass the path to the configuration file or a dictionary with the same structure of the file +config = ClientConfiguration({'rest': {'host': 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'}}) + +# Third, we create an instance of the OpencgaClient passing the configuration +oc = OpencgaClient(config) + +# Finally, we need to authenticate. +oc.login(user='demouser', password='demouser') + +# Additionally, we can check that we've logged in successfully by printing the obtained token +print(oc.token) +``` + +### Getting ID's for available projects, studies, families and samples + +```text +# We can get the ID of all the available projects in this OpenCGA installation +for project in oc.projects.search().get_results(): + print(project['id']) + +# We can get the ID of all the available studies in the project +for study in oc.studies.search(project='family').get_results(): + print(study['id']) + +# We can get the ID for all the available families in the study +for family in oc.families.search(study='corpasome').get_results(): + print(family['id']) + +# We can get the ID for all the available samples in the study +for sample in oc.samples.search(study='corpasome').get_results(): + print(sample['id']) +``` + +### Getting gene variants for individuals with a particular disorder + +```text +# We are interested in looking for all the individuals containing a particular disorder: "OMIM:611597" +individuals_query_response = oc.individuals.search( + study='corpasome', # name of the study where the families are stored + disorders='OMIM:611597', # id of the disorders of interest + include='id' # retrieve only these fields from the results +) + +# If we want to know exactly the number of individuals obtained, we can run: +print(individuals_query_response.get_num_results()) + +# Now we fetch all the variants falling in the "BFSP2" gene for those individuals +# In this case, we will limit the variant query to a maximum of 10 results +# We also exclude sample information (includeSample='none') as it can be huge and would make this query much slower +for individual in individuals_query_response.get_results(): + print('Individual: ' + individual['id']) + samples = ','.join([sample['id'] for sample in individual['samples']]) + variant_response = oc.variants.query(study='corpasome', sample=samples, gene='BFSP2', includeSample='none', limit=10) + if variant_response.get_num_results() > 0: + for variant in variant_response.get_results(): + print('{}:{}-{}\t{}'.format(variant['chromosome'], str(variant['start']), str(variant['end']), variant['type'])) + else: + print('No variant results found') +``` + +### Getting sample variant ID's + +```text +# Now we are interested in getting the rs IDs for the first 10 variants for a particular sample +for variant in oc.variants.query(sample='ISDBM322015', study='corpasome', limit=10).get_results(): + print(variant['names']) + +# We can also get rs IDs for multiple samples +for variant in oc.variants.query(sample='ISDBM322015,ISDBM322016,ISDBM322017,ISDBM322018', study='corpasome', limit=10).get_results(): + print(variant['names']) +``` + +### Getting all samples containing a variant + +```text +# If we have an ID for a variant, we can obtain its ID in OpenCGA (chromosome:position:reference:alternate) +variant_id = oc.variants.query(study='corpasome', xref='rs1851943').get_result(0)['id'] + +# Now we are interested in getting all the samples that have that particular ID +for variant in oc.variants.query_sample(study='corpasome', variant=variant_id, debug=True).get_results(): + for study in variant['studies']: + for sample in study['samples']: + print(sample['sampleId']) +``` + +Additionally, there are several notebooks defined in [https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks) with more real examples. + From f42793780c242886bb16e82dc2c87183d0fb32c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 10 Mar 2021 09:33:58 +0000 Subject: [PATCH 063/412] analysis: Add parallelism to KnockoutAnalysis --- .../KnockoutLocalAnalysisExecutor.java | 136 +++++++++++------- 1 file changed, 81 insertions(+), 55 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index 71287a03104..cc5427bb4c6 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -27,6 +27,7 @@ import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.run.ParallelTaskRunner; import org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.analysis.variant.manager.VariantStorageToolExecutor; @@ -37,6 +38,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.opencb.opencga.storage.core.io.plain.StringDataReader; import org.opencb.opencga.storage.core.metadata.models.Trio; import org.opencb.opencga.storage.core.variant.adaptors.GenotypeClass; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; @@ -46,6 +48,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -122,70 +125,93 @@ protected void run() throws Exception { private class KnockoutBySampleExecutor { public void run() throws Exception { + Iterator samplesIterator = getSamples().iterator(); + ParallelTaskRunner ptr = new ParallelTaskRunner<>( + batchSize -> { + List samples = new ArrayList<>(batchSize); + for (int i = 0; i < batchSize && samplesIterator.hasNext(); i++) { + samples.add(samplesIterator.next()); + } + return samples; + }, + samples -> { + for (String sample : samples) { + processSample(sample); + } + return null; + }, null, + ParallelTaskRunner.Config.builder() + .setBatchSize(1) + .setNumTasks(Runtime.getRuntime().availableProcessors()) + .build() + ); + + ptr.run(); + + if (getSkipGenesFile()) { + logger.info("Skip genes file transpose"); + } else { + transposeSampleToGeneOutputFiles(); + } + } + + protected void processSample(String sample) throws Exception { Query baseQuery = new Query() .append(VariantQueryParam.STUDY.key(), getStudy()) .append(VariantQueryParam.FILTER.key(), getFilter()) .append(VariantQueryParam.QUAL.key(), getQual()); - for (String sample : getSamples()) { - StopWatch stopWatch = StopWatch.createStarted(); - logger.info("Processing sample {}", sample); - Map knockoutGenes = new LinkedHashMap<>(); - Trio trio = getTrios().get(sample); - - // Protein coding genes (if any) - if (allProteinCoding) { - // All protein coding genes - Query query = new Query(baseQuery) - .append(VariantQueryParam.ANNOT_BIOTYPE.key(), PROTEIN_CODING) - .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sample) - .append(VariantQueryParam.ANNOT_CONSEQUENCE_TYPE.key(), getCt()); - knockouts(query, sample, trio, knockoutGenes, - getCts()::contains, - b -> b.equals(PROTEIN_CODING), - g -> true); - } else if (!getProteinCodingGenes().isEmpty()) { - // Set of protein coding genes - Query query = new Query(baseQuery) - .append(VariantQueryParam.GENE.key(), getProteinCodingGenes()) - .append(VariantQueryParam.ANNOT_BIOTYPE.key(), PROTEIN_CODING) - .append(VariantQueryParam.ANNOT_CONSEQUENCE_TYPE.key(), getCt()) - .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sample); - knockouts(query, sample, trio, knockoutGenes, - getCts()::contains, - b -> b.equals(PROTEIN_CODING), - getProteinCodingGenes()::contains); - } - - // Other genes (if any) - if (!getOtherGenes().isEmpty()) { - Query query = new Query(baseQuery) - .append(VariantQueryParam.ANNOT_BIOTYPE.key(), biotype) - .append(VariantQueryParam.GENE.key(), getOtherGenes()) - .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sample); - knockouts(query, sample, trio, knockoutGenes, - ct -> true, // Accept any CT - biotype == null ? (b -> !b.equals(PROTEIN_CODING)) : new HashSet<>(biotype)::contains, - getOtherGenes()::contains); - } + StopWatch stopWatch = StopWatch.createStarted(); + logger.info("Processing sample {}", sample); + Map knockoutGenes = new LinkedHashMap<>(); + Trio trio = getTrios().get(sample); + + // Protein coding genes (if any) + if (allProteinCoding) { + // All protein coding genes + Query query = new Query(baseQuery) + .append(VariantQueryParam.ANNOT_BIOTYPE.key(), PROTEIN_CODING) + .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sample) + .append(VariantQueryParam.ANNOT_CONSEQUENCE_TYPE.key(), getCt()); + knockouts(query, sample, trio, knockoutGenes, + getCts()::contains, + b -> b.equals(PROTEIN_CODING), + g -> true); + } else if (!getProteinCodingGenes().isEmpty()) { + // Set of protein coding genes + Query query = new Query(baseQuery) + .append(VariantQueryParam.GENE.key(), getProteinCodingGenes()) + .append(VariantQueryParam.ANNOT_BIOTYPE.key(), PROTEIN_CODING) + .append(VariantQueryParam.ANNOT_CONSEQUENCE_TYPE.key(), getCt()) + .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sample); + knockouts(query, sample, trio, knockoutGenes, + getCts()::contains, + b -> b.equals(PROTEIN_CODING), + getProteinCodingGenes()::contains); + } - if (knockoutGenes.isEmpty()) { - logger.info("No results for sample {}", sample); - } else { - KnockoutByIndividual.GeneKnockoutByIndividualStats stats = getGeneKnockoutBySampleStats(knockoutGenes.values()); - writeSampleFile(new KnockoutByIndividual() - .setSampleId(sample) - .setStats(stats) - .setGenes(knockoutGenes.values())); - } - logger.info("Sample {} processed in {}", sample, TimeUtils.durationToString(stopWatch)); - logger.info("-----------------------------------------------------------"); + // Other genes (if any) + if (!getOtherGenes().isEmpty()) { + Query query = new Query(baseQuery) + .append(VariantQueryParam.ANNOT_BIOTYPE.key(), biotype) + .append(VariantQueryParam.GENE.key(), getOtherGenes()) + .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sample); + knockouts(query, sample, trio, knockoutGenes, + ct -> true, // Accept any CT + biotype == null ? (b -> !b.equals(PROTEIN_CODING)) : new HashSet<>(biotype)::contains, + getOtherGenes()::contains); } - if (getSkipGenesFile()) { - logger.info("Skip genes file transpose"); + if (knockoutGenes.isEmpty()) { + logger.info("No results for sample {}", sample); } else { - transposeSampleToGeneOutputFiles(); + KnockoutByIndividual.GeneKnockoutByIndividualStats stats = getGeneKnockoutBySampleStats(knockoutGenes.values()); + writeSampleFile(new KnockoutByIndividual() + .setSampleId(sample) + .setStats(stats) + .setGenes(knockoutGenes.values())); } + logger.info("Sample {} processed in {}", sample, TimeUtils.durationToString(stopWatch)); + logger.info("-----------------------------------------------------------"); } private void transposeSampleToGeneOutputFiles() throws IOException { From 0148e928ca4a148e8fd136da92cc86f29cd82295 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Wed, 10 Mar 2021 16:09:53 +0000 Subject: [PATCH 064/412] client: improve python notebooks #1716 --- .../pyopencga_basic_notebook_001.ipynb | 2 +- ...yopencga_basic_notebook_002-coverage.ipynb | 4 +- ...yopencga_basic_notebook_003-variants.ipynb | 2 +- .../pyopencga_first_steps_001.ipynb | 108 ++++++++++++++++++ 4 files changed, 112 insertions(+), 4 deletions(-) rename opencga-client/src/main/python/notebooks/{ => general-notebooks}/pyopencga_basic_notebook_001.ipynb (99%) rename opencga-client/src/main/python/notebooks/{ => general-notebooks}/pyopencga_basic_notebook_002-coverage.ipynb (99%) rename opencga-client/src/main/python/notebooks/{ => general-notebooks}/pyopencga_basic_notebook_003-variants.ipynb (99%) create mode 100644 opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb diff --git a/opencga-client/src/main/python/notebooks/pyopencga_basic_notebook_001.ipynb b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb similarity index 99% rename from opencga-client/src/main/python/notebooks/pyopencga_basic_notebook_001.ipynb rename to opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb index 1676b5c0523..4549f1d3a4b 100644 --- a/opencga-client/src/main/python/notebooks/pyopencga_basic_notebook_001.ipynb +++ b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb @@ -713,7 +713,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.7.6" }, "pycharm": { "stem_cell": { diff --git a/opencga-client/src/main/python/notebooks/pyopencga_basic_notebook_002-coverage.ipynb b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_002-coverage.ipynb similarity index 99% rename from opencga-client/src/main/python/notebooks/pyopencga_basic_notebook_002-coverage.ipynb rename to opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_002-coverage.ipynb index 6c1b058bfb4..670638efb71 100644 --- a/opencga-client/src/main/python/notebooks/pyopencga_basic_notebook_002-coverage.ipynb +++ b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_002-coverage.ipynb @@ -195,9 +195,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.2" + "version": "3.7.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/opencga-client/src/main/python/notebooks/pyopencga_basic_notebook_003-variants.ipynb b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_003-variants.ipynb similarity index 99% rename from opencga-client/src/main/python/notebooks/pyopencga_basic_notebook_003-variants.ipynb rename to opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_003-variants.ipynb index 2545f8125d1..c7be065ec72 100644 --- a/opencga-client/src/main/python/notebooks/pyopencga_basic_notebook_003-variants.ipynb +++ b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_003-variants.ipynb @@ -177,7 +177,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.7.6" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb new file mode 100644 index 00000000000..9dc46847784 --- /dev/null +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "acting-panic", + "metadata": {}, + "source": [ + "# pyOpenCGA first steps: Loggin, Working with RestResponse, Launching Jobs\n", + "\n", + "------\n", + "**[NOTE]** The server methods used by pyopencga client are defined in the following swagger URL:\n", + "- http://bioinfodev.hpc.cam.ac.uk/opencga-test/webservices\n", + "\n", + "This notebook is intended to provide guidance for getting pyopencga (the Python client of OpenCGA) started.\n", + "\n", + "For that, information about loggin into opencga with user credentials, working with the RestResponse wrapper object to easily explore data returned by the client responses and launching jobs for different purposes.\n", + "\n", + "The methods addressed here constitute a high-level introduction of common steps that a user might come through when using OpenCGA with our Python Client, like retrieving information for different studies, clinical data, variant filtering or analysis and exporting of files. \n", + "\n", + "A guide through some common user-cases are provided in two different notebooks that can be found here:\n", + "---ADD NOTEBOOK-02 and NOTEBOOK03 LINKS---\n", + " \n", + "\n", + "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", + "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing" + ] + }, + { + "cell_type": "markdown", + "id": "static-skirt", + "metadata": {}, + "source": [ + "## 1. Loading pyOpenCGA\n", + "\n", + "You have two main options\n", + "\n", + "### a) From source code: \n", + "If you need to import from the source code remember that Python3 does not accept relative importing, so you need to append the module path to sys.path\n", + "\n", + "Preparing environment for importing from source" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "surrounded-anthony", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "current_dir: ....r-training\n", + "base_modules_dir: ..../notebooks\n" + ] + } + ], + "source": [ + "# Initialize PYTHONPATH for pyopencga\n", + "import sys\n", + "import os\n", + "from pprint import pprint\n", + "\n", + "cwd = os.getcwd()\n", + "print(\"current_dir: ....\"+cwd[-10:])\n", + "\n", + "base_modules_dir = os.path.dirname(cwd)\n", + "print(\"base_modules_dir: ....\"+base_modules_dir[-10:])\n", + "\n", + "sys.path.append(base_modules_dir)" + ] + }, + { + "cell_type": "markdown", + "id": "fixed-castle", + "metadata": {}, + "source": [ + "### b) Installed pyopencga (recommended): \n", + "\n", + "You can import pyopencga directly if you have installed pyopencga with PyPI (The Python Package Index).\n", + "For further documentation, reffer to https://pypi.org/project/pyopencga/.\n", + "\n", + "Installation with " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f366d189b3cf731d112548a51aca3b01a311b007 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 10 Mar 2021 18:16:06 +0100 Subject: [PATCH 065/412] clinical: check access to non-indexed studies, #1693 --- .../opencb/opencga/clinical/rga/RgaManager.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index de94e632988..95f3e31e897 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -71,6 +71,9 @@ public OpenCGAResult individualQuery(String studyStr, Quer Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "'"); + } Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); @@ -136,6 +139,10 @@ public OpenCGAResult geneQuery(String studyStr, Query query, String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "'"); + } + QueryOptions queryOptions = setDefaultLimit(options); List includeIndividuals = queryOptions.getAsStringList(RgaQueryParams.INCLUDE_INDIVIDUAL); @@ -171,6 +178,9 @@ public OpenCGAResult geneQuery(String studyStr, Query query, // 2. Check permissions DataResult result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID).append(QueryOptions.LIMIT, -1)); + if (result.getNumResults() == 0) { + return OpenCGAResult.empty(RgaKnockoutByGene.class); + } List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); // 3. Get list of individual ids for which the user has permissions @@ -210,6 +220,9 @@ public OpenCGAResult variantQuery(String studyStr, Query quer Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "'"); + } QueryOptions queryOptions = setDefaultLimit(options); @@ -244,6 +257,9 @@ public OpenCGAResult variantQuery(String studyStr, Query quer // 2. Check permissions DataResult result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_ID).append(QueryOptions.LIMIT, -1)); + if (result.getNumResults() == 0) { + return OpenCGAResult.empty(KnockoutByVariant.class); + } List individualIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue) .collect(Collectors.toList()); From a65c56285156ae74daa40eeadee707e2c7da0088 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Wed, 10 Mar 2021 19:24:11 +0000 Subject: [PATCH 066/412] client: first notebook created. Jobs part needs to be added. #1716 --- .../pyopencga_first_steps_001.ipynb | 442 +++++++++++++++++- 1 file changed, 422 insertions(+), 20 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb index 9dc46847784..ed7c94b234a 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb @@ -2,23 +2,23 @@ "cells": [ { "cell_type": "markdown", - "id": "acting-panic", + "id": "physical-holocaust", "metadata": {}, "source": [ - "# pyOpenCGA first steps: Loggin, Working with RestResponse, Launching Jobs\n", + "# *pyopencga* First Steps: Loggin, Working with RestResponses, Launching Jobs.\n", "\n", "------\n", - "**[NOTE]** The server methods used by pyopencga client are defined in the following swagger URL:\n", + "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", "- http://bioinfodev.hpc.cam.ac.uk/opencga-test/webservices\n", "\n", - "This notebook is intended to provide guidance for getting pyopencga (the Python client of OpenCGA) started.\n", + "This notebook is intended to provide guidance for getting *pyopencga* (the Python client of OpenCGA) started.\n", "\n", - "For that, information about loggin into opencga with user credentials, working with the RestResponse wrapper object to easily explore data returned by the client responses and launching jobs for different purposes.\n", + "The methods addressed here constitute a high-level introduction of common steps that a user might often come across when using OpenCGA with our Python Client, like retrieving information for different studies, clinical data, variant filtering or analysis and exporting of files. \n", "\n", - "The methods addressed here constitute a high-level introduction of common steps that a user might come through when using OpenCGA with our Python Client, like retrieving information for different studies, clinical data, variant filtering or analysis and exporting of files. \n", + "Information is provided for: loggin into OpenCGA with user credentials, working with the RestResponse wrapper object to easily explore data returned by the client responses and launching jobs for different purposes.\n", "\n", - "A guide through some common user-cases are provided in two different notebooks that can be found here:\n", - "---ADD NOTEBOOK-02 and NOTEBOOK03 LINKS---\n", + "\n", + "A guide through some **common user-cases** are provided in two different notebooks that can be found here:
---ADD NOTEBOOK-02 and NOTEBOOK03 LINKS---\n", " \n", "\n", "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", @@ -27,23 +27,31 @@ }, { "cell_type": "markdown", - "id": "static-skirt", + "id": "sunrise-accuracy", + "metadata": {}, + "source": [ + "## 1. Getting Started: Install *pyopencga*, import the modules, create server and client configuration with credentials." + ] + }, + { + "cell_type": "markdown", + "id": "critical-application", "metadata": {}, "source": [ - "## 1. Loading pyOpenCGA\n", + "## 1.1 Installing the *pyopencga* library\n", "\n", - "You have two main options\n", + "You have two main options for get *pyopencga* installed in your python setup:\n", "\n", - "### a) From source code: \n", - "If you need to import from the source code remember that Python3 does not accept relative importing, so you need to append the module path to sys.path\n", + "### a) Install from source code: \n", + "If you need to import from the source code, remember that Python3 does not accept relative importing, so you need to append the module path to sys.path\n", "\n", "Preparing environment for importing from source" ] }, { "cell_type": "code", - "execution_count": 1, - "id": "surrounded-anthony", + "execution_count": 21, + "id": "formal-messaging", "metadata": {}, "outputs": [ { @@ -72,15 +80,409 @@ }, { "cell_type": "markdown", - "id": "fixed-castle", + "id": "novel-taiwan", + "metadata": {}, + "source": [ + "### b) **RECOMENDED:** Install *pyopencga* with pip\n", + "\n", + "You can import pyopencga directly if you have installed *pyopencga* with PyPI (The Python Package Index).
For further documentation reffer to https://pypi.org/project/pyopencga/.
The user just needs to access the console terminal (optionally within a python environment) and run:\n", + "\n", + "`$ pip install pyopencga`" + ] + }, + { + "cell_type": "markdown", + "id": "distinct-carpet", + "metadata": {}, + "source": [ + "## 1.2 Importing the *pyopencga* library\n", + "\n", + "This is the recommended way of using *pyopencga* " + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "coastal-score", + "metadata": {}, + "outputs": [], + "source": [ + "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", + "from pyopencga.opencga_client import OpencgaClient # import client module\n", + "from pprint import pprint\n", + "import json\n" + ] + }, + { + "cell_type": "markdown", + "id": "metallic-ultimate", + "metadata": {}, + "source": [ + "## 1.3 Setup the Client and Login in *pyopencga* \n", + "\n", + "**Configuration and Credentials** \n", + "\n", + "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n", + "\n", + "Regarding credentials, you can set both user and password as two variables in the script. If you prefer not to show the password, it would be asked interactively without echo.\n" + ] + }, + { + "cell_type": "markdown", + "id": "early-ballot", + "metadata": {}, + "source": [ + "### 1.3.1 Set variables for server host, user credentials and project owner" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "interesting-claim", + "metadata": {}, + "outputs": [], + "source": [ + "# server host\n", + "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", + "\n", + "# user credentials\n", + "user = \"demouser\"\n", + "passwd = \"demouser\" ## you can skip this, see below.\n", + "\n", + "# the user demo access projects from user opencga\n", + "prj_owner = \"demo\"" + ] + }, + { + "cell_type": "markdown", + "id": "pending-generic", + "metadata": {}, + "source": [ + "### 1.3.2 Creating ConfigClient dictionary for server connection configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "inclusive-fashion", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Config information:\n", + " {'rest': {'host': 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'}}\n" + ] + } + ], + "source": [ + "# Creating ClientConfiguration dict\n", + "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", + "\n", + "config_dict = {\"rest\": {\n", + " \"host\": host \n", + " }\n", + " }\n", + "\n", + "print(\"Config information:\\n\",config_dict)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "whole-lingerie", "metadata": {}, "source": [ - "### b) Installed pyopencga (recommended): \n", + "### 1.3.3 Initialize the client configuration\n", "\n", - "You can import pyopencga directly if you have installed pyopencga with PyPI (The Python Package Index).\n", - "For further documentation, reffer to https://pypi.org/project/pyopencga/.\n", + "Now we need to pass the *config_dict* dictionary to the **ClientConfiguration** method" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "unable-stack", + "metadata": {}, + "outputs": [], + "source": [ + "config = ClientConfiguration(config_dict)\n", + "oc = OpencgaClient(config)\n" + ] + }, + { + "cell_type": "markdown", + "id": "fabulous-uzbekistan", + "metadata": {}, + "source": [ + "### 1.3.4 Import the user credentials to the previously defined *OpencgaClient* instance and Login\n", "\n", - "Installation with " + "We can decide to pass the password as a variable, or just pass the user and be asked for the password interactively" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "undefined-member", + "metadata": {}, + "outputs": [], + "source": [ + "# here we put only the user in order to be asked for the password interactively\n", + "# oc.login(user)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "falling-attachment", + "metadata": {}, + "outputs": [], + "source": [ + "# or you can pass the user and passwd\n", + "oc.login(user, passwd)" + ] + }, + { + "cell_type": "markdown", + "id": "competitive-charles", + "metadata": {}, + "source": [ + "#### ✅ Congrats! You are now connected to OpenCGA" + ] + }, + { + "cell_type": "markdown", + "id": "healthy-mexico", + "metadata": {}, + "source": [ + "## 2. Working with RESTResponse results\n", + "\n", + "*pyopencga* queries web services that return a RESTResponse object, which might be difficult to interpretate. The RESTResponse type provide the data in a manner that is not as intuitive as a python list or dictionary. Because of this, we have develop a useful functionality that retrieves the data in a simpler format. \n", + "\n", + "[OpenCGA Client Libraries](http://docs.opencb.org/display/opencga/Using+OpenCGA), including *pyopencga*, implement a **RESTReponse wrapper** to make even easier to work with REST web services responses.
REST responsess include metadata and OpenCGA 2.0.1 has been designed to work in a federation mode (more information about OpenCGA federations can be found **[here](http://docs.opencb.org/display/opencga/Roadmapg)**).\n", + "\n", + "All these can make a first-time user to struggle when start working with the responses. Please read this brief documentation about **[OpenCGA RESTful Web Services](http://docs.opencb.org/display/opencga/RESTful+Web+Services#RESTfulWebServices-OpenCGA2.x)**.\n", + "\n", + "Let's see a quick example of how to use RESTResponse wrapper in *pyopencga*. \n", + "You can get some extra inforamtion [here](http://docs.opencb.org/display/opencga/Python#Python-WorkingwiththeRestResponse). Let's execute a first simple query to fetch all projects for the user **demouser** already logged in **[step 1.3](#1.3-Setup-the-client-and-login-in-pyopencga)**." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "sunrise-parts", + "metadata": {}, + "outputs": [], + "source": [ + "## Let's fecth the available projects.\n", + "## First let's get the project client and execute search() funciton\n", + "project_client = oc.projects\n", + "projects = project_client.search()\n", + "\n", + "## Uncomment this line to view the JSON response.\n", + "## NOTE: it incudes study information so this can be big\n", + "##pprint(projects.get_responses())" + ] + }, + { + "cell_type": "markdown", + "id": "agreed-privilege", + "metadata": {}, + "source": [ + "#### Although you can iterate through all the different projects provided by the response by executing the next chunk of code, this is a **not recommended** way.\n", + "We can explore this through an example; the next query iterates over all the projects retrieved from `projects.search()`" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "essential-pastor", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "family Family Studies GRCh37\n", + "population Population Studies GRCh38\n" + ] + } + ], + "source": [ + "## Loop through all diferent projects \n", + "for project in projects.responses[0]['results']:\n", + " print(project['id'], project['name'])" + ] + }, + { + "cell_type": "markdown", + "id": "proved-doctor", + "metadata": {}, + "source": [ + "### 2.1 Using the `get_results()` function \n", + "\n", + "Using the functions that *pyopencga* implements for the RestResponse object makes things much easier!
Let's dig into an example using the same query as above:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "medieval-belief", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "family Family Studies GRCh37\n", + "population Population Studies GRCh38\n" + ] + } + ], + "source": [ + "# Loop through all diferent projects \n", + "for project in projects.get_results():\n", + " print(project['id'], project['name'])" + ] + }, + { + "cell_type": "markdown", + "id": "large-springfield", + "metadata": {}, + "source": [ + "### 2.2 Using the `result_iterator()` function to iterate over the Rest results\n", + "\n", + "You can also iterate results, this is specially interesting when fetching many results from the server:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "choice-rotation", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "family Family Studies GRCh37\n", + "population Population Studies GRCh38\n" + ] + } + ], + "source": [ + "## Iterate through all diferent projects \n", + "for project in projects.result_iterator():\n", + " print(project['id'], project['name'])" + ] + }, + { + "cell_type": "markdown", + "id": "iraqi-restaurant", + "metadata": {}, + "source": [ + "### 2.2 Using `print_results()` function to iterate over the Rest results\n", + "\n", + "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "shared-little", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 81\n", + "#Num matches: -1\n", + "#Num results: 2\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tname\tuuid\tfqn\tcreationDate\tmodificationDate\tdescription\torganism\tcurrentRelease\tstudies\tinternal\tattributes\n", + "family\tFamily Studies GRCh37\teba0e1c7-0172-0001-0001-c7af712652b2\tdemo@family\t20200625131808\t20200625131808\t\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh37'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200625131808', 'description': ''}}\t{}\n", + "population\tPopulation Studies GRCh38\t25f2842a-0173-0001-0001-e7bcbedc77ff\tdemo@population\t20200706210517\t20200706210517\tSome population reference studies for GRCh38\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh38'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200706210517', 'description': ''}}\t{}\n" + ] + } + ], + "source": [ + "## This function iterates over all the results, it can be configured to exclude metadata, change separator or even select the fields!\n", + "projects.print_results()" + ] + }, + { + "cell_type": "markdown", + "id": "express-lyric", + "metadata": {}, + "source": [ + "##### Now, let's try to costumize the results so we can get printed only the portion of the data that we might be interested in" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "polyphonic-surprise", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#id\tname\torganism.scientificName\torganism.assembly\n", + "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\n", + "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\n", + "\n" + ] + } + ], + "source": [ + "## Lets exclude metadata and print only few fields, use dot notation for ensted fields\n", + "projects.print_results(fields='id,name,organism.scientificName,organism.assembly',metadata=False)\n", + "print()\n" + ] + }, + { + "cell_type": "markdown", + "id": "differential-buyer", + "metadata": {}, + "source": [ + "##### A very useful parameter is the *separator*.
It allows the user to decide the format in which the data is printed. For example, it's possible to print a CSV-like style:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "unexpected-corruption", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Print the projects with a header and a different separator:\n", + "\n", + "#id,name,organism.scientificName,organism.assembly\n", + "family,Family Studies GRCh37,Homo sapiens,GRCh37\n", + "population,Population Studies GRCh38,Homo sapiens,GRCh38\n" + ] + } + ], + "source": [ + "## You can change separator\n", + "\n", + "print('Print the projects with a header and a different separator:\\n')\n", + "projects.print_results(fields='id,name,organism.scientificName,organism.assembly', separator=',', metadata=False)\n" + ] + }, + { + "cell_type": "markdown", + "id": "hindu-chrome", + "metadata": {}, + "source": [ + "## 3. Working with JOBS" ] } ], From 29edb838cad98a73519d067f264aa5ee34e75300 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Wed, 10 Mar 2021 19:56:32 +0000 Subject: [PATCH 067/412] client: reorganize and create 2 empty notebooks #1716 --- ....ipynb => 001-pyopencga_first_steps.ipynb} | 68 +++++++++---------- .../user-training/002-pyopencga_CATALOG.ipynb | 33 +++++++++ .../003-pyopencga_variant_analysis.ipynb | 33 +++++++++ 3 files changed, 100 insertions(+), 34 deletions(-) rename opencga-client/src/main/python/notebooks/user-training/{pyopencga_first_steps_001.ipynb => 001-pyopencga_first_steps.ipynb} (94%) create mode 100644 opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb create mode 100644 opencga-client/src/main/python/notebooks/user-training/003-pyopencga_variant_analysis.ipynb diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb b/opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb similarity index 94% rename from opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb rename to opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb index ed7c94b234a..97e01b61f78 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps_001.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "physical-holocaust", + "id": "spectacular-conditions", "metadata": {}, "source": [ "# *pyopencga* First Steps: Loggin, Working with RestResponses, Launching Jobs.\n", @@ -27,7 +27,7 @@ }, { "cell_type": "markdown", - "id": "sunrise-accuracy", + "id": "valid-edition", "metadata": {}, "source": [ "## 1. Getting Started: Install *pyopencga*, import the modules, create server and client configuration with credentials." @@ -35,7 +35,7 @@ }, { "cell_type": "markdown", - "id": "critical-application", + "id": "artistic-adrian", "metadata": {}, "source": [ "## 1.1 Installing the *pyopencga* library\n", @@ -51,7 +51,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "formal-messaging", + "id": "registered-turner", "metadata": {}, "outputs": [ { @@ -80,7 +80,7 @@ }, { "cell_type": "markdown", - "id": "novel-taiwan", + "id": "spiritual-theater", "metadata": {}, "source": [ "### b) **RECOMENDED:** Install *pyopencga* with pip\n", @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "distinct-carpet", + "id": "chubby-labor", "metadata": {}, "source": [ "## 1.2 Importing the *pyopencga* library\n", @@ -103,7 +103,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "coastal-score", + "id": "looking-scotland", "metadata": {}, "outputs": [], "source": [ @@ -115,7 +115,7 @@ }, { "cell_type": "markdown", - "id": "metallic-ultimate", + "id": "final-disney", "metadata": {}, "source": [ "## 1.3 Setup the Client and Login in *pyopencga* \n", @@ -129,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "early-ballot", + "id": "dramatic-referral", "metadata": {}, "source": [ "### 1.3.1 Set variables for server host, user credentials and project owner" @@ -138,7 +138,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "interesting-claim", + "id": "indonesian-stevens", "metadata": {}, "outputs": [], "source": [ @@ -155,7 +155,7 @@ }, { "cell_type": "markdown", - "id": "pending-generic", + "id": "separated-rings", "metadata": {}, "source": [ "### 1.3.2 Creating ConfigClient dictionary for server connection configuration" @@ -164,7 +164,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "inclusive-fashion", + "id": "mathematical-russia", "metadata": {}, "outputs": [ { @@ -191,7 +191,7 @@ }, { "cell_type": "markdown", - "id": "whole-lingerie", + "id": "knowing-application", "metadata": {}, "source": [ "### 1.3.3 Initialize the client configuration\n", @@ -202,7 +202,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "unable-stack", + "id": "continental-classic", "metadata": {}, "outputs": [], "source": [ @@ -212,7 +212,7 @@ }, { "cell_type": "markdown", - "id": "fabulous-uzbekistan", + "id": "peripheral-aggregate", "metadata": {}, "source": [ "### 1.3.4 Import the user credentials to the previously defined *OpencgaClient* instance and Login\n", @@ -223,7 +223,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "undefined-member", + "id": "parallel-pearl", "metadata": {}, "outputs": [], "source": [ @@ -234,7 +234,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "falling-attachment", + "id": "gross-missouri", "metadata": {}, "outputs": [], "source": [ @@ -244,7 +244,7 @@ }, { "cell_type": "markdown", - "id": "competitive-charles", + "id": "african-integration", "metadata": {}, "source": [ "#### ✅ Congrats! You are now connected to OpenCGA" @@ -252,7 +252,7 @@ }, { "cell_type": "markdown", - "id": "healthy-mexico", + "id": "built-broadcast", "metadata": {}, "source": [ "## 2. Working with RESTResponse results\n", @@ -270,7 +270,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "sunrise-parts", + "id": "legitimate-telephone", "metadata": {}, "outputs": [], "source": [ @@ -286,7 +286,7 @@ }, { "cell_type": "markdown", - "id": "agreed-privilege", + "id": "flush-blocking", "metadata": {}, "source": [ "#### Although you can iterate through all the different projects provided by the response by executing the next chunk of code, this is a **not recommended** way.\n", @@ -296,7 +296,7 @@ { "cell_type": "code", "execution_count": 29, - "id": "essential-pastor", + "id": "liquid-uncertainty", "metadata": {}, "outputs": [ { @@ -316,7 +316,7 @@ }, { "cell_type": "markdown", - "id": "proved-doctor", + "id": "fallen-proceeding", "metadata": {}, "source": [ "### 2.1 Using the `get_results()` function \n", @@ -327,7 +327,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "medieval-belief", + "id": "developing-elimination", "metadata": {}, "outputs": [ { @@ -347,7 +347,7 @@ }, { "cell_type": "markdown", - "id": "large-springfield", + "id": "square-amsterdam", "metadata": {}, "source": [ "### 2.2 Using the `result_iterator()` function to iterate over the Rest results\n", @@ -358,7 +358,7 @@ { "cell_type": "code", "execution_count": 31, - "id": "choice-rotation", + "id": "brief-tattoo", "metadata": {}, "outputs": [ { @@ -378,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "iraqi-restaurant", + "id": "immediate-writing", "metadata": {}, "source": [ "### 2.2 Using `print_results()` function to iterate over the Rest results\n", @@ -389,7 +389,7 @@ { "cell_type": "code", "execution_count": 32, - "id": "shared-little", + "id": "gentle-madness", "metadata": {}, "outputs": [ { @@ -415,7 +415,7 @@ }, { "cell_type": "markdown", - "id": "express-lyric", + "id": "stable-moscow", "metadata": {}, "source": [ "##### Now, let's try to costumize the results so we can get printed only the portion of the data that we might be interested in" @@ -424,7 +424,7 @@ { "cell_type": "code", "execution_count": 33, - "id": "polyphonic-surprise", + "id": "parallel-recipe", "metadata": {}, "outputs": [ { @@ -446,7 +446,7 @@ }, { "cell_type": "markdown", - "id": "differential-buyer", + "id": "portuguese-chocolate", "metadata": {}, "source": [ "##### A very useful parameter is the *separator*.
It allows the user to decide the format in which the data is printed. For example, it's possible to print a CSV-like style:" @@ -455,7 +455,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "unexpected-corruption", + "id": "final-track", "metadata": {}, "outputs": [ { @@ -479,7 +479,7 @@ }, { "cell_type": "markdown", - "id": "hindu-chrome", + "id": "electronic-ocean", "metadata": {}, "source": [ "## 3. Working with JOBS" @@ -502,7 +502,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.13" + "version": "3.7.6" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb b/opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb new file mode 100644 index 00000000000..761a0339727 --- /dev/null +++ b/opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb @@ -0,0 +1,33 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "determined-interval", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/opencga-client/src/main/python/notebooks/user-training/003-pyopencga_variant_analysis.ipynb b/opencga-client/src/main/python/notebooks/user-training/003-pyopencga_variant_analysis.ipynb new file mode 100644 index 00000000000..4e6e4885504 --- /dev/null +++ b/opencga-client/src/main/python/notebooks/user-training/003-pyopencga_variant_analysis.ipynb @@ -0,0 +1,33 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "official-extent", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 0e7a6b082f5db5a41fbbfb2344263320166d7394 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 11 Mar 2021 10:05:30 +0100 Subject: [PATCH 068/412] storage:support queries by variant type and clinicalsignificance, #1693 --- .../rest/analysis/ClinicalWebService.java | 6 ++++ .../rest/analysis/VariantWebService.java | 4 +-- .../storage/core/rga/GeneRgaConverter.java | 4 +++ .../core/rga/IndividualRgaConverter.java | 19 ++++++++-- .../storage/core/rga/RgaDataModel.java | 36 +++++++++++++++++-- .../storage/core/rga/RgaQueryParams.java | 7 ++++ .../storage/core/rga/RgaQueryParser.java | 2 ++ .../storage/core/rga/VariantRgaConverter.java | 5 +++ .../src/main/resources/rga/managed-schema | 2 ++ 9 files changed, 78 insertions(+), 7 deletions(-) diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index f0804c599fe..27f48015ef8 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -669,6 +669,8 @@ public Response interpretationDistinct( @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "clinicalSignificance", value = RgaQueryParams.CLINICAL_SIGNIFICANCE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "populationFrequency", value = RgaQueryParams.POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "consequenceType", value = RgaQueryParams.CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query") }) @@ -713,6 +715,8 @@ public Response rgaIndividualQuery( @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "clinicalSignificance", value = RgaQueryParams.CLINICAL_SIGNIFICANCE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "populationFrequency", value = RgaQueryParams.POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "consequenceType", value = RgaQueryParams.CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query") }) @@ -757,6 +761,8 @@ public Response rgaGeneQuery( @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "clinicalSignificance", value = RgaQueryParams.CLINICAL_SIGNIFICANCE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "populationFrequency", value = RgaQueryParams.POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "consequenceType", value = RgaQueryParams.CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query") }) diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 0ac8a0abc52..4636c06da54 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -82,7 +82,6 @@ import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.rga.RgaQueryParams; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; -import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationManager; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; @@ -101,8 +100,9 @@ import static org.opencb.opencga.core.api.ParamConstants.JOB_DEPENDS_ON; import static org.opencb.opencga.core.common.JacksonUtils.getUpdateObjectMapper; import static org.opencb.opencga.storage.core.rga.RgaQueryParams.*; -import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.FILTER_DESCR; +import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.TYPE_DESCR; +import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; /** * Created by imedina on 17/08/16. diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java index 52414304bb8..39d3d7e6591 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java @@ -53,10 +53,14 @@ public class GeneRgaConverter implements ComplexTypeConverter convertToStorageType(KnockoutByIndividual knockoutByI .map(Enum::name) .distinct() .collect(Collectors.toList()); + List types = transcript.getVariants().stream() + .map(KnockoutVariant::getType) + .map(String::valueOf) + .distinct() + .collect(Collectors.toList()); List consequenceTypes = transcript.getVariants().stream() .flatMap(kv -> kv.getSequenceOntologyTerms().stream()) .map(SequenceOntologyTerm::getAccession) .distinct() .collect(Collectors.toList()); + List clinicalSignificances = transcript.getVariants().stream() + .flatMap(kv -> kv.getClinicalSignificance().stream()) + .map(String::valueOf) + .distinct() + .collect(Collectors.toList()); List filters = transcript.getVariants().stream() .map(KnockoutVariant::getFilter) .distinct().collect(Collectors.toList()); @@ -272,8 +286,9 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI RgaDataModel model = new RgaDataModel(id, individualId, knockoutByIndividual.getSampleId(), sex, phenotypes, disorders, knockoutByIndividual.getFatherId(), knockoutByIndividual.getMotherId(), numParents, gene.getId(), - gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, knockoutTypes, - filters, consequenceTypes, popFreqs, compoundFilters, phenotypeJson, disorderJson, variantJson); + gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, types, + knockoutTypes, filters, consequenceTypes, clinicalSignificances, popFreqs, compoundFilters, phenotypeJson, + disorderJson, variantJson); result.add(model); } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java index 768c0251e5d..9afad57220a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java @@ -64,6 +64,9 @@ public class RgaDataModel { @Field private List variants; + @Field + private List types; + @Field private List knockoutTypes; @@ -73,6 +76,9 @@ public class RgaDataModel { @Field private List consequenceTypes; + @Field + private List clinicalSignificances; + @Field(POPULATION_FREQUENCIES) private Map> populationFrequencies; @@ -107,9 +113,11 @@ public class RgaDataModel { public static final String TRANSCRIPT_ID = "transcriptId"; public static final String TRANSCRIPT_BIOTYPE = "transcriptBiotype"; public static final String VARIANTS = "variants"; + public static final String TYPES = "types"; public static final String KNOCKOUT_TYPES = "knockoutTypes"; public static final String FILTERS = "filters"; public static final String CONSEQUENCE_TYPES = "consequenceTypes"; + public static final String CLINICAL_SIGNIFICANCES = "clinicalSignificances"; public static final String POPULATION_FREQUENCIES = "populationFrequencies_*"; public static final String COMPOUND_FILTERS = "compoundFilters"; public static final String PHENOTYPE_JSON = "phenotypeJson"; @@ -124,9 +132,9 @@ public RgaDataModel() { public RgaDataModel(String id, String individualId, String sampleId, String sex, List phenotypes, List disorders, String fatherId, String motherId, int numParents, String geneId, String geneName, String geneBiotype, String chromosome, String strand, int start, int end, String transcriptId, String transcriptBiotype, - List variants, List knockoutTypes, List filters, List consequenceTypes, - Map> populationFrequencies, List compoundFilters, List phenotypeJson, - List disorderJson, List variantJson) { + List variants, List types, List knockoutTypes, List filters, + List consequenceTypes, List clinicalSignificances, Map> populationFrequencies, + List compoundFilters, List phenotypeJson, List disorderJson, List variantJson) { this.id = id; this.individualId = individualId; this.sampleId = sampleId; @@ -146,9 +154,11 @@ public RgaDataModel(String id, String individualId, String sampleId, String sex, this.transcriptId = transcriptId; this.transcriptBiotype = transcriptBiotype; this.variants = variants; + this.types = types; this.knockoutTypes = knockoutTypes; this.filters = filters; this.consequenceTypes = consequenceTypes; + this.clinicalSignificances = clinicalSignificances; this.populationFrequencies = populationFrequencies; this.compoundFilters = compoundFilters; this.phenotypeJson = phenotypeJson; @@ -178,9 +188,11 @@ public String toString() { sb.append(", transcriptId='").append(transcriptId).append('\''); sb.append(", transcriptBiotype='").append(transcriptBiotype).append('\''); sb.append(", variants=").append(variants); + sb.append(", types=").append(types); sb.append(", knockoutTypes=").append(knockoutTypes); sb.append(", filters=").append(filters); sb.append(", consequenceTypes=").append(consequenceTypes); + sb.append(", clinicalSignificances=").append(clinicalSignificances); sb.append(", populationFrequencies=").append(populationFrequencies); sb.append(", compoundFilters=").append(compoundFilters); sb.append(", phenotypeJson=").append(phenotypeJson); @@ -361,6 +373,15 @@ public RgaDataModel setVariants(List variants) { return this; } + public List getTypes() { + return types; + } + + public RgaDataModel setTypes(List types) { + this.types = types; + return this; + } + public List getKnockoutTypes() { return knockoutTypes; } @@ -388,6 +409,15 @@ public RgaDataModel setConsequenceTypes(List consequenceTypes) { return this; } + public List getClinicalSignificances() { + return clinicalSignificances; + } + + public RgaDataModel setClinicalSignificances(List clinicalSignificances) { + this.clinicalSignificances = clinicalSignificances; + return this; + } + public Map> getPopulationFrequencies() { return populationFrequencies; } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java index 29e200ae932..a4c4515dae1 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java @@ -65,6 +65,13 @@ public class RgaQueryParams implements QueryParam { public static final String FILTER_DESCR = "Filter by filter (PASS, NOT_PASS)."; public static final RgaQueryParams FILTER = new RgaQueryParams("filter", Type.TEXT, FILTER_DESCR); + public static final String TYPE_DESCR = "Filter by variant type."; + public static final RgaQueryParams TYPE = new RgaQueryParams("type", Type.TEXT, TYPE_DESCR); + + public static final String CLINICAL_SIGNIFICANCE_DESCR = "Filter by clinical significance."; + public static final RgaQueryParams CLINICAL_SIGNIFICANCE = new RgaQueryParams("clinicalSignificance", Type.TEXT, + CLINICAL_SIGNIFICANCE_DESCR); + public static final String POPULATION_FREQUENCY_DESCR = "Filter by population frequency."; public static final RgaQueryParams POPULATION_FREQUENCY = new RgaQueryParams("populationFrequency", Type.TEXT, POPULATION_FREQUENCY_DESCR); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java index 1a6fb1e20a1..ab0c36755ce 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java @@ -51,6 +51,8 @@ public SolrQuery parseQuery(Query query) throws RgaException { parseStringValue(finalQuery, GENE_ID, RgaDataModel.GENE_ID, filterList); parseStringValue(finalQuery, GENE_NAME, RgaDataModel.GENE_NAME, filterList); parseStringValue(finalQuery, TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_ID, filterList); + parseStringValue(finalQuery, TYPE, RgaDataModel.TYPES, filterList); + parseStringValue(finalQuery, CLINICAL_SIGNIFICANCE, RgaDataModel.CLINICAL_SIGNIFICANCES, filterList); // parseStringValue(finalQuery, TRANSCRIPT_BIOTYPE, RgaDataModel.TRANSCRIPT_BIOTYPE, filterList); parseStringValue(finalQuery, VARIANTS, RgaDataModel.VARIANTS, filterList); parseFilterValue(finalQuery, filterList); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java index 5dd7083bd68..953dbedac9a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java @@ -58,6 +58,8 @@ public class VariantRgaConverter implements ComplexTypeConverter + + From a91572b4c4e24f201ff2c52f4bb187845f25abf6 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 11 Mar 2021 10:20:05 +0100 Subject: [PATCH 069/412] server: add rga aggregationstats web service, #1693 --- .../opencga/clinical/rga/RgaManager.java | 23 +++++++-- .../rest/analysis/ClinicalWebService.java | 49 +++++++++++++++++-- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 95f3e31e897..c864f6ebba8 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -72,7 +72,7 @@ public OpenCGAResult individualQuery(String studyStr, Quer String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { - throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "'"); + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); @@ -140,7 +140,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, String collection = getCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { - throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "'"); + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } QueryOptions queryOptions = setDefaultLimit(options); @@ -221,7 +221,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { - throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "'"); + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } QueryOptions queryOptions = setDefaultLimit(options); @@ -295,6 +295,23 @@ public OpenCGAResult variantQuery(String studyStr, Query quer } } + public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) + throws CatalogException, IOException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String userId = catalogManager.getUserManager().getUserId(token); + + catalogManager.getAuthorizationManager().checkCanViewStudy(study.getUid(), userId); + + String collection = getCollectionName(study.getFqn()); + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); + queryOptions.put(QueryOptions.FACET, fields); + return new OpenCGAResult<>(rgaEngine.facetedQuery(collection, query, queryOptions)); + } + private QueryOptions setDefaultLimit(QueryOptions options) { QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); if (!queryOptions.containsKey(QueryOptions.LIMIT)) { diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 27f48015ef8..6fbe9f3856f 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -20,10 +20,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.interpretation.ClinicalVariant; -import org.opencb.commons.datastore.core.DataResult; -import org.opencb.commons.datastore.core.Event; -import org.opencb.commons.datastore.core.Query; -import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.datastore.core.*; import org.opencb.opencga.analysis.clinical.ClinicalInterpretationManager; import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; @@ -50,6 +47,7 @@ import org.opencb.opencga.storage.core.rga.RgaQueryParams; import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.QueryParam; import javax.ws.rs.*; import javax.ws.rs.core.*; import java.io.IOException; @@ -778,6 +776,49 @@ public Response rgaVariantQuery( }); } + @GET + @Path("/rga/aggregationStats") + @ApiOperation(value = "RGA aggregation stats", response = FacetField.class) + @ApiImplicitParams({ + // QueryOptions + @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), + + @ApiImplicitParam(name = "sampleId", value = RgaQueryParams.SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "individualId", value = RgaQueryParams.INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "sex", value = RgaQueryParams.SEX_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "phenotypes", value = RgaQueryParams.PHENOTYPES_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "disorders", value = RgaQueryParams.DISORDERS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "numParents", value = RgaQueryParams.NUM_PARENTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneId", value = RgaQueryParams.GENE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneName", value = RgaQueryParams.GENE_NAME_DESCR, dataType = "string", paramType = "query"), +// @ApiImplicitParam(name = "geneBiotype", value = RgaQueryParams.GENE_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "chromosome", value = RgaQueryParams.CHROMOSOME_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "start", value = RgaQueryParams.START_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "end", value = RgaQueryParams.END_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), +// @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "clinicalSignificance", value = RgaQueryParams.CLINICAL_SIGNIFICANCE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "populationFrequency", value = RgaQueryParams.POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "consequenceType", value = RgaQueryParams.CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query") + }) + public Response rgaAggregationStats( + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String studyStr, + @ApiParam(value = "List of fields separated by semicolons, e.g.: clinicalSignificances;type. For nested fields use >>, e.g.: type>>clinicalSignificances;knockoutType") @QueryParam("field") String facet + ) { + // Get all query options + return run(() -> { + QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); + Query query = RgaQueryParams.getQueryParams(queryOptions); + + return getRgaManager().aggregationStats(studyStr, query, queryOptions, facet, token); + }); + } + @POST @Path("/rga/index/run") @ApiOperation(value = RgaAnalysis.DESCRIPTION, response = Job.class) From 1182240b13298fa72312fa81be1d08841f7a24c8 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 11 Mar 2021 11:07:56 +0000 Subject: [PATCH 070/412] client: improve second notebook #1716 --- .../001-pyopencga_first_steps.ipynb | 68 ++--- .../user-training/002-pyopencga_CATALOG.ipynb | 239 +++++++++++++++++- 2 files changed, 271 insertions(+), 36 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb index 97e01b61f78..eb4f5b1e2ff 100644 --- a/opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "spectacular-conditions", + "id": "north-bathroom", "metadata": {}, "source": [ "# *pyopencga* First Steps: Loggin, Working with RestResponses, Launching Jobs.\n", @@ -27,7 +27,7 @@ }, { "cell_type": "markdown", - "id": "valid-edition", + "id": "thorough-thesis", "metadata": {}, "source": [ "## 1. Getting Started: Install *pyopencga*, import the modules, create server and client configuration with credentials." @@ -35,7 +35,7 @@ }, { "cell_type": "markdown", - "id": "artistic-adrian", + "id": "progressive-consultation", "metadata": {}, "source": [ "## 1.1 Installing the *pyopencga* library\n", @@ -51,7 +51,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "registered-turner", + "id": "sitting-origin", "metadata": {}, "outputs": [ { @@ -80,7 +80,7 @@ }, { "cell_type": "markdown", - "id": "spiritual-theater", + "id": "stupid-dispatch", "metadata": {}, "source": [ "### b) **RECOMENDED:** Install *pyopencga* with pip\n", @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "chubby-labor", + "id": "dressed-stadium", "metadata": {}, "source": [ "## 1.2 Importing the *pyopencga* library\n", @@ -103,7 +103,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "looking-scotland", + "id": "hungry-robin", "metadata": {}, "outputs": [], "source": [ @@ -115,7 +115,7 @@ }, { "cell_type": "markdown", - "id": "final-disney", + "id": "instant-turner", "metadata": {}, "source": [ "## 1.3 Setup the Client and Login in *pyopencga* \n", @@ -129,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "dramatic-referral", + "id": "breathing-kingdom", "metadata": {}, "source": [ "### 1.3.1 Set variables for server host, user credentials and project owner" @@ -138,7 +138,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "indonesian-stevens", + "id": "extreme-brief", "metadata": {}, "outputs": [], "source": [ @@ -155,7 +155,7 @@ }, { "cell_type": "markdown", - "id": "separated-rings", + "id": "christian-marsh", "metadata": {}, "source": [ "### 1.3.2 Creating ConfigClient dictionary for server connection configuration" @@ -164,7 +164,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "mathematical-russia", + "id": "opened-static", "metadata": {}, "outputs": [ { @@ -191,7 +191,7 @@ }, { "cell_type": "markdown", - "id": "knowing-application", + "id": "entire-toilet", "metadata": {}, "source": [ "### 1.3.3 Initialize the client configuration\n", @@ -202,7 +202,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "continental-classic", + "id": "equal-coordination", "metadata": {}, "outputs": [], "source": [ @@ -212,7 +212,7 @@ }, { "cell_type": "markdown", - "id": "peripheral-aggregate", + "id": "advanced-contact", "metadata": {}, "source": [ "### 1.3.4 Import the user credentials to the previously defined *OpencgaClient* instance and Login\n", @@ -223,7 +223,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "parallel-pearl", + "id": "fixed-college", "metadata": {}, "outputs": [], "source": [ @@ -234,7 +234,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "gross-missouri", + "id": "suited-format", "metadata": {}, "outputs": [], "source": [ @@ -244,7 +244,7 @@ }, { "cell_type": "markdown", - "id": "african-integration", + "id": "silent-barrier", "metadata": {}, "source": [ "#### ✅ Congrats! You are now connected to OpenCGA" @@ -252,7 +252,7 @@ }, { "cell_type": "markdown", - "id": "built-broadcast", + "id": "opening-upgrade", "metadata": {}, "source": [ "## 2. Working with RESTResponse results\n", @@ -270,7 +270,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "legitimate-telephone", + "id": "burning-token", "metadata": {}, "outputs": [], "source": [ @@ -286,7 +286,7 @@ }, { "cell_type": "markdown", - "id": "flush-blocking", + "id": "posted-barrier", "metadata": {}, "source": [ "#### Although you can iterate through all the different projects provided by the response by executing the next chunk of code, this is a **not recommended** way.\n", @@ -296,7 +296,7 @@ { "cell_type": "code", "execution_count": 29, - "id": "liquid-uncertainty", + "id": "shaped-effects", "metadata": {}, "outputs": [ { @@ -316,7 +316,7 @@ }, { "cell_type": "markdown", - "id": "fallen-proceeding", + "id": "several-stream", "metadata": {}, "source": [ "### 2.1 Using the `get_results()` function \n", @@ -327,7 +327,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "developing-elimination", + "id": "conventional-simulation", "metadata": {}, "outputs": [ { @@ -347,7 +347,7 @@ }, { "cell_type": "markdown", - "id": "square-amsterdam", + "id": "caring-david", "metadata": {}, "source": [ "### 2.2 Using the `result_iterator()` function to iterate over the Rest results\n", @@ -358,7 +358,7 @@ { "cell_type": "code", "execution_count": 31, - "id": "brief-tattoo", + "id": "passive-mixer", "metadata": {}, "outputs": [ { @@ -378,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "immediate-writing", + "id": "typical-weekly", "metadata": {}, "source": [ "### 2.2 Using `print_results()` function to iterate over the Rest results\n", @@ -389,7 +389,7 @@ { "cell_type": "code", "execution_count": 32, - "id": "gentle-madness", + "id": "blessed-figure", "metadata": {}, "outputs": [ { @@ -415,7 +415,7 @@ }, { "cell_type": "markdown", - "id": "stable-moscow", + "id": "federal-special", "metadata": {}, "source": [ "##### Now, let's try to costumize the results so we can get printed only the portion of the data that we might be interested in" @@ -424,7 +424,7 @@ { "cell_type": "code", "execution_count": 33, - "id": "parallel-recipe", + "id": "saved-automation", "metadata": {}, "outputs": [ { @@ -446,7 +446,7 @@ }, { "cell_type": "markdown", - "id": "portuguese-chocolate", + "id": "infectious-vacuum", "metadata": {}, "source": [ "##### A very useful parameter is the *separator*.
It allows the user to decide the format in which the data is printed. For example, it's possible to print a CSV-like style:" @@ -455,7 +455,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "final-track", + "id": "southern-clinic", "metadata": {}, "outputs": [ { @@ -479,7 +479,7 @@ }, { "cell_type": "markdown", - "id": "electronic-ocean", + "id": "dated-keeping", "metadata": {}, "source": [ "## 3. Working with JOBS" @@ -502,7 +502,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.6.13" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb b/opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb index 761a0339727..9bfd7497fc2 100644 --- a/opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb @@ -1,9 +1,244 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "external-market", + "metadata": {}, + "source": [ + "# *pyopencga* Catalog: Clinical Data and other Metadata. \n", + "\n", + "------\n", + "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", + "- http://bioinfodev.hpc.cam.ac.uk/opencga-test/webservices\n", + "\n", + "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", + "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing\n", + "\n", + "This notebook is intended to provide guidance for querying an OpenCGA server through *pyopencga* to explore studies which the user has access to, Clinical data provided in the study (Samples, Individuals Genotypes etc.) and other types of metadata, like permissions.\n", + "\n", + "A good first step when start working with OpenCGA is to retrieve information about our user, which projects and studies are we allowed to see. \n", + "Then, Before starting to explore the variants, a good practice is get a taste of the clinical data we are encountering in the study: How many samples and individuals does the study have? Is there any defined cohorts? Can we get some statistics about the genotypes of the samples in the Sudy?\n", + "\n", + "The user-cases addresed here constute a high-level introduction aimed to provide a basis for the user to make their own explorations. This example can be adapted to each individual user-case.\n", + "\n", + "For guidance on how to loggin and get started with *opencga* you can refer to : ---ADD NOTEBOOK-001---\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "south-aurora", + "metadata": {}, + "source": [ + "## 1. Setup the Client and Login into *pyopencga* \n", + "\n", + "**Configuration and Credentials** \n", + "\n", + "Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [001-pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)).\n", + "\n", + "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n", + "\n", + "Regarding credentials, you can set both user and password as two variables in the script.
If you prefer not to show the password, it would be asked interactively without echo." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "liquid-february", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Config information:\n", + " {'rest': {'host': 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'}}\n" + ] + } + ], + "source": [ + "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", + "from pyopencga.opencga_client import OpencgaClient # import client module\n", + "from pprint import pprint\n", + "import json\n", + "\n", + "# Server host\n", + "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", + "\n", + "# User credentials\n", + "user = \"demouser\"\n", + "passwd = \"demouser\" ## you can skip this, see below.\n", + "\n", + "# The user demo access projects from user opencga\n", + "prj_owner = \"demo\"\n", + "\n", + "# Creating ClientConfiguration dict\n", + "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", + "\n", + "config_dict = {\"rest\": {\n", + " \"host\": host \n", + " }\n", + " }\n", + "print(\"Config information:\\n\",config_dict)\n", + "\n", + "# Pass the config_dict dictionary to the ClientConfiguration method\n", + "config = ClientConfiguration(config_dict)\n", + "\n", + "# Create the client\n", + "oc = OpencgaClient(config)\n", + "\n", + "# Pass the credentials to the client\n", + "\n", + "# (here we put only the user in order to be asked for the password interactively)\n", + "# oc.login(user)\n", + "\n", + "# or you can pass the user and passwd\n", + "oc.login(user, passwd)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "whole-australia", + "metadata": {}, + "source": [ + "## 2. Working with our User: see permissions for Projects and studies\n", + "\n", + "### 2.1 General user information" + ] + }, + { + "cell_type": "markdown", + "id": "miniature-disaster", + "metadata": { + "tags": [] + }, + "source": [ + "First, we can get the list of available methods for the user client object:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "advisory-canada", + "metadata": {}, + "outputs": [], + "source": [ + "# Listing available methods for the user client object ?????\n", + "user_client = oc.users\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "original-stadium", + "metadata": {}, + "source": [ + "Depending of the permissions granted, an user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our usser and its permissions by:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "classified-murray", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "user info:\n", + "name: OpenCGA Demo User\towned_projects: 0\n" + ] + } + ], + "source": [ + "## getting user information\n", + "## [NOTE] User needs the quey_id string directly --> (user)\n", + "user_info = user_client.info(user).get_result(0)\n", + "\n", + "print(\"user info:\")\n", + "print(\"name: {}\\towned_projects: {}\".format(user_info[\"name\"], len(user_info[\"projects\"])))\n", + "\n", + "### It would be great to have creation date and other info ?????\n" + ] + }, + { + "cell_type": "markdown", + "id": "frank-immigration", + "metadata": {}, + "source": [ + "We can appreciate that our user (demouser) has **not** projects from its own, but has been granted access to some projects from `demo` user. Let's see how to find it out." + ] + }, + { + "cell_type": "markdown", + "id": "beautiful-adobe", + "metadata": {}, + "source": [ + "### 2.2 Exploring the projects for our user\n", + "\n", + "We can to list our user's projects using **project client** `search()` function." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "stuck-honduras", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#id\tname\torganism.scientificName\torganism.assembly\n", + "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\n", + "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\n" + ] + } + ], + "source": [ + "## Getting user projects\n", + "## [NOTE] Client specific methods have the query_id as a key:value (i.e (user=user_id)) \n", + "project_client = oc.projects\n", + "projects_info = project_client.search()\n", + "\n", + "projects_info.print_results(fields='id,name,organism.scientificName,organism.assembly', metadata=False)" + ] + }, + { + "cell_type": "markdown", + "id": "complete-still", + "metadata": {}, + "source": [ + "Our user (demo) has access to 2 different projects:\n", + "- Project: **family**\n", + "- Project: **population**" + ] + }, + { + "cell_type": "markdown", + "id": "upper-mortality", + "metadata": {}, + "source": [ + "### 2.2 Exploring the Studies for our user\n", + "\n", + "All the user permissions are established at a study level in OpenCGA. One project may contain different studies.
\n", + "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "comparable-spencer", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, - "id": "determined-interval", + "id": "healthy-bubble", "metadata": {}, "outputs": [], "source": [] @@ -25,7 +260,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.6.13" } }, "nbformat": 4, From c1e039754db1438ee5c710dd32fa2d274ec9691d Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 11 Mar 2021 12:23:11 +0100 Subject: [PATCH 071/412] storage: add checks when converting data, #1693 --- .../core/rga/IndividualRgaConverter.java | 68 +++++++++++-------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index 182c885f8d7..4166dbd0e03 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -5,6 +5,7 @@ import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.biodata.models.pedigree.IndividualProperty; +import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import org.opencb.commons.datastore.core.ComplexTypeConverter; @@ -17,7 +18,6 @@ import org.slf4j.LoggerFactory; import java.util.*; -import java.util.stream.Collectors; public class IndividualRgaConverter implements ComplexTypeConverter, List> { @@ -240,32 +240,39 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI disorderJson = Collections.emptyList(); } - List variantIds = transcript.getVariants().stream().map(KnockoutVariant::getId) - .collect(Collectors.toList()); - - List knockoutTypes = transcript.getVariants().stream() - .map(KnockoutVariant::getKnockoutType) - .map(Enum::name) - .distinct() - .collect(Collectors.toList()); - List types = transcript.getVariants().stream() - .map(KnockoutVariant::getType) - .map(String::valueOf) - .distinct() - .collect(Collectors.toList()); - List consequenceTypes = transcript.getVariants().stream() - .flatMap(kv -> kv.getSequenceOntologyTerms().stream()) - .map(SequenceOntologyTerm::getAccession) - .distinct() - .collect(Collectors.toList()); - List clinicalSignificances = transcript.getVariants().stream() - .flatMap(kv -> kv.getClinicalSignificance().stream()) - .map(String::valueOf) - .distinct() - .collect(Collectors.toList()); - List filters = transcript.getVariants().stream() - .map(KnockoutVariant::getFilter) - .distinct().collect(Collectors.toList()); + List variantIds = new LinkedList<>(); + Set knockoutTypes = new HashSet<>(); + Set types = new HashSet<>(); + Set consequenceTypes = new HashSet<>(); + Set clinicalSignificances = new HashSet<>(); + Set filters = new HashSet<>(); + + for (KnockoutVariant variant : transcript.getVariants()) { + variantIds.add(variant.getId()); + if (variant.getKnockoutType() != null) { + knockoutTypes.add(variant.getKnockoutType().name()); + } + if (variant.getType() != null) { + types.add(variant.getType().name()); + } + if (variant.getSequenceOntologyTerms() != null) { + for (SequenceOntologyTerm sequenceOntologyTerm : variant.getSequenceOntologyTerms()) { + if (sequenceOntologyTerm.getAccession() != null) { + consequenceTypes.add(sequenceOntologyTerm.getAccession()); + } + } + } + if (variant.getClinicalSignificance() != null) { + for (ClinicalSignificance clinicalSignificance : variant.getClinicalSignificance()) { + if (clinicalSignificance != null) { + clinicalSignificances.add(clinicalSignificance.name()); + } + } + } + if (StringUtils.isNotEmpty(variant.getFilter())) { + filters.add(variant.getFilter()); + } + } Map> popFreqs = getPopulationFrequencies(transcript); String id = knockoutByIndividual.getSampleId() + "_" + gene.getId() + "_" + transcript.getId(); @@ -286,9 +293,10 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI RgaDataModel model = new RgaDataModel(id, individualId, knockoutByIndividual.getSampleId(), sex, phenotypes, disorders, knockoutByIndividual.getFatherId(), knockoutByIndividual.getMotherId(), numParents, gene.getId(), - gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, types, - knockoutTypes, filters, consequenceTypes, clinicalSignificances, popFreqs, compoundFilters, phenotypeJson, - disorderJson, variantJson); + gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, + new ArrayList<>(types), new ArrayList<>(knockoutTypes), new ArrayList<>(filters), + new ArrayList<>(consequenceTypes), new ArrayList<>(clinicalSignificances), popFreqs, compoundFilters, + phenotypeJson, disorderJson, variantJson); result.add(model); } } From 3140c576b100dc7ae6bdf3bc693a8ad0fd1590fb Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 11 Mar 2021 12:48:09 +0100 Subject: [PATCH 072/412] core: add variant attributes to KnockoutByVariant data model, #1693 --- .../analysis/knockout/KnockoutByVariant.java | 76 ++++++++++++++++++- .../storage/core/rga/VariantRgaConverter.java | 9 ++- 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java index dafb792f4eb..de46b4d447c 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java @@ -5,14 +5,28 @@ public class KnockoutByVariant { private String id; + private String chromosome; + private int start; + private int end; + private int length; + private String reference; + private String alternate; + private int numIndividuals; private List individuals; public KnockoutByVariant() { } - public KnockoutByVariant(String id, List individuals) { + public KnockoutByVariant(String id, String chromosome, int start, int end, int length, String reference, String alternate, + List individuals) { this.id = id; + this.chromosome = chromosome; + this.start = start; + this.end = end; + this.length = length; + this.reference = reference; + this.alternate = alternate; this.numIndividuals = individuals != null ? individuals.size() : 0; this.individuals = individuals; } @@ -21,6 +35,12 @@ public KnockoutByVariant(String id, List individuals) { public String toString() { final StringBuilder sb = new StringBuilder("KnockoutByVariant{"); sb.append("id='").append(id).append('\''); + sb.append(", chromosome='").append(chromosome).append('\''); + sb.append(", start=").append(start); + sb.append(", end=").append(end); + sb.append(", length=").append(length); + sb.append(", reference='").append(reference).append('\''); + sb.append(", alternate='").append(alternate).append('\''); sb.append(", numIndividuals=").append(numIndividuals); sb.append(", individuals=").append(individuals); sb.append('}'); @@ -36,6 +56,60 @@ public KnockoutByVariant setId(String id) { return this; } + public String getChromosome() { + return chromosome; + } + + public KnockoutByVariant setChromosome(String chromosome) { + this.chromosome = chromosome; + return this; + } + + public int getStart() { + return start; + } + + public KnockoutByVariant setStart(int start) { + this.start = start; + return this; + } + + public int getEnd() { + return end; + } + + public KnockoutByVariant setEnd(int end) { + this.end = end; + return this; + } + + public int getLength() { + return length; + } + + public KnockoutByVariant setLength(int length) { + this.length = length; + return this; + } + + public String getReference() { + return reference; + } + + public KnockoutByVariant setReference(String reference) { + this.reference = reference; + return this; + } + + public String getAlternate() { + return alternate; + } + + public KnockoutByVariant setAlternate(String alternate) { + this.alternate = alternate; + return this; + } + public int getNumIndividuals() { return numIndividuals; } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java index 953dbedac9a..c2bcd5837e3 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java @@ -1,6 +1,7 @@ package org.opencb.opencga.storage.core.rga; import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; @@ -122,7 +123,9 @@ public List convertToDataModelType(List rgaData for (String individualId : result.get(variantId)) { individualList.add(individualMap.get(individualId)); } - knockoutVariantList.add(new KnockoutByVariant(variantId, individualList)); + Variant variant = new Variant(variantId); + knockoutVariantList.add(new KnockoutByVariant(variantId, variant.getChromosome(), variant.getStart(), variant.getEnd(), + variant.getLength(), variant.getReference(), variant.getAlternate(), individualList)); } return knockoutVariantList; } @@ -194,7 +197,9 @@ public List convertToDataModelaType(List rgaDat List result = new ArrayList<>(variantMap.size()); for (String variantId : variantMap.keySet()) { - result.add(new KnockoutByVariant(variantId, variantMap.get(variantId))); + Variant variant = new Variant(variantId); + result.add(new KnockoutByVariant(variantId, variant.getChromosome(), variant.getStart(), variant.getEnd(), + variant.getLength(), variant.getReference(), variant.getAlternate(), variantMap.get(variantId))); } return result; From 75b4a5d0910cb8c940ae8a095f7ca85e435c178b Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 11 Mar 2021 12:53:14 +0100 Subject: [PATCH 073/412] core: add variant attributes to KnockouVariant data model, #1693 --- .../analysis/knockout/KnockoutVariant.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java index 396a3b7dfeb..34cfa5425e3 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java @@ -27,6 +27,12 @@ public class KnockoutVariant { private String id; + private String chromosome; + private int start; + private int end; + private int length; + private String reference; + private String alternate; private VariantType type; private String genotype; private Integer depth; @@ -50,6 +56,12 @@ public KnockoutVariant() { public KnockoutVariant(Variant variant, StudyEntry study, FileEntry file, SampleEntry sample, VariantAnnotation annotation, ConsequenceType ct, KnockoutType knockoutType) { this.id = variant.toString(); + this.chromosome = variant.getChromosome(); + this.start = variant.getStart(); + this.end = variant.getEnd(); + this.length = variant.getLength(); + this.reference = variant.getReference(); + this.alternate = variant.getAlternate(); this.type = variant.getType(); this.genotype = sample.getData().get(0); this.depth = getDepth(study, file, sample); @@ -80,12 +92,21 @@ public KnockoutVariant(String id, VariantType type, String genotype, Integer dep public String toString() { final StringBuilder sb = new StringBuilder("KnockoutVariant{"); sb.append("id='").append(id).append('\''); + sb.append(", chromosome='").append(chromosome).append('\''); + sb.append(", start=").append(start); + sb.append(", end=").append(end); + sb.append(", length=").append(length); + sb.append(", reference='").append(reference).append('\''); + sb.append(", alternate='").append(alternate).append('\''); + sb.append(", type=").append(type); sb.append(", genotype='").append(genotype).append('\''); + sb.append(", depth=").append(depth); sb.append(", filter='").append(filter).append('\''); sb.append(", qual='").append(qual).append('\''); sb.append(", knockoutType=").append(knockoutType); sb.append(", populationFrequencies=").append(populationFrequencies); sb.append(", sequenceOntologyTerms=").append(sequenceOntologyTerms); + sb.append(", clinicalSignificance=").append(clinicalSignificance); sb.append('}'); return sb.toString(); } @@ -99,6 +120,60 @@ public KnockoutVariant setId(String id) { return this; } + public String getChromosome() { + return chromosome; + } + + public KnockoutVariant setChromosome(String chromosome) { + this.chromosome = chromosome; + return this; + } + + public int getStart() { + return start; + } + + public KnockoutVariant setStart(int start) { + this.start = start; + return this; + } + + public int getEnd() { + return end; + } + + public KnockoutVariant setEnd(int end) { + this.end = end; + return this; + } + + public int getLength() { + return length; + } + + public KnockoutVariant setLength(int length) { + this.length = length; + return this; + } + + public String getReference() { + return reference; + } + + public KnockoutVariant setReference(String reference) { + this.reference = reference; + return this; + } + + public String getAlternate() { + return alternate; + } + + public KnockoutVariant setAlternate(String alternate) { + this.alternate = alternate; + return this; + } + public VariantType getType() { return type; } From 0c95b434cc108a79e181ed3955f4404be156564b Mon Sep 17 00:00:00 2001 From: imedina Date: Thu, 11 Mar 2021 12:45:36 +0000 Subject: [PATCH 074/412] client: some work on the training material --- .../pyopencga_basic_notebook_001.ipynb | 2 +- ...yopencga_basic_notebook_003-variants.ipynb | 2 +- ..._CATALOG.ipynb => pyopencga_catalog.ipynb} | 67 +++---- ...teps.ipynb => pyopencga_first_steps.ipynb} | 84 ++++---- ...ipynb => pyopencga_variant_analysis.ipynb} | 3 +- .../pyopencga_variant_query.ipynb | 185 ++++++++++++++++++ 6 files changed, 257 insertions(+), 86 deletions(-) rename opencga-client/src/main/python/notebooks/user-training/{002-pyopencga_CATALOG.ipynb => pyopencga_catalog.ipynb} (86%) rename opencga-client/src/main/python/notebooks/user-training/{001-pyopencga_first_steps.ipynb => pyopencga_first_steps.ipynb} (90%) rename opencga-client/src/main/python/notebooks/user-training/{003-pyopencga_variant_analysis.ipynb => pyopencga_variant_analysis.ipynb} (91%) create mode 100644 opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb diff --git a/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb index 4549f1d3a4b..1676b5c0523 100644 --- a/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb +++ b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb @@ -713,7 +713,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.6.9" }, "pycharm": { "stem_cell": { diff --git a/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_003-variants.ipynb b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_003-variants.ipynb index c7be065ec72..2545f8125d1 100644 --- a/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_003-variants.ipynb +++ b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_003-variants.ipynb @@ -177,7 +177,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb similarity index 86% rename from opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb rename to opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 9bfd7497fc2..c48bb5f6ac6 100644 --- a/opencga-client/src/main/python/notebooks/user-training/002-pyopencga_CATALOG.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -2,7 +2,6 @@ "cells": [ { "cell_type": "markdown", - "id": "external-market", "metadata": {}, "source": [ "# *pyopencga* Catalog: Clinical Data and other Metadata. \n", @@ -27,7 +26,6 @@ }, { "cell_type": "markdown", - "id": "south-aurora", "metadata": {}, "source": [ "## 1. Setup the Client and Login into *pyopencga* \n", @@ -44,7 +42,6 @@ { "cell_type": "code", "execution_count": 1, - "id": "liquid-february", "metadata": {}, "outputs": [ { @@ -52,7 +49,7 @@ "output_type": "stream", "text": [ "Config information:\n", - " {'rest': {'host': 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'}}\n" + " {'rest': {'host': 'https://ws.opencb.org/opencga-prod'}}\n" ] } ], @@ -62,19 +59,17 @@ "from pprint import pprint\n", "import json\n", "\n", - "# Server host\n", - "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", + "## Configuration parameters\n", + "# OpenCGA host\n", + "host = 'https://ws.opencb.org/opencga-prod'\n", "\n", "# User credentials\n", "user = \"demouser\"\n", "passwd = \"demouser\" ## you can skip this, see below.\n", - "\n", - "# The user demo access projects from user opencga\n", - "prj_owner = \"demo\"\n", + "study = 'demo@family:platinum'\n", + "####################################\n", "\n", "# Creating ClientConfiguration dict\n", - "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", - "\n", "config_dict = {\"rest\": {\n", " \"host\": host \n", " }\n", @@ -88,7 +83,6 @@ "oc = OpencgaClient(config)\n", "\n", "# Pass the credentials to the client\n", - "\n", "# (here we put only the user in order to be asked for the password interactively)\n", "# oc.login(user)\n", "\n", @@ -99,17 +93,23 @@ }, { "cell_type": "markdown", - "id": "whole-australia", "metadata": {}, "source": [ - "## 2. Working with our User: see permissions for Projects and studies\n", + "# 2. Use Cases (Working with our User: see permissions for Projects and studies)\n", "\n", - "### 2.1 General user information" + "In this seciton we are going to show how to work with some of the most common scenarios." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.1 Exploring OpenCGA data\n", + "In tis use case we cover ....\n" ] }, { "cell_type": "markdown", - "id": "miniature-disaster", "metadata": { "tags": [] }, @@ -119,8 +119,7 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "advisory-canada", + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -131,7 +130,6 @@ }, { "cell_type": "markdown", - "id": "original-stadium", "metadata": {}, "source": [ "Depending of the permissions granted, an user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our usser and its permissions by:" @@ -139,8 +137,7 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "classified-murray", + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -165,7 +162,6 @@ }, { "cell_type": "markdown", - "id": "frank-immigration", "metadata": {}, "source": [ "We can appreciate that our user (demouser) has **not** projects from its own, but has been granted access to some projects from `demo` user. Let's see how to find it out." @@ -173,10 +169,9 @@ }, { "cell_type": "markdown", - "id": "beautiful-adobe", "metadata": {}, "source": [ - "### 2.2 Exploring the projects for our user\n", + "### Exploring the projects for our user\n", "\n", "We can to list our user's projects using **project client** `search()` function." ] @@ -184,7 +179,6 @@ { "cell_type": "code", "execution_count": 16, - "id": "stuck-honduras", "metadata": {}, "outputs": [ { @@ -208,7 +202,6 @@ }, { "cell_type": "markdown", - "id": "complete-still", "metadata": {}, "source": [ "Our user (demo) has access to 2 different projects:\n", @@ -218,27 +211,31 @@ }, { "cell_type": "markdown", - "id": "upper-mortality", "metadata": {}, "source": [ - "### 2.2 Exploring the Studies for our user\n", + "### Exploring the Studies for our user\n", "\n", "All the user permissions are established at a study level in OpenCGA. One project may contain different studies.
\n", "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study]" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "comparable-spencer", + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## 2.2 Exploring a sample or individuals" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3 Browsing samples and Individuals" + ] }, { "cell_type": "code", "execution_count": null, - "id": "healthy-bubble", "metadata": {}, "outputs": [], "source": [] @@ -260,7 +257,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.13" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb similarity index 90% rename from opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb rename to opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb index eb4f5b1e2ff..081fe0ce96f 100644 --- a/opencga-client/src/main/python/notebooks/user-training/001-pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb @@ -2,14 +2,14 @@ "cells": [ { "cell_type": "markdown", - "id": "north-bathroom", "metadata": {}, "source": [ "# *pyopencga* First Steps: Loggin, Working with RestResponses, Launching Jobs.\n", - "\n", "------\n", + "# 1. Overview\n", + "\n", "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", - "- http://bioinfodev.hpc.cam.ac.uk/opencga-test/webservices\n", + "- https://ws.opencb.org/opencga-prod/webservices\n", "\n", "This notebook is intended to provide guidance for getting *pyopencga* (the Python client of OpenCGA) started.\n", "\n", @@ -27,15 +27,14 @@ }, { "cell_type": "markdown", - "id": "thorough-thesis", "metadata": {}, "source": [ - "## 1. Getting Started: Install *pyopencga*, import the modules, create server and client configuration with credentials." + "# 2. Getting Started\n", + "In this section you will learn howt to install *pyopencga*, import the modules, crate the client conffig and connect." ] }, { "cell_type": "markdown", - "id": "progressive-consultation", "metadata": {}, "source": [ "## 1.1 Installing the *pyopencga* library\n", @@ -51,7 +50,6 @@ { "cell_type": "code", "execution_count": 21, - "id": "sitting-origin", "metadata": {}, "outputs": [ { @@ -80,7 +78,6 @@ }, { "cell_type": "markdown", - "id": "stupid-dispatch", "metadata": {}, "source": [ "### b) **RECOMENDED:** Install *pyopencga* with pip\n", @@ -92,7 +89,6 @@ }, { "cell_type": "markdown", - "id": "dressed-stadium", "metadata": {}, "source": [ "## 1.2 Importing the *pyopencga* library\n", @@ -102,8 +98,7 @@ }, { "cell_type": "code", - "execution_count": 22, - "id": "hungry-robin", + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -115,7 +110,6 @@ }, { "cell_type": "markdown", - "id": "instant-turner", "metadata": {}, "source": [ "## 1.3 Setup the Client and Login in *pyopencga* \n", @@ -129,7 +123,6 @@ }, { "cell_type": "markdown", - "id": "breathing-kingdom", "metadata": {}, "source": [ "### 1.3.1 Set variables for server host, user credentials and project owner" @@ -137,8 +130,7 @@ }, { "cell_type": "code", - "execution_count": 23, - "id": "extreme-brief", + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -155,7 +147,6 @@ }, { "cell_type": "markdown", - "id": "christian-marsh", "metadata": {}, "source": [ "### 1.3.2 Creating ConfigClient dictionary for server connection configuration" @@ -163,8 +154,7 @@ }, { "cell_type": "code", - "execution_count": 24, - "id": "opened-static", + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -191,7 +181,6 @@ }, { "cell_type": "markdown", - "id": "entire-toilet", "metadata": {}, "source": [ "### 1.3.3 Initialize the client configuration\n", @@ -201,8 +190,7 @@ }, { "cell_type": "code", - "execution_count": 25, - "id": "equal-coordination", + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -212,7 +200,6 @@ }, { "cell_type": "markdown", - "id": "advanced-contact", "metadata": {}, "source": [ "### 1.3.4 Import the user credentials to the previously defined *OpencgaClient* instance and Login\n", @@ -223,7 +210,6 @@ { "cell_type": "code", "execution_count": 26, - "id": "fixed-college", "metadata": {}, "outputs": [], "source": [ @@ -233,8 +219,7 @@ }, { "cell_type": "code", - "execution_count": 27, - "id": "suited-format", + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -244,7 +229,6 @@ }, { "cell_type": "markdown", - "id": "silent-barrier", "metadata": {}, "source": [ "#### ✅ Congrats! You are now connected to OpenCGA" @@ -252,10 +236,9 @@ }, { "cell_type": "markdown", - "id": "opening-upgrade", "metadata": {}, "source": [ - "## 2. Working with RESTResponse results\n", + "# 3. Understanding REST Response\n", "\n", "*pyopencga* queries web services that return a RESTResponse object, which might be difficult to interpretate. The RESTResponse type provide the data in a manner that is not as intuitive as a python list or dictionary. Because of this, we have develop a useful functionality that retrieves the data in a simpler format. \n", "\n", @@ -270,7 +253,6 @@ { "cell_type": "code", "execution_count": 28, - "id": "burning-token", "metadata": {}, "outputs": [], "source": [ @@ -286,7 +268,6 @@ }, { "cell_type": "markdown", - "id": "posted-barrier", "metadata": {}, "source": [ "#### Although you can iterate through all the different projects provided by the response by executing the next chunk of code, this is a **not recommended** way.\n", @@ -296,7 +277,6 @@ { "cell_type": "code", "execution_count": 29, - "id": "shaped-effects", "metadata": {}, "outputs": [ { @@ -316,10 +296,23 @@ }, { "cell_type": "markdown", - "id": "several-stream", "metadata": {}, "source": [ - "### 2.1 Using the `get_results()` function \n", + "## RestResponse API" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note: Table with API funcitons and the description" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using the `get_results()` function \n", "\n", "Using the functions that *pyopencga* implements for the RestResponse object makes things much easier!
Let's dig into an example using the same query as above:" ] @@ -327,7 +320,6 @@ { "cell_type": "code", "execution_count": 30, - "id": "conventional-simulation", "metadata": {}, "outputs": [ { @@ -347,10 +339,9 @@ }, { "cell_type": "markdown", - "id": "caring-david", "metadata": {}, "source": [ - "### 2.2 Using the `result_iterator()` function to iterate over the Rest results\n", + "## Using the `result_iterator()` function to iterate over the Rest results\n", "\n", "You can also iterate results, this is specially interesting when fetching many results from the server:" ] @@ -358,7 +349,6 @@ { "cell_type": "code", "execution_count": 31, - "id": "passive-mixer", "metadata": {}, "outputs": [ { @@ -378,10 +368,9 @@ }, { "cell_type": "markdown", - "id": "typical-weekly", "metadata": {}, "source": [ - "### 2.2 Using `print_results()` function to iterate over the Rest results\n", + "## Using `print_results()` function to iterate over the Rest results\n", "\n", "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎" ] @@ -389,7 +378,6 @@ { "cell_type": "code", "execution_count": 32, - "id": "blessed-figure", "metadata": {}, "outputs": [ { @@ -415,7 +403,6 @@ }, { "cell_type": "markdown", - "id": "federal-special", "metadata": {}, "source": [ "##### Now, let's try to costumize the results so we can get printed only the portion of the data that we might be interested in" @@ -424,7 +411,6 @@ { "cell_type": "code", "execution_count": 33, - "id": "saved-automation", "metadata": {}, "outputs": [ { @@ -446,7 +432,6 @@ }, { "cell_type": "markdown", - "id": "infectious-vacuum", "metadata": {}, "source": [ "##### A very useful parameter is the *separator*.
It allows the user to decide the format in which the data is printed. For example, it's possible to print a CSV-like style:" @@ -455,7 +440,6 @@ { "cell_type": "code", "execution_count": 34, - "id": "southern-clinic", "metadata": {}, "outputs": [ { @@ -479,11 +463,17 @@ }, { "cell_type": "markdown", - "id": "dated-keeping", "metadata": {}, "source": [ - "## 3. Working with JOBS" + "# 4. Working with JOBS" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -502,7 +492,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.13" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/003-pyopencga_variant_analysis.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb similarity index 91% rename from opencga-client/src/main/python/notebooks/user-training/003-pyopencga_variant_analysis.ipynb rename to opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb index 4e6e4885504..f36f8bb93e6 100644 --- a/opencga-client/src/main/python/notebooks/user-training/003-pyopencga_variant_analysis.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb @@ -3,7 +3,6 @@ { "cell_type": "code", "execution_count": null, - "id": "official-extent", "metadata": {}, "outputs": [], "source": [] @@ -25,7 +24,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb new file mode 100644 index 00000000000..c7be065ec72 --- /dev/null +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -0,0 +1,185 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# pyOpenCGA basic variant and interpretation usage\n", + "\n", + "------\n", + "\n", + "\n", + "**[NOTE]** The server methods used by pyopencga client are defined in the following swagger URL:\n", + "- http://bioinfodev.hpc.cam.ac.uk/opencga-test/webservices\n", + "\n", + "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", + "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Loading pyOpenCGA" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from pyopencga.opencga_config import ClientConfiguration\n", + "from pyopencga.opencga_client import OpencgaClient\n", + "from pprint import pprint\n", + "import json" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting credentials for LogIn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Credentials** \n", + "\n", + "Plese add the credentials for opencga login into a file in json format and read them from there." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# server host\n", + "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", + "\n", + "# user credentials\n", + "user = \"demouser\"\n", + "passwd = \"demouser\" ## you can skip this, see below.\n", + "\n", + "# the user demo access projects from user opencga\n", + "prj_owner = \"demo\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating ConfigClient for server connection configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Config information:\n", + " {'rest': {'host': 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'}}\n" + ] + } + ], + "source": [ + "# Creating ClientConfiguration dict\n", + "config_dict = {\"rest\": {\n", + " \"host\": host \n", + " }\n", + " }\n", + "\n", + "print(\"Config information:\\n\",config_dict)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Login with user credentials" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "config = ClientConfiguration(config_dict)\n", + "oc = OpencgaClient(config)\n", + "\n", + "## Login\n", + "oc.login(user, passwd)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**You are now connected to OpenCGA**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Querying Variants" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's get the variant client to query OpenCGA server" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "## Let's use corpasome study\n", + "study = 'family:corpasome'\n", + "variant_client = oc.variants\n", + "variants = variant_client.query(study=study, gene='BRCA2', limit=1)\n", + "# pprint(variants.get_responses())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 4d4d19ceb4745244781d6c39bdc465923ff8084a Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 11 Mar 2021 14:28:41 +0000 Subject: [PATCH 075/412] client: working on catalog notebook #1716 --- .../pyopencga_basic_notebook_001.ipynb | 2 +- .../user-training/pyopencga_catalog.ipynb | 200 ++++++++++++++---- 2 files changed, 162 insertions(+), 40 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb index 1676b5c0523..e629deabaf9 100644 --- a/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb +++ b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb @@ -713,7 +713,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.6.13" }, "pycharm": { "stem_cell": { diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index c48bb5f6ac6..1bebafefd9f 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "magnetic-bracelet", "metadata": {}, "source": [ "# *pyopencga* Catalog: Clinical Data and other Metadata. \n", @@ -15,17 +16,16 @@ "\n", "This notebook is intended to provide guidance for querying an OpenCGA server through *pyopencga* to explore studies which the user has access to, Clinical data provided in the study (Samples, Individuals Genotypes etc.) and other types of metadata, like permissions.\n", "\n", - "A good first step when start working with OpenCGA is to retrieve information about our user, which projects and studies are we allowed to see. \n", - "Then, Before starting to explore the variants, a good practice is get a taste of the clinical data we are encountering in the study: How many samples and individuals does the study have? Is there any defined cohorts? Can we get some statistics about the genotypes of the samples in the Sudy?\n", + "A good first step when start working with OpenCGA is to retrieve information about our user, which projects and studies are we allowed to see.
\n", + "It is also recommended to get a taste of the clinical data we are encountering in the study: How many samples and individuals does the study have? Is there any defined cohorts? Can we get some statistics about the genotypes of the samples in the Sudy?\n", "\n", - "The user-cases addresed here constute a high-level introduction aimed to provide a basis for the user to make their own explorations. This example can be adapted to each individual user-case.\n", - "\n", - "For guidance on how to loggin and get started with *opencga* you can refer to : ---ADD NOTEBOOK-001---\n", + "For guidance on how to loggin and get started with *opencga* you can refer to : [001-pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)\n", " " ] }, { "cell_type": "markdown", + "id": "powerful-music", "metadata": {}, "source": [ "## 1. Setup the Client and Login into *pyopencga* \n", @@ -34,14 +34,13 @@ "\n", "Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [001-pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)).\n", "\n", - "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n", - "\n", - "Regarding credentials, you can set both user and password as two variables in the script.
If you prefer not to show the password, it would be asked interactively without echo." + "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, + "id": "spanish-beads", "metadata": {}, "outputs": [ { @@ -64,17 +63,17 @@ "host = 'https://ws.opencb.org/opencga-prod'\n", "\n", "# User credentials\n", - "user = \"demouser\"\n", - "passwd = \"demouser\" ## you can skip this, see below.\n", + "user = 'demouser'\n", + "passwd = 'demouser' ## you can skip this, see below.\n", "study = 'demo@family:platinum'\n", "####################################\n", "\n", "# Creating ClientConfiguration dict\n", - "config_dict = {\"rest\": {\n", - " \"host\": host \n", + "config_dict = {'rest': {\n", + " 'host': host \n", " }\n", " }\n", - "print(\"Config information:\\n\",config_dict)\n", + "print('Config information:\\n',config_dict)\n", "\n", "# Pass the config_dict dictionary to the ClientConfiguration method\n", "config = ClientConfiguration(config_dict)\n", @@ -93,51 +92,51 @@ }, { "cell_type": "markdown", + "id": "crazy-contribution", "metadata": {}, "source": [ - "# 2. Use Cases (Working with our User: see permissions for Projects and studies)\n", + "# 2. Use Cases \n", "\n", - "In this seciton we are going to show how to work with some of the most common scenarios." + "In this seciton we are going to show how to work with some of the most common scenarios.
\n", + "The user-cases addresed here constute a high-level introduction aimed to provide a basis for the user to make their own explorations. This example can be adapted to each individual user-case.\n", + "\n" ] }, { "cell_type": "markdown", + "id": "innovative-plaintiff", "metadata": {}, "source": [ - "## 2.1 Exploring OpenCGA data\n", - "In tis use case we cover ....\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ + "## 2.1 Working with our User: see permissions for Projects and studies\n", + "\n", + "In this use case we cover retrieving information for our user.\n", + "\n", "First, we can get the list of available methods for the user client object:" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, + "id": "provincial-paraguay", "metadata": {}, "outputs": [], "source": [ "# Listing available methods for the user client object ?????\n", - "user_client = oc.users\n", - "\n" + "user_client = oc.users\n" ] }, { "cell_type": "markdown", + "id": "loving-volume", "metadata": {}, "source": [ - "Depending of the permissions granted, an user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our usser and its permissions by:" + "Depending on the permissions granted, an user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our usser and its permissions by:" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, + "id": "monthly-produce", "metadata": {}, "outputs": [ { @@ -154,14 +153,15 @@ "## [NOTE] User needs the quey_id string directly --> (user)\n", "user_info = user_client.info(user).get_result(0)\n", "\n", - "print(\"user info:\")\n", - "print(\"name: {}\\towned_projects: {}\".format(user_info[\"name\"], len(user_info[\"projects\"])))\n", + "print('user info:')\n", + "print('name: {}\\towned_projects: {}'.format(user_info['name'], len(user_info['projects'])))\n", "\n", "### It would be great to have creation date and other info ?????\n" ] }, { "cell_type": "markdown", + "id": "incorrect-handling", "metadata": {}, "source": [ "We can appreciate that our user (demouser) has **not** projects from its own, but has been granted access to some projects from `demo` user. Let's see how to find it out." @@ -169,6 +169,7 @@ }, { "cell_type": "markdown", + "id": "second-disclaimer", "metadata": {}, "source": [ "### Exploring the projects for our user\n", @@ -178,7 +179,8 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 5, + "id": "gorgeous-motorcycle", "metadata": {}, "outputs": [ { @@ -202,6 +204,7 @@ }, { "cell_type": "markdown", + "id": "animated-nursing", "metadata": {}, "source": [ "Our user (demo) has access to 2 different projects:\n", @@ -211,31 +214,150 @@ }, { "cell_type": "markdown", + "id": "floral-disabled", "metadata": {}, "source": [ "### Exploring the Studies for our user\n", "\n", - "All the user permissions are established at a study level in OpenCGA. One project may contain different studies.
\n", - "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study]" + "All the user permissions are established at a study level in OpenCGA. One project may contain different studies.\n", + "\n", + "#### Full Qualified Name (fqn) of Studies \n", + "\n", + "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study]\n", + "We can access the studies for the specific project *family*:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "political-tradition", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "project:family\t study:platinum\n", + "project:family\t study:corpasome\n" + ] + } + ], + "source": [ + "project_id = 'family' # The project we want to retrieve info\n", + "\n", + "## you can also use the following command:\n", + "## projects = project_client.search(id=project_id)\n", + "\n", + "projects = project_client.info(project_id)\n", + "project = projects.get_result(0)\n", + "\n", + "# Print the studies in the project\n", + "for study in project['studies']:\n", + " print(\"project:{}\\t study:{}\".format(project_id, study['id']))" + ] + }, + { + "cell_type": "markdown", + "id": "imperial-angola", + "metadata": {}, + "source": [ + "Our user (demo) has access to 2 different studies within the *family* project:\n", + "\n", + "Project: *family*\n", + "- study: *platinum*\n", + "- study: *corpasome*" + ] + }, + { + "cell_type": "markdown", + "id": "assured-hawaiian", + "metadata": {}, + "source": [ + "## 2.2 Browsing samples or individuals" + ] + }, + { + "cell_type": "markdown", + "id": "systematic-syntax", + "metadata": {}, + "source": [ + "### Exploring Samples\n", + "\n", + "Once we know the studies our user 'demo' has access to, we can explore the samples that a project contains.
\n", + "To fetch samples you need to use the sample client built in pyopencga.
\n", + "\n", + "Remember that it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies, since we cannot be sure if there might be other studies with the same name contained in other projects (E.g: the study *platinium* could e into two different projects: *GRch37_project and GRch38_project*)\n", + "\n", + "In this case, we can see the samples from the project *platinium*." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "inner-amino", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 66\n", + "#Num matches: 17\n", + "#Num results: 2\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotationSets\tuuid\tqualityControl\trelease\tversion\tcreationDate\tmodificationDate\tdescription\tsomatic\tphenotypes\tindividualId\tfileIds\tstatus\tinternal\tattributes\n", + "NA12877\t.\teba106b2-0172-0004-0001-0090f938ae01\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131818\t20201117012312\t\tFalse\t.\tNA12877\tdata:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131818', 'description': ''}}\t{}\n", + "NA12878\t.\teba10c89-0172-0004-0001-8c90462fc396\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131819\t20201117015700\t\tFalse\t.\tNA12878\tdata:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131819', 'description': ''}}\t{}\n" + ] + } + ], + "source": [ + "## Let's print samples from platinum usinf project:study notation\n", + "study_id = 'family:platinum' #fqn of the study\n", + "samples = oc.samples.search(study=study_id, count=True, limit = 2) ## other possible params, count=False, id='NA12880,NA12881'\n", + "samples.print_results()" + ] + }, + { + "cell_type": "markdown", + "id": "liberal-contract", + "metadata": {}, + "source": [ + "We can see that project *platinium* has **17 samples** (given by #Num matches). The count is returned because we have set the parameter `count=True`.\n", + "\n", + "However, only information about **2 samples** is returned, because we have set the parameter `limit=2`." + ] + }, + { + "cell_type": "markdown", + "id": "adapted-builder", + "metadata": {}, + "source": [ + "### Exploring Individuals" ] }, { "cell_type": "markdown", + "id": "nasty-evidence", "metadata": {}, "source": [ - "## 2.2 Exploring a sample or individuals" + "### How many Samples are in a given Individual?" ] }, { "cell_type": "markdown", + "id": "casual-nowhere", "metadata": {}, "source": [ - "## 2.3 Browsing samples and Individuals" + "## 2.3 Browsing Genotypes and Phenotypes" ] }, { "cell_type": "code", "execution_count": null, + "id": "protecting-developer", "metadata": {}, "outputs": [], "source": [] @@ -257,7 +379,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.6.13" } }, "nbformat": 4, From b305c70b6c496a36f73219dfad656b289b045b5c Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 11 Mar 2021 15:34:21 +0100 Subject: [PATCH 076/412] clinical: check mandatory field, #1693 --- .../main/java/org/opencb/opencga/clinical/rga/RgaManager.java | 2 ++ .../opencb/opencga/server/rest/analysis/ClinicalWebService.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index c864f6ebba8..9bcef35c335 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -14,6 +14,7 @@ import org.opencb.opencga.catalog.managers.AbstractManager; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.clinical.StorageManager; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; @@ -306,6 +307,7 @@ public OpenCGAResult aggregationStats(String studyStr, Query query, if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } + ParamUtils.checkObj(fields, "Missing mandatory field 'field"); QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); queryOptions.put(QueryOptions.FACET, fields); diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 6fbe9f3856f..3ded7450906 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -808,7 +808,7 @@ public Response rgaVariantQuery( }) public Response rgaAggregationStats( @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String studyStr, - @ApiParam(value = "List of fields separated by semicolons, e.g.: clinicalSignificances;type. For nested fields use >>, e.g.: type>>clinicalSignificances;knockoutType") @QueryParam("field") String facet + @ApiParam(value = "List of fields separated by semicolons, e.g.: clinicalSignificances;type. For nested fields use >>, e.g.: type>>clinicalSignificances;knockoutType", required = true) @QueryParam("field") String facet ) { // Get all query options return run(() -> { From 038375e596b1f5e10c38c4911e0133527a1ca7db Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 11 Mar 2021 14:35:21 +0000 Subject: [PATCH 077/412] client: working on variant notebook #1716 --- .../user-training/pyopencga_catalog.ipynb | 48 +++---- .../pyopencga_variant_analysis.ipynb | 3 +- .../pyopencga_variant_query.ipynb | 117 ++++++------------ 3 files changed, 68 insertions(+), 100 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 1bebafefd9f..90ed72dbc27 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "magnetic-bracelet", + "id": "adequate-singles", "metadata": {}, "source": [ "# *pyopencga* Catalog: Clinical Data and other Metadata. \n", @@ -14,6 +14,8 @@ "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing\n", "\n", + "## Overview\n", + "\n", "This notebook is intended to provide guidance for querying an OpenCGA server through *pyopencga* to explore studies which the user has access to, Clinical data provided in the study (Samples, Individuals Genotypes etc.) and other types of metadata, like permissions.\n", "\n", "A good first step when start working with OpenCGA is to retrieve information about our user, which projects and studies are we allowed to see.
\n", @@ -25,7 +27,7 @@ }, { "cell_type": "markdown", - "id": "powerful-music", + "id": "correct-spine", "metadata": {}, "source": [ "## 1. Setup the Client and Login into *pyopencga* \n", @@ -40,7 +42,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "spanish-beads", + "id": "incorporate-summer", "metadata": {}, "outputs": [ { @@ -92,7 +94,7 @@ }, { "cell_type": "markdown", - "id": "crazy-contribution", + "id": "responsible-charles", "metadata": {}, "source": [ "# 2. Use Cases \n", @@ -104,7 +106,7 @@ }, { "cell_type": "markdown", - "id": "innovative-plaintiff", + "id": "inappropriate-driving", "metadata": {}, "source": [ "## 2.1 Working with our User: see permissions for Projects and studies\n", @@ -117,7 +119,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "provincial-paraguay", + "id": "consolidated-permit", "metadata": {}, "outputs": [], "source": [ @@ -127,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "loving-volume", + "id": "chief-wonder", "metadata": {}, "source": [ "Depending on the permissions granted, an user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our usser and its permissions by:" @@ -136,7 +138,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "monthly-produce", + "id": "comparable-purchase", "metadata": {}, "outputs": [ { @@ -161,7 +163,7 @@ }, { "cell_type": "markdown", - "id": "incorrect-handling", + "id": "premier-hardwood", "metadata": {}, "source": [ "We can appreciate that our user (demouser) has **not** projects from its own, but has been granted access to some projects from `demo` user. Let's see how to find it out." @@ -169,7 +171,7 @@ }, { "cell_type": "markdown", - "id": "second-disclaimer", + "id": "french-departure", "metadata": {}, "source": [ "### Exploring the projects for our user\n", @@ -180,7 +182,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "gorgeous-motorcycle", + "id": "encouraging-colon", "metadata": {}, "outputs": [ { @@ -204,7 +206,7 @@ }, { "cell_type": "markdown", - "id": "animated-nursing", + "id": "accomplished-bhutan", "metadata": {}, "source": [ "Our user (demo) has access to 2 different projects:\n", @@ -214,7 +216,7 @@ }, { "cell_type": "markdown", - "id": "floral-disabled", + "id": "starting-flashing", "metadata": {}, "source": [ "### Exploring the Studies for our user\n", @@ -230,7 +232,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "political-tradition", + "id": "adequate-enhancement", "metadata": {}, "outputs": [ { @@ -258,7 +260,7 @@ }, { "cell_type": "markdown", - "id": "imperial-angola", + "id": "brutal-accordance", "metadata": {}, "source": [ "Our user (demo) has access to 2 different studies within the *family* project:\n", @@ -270,7 +272,7 @@ }, { "cell_type": "markdown", - "id": "assured-hawaiian", + "id": "announced-tennis", "metadata": {}, "source": [ "## 2.2 Browsing samples or individuals" @@ -278,7 +280,7 @@ }, { "cell_type": "markdown", - "id": "systematic-syntax", + "id": "unnecessary-sherman", "metadata": {}, "source": [ "### Exploring Samples\n", @@ -294,7 +296,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "inner-amino", + "id": "specified-polls", "metadata": {}, "outputs": [ { @@ -322,7 +324,7 @@ }, { "cell_type": "markdown", - "id": "liberal-contract", + "id": "acknowledged-genetics", "metadata": {}, "source": [ "We can see that project *platinium* has **17 samples** (given by #Num matches). The count is returned because we have set the parameter `count=True`.\n", @@ -332,7 +334,7 @@ }, { "cell_type": "markdown", - "id": "adapted-builder", + "id": "essential-garlic", "metadata": {}, "source": [ "### Exploring Individuals" @@ -340,7 +342,7 @@ }, { "cell_type": "markdown", - "id": "nasty-evidence", + "id": "north-swiss", "metadata": {}, "source": [ "### How many Samples are in a given Individual?" @@ -348,7 +350,7 @@ }, { "cell_type": "markdown", - "id": "casual-nowhere", + "id": "earned-novel", "metadata": {}, "source": [ "## 2.3 Browsing Genotypes and Phenotypes" @@ -357,7 +359,7 @@ { "cell_type": "code", "execution_count": null, - "id": "protecting-developer", + "id": "intense-final", "metadata": {}, "outputs": [], "source": [] diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb index f36f8bb93e6..c0fc8f01dda 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "minor-panel", "metadata": {}, "outputs": [], "source": [] @@ -24,7 +25,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.6.13" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index c7be065ec72..2e08bf02df6 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# pyOpenCGA basic variant and interpretation usage\n", + "# *pyopencga* Basic Variant and Interpretation Usage\n", "\n", "------\n", "\n", @@ -13,71 +13,29 @@ "- http://bioinfodev.hpc.cam.ac.uk/opencga-test/webservices\n", "\n", "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", - "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Loading pyOpenCGA" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from pyopencga.opencga_config import ClientConfiguration\n", - "from pyopencga.opencga_client import OpencgaClient\n", - "from pprint import pprint\n", - "import json" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setting credentials for LogIn" + "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing\n", + "\n", + "## Overview\n", + "\n", + "add here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Credentials** \n", + "## 1. Setup the Client and Login into *pyopencga* \n", "\n", - "Plese add the credentials for opencga login into a file in json format and read them from there." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# server host\n", - "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", + "**Configuration and Credentials** \n", "\n", - "# user credentials\n", - "user = \"demouser\"\n", - "passwd = \"demouser\" ## you can skip this, see below.\n", + "Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [001-pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)).\n", "\n", - "# the user demo access projects from user opencga\n", - "prj_owner = \"demo\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Creating ConfigClient for server connection configuration" + "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -85,37 +43,44 @@ "output_type": "stream", "text": [ "Config information:\n", - " {'rest': {'host': 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'}}\n" + " {'rest': {'host': 'https://ws.opencb.org/opencga-prod'}}\n" ] } ], "source": [ + "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", + "from pyopencga.opencga_client import OpencgaClient # import client module\n", + "from pprint import pprint\n", + "import json\n", + "\n", + "## Configuration parameters\n", + "# OpenCGA host\n", + "host = 'https://ws.opencb.org/opencga-prod'\n", + "\n", + "# User credentials\n", + "user = 'demouser'\n", + "passwd = 'demouser' ## you can skip this, see below.\n", + "study = 'demo@family:platinum'\n", + "####################################\n", + "\n", "# Creating ClientConfiguration dict\n", - "config_dict = {\"rest\": {\n", - " \"host\": host \n", + "config_dict = {'rest': {\n", + " 'host': host \n", " }\n", " }\n", + "print('Config information:\\n',config_dict)\n", "\n", - "print(\"Config information:\\n\",config_dict)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Login with user credentials" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ + "# Pass the config_dict dictionary to the ClientConfiguration method\n", "config = ClientConfiguration(config_dict)\n", + "\n", + "# Create the client\n", "oc = OpencgaClient(config)\n", "\n", - "## Login\n", + "# Pass the credentials to the client\n", + "# (here we put only the user in order to be asked for the password interactively)\n", + "# oc.login(user)\n", + "\n", + "# or you can pass the user and passwd\n", "oc.login(user, passwd)" ] }, @@ -123,14 +88,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**You are now connected to OpenCGA**" + "## Creating ConfigClient for server connection configuration" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Querying Variants" + "## 2. Querying Variants" ] }, { @@ -177,7 +142,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.6.13" } }, "nbformat": 4, From dea864152337da738dfba08f00c8d1e714e2aa63 Mon Sep 17 00:00:00 2001 From: imedina Date: Thu, 11 Mar 2021 17:03:29 +0000 Subject: [PATCH 078/412] wc: more work in the notebooks #1716 --- .../pyopencga_basic_notebook_001.ipynb | 2 +- .../user-training/pyopencga_catalog.ipynb | 51 ++++++---------- .../user-training/pyopencga_first_steps.ipynb | 59 +++++++++++++++++++ .../pyopencga_variant_analysis.ipynb | 35 ++++++++++- .../pyopencga_variant_query.ipynb | 11 +++- 5 files changed, 121 insertions(+), 37 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb index e629deabaf9..1676b5c0523 100644 --- a/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb +++ b/opencga-client/src/main/python/notebooks/general-notebooks/pyopencga_basic_notebook_001.ipynb @@ -713,7 +713,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.13" + "version": "3.6.9" }, "pycharm": { "stem_cell": { diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 90ed72dbc27..7cf93add659 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -2,7 +2,6 @@ "cells": [ { "cell_type": "markdown", - "id": "adequate-singles", "metadata": {}, "source": [ "# *pyopencga* Catalog: Clinical Data and other Metadata. \n", @@ -27,7 +26,6 @@ }, { "cell_type": "markdown", - "id": "correct-spine", "metadata": {}, "source": [ "## 1. Setup the Client and Login into *pyopencga* \n", @@ -41,8 +39,7 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "incorporate-summer", + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -60,7 +57,9 @@ "from pprint import pprint\n", "import json\n", "\n", - "## Configuration parameters\n", + "####################################\n", + "## Configuration parameters #######\n", + "####################################\n", "# OpenCGA host\n", "host = 'https://ws.opencb.org/opencga-prod'\n", "\n", @@ -94,7 +93,6 @@ }, { "cell_type": "markdown", - "id": "responsible-charles", "metadata": {}, "source": [ "# 2. Use Cases \n", @@ -106,10 +104,9 @@ }, { "cell_type": "markdown", - "id": "inappropriate-driving", "metadata": {}, "source": [ - "## 2.1 Working with our User: see permissions for Projects and studies\n", + "## 2.1 Exploring User Account: Projects, studies and permissions\n", "\n", "In this use case we cover retrieving information for our user.\n", "\n", @@ -119,7 +116,6 @@ { "cell_type": "code", "execution_count": 3, - "id": "consolidated-permit", "metadata": {}, "outputs": [], "source": [ @@ -129,7 +125,6 @@ }, { "cell_type": "markdown", - "id": "chief-wonder", "metadata": {}, "source": [ "Depending on the permissions granted, an user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our usser and its permissions by:" @@ -138,7 +133,6 @@ { "cell_type": "code", "execution_count": 8, - "id": "comparable-purchase", "metadata": {}, "outputs": [ { @@ -163,7 +157,6 @@ }, { "cell_type": "markdown", - "id": "premier-hardwood", "metadata": {}, "source": [ "We can appreciate that our user (demouser) has **not** projects from its own, but has been granted access to some projects from `demo` user. Let's see how to find it out." @@ -171,7 +164,6 @@ }, { "cell_type": "markdown", - "id": "french-departure", "metadata": {}, "source": [ "### Exploring the projects for our user\n", @@ -182,7 +174,6 @@ { "cell_type": "code", "execution_count": 5, - "id": "encouraging-colon", "metadata": {}, "outputs": [ { @@ -206,7 +197,6 @@ }, { "cell_type": "markdown", - "id": "accomplished-bhutan", "metadata": {}, "source": [ "Our user (demo) has access to 2 different projects:\n", @@ -216,7 +206,6 @@ }, { "cell_type": "markdown", - "id": "starting-flashing", "metadata": {}, "source": [ "### Exploring the Studies for our user\n", @@ -232,7 +221,6 @@ { "cell_type": "code", "execution_count": 6, - "id": "adequate-enhancement", "metadata": {}, "outputs": [ { @@ -260,7 +248,6 @@ }, { "cell_type": "markdown", - "id": "brutal-accordance", "metadata": {}, "source": [ "Our user (demo) has access to 2 different studies within the *family* project:\n", @@ -272,18 +259,16 @@ }, { "cell_type": "markdown", - "id": "announced-tennis", "metadata": {}, "source": [ - "## 2.2 Browsing samples or individuals" + "## 2.2 Browsing samples and individuals" ] }, { "cell_type": "markdown", - "id": "unnecessary-sherman", "metadata": {}, "source": [ - "### Exploring Samples\n", + "### Exploring Samples and Individuals\n", "\n", "Once we know the studies our user 'demo' has access to, we can explore the samples that a project contains.
\n", "To fetch samples you need to use the sample client built in pyopencga.
\n", @@ -296,7 +281,6 @@ { "cell_type": "code", "execution_count": 9, - "id": "specified-polls", "metadata": {}, "outputs": [ { @@ -324,7 +308,6 @@ }, { "cell_type": "markdown", - "id": "acknowledged-genetics", "metadata": {}, "source": [ "We can see that project *platinium* has **17 samples** (given by #Num matches). The count is returned because we have set the parameter `count=True`.\n", @@ -334,32 +317,36 @@ }, { "cell_type": "markdown", - "id": "essential-garlic", "metadata": {}, "source": [ - "### Exploring Individuals" + "## 2.3 Filtering by Custom Annotations\n", + "You can easily filter samples, individuals, ... using your custom annotation ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.4 Browsing Files" ] }, { "cell_type": "markdown", - "id": "north-swiss", "metadata": {}, "source": [ - "### How many Samples are in a given Individual?" + "## 2.5 Browsing Cohorts" ] }, { "cell_type": "markdown", - "id": "earned-novel", "metadata": {}, "source": [ - "## 2.3 Browsing Genotypes and Phenotypes" + "## 2.5 Aggregation Stats" ] }, { "cell_type": "code", "execution_count": null, - "id": "intense-final", "metadata": {}, "outputs": [], "source": [] @@ -381,7 +368,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.13" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb index 081fe0ce96f..de9197018f5 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb @@ -468,6 +468,65 @@ "# 4. Working with JOBS" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenCGA implemtns a number of analysis and operations that are executed as jobs\n", + "\n", + "Note: Describe briefly how Jobs work and point to docs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Job Info\n", + "Decribe job information, ...\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Executing Jobs\n", + "Lifecycle, status, ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'oc' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mrest_response\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvariant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgwas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'oc' is not defined" + ] + } + ], + "source": [ + "## Eexecute GWAS analysis\n", + "rest_response = oc.variant().gwas()\n", + "\n", + "## wait for the job to finish\n", + "oc.wait_for_job(rest_response)\n", + "\n", + "rest_response.print_results()" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb index c0fc8f01dda..7c2eb0e0217 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb @@ -1,9 +1,40 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# *pyopencga* Basic Variant Analysis\n", + "\n", + "------\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1. Overview\n", + "Note: Check Job info in the \"first steps\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. VCF Export\n", + "Note: provide a full documented example" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3. GWAS Analysis" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "minor-panel", "metadata": {}, "outputs": [], "source": [] @@ -25,7 +56,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.13" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 82504390710..a68a44e6fe1 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -115,8 +115,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3. Exporting Files" + "## 3. Aggrgation Files" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -135,7 +142,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.13" + "version": "3.6.9" } }, "nbformat": 4, From 17b484611a946c735045ab4a7cb3dae00ea14790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 11 Mar 2021 16:32:17 +0000 Subject: [PATCH 079/412] storage: Centralize SampleIndexConfiguration. Store in StudyMetadata. #1699 --- .../core/config/IndexFieldConfiguration.java | 125 ++++++++++++ .../config}/SampleIndexConfiguration.java | 180 +++++++++++------- .../core/metadata/models/StudyMetadata.java | 79 ++++++++ .../variant/HadoopVariantStorageEngine.java | 15 +- ...HadoopDefaultVariantAnnotationManager.java | 12 +- ...SampleIndexVariantAggregationExecutor.java | 8 +- .../SampleIndexVariantQueryExecutor.java | 4 +- .../annotation/AnnotationIndexConverter.java | 18 +- .../annotation/AnnotationIndexDBLoader.java | 5 +- .../annotation/AnnotationIndexDriver.java | 4 +- ...va => PopulationFrequencyIndexSchema.java} | 8 +- .../mr/SampleIndexAnnotationLoaderDriver.java | 6 + .../mr/SampleIndexAnnotationLoaderMapper.java | 4 +- .../index/core/CategoricalIndexField.java | 1 + .../CategoricalMultiValuedIndexField.java | 1 + ...amicIndex.java => DynamicIndexSchema.java} | 4 +- .../hadoop/variant/index/core/IndexField.java | 1 + .../index/core/IndexFieldConfiguration.java | 78 -------- .../core/{Index.java => IndexSchema.java} | 8 +- .../variant/index/core/RangeIndexField.java | 1 + ...endelianErrorSampleIndexEntryIterator.java | 9 +- .../index/query/SampleFileIndexQuery.java | 2 +- .../variant/index/query/SampleIndexQuery.java | 16 +- .../index/query/SingleSampleIndexQuery.java | 2 +- .../AbstractSampleIndexEntryFilter.java | 9 +- .../{FileIndex.java => FileIndexSchema.java} | 8 +- .../sample/HBaseToSampleIndexConverter.java | 18 +- ...RawSingleSampleIndexVariantDBIterator.java | 3 +- .../sample/SampleIndexAnnotationLoader.java | 1 + .../sample/SampleIndexConsolidationDrive.java | 5 +- .../index/sample/SampleIndexDBAdaptor.java | 68 +++++-- .../index/sample/SampleIndexDBLoader.java | 10 +- .../index/sample/SampleIndexDriver.java | 14 +- .../index/sample/SampleIndexEntry.java | 34 +--- .../sample/SampleIndexEntryPutBuilder.java | 28 +-- .../index/sample/SampleIndexLoader.java | 12 +- .../index/sample/SampleIndexQueryParser.java | 32 ++-- .../index/sample/SampleIndexSchema.java | 37 +++- .../sample/SampleIndexVariantBiConverter.java | 70 +++++-- .../index/sample/SampleVariantIndexEntry.java | 44 +++-- .../SingleSampleIndexVariantDBIterator.java | 3 +- .../sample/VariantFileIndexConverter.java | 6 +- .../variant/io/VariantExporterDriver.java | 3 +- .../mr/SampleIndexTableRecordReader.java | 2 +- .../variant/mr/VariantMapReduceUtil.java | 36 +++- .../hadoop/variant/VariantHbaseTestUtils.java | 10 +- .../AnnotationIndexConverterTest.java | 7 +- .../variant/index/family/FamilyIndexTest.java | 3 +- ...endelianErrorSampleIndexConverterTest.java | 8 +- .../sample/SampleIndexDBAdaptorTest.java | 2 +- .../sample/SampleIndexEntryFilterTest.java | 22 ++- .../SampleIndexEntryPutBuilderTest.java | 8 +- .../sample/SampleIndexQueryParserTest.java | 9 +- .../variant/index/sample/SampleIndexTest.java | 11 +- .../SampleIndexVariantBiConverterTest.java | 8 +- .../sample/SampleVariantIndexEntryTest.java | 6 +- .../VariantFileIndexEntryConverterTest.java | 8 +- .../variant/mr/VariantMapReduceUtilTest.java | 24 +++ 58 files changed, 752 insertions(+), 408 deletions(-) create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IndexFieldConfiguration.java rename opencga-storage/{opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample => opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config}/SampleIndexConfiguration.java (58%) rename opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/{PopulationFrequencyIndex.java => PopulationFrequencyIndexSchema.java} (83%) rename opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/{DynamicIndex.java => DynamicIndexSchema.java} (55%) delete mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexFieldConfiguration.java rename opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/{Index.java => IndexSchema.java} (81%) rename opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/{FileIndex.java => FileIndexSchema.java} (95%) create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtilTest.java diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IndexFieldConfiguration.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IndexFieldConfiguration.java new file mode 100644 index 00000000000..2a6d466995b --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IndexFieldConfiguration.java @@ -0,0 +1,125 @@ +package org.opencb.opencga.storage.core.config; + +import java.beans.ConstructorProperties; +import java.util.Arrays; +import java.util.Objects; + +public class IndexFieldConfiguration { + protected final Source source; + protected final String key; + protected Type type; + protected double[] thresholds; + protected String[] values; + + @ConstructorProperties({"source", "key", "type"}) + protected IndexFieldConfiguration(Source source, String key, Type type) { + this.source = source; + this.key = key; + this.type = type; + } + + public IndexFieldConfiguration(Source source, String key, double[] thresholds) { + this.key = key; + this.source = source; + this.type = Type.RANGE; + this.thresholds = thresholds; + this.values = null; + } + + public IndexFieldConfiguration(Source source, String key, Type type, String... values) { + this.key = key; + this.source = source; + this.type = type; + this.thresholds = null; + this.values = values; + } + + public String getId() { + return getSource() + ":" + getKey(); + } + + public String getKey() { + return key; + } + + public Source getSource() { + return source; + } + + public Type getType() { + return type; + } + + public IndexFieldConfiguration setType(Type type) { + this.type = type; + return this; + } + + public double[] getThresholds() { + return thresholds; + } + + public IndexFieldConfiguration setThresholds(double[] thresholds) { + this.thresholds = thresholds; + return this; + } + + public String[] getValues() { + return values; + } + + public IndexFieldConfiguration setValues(String[] values) { + this.values = values; + return this; + } + + public enum Source { + VARIANT, + META, + FILE, + SAMPLE, + ANNOTATION + } + + public enum Type { + RANGE, + CATEGORICAL, + CATEGORICAL_MULTI_VALUE + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + IndexFieldConfiguration that = (IndexFieldConfiguration) o; + return source == that.source + && Objects.equals(key, that.key) + && type == that.type + && Arrays.equals(thresholds, that.thresholds) + && Arrays.equals(values, that.values); + } + + @Override + public int hashCode() { + int result = Objects.hash(source, key, type); + result = 31 * result + Arrays.hashCode(thresholds); + result = 31 * result + Arrays.hashCode(values); + return result; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("IndexFieldConfiguration{"); + sb.append("source=").append(source); + sb.append(", key='").append(key).append('\''); + sb.append(", type=").append(type); + sb.append(", thresholds=").append(Arrays.toString(thresholds)); + sb.append(", values=").append(Arrays.toString(values)); + sb.append('}'); + return sb.toString(); + } +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConfiguration.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/SampleIndexConfiguration.java similarity index 58% rename from opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConfiguration.java rename to opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/SampleIndexConfiguration.java index aa1d9189f49..676514615b0 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConfiguration.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/SampleIndexConfiguration.java @@ -1,100 +1,47 @@ -package org.opencb.opencga.storage.hadoop.variant.index.sample; +package org.opencb.opencga.storage.core.config; import htsjdk.variant.vcf.VCFConstants; import org.opencb.biodata.models.variant.StudyEntry; -import org.opencb.opencga.storage.hadoop.variant.index.annotation.PopulationFrequencyIndex; -import org.opencb.opencga.storage.hadoop.variant.index.core.*; +import java.beans.ConstructorProperties; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; -import static org.opencb.opencga.storage.hadoop.variant.index.core.IndexFieldConfiguration.*; - -/** - * Sample index description. Used to build the sample index. - */ public class SampleIndexConfiguration { - - private static final int DEFAULT_FILE_POSITION_SIZE_BITS = 4; + public static final int DEFAULT_FILE_POSITION_SIZE_BITS = 4; private static final double[] QUAL_THRESHOLDS = new double[]{10, 20, 30}; private static final double[] DP_THRESHOLDS = new double[]{5, 10, 15, 20, 30, 40, 50}; private final List populationRanges = new ArrayList<>(); private final FileIndexConfiguration fileIndexConfiguration = new FileIndexConfiguration(); - private FileIndex fileIndex; - private PopulationFrequencyIndex popFreqIndex; - - public SampleIndexConfiguration() { - } - public static SampleIndexConfiguration defaultConfiguration() { SampleIndexConfiguration sampleIndexConfiguration = new SampleIndexConfiguration() .addPopulationRange(new PopulationFrequencyRange("1kG_phase3", "ALL")) .addPopulationRange(new PopulationFrequencyRange("GNOMAD_GENOMES", "ALL")) .addFileIndexField(new IndexFieldConfiguration( - Source.FILE, StudyEntry.FILTER, Type.CATEGORICAL, VCFConstants.PASSES_FILTERS_v4)) + IndexFieldConfiguration.Source.FILE, + StudyEntry.FILTER, + IndexFieldConfiguration.Type.CATEGORICAL, + VCFConstants.PASSES_FILTERS_v4)) .addFileIndexField(new IndexFieldConfiguration( - Source.FILE, StudyEntry.QUAL, QUAL_THRESHOLDS)) + IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL, QUAL_THRESHOLDS)) .addFileIndexField(new IndexFieldConfiguration( - Source.SAMPLE, VCFConstants.DEPTH_KEY, DP_THRESHOLDS)); - sampleIndexConfiguration.getFileIndexConfiguration().setFilePositionBits(DEFAULT_FILE_POSITION_SIZE_BITS); + IndexFieldConfiguration.Source.SAMPLE, VCFConstants.DEPTH_KEY, DP_THRESHOLDS)); + + sampleIndexConfiguration.getFileIndexConfiguration() + .setFilePositionBits(DEFAULT_FILE_POSITION_SIZE_BITS); // Ensure backward compatibility with these two params: sampleIndexConfiguration.addFileIndexField(new IndexFieldConfiguration( - Source.SAMPLE, "padding", Type.CATEGORICAL, "add_two_extra_bits", "to_allow_backward", "compatibility")); + IndexFieldConfiguration.Source.SAMPLE, "padding", IndexFieldConfiguration.Type.CATEGORICAL, + "add_two_extra_bits", "to_allow_backward", "compatibility")); sampleIndexConfiguration.getFileIndexConfiguration().setFixedFieldsFirst(false); - return sampleIndexConfiguration; } - public List getPopulationRanges() { - return populationRanges; - } - - public PopulationFrequencyIndex getPopFreqIndex() { - if (popFreqIndex == null) { - popFreqIndex = new PopulationFrequencyIndex(populationRanges); - } - return popFreqIndex; - } - - public SampleIndexConfiguration addPopulationRange(PopulationFrequencyRange populationRange) { - if (populationRanges.contains(populationRange)) { - throw new IllegalArgumentException("Duplicated population '" - + populationRange.getStudyAndPopulation() + "' in SampleIndexConfiguration"); - } - popFreqIndex = null; - this.populationRanges.add(populationRange); - return this; - } - - public List getFileIndexFieldsConfiguration() { - return fileIndexConfiguration.customFields; - } - - public FileIndexConfiguration getFileIndexConfiguration() { - return fileIndexConfiguration; - } - - public FileIndex getFileIndex() { - if (fileIndex == null) { - fileIndex = new FileIndex(this.getFileIndexConfiguration()); - } - return fileIndex; - } - - public SampleIndexConfiguration addFileIndexField(IndexFieldConfiguration fileIndex) { - if (fileIndexConfiguration.customFields.contains(fileIndex)) { - throw new IllegalArgumentException("Duplicated file index '" - + fileIndex.getKey() + "' in SampleIndexConfiguration"); - } - this.fileIndex = null; - this.fileIndexConfiguration.customFields.add(fileIndex); - return this; - } - public static class FileIndexConfiguration { private final List customFields = new ArrayList<>(); @@ -130,6 +77,35 @@ public FileIndexConfiguration setFixedFieldsFirst(boolean fixedFieldsFirst) { this.fixedFieldsFirst = fixedFieldsFirst; return this; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + FileIndexConfiguration that = (FileIndexConfiguration) o; + return filePositionBits == that.filePositionBits + && fixedFieldsFirst == that.fixedFieldsFirst + && Objects.equals(customFields, that.customFields); + } + + @Override + public int hashCode() { + return Objects.hash(customFields, filePositionBits, fixedFieldsFirst); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("FileIndexConfiguration{"); + sb.append("customFields=").append(customFields); + sb.append(", filePositionBits=").append(filePositionBits); + sb.append(", fixedFieldsFirst=").append(fixedFieldsFirst); + sb.append('}'); + return sb.toString(); + } } public static class PopulationFrequencyRange extends IndexFieldConfiguration { @@ -151,6 +127,11 @@ public PopulationFrequencyRange(String study, String population) { this.population = population; } + @ConstructorProperties({"source", "key", "type"}) + protected PopulationFrequencyRange(Source source, String key, Type type) { + super(source, key, type); + } + public String getStudy() { return study; } @@ -182,13 +163,59 @@ public boolean equals(Object o) { return false; } PopulationFrequencyRange that = (PopulationFrequencyRange) o; - return Objects.equals(study, that.study) && Objects.equals(population, that.population); + return super.equals(that) && Objects.equals(study, that.study) && Objects.equals(population, that.population); } @Override public int hashCode() { - return Objects.hash(study, population); + return Objects.hash(super.hashCode(), study, population); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("PopulationFrequencyRange{"); + sb.append("study='").append(study).append('\''); + sb.append(", population='").append(population).append('\''); + sb.append(", source=").append(source); + sb.append(", key='").append(key).append('\''); + sb.append(", type=").append(type); + sb.append(", thresholds=").append(Arrays.toString(thresholds)); + sb.append(", values=").append(Arrays.toString(values)); + sb.append('}'); + return sb.toString(); + } + } + + + public List getPopulationRanges() { + return populationRanges; + } + + public SampleIndexConfiguration addPopulationRange(SampleIndexConfiguration.PopulationFrequencyRange populationRange) { + if (populationRanges.contains(populationRange)) { + throw new IllegalArgumentException("Duplicated population '" + + populationRange.getStudyAndPopulation() + "' in SampleIndexConfiguration"); + } + this.populationRanges.add(populationRange); + return this; + } + + public List getFileIndexFieldsConfiguration() { + return fileIndexConfiguration.getCustomFields(); + } + + public FileIndexConfiguration getFileIndexConfiguration() { + return fileIndexConfiguration; + } + + + public SampleIndexConfiguration addFileIndexField(IndexFieldConfiguration fileIndex) { + if (fileIndexConfiguration.getCustomFields().contains(fileIndex)) { + throw new IllegalArgumentException("Duplicated file index '" + + fileIndex.getKey() + "' in SampleIndexConfiguration"); } + this.fileIndexConfiguration.getCustomFields().add(fileIndex); + return this; } @Override @@ -200,12 +227,21 @@ public boolean equals(Object o) { return false; } SampleIndexConfiguration that = (SampleIndexConfiguration) o; - return Objects.equals(populationRanges, that.populationRanges); + return Objects.equals(populationRanges, that.populationRanges) + && Objects.equals(fileIndexConfiguration, that.fileIndexConfiguration); } @Override public int hashCode() { - return Objects.hash(populationRanges); + return Objects.hash(populationRanges, fileIndexConfiguration); } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("SampleIndexConfiguration{"); + sb.append("populationRanges=").append(populationRanges); + sb.append(", fileIndexConfiguration=").append(fileIndexConfiguration); + sb.append('}'); + return sb.toString(); + } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/models/StudyMetadata.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/models/StudyMetadata.java index c6efbf0865c..8d13fb80984 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/models/StudyMetadata.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/models/StudyMetadata.java @@ -7,10 +7,12 @@ import org.opencb.biodata.models.variant.metadata.VariantFileHeaderSimpleLine; import org.opencb.biodata.tools.variant.stats.AggregationUtils; import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.StudyConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -28,6 +30,7 @@ public class StudyMetadata { private Long timeStamp; private VariantFileHeader variantHeader; private List variantScores; + private List sampleIndexConfigurations; private ObjectMap attributes; @@ -131,6 +134,29 @@ public StudyMetadata setVariantScores(List variantScores) return this; } + public SampleIndexConfigurationVersioned getSampleIndexConfigurationLatest() { + if (sampleIndexConfigurations == null || sampleIndexConfigurations.isEmpty()) { + return new SampleIndexConfigurationVersioned(SampleIndexConfiguration.defaultConfiguration(), 1, Date.from(Instant.now())); + } else { + SampleIndexConfigurationVersioned conf = sampleIndexConfigurations.get(0); + for (SampleIndexConfigurationVersioned thisConf : sampleIndexConfigurations) { + if (thisConf.getVersion() > conf.getVersion()) { + conf = thisConf; + } + } + return conf; + } + } + + public List getSampleIndexConfigurations() { + return sampleIndexConfigurations; + } + + public StudyMetadata setSampleIndexConfigurations(List sampleIndexConfigurations) { + this.sampleIndexConfigurations = sampleIndexConfigurations; + return this; + } + public ObjectMap getAttributes() { return attributes; } @@ -193,4 +219,57 @@ public StudyMetadata addVariantFileHeader(VariantFileHeader header, List return this; } + + public static class SampleIndexConfigurationVersioned { + private SampleIndexConfiguration configuration; + private int version; + private Date date; +// private int numSamples; + + + public SampleIndexConfigurationVersioned() { + } + + public SampleIndexConfigurationVersioned(SampleIndexConfiguration configuration, int version, Date date) { + this.configuration = configuration; + this.version = version; + this.date = date; + } + + public SampleIndexConfiguration getConfiguration() { + return configuration; + } + + public SampleIndexConfigurationVersioned setConfiguration(SampleIndexConfiguration configuration) { + this.configuration = configuration; + return this; + } + + public int getVersion() { + return version; + } + + public SampleIndexConfigurationVersioned setVersion(int version) { + this.version = version; + return this; + } + + public Date getDate() { + return date; + } + + public SampleIndexConfigurationVersioned setDate(Date date) { + this.date = date; + return this; + } + +// public int getNumSamples() { +// return numSamples; +// } +// +// public SampleIndexConfigurationVersioned setNumSamples(int numSamples) { +// this.numSamples = numSamples; +// return this; +// } + } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java index 700d6006864..bcbcaec2843 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java @@ -86,7 +86,10 @@ import org.opencb.opencga.storage.hadoop.variant.index.SampleIndexVariantAggregationExecutor; import org.opencb.opencga.storage.hadoop.variant.index.SampleIndexVariantQueryExecutor; import org.opencb.opencga.storage.hadoop.variant.index.family.FamilyIndexDriver; -import org.opencb.opencga.storage.hadoop.variant.index.sample.*; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexAnnotationLoader; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexDBAdaptor; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexLoader; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import org.opencb.opencga.storage.hadoop.variant.io.HadoopVariantExporter; import org.opencb.opencga.storage.hadoop.variant.score.HadoopVariantScoreLoader; import org.opencb.opencga.storage.hadoop.variant.score.HadoopVariantScoreRemover; @@ -320,7 +323,7 @@ protected VariantExporter newVariantExporter(VariantMetadataFactory metadataFact @Override public void sampleIndex(String study, List samples, ObjectMap options) throws StorageEngineException { options = getMergedOptions(options); - new SampleIndexLoader(getTableNameGenerator(), getMetadataManager(), getMRExecutor()) + new SampleIndexLoader(getTableNameGenerator(), getMetadataManager(), getMRExecutor(), getSampleIndexDBAdaptor().getSchema(study)) .buildSampleIndex(study, samples, options); } @@ -559,12 +562,12 @@ private void fillGapsOrMissing(String study, StudyMetadata studyMetadata, Set task = Task.join(hBaseConverter, annotationIndexDBLoader.asTask(true)); +// Task task = Task.join(hBaseConverter, annotationIndexDBLoader.asTask(true)); VariantAnnotationHadoopDBWriter writer = new VariantAnnotationHadoopDBWriter(dbAdaptor); - return new ParallelTaskRunner<>(reader, task, writer, config); + return new ParallelTaskRunner<>(reader, hBaseConverter, writer, config); } else { return new ParallelTaskRunner<>(reader, () -> dbAdaptor.newAnnotationLoader(new QueryOptions(params)) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java index f7be2def945..ed07a0b921b 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java @@ -13,15 +13,18 @@ import org.opencb.opencga.core.response.VariantQueryResult; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; +import org.opencb.opencga.storage.core.metadata.models.StudyMetadata; import org.opencb.opencga.storage.core.utils.iterators.CloseableIterator; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; +import org.opencb.opencga.storage.core.variant.query.VariantQueryParser; import org.opencb.opencga.storage.core.variant.query.executors.VariantAggregationExecutor; import org.opencb.opencga.storage.core.variant.query.executors.accumulators.*; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexDBAdaptor; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexQueryParser; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleVariantIndexEntry; import java.util.*; @@ -125,6 +128,9 @@ private List> createAccumulators( private FacetFieldAccumulator createAccumulator(Query query, String facet) { String[] split = facet.split(NESTED_FACET_SEPARATOR); FacetFieldAccumulator accumulator = null; + StudyMetadata defaultStudy = VariantQueryParser.getDefaultStudy(query, metadataManager); + SampleIndexSchema schema = sampleIndexDBAdaptor.getSchema(defaultStudy.getId()); + // Reverse traverse for (int i = split.length - 1; i >= 0; i--) { String facetField = split[i]; @@ -247,7 +253,7 @@ private FacetFieldAccumulator createAccumulator(Query q fieldKey); break; default: - for (IndexField fileDataIndexField : sampleIndexDBAdaptor.getConfiguration().getFileIndex().getCustomFields()) { + for (IndexField fileDataIndexField : schema.getFileIndex().getCustomFields()) { if (fileDataIndexField.getKey().equalsIgnoreCase(fieldKey)) { switch (fileDataIndexField.getType()) { case RANGE: diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantQueryExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantQueryExecutor.java index 0851bef4c21..164d0633fc5 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantQueryExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantQueryExecutor.java @@ -74,7 +74,7 @@ public DataResult count(Query query) { @Override protected long primaryCount(Query query, QueryOptions options) { - SampleIndexQuery sampleIndexQuery = sampleIndexDBAdaptor.getSampleIndexQueryParser().parse(query); + SampleIndexQuery sampleIndexQuery = sampleIndexDBAdaptor.parseSampleIndexQuery(query); return sampleIndexDBAdaptor.count(sampleIndexQuery); } @@ -90,7 +90,7 @@ protected long primaryCount(Query query, QueryOptions options) { @Override protected Object getOrIterator(Query inputQuery, QueryOptions options, boolean iterator) { Query query = new Query(inputQuery); - SampleIndexQuery sampleIndexQuery = sampleIndexDBAdaptor.getSampleIndexQueryParser().parse(query); + SampleIndexQuery sampleIndexQuery = sampleIndexDBAdaptor.parseSampleIndexQuery(query); return getOrIterator(query, options, iterator, sampleIndexQuery); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java index 8c335777a5d..0972d85477d 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java @@ -9,12 +9,13 @@ import org.apache.hadoop.hbase.util.Bytes; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.*; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexConfiguration; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.util.*; @@ -115,21 +116,16 @@ public class AnnotationIndexConverter { } } - private PopulationFrequencyIndex popFreqIndex; + private PopulationFrequencyIndexSchema popFreqIndex; @Deprecated private final Map populations; - @Deprecated - public AnnotationIndexConverter() { - this(SampleIndexConfiguration.defaultConfiguration()); - } - - public AnnotationIndexConverter(SampleIndexConfiguration configuration) { - popFreqIndex = configuration.getPopFreqIndex(); - this.populations = new HashMap<>(configuration.getPopulationRanges().size()); + public AnnotationIndexConverter(SampleIndexSchema schema) { + popFreqIndex = schema.getPopFreqIndex(); + this.populations = new HashMap<>(schema.getConfiguration().getPopulationRanges().size()); int i = 0; - for (SampleIndexConfiguration.PopulationFrequencyRange population : configuration.getPopulationRanges()) { + for (SampleIndexConfiguration.PopulationFrequencyRange population : schema.getConfiguration().getPopulationRanges()) { if (this.populations.put(population.getStudyAndPopulation(), i++) != null) { throw new IllegalArgumentException("Duplicated population '" + population.getStudyAndPopulation() + "' in " + populations); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBLoader.java index 36039d9d59f..10ef6218508 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBLoader.java @@ -4,6 +4,7 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.opencga.storage.hadoop.utils.AbstractHBaseDataWriter; import org.opencb.opencga.storage.hadoop.utils.HBaseManager; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.io.IOException; import java.io.UncheckedIOException; @@ -17,9 +18,9 @@ public class AnnotationIndexDBLoader extends AbstractHBaseDataWriter> populations; - public PopulationFrequencyIndex(List populationRanges) { + public PopulationFrequencyIndexSchema(List populationRanges) { fields = new ArrayList<>(populationRanges.size()); populations = new HashMap<>(); int bitOffset = 0; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java index 2c2be153dc7..2f3ca18fc75 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java @@ -7,6 +7,7 @@ import org.apache.hadoop.mapreduce.Job; import org.opencb.biodata.models.core.Region; import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; @@ -148,6 +149,11 @@ protected Job setupJob(Job job, String archiveTable, String variantTable) throws VariantMapReduceUtil.setNoneReduce(job); + SampleIndexConfiguration configuration = getMetadataManager() + .getStudyMetadata(getStudyId()) + .getSampleIndexConfigurationLatest().getConfiguration(); + VariantMapReduceUtil.setSampleIndexConfiguration(job, configuration); + return job; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderMapper.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderMapper.java index 8a8189347bd..8d87e8735a7 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderMapper.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderMapper.java @@ -11,6 +11,7 @@ import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexPutBuilder; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; +import org.opencb.opencga.storage.hadoop.variant.mr.VariantMapReduceUtil; import org.opencb.opencga.storage.hadoop.variant.mr.VariantsTableMapReduceHelper; import java.io.IOException; @@ -61,7 +62,8 @@ protected void setup(Context context) throws IOException, InterruptedException { for (int i = 0; i < annotationIndices.length; i++) { annotationIndices[i] = new HashMap<>(); } - converter = new AnnotationIndexConverter(); + converter = new AnnotationIndexConverter( + new SampleIndexSchema(VariantMapReduceUtil.getSampleIndexConfiguration(context.getConfiguration()))); } @Override diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java index 9452fae91f3..6b69660d827 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java @@ -1,6 +1,7 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; import org.apache.commons.lang3.StringUtils; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; import org.opencb.opencga.storage.core.variant.query.OpValue; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java index c9224ce3c87..ebfedb0321b 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java @@ -1,5 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; import org.opencb.opencga.storage.core.variant.query.OpValue; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.MaskIndexFieldFilter; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndex.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndexSchema.java similarity index 55% rename from opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndex.java rename to opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndexSchema.java index f50eeba82be..fbf85fac089 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndex.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndexSchema.java @@ -1,8 +1,8 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; -public abstract class DynamicIndex extends Index { +public abstract class DynamicIndexSchema extends IndexSchema { - public DynamicIndex() { + public DynamicIndexSchema() { } public abstract boolean hasMoreValues(); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java index b22eb29ea99..d5f004fd50b 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java @@ -1,5 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.variant.query.OpValue; import org.opencb.opencga.storage.core.variant.query.Values; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexFieldConfiguration.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexFieldConfiguration.java deleted file mode 100644 index d151d841c09..00000000000 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexFieldConfiguration.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.opencb.opencga.storage.hadoop.variant.index.core; - -public class IndexFieldConfiguration { - private final Source source; - private final String key; - private Type type; - private double[] thresholds; - private String[] values; - - public IndexFieldConfiguration(Source source, String key, double[] thresholds) { - this.key = key; - this.source = source; - this.type = Type.RANGE; - this.thresholds = thresholds; - this.values = null; - } - - public IndexFieldConfiguration(Source source, String key, Type type, String... values) { - this.key = key; - this.source = source; - this.type = type; - this.thresholds = null; - this.values = values; - } - - public String getId() { - return getSource() + ":" + getKey(); - } - - public String getKey() { - return key; - } - - public Source getSource() { - return source; - } - - public Type getType() { - return type; - } - - public IndexFieldConfiguration setType(Type type) { - this.type = type; - return this; - } - - public double[] getThresholds() { - return thresholds; - } - - public IndexFieldConfiguration setThresholds(double[] thresholds) { - this.thresholds = thresholds; - return this; - } - - public String[] getValues() { - return values; - } - - public IndexFieldConfiguration setValues(String[] values) { - this.values = values; - return this; - } - - public enum Source { - VARIANT, - META, - FILE, - SAMPLE, - ANNOTATION - } - - public enum Type { - RANGE, - CATEGORICAL, - CATEGORICAL_MULTI_VALUE - } -} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/Index.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java similarity index 81% rename from opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/Index.java rename to opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java index 5f219e41851..2281b2c9dbc 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/Index.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java @@ -1,17 +1,19 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; + import java.util.List; -public abstract class Index { +public abstract class IndexSchema { protected List> fields; private int indexSizeBits; - protected Index() { + protected IndexSchema() { } - public Index(List> fields) { + public IndexSchema(List> fields) { this.fields = fields; updateIndexSizeBits(); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java index e4b1adb0b89..05326190949 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java @@ -1,5 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; import org.opencb.opencga.storage.core.variant.query.OpValue; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexEntryIterator.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexEntryIterator.java index 2e5f735a3e0..5fdf068f3f5 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexEntryIterator.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexEntryIterator.java @@ -4,9 +4,7 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexEntry; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexEntryIterator; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleVariantIndexEntry; +import org.opencb.opencga.storage.hadoop.variant.index.sample.*; import java.util.*; @@ -28,7 +26,7 @@ public class MendelianErrorSampleIndexEntryIterator implements SampleIndexEntryI private String nextGt; private Map gtIterators = Collections.emptyMap(); - public MendelianErrorSampleIndexEntryIterator(SampleIndexEntry entry) { + public MendelianErrorSampleIndexEntryIterator(SampleIndexEntry entry, SampleIndexSchema schema) { List values = split( entry.getMendelianVariantsValue(), entry.getMendelianVariantsOffset(), @@ -36,8 +34,9 @@ public MendelianErrorSampleIndexEntryIterator(SampleIndexEntry entry) { size = values.size(); variants = values.listIterator(); gtIterators = new HashMap<>(entry.getGts().size()); + SampleIndexVariantBiConverter converter = new SampleIndexVariantBiConverter(schema); for (SampleIndexEntry.SampleIndexGtEntry gtEntry : entry.getGts().values()) { - gtIterators.put(gtEntry.getGt(), gtEntry.iterator(true)); + gtIterators.put(gtEntry.getGt(), converter.toVariantsCountIterator(gtEntry)); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleFileIndexQuery.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleFileIndexQuery.java index 1dcdacf90b7..8238ea3f3aa 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleFileIndexQuery.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleFileIndexQuery.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.query; -import org.opencb.opencga.storage.hadoop.variant.index.core.IndexFieldConfiguration; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import java.util.Collections; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java index 8168908be68..b21dd88be1a 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java @@ -5,6 +5,7 @@ import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.opencga.storage.core.variant.query.Values; import org.opencb.opencga.storage.hadoop.variant.index.family.GenotypeCodec; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.util.*; import java.util.stream.Collectors; @@ -29,6 +30,7 @@ public class SampleIndexQuery { } } + private final SampleIndexSchema schema; private final Collection> regionGroups; private final Set variantTypes; private final String study; @@ -47,6 +49,7 @@ public class SampleIndexQuery { private final QueryOperation queryOperation; public SampleIndexQuery(Collection> regionGroups, SampleIndexQuery query) { + this.schema = query.schema; this.regionGroups = regionGroups; this.variantTypes = query.variantTypes; this.study = query.study; @@ -62,19 +65,20 @@ public SampleIndexQuery(Collection> regionGroups, SampleIndexQuery this.queryOperation = query.queryOperation; } - public SampleIndexQuery(Collection> regionGroups, String study, Map> samplesMap, - QueryOperation queryOperation) { - this(regionGroups, null, study, samplesMap, Collections.emptySet(), null, Collections.emptyMap(), Collections.emptyMap(), + public SampleIndexQuery(SampleIndexSchema schema, Collection> regionGroups, String study, Map> samplesMap, QueryOperation queryOperation) { + this(schema, regionGroups, null, study, samplesMap, Collections.emptySet(), null, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), new SampleAnnotationIndexQuery(), Collections.emptySet(), false, queryOperation); } - public SampleIndexQuery(Collection> regionGroups, Set variantTypes, String study, + public SampleIndexQuery(SampleIndexSchema schema, Collection> regionGroups, Set variantTypes, String study, Map> samplesMap, Set multiFileSamplesSet, Set negatedSamples, Map fatherFilter, Map motherFilter, Map> fileFilterMap, SampleAnnotationIndexQuery annotationIndexQuery, Set mendelianErrorSet, boolean onlyDeNovo, QueryOperation queryOperation) { + this.schema = schema; this.regionGroups = regionGroups; this.variantTypes = variantTypes; this.study = study; @@ -90,6 +94,10 @@ public SampleIndexQuery(Collection> regionGroups, Set this.queryOperation = queryOperation; } + public SampleIndexSchema getSchema() { + return schema; + } + public Collection> getRegionGroups() { return regionGroups; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SingleSampleIndexQuery.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SingleSampleIndexQuery.java index 505c8e0848d..889adf6ea40 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SingleSampleIndexQuery.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SingleSampleIndexQuery.java @@ -23,7 +23,7 @@ protected SingleSampleIndexQuery(SampleIndexQuery query, String sample) { } protected SingleSampleIndexQuery(SampleIndexQuery query, String sample, List gts) { - super(query.getRegionGroups() == null ? null : new ArrayList<>(query.getRegionGroups()), + super(query.getSchema(), query.getRegionGroups() == null ? null : new ArrayList<>(query.getRegionGroups()), query.getVariantTypes() == null ? null : new HashSet<>(query.getVariantTypes()), query.getStudy(), Collections.singletonMap(sample, gts), diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java index f0733a7e95f..b3a08ca1d9a 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java @@ -37,8 +37,8 @@ public abstract class AbstractSampleIndexEntryFilter { private final SingleSampleIndexQuery query; private final List regionsFilter; private final Logger logger = LoggerFactory.getLogger(AbstractSampleIndexEntryFilter.class); - private final List annotationIndexPositions; + private final SampleIndexVariantBiConverter converter; private static final boolean[] DE_NOVO_MENDELIAN_ERROR_CODES = new boolean[]{ /* | Code | Dad | Mother | Kid | deNovo | */ @@ -64,6 +64,7 @@ public AbstractSampleIndexEntryFilter(SingleSampleIndexQuery query) { public AbstractSampleIndexEntryFilter(SingleSampleIndexQuery query, List regionsFilter) { this.query = query; + converter = new SampleIndexVariantBiConverter(query.getSchema()); this.regionsFilter = regionsFilter == null || regionsFilter.isEmpty() ? null : regionsFilter; int[] countsPerBit = IndexUtils.countPerBit(new byte[]{query.getAnnotationIndex()}); @@ -86,7 +87,7 @@ public AbstractSampleIndexEntryFilter(SingleSampleIndexQuery query, List public Collection filter(SampleIndexEntry sampleIndexEntry) { if (query.getMendelianError()) { - return filterMendelian(sampleIndexEntry.mendelianIterator()); + return filterMendelian(converter.toMendelianIterator(sampleIndexEntry)); } else { return filter(sampleIndexEntry, false); } @@ -94,7 +95,7 @@ public Collection filter(SampleIndexEntry sampleIndexEntry) { public int filterAndCount(SampleIndexEntry sampleIndexEntry) { if (query.getMendelianError()) { - return filterMendelian(sampleIndexEntry.mendelianIterator()).size(); + return filterMendelian(converter.toMendelianIterator(sampleIndexEntry)).size(); } else { return filter(sampleIndexEntry, true).size(); } @@ -136,7 +137,7 @@ private Collection filter(SampleIndexEntry entry, boolean count) { for (SampleIndexGtEntry gtEntry : gts.values()) { MutableInt expectedResultsFromAnnotation = new MutableInt(getExpectedResultsFromAnnotation(gtEntry)); - SampleIndexEntryIterator variantIterator = gtEntry.iterator(countIterator); + SampleIndexEntryIterator variantIterator = converter.toVariantsIterator(gtEntry, countIterator); ArrayList variants = new ArrayList<>(variantIterator.getApproxSize()); while (expectedResultsFromAnnotation.intValue() > 0 && variantIterator.hasNext()) { T variant = filter(variantIterator, expectedResultsFromAnnotation); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndex.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java similarity index 95% rename from opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndex.java rename to opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java index b6c1746adbe..c1f94092b6f 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndex.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java @@ -3,6 +3,8 @@ import htsjdk.variant.vcf.VCFConstants; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.avro.VariantType; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.hadoop.variant.index.core.*; @@ -13,7 +15,7 @@ import java.util.List; -public class FileIndex extends Index { +public class FileIndexSchema extends IndexSchema { private final List> fixedFields; private final List> customFields; @@ -21,13 +23,13 @@ public class FileIndex extends Index { private final IndexField typeIndex; private final IndexField filePositionIndex; - public FileIndex(SampleIndexConfiguration.FileIndexConfiguration fileIndexConfiguration) { + public FileIndexSchema(SampleIndexConfiguration.FileIndexConfiguration fileIndexConfiguration) { this(fileIndexConfiguration.getCustomFields(), fileIndexConfiguration.getFilePositionBits(), fileIndexConfiguration.isFixedFieldsFirst()); } - public FileIndex(List customFieldConfigurations, int filePositionSizeBits, boolean fixedFieldsFirst) { + public FileIndexSchema(List customFieldConfigurations, int filePositionSizeBits, boolean fixedFieldsFirst) { if (fixedFieldsFirst) { multiFileIndex = buildMultiFile(null); filePositionIndex = buildFilePositionIndexField(multiFileIndex, filePositionSizeBits); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java index f7ff78068e8..8af139c8ee2 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java @@ -26,13 +26,13 @@ public class HBaseToSampleIndexConverter implements Converter { private final SampleIndexVariantBiConverter converter; - private final SampleIndexConfiguration configuration; - private final FileIndex fileIndex; + private final SampleIndexSchema schema; + private final FileIndexSchema fileIndex; - public HBaseToSampleIndexConverter(SampleIndexConfiguration configuration) { - this.configuration = configuration; - converter = new SampleIndexVariantBiConverter(); - fileIndex = configuration.getFileIndex(); + public HBaseToSampleIndexConverter(SampleIndexSchema schema) { + this.schema = schema; + converter = new SampleIndexVariantBiConverter(schema); + fileIndex = schema.getFileIndex(); } public static Pair parsePendingColumn(byte[] column) { @@ -58,7 +58,7 @@ public SampleIndexEntry convert(Result result) { String chromosome = SampleIndexSchema.chromosomeFromRowKey(row); int batchStart = SampleIndexSchema.batchStartFromRowKey(row); - SampleIndexEntry entry = new SampleIndexEntry(sampleId, chromosome, batchStart, configuration); + SampleIndexEntry entry = new SampleIndexEntry(sampleId, chromosome, batchStart); for (Cell cell : result.rawCells()) { if (columnStartsWith(cell, META_PREFIX_BYTES)) { @@ -137,10 +137,12 @@ public Map> convertToMapSampleVariantIn Map> map = convertToMap(result); Map> mapVariantFileIndex = new HashMap<>(); + SampleVariantIndexEntry.SampleVariantIndexEntryComparator comparator + = new SampleVariantIndexEntry.SampleVariantIndexEntryComparator(schema); for (Cell cell : result.rawCells()) { if (columnStartsWith(cell, FILE_PREFIX_BYTES)) { String gt = SampleIndexSchema.getGt(cell, FILE_PREFIX_BYTES); - TreeSet values = new TreeSet<>(); + TreeSet values = new TreeSet<>(comparator); mapVariantFileIndex.put(gt, values); BitInputStream bis = new BitInputStream( cell.getValueArray(), diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/RawSingleSampleIndexVariantDBIterator.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/RawSingleSampleIndexVariantDBIterator.java index 97cbdf3c1e4..2f1ea72445c 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/RawSingleSampleIndexVariantDBIterator.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/RawSingleSampleIndexVariantDBIterator.java @@ -31,11 +31,12 @@ public RawSingleSampleIndexVariantDBIterator(Table table, SingleSampleIndexQuery regionGroups = query.getRegionGroups(); } + SampleIndexSchema schema = dbAdaptor.getSchema(query.getStudy()); Iterator> iterators = regionGroups.stream() .map(regions -> { // One scan per region group Scan scan = dbAdaptor.parseIncludeAll(query, regions); - HBaseToSampleIndexConverter converter = new HBaseToSampleIndexConverter(dbAdaptor.getConfiguration()); + HBaseToSampleIndexConverter converter = new HBaseToSampleIndexConverter(schema); RawSampleIndexEntryFilter filter = new RawSampleIndexEntryFilter(query, regions); try { ResultScanner scanner = table.getScanner(scan); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java index 586e4dd751b..94fe8d608b4 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java @@ -9,6 +9,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.io.DataReader; import org.opencb.commons.run.ParallelTaskRunner; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConsolidationDrive.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConsolidationDrive.java index 51955a21ea6..187047c9714 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConsolidationDrive.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConsolidationDrive.java @@ -36,6 +36,7 @@ * * @author Jacobo Coll <jacobo167@gmail.com> */ +@Deprecated public class SampleIndexConsolidationDrive extends AbstractVariantsTableDriver { public static final String GENOTYPES_COUNTER_GROUP_NAME = "genotypes"; private static final Logger LOG = LoggerFactory.getLogger(SampleIndexConsolidationDrive.class); @@ -129,12 +130,14 @@ public static class SampleIndexConsolidationMapper extends TableMapper schemas; +// private final HBaseToSampleIndexConverter converter; public SampleIndexDBAdaptor(HBaseManager hBaseManager, HBaseVariantTableNameGenerator tableNameGenerator, VariantStorageMetadataManager metadataManager) { @@ -72,10 +76,7 @@ public SampleIndexDBAdaptor(HBaseManager hBaseManager, HBaseVariantTableNameGene this.tableNameGenerator = tableNameGenerator; this.metadataManager = metadataManager; family = GenomeHelper.COLUMN_FAMILY_BYTES; - // TODO: Read configuration from metadata manager - configuration = SampleIndexConfiguration.defaultConfiguration(); - parser = new SampleIndexQueryParser(metadataManager, configuration); - converter = new HBaseToSampleIndexConverter(configuration); + schemas = new HashMap<>(); } public static TaskMetadata.Status getSampleIndexAnnotationStatus(SampleMetadata sampleMetadata) { @@ -109,7 +110,7 @@ public static SampleMetadata setSampleIndexStatus(SampleMetadata sampleMetadata, @Override public VariantDBIterator iterator(Query query, QueryOptions options) { - return iterator(parser.parse(query)); + return iterator(parseSampleIndexQuery(query)); } public VariantDBIterator iterator(SampleIndexQuery query) { @@ -220,14 +221,14 @@ private RawSingleSampleIndexVariantDBIterator rawInternalIterator(SingleSampleIn protected Map> queryByGt(int study, int sample, String chromosome, int position) throws IOException { Result result = queryByGtInternal(study, sample, chromosome, position); - return converter.convertToMap(result); + return newConverter(study).convertToMap(result); } protected SampleIndexEntryPutBuilder queryByGtBuilder(int study, int sample, String chromosome, int position) throws IOException { Result result = queryByGtInternal(study, sample, chromosome, position); - return new SampleIndexEntryPutBuilder(sample, chromosome, position, configuration, - converter.convertToMapSampleVariantIndex(result)); + return new SampleIndexEntryPutBuilder(sample, chromosome, position, getSchema(study), + newConverter(study).convertToMapSampleVariantIndex(result)); } private Result queryByGtInternal(int study, int sample, String chromosome, int position) throws IOException { @@ -246,7 +247,7 @@ public Iterator>> iteratorByGt(int study, int sample) Scan scan = new Scan(); scan.setRowPrefixFilter(SampleIndexSchema.toRowKey(sample)); - HBaseToSampleIndexConverter converter = new HBaseToSampleIndexConverter(configuration); + HBaseToSampleIndexConverter converter = newConverter(study); try { ResultScanner scanner = table.getScanner(scan); Iterator resultIterator = scanner.iterator(); @@ -263,7 +264,7 @@ public Iterator rawIterator(int study, int sample) throws IOEx return hBaseManager.act(tableName, table -> { Scan scan = new Scan(); scan.setRowPrefixFilter(SampleIndexSchema.toRowKey(sample)); - HBaseToSampleIndexConverter converter = new HBaseToSampleIndexConverter(configuration); + HBaseToSampleIndexConverter converter = newConverter(study); ResultScanner scanner = table.getScanner(scan); Iterator resultIterator = scanner.iterator(); return Iterators.transform(resultIterator, converter::convert); @@ -271,7 +272,7 @@ public Iterator rawIterator(int study, int sample) throws IOEx } public CloseableIterator rawIterator(Query query) throws IOException { - return rawIterator(parser.parse(query)); + return rawIterator(parseSampleIndexQuery(query)); } public CloseableIterator rawIterator(SampleIndexQuery query) throws IOException { @@ -338,7 +339,7 @@ public boolean isFastCount(SampleIndexQuery query) { } public long count(List regions, String study, String sample, List gts) { - return count(parser.parse(regions, study, sample, gts)); + return count(newParser(toStudyId(study)).parse(regions, study, sample, gts)); } public long count(SampleIndexQuery query) { @@ -361,6 +362,7 @@ private long count(SingleSampleIndexQuery query) { String tableName = tableNameGenerator.getSampleIndexTableName(toStudyId(query.getStudy())); + HBaseToSampleIndexConverter converter = newConverter(toStudyId(query.getStudy())); try { return hBaseManager.act(tableName, table -> { long count = 0; @@ -374,7 +376,6 @@ private long count(SingleSampleIndexQuery query) { subRegionsGroups = Collections.singletonList(regions); } for (List subRegions : subRegionsGroups) { - HBaseToSampleIndexConverter converter = new HBaseToSampleIndexConverter(configuration); boolean noRegionFilter = subRegions.size() == 1 && matchesWithBatch(subRegions.get(0)); // Don't need to parse the variant to filter boolean simpleCount = !query.isMultiFileSample() @@ -420,12 +421,24 @@ private long count(SingleSampleIndexQuery query) { } } - public SampleIndexQueryParser getSampleIndexQueryParser() { - return parser; + protected HBaseToSampleIndexConverter newConverter(int studyId) { + return new HBaseToSampleIndexConverter(getSchema(studyId)); } - public SampleIndexConfiguration getConfiguration() { - return configuration; + public SampleIndexSchema getSchema(String study) { + int studyId = toStudyId(study); + return getSchema(studyId); + } + + public SampleIndexSchema getSchema(int studyId) { + SampleIndexSchema sampleIndexSchema = schemas.get(studyId); + if (sampleIndexSchema == null) { + SampleIndexConfiguration configuration = metadataManager.getStudyMetadata(studyId).getSampleIndexConfigurationLatest() + .getConfiguration(); + sampleIndexSchema = new SampleIndexSchema(configuration); + schemas.put(studyId, sampleIndexSchema); + } + return sampleIndexSchema; } protected int toStudyId(String study) { @@ -508,6 +521,21 @@ public SampleIndexEntryFilter buildSampleIndexEntryFilter(SingleSampleIndexQuery } } + public SampleIndexQuery parseSampleIndexQuery(Query query) { + StudyMetadata defaultStudy = VariantQueryParser.getDefaultStudy(query, metadataManager); + int studyId; + if (defaultStudy == null) { + studyId = toStudyId(null); + } else { + studyId = defaultStudy.getId(); + } + return newParser(studyId).parse(query); + } + + protected SampleIndexQueryParser newParser(int studyId) { + return new SampleIndexQueryParser(metadataManager, getSchema(studyId)); + } + public Scan parse(SingleSampleIndexQuery query, List regions) { return parse(query, regions, false, false); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java index 8969b133d1d..59082fd14a9 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java @@ -43,7 +43,7 @@ public class SampleIndexDBLoader extends AbstractHBaseDataWriter { @@ -111,7 +111,7 @@ public Iterator iterator() { merging = true; } } else { - builder = new SampleIndexEntryPutBuilder(sampleId, indexChunk.chromosome, indexChunk.position, configuration); + builder = new SampleIndexEntryPutBuilder(sampleId, indexChunk.chromosome, indexChunk.position, schema); } samples.add(builder); } @@ -141,7 +141,7 @@ public void addVariant(int sampleIdx, String gt, SampleVariantIndexEntry variant throw new IllegalArgumentException("Already loaded variant " + variantIndexEntry.getVariant()); } } - if (configuration.getFileIndex().isMultiFile(variantIndexEntry.getFileIndex())) { + if (schema.getFileIndex().isMultiFile(variantIndexEntry.getFileIndex())) { throw new IllegalArgumentException("Unexpected multi-file at variant " + variantIndexEntry.getVariant()); } sampleEntry.add(gt, variantIndexEntry); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java index 853b28a054b..79287d0e396 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java @@ -326,6 +326,9 @@ protected Job setupJob(Job job, String archiveTable, String table) throws IOExce job.getConfiguration().set(SAMPLES, sampleIds.stream().map(Object::toString).collect(Collectors.joining(","))); } + StudyMetadata studyMetadata = getMetadataManager().getStudyMetadata(getStudyId()); + VariantMapReduceUtil.setSampleIndexConfiguration(job, studyMetadata.getSampleIndexConfigurationLatest().getConfiguration()); + return job; } @@ -357,7 +360,7 @@ public static class SampleIndexerMapper extends VariantTableSampleIndexOrderMapp private final Map samples = new HashMap<>(); private final Set files = new HashSet<>(); private boolean hasGenotype; - private final SampleIndexConfiguration sampleIndexConfiguration = SampleIndexConfiguration.defaultConfiguration(); + private SampleIndexSchema schema; private final Map samplesMap = new HashMap<>(); private boolean partialScan; @@ -366,7 +369,8 @@ public static class SampleIndexerMapper extends VariantTableSampleIndexOrderMapp protected void setup(Context context) throws IOException, InterruptedException { new GenomeHelper(context.getConfiguration()); hasGenotype = context.getConfiguration().getBoolean(HAS_GENOTYPE, true); - fileIndexConverter = new VariantFileIndexConverter(sampleIndexConfiguration); + schema = new SampleIndexSchema(VariantMapReduceUtil.getSampleIndexConfiguration(context.getConfiguration())); + fileIndexConverter = new VariantFileIndexConverter(schema); int[] sampleIds = context.getConfiguration().getInts(SAMPLES); if (sampleIds == null || sampleIds.length == 0) { @@ -391,7 +395,7 @@ protected void setup(Context context) throws IOException, InterruptedException { for (String sampleFiles : s.split(",")) { if (!sampleFiles.isEmpty()) { String[] sampleFilesSplit = sampleFiles.split(":"); - Integer sampleId = Integer.valueOf(sampleFilesSplit[0]); + int sampleId = Integer.parseInt(sampleFilesSplit[0]); String[] files = sampleFilesSplit[1].split("_"); List fileIds = new ArrayList<>(files.length); for (String file : files) { @@ -451,7 +455,7 @@ protected void map(ImmutableBytesWritable key, Result result, Context context) t } if (validGt) { SampleIndexEntryPutBuilder builder = samplesMap.computeIfAbsent(sampleId, - s -> new SampleIndexEntryPutBuilder(s, variant, sampleIndexConfiguration)); + s -> new SampleIndexEntryPutBuilder(s, variant, schema)); List files; int filePosition; if (sampleMetadata.isMultiFileSample()) { @@ -475,7 +479,7 @@ protected void map(ImmutableBytesWritable key, Result result, Context context) t if (fileIndex != null) { fileFound = true; if (filePosition > 0) { - FileIndex.setFilePosition(fileIndex, filePosition); + FileIndexSchema.setFilePosition(fileIndex, filePosition); } builder.add(gt, new SampleVariantIndexEntry(variant, fileIndex)); if (samplesToCount.contains(sampleId)) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntry.java index c194e42df64..0a9fc63b2f2 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntry.java @@ -2,7 +2,6 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.hadoop.hbase.util.Bytes; -import org.opencb.opencga.storage.hadoop.variant.index.family.MendelianErrorSampleIndexEntryIterator; import java.util.Arrays; import java.util.HashMap; @@ -27,14 +26,12 @@ public class SampleIndexEntry { private int mendelianVariantsLength; private int mendelianVariantsOffset; private int discrepancies; - private SampleIndexConfiguration configuration; - public SampleIndexEntry(int sampleId, String chromosome, int batchStart, SampleIndexConfiguration configuration) { + public SampleIndexEntry(int sampleId, String chromosome, int batchStart) { this.sampleId = sampleId; this.chromosome = chromosome; this.batchStart = batchStart; this.gts = new HashMap<>(4); - this.configuration = configuration; } public String getChromosome() { @@ -110,18 +107,6 @@ public SampleIndexEntry setDiscrepancies(int discrepancies) { return this; } - public SampleIndexConfiguration getConfiguration() { - return configuration; - } - - public SampleIndexEntryIterator iterator(String gt) { - return new SampleIndexVariantBiConverter().toVariantsIterator(this, gt); - } - - public MendelianErrorSampleIndexEntryIterator mendelianIterator() { - return new MendelianErrorSampleIndexEntryIterator(this); - } - public int getSampleId() { return sampleId; } @@ -156,13 +141,12 @@ public boolean equals(Object o) { && Objects.equals(chromosome, that.chromosome) && Objects.equals(gts, that.gts) && Bytes.equals(mendelianVariantsValue, mendelianVariantsOffset, mendelianVariantsLength, - that.mendelianVariantsValue, that.mendelianVariantsOffset, that.mendelianVariantsLength) - && Objects.equals(configuration, that.configuration); + that.mendelianVariantsValue, that.mendelianVariantsOffset, that.mendelianVariantsLength); } @Override public int hashCode() { - int result = Objects.hash(sampleId, chromosome, batchStart, gts, mendelianVariantsLength, mendelianVariantsOffset, configuration); + int result = Objects.hash(sampleId, chromosome, batchStart, gts, mendelianVariantsLength, mendelianVariantsOffset); result = 31 * result + Arrays.hashCode(mendelianVariantsValue); return result; } @@ -214,16 +198,8 @@ public SampleIndexGtEntry(String gt) { this.gt = gt; } - public SampleIndexEntryIterator iterator() { - return iterator(false); - } - - public SampleIndexEntryIterator iterator(boolean onlyCount) { - if (onlyCount) { - return new SampleIndexVariantBiConverter().toVariantsCountIterator(SampleIndexEntry.this, gt); - } else { - return new SampleIndexVariantBiConverter().toVariantsIterator(SampleIndexEntry.this, gt); - } + public SampleIndexEntry getEntry() { + return SampleIndexEntry.this; } public String getGt() { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java index 64946dcd8ba..aafb41ac351 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java @@ -19,26 +19,28 @@ public class SampleIndexEntryPutBuilder { private final Map gts; private final SampleIndexVariantBiConverter variantConverter; private final byte[] family = GenomeHelper.COLUMN_FAMILY_BYTES; - private SampleIndexConfiguration configuration; - private FileIndex fileIndex; + private SampleIndexSchema schema; + private FileIndexSchema fileIndex; + private SampleVariantIndexEntry.SampleVariantIndexEntryComparator comparator; - public SampleIndexEntryPutBuilder(int sampleId, Variant variant, SampleIndexConfiguration configuration) { - this(sampleId, variant.getChromosome(), SampleIndexSchema.getChunkStart(variant.getStart()), configuration); + public SampleIndexEntryPutBuilder(int sampleId, Variant variant, SampleIndexSchema schema) { + this(sampleId, variant.getChromosome(), SampleIndexSchema.getChunkStart(variant.getStart()), schema); } - public SampleIndexEntryPutBuilder(int sampleId, String chromosome, int position, SampleIndexConfiguration configuration) { + public SampleIndexEntryPutBuilder(int sampleId, String chromosome, int position, SampleIndexSchema schema) { this.sampleId = sampleId; this.chromosome = chromosome; this.position = position; gts = new HashMap<>(); - variantConverter = new SampleIndexVariantBiConverter(); - this.configuration = configuration; - fileIndex = this.configuration.getFileIndex(); + variantConverter = new SampleIndexVariantBiConverter(schema); + this.schema = schema; + fileIndex = this.schema.getFileIndex(); + comparator = new SampleVariantIndexEntry.SampleVariantIndexEntryComparator(schema); } - public SampleIndexEntryPutBuilder(int sampleId, String chromosome, int position, SampleIndexConfiguration configuration, + public SampleIndexEntryPutBuilder(int sampleId, String chromosome, int position, SampleIndexSchema schema, Map> map) { - this(sampleId, chromosome, position, configuration); + this(sampleId, chromosome, position, schema); for (Map.Entry> entry : map.entrySet()) { gts.put(entry.getKey(), new SampleIndexGtEntryBuilder(entry.getKey(), entry.getValue())); } @@ -50,7 +52,7 @@ public SampleIndexEntryPutBuilder add(String gt, SampleVariantIndexEntry variant } private SampleIndexGtEntryBuilder get(String gt) { - return gts.computeIfAbsent(gt, SampleIndexGtEntryBuilder::new); + return gts.computeIfAbsent(gt, gt1 -> new SampleIndexGtEntryBuilder(gt1, comparator)); } public boolean containsVariant(SampleVariantIndexEntry variantIndexEntry) { @@ -129,9 +131,9 @@ private static class SampleIndexGtEntryBuilder { private final String gt; private final TreeSet entries; - SampleIndexGtEntryBuilder(String gt) { + SampleIndexGtEntryBuilder(String gt, Comparator comparator) { this.gt = gt; - entries = new TreeSet<>(); + entries = new TreeSet<>(comparator); } SampleIndexGtEntryBuilder(String gt, TreeSet entries) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexLoader.java index 8fae99a5146..d4376f51cfe 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexLoader.java @@ -27,21 +27,15 @@ public class SampleIndexLoader { private final HBaseVariantTableNameGenerator tableNameGenerator; private final MRExecutor mrExecutor; private final VariantStorageMetadataManager metadataManager; - private final SampleIndexConfiguration configuration; + private final SampleIndexSchema schema; private Logger logger = LoggerFactory.getLogger(SampleIndexLoader.class); - @Deprecated public SampleIndexLoader(HBaseVariantTableNameGenerator tableNameGenerator, - VariantStorageMetadataManager metadataManager, MRExecutor mrExecutor) { - this(tableNameGenerator, metadataManager, mrExecutor, SampleIndexConfiguration.defaultConfiguration()); - } - - public SampleIndexLoader(HBaseVariantTableNameGenerator tableNameGenerator, - VariantStorageMetadataManager metadataManager, MRExecutor mrExecutor, SampleIndexConfiguration configuration) { + VariantStorageMetadataManager metadataManager, MRExecutor mrExecutor, SampleIndexSchema schema) { this.tableNameGenerator = tableNameGenerator; this.mrExecutor = mrExecutor; this.metadataManager = metadataManager; - this.configuration = configuration; + this.schema = schema; } public void buildSampleIndex(String study, List samples, ObjectMap options) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java index 776b731bc7e..207d5652dd1 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java @@ -20,14 +20,14 @@ import org.opencb.opencga.storage.core.variant.query.*; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.storage.hadoop.variant.index.core.IndexFieldConfiguration; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.NoOpIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.family.GenotypeCodec; import org.opencb.opencga.storage.hadoop.variant.index.query.*; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleAnnotationIndexQuery.PopulationFrequencyQuery; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexConfiguration.PopulationFrequencyRange; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration.PopulationFrequencyRange; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,15 +45,11 @@ */ public class SampleIndexQueryParser { private static Logger logger = LoggerFactory.getLogger(SampleIndexQueryParser.class); - private final SampleIndexConfiguration configuration; + private final SampleIndexSchema schema; private final VariantStorageMetadataManager metadataManager; - public SampleIndexQueryParser(VariantStorageMetadataManager metadataManager) { - this(metadataManager, SampleIndexConfiguration.defaultConfiguration()); - } - - public SampleIndexQueryParser(VariantStorageMetadataManager metadataManager, SampleIndexConfiguration configuration) { - this.configuration = configuration; + public SampleIndexQueryParser(VariantStorageMetadataManager metadataManager, SampleIndexSchema schema) { + this.schema = schema; this.metadataManager = metadataManager; } @@ -426,7 +422,7 @@ public SampleIndexQuery parse(Query query) { } List> regionGroups = groupRegions(regions); - return new SampleIndexQuery(regionGroups, variantTypes, study, samplesMap, multiFileSamples, negatedSamples, + return new SampleIndexQuery(schema, regionGroups, variantTypes, study, samplesMap, multiFileSamples, negatedSamples, fatherFilterMap, motherFilterMap, fileIndexMap, annotationIndexQuery, mendelianErrorSet, onlyDeNovo, queryOperation); } @@ -606,7 +602,7 @@ protected SampleFileIndexQuery parseFileQuery(Query query, String sample, boolea Function> filesFromSample) { List files = null; - List filtersList = new ArrayList<>(configuration.getFileIndex().getFields().size()); + List filtersList = new ArrayList<>(schema.getFileIndex().getFields().size()); if (isValidParam(query, TYPE)) { List types = query.getAsStringList(VariantQueryParam.TYPE.key()) @@ -614,7 +610,7 @@ protected SampleFileIndexQuery parseFileQuery(Query query, String sample, boolea .map(t -> VariantType.valueOf(t.toUpperCase())) .collect(Collectors.toList()); if (!types.isEmpty()) { - IndexFieldFilter typeFilter = configuration.getFileIndex().getTypeIndex().buildFilter(QueryOperation.OR, types); + IndexFieldFilter typeFilter = schema.getFileIndex().getTypeIndex().buildFilter(QueryOperation.OR, types); filtersList.add(typeFilter); if (typeFilter.isExactFilter()) { query.remove(TYPE.key()); @@ -647,13 +643,13 @@ protected SampleFileIndexQuery parseFileQuery(Query query, String sample, boolea } } IndexFieldFilter filePositionFilter = - configuration.getFileIndex().getFilePositionIndex().buildFilter(QueryOperation.OR, sampleFilesFilter); + schema.getFileIndex().getFilePositionIndex().buildFilter(QueryOperation.OR, sampleFilesFilter); filtersList.add(filePositionFilter); } } if (isValidParam(query, FILTER)) { - IndexField filterIndexField = configuration.getFileIndex() + IndexField filterIndexField = schema.getFileIndex() .getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.FILTER); if (filterIndexField != null) { Values filterValues = splitValue(query, FILTER); @@ -666,7 +662,7 @@ protected SampleFileIndexQuery parseFileQuery(Query query, String sample, boolea } if (isValidParam(query, QUAL)) { - IndexField qualIndexField = configuration.getFileIndex() + IndexField qualIndexField = schema.getFileIndex() .getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL); if (qualIndexField != null) { OpValue opValue = parseOpValue(query.getString(QUAL.key())); @@ -699,7 +695,7 @@ protected SampleFileIndexQuery parseFileQuery(Query query, String sample, boolea continue; } for (KeyOpValue keyOpValue : keyValues.getValues()) { - IndexField fileDataIndexField = configuration.getFileIndex() + IndexField fileDataIndexField = schema.getFileIndex() .getCustomField(IndexFieldConfiguration.Source.FILE, keyOpValue.getKey()); if (fileDataIndexField == null) { // Unknown key @@ -728,7 +724,7 @@ protected SampleFileIndexQuery parseFileQuery(Query query, String sample, boolea if (!sampleDataFilter.isEmpty() && sampleDataOp != QueryOperation.OR) { for (KeyOpValue keyOpValue : sampleDataFilter) { - IndexField sampleDataIndexField = configuration.getFileIndex() + IndexField sampleDataIndexField = schema.getFileIndex() .getCustomField(IndexFieldConfiguration.Source.SAMPLE, keyOpValue.getKey()); if (sampleDataIndexField != null) { IndexFieldFilter indexFieldFilter = sampleDataIndexField.buildFilter(keyOpValue); @@ -999,7 +995,7 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool boolean populationInSampleIndex = false; boolean populationFilterFullyCovered = false; int popFreqIdx = 0; - for (PopulationFrequencyRange populationRange : configuration.getPopulationRanges()) { + for (PopulationFrequencyRange populationRange : schema.getConfiguration().getPopulationRanges()) { if (populationRange.getStudyAndPopulation().equals(studyPop)) { populationInSampleIndex = true; RangeQuery rangeQuery = getRangeQuery(keyOpValue.getOp(), freqFilter, populationRange.getThresholds(), diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java index f9dd1b3d1ff..d9295459ef7 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java @@ -9,10 +9,12 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAvro; import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.variant.adaptors.GenotypeClass; import org.opencb.opencga.storage.hadoop.utils.HBaseManager; import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageOptions; +import org.opencb.opencga.storage.hadoop.variant.index.annotation.PopulationFrequencyIndexSchema; import java.io.IOException; import java.io.UncheckedIOException; @@ -22,7 +24,7 @@ import static org.apache.hadoop.hbase.util.Bytes.SIZEOF_INT; /** - * Define RowKey and column names. + * Define RowKey, column names, and fields. Used to build the sample index. * * Created on 11/04/19. * @@ -92,10 +94,41 @@ public final class SampleIndexSchema { static final String ANNOTATION_CLINICAL_PREFIX = META_PREFIX + "CL_"; static final byte[] ANNOTATION_CLINICAL_PREFIX_BYTES = Bytes.toBytes(ANNOTATION_CLINICAL_PREFIX); + @Deprecated static final String PENDING_VARIANT_PREFIX = META_PREFIX + "V_"; + @Deprecated static final byte[] PENDING_VARIANT_PREFIX_BYTES = Bytes.toBytes(PENDING_VARIANT_PREFIX); - private SampleIndexSchema() { + private final SampleIndexConfiguration configuration; + private final FileIndexSchema fileIndex; + private final PopulationFrequencyIndexSchema popFreqIndex; + + public SampleIndexSchema(SampleIndexConfiguration configuration) { + this.configuration = configuration; + fileIndex = new FileIndexSchema(configuration.getFileIndexConfiguration()); + popFreqIndex = new PopulationFrequencyIndexSchema(configuration.getPopulationRanges()); + } + + /** + * Creates a default SampleIndexSchema. + * Test purposes only! + * @return Default schema + */ + public static SampleIndexSchema defaultSampleIndexSchema() { + SampleIndexConfiguration sampleIndexConfiguration = SampleIndexConfiguration.defaultConfiguration(); + return new SampleIndexSchema(sampleIndexConfiguration); + } + + public SampleIndexConfiguration getConfiguration() { + return configuration; + } + + public PopulationFrequencyIndexSchema getPopFreqIndex() { + return popFreqIndex; + } + + public FileIndexSchema getFileIndex() { + return fileIndex; } public static int getChunkStart(Integer start) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java index e3d104651d0..ab512927de4 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java @@ -10,6 +10,7 @@ import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; +import org.opencb.opencga.storage.hadoop.variant.index.family.MendelianErrorSampleIndexEntryIterator; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -30,6 +31,12 @@ public class SampleIndexVariantBiConverter { public static final int INT24_LENGTH = 3; public static final byte BYTE_SEPARATOR = 0; + private final SampleIndexSchema schema; + + public SampleIndexVariantBiConverter(SampleIndexSchema schema) { + this.schema = schema; + } + public int expectedSize(Variant variant, boolean interVariantSeparator) { return expectedSize(variant.getReference(), getAlternate(variant), interVariantSeparator); } @@ -139,32 +146,60 @@ public List toVariants(Cell cell) { public List toVariants(String chromosome, int batchStart, byte[] bytes, int offset, int length) { // Create dummy entry - SampleIndexEntry entry = new SampleIndexEntry(0, chromosome, batchStart, SampleIndexConfiguration.defaultConfiguration()); + SampleIndexEntry entry = new SampleIndexEntry(0, chromosome, batchStart); SampleIndexEntry.SampleIndexGtEntry gtEntry = entry.getGtEntry("0/1"); gtEntry.setVariants(bytes, offset, length); - SampleIndexEntryIterator it = gtEntry.iterator(); + SampleIndexEntryIterator it = toVariantsIterator(gtEntry); List variants = new ArrayList<>(it.getApproxSize()); it.forEachRemaining(variants::add); return variants; } + public SampleIndexEntryIterator toVariantsIterator(SampleIndexEntry entry, String gt, boolean onlyCount) { + if (onlyCount) { + return toVariantsCountIterator(entry, gt); + } else { + return toVariantsIterator(entry, gt); + } + } + + public SampleIndexEntryIterator toVariantsIterator(SampleIndexEntry.SampleIndexGtEntry entry, boolean onlyCount) { + if (onlyCount) { + return toVariantsCountIterator(entry); + } else { + return toVariantsIterator(entry); + } + } + public SampleIndexEntryIterator toVariantsIterator(SampleIndexEntry entry, String gt) { - SampleIndexEntry.SampleIndexGtEntry gtEntry = entry.getGts().get(gt); - SampleIndexConfiguration configuration = entry.getConfiguration(); + return toVariantsIterator(entry.getGts().get(gt)); + } + + public SampleIndexEntryIterator toVariantsIterator(SampleIndexEntry.SampleIndexGtEntry gtEntry) { if (gtEntry == null || gtEntry.getVariantsLength() <= 0) { return EmptySampleIndexEntryIterator.emptyIterator(); } else { - return new ByteSampleIndexGtEntryIterator(entry.getChromosome(), entry.getBatchStart(), gtEntry, configuration); + return new ByteSampleIndexGtEntryIterator( + gtEntry.getEntry().getChromosome(), + gtEntry.getEntry().getBatchStart(), gtEntry, schema); } } public SampleIndexEntryIterator toVariantsCountIterator(SampleIndexEntry entry, String gt) { - return new CountSampleIndexGtEntryIterator(entry.getGtEntry(gt), entry.getConfiguration()); + return toVariantsCountIterator(entry.getGtEntry(gt)); + } + + public SampleIndexEntryIterator toVariantsCountIterator(SampleIndexEntry.SampleIndexGtEntry gtEntry) { + return new CountSampleIndexGtEntryIterator(gtEntry, schema); + } + + public MendelianErrorSampleIndexEntryIterator toMendelianIterator(SampleIndexEntry sampleIndexEntry) { + return new MendelianErrorSampleIndexEntryIterator(sampleIndexEntry, schema); } private abstract static class SampleIndexGtEntryIterator implements SampleIndexEntryIterator { protected SampleIndexEntry.SampleIndexGtEntry gtEntry; - private final SampleIndexConfiguration configuration; + private final SampleIndexSchema schema; private BitInputStream popFreq; private BitInputStream ctBtIndex; private int nonIntergenicCount; @@ -178,7 +213,7 @@ private abstract static class SampleIndexGtEntryIterator implements SampleIndexE private int annotationIndexEntryIdx; private int fileDataIndexesBitsLength; - SampleIndexGtEntryIterator(SampleIndexConfiguration configuration) { + SampleIndexGtEntryIterator(SampleIndexSchema schema) { nonIntergenicCount = 0; clinicalCount = 0; annotationIndexEntry = new AnnotationIndexEntry(); @@ -186,12 +221,12 @@ private abstract static class SampleIndexGtEntryIterator implements SampleIndexE annotationIndexEntryIdx = -1; fileIndexIdx = 0; fileIndexCount = 0; - this.configuration = configuration; - fileDataIndexesBitsLength = configuration.getFileIndex().getBitsLength(); + this.schema = schema; + fileDataIndexesBitsLength = schema.getFileIndex().getBitsLength(); } - SampleIndexGtEntryIterator(SampleIndexEntry.SampleIndexGtEntry gtEntry, SampleIndexConfiguration configuration) { - this(configuration); + SampleIndexGtEntryIterator(SampleIndexEntry.SampleIndexGtEntry gtEntry, SampleIndexSchema schema) { + this(schema); this.gtEntry = gtEntry; this.ctBtIndex = gtEntry.getCtBtIndex() == null ? null @@ -225,7 +260,7 @@ public boolean isMultiFileIndex() { public boolean isMultiFileIndex(int i) { // configuration.getFileIndex().getMultiFileIndex().readAndDecode() - return configuration.getFileIndex().isMultiFile(fileIndex, i * fileDataIndexesBitsLength); + return schema.getFileIndex().isMultiFile(fileIndex, i * fileDataIndexesBitsLength); } private int nextFileIndex() { @@ -312,7 +347,8 @@ public AnnotationIndexEntry nextAnnotationIndexEntry() { byte[] popFreqIndex; if (popFreq != null) { - popFreqIndex = popFreq.readBytes(configuration.getPopulationRanges().size(), AnnotationIndexConverter.POP_FREQ_SIZE); + popFreqIndex = popFreq.readBytes(schema.getConfiguration().getPopulationRanges().size(), + AnnotationIndexConverter.POP_FREQ_SIZE); } else { popFreqIndex = null; } @@ -462,7 +498,7 @@ private static final class CountSampleIndexGtEntryIterator extends SampleIndexGt private int i; private static final Variant DUMMY_VARIANT = new Variant("1:10:A:T"); - CountSampleIndexGtEntryIterator(SampleIndexEntry.SampleIndexGtEntry gtEntry, SampleIndexConfiguration configuration) { + CountSampleIndexGtEntryIterator(SampleIndexEntry.SampleIndexGtEntry gtEntry, SampleIndexSchema configuration) { super(gtEntry, configuration); count = gtEntry.getCount(); i = 0; @@ -514,8 +550,8 @@ private class ByteSampleIndexGtEntryIterator extends SampleIndexGtEntryIterator private int alternateLength; ByteSampleIndexGtEntryIterator(String chromosome, int batchStart, SampleIndexEntry.SampleIndexGtEntry gtEntry, - SampleIndexConfiguration configuration) { - super(gtEntry, configuration); + SampleIndexSchema schema) { + super(gtEntry, schema); this.chromosome = chromosome; this.batchStart = batchStart; this.bytes = gtEntry.getVariants(); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java index 2f59c73c9b9..21c5b7d5a86 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java @@ -6,19 +6,18 @@ import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; +import java.util.Comparator; import java.util.Objects; import static org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema.INTRA_CHROMOSOME_VARIANT_COMPARATOR; -public class SampleVariantIndexEntry implements Comparable { +public class SampleVariantIndexEntry { private final Variant variant; private final String genotype; private final BitBuffer fileIndex; private final AnnotationIndexEntry annotationIndexEntry; private final Integer meCode; - private final SampleIndexConfiguration configuration = SampleIndexConfiguration.defaultConfiguration(); - public SampleVariantIndexEntry(Variant variant, BitBuffer fileIndex) { this(variant, fileIndex, null, null); @@ -73,21 +72,6 @@ public AnnotationIndexEntry getAnnotationIndexEntry() { return annotationIndexEntry; } - @Override - public int compareTo(SampleVariantIndexEntry o) { - int compare = INTRA_CHROMOSOME_VARIANT_COMPARATOR.compare(variant, o.variant); - if (compare == 0) { - if (configuration.getFileIndex().isMultiFile(fileIndex)) { - return -1; - } else if (configuration.getFileIndex().isMultiFile(o.fileIndex)) { - return 1; - } else { - return fileIndex.compareTo(o.fileIndex); - } - } - return compare; - } - @Override public boolean equals(Object o) { if (this == o) { @@ -104,4 +88,28 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(variant, fileIndex); } + + public static class SampleVariantIndexEntryComparator implements Comparator { + + private final SampleIndexSchema schema; + + public SampleVariantIndexEntryComparator(SampleIndexSchema schema) { + this.schema = schema; + } + + @Override + public int compare(SampleVariantIndexEntry o1, SampleVariantIndexEntry o2) { + int compare = INTRA_CHROMOSOME_VARIANT_COMPARATOR.compare(o1.variant, o2.variant); + if (compare == 0) { + if (schema.getFileIndex().isMultiFile(o1.fileIndex)) { + return -1; + } else if (schema.getFileIndex().isMultiFile(o2.fileIndex)) { + return 1; + } else { + return o1.fileIndex.compareTo(o2.fileIndex); + } + } + return compare; + } + } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SingleSampleIndexVariantDBIterator.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SingleSampleIndexVariantDBIterator.java index e150652d7ec..7f81ac522aa 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SingleSampleIndexVariantDBIterator.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SingleSampleIndexVariantDBIterator.java @@ -37,11 +37,12 @@ public SingleSampleIndexVariantDBIterator(Table table, SingleSampleIndexQuery qu regionGroups = query.getRegionGroups(); } + SampleIndexSchema schema = dbAdaptor.getSchema(query.getStudy()); Iterator> iterators = regionGroups.stream() .map(regions -> { // One scan per region group Scan scan = dbAdaptor.parse(query, regions); - HBaseToSampleIndexConverter converter = new HBaseToSampleIndexConverter(dbAdaptor.getConfiguration()); + HBaseToSampleIndexConverter converter = new HBaseToSampleIndexConverter(schema); SampleIndexEntryFilter filter = dbAdaptor.buildSampleIndexEntryFilter(query, regions); try { ResultScanner scanner = table.getScanner(scan); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java index 66a2357bd87..71452168aee 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java @@ -8,16 +8,16 @@ import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.storage.hadoop.variant.index.core.IndexFieldConfiguration; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; import java.util.List; import java.util.Map; public class VariantFileIndexConverter { - private final FileIndex fileIndex; + private final FileIndexSchema fileIndex; - public VariantFileIndexConverter(SampleIndexConfiguration configuration) { + public VariantFileIndexConverter(SampleIndexSchema configuration) { fileIndex = configuration.getFileIndex(); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/io/VariantExporterDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/io/VariantExporterDriver.java index 8e3107cebb3..b8ab42bfd22 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/io/VariantExporterDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/io/VariantExporterDriver.java @@ -28,6 +28,7 @@ import org.opencb.opencga.storage.hadoop.variant.AbstractVariantsTableDriver; import org.opencb.opencga.storage.hadoop.variant.adaptors.VariantHBaseQueryParser; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantSqlQueryParser; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexDBAdaptor; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexQueryParser; import org.opencb.opencga.storage.hadoop.variant.mr.VariantFileOutputFormat; import org.opencb.opencga.storage.hadoop.variant.mr.VariantMapReduceUtil; @@ -183,7 +184,7 @@ protected Job setupJob(Job job, String archiveTable, String variantTable) throws boolean useSampleIndex = !getConf().getBoolean("skipSampleIndex", false) && SampleIndexQueryParser.validSampleIndexQuery(query); if (useSampleIndex) { // Remove extra fields from the query - new SampleIndexQueryParser(getMetadataManager()).parse(query); + new SampleIndexDBAdaptor(getHBaseManager(), getTableNameGenerator(), getMetadataManager()).parseSampleIndexQuery(query); logger.info("Use sample index to read from HBase"); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/SampleIndexTableRecordReader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/SampleIndexTableRecordReader.java index 480e36eb666..c2dfef92aea 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/SampleIndexTableRecordReader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/SampleIndexTableRecordReader.java @@ -69,7 +69,7 @@ public SampleIndexTableRecordReader(Configuration conf) { sampleIndexDBAdaptor = new SampleIndexDBAdaptor(hBaseManager, tableNameGenerator, metadataManager); Query query = VariantMapReduceUtil.getQueryFromConfig(conf); - sampleIndexQuery = sampleIndexDBAdaptor.getSampleIndexQueryParser().parse(query); + sampleIndexQuery = sampleIndexDBAdaptor.parseSampleIndexQuery(query); StudyMetadata studyMetadata = metadataManager.getStudyMetadata(sampleIndexQuery.getStudy()); allChromosomes = new TreeSet<>(VariantPhoenixKeyFactory.HBASE_KEY_CHROMOSOME_COMPARATOR); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtil.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtil.java index 707c7d50227..8fc14f73bdc 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtil.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtil.java @@ -1,6 +1,8 @@ package org.opencb.opencga.storage.hadoop.variant.mr; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.Mutation; @@ -21,7 +23,9 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; +import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.storage.core.config.ConfigurationOption; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.query.VariantQueryParser; @@ -34,11 +38,14 @@ import org.opencb.opencga.storage.hadoop.variant.adaptors.VariantHadoopDBAdaptor; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantSqlQueryParser; import org.opencb.opencga.storage.hadoop.variant.converters.HBaseVariantConverterConfiguration; +import org.opencb.opencga.storage.hadoop.variant.index.query.SampleIndexQuery; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexDBAdaptor; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexQueryParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.io.UncheckedIOException; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -157,7 +164,8 @@ public static void initVariantMapperJob(Job job, Class Object regions = query.get(VariantQueryParam.REGION.key()); Object geneRegions = query.get(VariantQueryUtils.ANNOT_GENE_REGIONS.key()); // Remove extra fields from the query - new SampleIndexQueryParser(metadataManager).parse(query); + SampleIndexQuery sampleIndexQuery = new SampleIndexDBAdaptor(null, null, metadataManager).parseSampleIndexQuery(query); + setSampleIndexConfiguration(job, sampleIndexQuery.getSchema().getConfiguration()); // Preserve regions and gene_regions query.put(VariantQueryParam.REGION.key(), regions); @@ -267,7 +275,8 @@ public static void initVariantRowMapperJob(Job job, Class { table.getScanner(new Scan()).iterator().forEachRemaining(result -> { @@ -468,7 +470,7 @@ public static boolean printSampleIndexTable(VariantHadoopDBAdaptor dbAdaptor, Pa } else if (s.startsWith(Bytes.toString(SampleIndexSchema.toMendelianErrorColumn()))) { map.put(s, MendelianErrorSampleIndexConverter.toVariants(value, 0, value.length).toString()); } else { - map.put(s, new SampleIndexVariantBiConverter().toVariants(chromosome, batchStart, value, 0, value.length).toString()); + map.put(s, new SampleIndexVariantBiConverter(schema).toVariants(chromosome, batchStart, value, 0, value.length).toString()); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java index cba97e10ee3..10e6f63df35 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java @@ -6,7 +6,8 @@ import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import org.opencb.biodata.models.variant.avro.VariantAnnotation; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexConfiguration; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.util.Arrays; import java.util.Collections; @@ -39,7 +40,7 @@ public void setUp() throws Exception { SampleIndexConfiguration configuration = new SampleIndexConfiguration(); populations.stream().map(SampleIndexConfiguration.PopulationFrequencyRange::new).forEach(configuration::addPopulationRange); - converter = new AnnotationIndexConverter(configuration); + converter = new AnnotationIndexConverter(new SampleIndexSchema(configuration)); } // @After @@ -167,7 +168,7 @@ public void testDuplicatedPopulations() { List populations = Arrays.asList("1kG_phase3:ALL", "GNOMAD_GENOMES:ALL", "1kG_phase3:ALL"); SampleIndexConfiguration configuration = new SampleIndexConfiguration(); populations.stream().map(SampleIndexConfiguration.PopulationFrequencyRange::new).forEach(configuration::addPopulationRange); - new AnnotationIndexConverter(configuration); + new AnnotationIndexConverter(new SampleIndexSchema(configuration)); } @Test diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexTest.java index 9222bc53081..b04a6d803ba 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexTest.java @@ -23,6 +23,7 @@ import org.opencb.opencga.storage.hadoop.variant.index.query.SampleIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.sample.AbstractSampleIndexEntryFilter; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexQueryParser; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.net.URI; import java.util.*; @@ -75,7 +76,7 @@ public void before() throws Exception { VariantHbaseTestUtils.printVariants(getVariantStorageEngine().getDBAdaptor(), newOutputUri(getTestName().getMethodName())); loaded = true; } - sampleIndexQueryParser = ((HadoopVariantStorageEngine) variantStorageEngine).getSampleIndexDBAdaptor().getSampleIndexQueryParser(); + sampleIndexQueryParser = new SampleIndexQueryParser(metadataManager, SampleIndexSchema.defaultSampleIndexSchema()); } @Test diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexConverterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexConverterTest.java index 3696c522545..df88cbf9ce3 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexConverterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexConverterTest.java @@ -3,8 +3,8 @@ import org.junit.Test; import org.opencb.biodata.models.variant.Variant; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexEntry; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.io.IOException; import java.util.ArrayList; @@ -16,6 +16,7 @@ public class MendelianErrorSampleIndexConverterTest { final int numVariants = 500; + private final SampleIndexSchema schema = SampleIndexSchema.defaultSampleIndexSchema(); @Test public void testIterator() throws IOException { @@ -39,7 +40,7 @@ public void testIterator() throws IOException { } checkIterator(variants01, variants11, () -> { - SampleIndexEntry entry = new SampleIndexEntry(0, "1", batchStart, SampleIndexConfiguration.defaultConfiguration()); + SampleIndexEntry entry = new SampleIndexEntry(0, "1", batchStart); entry.setMendelianVariants(builder.getMendelianErrors()); return entry; }); @@ -62,7 +63,8 @@ private void checkIterator(List variants01, List variants11, S entry.getGtEntry("1/1").setAnnotationIndex(annot); } - MendelianErrorSampleIndexEntryIterator iterator = entry.mendelianIterator(); + MendelianErrorSampleIndexEntryIterator iterator = + new MendelianErrorSampleIndexEntryIterator(entry, schema); int c = 0; while (iterator.hasNext()) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptorTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptorTest.java index 4a55b595ada..a9946f81d18 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptorTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptorTest.java @@ -37,7 +37,7 @@ public void testSampleIdFF() throws Exception { String sampleName = "FF"; metadataManager.unsecureUpdateSampleMetadata(studyId, new SampleMetadata(studyId, sampleId, sampleName)); - SampleIndexQuery query = new SampleIndexQuery(Collections.emptyList(), "ST", + SampleIndexQuery query = new SampleIndexQuery(SampleIndexSchema.defaultSampleIndexSchema(), Collections.emptyList(), "ST", Collections.singletonMap(sampleName, Collections.singletonList("0/1")), VariantQueryUtils.QueryOperation.AND); new SampleIndexDBAdaptor(new HBaseManager(new Configuration()), null, metadataManager).parse(query.forSample(sampleName), null); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java index 7e1b03df56d..7d273a75dee 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java @@ -8,6 +8,7 @@ import org.junit.Test; import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.Query; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.query.Values; @@ -21,7 +22,7 @@ import org.opencb.opencga.storage.hadoop.variant.index.query.SampleFileIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SingleSampleIndexQuery; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexConfiguration.PopulationFrequencyRange; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration.PopulationFrequencyRange; import java.util.Arrays; import java.util.Collections; @@ -34,16 +35,16 @@ public class SampleIndexEntryFilterTest { - private SampleIndexConfiguration configuration; + private SampleIndexSchema schema; @Before public void setUp() throws Exception { - configuration = new SampleIndexConfiguration() + schema = new SampleIndexSchema(new SampleIndexConfiguration() .addPopulationRange(new PopulationFrequencyRange("s1", "ALL")) .addPopulationRange(new PopulationFrequencyRange("s2", "ALL")) .addPopulationRange(new PopulationFrequencyRange("s3", "ALL")) .addPopulationRange(new PopulationFrequencyRange("s4", "ALL")) - .addPopulationRange(new PopulationFrequencyRange("s5", "ALL")); + .addPopulationRange(new PopulationFrequencyRange("s5", "ALL"))); } @Test @@ -147,7 +148,7 @@ private SampleIndexEntry getSampleIndexEntry1() { .stream() .collect(Collectors.toMap(cell -> Bytes.toString(CellUtil.cloneQualifier(cell)), CellUtil::cloneValue)).get("_PF_0/1"); - SampleIndexEntry entry = new SampleIndexEntry(0, "1", 0, configuration); + SampleIndexEntry entry = new SampleIndexEntry(0, "1", 0); entry.getGtEntry("0/1") .setPopulationFrequencyIndex(pf) .setCount(5) @@ -162,7 +163,7 @@ private SampleIndexEntry getSampleIndexEntry1() { } private SampleIndexEntry getSampleIndexEntry2() { - AnnotationIndexConverter converter = new AnnotationIndexConverter(SampleIndexConfiguration.defaultConfiguration()); + AnnotationIndexConverter converter = new AnnotationIndexConverter(SampleIndexSchema.defaultSampleIndexSchema()); Map map = new AnnotationIndexPutBuilder() .add(converter.convert(annot( @@ -184,7 +185,7 @@ private SampleIndexEntry getSampleIndexEntry2() { .collect(Collectors.toMap(cell -> Bytes.toString(CellUtil.cloneQualifier(cell)), CellUtil::cloneValue)); - SampleIndexEntry entry = new SampleIndexEntry(0, "1", 0, configuration); + SampleIndexEntry entry = new SampleIndexEntry(0, "1", 0); entry.getGtEntry("0/1") .setAnnotationIndex(map.get("_A_0/1")) .setCtBtIndex(map.get("_CB_0/1")) @@ -202,7 +203,7 @@ private SampleIndexEntry getSampleIndexEntry2() { } private byte[] toBytes(String... variants) { - return new SampleIndexVariantBiConverter().toBytes(Arrays.stream(variants).map(Variant::new).collect(Collectors.toList())); + return new SampleIndexVariantBiConverter(schema).toBytes(Arrays.stream(variants).map(Variant::new).collect(Collectors.toList())); } private PopulationFrequencyQuery buildPopulationFrequencyQuery(String study, int minFreqInclusive, int maxFreqExclusive) { @@ -213,7 +214,8 @@ private PopulationFrequencyQuery buildPopulationFrequencyQuery(String study, int } private SingleSampleIndexQuery getSingleSampleIndexQuery(Query query) { - SampleIndexQueryParser parser = new SampleIndexQueryParser(new VariantStorageMetadataManager(new DummyVariantStorageMetadataDBAdaptorFactory())); + VariantStorageMetadataManager metadataManager = new VariantStorageMetadataManager(new DummyVariantStorageMetadataDBAdaptorFactory()); + SampleIndexQueryParser parser = new SampleIndexQueryParser(metadataManager, SampleIndexSchema.defaultSampleIndexSchema()); SampleAnnotationIndexQuery annotQuery = parser.parseAnnotationIndexQuery(query); return getSingleSampleIndexQuery(annotQuery); @@ -239,7 +241,7 @@ private SingleSampleIndexQuery getSingleSampleIndexQuery(SampleAnnotationIndexQu private SingleSampleIndexQuery getSingleSampleIndexQuery(SampleAnnotationIndexQuery annotationIndexQuery, Map> fileFilterMap) { return new SampleIndexQuery( - Collections.emptyList(), null, "study", Collections.singletonMap("S1", Arrays.asList("0/1", "1/1")), Collections.emptySet(), null, Collections.emptyMap(), Collections.emptyMap(), fileFilterMap, annotationIndexQuery, Collections.emptySet(), false, VariantQueryUtils.QueryOperation.AND) + schema, Collections.emptyList(), null, "study", Collections.singletonMap("S1", Arrays.asList("0/1", "1/1")), Collections.emptySet(), null, Collections.emptyMap(), Collections.emptyMap(), fileFilterMap, annotationIndexQuery, Collections.emptySet(), false, VariantQueryUtils.QueryOperation.AND) .forSample("S1"); } } \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java index cb7b4da2043..df2f35f9eb7 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java @@ -16,7 +16,7 @@ public class SampleIndexEntryPutBuilderTest { @Test public void testContains() { - SampleIndexEntryPutBuilder builder = new SampleIndexEntryPutBuilder(1, "1", 10, SampleIndexConfiguration.defaultConfiguration()); + SampleIndexEntryPutBuilder builder = new SampleIndexEntryPutBuilder(1, "1", 10, SampleIndexSchema.defaultSampleIndexSchema()); builder.add("0/1", newVariantIndexEntry("1:100:A:C", (short) 20)); builder.add("0/1", newVariantIndexEntry("1:200:A:C", (short) 20)); @@ -41,10 +41,10 @@ protected SampleVariantIndexEntry newVariantIndexEntry(String s, short i) { @Test public void testBuild() { - SampleIndexConfiguration configuration = SampleIndexConfiguration.defaultConfiguration(); - VariantFileIndexConverter c = new VariantFileIndexConverter(configuration); + SampleIndexSchema schema = SampleIndexSchema.defaultSampleIndexSchema(); + VariantFileIndexConverter c = new VariantFileIndexConverter(schema); - Put build = new SampleIndexEntryPutBuilder(1, "1", 10, configuration) + Put build = new SampleIndexEntryPutBuilder(1, "1", 10, schema) .add("0/1", new SampleVariantIndexEntry(new Variant("1:100:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) .add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 1, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) .add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java index 91b89cc17a5..7ab3f8c3afd 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java @@ -11,6 +11,7 @@ import org.opencb.biodata.models.variant.metadata.VariantFileHeaderComplexLine; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.TaskMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; @@ -21,7 +22,7 @@ import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.storage.hadoop.variant.index.core.IndexFieldConfiguration; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; @@ -55,17 +56,17 @@ public class SampleIndexQueryParserTest { private SampleIndexQueryParser sampleIndexQueryParser; private VariantStorageMetadataManager mm; private int studyId; - private FileIndex fileIndex; + private FileIndexSchema fileIndex; private double[] qualThresholds; private double[] dpThresholds; @Before public void setUp() throws Exception { - SampleIndexConfiguration configuration = SampleIndexConfiguration.defaultConfiguration() + SampleIndexSchema configuration = new SampleIndexSchema(SampleIndexConfiguration.defaultConfiguration() .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s1", "ALL")) .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s2", "ALL")) .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s3", "ALL")) - .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s4", "ALL")); + .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s4", "ALL"))); fileIndex = configuration.getFileIndex(); qualThresholds = fileIndex.getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL).getConfiguration().getThresholds(); dpThresholds = fileIndex.getCustomField(IndexFieldConfiguration.Source.SAMPLE, VCFConstants.DEPTH_KEY).getConfiguration().getThresholds(); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java index c517bb3302a..8ab8338183d 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java @@ -136,6 +136,7 @@ public void load() throws Exception { public void checkLoadedData() throws Exception { HadoopVariantStorageEngine variantStorageEngine = getVariantStorageEngine(); int studyId = variantStorageEngine.getMetadataManager().getStudyId(STUDY_NAME); + SampleIndexVariantBiConverter converter = new SampleIndexVariantBiConverter(SampleIndexSchema.defaultSampleIndexSchema()); Iterator it = variantStorageEngine.getMetadataManager().sampleMetadataIterator(studyId); while (it.hasNext()) { SampleMetadata sample = it.next(); @@ -162,7 +163,7 @@ public void checkLoadedData() throws Exception { if (entry.getValue().getVariants() == null) { actualVariants = Collections.emptyList(); } else { - actualVariants = Lists.newArrayList(entry.getValue().iterator()) + actualVariants = Lists.newArrayList(converter.toVariantsIterator(entry.getValue())) .stream() .map(Variant::toString) .collect(toList()); @@ -212,7 +213,7 @@ public void regenerateSampleIndex() throws Exception { Connection c = dbAdaptor.getHBaseManager().getConnection(); - VariantHbaseTestUtils.printSampleIndexTable(dbAdaptor, Paths.get(newOutputUri()), copy); + VariantHbaseTestUtils.printSampleIndexTable(dbAdaptor, Paths.get(newOutputUri()), studyId, copy); ResultScanner origScanner = c.getTable(TableName.valueOf(orig)).getScanner(new Scan()); ResultScanner copyScanner = c.getTable(TableName.valueOf(copy)).getScanner(new Scan()); @@ -396,7 +397,7 @@ public SampleIndexQuery testQueryIndex(Query testQuery, Query query) throws Exce System.out.println("#Query SampleIndex"); SampleIndexDBAdaptor sampleIndexDBAdaptor = ((HadoopVariantStorageEngine) variantStorageEngine).getSampleIndexDBAdaptor(); Query sampleIndexVariantQuery = variantStorageEngine.preProcessQuery(query, new QueryOptions()); - SampleIndexQuery indexQuery = sampleIndexDBAdaptor.getSampleIndexQueryParser().parse(sampleIndexVariantQuery); + SampleIndexQuery indexQuery = sampleIndexDBAdaptor.parseSampleIndexQuery(sampleIndexVariantQuery); // int onlyIndex = (int) ((HadoopVariantStorageEngine) variantStorageEngine).getSampleIndexDBAdaptor() // .count(indexQuery, "NA19600"); DataResult result = ((HadoopVariantStorageEngine) variantStorageEngine).getSampleIndexDBAdaptor() @@ -524,14 +525,14 @@ public void testCount() throws StorageEngineException { .append(VariantQueryParam.STUDY.key(), study) .append(GENOTYPE.key(), sampleName + ":1|0,0|1,1|1"); SampleIndexDBAdaptor sampleIndexDBAdaptor = ((HadoopVariantStorageEngine) variantStorageEngine).getSampleIndexDBAdaptor(); - long actualCount = sampleIndexDBAdaptor.count(sampleIndexDBAdaptor.getSampleIndexQueryParser().parse(new Query(query))); + long actualCount = sampleIndexDBAdaptor.count(sampleIndexDBAdaptor.parseSampleIndexQuery(new Query(query))); System.out.println("---"); System.out.println("Count indexTable " + stopWatch.getTime(TimeUnit.MILLISECONDS) / 1000.0); System.out.println("Count = " + actualCount); stopWatch = StopWatch.createStarted(); - long actualCountIterator = sampleIndexDBAdaptor.iterator(sampleIndexDBAdaptor.getSampleIndexQueryParser().parse(new Query(query))).toDataResult().getNumResults(); + long actualCountIterator = sampleIndexDBAdaptor.iterator(sampleIndexDBAdaptor.parseSampleIndexQuery(new Query(query))).toDataResult().getNumResults(); System.out.println("---"); System.out.println("Count indexTable iterator " + stopWatch.getTime(TimeUnit.MILLISECONDS) / 1000.0); System.out.println("Count = " + actualCountIterator); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverterTest.java index e4b77e28444..78f849a01bc 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverterTest.java @@ -28,7 +28,7 @@ public class SampleIndexVariantBiConverterTest { @Before public void setUp() throws Exception { - converter = new SampleIndexVariantBiConverter(); + converter = new SampleIndexVariantBiConverter(SampleIndexSchema.defaultSampleIndexSchema()); } @Test @@ -151,7 +151,7 @@ public void testVariantsStream() throws IOException { dummyVariants.add(new Variant("1:10:A:T")); } checkIterator(numVariants, dummyVariants, () -> { - SampleIndexEntry entry = new SampleIndexEntry(0, "1", batchStart, SampleIndexConfiguration.defaultConfiguration()); + SampleIndexEntry entry = new SampleIndexEntry(0, "1", batchStart); SampleIndexEntry.SampleIndexGtEntry gtEntry = entry.getGtEntry("0/1"); return gtEntry.setCount(variants.size()); }, true); @@ -159,7 +159,7 @@ public void testVariantsStream() throws IOException { } private SampleIndexEntry.SampleIndexGtEntry toSampleIndexEntry(int batchStart, byte[] bytes, int offset, int length) { - SampleIndexEntry entry = new SampleIndexEntry(0, "1", batchStart, SampleIndexConfiguration.defaultConfiguration()); + SampleIndexEntry entry = new SampleIndexEntry(0, "1", batchStart); SampleIndexEntry.SampleIndexGtEntry gtEntry = entry.getGtEntry("0/1"); gtEntry.setVariants(bytes, offset, length); return gtEntry; @@ -184,7 +184,7 @@ private void checkIterator(int numVariants, List variants, SampleIndexE } entry.setAnnotationIndex(annot); } - SampleIndexEntryIterator iterator = entry.iterator(onlyCount); + SampleIndexEntryIterator iterator = converter.toVariantsIterator(entry, onlyCount); int i = 0; int nonIntergenicIndex = 0; while (iterator.hasNext()) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntryTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntryTest.java index 16733acd1b7..015f4bb1500 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntryTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntryTest.java @@ -14,11 +14,11 @@ public class SampleVariantIndexEntryTest { - private FileIndex fileIndex; + private FileIndexSchema fileIndex; @Before public void setUp() throws Exception { - fileIndex = SampleIndexConfiguration.defaultConfiguration().getFileIndex(); + fileIndex = SampleIndexSchema.defaultSampleIndexSchema().getFileIndex(); } @Test @@ -36,7 +36,7 @@ public void testComparator() { ArrayList actual = new ArrayList<>(expected); Collections.shuffle(actual); - actual.sort(SampleVariantIndexEntry::compareTo); + actual.sort(new SampleVariantIndexEntry.SampleVariantIndexEntryComparator(SampleIndexSchema.defaultSampleIndexSchema())); Assert.assertEquals(expected, actual); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java index 26aa09f660a..10cb80263ae 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java @@ -7,7 +7,7 @@ import org.opencb.biodata.models.variant.VariantBuilder; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.opencga.storage.core.io.bit.BitBuffer; -import org.opencb.opencga.storage.hadoop.variant.index.core.IndexFieldConfiguration; +import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; import java.util.Arrays; @@ -16,12 +16,12 @@ public class VariantFileIndexEntryConverterTest { private VariantFileIndexConverter fileIndexConverter; - private FileIndex fileIndex; + private FileIndexSchema fileIndex; @Before public void setUp() throws Exception { - fileIndexConverter = new VariantFileIndexConverter(SampleIndexConfiguration.defaultConfiguration()); - fileIndex = SampleIndexConfiguration.defaultConfiguration().getFileIndex(); + fileIndexConverter = new VariantFileIndexConverter(SampleIndexSchema.defaultSampleIndexSchema()); + fileIndex = (SampleIndexSchema.defaultSampleIndexSchema()).getFileIndex(); } @Test diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtilTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtilTest.java new file mode 100644 index 00000000000..9bbd6baa6ed --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtilTest.java @@ -0,0 +1,24 @@ +package org.opencb.opencga.storage.hadoop.variant.mr; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.mapreduce.Job; +import org.junit.Test; +import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; + +import java.io.IOException; + +import static org.junit.Assert.*; + +public class VariantMapReduceUtilTest { + + @Test + public void testSerializeConfiguration() throws IOException { + Job job = Job.getInstance(); + SampleIndexConfiguration configuration = SampleIndexConfiguration.defaultConfiguration(); + VariantMapReduceUtil.setSampleIndexConfiguration(job, configuration); + SampleIndexConfiguration actualConfiguration = VariantMapReduceUtil.getSampleIndexConfiguration(job.getConfiguration()); +// System.out.println("configuration = " + configuration); + assertEquals(configuration, actualConfiguration); + } + +} \ No newline at end of file From c8fcead0116b58aa370e18222dbdeb15ef84ca7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 11 Mar 2021 17:20:16 +0000 Subject: [PATCH 080/412] storage: Remove FillGaps SampleIndexConsolidation step. #1699 This step has been broken and unneeded for a long time --- .../variant/HadoopVariantStorageEngine.java | 4 - .../gaps/AbstractFillFromArchiveTask.java | 24 +- .../gaps/FillGapsFromArchiveMapper.java | 7 - .../variant/gaps/FillGapsFromVariantTask.java | 3 +- .../hadoop/variant/gaps/FillGapsTask.java | 45 +--- .../gaps/FillMissingFromArchiveMapper.java | 5 - .../sample/HBaseToSampleIndexConverter.java | 17 -- .../sample/SampleIndexConsolidationDrive.java | 211 ------------------ .../index/sample/SampleIndexSchema.java | 9 - .../variant/VariantHadoopMultiSampleTest.java | 9 +- .../hadoop/variant/gaps/FillGapsTaskTest.java | 4 +- .../hadoop/variant/gaps/FillGapsTest.java | 45 ++-- 12 files changed, 42 insertions(+), 341 deletions(-) delete mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConsolidationDrive.java diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java index bcbcaec2843..076388120f4 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java @@ -565,10 +565,6 @@ private void fillGapsOrMissing(String study, StudyMetadata studyMetadata, Set variantPuts; - private List samplesIndexPuts; - private FillResult(List variantPuts, List samplesIndexPuts) { + private FillResult(List variantPuts) { this.variantPuts = variantPuts; - this.samplesIndexPuts = samplesIndexPuts; } /** @@ -80,18 +77,6 @@ private FillResult(List variantPuts, List samplesIndexPuts) { public List getVariantPuts() { return variantPuts; } - - /** - * Get the list of PUT mutations over the SampleIndex table. - * This mutations will contain values of pending variants that should be added to the table. - * - * @see SampleIndexConsolidationDrive - * - * @return List of PUT mutations - */ - public List getSamplesIndexPuts() { - return samplesIndexPuts; - } } protected AbstractFillFromArchiveTask(StudyMetadata studyMetadata, @@ -181,7 +166,6 @@ public FillResult fillGaps(Context context) throws IOException { // Store all PUT operations, one for each variant Map putsMap = new TreeMap<>(VARIANT_COMPARATOR); - List sampleIndexPuts = new ArrayList<>(); for (Map.Entry> entry : fileToVariantsMap.entrySet()) { Integer fileId = entry.getKey(); List variants = entry.getValue(); @@ -205,7 +189,7 @@ public FillResult fillGaps(Context context) throws IOException { Put put = putsMap.computeIfAbsent(variant, this::createPut); StopWatch stopWatch = new StopWatch().start(); - VariantOverlappingStatus overlappingStatus = fillGapsTask.fillGaps(variant, sampleIds, put, sampleIndexPuts, fileId, + VariantOverlappingStatus overlappingStatus = fillGapsTask.fillGaps(variant, sampleIds, put, fileId, nonRefVcfSlice, nonRefIterator, refVcfSlice, refIterator); increment("OVERLAPPING_STATUS_" + String.valueOf(overlappingStatus), context.fileBatch, 1); increment("OVERLAPPING_STATUS_" + String.valueOf(overlappingStatus), context.fileBatch, stopWatch); @@ -226,7 +210,7 @@ public FillResult fillGaps(Context context) throws IOException { } else { increment("PUTS", context.fileBatch, variantPuts.size()); } - return new FillResult(variantPuts, sampleIndexPuts); + return new FillResult(variantPuts); } protected Put createPut(Variant v) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsFromArchiveMapper.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsFromArchiveMapper.java index 9aadbd048b6..8d5e9ec60e5 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsFromArchiveMapper.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsFromArchiveMapper.java @@ -4,7 +4,6 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; -import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.mapreduce.Job; import org.opencb.opencga.storage.hadoop.variant.archive.ArchiveDriver; import org.opencb.opencga.storage.hadoop.variant.mr.AbstractArchiveTableMapper; @@ -29,7 +28,6 @@ public class FillGapsFromArchiveMapper extends AbstractArchiveTableMapper { private AbstractFillFromArchiveTask task; private ImmutableBytesWritable variantsTable; - private ImmutableBytesWritable sampleIndexTable; public static void setSamples(Job job, Collection sampleIds) { job.getConfiguration().set(SAMPLES, sampleIds.stream().map(Object::toString).collect(Collectors.joining(","))); @@ -77,8 +75,6 @@ protected void setup(Context context) throws IOException, InterruptedException { task.pre(); variantsTable = new ImmutableBytesWritable(getHelper().getVariantsTable()); - sampleIndexTable = new ImmutableBytesWritable(Bytes.toBytes(getHelper().getHBaseVariantTableNameGenerator() - .getSampleIndexTableName(getHelper().getStudyId()))); } @Override @@ -99,9 +95,6 @@ protected void map(VariantMapReduceContext ctx) throws IOException, InterruptedE for (Put put : fillResult.getVariantPuts()) { ctx.getContext().write(variantsTable, put); } - for (Put put : fillResult.getSamplesIndexPuts()) { - ctx.getContext().write(sampleIndexTable, put); - } updateStats(ctx.getContext()); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsFromVariantTask.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsFromVariantTask.java index 49e27ee16b6..4ed2da5a325 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsFromVariantTask.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsFromVariantTask.java @@ -155,8 +155,7 @@ public Put fillGaps(Variant variant, Set missingSamples) throws IOExcep if (bytes != null) { VcfSliceProtos.VcfSlice refVcfSlice = null; // FIXME !! VcfSliceProtos.VcfSlice nonRefVcfSlice = VcfSliceProtos.VcfSlice.parseFrom(bytes); - ArrayList sampleIndexPuts = null; // FIXME !! - fillGapsTask.fillGaps(variant, missingSamples, put, sampleIndexPuts, fileId, nonRefVcfSlice, refVcfSlice); + fillGapsTask.fillGaps(variant, missingSamples, put, fileId, nonRefVcfSlice, refVcfSlice); } else { logger.debug("Missing fileId " + fileId + " in variant " + variant); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTask.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTask.java index b8a2dc7a2c8..53f47a15557 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTask.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTask.java @@ -21,7 +21,6 @@ import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; import org.opencb.opencga.storage.hadoop.variant.converters.study.StudyEntryMultiFileToHBaseConverter; import org.opencb.opencga.storage.hadoop.variant.converters.study.StudyEntryToHBaseConverter; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,15 +71,15 @@ public FillGapsTask setQuiet(boolean quiet) { return this; } - public VariantOverlappingStatus fillGaps(Variant variant, Set missingSamples, Put put, List sampleIndexPuts, + public VariantOverlappingStatus fillGaps(Variant variant, Set missingSamples, Put put, Integer fileId, VcfSliceProtos.VcfSlice nonRefVcfSlice, VcfSliceProtos.VcfSlice refVcfSlice) { - return fillGaps(variant, missingSamples, put, sampleIndexPuts, fileId, + return fillGaps(variant, missingSamples, put, fileId, nonRefVcfSlice, nonRefVcfSlice.getRecordsList().listIterator(), refVcfSlice, refVcfSlice.getRecordsList().listIterator()); } - public VariantOverlappingStatus fillGaps(Variant variant, Set missingSamples, Put put, List sampleIndexPuts, + public VariantOverlappingStatus fillGaps(Variant variant, Set missingSamples, Put put, Integer fileId, VcfSliceProtos.VcfSlice nonRefVcfSlice, ListIterator nonRefIterator, VcfSliceProtos.VcfSlice refVcfSlice, ListIterator refIterator) { @@ -159,7 +158,7 @@ public VariantOverlappingStatus fillGaps(Variant variant, Set missingSa //// throw new IllegalStateException(msg); // logger.warn(msg); // } - return processMultipleOverlappings(variant, missingSamples, put, sampleIndexPuts, fileId); + return processMultipleOverlappings(variant, missingSamples, put, fileId); } } else { vcfRecord = overlappingRecords.get(0).getRight(); @@ -170,7 +169,7 @@ public VariantOverlappingStatus fillGaps(Variant variant, Set missingSa if (archiveVariant.getType().equals(VariantType.NO_VARIATION)) { overlappingStatus = processReferenceOverlap(missingSamples, put, variant, archiveVariant); } else { - overlappingStatus = processVariantOverlap(variant, missingSamples, put, sampleIndexPuts, archiveVariant); + overlappingStatus = processVariantOverlap(variant, missingSamples, put, archiveVariant); } return overlappingStatus; } @@ -217,7 +216,7 @@ protected VariantOverlappingStatus processReferenceOverlap(Set missingS } protected VariantOverlappingStatus processVariantOverlap(Variant variant, Set missingSamples, Put put, - List sampleIndexPuts, Variant archiveVariant) { + Variant archiveVariant) { VariantOverlappingStatus overlappingStatus = VARIANT; Variant mergedVariant = new Variant( @@ -298,23 +297,6 @@ protected VariantOverlappingStatus processVariantOverlap(Variant variant, Set missingSamples, Put put, - List sampleIndexPuts, Integer fileId) { + Integer fileId) { VariantOverlappingStatus overlappingStatus = MULTI; String gt = "2/2"; @@ -360,11 +342,6 @@ protected VariantOverlappingStatus processMultipleOverlappings(Variant variant, samplesData.add(new SampleEntry(null, null, Collections.singletonList(gt))); } - for (Integer sampleId : missingSamples) { - Put sampleIndexPut = buildSampleIndexPut(variant, put, sampleId, gt); - sampleIndexPuts.add(sampleIndexPut); - } - VariantBuilder builder = Variant.newBuilder( variant.getChromosome(), variant.getStart(), @@ -386,14 +363,6 @@ protected VariantOverlappingStatus processMultipleOverlappings(Variant variant, return overlappingStatus; } - private Put buildSampleIndexPut(Variant variant, Put put, Integer sampleId, String gt) { - Put sampleIndexPut = new Put( - SampleIndexSchema.toRowKey(sampleId, variant.getChromosome(), variant.getStart()), - put.getTimeStamp()); - sampleIndexPut.addColumn(GenomeHelper.COLUMN_FAMILY_BYTES, SampleIndexSchema.toPendingColumn(variant, gt), null); - return sampleIndexPut; - } - protected boolean hasMainAlternate(String gt) { return StringUtils.contains(gt, '1'); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillMissingFromArchiveMapper.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillMissingFromArchiveMapper.java index ebd26089a08..d17ea6121ed 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillMissingFromArchiveMapper.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillMissingFromArchiveMapper.java @@ -58,11 +58,6 @@ protected void map(ImmutableBytesWritable key, Result value, Context context) th ClientProtos.MutationProto proto = ProtobufUtil.toMutation(ClientProtos.MutationProto.MutationType.PUT, put); context.write(new BytesWritable(put.getRow()), new BytesWritable(proto.toByteArray())); } - for (Put put : fillResult.getSamplesIndexPuts()) { - setSampleIndexTablePut(put); - ClientProtos.MutationProto proto = ProtobufUtil.toMutation(ClientProtos.MutationProto.MutationType.PUT, put); - context.write(new BytesWritable(put.getRow()), new BytesWritable(proto.toByteArray())); - } updateStats(context); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java index 8af139c8ee2..443b6d90abc 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/HBaseToSampleIndexConverter.java @@ -1,6 +1,5 @@ package org.opencb.opencga.storage.hadoop.variant.index.sample; -import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.util.Bytes; @@ -35,22 +34,6 @@ public HBaseToSampleIndexConverter(SampleIndexSchema schema) { fileIndex = schema.getFileIndex(); } - public static Pair parsePendingColumn(byte[] column) { - if (Bytes.startsWith(column, PENDING_VARIANT_PREFIX_BYTES)) { - int lastIndexOf = 0; - for (int i = column.length - 1; i >= 0; i--) { - if (column[i] == '_') { - lastIndexOf = i; - break; - } - } - return Pair.of(Bytes.toString(column, PENDING_VARIANT_PREFIX.length(), lastIndexOf - PENDING_VARIANT_PREFIX.length()), - Bytes.toString(column, lastIndexOf + 1)); - } else { - return null; - } - } - @Override public SampleIndexEntry convert(Result result) { byte[] row = result.getRow(); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConsolidationDrive.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConsolidationDrive.java deleted file mode 100644 index 187047c9714..00000000000 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexConsolidationDrive.java +++ /dev/null @@ -1,211 +0,0 @@ -package org.opencb.opencga.storage.hadoop.variant.index.sample; - -import org.apache.commons.lang3.tuple.Pair; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.client.*; -import org.apache.hadoop.hbase.io.ImmutableBytesWritable; -import org.apache.hadoop.hbase.mapreduce.TableMapper; -import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.mapreduce.Counter; -import org.apache.hadoop.mapreduce.Job; -import org.opencb.biodata.models.variant.Variant; -import org.opencb.opencga.storage.core.exceptions.StorageEngineException; -import org.opencb.opencga.storage.core.variant.VariantStorageOptions; -import org.opencb.opencga.storage.hadoop.variant.AbstractVariantsTableDriver; -import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; -import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageOptions; -import org.opencb.opencga.storage.hadoop.variant.gaps.FillGapsFromArchiveMapper; -import org.opencb.opencga.storage.hadoop.variant.mr.VariantsTableMapReduceHelper; -import org.opencb.opencga.storage.hadoop.variant.mr.VariantMapReduceUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.*; - -/** - * Creates and executes a MR job that finishes loading all the pending variants in the SampleIndex table. - * For each variant with, reads all pending variants like _V_{VARIANT}_{GT}, and updates the list of variants - * for that genotype and updates the genotype counters. - * - * Only genotypes without the main alternate (0/2, 2/3, ...) should be found as pending. - * Genotypes with the main alternate (0/1, 1/1, 1/2, ...) are already loaded by {@link SampleIndexDBLoader} - * - * Created on 30/05/18. - * - * @author Jacobo Coll <jacobo167@gmail.com> - */ -@Deprecated -public class SampleIndexConsolidationDrive extends AbstractVariantsTableDriver { - public static final String GENOTYPES_COUNTER_GROUP_NAME = "genotypes"; - private static final Logger LOG = LoggerFactory.getLogger(SampleIndexConsolidationDrive.class); - private String sampleIndexTable; - private int[] samples; - private boolean allSamples; - - @Override - protected void parseAndValidateParameters() throws IOException { - super.parseAndValidateParameters(); - sampleIndexTable = generator.getSampleIndexTableName(getStudyId()); - - if (sampleIndexTable == null || sampleIndexTable.isEmpty()) { - throw new IllegalArgumentException("Missing sampleIndex table!"); - } - - samples = getConf().getInts(FillGapsFromArchiveMapper.SAMPLES); - if (samples == null || samples.length == 0) { - allSamples = true; - } else { - allSamples = false; - } - } - - @Override - protected Class getMapperClass() { - return SampleIndexConsolidationMapper.class; - } - - @Override - protected Job setupJob(Job job, String archiveTable, String variantTable) throws IOException { - List scans = new ArrayList<>(); - - int caching = job.getConfiguration().getInt(HadoopVariantStorageOptions.MR_HBASE_SCAN_CACHING.key(), 100); - LOG.info("Scan set Caching to " + caching); - Scan templateScan = new Scan(); - templateScan.setCaching(caching); // 1 is the default in Scan - templateScan.setCacheBlocks(false); // don't set to true for MR jobs - - if (allSamples) { - scans.add(templateScan); - } else { - for (int sample : samples) { - Scan newScan = new Scan(templateScan); - newScan.setRowPrefixFilter(SampleIndexSchema.toRowKey(sample)); - scans.add(newScan); - } - } - - for (int i = 0; i < scans.size(); i++) { - Scan s = scans.get(i); - LOG.info("scan[" + i + "]= " + s.toJSON()); - } - - // set other scan attrs - VariantMapReduceUtil.initTableMapperJob(job, sampleIndexTable, sampleIndexTable, scans, getMapperClass()); - - job.setSpeculativeExecution(false); -// job.getConfiguration().setInt(MRJobConfig.TASK_TIMEOUT, 20 * 60 * 1000); - - - return job; - } - - @Override - protected void postExecution(Job job) throws IOException, StorageEngineException { - super.postExecution(job); - - // Update list of loaded genotypes - Set gts = new HashSet<>(); - if (job.isSuccessful()) { - for (Counter counter : job.getCounters().getGroup(GENOTYPES_COUNTER_GROUP_NAME)) { - gts.add(counter.getName()); - } - if (!gts.isEmpty()) { - getMetadataManager().updateStudyMetadata(getStudyId(), sm -> { - gts.addAll(sm.getAttributes().getAsStringList(VariantStorageOptions.LOADED_GENOTYPES.key())); - sm.getAttributes().put(VariantStorageOptions.LOADED_GENOTYPES.key(), gts); - return sm; - }); - } - } - } - - @Override - protected String getJobOperationName() { - return "consolidate_sample_index"; - } - - public static class SampleIndexConsolidationMapper extends TableMapper { - - private byte[] family; - private SampleIndexVariantBiConverter converter; - private SampleIndexSchema schema; - - @Override - protected void setup(Context context) throws IOException, InterruptedException { - new GenomeHelper(context.getConfiguration()); - family = GenomeHelper.COLUMN_FAMILY_BYTES; - schema = new SampleIndexSchema(VariantMapReduceUtil.getSampleIndexConfiguration(context.getConfiguration())); - converter = new SampleIndexVariantBiConverter(schema); - } - - @Override - protected void map(ImmutableBytesWritable k, Result result, Context context) throws IOException, InterruptedException { - Map> map = new HashMap<>(); - Map otherCells = new HashMap<>(); - - Delete delete = new Delete(result.getRow()); - for (Cell cell : result.rawCells()) { - byte[] column = CellUtil.cloneQualifier(cell); - Pair pair = HBaseToSampleIndexConverter.parsePendingColumn(column); - if (pair != null) { - delete.addColumn(family, column); - String variant = pair.getKey(); - String gt = pair.getValue(); - - map.computeIfAbsent(gt, key -> new ArrayList<>()).add(variant); - } else { - otherCells.put(Bytes.toString(column), cell); - } - } - - if (!delete.isEmpty()) { - context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "consolidation").increment(1); - Put put = new Put(result.getRow()); - for (Map.Entry> entry : map.entrySet()) { - String gt = entry.getKey(); - context.getCounter(GENOTYPES_COUNTER_GROUP_NAME, gt).increment(entry.getValue().size()); - - List variants = entry.getValue(); - Cell cell = otherCells.get(gt); - if (cell == null) { - context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "new_gt").increment(1); - put.addColumn(family, Bytes.toBytes(gt), converter.toBytesFromStrings(variants)); - put.addColumn(family, SampleIndexSchema.toGenotypeCountColumn(gt), Bytes.toBytes(variants.size())); - } else { - context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "merged_gt").increment(1); - // Merge with existing values - TreeSet variantsSet = new TreeSet<>(SampleIndexSchema.INTRA_CHROMOSOME_VARIANT_COMPARATOR); - List loadedVariants = converter.toVariants(cell); - variantsSet.addAll(loadedVariants); - for (String variant : variants) { - variantsSet.add(new Variant(variant)); - } - - if (loadedVariants.size() == variantsSet.size()) { - context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "merged_gt_skip").increment(1); - } else { - put.addColumn(family, SampleIndexSchema.toGenotypeColumn(gt), converter.toBytes(variantsSet)); - put.addColumn(family, SampleIndexSchema.toGenotypeCountColumn(gt), Bytes.toBytes(variantsSet.size())); - } - } - } - - if (!put.isEmpty()) { - context.write(k, put); - } - context.write(k, delete); - } - } - } - - public static void main(String[] args) { - try { - System.exit(new SampleIndexConsolidationDrive().privateMain(args)); - } catch (Exception e) { - LOG.error("Error executing " + SampleIndexConsolidationDrive.class, e); - System.exit(1); - } - } -} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java index d9295459ef7..8f7f9c9ce33 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java @@ -94,11 +94,6 @@ public final class SampleIndexSchema { static final String ANNOTATION_CLINICAL_PREFIX = META_PREFIX + "CL_"; static final byte[] ANNOTATION_CLINICAL_PREFIX_BYTES = Bytes.toBytes(ANNOTATION_CLINICAL_PREFIX); - @Deprecated - static final String PENDING_VARIANT_PREFIX = META_PREFIX + "V_"; - @Deprecated - static final byte[] PENDING_VARIANT_PREFIX_BYTES = Bytes.toBytes(PENDING_VARIANT_PREFIX); - private final SampleIndexConfiguration configuration; private final FileIndexSchema fileIndex; private final PopulationFrequencyIndexSchema popFreqIndex; @@ -219,10 +214,6 @@ public static byte[] toGenotypeCountColumn(String genotype) { return Bytes.toBytes(GENOTYPE_COUNT_PREFIX + genotype); } - public static byte[] toPendingColumn(Variant variant, String gt) { - return Bytes.toBytes(PENDING_VARIANT_PREFIX + variant.toString() + '_' + gt); - } - public static byte[] toAnnotationIndexColumn(String genotype) { return Bytes.toBytes(ANNOTATION_SUMMARY_PREFIX + genotype); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHadoopMultiSampleTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHadoopMultiSampleTest.java index 9a29b595693..862d7188555 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHadoopMultiSampleTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHadoopMultiSampleTest.java @@ -649,16 +649,15 @@ public void testPlatinumFilesOneByOne_MergeBasic() throws Exception { HadoopVariantStorageEngine variantStorageEngine = getVariantStorageEngine(); VariantHadoopDBAdaptor dbAdaptor = variantStorageEngine.getDBAdaptor(); VariantStorageMetadataManager metadataManager = dbAdaptor.getMetadataManager(); - List sampleIds = new ArrayList<>(); - metadataManager.sampleMetadataIterator(studyMetadata.getId()).forEachRemaining(s -> sampleIds.add(s.getId())); + List samples = new ArrayList<>(metadataManager.getIndexedSamplesMap(studyMetadata.getId()).keySet()); - FillGapsTest.fillGaps(variantStorageEngine, studyMetadata, sampleIds.subList(0, sampleIds.size()/2)); + FillGapsTest.fillGaps(variantStorageEngine, studyMetadata, samples.subList(0, samples.size()/2)); printVariants(studyMetadata, dbAdaptor, newOutputUri()); - FillGapsTest.fillGaps(variantStorageEngine, studyMetadata, sampleIds.subList(sampleIds.size()/2, sampleIds.size())); + FillGapsTest.fillGaps(variantStorageEngine, studyMetadata, samples.subList(samples.size()/2, samples.size())); printVariants(studyMetadata, dbAdaptor, newOutputUri()); - FillGapsTest.fillGaps(variantStorageEngine, studyMetadata, sampleIds); + FillGapsTest.fillGaps(variantStorageEngine, studyMetadata, samples); printVariants(studyMetadata, dbAdaptor, newOutputUri()); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTaskTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTaskTest.java index 2a09554018b..2b6ea7a90d9 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTaskTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTaskTest.java @@ -177,7 +177,7 @@ public void fillGapsAlreadyPresent() { Put put = new Put(VariantPhoenixKeyFactory.generateVariantRowKey(new Variant("1:100:A:T"))); VariantOverlappingStatus overlappingStatus = task.fillGaps(new Variant("1:100:A:T"), - new HashSet<>(Arrays.asList(1, 2)), put, new ArrayList<>(), 1, + new HashSet<>(Arrays.asList(1, 2)), put, 1, toSliceConverter.convert(Arrays.asList(variantFile1("1:100:A:C"), variantFile1("1:100:A:T"))), toSliceConverter.convert(Collections.emptyList())); assertEquals(VariantOverlappingStatus.NONE, overlappingStatus); @@ -306,7 +306,7 @@ protected Variant fillGaps(FillGapsTask task, protected Variant fillGaps(FillGapsTask task, VariantOverlappingStatus expected, String variant, VcfSliceProtos.VcfSlice nonRefVcfSlice, VcfSliceProtos.VcfSlice refVcfSlice) { Put put = new Put(VariantPhoenixKeyFactory.generateVariantRowKey(new Variant(variant))); - VariantOverlappingStatus overlappingStatus = task.fillGaps(new Variant(variant), new HashSet<>(Arrays.asList(1, 2)), put, new ArrayList<>(), 1, nonRefVcfSlice, refVcfSlice); + VariantOverlappingStatus overlappingStatus = task.fillGaps(new Variant(variant), new HashSet<>(Arrays.asList(1, 2)), put, 1, nonRefVcfSlice, refVcfSlice); assertEquals(expected, overlappingStatus); return putToVariant(put); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTest.java index f17ef5e59d6..89e9d21060b 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillGapsTest.java @@ -1,5 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.gaps; +import com.google.common.collect.BiMap; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; @@ -36,11 +37,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import static junit.framework.TestCase.*; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.junit.Assert.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantMatchers.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; import static org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageEngine.MISSING_GENOTYPES_UPDATED; @@ -59,7 +57,7 @@ public class FillGapsTest extends VariantStorageBaseTest implements HadoopVarian public ExternalResource externalResource = new HadoopExternalResource(); public static void fillGaps(HadoopVariantStorageEngine variantStorageEngine, StudyMetadata studyMetadata, - Collection sampleIds) throws Exception { + Collection sampleIds) throws Exception { // fillGapsMR(variantStorageEngine, studyMetadata, sampleIds, true); // fillGapsMR(variantStorageEngine, studyMetadata, sampleIds, false); // fillGapsLocal(variantStorageEngine, studyMetadata, sampleIds); @@ -86,24 +84,26 @@ public void testFillGapsPlatinumFiles(ObjectMap options) throws Exception { HadoopVariantStorageEngine variantStorageEngine = (HadoopVariantStorageEngine) this.variantStorageEngine; VariantHadoopDBAdaptor dbAdaptor = variantStorageEngine.getDBAdaptor(); - List sampleIds = new ArrayList<>(metadataManager.getIndexedSamplesMap(studyMetadata.getId()).values()); + BiMap samplesMap = metadataManager.getIndexedSamplesMap(studyMetadata.getId()).inverse(); + List sampleIds = new ArrayList<>(samplesMap.keySet()); sampleIds.sort(Integer::compareTo); + List samples = sampleIds.stream().map(samplesMap::get).collect(Collectors.toList()); - List subSamples = sampleIds.subList(0, sampleIds.size() / 2); + List subSamples = samples.subList(0, samples.size() / 2); System.out.println("subSamples = " + subSamples); fillGaps(variantStorageEngine, studyMetadata, subSamples); printVariants(studyMetadata, dbAdaptor, newOutputUri()); checkFillGaps(studyMetadata, dbAdaptor, subSamples); checkSampleIndexTable(dbAdaptor); - subSamples = sampleIds.subList(sampleIds.size() / 2, sampleIds.size()); + subSamples = samples.subList(samples.size() / 2, samples.size()); System.out.println("subSamples = " + subSamples); fillGaps(variantStorageEngine, studyMetadata, subSamples); printVariants(studyMetadata, dbAdaptor, newOutputUri()); checkFillGaps(studyMetadata, dbAdaptor, subSamples); checkSampleIndexTable(dbAdaptor); - subSamples = sampleIds; + subSamples = samples; System.out.println("subSamples = " + subSamples); fillGaps(variantStorageEngine, studyMetadata, subSamples); printVariants(studyMetadata, dbAdaptor, newOutputUri()); @@ -191,12 +191,14 @@ public void checkConflictingFiles(StudyMetadata studyMetadata) throws Exception HadoopVariantStorageEngine variantStorageEngine = (HadoopVariantStorageEngine) this.variantStorageEngine; VariantHadoopDBAdaptor dbAdaptor = variantStorageEngine.getDBAdaptor(); - List sampleIds = new ArrayList<>(metadataManager.getIndexedSamplesMap(studyMetadata.getId()).values()); + BiMap samplesMap = metadataManager.getIndexedSamplesMap(studyMetadata.getId()).inverse(); + List sampleIds = new ArrayList<>(samplesMap.keySet()); sampleIds.sort(Integer::compareTo); + List samples = sampleIds.stream().map(samplesMap::get).collect(Collectors.toList()); - fillGaps(variantStorageEngine, studyMetadata, sampleIds); + fillGaps(variantStorageEngine, studyMetadata, samples); printVariants(studyMetadata, dbAdaptor, newOutputUri(1)); - checkFillGaps(studyMetadata, dbAdaptor, sampleIds, Collections.singleton("1:10020:A:T")); + checkFillGaps(studyMetadata, dbAdaptor, samples, Collections.singleton("1:10020:A:T")); checkSampleIndexTable(dbAdaptor); // Not a gap anymore since #1367 @@ -352,16 +354,15 @@ private StudyMetadata load(ObjectMap extraParams, List inputFiles, URI outp return studyMetadata; } - protected void checkFillGaps(StudyMetadata studyMetadata, VariantHadoopDBAdaptor dbAdaptor, List sampleIds) { - checkFillGaps(studyMetadata, dbAdaptor, sampleIds, Collections.singleton("1:10178:-:C")); + protected void checkFillGaps(StudyMetadata studyMetadata, VariantHadoopDBAdaptor dbAdaptor, List samples) { + checkFillGaps(studyMetadata, dbAdaptor, samples, Collections.singleton("1:10178:-:C")); } - protected void checkFillGaps(StudyMetadata studyMetadata, VariantHadoopDBAdaptor dbAdaptor, List sampleIds, Set variantsWithGaps) { + protected void checkFillGaps(StudyMetadata studyMetadata, VariantHadoopDBAdaptor dbAdaptor, List samples, Set variantsWithGaps) { for (Variant variant : dbAdaptor) { boolean anyUnknown = false; boolean allUnknown = true; - for (Integer sampleId : sampleIds) { - String sampleName = metadataManager.getSampleName(studyMetadata.getId(), sampleId); + for (String sampleName : samples) { boolean unknown = variant.getStudies().get(0).getSampleData(sampleName, "GT").equals("?/?"); anyUnknown |= unknown; allUnknown &= unknown; @@ -427,7 +428,8 @@ protected void checkSampleIndexTable(VariantHadoopDBAdaptor dbAdaptor) throws IO StudyMetadata sc = metadataManager.getStudyMetadata(study); for (Integer fileId : metadataManager.getIndexedFiles(sc.getId())) { for (int sampleId : metadataManager.getFileMetadata(sc.getId(), fileId).getSamples()) { - String message = "Sample '" + metadataManager.getSampleName(sc.getId(), sampleId) + "' : " + sampleId; + String sample = metadataManager.getSampleName(sc.getId(), sampleId); + String message = "Sample '" + sample + "' : " + sampleId; int countFromIndex = 0; Iterator>> iterator = sampleIndexDBAdaptor.iteratorByGt(sc.getId(), sampleId); while (iterator.hasNext()) { @@ -437,7 +439,8 @@ protected void checkSampleIndexTable(VariantHadoopDBAdaptor dbAdaptor) throws IO List variants = entry.getValue(); countFromIndex += variants.size(); VariantQueryResult result = dbAdaptor.get(new Query(VariantQueryParam.ID.key(), variants) - .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleId), null); + .append(VariantQueryParam.STUDY.key(), study) + .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sample), null); Set expected = variants.stream().map(Variant::toString).collect(Collectors.toSet()); Set actual = result.getResults().stream().map(Variant::toString).collect(Collectors.toSet()); if (!expected.equals(actual)) { @@ -450,13 +453,13 @@ protected void checkSampleIndexTable(VariantHadoopDBAdaptor dbAdaptor) throws IO } assertEquals(message, variants.size(), result.getNumResults()); for (Variant variant : result.getResults()) { - assertEquals(message, gt, variant.getStudies().get(0).getSampleData(0).get(0)); + assertEquals(message, gt, variant.getStudies().get(0).getSampleData(sample, "GT")); } } } int countFromVariants = 0; - for (Variant variant : dbAdaptor.get(new Query(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleId), null).getResults()) { + for (Variant variant : dbAdaptor.get(new Query(VariantQueryParam.INCLUDE_SAMPLE.key(), sample), null).getResults()) { String gt = variant.getStudies().get(0).getSampleData(0).get(0); if (!gt.equals(GenotypeClass.UNKNOWN_GENOTYPE) && SampleIndexSchema.validGenotype(gt)) { countFromVariants++; From 5b953bc207ae755c58dea132714f95b77c5f7073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 11 Mar 2021 17:30:16 +0000 Subject: [PATCH 081/412] storage: Remove unused annotation cache index table. #1699 --- ...HadoopDefaultVariantAnnotationManager.java | 5 - .../annotation/AnnotationIndexDBAdaptor.java | 66 ------ .../annotation/AnnotationIndexDBLoader.java | 47 ----- .../annotation/AnnotationIndexDriver.java | 123 ----------- .../sample/SampleIndexAnnotationLoader.java | 194 +++++++++--------- .../utils/HBaseVariantTableNameGenerator.java | 11 - .../hadoop/variant/VariantHbaseTestUtils.java | 15 -- 7 files changed, 96 insertions(+), 365 deletions(-) delete mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBAdaptor.java delete mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBLoader.java delete mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDriver.java diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/annotation/HadoopDefaultVariantAnnotationManager.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/annotation/HadoopDefaultVariantAnnotationManager.java index dd29c96db8e..0ba2c53fb99 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/annotation/HadoopDefaultVariantAnnotationManager.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/annotation/HadoopDefaultVariantAnnotationManager.java @@ -190,11 +190,6 @@ private boolean skipPendingVariantsToAnnotateTable(ObjectMap params) { .getAnnotation().getCurrent().getId(); VariantAnnotationToHBaseConverter hBaseConverter = new VariantAnnotationToHBaseConverter(currentAnnotationId, progressLogger); -// AnnotationIndexDBLoader annotationIndexDBLoader = new AnnotationIndexDBLoader( -// dbAdaptor.getHBaseManager(), dbAdaptor.getTableNameGenerator().getAnnotationIndexTableName(), -// SampleIndexSchema.defaultSampleIndexSchema()); - -// Task task = Task.join(hBaseConverter, annotationIndexDBLoader.asTask(true)); VariantAnnotationHadoopDBWriter writer = new VariantAnnotationHadoopDBWriter(dbAdaptor); return new ParallelTaskRunner<>(reader, hBaseConverter, writer, config); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBAdaptor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBAdaptor.java deleted file mode 100644 index 6209da08a32..00000000000 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBAdaptor.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.opencb.opencga.storage.hadoop.variant.index.annotation; - -import com.google.common.collect.Iterators; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.io.compress.Compression; -import org.opencb.biodata.models.core.Region; -import org.opencb.biodata.models.variant.Variant; -import org.opencb.opencga.storage.hadoop.utils.HBaseManager; -import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory; - -import java.io.IOException; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import static org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageOptions.ANNOTATION_INDEX_TABLE_COMPRESSION; - -/** - * Created by jacobo on 04/01/19. - */ -public class AnnotationIndexDBAdaptor { - - private final HBaseManager hBaseManager; - private final String tableName; - - public AnnotationIndexDBAdaptor(HBaseManager hBaseManager, String tableName) { - this.hBaseManager = hBaseManager; - this.tableName = tableName; - } - - public List> get(String chromosome, int start, int end) throws IOException { - Iterator> iterator = nativeIterator(new Scan( - VariantPhoenixKeyFactory.generateVariantRowKey(chromosome, start), - VariantPhoenixKeyFactory.generateVariantRowKey(chromosome, end))); - List> list = new LinkedList<>(); - while (iterator.hasNext()) { - list.add(iterator.next()); - } - return list; - } - - public Iterator> iterator() throws IOException { - return nativeIterator(new Scan()); - } - - public Iterator> iterator(Region region) throws IOException { - Scan scan = new Scan(); - scan.setStartRow(VariantPhoenixKeyFactory.generateVariantRowKey(region.getChromosome(), region.getStart())); - scan.setStopRow(VariantPhoenixKeyFactory.generateVariantRowKey(region.getChromosome(), region.getEnd())); - return nativeIterator(scan); - } - - private Iterator> nativeIterator(Scan scan) throws IOException { - return hBaseManager.act(tableName, table -> { - return Iterators.transform(table.getScanner(scan).iterator(), AnnotationIndexConverter::getAnnotationIndexEntryPair); - }); - } - - public static void createTableIfNeeded(HBaseManager hBaseManager, String tableName) throws IOException { - hBaseManager.createTableIfNeeded(tableName, AnnotationIndexConverter.COLUMN_FMAILY, - Compression.getCompressionAlgorithmByName(hBaseManager.getConf().get( - ANNOTATION_INDEX_TABLE_COMPRESSION.key(), - ANNOTATION_INDEX_TABLE_COMPRESSION.defaultValue()))); - } -} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBLoader.java deleted file mode 100644 index 10ef6218508..00000000000 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDBLoader.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.opencb.opencga.storage.hadoop.variant.index.annotation; - -import org.apache.hadoop.hbase.client.Put; -import org.opencb.biodata.models.variant.avro.VariantAnnotation; -import org.opencb.opencga.storage.hadoop.utils.AbstractHBaseDataWriter; -import org.opencb.opencga.storage.hadoop.utils.HBaseManager; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by jacobo on 04/01/19. - */ -public class AnnotationIndexDBLoader extends AbstractHBaseDataWriter { - - private final AnnotationIndexConverter converter; - - public AnnotationIndexDBLoader(HBaseManager hBaseManager, String tableName, SampleIndexSchema schema) { - super(hBaseManager, tableName); - converter = new AnnotationIndexConverter(schema); - } - - @Override - public boolean open() { - super.open(); - - try { - AnnotationIndexDBAdaptor.createTableIfNeeded(hBaseManager, tableName); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - - return true; - } - - @Override - protected List convert(List batch) { - List puts = new ArrayList<>(batch.size()); - for (VariantAnnotation variantAnnotation : batch) { - puts.add(converter.convertToPut(variantAnnotation)); - } - return puts; - } -} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDriver.java deleted file mode 100644 index efccaa17a7c..00000000000 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexDriver.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.opencb.opencga.storage.hadoop.variant.index.annotation; - -import org.apache.commons.lang3.StringUtils; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.io.ImmutableBytesWritable; -import org.apache.hadoop.hbase.mapreduce.TableMapper; -import org.apache.hadoop.mapreduce.Job; -import org.opencb.biodata.models.core.Region; -import org.opencb.biodata.models.variant.avro.VariantAnnotation; -import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; -import org.opencb.opencga.storage.hadoop.utils.HBaseManager; -import org.opencb.opencga.storage.hadoop.variant.AbstractVariantsTableDriver; -import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; -import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageOptions; -import org.opencb.opencga.storage.hadoop.variant.adaptors.VariantHBaseQueryParser; -import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixSchema; -import org.opencb.opencga.storage.hadoop.variant.converters.annotation.HBaseToVariantAnnotationConverter; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; -import org.opencb.opencga.storage.hadoop.variant.mr.VariantMapReduceUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; - -/** - * Created on 08/01/19. - * - * export HADOOP_CLASSPATH=$(hbase classpath | tr ":" "\n" | grep "/conf" | tr "\n" ":") - * hadoop jar opencga-storage-hadoop-core-X.Y.Z-dev-jar-with-dependencies.jar - * org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexDriver - * $VARIANTS_TABLE_NAME [--region $REGION] - * .... - * - * @author Jacobo Coll <jacobo167@gmail.com> - */ -public class AnnotationIndexDriver extends AbstractVariantsTableDriver { - private static final Logger LOGGER = LoggerFactory.getLogger(AnnotationIndexDriver.class); - private Region region; - private String annotationIndexTable; - - @Override - protected void parseAndValidateParameters() throws IOException { - super.parseAndValidateParameters(); - - Configuration conf = getConf(); - String regionStr = conf.get(VariantQueryParam.REGION.key(), conf.get("--" + VariantQueryParam.REGION.key())); - if (StringUtils.isNotEmpty(regionStr)) { - region = new Region(regionStr); - } else { - region = null; - } - - annotationIndexTable = getTableNameGenerator().getAnnotationIndexTableName(); - } - - @Override - protected Job setupJob(Job job, String archiveTable, String variantTable) throws IOException { - int caching = job.getConfiguration().getInt(HadoopVariantStorageOptions.MR_HBASE_SCAN_CACHING.key(), - HadoopVariantStorageOptions.MR_HBASE_SCAN_CACHING.defaultValue()); - LOGGER.info("Scan set Caching to " + caching); - - Scan scan = new Scan(); - if (region != null) { - VariantHBaseQueryParser.addRegionFilter(scan, region); - } - - scan.addColumn(GenomeHelper.COLUMN_FAMILY_BYTES, VariantPhoenixSchema.VariantColumn.FULL_ANNOTATION.bytes()); - - VariantMapReduceUtil.initTableMapperJob(job, variantTable, scan, getMapperClass()); - VariantMapReduceUtil.setOutputHBaseTable(job, annotationIndexTable); - - return job; - } - - @Override - protected void preExecution() throws IOException { - try (HBaseManager hBaseManager = new HBaseManager(getConf())) { - AnnotationIndexDBAdaptor.createTableIfNeeded(hBaseManager, annotationIndexTable); - } - } - - @Override - protected Class getMapperClass() { - return AnnotationIndexMapper.class; - } - - @Override - protected String getJobOperationName() { - return "create_annotation_index"; - } - - public static class AnnotationIndexMapper extends TableMapper { - private HBaseToVariantAnnotationConverter annotationConverter; - private AnnotationIndexConverter annotationIndexConverter; - - @Override - protected void setup(Context context) throws IOException, InterruptedException { - annotationConverter = new HBaseToVariantAnnotationConverter(); - annotationIndexConverter = new AnnotationIndexConverter( - new SampleIndexSchema(VariantMapReduceUtil.getSampleIndexConfiguration(context.getConfiguration()))); - } - - @Override - protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException { - VariantAnnotation annotation = annotationConverter.convert(value); - Put put = annotationIndexConverter.convertToPut(annotation); - context.write(key, put); - } - } - - public static void main(String[] args) throws Exception { - try { - System.exit(new AnnotationIndexDriver().privateMain(args, null)); - } catch (Exception e) { - LOGGER.error("Error executing " + AnnotationIndexDriver.class, e); - System.exit(1); - } - } - -} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java index 94fe8d608b4..c48d990e55a 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java @@ -4,11 +4,9 @@ import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.BufferedMutator; import org.apache.hadoop.hbase.client.Put; +import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.Variant; -import org.opencb.commons.ProgressLogger; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.io.DataReader; -import org.opencb.commons.run.ParallelTaskRunner; import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; @@ -16,11 +14,9 @@ import org.opencb.opencga.storage.core.metadata.models.TaskMetadata; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; -import org.opencb.opencga.storage.hadoop.utils.HBaseDataWriter; import org.opencb.opencga.storage.hadoop.utils.HBaseManager; import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; import org.opencb.opencga.storage.hadoop.variant.executors.MRExecutor; -import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexDBAdaptor; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexPutBuilder; import org.opencb.opencga.storage.hadoop.variant.index.annotation.mr.SampleIndexAnnotationLoaderDriver; @@ -30,7 +26,7 @@ import java.io.IOException; import java.util.*; -import java.util.concurrent.ExecutionException; +import java.util.function.Function; import static org.opencb.opencga.core.api.ParamConstants.OVERWRITE; import static org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageOptions.SAMPLE_INDEX_ANNOTATION_MAX_SAMPLES_PER_MR; @@ -43,7 +39,6 @@ public class SampleIndexAnnotationLoader { private final HBaseManager hBaseManager; private final HBaseVariantTableNameGenerator tableNameGenerator; private final MRExecutor mrExecutor; - private final AnnotationIndexDBAdaptor annotationIndexDBAdaptor; private final SampleIndexDBAdaptor sampleDBAdaptor; private final byte[] family; private final VariantStorageMetadataManager metadataManager; @@ -54,7 +49,6 @@ public SampleIndexAnnotationLoader(HBaseManager hBaseManager, HBaseVariantTableN this.hBaseManager = hBaseManager; this.tableNameGenerator = tableNameGenerator; this.mrExecutor = mrExecutor; - this.annotationIndexDBAdaptor = new AnnotationIndexDBAdaptor(hBaseManager, tableNameGenerator.getAnnotationIndexTableName()); this.metadataManager = metadataManager; this.sampleDBAdaptor = new SampleIndexDBAdaptor(hBaseManager, tableNameGenerator, this.metadataManager); family = GenomeHelper.COLUMN_FAMILY_BYTES; @@ -151,100 +145,102 @@ private void updateSampleAnnotationBatchMapreduce(int studyId, List sam throws StorageEngineException { mrExecutor.run(SampleIndexAnnotationLoaderDriver.class, SampleIndexAnnotationLoaderDriver.buildArgs( tableNameGenerator.getArchiveTableName(studyId), - tableNameGenerator.getVariantTableName(), studyId, samples, options), options, + tableNameGenerator.getVariantTableName(), studyId, samples, options), "Annotate sample index for " + (samples.size() < 10 ? "samples " + samples : samples.size() + " samples")); } - private void updateSampleAnnotationBatchMultiThread(int studyId, List samples) throws IOException, StorageEngineException { - logger.info("Update sample index annotation of " + samples.size() + " samples"); - - String sampleIndexTableName = tableNameGenerator.getSampleIndexTableName(studyId); - - ProgressLogger progressLogger = new ProgressLogger("Sample index annotation updated variants"); - - ParallelTaskRunner, Put> ptr = new ParallelTaskRunner<>( - new DataReader>() { - - private Iterator> iterator = annotationIndexDBAdaptor.iterator(); - private int initialCapacity = 200000; - private Pair nextPair = null; - - private String chromosome = ""; - private int start = -1; - private int end = -1; - - @Override - public List> read(int n) { - List> annotationMasks = new ArrayList<>(initialCapacity); - - // Read next batch - if (nextPair == null && iterator.hasNext()) { - nextPair = iterator.next(); - } - if (nextPair != null) { - annotationMasks.add(nextPair); - Variant firstVariant = nextPair.getKey(); - chromosome = firstVariant.getChromosome(); - start = firstVariant.getStart() - (firstVariant.getStart() % SampleIndexSchema.BATCH_SIZE); - end = start + SampleIndexSchema.BATCH_SIZE; - nextPair = null; - } - while (iterator.hasNext()) { - Pair pair = iterator.next(); - Variant variant = pair.getKey(); - if (variant.getChromosome().equals(chromosome) && variant.getStart() > start && variant.getStart() < end) { - annotationMasks.add(pair); - } else { -// logger.info("Variant " + variant -// + "(" + variant.getChromosome() + ":" + variant.getStart() + "-" + variant.getEnd() + ")" -// + " not in batch " + chromosome + ":" + start + "-" + end); - nextPair = pair; - break; - } - } - - return annotationMasks; - } - }, - annotationMasks -> { - // Ensure is sorted as expected - annotationMasks.sort(Comparator.comparing(Pair::getKey, - SampleIndexSchema.INTRA_CHROMOSOME_VARIANT_COMPARATOR)); - - Variant firstVariant = annotationMasks.get(0).getKey(); - String chromosome = firstVariant.getChromosome(); - int start = firstVariant.getStart() - (firstVariant.getStart() % SampleIndexSchema.BATCH_SIZE); - int end = start + SampleIndexSchema.BATCH_SIZE; - - progressLogger.increment(annotationMasks.size(), () -> "Up to batch " + chromosome + ":" + start + "-" + end); - List puts = new ArrayList<>(samples.size()); - - for (Integer sampleId : samples) { - Map> map = sampleDBAdaptor.queryByGt(studyId, sampleId, chromosome, start); - Put put = annotate(chromosome, start, sampleId, map, annotationMasks); - if (!put.isEmpty()) { - puts.add(put); - } -// else logger.warn("Empty put for sample " + sampleId + " -> " + chromosome + ":" + start + ":" + end); - } - - return puts; - }, - new HBaseDataWriter<>(hBaseManager, sampleIndexTableName), - ParallelTaskRunner.Config.builder().setNumTasks(8).setCapacity(2).build() - ); - - try { - ptr.run(); - } catch (ExecutionException e) { - throw new StorageEngineException("Error", e); - } - - postAnnotationLoad(studyId, samples); - } +// private void updateSampleAnnotationBatchMultiThread(int studyId, List samples) throws IOException, StorageEngineException { +// logger.info("Update sample index annotation of " + samples.size() + " samples"); +// +// String sampleIndexTableName = tableNameGenerator.getSampleIndexTableName(studyId); +// +// ProgressLogger progressLogger = new ProgressLogger("Sample index annotation updated variants"); +// +// ParallelTaskRunner, Put> ptr = new ParallelTaskRunner<>( +// new DataReader>() { +// +// private Iterator> iterator = annotationIndexDBAdaptor.iterator(); +// private int initialCapacity = 200000; +// private Pair nextPair = null; +// +// private String chromosome = ""; +// private int start = -1; +// private int end = -1; +// +// @Override +// public List> read(int n) { +// List> annotationMasks = new ArrayList<>(initialCapacity); +// +// // Read next batch +// if (nextPair == null && iterator.hasNext()) { +// nextPair = iterator.next(); +// } +// if (nextPair != null) { +// annotationMasks.add(nextPair); +// Variant firstVariant = nextPair.getKey(); +// chromosome = firstVariant.getChromosome(); +// start = firstVariant.getStart() - (firstVariant.getStart() % SampleIndexSchema.BATCH_SIZE); +// end = start + SampleIndexSchema.BATCH_SIZE; +// nextPair = null; +// } +// while (iterator.hasNext()) { +// Pair pair = iterator.next(); +// Variant variant = pair.getKey(); +// if (variant.getChromosome().equals(chromosome) && variant.getStart() > start && variant.getStart() < end) { +// annotationMasks.add(pair); +// } else { +//// logger.info("Variant " + variant +//// + "(" + variant.getChromosome() + ":" + variant.getStart() + "-" + variant.getEnd() + ")" +//// + " not in batch " + chromosome + ":" + start + "-" + end); +// nextPair = pair; +// break; +// } +// } +// +// return annotationMasks; +// } +// }, +// annotationMasks -> { +// // Ensure is sorted as expected +// annotationMasks.sort(Comparator.comparing(Pair::getKey, +// SampleIndexSchema.INTRA_CHROMOSOME_VARIANT_COMPARATOR)); +// +// Variant firstVariant = annotationMasks.get(0).getKey(); +// String chromosome = firstVariant.getChromosome(); +// int start = firstVariant.getStart() - (firstVariant.getStart() % SampleIndexSchema.BATCH_SIZE); +// int end = start + SampleIndexSchema.BATCH_SIZE; +// +// progressLogger.increment(annotationMasks.size(), () -> "Up to batch " + chromosome + ":" + start + "-" + end); +// List puts = new ArrayList<>(samples.size()); +// +// for (Integer sampleId : samples) { +// Map> map = sampleDBAdaptor.queryByGt(studyId, sampleId, chromosome, start); +// Put put = annotate(chromosome, start, sampleId, map, annotationMasks); +// if (!put.isEmpty()) { +// puts.add(put); +// } +//// else logger.warn("Empty put for sample " + sampleId + " -> " + chromosome + ":" + start + ":" + end); +// } +// +// return puts; +// }, +// new HBaseDataWriter<>(hBaseManager, sampleIndexTableName), +// ParallelTaskRunner.Config.builder().setNumTasks(8).setCapacity(2).build() +// ); +// +// try { +// ptr.run(); +// } catch (ExecutionException e) { +// throw new StorageEngineException("Error", e); +// } +// +// postAnnotationLoad(studyId, samples); +// } - public void updateSampleAnnotationMultiSampleIterator(int studyId, List samples) throws IOException, StorageEngineException { + public void updateSampleAnnotationMultiSampleIterator(int studyId, List samples, + Function>> annotationIndexReader) + throws IOException, StorageEngineException { String sampleIndexTableName = tableNameGenerator.getSampleIndexTableName(studyId); Map>>> sampleIterators = new HashMap<>(samples.size()); @@ -273,7 +269,9 @@ public void updateSampleAnnotationMultiSampleIterator(int studyId, List chromosome = firstVariant.getChromosome(); start = firstVariant.getStart() - firstVariant.getStart() % SampleIndexSchema.BATCH_SIZE; end = start + SampleIndexSchema.BATCH_SIZE; - annotationEntries = annotationIndexDBAdaptor.get(chromosome, start, end); + // FIXME +// annotationEntries = annotationIndexDBAdaptor.get(chromosome, start, end); + annotationEntries = annotationIndexReader.apply(new Region(chromosome, start, end)); } Put put = annotate(chromosome, start, sampleId, next, annotationEntries); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/utils/HBaseVariantTableNameGenerator.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/utils/HBaseVariantTableNameGenerator.java index 96140ea6bd4..07470a0ce03 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/utils/HBaseVariantTableNameGenerator.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/utils/HBaseVariantTableNameGenerator.java @@ -17,7 +17,6 @@ public class HBaseVariantTableNameGenerator { private static final String META_SUFIX = "_meta"; private static final String ARCHIVE_SUFIX = "_archive_"; private static final String SAMPLE_SUFIX = "_variant_sample_index_"; - private static final String ANNOTATION_SUFIX = "_annotation"; private static final String PENDING_ANNOTATION_SUFIX = "_pending_annotation"; private static final String PENDING_SECONDARY_INDEX_SUFIX = "_pending_secondary_index"; private static final int MINIMUM_DB_NAME_SIZE = 1; @@ -26,7 +25,6 @@ public class HBaseVariantTableNameGenerator { private final String dbName; private final String variantTableName; private final String metaTableName; - private final String annotationIndexTableName; private final String pendingAnnotationTableName; private final String pendingSecondaryIndexTableName; @@ -47,7 +45,6 @@ public HBaseVariantTableNameGenerator(String namespace, String dbName) { this.dbName = dbName; variantTableName = getVariantTableName(namespace, this.dbName); metaTableName = getMetaTableName(namespace, this.dbName); - annotationIndexTableName = getAnnotationIndexTableName(namespace, this.dbName); pendingAnnotationTableName = getPendingAnnotationTableName(namespace, this.dbName); pendingSecondaryIndexTableName = getPendingSecondaryIndexTableName(namespace, this.dbName); } @@ -64,10 +61,6 @@ public String getSampleIndexTableName(int studyId) { return getSampleIndexTableName(namespace, dbName, studyId); } - public String getAnnotationIndexTableName() { - return annotationIndexTableName; - } - public String getPendingAnnotationTableName() { return pendingAnnotationTableName; } @@ -208,10 +201,6 @@ public static String getVariantTableName(String namespace, String dbName) { return buildTableName(namespace, dbName, VARIANTS_SUFIX); } - public static String getAnnotationIndexTableName(String namespace, String dbName) { - return buildTableName(namespace, dbName, ANNOTATION_SUFIX); - } - public static String getPendingAnnotationTableName(String namespace, String dbName) { return buildTableName(namespace, dbName, PENDING_ANNOTATION_SUFIX); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java index 0f000339d7b..a0f69124137 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java @@ -56,7 +56,6 @@ import org.opencb.opencga.storage.hadoop.variant.archive.ArchiveTableHelper; import org.opencb.opencga.storage.hadoop.variant.converters.HBaseToVariantConverter; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; -import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexDBAdaptor; import org.opencb.opencga.storage.hadoop.variant.index.family.MendelianErrorSampleIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexVariantBiConverter; @@ -395,25 +394,11 @@ public static void printVariants(Collection studies, VariantHadoo } printMetaTable(dbAdaptor, outDir); printSampleIndexTable(dbAdaptor, outDir); - printAnnotationIndexTable(dbAdaptor, outDir); printVariantsFromVariantsTable(dbAdaptor, outDir); printVariantsFromDBAdaptor(dbAdaptor, outDir); HBaseToVariantConverter.setFailOnWrongVariants(old); } - private static void printAnnotationIndexTable(VariantHadoopDBAdaptor dbAdaptor, Path outDir) throws IOException { - String tableName = dbAdaptor.getTableNameGenerator().getAnnotationIndexTableName(); - if (dbAdaptor.getHBaseManager().tableExists(tableName)) { - AnnotationIndexDBAdaptor annotationIndexDBAdaptor = new AnnotationIndexDBAdaptor(dbAdaptor.getHBaseManager(), tableName); - - try (PrintStream out = new PrintStream(new FileOutputStream(outDir.resolve("annotation_index.txt").toFile()))) { - annotationIndexDBAdaptor.iterator().forEachRemaining(pair -> { - out.println(pair.getKey() + " -> " + pair.getValue()); - }); - } - } - } - private static void printVcf(StudyMetadata studyMetadata, VariantHadoopDBAdaptor dbAdaptor, Path outDir) throws IOException { try (OutputStream os = new FileOutputStream(outDir.resolve("variant." + studyMetadata.getName() + ".vcf").toFile())) { Query query = new Query(VariantQueryParam.STUDY.key(), studyMetadata.getName()).append(VariantQueryParam.UNKNOWN_GENOTYPE.key(), "."); From 6ab6706eab9d39c483a7718aa4e81eeb32cd77b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 12 Mar 2021 16:53:31 +0000 Subject: [PATCH 082/412] analysis: Fix filter by lof in Knockout. Add useful logs. --- .../variant/knockout/KnockoutAnalysis.java | 6 ++- .../KnockoutLocalAnalysisExecutor.java | 54 +++++++++++++------ .../core/variant/query/VariantQueryUtils.java | 14 +++-- 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index de8e84681cc..cf89294f394 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -88,9 +88,11 @@ protected void check() throws Exception { } } - if (StringUtils.isEmpty(analysisParams.getConsequenceType())) { - analysisParams.setConsequenceType(VariantQueryUtils.LOF); + String ct = analysisParams.getConsequenceType(); + if (StringUtils.isEmpty(ct)) { + ct = VariantQueryUtils.LOF; } + analysisParams.setConsequenceType(String.join(",", VariantQueryUtils.parseConsequenceTypes(ct))); super.check(); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index cc5427bb4c6..ee5de129df0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -24,6 +24,7 @@ import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.*; +import org.opencb.commons.ProgressLogger; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -38,7 +39,6 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.core.tools.annotations.ToolExecutor; -import org.opencb.opencga.storage.core.io.plain.StringDataReader; import org.opencb.opencga.storage.core.metadata.models.Trio; import org.opencb.opencga.storage.core.variant.adaptors.GenotypeClass; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; @@ -48,7 +48,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -168,6 +167,7 @@ protected void processSample(String sample) throws Exception { // Protein coding genes (if any) if (allProteinCoding) { // All protein coding genes + logger.info("Get knockout from ALL protein coding genes"); Query query = new Query(baseQuery) .append(VariantQueryParam.ANNOT_BIOTYPE.key(), PROTEIN_CODING) .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sample) @@ -264,6 +264,8 @@ private void knockouts(Query query, String sample, Trio trio, Map { + int numVariants = iterate(query, "Read " + KnockoutVariant.KnockoutType.HOM_ALT + " variants: ", v -> { StudyEntry studyEntry = v.getStudies().get(0); SampleEntry sampleEntry = studyEntry.getSample(0); FileEntry fileEntry = studyEntry.getFiles().get(sampleEntry.getFileIndex()); @@ -292,7 +294,7 @@ protected void homAltKnockouts(String sample, } } }); - logger.debug("Read {} HOM_ALT variants from sample {}", numVariants, sample); + logger.info("Read {} HOM_ALT variants from sample {}", numVariants, sample); } protected void multiAllelicKnockouts(String sample, @@ -308,7 +310,7 @@ protected void multiAllelicKnockouts(String sample, .append(VariantQueryParam.GENOTYPE.key(), sample + IS + "1/2"); Map variants = new HashMap<>(); - iterate(query, variant -> { + int numVariants = iterate(query, "Read " + KnockoutVariant.KnockoutType.HET_ALT + " variants: ", variant -> { Variant secVar = getSecondaryVariant(variant); StudyEntry studyEntry = variant.getStudies().get(0); SampleEntry sampleEntry = studyEntry.getSample(0); @@ -355,6 +357,7 @@ protected void multiAllelicKnockouts(String sample, } } }); + logger.info("Read {} HET_ALT variants from sample {}", numVariants, sample); } protected void compHetKnockouts(String sample, Trio family, @@ -372,7 +375,7 @@ protected void compHetKnockouts(String sample, Trio family, .append(VariantQueryParam.INCLUDE_SAMPLE.key(), family.toList()) .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT"); - int numVariants = iterate(query, v -> { + int numVariants = iterate(query, "Read " + KnockoutVariant.KnockoutType.COMP_HET + " variants: ", v -> { StudyEntry studyEntry = v.getStudies().get(0); SampleEntry sampleEntry = studyEntry.getSample(0); FileEntry fileEntry = studyEntry.getFiles().get(sampleEntry.getFileIndex()); @@ -384,7 +387,7 @@ protected void compHetKnockouts(String sample, Trio family, } } }); - logger.debug("Read " + numVariants + " COMP_HET variants from sample " + sample); + logger.info("Read " + numVariants + " COMP_HET variants from sample " + sample); } protected void structuralKnockouts(String sample, @@ -401,7 +404,7 @@ protected void structuralKnockouts(String sample, // Set cts = new HashSet<>(LOF_SET); // cts.add(VariantAnnotationUtils.FEATURE_TRUNCATION); - iterate(query, svVariant -> { + int numVariants = iterate(query, "Read " + KnockoutVariant.KnockoutType.DELETION_OVERLAP + " variants: ", svVariant -> { VariantAnnotation svAnnotation = svVariant.getAnnotation(); Set transcripts = new HashSet<>(svAnnotation.getConsequenceTypes().size()); for (ConsequenceType consequenceType : svAnnotation.getConsequenceTypes()) { @@ -442,6 +445,7 @@ protected void structuralKnockouts(String sample, } }); }); + logger.info("Read {} DELETION_OVERLAP variants from sample {}", numVariants, sample); } } @@ -490,7 +494,7 @@ private void knockoutGene(Query baseQuery, String gene, Predicate ctFilt Query query = new Query(baseQuery) .append(VariantQueryParam.INCLUDE_SAMPLE.key(), VariantQueryUtils.NONE) .append(VariantQueryParam.INCLUDE_FILE.key(), VariantQueryUtils.NONE); - int numVariants = iterate(query, new QueryOptions(VariantField.SUMMARY, true), v -> { + int numVariants = iterate(query, new QueryOptions(VariantField.SUMMARY, true), "Read variants", v -> { int limit = 1000; int skip = 0; int numSamples; @@ -622,7 +626,7 @@ private void multiAllelicKnockout(Query baseQuery, KnockoutByGene knockout, Stri .append(VariantQueryParam.GENOTYPE.key(), sampleId + IS + "1/2"); Map variants = new HashMap<>(); - iterate(query, variant -> { + iterate(query, "Read " + KnockoutVariant.KnockoutType.HET_ALT + " variants: ", variant -> { StudyEntry studyEntry = variant.getStudies().get(0); SampleEntry sampleEntry = studyEntry.getSample(0); FileEntry fileEntry = studyEntry.getFiles().get(sampleEntry.getFileIndex()); @@ -682,7 +686,7 @@ protected void structuralKnockouts(Query baseQuery, KnockoutByGene knockout, Str KnockoutByGene.KnockoutIndividual knockoutIndividual = knockout.getIndividualBySampleId(sampleId); - iterate(query, svVariant -> { + iterate(query, "Read " + KnockoutVariant.KnockoutType.DELETION_OVERLAP + " variants: ", svVariant -> { Set transcripts = new HashSet<>(svVariant.getAnnotation().getConsequenceTypes().size()); for (ConsequenceType consequenceType : svVariant.getAnnotation().getConsequenceTypes()) { if (validCt(consequenceType, ctFilter, biotypeFilter, knockout.getName()::equals)) { @@ -767,17 +771,33 @@ public interface VariantConsumer { private int iterate(Query query, VariantConsumer c) throws Exception { - return iterate(query, new QueryOptions(), c); + return iterate(query, new QueryOptions(), null, c); + } + + private int iterate(Query query, String description, VariantConsumer c) + throws Exception { + return iterate(query, new QueryOptions(), description, c); } - private int iterate(Query query, QueryOptions queryOptions, VariantConsumer c) + private int iterate(Query query, QueryOptions queryOptions, String description, VariantConsumer c) throws Exception { - int numVariants; - try (VariantDBIterator iterator = variantStorageManager.iterator(query, queryOptions, getToken())) { + int numVariants = 0; + ProgressLogger progressLogger; + if (description != null) { + progressLogger = new ProgressLogger(description).setBatchSize(500); + } else { + progressLogger = null; + } + logger.info("Iterate with query : " + VariantQueryUtils.printQuery(query)); + try (VariantDBIterator iterator = variantStorageManager.iterator(new Query(query), queryOptions, getToken())) { while (iterator.hasNext()) { - c.accept(iterator.next()); + Variant variant = iterator.next(); + c.accept(variant); + numVariants++; + if (progressLogger != null) { + progressLogger.increment(1, () -> "up to variant " + variant); + } } - numVariants = iterator.getCount(); } return numVariants; } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java index 6ac1a221415..a52c0496c37 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java @@ -24,7 +24,6 @@ import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.ListUtils; import org.opencb.opencga.core.api.ParamConstants; @@ -34,6 +33,7 @@ import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.opencga.storage.core.variant.query.projection.VariantQueryProjectionParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -940,8 +940,16 @@ public static QueryOperation parseGenotypeFilter(String sampleGenotypes, Map parseConsequenceTypes(String cts) { + if (StringUtils.isEmpty(cts)) { + return new ArrayList<>(); + } else { + return parseConsequenceTypes(Arrays.asList(cts.split(","))); + } + } + public static List parseConsequenceTypes(List cts) { - List parsedCts = new ArrayList<>(cts.size()); + Set parsedCts = new LinkedHashSet<>(cts.size()); for (String ct : cts) { if (ct.equalsIgnoreCase(LOF)) { parsedCts.addAll(VariantQueryUtils.LOF_SET); @@ -949,7 +957,7 @@ public static List parseConsequenceTypes(List cts) { parsedCts.add(ConsequenceTypeMappings.accessionToTerm.get(VariantQueryUtils.parseConsequenceType(ct))); } } - return parsedCts; + return new ArrayList<>(parsedCts); } public static int parseConsequenceType(String so) { From 80fc9cdaa3d3279f1a4205257c262b59f7e0fc6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 12 Mar 2021 18:10:15 +0000 Subject: [PATCH 083/412] storage: Fix SampleIndexDriver MR #1699 --- .../storage/core/io/bit/BitBuffer.java | 17 +++++ .../hadoop/variant/index/IndexUtils.java | 10 +++ .../variant/index/sample/FileIndexSchema.java | 10 ++- .../index/sample/SampleIndexDriver.java | 65 +++++++++++++------ .../sample/SampleIndexEntryPutBuilder.java | 5 +- .../index/sample/SampleVariantIndexEntry.java | 22 ++++--- .../sample/VariantFileIndexConverter.java | 19 ++++-- .../SampleIndexEntryPutBuilderTest.java | 19 ++++-- .../variant/index/sample/SampleIndexTest.java | 11 +++- 9 files changed, 132 insertions(+), 46 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitBuffer.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitBuffer.java index 1e7e88c2bc5..7cde140e85d 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitBuffer.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitBuffer.java @@ -8,6 +8,23 @@ public class BitBuffer { private final int bitOffset; private final int bitLength; + public BitBuffer(BitBuffer copy) { + if (copy.getBitOffset() == 0) { + bitOffset = copy.bitOffset; + bitLength = copy.bitLength; + int bytes = bitsToBytes(copy.bitLength); + buffer = new byte[bytes]; + System.arraycopy(copy.buffer, 0, buffer, 0, bytes); + } else { + bitOffset = copy.bitOffset % Byte.SIZE; + bitLength = copy.bitLength; + int extraBytesOffset = (copy.bitOffset - bitOffset) / Byte.SIZE; + int bytesLength = bitsToBytes(copy.bitLength + bitOffset); + buffer = new byte[bytesLength]; + System.arraycopy(copy.buffer, extraBytesOffset, buffer, 0, buffer.length); + } + } + public BitBuffer(int bitLength) { this(new byte[bitsToBytes(bitLength)], 0, bitLength); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java index 19524a70024..3f754536198 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java @@ -23,6 +23,16 @@ public static String byteToString(byte b) { return binaryToString(b, Byte.SIZE); } + public static String bytesToString(byte[] bytes) { + StringBuilder sb = new StringBuilder("[ "); + for (int i = 0; i < bytes.length; i++) { + byte b = bytes[i]; + sb.append(byteToString(b)); + sb.append(" , "); + } + return sb.append(" ]").toString(); + } + public static String shortToString(short s) { return binaryToString(s, Short.SIZE); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java index c1f94092b6f..bb89a0d3165 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java @@ -13,12 +13,14 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class FileIndexSchema extends IndexSchema { private final List> fixedFields; private final List> customFields; + private final List> customFieldsSourceSample; private final IndexField multiFileIndex; private final IndexField typeIndex; private final IndexField filePositionIndex; @@ -52,10 +54,12 @@ public FileIndexSchema(List customFieldConfigurations, typeIndex); } - this.fields = new ArrayList<>(fixedFields.size() + customFields.size()); this.fields.addAll(fixedFields); this.fields.addAll(customFields); + customFieldsSourceSample = customFields.stream() + .filter(c -> c.getSource().equals(IndexFieldConfiguration.Source.SAMPLE)) + .collect(Collectors.toList()); updateIndexSizeBits(); } @@ -72,6 +76,10 @@ public List> getCustomFields() { return customFields; } + public List> getCustomFieldsSourceSample() { + return customFieldsSourceSample; + } + public IndexField getMultiFileIndex() { return multiFileIndex; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java index 79287d0e396..4b5da6d6523 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java @@ -79,6 +79,7 @@ public class SampleIndexDriver extends AbstractVariantsTableDriver { private static final String SAMPLE_ID_TO_FILE_ID_MAP = "SampleIndexDriver.sampleIdToFileIdMap"; private static final String MULTI_FILE_SAMPLES = "SampleIndexDriver.multiFileSamples"; private static final String FIXED_ATTRIBUTES = "SampleIndexDriver.fixedAttributes"; + private static final String FIXED_SAMPLE_DATA_KEYS = "SampleIndexDriver.fixedSampleDataKeys"; private static final String PARTIAL_SCAN = "SampleIndexDriver.partial_scan"; private int study; @@ -93,6 +94,7 @@ public class SampleIndexDriver extends AbstractVariantsTableDriver { private String region; private double partialScanSize; private List fixedAttributes; + private List fixedFormat; private boolean multiScan = false; private int maxColumns; @@ -195,7 +197,7 @@ protected void parseAndValidateParameters() throws IOException { StudyMetadata studyMetadata = metadataManager.getStudyMetadata(study); fixedAttributes = HBaseToVariantConverter.getFixedAttributes(studyMetadata); - List fixedFormat = HBaseToVariantConverter.getFixedFormat(studyMetadata); + fixedFormat = HBaseToVariantConverter.getFixedFormat(studyMetadata); hasGenotype = fixedFormat.contains(VCFConstants.GENOTYPE_KEY); if (hasGenotype) { @@ -320,6 +322,7 @@ protected Job setupJob(Job job, String archiveTable, String table) throws IOExce job.getConfiguration().set(SAMPLE_ID_TO_FILE_ID_MAP, sb.toString()); job.getConfiguration().set(MULTI_FILE_SAMPLES, multiFileSamples.stream().map(Object::toString).collect(Collectors.joining(","))); job.getConfiguration().set(FIXED_ATTRIBUTES, String.join(",", fixedAttributes)); + job.getConfiguration().set(FIXED_SAMPLE_DATA_KEYS, String.join(",", fixedFormat)); if (allSamples) { job.getConfiguration().unset(SAMPLES); } else { @@ -357,6 +360,7 @@ public static class SampleIndexerMapper extends VariantTableSampleIndexOrderMapp private Set samplesToCount; private VariantFileIndexConverter fileIndexConverter; private List fixedAttributes; + private Map sampleDataKeyPositions; private final Map samples = new HashMap<>(); private final Set files = new HashSet<>(); private boolean hasGenotype; @@ -391,6 +395,15 @@ protected void setup(Context context) throws IOException, InterruptedException { } else { fixedAttributes = Collections.emptyList(); } + strings = context.getConfiguration().getStrings(FIXED_SAMPLE_DATA_KEYS); + if (strings == null) { + throw new IllegalStateException("Missing " + FIXED_SAMPLE_DATA_KEYS); + } else { + sampleDataKeyPositions = new HashMap<>(); + for (int i = 0; i < strings.length; i++) { + sampleDataKeyPositions.put(strings[i], i); + } + } String s = context.getConfiguration().get(SAMPLE_ID_TO_FILE_ID_MAP); for (String sampleFiles : s.split(",")) { if (!sampleFiles.isEmpty()) { @@ -427,7 +440,8 @@ protected void map(ImmutableBytesWritable key, Result result, Context context) t } Map fileAttributes = HBaseToStudyEntryConverter.convertFileAttributes(fileColumn.raw(), fixedAttributes); - BitBuffer fileIndexValue = fileIndexConverter.createFileIndexValue(variant.getType(), 0, fileAttributes, null); + BitBuffer fileIndexValue = fileIndexConverter.createFileIndexValue(variant.getType(), 0, fileAttributes, + Collections.emptyMap(), Collections.emptyList()); fileIndexMap.put(fileColumn.getFileId(), fileIndexValue); }); @@ -478,28 +492,18 @@ protected void map(ImmutableBytesWritable key, Result result, Context context) t BitBuffer fileIndex = fileIndexMap.get(fileId); if (fileIndex != null) { fileFound = true; - if (filePosition > 0) { - FileIndexSchema.setFilePosition(fileIndex, filePosition); - } - builder.add(gt, new SampleVariantIndexEntry(variant, fileIndex)); - if (samplesToCount.contains(sampleId)) { - switch (gt) { - case "1/1": - case "0/1": - case "1/2": - case "1/3": - case "0|1": - case "1|0": - case "1|1": - context.getCounter(COUNTER_GROUP_NAME, "SAMPLE_" + sampleId + "_" + gt).increment(1); - break; - default: - context.getCounter(COUNTER_GROUP_NAME, "SAMPLE_" + sampleId + "_x/x").increment(1); - break; - } + // Copy bit buffer + BitBuffer sampleFileIndex = new BitBuffer(fileIndex); + fileIndexConverter.addSampleDataIndexValues(sampleFileIndex, sampleDataKeyPositions, + sampleColumn::getSampleData); + if (filePosition >= 0) { + schema.getFileIndex().getFilePositionIndex().write(filePosition, sampleFileIndex); } + builder.add(gt, new SampleVariantIndexEntry(variant, sampleFileIndex)); + countSampleGt(context, sampleId, gt); } } + if (!fileFound) { throw new IllegalStateException("File " + files + " not found for sample " + sampleId + " in variant " + variant); } @@ -508,6 +512,25 @@ protected void map(ImmutableBytesWritable key, Result result, Context context) t } + private void countSampleGt(Context context, int sampleId, String gt) { + if (samplesToCount.contains(sampleId)) { + switch (gt) { + case "1/1": + case "0/1": + case "1/2": + case "1/3": + case "0|1": + case "1|0": + case "1|1": + context.getCounter(COUNTER_GROUP_NAME, "SAMPLE_" + sampleId + "_" + gt).increment(1); + break; + default: + context.getCounter(COUNTER_GROUP_NAME, "SAMPLE_" + sampleId + "_x/x").increment(1); + break; + } + } + } + @Override public void flush(Context context, String chromosome, int position) throws IOException, InterruptedException { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java index aafb41ac351..a39a6d7f7ce 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilder.java @@ -46,9 +46,8 @@ public SampleIndexEntryPutBuilder(int sampleId, String chromosome, int position, } } - public SampleIndexEntryPutBuilder add(String gt, SampleVariantIndexEntry variantIndexEntry) { - get(gt).add(variantIndexEntry); - return this; + public boolean add(String gt, SampleVariantIndexEntry variantIndexEntry) { + return get(gt).add(variantIndexEntry); } private SampleIndexGtEntryBuilder get(String gt) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java index 21c5b7d5a86..b80c98cb8bd 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java @@ -100,16 +100,22 @@ public SampleVariantIndexEntryComparator(SampleIndexSchema schema) { @Override public int compare(SampleVariantIndexEntry o1, SampleVariantIndexEntry o2) { int compare = INTRA_CHROMOSOME_VARIANT_COMPARATOR.compare(o1.variant, o2.variant); - if (compare == 0) { - if (schema.getFileIndex().isMultiFile(o1.fileIndex)) { - return -1; - } else if (schema.getFileIndex().isMultiFile(o2.fileIndex)) { - return 1; - } else { - return o1.fileIndex.compareTo(o2.fileIndex); + if (compare != 0) { + return compare; + } + if (schema.getFileIndex().isMultiFile(o1.fileIndex)) { + return -1; + } else if (schema.getFileIndex().isMultiFile(o2.fileIndex)) { + return 1; + } else { + int filePosition1 = schema.getFileIndex().getFilePositionIndex().read(o1.fileIndex); + int filePosition2 = schema.getFileIndex().getFilePositionIndex().read(o2.fileIndex); + compare = Integer.compare(filePosition1, filePosition2); + if (compare != 0) { + return compare; } + return o1.fileIndex.compareTo(o2.fileIndex); } - return compare; } } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java index 71452168aee..100eb694f5e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.Map; +import java.util.function.IntFunction; public class VariantFileIndexConverter { @@ -38,11 +39,6 @@ public BitBuffer createFileIndexValue(int sampleIdx, int filePosition, Variant v study.getSampleDataKeyPositions(), study.getSampleData(sampleIdx)); } - @Deprecated - public BitBuffer createFileIndexValue(VariantType type, int filePosition, Map fileAttributes, String dpStr) { - throw new UnsupportedOperationException("Deprecated method"); - } - /** * Create the FileIndex value for this specific sample and variant. * @@ -84,6 +80,19 @@ public BitBuffer createFileIndexValue(VariantType type, int filePosition, Map sampleDataKeyPositions, + IntFunction sampleData) { + for (IndexField fileDataIndexField : fileIndex.getCustomFieldsSourceSample()) { + String key = fileDataIndexField.getKey(); + Integer position = sampleDataKeyPositions.get(key); + if (position != null) { + String value = sampleData.apply(position); + fileDataIndexField.write(value, bitBuffer); + } + } + return bitBuffer; + } + private int getDp(Map fileAttributes, String dpStr) { int dp; if (StringUtils.isEmpty(dpStr)) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java index df2f35f9eb7..0f98742c22e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryPutBuilderTest.java @@ -10,6 +10,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.opencb.biodata.models.variant.avro.VariantType.INDEL; import static org.opencb.biodata.models.variant.avro.VariantType.SNV; public class SampleIndexEntryPutBuilderTest { @@ -44,15 +45,19 @@ public void testBuild() { SampleIndexSchema schema = SampleIndexSchema.defaultSampleIndexSchema(); VariantFileIndexConverter c = new VariantFileIndexConverter(schema); - Put build = new SampleIndexEntryPutBuilder(1, "1", 10, schema) - .add("0/1", new SampleVariantIndexEntry(new Variant("1:100:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) - .add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 1, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) - .add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) - .add("1/1", new SampleVariantIndexEntry(new Variant("1:300:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) - .add("1/1", new SampleVariantIndexEntry(new Variant("1:400:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))) - .build(); + SampleIndexEntryPutBuilder builder = new SampleIndexEntryPutBuilder(1, "1", 10, schema); + assertTrue(builder.add("0/1", new SampleVariantIndexEntry(new Variant("1:100:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList())))); + assertTrue(builder.add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 1, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList())))); + assertTrue(builder.add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList())))); + assertTrue(builder.add("1/1", new SampleVariantIndexEntry(new Variant("1:300:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList())))); + assertTrue(builder.add("1/1", new SampleVariantIndexEntry(new Variant("1:400:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList())))); + assertFalse(builder.add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(SNV, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList())))); + assertTrue(builder.add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(INDEL, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList())))); + assertFalse(builder.add("0/1", new SampleVariantIndexEntry(new Variant("1:200:A:C"), c.createFileIndexValue(INDEL, 0, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList())))); + + Put build = builder.build(); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java index 8ab8338183d..f779812dbfd 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java @@ -48,6 +48,7 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import java.util.stream.IntStream; import static java.util.stream.Collectors.*; import static org.junit.Assert.*; @@ -232,7 +233,15 @@ public void regenerateSampleIndex() throws Exception { assertEquals(row, origFamily.size(), copyFamily.size()); for (byte[] key : origFamily.keySet()) { - assertArrayEquals(row + " " + Bytes.toString(key), origFamily.get(key), copyFamily.get(key)); + byte[] expecteds = origFamily.get(key); + byte[] actuals = copyFamily.get(key); + try { + assertArrayEquals(row + " " + Bytes.toString(key), expecteds, actuals); + } catch (AssertionError error) { + System.out.println("Expected " + IndexUtils.bytesToString(expecteds)); + System.out.println("actuals " + IndexUtils.bytesToString(actuals)); + throw error; + } } } } From 73e2e66c6fa7683b1a1959f43b8040855b415a12 Mon Sep 17 00:00:00 2001 From: imedina Date: Sun, 14 Mar 2021 23:53:41 +0000 Subject: [PATCH 084/412] Fix style compilation issue --- .../opencga/master/monitor/daemons/ExecutionDaemon.java | 3 ++- .../metadata/VariantSourceToVariantFileMetadataConverter.java | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index 592c020a660..d83e1288158 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -596,7 +596,8 @@ protected void checkToolExecutionPermission(Job job) throws Exception { List studiesToValidate; if (tool.scope() == Tool.Scope.PROJECT) { - String projectFqn = job.getStudy().getId().substring(0, job.getStudy().getId().indexOf(ParamConstants.PROJECT_STUDY_SEPARATOR)); + String projectFqn = job.getStudy().getId() + .substring(0, job.getStudy().getId().indexOf(ParamConstants.PROJECT_STUDY_SEPARATOR)); studiesToValidate = catalogManager.getStudyManager().search(projectFqn, new Query(), new QueryOptions(QueryOptions.INCLUDE, Arrays.asList(StudyDBAdaptor.QueryParams.GROUPS.key(), StudyDBAdaptor.QueryParams.FQN.key())), token).getResults(); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantSourceToVariantFileMetadataConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantSourceToVariantFileMetadataConverter.java index 02573c64587..1406be2bf53 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantSourceToVariantFileMetadataConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantSourceToVariantFileMetadataConverter.java @@ -25,10 +25,6 @@ public class VariantSourceToVariantFileMetadataConverter implements Converter Date: Mon, 15 Mar 2021 11:14:52 +0000 Subject: [PATCH 085/412] storage: Move org.opencb.opencga.storage.core.config to org.opencb.opencga.core.config.storage #1699 --- .../opencb/opencga/analysis/ConfigurationUtils.java | 2 +- .../org/opencb/opencga/analysis/StorageManager.java | 2 +- .../ClinicalInterpretationAnalysisExecutor.java | 2 +- .../analysis/clinical/InterpretationAnalysis.java | 2 +- .../opencga/analysis/clinical/rga/RgaManager.java | 2 +- .../opencb/opencga/analysis/tools/OpenCgaTool.java | 2 +- .../analysis/clinical/ClinicalAnalysisUtilsTest.java | 2 +- .../variant/OpenCGATestExternalResource.java | 2 +- .../analysis/variant/VariantAnalysisTest.java | 2 +- .../AbstractVariantOperationManagerTest.java | 4 ++-- .../org/opencb/opencga/app/cli/CommandExecutor.java | 2 +- .../migration/NewVariantMetadataMigration.java | 4 ++-- .../migration/storage/AbstractStorageMigrator.java | 2 +- .../storage/NewProjectMetadataMigration.java | 2 +- .../migration/storage/NewStudyMetadata.java | 2 +- .../opencga/client/rest/WorkEnvironmentTest.java | 2 +- .../opencga/core/config/ConfigurationOption.java | 12 ++++++++++++ .../core/config/storage}/BenchmarkConfiguration.java | 2 +- .../core/config/storage}/CacheConfiguration.java | 2 +- .../core/config/storage}/CellBaseConfiguration.java | 2 +- .../core/config/storage}/IOConfiguration.java | 2 +- .../config/storage}/IndexFieldConfiguration.java | 2 +- .../config/storage}/SampleIndexConfiguration.java | 2 +- .../core/config/storage}/StorageConfiguration.java | 2 +- .../config/storage}/StorageEngineConfiguration.java | 2 +- .../config/storage}/StorageEnginesConfiguration.java | 2 +- .../opencga/core/models/study/StudyInternal.java | 1 + .../opencb/opencga/server/AbstractStorageServer.java | 2 +- .../opencb/opencga/server/grpc/AdminGrpcService.java | 2 +- .../opencga/server/grpc/AlignmentGrpcService.java | 2 +- .../opencga/server/grpc/GenericGrpcService.java | 2 +- .../org/opencb/opencga/server/grpc/GrpcServer.java | 2 +- .../opencga/server/grpc/VariantGrpcService.java | 2 +- .../opencb/opencga/server/rest/OpenCGAWSServer.java | 2 +- .../opencga/storage/app/cli/CommandExecutor.java | 2 +- .../cli/client/executors/VariantCommandExecutor.java | 2 +- .../cli/server/executors/GrpcCommandExecutor.java | 2 +- .../cli/server/executors/RestCommandExecutor.java | 2 +- .../opencga/storage/benchmark/BenchmarkRunner.java | 2 +- .../benchmark/variant/VariantBenchmarkRunner.java | 2 +- .../opencb/opencga/storage/core/StorageEngine.java | 2 +- .../opencga/storage/core/StorageEngineFactory.java | 2 +- .../core/alignment/AlignmentStorageEngine.java | 2 +- .../core/alignment/AlignmentStorageOptions.java | 2 +- .../opencga/storage/core/cache/CacheManager.java | 4 ++-- .../storage/core/clinical/ClinicalVariantEngine.java | 2 +- .../storage/core/config/ConfigurationOption.java | 8 -------- .../core/io/managers/IOConnectorProvider.java | 6 +++--- .../storage/core/metadata/models/StudyMetadata.java | 2 +- .../opencb/opencga/storage/core/rga/RgaEngine.java | 2 +- .../storage/core/variant/VariantStorageEngine.java | 2 +- .../storage/core/variant/VariantStorageOptions.java | 2 +- .../storage/core/variant/VariantStoragePipeline.java | 2 +- .../annotators/AbstractCellBaseVariantAnnotator.java | 2 +- .../annotators/CellBaseRestVariantAnnotator.java | 2 +- .../annotation/annotators/VariantAnnotator.java | 2 +- .../annotators/VariantAnnotatorFactory.java | 2 +- .../AbstractSearchIndexVariantQueryExecutor.java | 2 +- .../SamplesSearchIndexVariantQueryExecutor.java | 2 +- .../search/SearchIndexVariantQueryExecutor.java | 2 +- .../variant/search/solr/VariantSearchManager.java | 2 +- .../adaptors/DefaultAlignmentDBAdaptorTest.java | 2 +- .../core/config/StorageConfigurationTest.java | 2 ++ .../opencga/storage/core/rga/RgaEngineTest.java | 2 +- .../storage/core/rga/RgaSolrExtenalResource.java | 2 +- .../core/variant/annotation/DummyTestAnnotator.java | 2 +- .../annotation/annotators/VariantAnnotatorTest.java | 2 +- .../variant/dummy/DummyVariantStorageEngine.java | 2 +- .../variant/dummy/DummyVariantStoragePipeline.java | 2 +- .../core/variant/dummy/DummyVariantStorageTest.java | 4 ++-- .../HadoopLocalLoadVariantStoragePipeline.java | 2 +- .../variant/HadoopMRLoadVariantStoragePipeline.java | 2 +- .../hadoop/variant/HadoopVariantStorageEngine.java | 4 ++-- .../hadoop/variant/HadoopVariantStorageOptions.java | 2 +- .../hadoop/variant/HadoopVariantStoragePipeline.java | 2 +- .../variant/adaptors/VariantHadoopDBAdaptor.java | 2 +- .../annotation/mr/AnalysisAnnotateMapper.java | 2 +- .../index/annotation/AnnotationIndexConverter.java | 2 +- .../annotation/PopulationFrequencyIndexSchema.java | 2 +- .../mr/SampleIndexAnnotationLoaderDriver.java | 2 +- .../variant/index/core/CategoricalIndexField.java | 2 +- .../index/core/CategoricalMultiValuedIndexField.java | 2 +- .../hadoop/variant/index/core/IndexField.java | 2 +- .../hadoop/variant/index/core/IndexSchema.java | 2 +- .../hadoop/variant/index/core/RangeIndexField.java | 2 +- .../variant/index/query/SampleFileIndexQuery.java | 2 +- .../hadoop/variant/index/sample/FileIndexSchema.java | 4 ++-- .../index/sample/SampleIndexAnnotationLoader.java | 2 +- .../variant/index/sample/SampleIndexDBAdaptor.java | 2 +- .../variant/index/sample/SampleIndexQueryParser.java | 4 ++-- .../variant/index/sample/SampleIndexSchema.java | 2 +- .../index/sample/VariantFileIndexConverter.java | 2 +- .../hadoop/variant/mr/VariantMapReduceUtil.java | 4 ++-- .../hadoop/variant/HadoopVariantStorageTest.java | 4 ++-- .../annotation/AnnotationIndexConverterTest.java | 2 +- .../index/sample/SampleIndexEntryFilterTest.java | 4 ++-- .../index/sample/SampleIndexQueryParserTest.java | 4 ++-- .../sample/VariantFileIndexEntryConverterTest.java | 2 +- .../hadoop/variant/mr/VariantMapReduceUtilTest.java | 3 +-- .../variant/MongoDBVariantStorageOptions.java | 2 +- .../variant/MongoDBVariantStoragePipeline.java | 2 +- .../variant/adaptors/VariantMongoDBAdaptor.java | 4 ++-- .../mongodb/variant/MongoDBVariantStorageTest.java | 2 +- .../storage/server/common/AbstractStorageServer.java | 2 +- .../storage/server/grpc/AdminGrpcService.java | 2 +- .../storage/server/grpc/GenericGrpcService.java | 2 +- .../storage/server/grpc/GrpcStorageServer.java | 2 +- .../storage/server/grpc/VariantGrpcService.java | 2 +- .../storage/server/rest/GenericRestWebService.java | 2 +- .../storage/server/rest/RestStorageServer.java | 2 +- 110 files changed, 135 insertions(+), 129 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/config/ConfigurationOption.java rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config => opencga-core/src/main/java/org/opencb/opencga/core/config/storage}/BenchmarkConfiguration.java (98%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config => opencga-core/src/main/java/org/opencb/opencga/core/config/storage}/CacheConfiguration.java (98%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config => opencga-core/src/main/java/org/opencb/opencga/core/config/storage}/CellBaseConfiguration.java (98%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config => opencga-core/src/main/java/org/opencb/opencga/core/config/storage}/IOConfiguration.java (96%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config => opencga-core/src/main/java/org/opencb/opencga/core/config/storage}/IndexFieldConfiguration.java (98%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config => opencga-core/src/main/java/org/opencb/opencga/core/config/storage}/SampleIndexConfiguration.java (99%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config => opencga-core/src/main/java/org/opencb/opencga/core/config/storage}/StorageConfiguration.java (99%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config => opencga-core/src/main/java/org/opencb/opencga/core/config/storage}/StorageEngineConfiguration.java (96%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config => opencga-core/src/main/java/org/opencb/opencga/core/config/storage}/StorageEnginesConfiguration.java (95%) delete mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/ConfigurationOption.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ConfigurationUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ConfigurationUtils.java index 5cb06c0c27f..bc6e1dc674b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ConfigurationUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ConfigurationUtils.java @@ -18,7 +18,7 @@ import org.opencb.commons.utils.FileUtils; import org.opencb.opencga.core.config.Configuration; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/StorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/StorageManager.java index 1ebd81de4b6..fdad516220a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/StorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/StorageManager.java @@ -31,7 +31,7 @@ import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.cache.CacheManager; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationAnalysisExecutor.java index 9f7e2779b45..b93de5d90ea 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationAnalysisExecutor.java @@ -23,7 +23,7 @@ import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.exceptions.ToolExecutorException; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.IOException; import java.nio.file.Paths; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java index 4bdb6322baa..82d779555a1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java @@ -37,7 +37,7 @@ import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.clinical.Interpretation; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.IOException; import java.nio.file.Path; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java index 25ee2c83978..3798277adf3 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java @@ -14,7 +14,7 @@ import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.RgaException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.rga.RgaEngine; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java index e504bbf2b26..22fe10df648 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java @@ -42,7 +42,7 @@ import org.opencb.opencga.core.tools.result.ExecutionResultManager; import org.opencb.opencga.core.tools.result.ExecutorInfo; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalAnalysisUtilsTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalAnalysisUtilsTest.java index 016ed11fb89..47059948722 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalAnalysisUtilsTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalAnalysisUtilsTest.java @@ -28,7 +28,7 @@ import org.opencb.opencga.catalog.managers.CatalogManagerExternalResource; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.mongodb.variant.MongoDBVariantStorageEngine; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/OpenCGATestExternalResource.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/OpenCGATestExternalResource.java index 48230e60f2f..7cb1087840a 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/OpenCGATestExternalResource.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/OpenCGATestExternalResource.java @@ -27,7 +27,7 @@ import org.opencb.opencga.catalog.managers.CatalogManagerExternalResource; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.variant.VariantStorageBaseTest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java index 7aa7acb7d17..6975426d2cd 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java @@ -62,7 +62,7 @@ import org.opencb.opencga.core.tools.result.ExecutionResult; import org.opencb.opencga.core.tools.result.ExecutionResultManager; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.VariantScoreMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/AbstractVariantOperationManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/AbstractVariantOperationManagerTest.java index d57298989a1..1620fba0808 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/AbstractVariantOperationManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/AbstractVariantOperationManagerTest.java @@ -51,8 +51,8 @@ import org.opencb.opencga.core.tools.result.ExecutionResultManager; import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.StoragePipelineResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; -import org.opencb.opencga.storage.core.config.StorageEngineConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageEngineConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.core.variant.dummy.DummyVariantDBAdaptor; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/CommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/CommandExecutor.java index b31ce31f200..cddda4b6cf1 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/CommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/CommandExecutor.java @@ -27,7 +27,7 @@ import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/NewVariantMetadataMigration.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/NewVariantMetadataMigration.java index dd66c96ce67..6f2f566832b 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/NewVariantMetadataMigration.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/NewVariantMetadataMigration.java @@ -34,8 +34,8 @@ import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.auth.IllegalOpenCGACredentialsException; import org.opencb.opencga.core.config.DatabaseCredentials; -import org.opencb.opencga.storage.core.config.StorageConfiguration; -import org.opencb.opencga.storage.core.config.StorageEngineConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageEngineConfiguration; import org.opencb.opencga.storage.core.metadata.VariantSourceToVariantFileMetadataConverter; import org.opencb.opencga.storage.core.variant.io.VariantReaderUtils; import org.opencb.opencga.core.models.common.GenericRecordAvroJsonMixin; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/AbstractStorageMigrator.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/AbstractStorageMigrator.java index ff096f7c630..fd4efaf9b1d 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/AbstractStorageMigrator.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/AbstractStorageMigrator.java @@ -11,7 +11,7 @@ import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.slf4j.Logger; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/NewProjectMetadataMigration.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/NewProjectMetadataMigration.java index 3d726bac7e9..9518d193618 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/NewProjectMetadataMigration.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/NewProjectMetadataMigration.java @@ -16,7 +16,7 @@ import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.metadata.StudyConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/NewStudyMetadata.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/NewStudyMetadata.java index 57fbc02ed99..c6f30d3dd21 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/NewStudyMetadata.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/migration/storage/NewStudyMetadata.java @@ -3,7 +3,7 @@ import org.apache.solr.common.StringUtils; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.StudyConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; diff --git a/opencga-client/src/test/java/org/opencb/opencga/client/rest/WorkEnvironmentTest.java b/opencga-client/src/test/java/org/opencb/opencga/client/rest/WorkEnvironmentTest.java index 87f1f3bb769..4729431b086 100644 --- a/opencga-client/src/test/java/org/opencb/opencga/client/rest/WorkEnvironmentTest.java +++ b/opencga-client/src/test/java/org/opencb/opencga/client/rest/WorkEnvironmentTest.java @@ -23,7 +23,7 @@ import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.server.RestServer; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/ConfigurationOption.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/ConfigurationOption.java new file mode 100644 index 00000000000..83a8e137e22 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/ConfigurationOption.java @@ -0,0 +1,12 @@ +package org.opencb.opencga.core.config; + +public interface ConfigurationOption { + + String key(); + + T defaultValue(); + +// default boolean isFinal() { +// return false; +// } +} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/BenchmarkConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/BenchmarkConfiguration.java similarity index 98% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/BenchmarkConfiguration.java rename to opencga-core/src/main/java/org/opencb/opencga/core/config/storage/BenchmarkConfiguration.java index a3eb271e568..c53d8157ee6 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/BenchmarkConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/BenchmarkConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.opencb.opencga.storage.core.config; +package org.opencb.opencga.core.config.storage; import java.net.URI; import java.util.List; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/CacheConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CacheConfiguration.java similarity index 98% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/CacheConfiguration.java rename to opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CacheConfiguration.java index 354c635ffa8..9ccb619ace1 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/CacheConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CacheConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.opencb.opencga.storage.core.config; +package org.opencb.opencga.core.config.storage; /** * Created by wasim on 26/10/16. diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/CellBaseConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CellBaseConfiguration.java similarity index 98% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/CellBaseConfiguration.java rename to opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CellBaseConfiguration.java index 60c36eb043c..e95025247eb 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/CellBaseConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CellBaseConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.opencb.opencga.storage.core.config; +package org.opencb.opencga.core.config.storage; import org.apache.commons.lang3.StringUtils; import org.opencb.cellbase.client.config.ClientConfiguration; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IOConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IOConfiguration.java similarity index 96% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IOConfiguration.java rename to opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IOConfiguration.java index 66a79e7a128..3b6563b024f 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IOConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IOConfiguration.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.config; +package org.opencb.opencga.core.config.storage; import com.fasterxml.jackson.annotation.JsonProperty; import org.opencb.commons.datastore.core.ObjectMap; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IndexFieldConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java similarity index 98% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IndexFieldConfiguration.java rename to opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java index 2a6d466995b..c4ab60ad12b 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/IndexFieldConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.config; +package org.opencb.opencga.core.config.storage; import java.beans.ConstructorProperties; import java.util.Arrays; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/SampleIndexConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/SampleIndexConfiguration.java rename to opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java index 676514615b0..3c423e65fbe 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/SampleIndexConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.config; +package org.opencb.opencga.core.config.storage; import htsjdk.variant.vcf.VCFConstants; import org.opencb.biodata.models.variant.StudyEntry; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/StorageConfiguration.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageConfiguration.java rename to opencga-core/src/main/java/org/opencb/opencga/core/config/storage/StorageConfiguration.java index 976cb2823af..89157650f4f 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/StorageConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.opencb.opencga.storage.core.config; +package org.opencb.opencga.core.config.storage; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.DeserializationFeature; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageEngineConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/StorageEngineConfiguration.java similarity index 96% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageEngineConfiguration.java rename to opencga-core/src/main/java/org/opencb/opencga/core/config/storage/StorageEngineConfiguration.java index e28bfee4644..f7947ec6cb7 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageEngineConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/StorageEngineConfiguration.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.config; +package org.opencb.opencga.core.config.storage; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.config.DatabaseCredentials; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageEnginesConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/StorageEnginesConfiguration.java similarity index 95% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageEnginesConfiguration.java rename to opencga-core/src/main/java/org/opencb/opencga/core/config/storage/StorageEnginesConfiguration.java index 2af76d13e02..bf3dfbd735d 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageEnginesConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/StorageEnginesConfiguration.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.config; +package org.opencb.opencga.core.config.storage; import org.opencb.commons.datastore.core.ObjectMap; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyInternal.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyInternal.java index 9f96dca211c..0a1ec3a4656 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyInternal.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyInternal.java @@ -22,6 +22,7 @@ public class StudyInternal { private Status status; + public StudyInternal() { } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/AbstractStorageServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/AbstractStorageServer.java index a4a360d2552..e1e880f2d47 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/AbstractStorageServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/AbstractStorageServer.java @@ -18,7 +18,7 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.opencga.core.config.Configuration; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/AdminGrpcService.java b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/AdminGrpcService.java index 9d25343ad70..34ec1de1e1d 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/AdminGrpcService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/AdminGrpcService.java @@ -19,7 +19,7 @@ import io.grpc.stub.StreamObserver; import org.opencb.biodata.models.common.protobuf.service.ServiceTypesModel; import org.opencb.opencga.core.config.Configuration; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; /** * Created by imedina on 02/01/16. diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/AlignmentGrpcService.java b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/AlignmentGrpcService.java index 0b72a165ea0..a2d167f2127 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/AlignmentGrpcService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/AlignmentGrpcService.java @@ -24,7 +24,7 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.storage.core.alignment.iterators.AlignmentIterator; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; /** diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/GenericGrpcService.java b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/GenericGrpcService.java index b0a0e6b90e9..48e6365df7a 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/GenericGrpcService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/GenericGrpcService.java @@ -23,7 +23,7 @@ import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.server.grpc.GenericServiceModel.Request; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/GrpcServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/GrpcServer.java index 6f632abc6b8..76b4c350a32 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/GrpcServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/GrpcServer.java @@ -19,7 +19,7 @@ import io.grpc.Server; import io.grpc.ServerBuilder; import org.opencb.opencga.server.AbstractStorageServer; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.slf4j.LoggerFactory; import java.nio.file.Path; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/VariantGrpcService.java b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/VariantGrpcService.java index 45ce3807ba3..247bd5a8ff0 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/grpc/VariantGrpcService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/grpc/VariantGrpcService.java @@ -25,7 +25,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.core.config.Configuration; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java index acbceb3fc1d..b1d3e4ce9fe 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java @@ -55,7 +55,7 @@ import org.opencb.opencga.server.WebServiceException; import org.opencb.opencga.server.rest.analysis.ClinicalWebService; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.variant.io.json.mixin.GenotypeJsonMixin; import org.opencb.opencga.storage.core.variant.io.json.mixin.VariantStatsJsonMixin; import org.slf4j.Logger; diff --git a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/CommandExecutor.java b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/CommandExecutor.java index 378dfa23278..a0938943c89 100644 --- a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/CommandExecutor.java +++ b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/CommandExecutor.java @@ -20,7 +20,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/client/executors/VariantCommandExecutor.java b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/client/executors/VariantCommandExecutor.java index 0af4cf3b4c6..33d5291ca66 100644 --- a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/client/executors/VariantCommandExecutor.java +++ b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/client/executors/VariantCommandExecutor.java @@ -40,7 +40,7 @@ import org.opencb.opencga.storage.app.cli.GeneralCliOptions; import org.opencb.opencga.storage.app.cli.client.options.StorageVariantCommandOptions; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageEngineConfiguration; +import org.opencb.opencga.core.config.storage.StorageEngineConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; diff --git a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/server/executors/GrpcCommandExecutor.java b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/server/executors/GrpcCommandExecutor.java index 3816545c522..c42074ebc1c 100644 --- a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/server/executors/GrpcCommandExecutor.java +++ b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/server/executors/GrpcCommandExecutor.java @@ -20,7 +20,7 @@ import io.grpc.ManagedChannelBuilder; import org.apache.commons.lang3.StringUtils; import org.opencb.opencga.storage.app.cli.server.options.ServerCommandOptions; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.server.grpc.AdminServiceGrpc; import org.opencb.opencga.storage.server.grpc.GenericServiceModel; import org.opencb.opencga.storage.server.grpc.GrpcStorageServer; diff --git a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/server/executors/RestCommandExecutor.java b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/server/executors/RestCommandExecutor.java index e2c17fbcd7c..3f77b069760 100644 --- a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/server/executors/RestCommandExecutor.java +++ b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/server/executors/RestCommandExecutor.java @@ -18,7 +18,7 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.opencga.storage.app.cli.server.options.ServerCommandOptions; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.server.rest.RestStorageServer; import org.slf4j.Logger; diff --git a/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/BenchmarkRunner.java b/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/BenchmarkRunner.java index 7ffc3df0810..80381414494 100644 --- a/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/BenchmarkRunner.java +++ b/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/BenchmarkRunner.java @@ -34,7 +34,7 @@ import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.collections.HashTree; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.*; import java.nio.file.Files; diff --git a/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/variant/VariantBenchmarkRunner.java b/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/variant/VariantBenchmarkRunner.java index d1445535332..4902ebbb89b 100644 --- a/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/variant/VariantBenchmarkRunner.java +++ b/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/variant/VariantBenchmarkRunner.java @@ -31,7 +31,7 @@ import org.opencb.opencga.storage.benchmark.variant.samplers.VariantStorageEngineDirectSampler; import org.opencb.opencga.storage.benchmark.variant.samplers.VariantStorageEngineRestSampler; import org.opencb.opencga.storage.benchmark.variant.samplers.VariantStorageEngineSampler; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.FileInputStream; import java.io.IOException; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngine.java index 7c73afc38f8..7806410b336 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngine.java @@ -17,7 +17,7 @@ package org.opencb.opencga.storage.core; import org.opencb.opencga.core.common.MemoryUsageMonitor; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.exceptions.StoragePipelineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java index 6e14d5c1153..9e3784e96a1 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java @@ -19,7 +19,7 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.opencga.storage.core.alignment.AlignmentStorageEngine; import org.opencb.opencga.storage.core.alignment.local.LocalAlignmentStorageEngine; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.slf4j.Logger; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/AlignmentStorageEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/AlignmentStorageEngine.java index 278d952c5e7..1c1fea8b2cd 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/AlignmentStorageEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/AlignmentStorageEngine.java @@ -17,7 +17,7 @@ package org.opencb.opencga.storage.core.alignment; import org.opencb.opencga.storage.core.StorageEngine; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/AlignmentStorageOptions.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/AlignmentStorageOptions.java index 8391101e289..672a7f03bca 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/AlignmentStorageOptions.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/AlignmentStorageOptions.java @@ -1,7 +1,7 @@ package org.opencb.opencga.storage.core.alignment; import org.opencb.biodata.tools.alignment.BamManager; -import org.opencb.opencga.storage.core.config.ConfigurationOption; +import org.opencb.opencga.core.config.ConfigurationOption; public enum AlignmentStorageOptions implements ConfigurationOption { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/cache/CacheManager.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/cache/CacheManager.java index 9b3cb8b1329..ce73eba48a0 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/cache/CacheManager.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/cache/CacheManager.java @@ -21,8 +21,8 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryResult; -import org.opencb.opencga.storage.core.config.CacheConfiguration; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.CacheConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.redisson.Config; import org.redisson.Redisson; import org.redisson.RedissonClient; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/clinical/ClinicalVariantEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/clinical/ClinicalVariantEngine.java index db085a658ef..4181d6608c0 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/clinical/ClinicalVariantEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/clinical/ClinicalVariantEngine.java @@ -24,7 +24,7 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.FileUtils; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.IOException; import java.nio.file.Path; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/ConfigurationOption.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/ConfigurationOption.java deleted file mode 100644 index aa05f3fde91..00000000000 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/ConfigurationOption.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.opencb.opencga.storage.core.config; - -public interface ConfigurationOption { - - String key(); - - T defaultValue(); -} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/managers/IOConnectorProvider.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/managers/IOConnectorProvider.java index dfe89d33511..819307ae24a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/managers/IOConnectorProvider.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/managers/IOConnectorProvider.java @@ -2,9 +2,9 @@ import org.apache.solr.common.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.IOConfiguration; -import org.opencb.opencga.storage.core.config.IOConfiguration.IOConnectorConfiguration; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.IOConfiguration; +import org.opencb.opencga.core.config.storage.IOConfiguration.IOConnectorConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.IOException; import java.io.InputStream; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/models/StudyMetadata.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/models/StudyMetadata.java index 8d13fb80984..90a3841aca1 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/models/StudyMetadata.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/models/StudyMetadata.java @@ -7,7 +7,7 @@ import org.opencb.biodata.models.variant.metadata.VariantFileHeaderSimpleLine; import org.opencb.biodata.tools.variant.stats.AggregationUtils; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.StudyConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index ad74d1b7bea..8e5ca9142dd 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -18,7 +18,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.RgaException; import org.opencb.opencga.storage.core.variant.search.solr.SolrNativeIterator; import org.slf4j.Logger; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageEngine.java index f016ddf6f51..06d31d328b4 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageEngine.java @@ -32,7 +32,7 @@ import org.opencb.opencga.core.response.VariantQueryResult; import org.opencb.opencga.storage.core.StorageEngine; import org.opencb.opencga.storage.core.StoragePipelineResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.exceptions.StoragePipelineException; import org.opencb.opencga.storage.core.exceptions.VariantSearchException; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageOptions.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageOptions.java index 00e8b11e2cc..a7d06ba23d2 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageOptions.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageOptions.java @@ -3,7 +3,7 @@ import org.opencb.biodata.models.variant.metadata.Aggregation; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.YesNoAuto; -import org.opencb.opencga.storage.core.config.ConfigurationOption; +import org.opencb.opencga.core.config.ConfigurationOption; public enum VariantStorageOptions implements ConfigurationOption { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java index 9c4cc1d3744..704462ca91e 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java @@ -54,7 +54,7 @@ import org.opencb.opencga.core.common.YesNoAuto; import org.opencb.opencga.core.models.common.GenericRecordAvroJsonMixin; import org.opencb.opencga.storage.core.StoragePipeline; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; import org.opencb.opencga.storage.core.io.plain.StringDataReader; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java index fae739767a6..22466be089a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java @@ -26,7 +26,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.core.common.TimeUtils; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotatorException; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java index d24de1463e7..35bcb5f0eba 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java @@ -24,7 +24,7 @@ import org.opencb.cellbase.core.result.CellBaseDataResponse; import org.opencb.cellbase.core.result.CellBaseDataResult; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotatorException; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotator.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotator.java index 8a81d978be0..94d7fce5d39 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotator.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotator.java @@ -19,7 +19,7 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotatorException; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorFactory.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorFactory.java index 56ae792480a..935b91d2832 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorFactory.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorFactory.java @@ -18,7 +18,7 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotatorException; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/AbstractSearchIndexVariantQueryExecutor.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/AbstractSearchIndexVariantQueryExecutor.java index 0706d77a3cf..1f3f0297fde 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/AbstractSearchIndexVariantQueryExecutor.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/AbstractSearchIndexVariantQueryExecutor.java @@ -1,7 +1,7 @@ package org.opencb.opencga.storage.core.variant.search; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.variant.adaptors.VariantDBAdaptor; import org.opencb.opencga.storage.core.variant.query.executors.VariantQueryExecutor; import org.opencb.opencga.storage.core.variant.search.solr.VariantSearchManager; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/SamplesSearchIndexVariantQueryExecutor.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/SamplesSearchIndexVariantQueryExecutor.java index 75c30a0c206..dc278d1e3db 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/SamplesSearchIndexVariantQueryExecutor.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/SamplesSearchIndexVariantQueryExecutor.java @@ -5,7 +5,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.exceptions.VariantSearchException; import org.opencb.opencga.storage.core.variant.adaptors.VariantDBAdaptor; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/SearchIndexVariantQueryExecutor.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/SearchIndexVariantQueryExecutor.java index a50204e49b6..e170c73205c 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/SearchIndexVariantQueryExecutor.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/SearchIndexVariantQueryExecutor.java @@ -8,7 +8,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.core.response.VariantQueryResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.exceptions.VariantSearchException; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java index cfc2b48e126..2c22f67fac0 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java @@ -47,7 +47,7 @@ import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.response.VariantQueryResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.exceptions.VariantSearchException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/alignment/adaptors/DefaultAlignmentDBAdaptorTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/alignment/adaptors/DefaultAlignmentDBAdaptorTest.java index 1fc576e70c4..f2c4db13aee 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/alignment/adaptors/DefaultAlignmentDBAdaptorTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/alignment/adaptors/DefaultAlignmentDBAdaptorTest.java @@ -22,7 +22,7 @@ import org.opencb.opencga.storage.core.alignment.AlignmentStorageEngine; import org.opencb.opencga.storage.core.alignment.AlignmentStorageOptions; import org.opencb.opencga.storage.core.alignment.local.LocalAlignmentStorageEngine; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.File; import java.io.FileOutputStream; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/config/StorageConfigurationTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/config/StorageConfigurationTest.java index 1b7890cefad..8f3dd0ff4b9 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/config/StorageConfigurationTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/config/StorageConfigurationTest.java @@ -22,6 +22,8 @@ import org.opencb.opencga.core.config.GrpcServerConfiguration; import org.opencb.opencga.core.config.RestServerConfiguration; import org.opencb.opencga.core.config.ServerConfiguration; +import org.opencb.opencga.core.config.storage.CellBaseConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.File; import java.io.FileInputStream; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java index bddb90bf4df..bcfebaebe2e 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java @@ -12,7 +12,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.IOException; import java.io.InputStream; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java index b0e1344bf55..9f08549ce14 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java @@ -9,7 +9,7 @@ import org.junit.rules.ExternalResource; import org.opencb.commons.datastore.solr.SolrManager; import org.opencb.opencga.core.common.GitRepositoryState; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import java.io.File; import java.io.IOException; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/DummyTestAnnotator.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/DummyTestAnnotator.java index f629ca0150a..ef3abec441a 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/DummyTestAnnotator.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/DummyTestAnnotator.java @@ -5,7 +5,7 @@ import org.opencb.biodata.models.variant.avro.ConsequenceType; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.variant.annotation.annotators.VariantAnnotator; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorTest.java index 571e5af81b2..fd555238d84 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorTest.java @@ -9,7 +9,7 @@ import org.opencb.cellbase.core.result.CellBaseDataResult; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.storage.core.StorageEngine; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotatorException; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStorageEngine.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStorageEngine.java index b36efa9e023..4636b860505 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStorageEngine.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStorageEngine.java @@ -19,7 +19,7 @@ import org.opencb.biodata.models.variant.metadata.VariantMetadata; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.StudyConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStoragePipeline.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStoragePipeline.java index 37a12af0196..d9153c37b59 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStoragePipeline.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStoragePipeline.java @@ -21,7 +21,7 @@ import org.opencb.commons.ProgressLogger; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.common.UriUtils; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; import org.opencb.opencga.storage.core.metadata.models.TaskMetadata; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStorageTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStorageTest.java index 8f213ca104b..7db11c1851d 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStorageTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/dummy/DummyVariantStorageTest.java @@ -1,8 +1,8 @@ package org.opencb.opencga.storage.core.variant.dummy; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.StorageConfiguration; -import org.opencb.opencga.storage.core.config.StorageEngineConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageEngineConfiguration; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.opencb.opencga.storage.core.variant.VariantStorageTest; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopLocalLoadVariantStoragePipeline.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopLocalLoadVariantStoragePipeline.java index ceea90a0522..68e8b9c5046 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopLocalLoadVariantStoragePipeline.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopLocalLoadVariantStoragePipeline.java @@ -33,7 +33,7 @@ import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.common.YesNoAuto; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopMRLoadVariantStoragePipeline.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopMRLoadVariantStoragePipeline.java index 34c6680b3f1..254b2989520 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopMRLoadVariantStoragePipeline.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopMRLoadVariantStoragePipeline.java @@ -22,7 +22,7 @@ import org.apache.tools.ant.types.Commandline; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.common.UriUtils; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; import org.opencb.opencga.storage.core.variant.io.VariantReaderUtils; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java index 076388120f4..868ccf795c7 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java @@ -30,8 +30,8 @@ import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.config.DatabaseCredentials; import org.opencb.opencga.storage.core.StoragePipelineResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; -import org.opencb.opencga.storage.core.config.StorageEngineConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageEngineConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.exceptions.StoragePipelineException; import org.opencb.opencga.storage.core.exceptions.VariantSearchException; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageOptions.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageOptions.java index 88b0a3ef9b7..fff14b2271c 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageOptions.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageOptions.java @@ -1,7 +1,7 @@ package org.opencb.opencga.storage.hadoop.variant; import org.apache.hadoop.hbase.io.compress.Compression; -import org.opencb.opencga.storage.core.config.ConfigurationOption; +import org.opencb.opencga.core.config.ConfigurationOption; public enum HadoopVariantStorageOptions implements ConfigurationOption { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStoragePipeline.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStoragePipeline.java index 8bebecf8094..7004e7ddc34 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStoragePipeline.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStoragePipeline.java @@ -29,7 +29,7 @@ import org.opencb.commons.run.Task; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.common.YesNoAuto; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; import org.opencb.opencga.storage.core.io.proto.ProtoFileWriter; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/adaptors/VariantHadoopDBAdaptor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/adaptors/VariantHadoopDBAdaptor.java index b85988ec1b6..8553ae93e03 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/adaptors/VariantHadoopDBAdaptor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/adaptors/VariantHadoopDBAdaptor.java @@ -33,7 +33,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.*; import org.opencb.opencga.core.response.VariantQueryResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/annotation/mr/AnalysisAnnotateMapper.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/annotation/mr/AnalysisAnnotateMapper.java index 4a3a530ee52..d23925ddf63 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/annotation/mr/AnalysisAnnotateMapper.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/annotation/mr/AnalysisAnnotateMapper.java @@ -27,7 +27,7 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotatorException; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java index 0972d85477d..fe8f57cba04 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java @@ -9,7 +9,7 @@ import org.apache.hadoop.hbase.util.Bytes; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.*; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java index dd4ad25122d..1acf918a74e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java @@ -3,7 +3,7 @@ import org.opencb.opencga.storage.hadoop.variant.index.core.IndexSchema; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration.PopulationFrequencyRange; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration.PopulationFrequencyRange; import java.util.ArrayList; import java.util.HashMap; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java index 2f3ca18fc75..11d80a582d1 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java @@ -7,7 +7,7 @@ import org.apache.hadoop.mapreduce.Job; import org.opencb.biodata.models.core.Region; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java index 6b69660d827..e8ce9602844 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java @@ -1,7 +1,7 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; import org.apache.commons.lang3.StringUtils; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.core.variant.query.OpValue; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java index ebfedb0321b..d3f5bb314cc 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.core.variant.query.OpValue; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.MaskIndexFieldFilter; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java index d5f004fd50b..2226b1c08e1 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.variant.query.OpValue; import org.opencb.opencga.storage.core.variant.query.Values; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java index 2281b2c9dbc..6d033308e5e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import java.util.List; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java index 05326190949..01644129344 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.core.variant.query.OpValue; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleFileIndexQuery.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleFileIndexQuery.java index 8238ea3f3aa..103508ecae6 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleFileIndexQuery.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleFileIndexQuery.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.query; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import java.util.Collections; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java index bb89a0d3165..a0b03b9403a 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java @@ -3,8 +3,8 @@ import htsjdk.variant.vcf.VCFConstants; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.avro.VariantType; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.hadoop.variant.index.core.*; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java index c48d990e55a..a2524b61e75 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java @@ -7,7 +7,7 @@ import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java index c526ee710db..e160d2ea19f 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java @@ -12,7 +12,7 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; import org.opencb.opencga.storage.core.metadata.models.StudyMetadata; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java index 207d5652dd1..c4a12152d69 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java @@ -20,14 +20,14 @@ import org.opencb.opencga.storage.core.variant.query.*; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.NoOpIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.family.GenotypeCodec; import org.opencb.opencga.storage.hadoop.variant.index.query.*; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleAnnotationIndexQuery.PopulationFrequencyQuery; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration.PopulationFrequencyRange; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration.PopulationFrequencyRange; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java index 8f7f9c9ce33..8b169e84dc3 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java @@ -9,7 +9,7 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAvro; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.variant.adaptors.GenotypeClass; import org.opencb.opencga.storage.hadoop.utils.HBaseManager; import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java index 100eb694f5e..f74ce32244e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexConverter.java @@ -8,7 +8,7 @@ import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import java.util.List; import java.util.Map; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtil.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtil.java index 8fc14f73bdc..175ac23333e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtil.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtil.java @@ -24,8 +24,8 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; import org.opencb.opencga.core.common.JacksonUtils; -import org.opencb.opencga.storage.core.config.ConfigurationOption; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.ConfigurationOption; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.query.VariantQueryParser; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageTest.java index 760cf6d3e30..3541854ff38 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageTest.java @@ -76,8 +76,8 @@ import org.opencb.biodata.models.variant.VariantFileMetadata; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.StorageConfiguration; -import org.opencb.opencga.storage.core.config.StorageEngineConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageEngineConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.variant.VariantStorageBaseTest; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java index 10e6f63df35..c2c08c95671 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java @@ -6,7 +6,7 @@ import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import org.opencb.biodata.models.variant.avro.VariantAnnotation; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.util.Arrays; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java index 7d273a75dee..f95d91ecd01 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java @@ -8,7 +8,7 @@ import org.junit.Test; import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.Query; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.query.Values; @@ -22,7 +22,7 @@ import org.opencb.opencga.storage.hadoop.variant.index.query.SampleFileIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SingleSampleIndexQuery; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration.PopulationFrequencyRange; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration.PopulationFrequencyRange; import java.util.Arrays; import java.util.Collections; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java index 7ab3f8c3afd..e82fe07ed27 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java @@ -11,7 +11,7 @@ import org.opencb.biodata.models.variant.metadata.VariantFileHeaderComplexLine; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.TaskMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; @@ -22,7 +22,7 @@ import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java index 10cb80263ae..b31a4e41c94 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/VariantFileIndexEntryConverterTest.java @@ -7,7 +7,7 @@ import org.opencb.biodata.models.variant.VariantBuilder; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.opencga.storage.core.io.bit.BitBuffer; -import org.opencb.opencga.storage.core.config.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import java.util.Arrays; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtilTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtilTest.java index 9bbd6baa6ed..64864358501 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtilTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/mr/VariantMapReduceUtilTest.java @@ -1,9 +1,8 @@ package org.opencb.opencga.storage.hadoop.variant.mr; -import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.Job; import org.junit.Test; -import org.opencb.opencga.storage.core.config.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import java.io.IOException; diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStorageOptions.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStorageOptions.java index 7870a0b354f..5df42f1daeb 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStorageOptions.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStorageOptions.java @@ -1,7 +1,7 @@ package org.opencb.opencga.storage.mongodb.variant; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.storage.core.config.ConfigurationOption; +import org.opencb.opencga.core.config.ConfigurationOption; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import java.util.Arrays; diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStoragePipeline.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStoragePipeline.java index 678f9d14c24..771c02ca7f4 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStoragePipeline.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStoragePipeline.java @@ -34,7 +34,7 @@ import org.opencb.commons.run.ParallelTaskRunner; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.common.YesNoAuto; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBAdaptor.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBAdaptor.java index 32e33081898..424c9b4d980 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBAdaptor.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBAdaptor.java @@ -35,8 +35,8 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.mongodb.*; import org.opencb.opencga.core.response.VariantQueryResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; -import org.opencb.opencga.storage.core.config.StorageEngineConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageEngineConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.metadata.models.StudyMetadata; diff --git a/opencga-storage/opencga-storage-mongodb/src/test/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStorageTest.java b/opencga-storage/opencga-storage-mongodb/src/test/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStorageTest.java index f6bfd01e898..64234806da6 100644 --- a/opencga-storage/opencga-storage-mongodb/src/test/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStorageTest.java +++ b/opencga-storage/opencga-storage-mongodb/src/test/java/org/opencb/opencga/storage/mongodb/variant/MongoDBVariantStorageTest.java @@ -19,7 +19,7 @@ import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator; import org.opencb.commons.datastore.mongodb.MongoDataStoreManager; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.variant.VariantStorageTest; import org.opencb.opencga.storage.mongodb.auth.MongoCredentials; import org.slf4j.Logger; diff --git a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/common/AbstractStorageServer.java b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/common/AbstractStorageServer.java index afbbb47e122..6e590a5e34e 100644 --- a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/common/AbstractStorageServer.java +++ b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/common/AbstractStorageServer.java @@ -17,7 +17,7 @@ package org.opencb.opencga.storage.server.common; import org.apache.commons.lang3.StringUtils; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/AdminGrpcService.java b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/AdminGrpcService.java index c7db984baee..789426d9e20 100644 --- a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/AdminGrpcService.java +++ b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/AdminGrpcService.java @@ -17,7 +17,7 @@ package org.opencb.opencga.storage.server.grpc; import io.grpc.stub.StreamObserver; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.server.grpc.AdminServiceGrpc.AdminServiceImplBase; /** diff --git a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/GenericGrpcService.java b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/GenericGrpcService.java index fb50e070594..9680cb73a22 100644 --- a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/GenericGrpcService.java +++ b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/GenericGrpcService.java @@ -19,7 +19,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.server.grpc.GenericServiceModel.Request; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/GrpcStorageServer.java b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/GrpcStorageServer.java index c6cb9fd0069..f4b5972e913 100644 --- a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/GrpcStorageServer.java +++ b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/GrpcStorageServer.java @@ -18,7 +18,7 @@ import io.grpc.Server; import io.grpc.ServerBuilder; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.server.common.AbstractStorageServer; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/VariantGrpcService.java b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/VariantGrpcService.java index c7bb9de8c40..9ac406c0d9a 100644 --- a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/VariantGrpcService.java +++ b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/grpc/VariantGrpcService.java @@ -21,7 +21,7 @@ import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.variant.adaptors.VariantDBAdaptor; diff --git a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/rest/GenericRestWebService.java b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/rest/GenericRestWebService.java index 91653e320ea..28d76c94fbf 100644 --- a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/rest/GenericRestWebService.java +++ b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/rest/GenericRestWebService.java @@ -27,7 +27,7 @@ import org.opencb.commons.datastore.core.QueryResponse; import org.opencb.commons.datastore.core.QueryResult; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.common.GenericRecordAvroJsonMixin; import org.opencb.opencga.storage.core.variant.io.json.mixin.GenotypeJsonMixin; import org.opencb.opencga.storage.core.variant.io.json.mixin.VariantStatsJsonMixin; diff --git a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/rest/RestStorageServer.java b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/rest/RestStorageServer.java index fec673f067a..226c8ab46ce 100644 --- a/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/rest/RestStorageServer.java +++ b/opencga-storage/opencga-storage-server/src/main/java/org/opencb/opencga/storage/server/rest/RestStorageServer.java @@ -21,7 +21,7 @@ import org.eclipse.jetty.servlet.ServletHolder; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.servlet.ServletContainer; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.server.common.AbstractStorageServer; import org.slf4j.LoggerFactory; From f4cc6f9b7a8916aa6400dec28fb3ee6b002d48e6 Mon Sep 17 00:00:00 2001 From: William Spooner Date: Mon, 15 Mar 2021 13:15:25 +0000 Subject: [PATCH 086/412] Cleaned up first two sections. Also removed instructions on installing from source; best to stick with one method, i.e. pip, for a quick start guide. --- .../user-training/pyopencga_first_steps.ipynb | 1157 +++++++++-------- 1 file changed, 602 insertions(+), 555 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb index de9197018f5..e22a81ab88a 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb @@ -1,559 +1,606 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# *pyopencga* First Steps: Loggin, Working with RestResponses, Launching Jobs.\n", - "------\n", - "# 1. Overview\n", - "\n", - "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", - "- https://ws.opencb.org/opencga-prod/webservices\n", - "\n", - "This notebook is intended to provide guidance for getting *pyopencga* (the Python client of OpenCGA) started.\n", - "\n", - "The methods addressed here constitute a high-level introduction of common steps that a user might often come across when using OpenCGA with our Python Client, like retrieving information for different studies, clinical data, variant filtering or analysis and exporting of files. \n", - "\n", - "Information is provided for: loggin into OpenCGA with user credentials, working with the RestResponse wrapper object to easily explore data returned by the client responses and launching jobs for different purposes.\n", - "\n", - "\n", - "A guide through some **common user-cases** are provided in two different notebooks that can be found here:
---ADD NOTEBOOK-02 and NOTEBOOK03 LINKS---\n", - " \n", - "\n", - "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", - "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2. Getting Started\n", - "In this section you will learn howt to install *pyopencga*, import the modules, crate the client conffig and connect." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.1 Installing the *pyopencga* library\n", - "\n", - "You have two main options for get *pyopencga* installed in your python setup:\n", - "\n", - "### a) Install from source code: \n", - "If you need to import from the source code, remember that Python3 does not accept relative importing, so you need to append the module path to sys.path\n", - "\n", - "Preparing environment for importing from source" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "current_dir: ....r-training\n", - "base_modules_dir: ..../notebooks\n" - ] - } - ], - "source": [ - "# Initialize PYTHONPATH for pyopencga\n", - "import sys\n", - "import os\n", - "from pprint import pprint\n", - "\n", - "cwd = os.getcwd()\n", - "print(\"current_dir: ....\"+cwd[-10:])\n", - "\n", - "base_modules_dir = os.path.dirname(cwd)\n", - "print(\"base_modules_dir: ....\"+base_modules_dir[-10:])\n", - "\n", - "sys.path.append(base_modules_dir)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### b) **RECOMENDED:** Install *pyopencga* with pip\n", - "\n", - "You can import pyopencga directly if you have installed *pyopencga* with PyPI (The Python Package Index).
For further documentation reffer to https://pypi.org/project/pyopencga/.
The user just needs to access the console terminal (optionally within a python environment) and run:\n", - "\n", - "`$ pip install pyopencga`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.2 Importing the *pyopencga* library\n", - "\n", - "This is the recommended way of using *pyopencga* " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", - "from pyopencga.opencga_client import OpencgaClient # import client module\n", - "from pprint import pprint\n", - "import json\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.3 Setup the Client and Login in *pyopencga* \n", - "\n", - "**Configuration and Credentials** \n", - "\n", - "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n", - "\n", - "Regarding credentials, you can set both user and password as two variables in the script. If you prefer not to show the password, it would be asked interactively without echo.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.3.1 Set variables for server host, user credentials and project owner" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# server host\n", - "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", - "\n", - "# user credentials\n", - "user = \"demouser\"\n", - "passwd = \"demouser\" ## you can skip this, see below.\n", - "\n", - "# the user demo access projects from user opencga\n", - "prj_owner = \"demo\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.3.2 Creating ConfigClient dictionary for server connection configuration" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Config information:\n", - " {'rest': {'host': 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'}}\n" - ] - } - ], - "source": [ - "# Creating ClientConfiguration dict\n", - "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", - "\n", - "config_dict = {\"rest\": {\n", - " \"host\": host \n", - " }\n", - " }\n", - "\n", - "print(\"Config information:\\n\",config_dict)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.3.3 Initialize the client configuration\n", - "\n", - "Now we need to pass the *config_dict* dictionary to the **ClientConfiguration** method" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "config = ClientConfiguration(config_dict)\n", - "oc = OpencgaClient(config)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.3.4 Import the user credentials to the previously defined *OpencgaClient* instance and Login\n", - "\n", - "We can decide to pass the password as a variable, or just pass the user and be asked for the password interactively" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# here we put only the user in order to be asked for the password interactively\n", - "# oc.login(user)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# or you can pass the user and passwd\n", - "oc.login(user, passwd)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### ✅ Congrats! You are now connected to OpenCGA" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3. Understanding REST Response\n", - "\n", - "*pyopencga* queries web services that return a RESTResponse object, which might be difficult to interpretate. The RESTResponse type provide the data in a manner that is not as intuitive as a python list or dictionary. Because of this, we have develop a useful functionality that retrieves the data in a simpler format. \n", - "\n", - "[OpenCGA Client Libraries](http://docs.opencb.org/display/opencga/Using+OpenCGA), including *pyopencga*, implement a **RESTReponse wrapper** to make even easier to work with REST web services responses.
REST responsess include metadata and OpenCGA 2.0.1 has been designed to work in a federation mode (more information about OpenCGA federations can be found **[here](http://docs.opencb.org/display/opencga/Roadmapg)**).\n", - "\n", - "All these can make a first-time user to struggle when start working with the responses. Please read this brief documentation about **[OpenCGA RESTful Web Services](http://docs.opencb.org/display/opencga/RESTful+Web+Services#RESTfulWebServices-OpenCGA2.x)**.\n", - "\n", - "Let's see a quick example of how to use RESTResponse wrapper in *pyopencga*. \n", - "You can get some extra inforamtion [here](http://docs.opencb.org/display/opencga/Python#Python-WorkingwiththeRestResponse). Let's execute a first simple query to fetch all projects for the user **demouser** already logged in **[step 1.3](#1.3-Setup-the-client-and-login-in-pyopencga)**." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "## Let's fecth the available projects.\n", - "## First let's get the project client and execute search() funciton\n", - "project_client = oc.projects\n", - "projects = project_client.search()\n", - "\n", - "## Uncomment this line to view the JSON response.\n", - "## NOTE: it incudes study information so this can be big\n", - "##pprint(projects.get_responses())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Although you can iterate through all the different projects provided by the response by executing the next chunk of code, this is a **not recommended** way.\n", - "We can explore this through an example; the next query iterates over all the projects retrieved from `projects.search()`" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "family Family Studies GRCh37\n", - "population Population Studies GRCh38\n" - ] - } - ], - "source": [ - "## Loop through all diferent projects \n", - "for project in projects.responses[0]['results']:\n", - " print(project['id'], project['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## RestResponse API" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note: Table with API funcitons and the description" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using the `get_results()` function \n", - "\n", - "Using the functions that *pyopencga* implements for the RestResponse object makes things much easier!
Let's dig into an example using the same query as above:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "family Family Studies GRCh37\n", - "population Population Studies GRCh38\n" - ] - } - ], - "source": [ - "# Loop through all diferent projects \n", - "for project in projects.get_results():\n", - " print(project['id'], project['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using the `result_iterator()` function to iterate over the Rest results\n", - "\n", - "You can also iterate results, this is specially interesting when fetching many results from the server:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "family Family Studies GRCh37\n", - "population Population Studies GRCh38\n" - ] - } - ], - "source": [ - "## Iterate through all diferent projects \n", - "for project in projects.result_iterator():\n", - " print(project['id'], project['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using `print_results()` function to iterate over the Rest results\n", - "\n", - "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#Time: 81\n", - "#Num matches: -1\n", - "#Num results: 2\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tname\tuuid\tfqn\tcreationDate\tmodificationDate\tdescription\torganism\tcurrentRelease\tstudies\tinternal\tattributes\n", - "family\tFamily Studies GRCh37\teba0e1c7-0172-0001-0001-c7af712652b2\tdemo@family\t20200625131808\t20200625131808\t\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh37'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200625131808', 'description': ''}}\t{}\n", - "population\tPopulation Studies GRCh38\t25f2842a-0173-0001-0001-e7bcbedc77ff\tdemo@population\t20200706210517\t20200706210517\tSome population reference studies for GRCh38\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh38'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200706210517', 'description': ''}}\t{}\n" - ] - } - ], - "source": [ - "## This function iterates over all the results, it can be configured to exclude metadata, change separator or even select the fields!\n", - "projects.print_results()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Now, let's try to costumize the results so we can get printed only the portion of the data that we might be interested in" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#id\tname\torganism.scientificName\torganism.assembly\n", - "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\n", - "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\n", - "\n" - ] - } - ], - "source": [ - "## Lets exclude metadata and print only few fields, use dot notation for ensted fields\n", - "projects.print_results(fields='id,name,organism.scientificName,organism.assembly',metadata=False)\n", - "print()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### A very useful parameter is the *separator*.
It allows the user to decide the format in which the data is printed. For example, it's possible to print a CSV-like style:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Print the projects with a header and a different separator:\n", - "\n", - "#id,name,organism.scientificName,organism.assembly\n", - "family,Family Studies GRCh37,Homo sapiens,GRCh37\n", - "population,Population Studies GRCh38,Homo sapiens,GRCh38\n" - ] + "cells" : [ + { + "cell_type" : "markdown", + "source" : [ + "# First Steps with *pyopencga*; the Python client of OpenCGA\n", + "------\n", + "# 1. Overview\n", + "\n", + "This notebook provides guidance for getting started with the *pyopencga* library, the Python client of OpenCGA.\n\nWe assume that your workstation (Linux, Mac, Windows) is connected to the internet and has Python 3 and the *pip* package manager installed. We then show you how to:\n", + "\n", + "- Install *pyopencga*.\n", + "- Connect to an OpenCGA instance.\n", + "- Issue OpenCGA requests and work with responses.\n", + "- Launch asynchronous jobs and retrieve results.\n", + "\n", + "\n", + "Walk-through guides of some **common use cases** are provided in two further notebooks:
\n", + "- ADD LINK TO NOTEBOOK-02\n", + "- ADD LINK TO NOTEBOOK-03\n", + " \n", + "For reference, the methods implemented by *pyopencga* are are listed here:\n", + "- https:\/\/docs.google.com\/spreadsheets\/d\/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc\n", + "\n", + "The OpenCGA web service endpoints used by *pyopencga* are listed here:\n", + "- https:\/\/ws.opencb.org\/opencga-prod\/webservices\n", + "\n" + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "# 2. Installing and importing the *pyopencga* library\n", + "\n", + "You have two main options for get *pyopencga* installed in your python setup; from source code or using the Python *pip* package panager. We recommend the latter:\n", + "### 2.1. Install *pyopencga* with *pip*\n", + "\n", + "[PROVIDE INSTRUCTIONS FOR THE FOLLOWING] you can import pyopencga directly if you have installed *pyopencga* with PyPI (The Python Package Index).
For further documentation reffer to https:\/\/pypi.org\/project\/pyopencga\/.
The user just needs to access the console terminal (optionally within a python environment) and run:\n", + "\n", + "`$ pip install pyopencga`" + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "## 2.2. Importing the *pyopencga* library\n", + "\n", + "This is the recommended way of using *pyopencga* " + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", + "from pyopencga.opencga_client import OpencgaClient # import client module\n", + "from pprint import pprint\n", + "import json\n" + ], + "cell_type" : "code", + "execution_count" : 1, + "outputs" : [ + + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "## 2.3. Setup the Client and Login in *pyopencga* \n", + "\n", + "**Configuration and Credentials** \n", + "\n", + "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n", + "\n", + "Regarding credentials, you can set both user and password as two variables in the script. If you prefer not to show the password, it would be asked interactively without echo.\n" + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "### 1.3.1 Set variables for server host, user credentials and project owner" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "# server host\n", + "host = 'http:\/\/bioinfo.hpc.cam.ac.uk\/opencga-prod'\n", + "\n", + "# user credentials\n", + "user = \"demouser\"\n", + "passwd = \"demouser\" ## you can skip this, see below.\n", + "\n", + "# the user demo access projects from user opencga\n", + "prj_owner = \"demo\"" + ], + "cell_type" : "code", + "execution_count" : 2, + "outputs" : [ + + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "### 1.3.2 Creating ConfigClient dictionary for server connection configuration" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "# Creating ClientConfiguration dict\n", + "host = 'http:\/\/bioinfo.hpc.cam.ac.uk\/opencga-prod'\n", + "\n", + "config_dict = {\"rest\": {\n", + " \"host\": host \n", + " }\n", + " }\n", + "\n", + "print(\"Config information:\\n\",config_dict)\n", + "\n" + ], + "cell_type" : "code", + "execution_count" : 3, + "outputs" : [ + { + "name" : "stdout", + "text" : [ + "Config information:\n", + " {'rest': {'host': 'http:\/\/bioinfo.hpc.cam.ac.uk\/opencga-prod'}}\n" + ], + "output_type" : "stream" + } + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "### 1.3.3 Initialize the client configuration\n", + "\n", + "Now we need to pass the *config_dict* dictionary to the **ClientConfiguration** method" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "config = ClientConfiguration(config_dict)\n", + "oc = OpencgaClient(config)\n" + ], + "cell_type" : "code", + "execution_count" : 4, + "outputs" : [ + + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "### 1.3.4 Import the user credentials to the previously defined *OpencgaClient* instance and Login\n", + "\n", + "We can decide to pass the password as a variable, or just pass the user and be asked for the password interactively" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "# here we put only the user in order to be asked for the password interactively\n", + "# oc.login(user)" + ], + "cell_type" : "code", + "execution_count" : 26, + "outputs" : [ + + ] + }, + { + "metadata" : { + + }, + "source" : [ + "# or you can pass the user and passwd\n", + "oc.login(user, passwd)" + ], + "cell_type" : "code", + "execution_count" : 5, + "outputs" : [ + + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "#### ✅ Congrats! You are now connected to OpenCGA" + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "# 3. Understanding REST Response\n", + "\n", + "*pyopencga* queries web services that return a RESTResponse object, which might be difficult to interpretate. The RESTResponse type provide the data in a manner that is not as intuitive as a python list or dictionary. Because of this, we have develop a useful functionality that retrieves the data in a simpler format. \n", + "\n", + "[OpenCGA Client Libraries](http:\/\/docs.opencb.org\/display\/opencga\/Using+OpenCGA), including *pyopencga*, implement a **RESTReponse wrapper** to make even easier to work with REST web services responses.
REST responsess include metadata and OpenCGA 2.0.1 has been designed to work in a federation mode (more information about OpenCGA federations can be found **[here](http:\/\/docs.opencb.org\/display\/opencga\/Roadmapg)**).\n", + "\n", + "All these can make a first-time user to struggle when start working with the responses. Please read this brief documentation about **[OpenCGA RESTful Web Services](http:\/\/docs.opencb.org\/display\/opencga\/RESTful+Web+Services#RESTfulWebServices-OpenCGA2.x)**.\n", + "\n", + "Let's see a quick example of how to use RESTResponse wrapper in *pyopencga*. \n", + "You can get some extra inforamtion [here](http:\/\/docs.opencb.org\/display\/opencga\/Python#Python-WorkingwiththeRestResponse). Let's execute a first simple query to fetch all projects for the user **demouser** already logged in **[step 1.3](#1.3-Setup-the-client-and-login-in-pyopencga)**." + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "## Let's fecth the available projects.\n", + "## First let's get the project client and execute search() funciton\n", + "project_client = oc.projects\n", + "projects = project_client.search()\n", + "\n", + "## Uncomment this line to view the JSON response.\n", + "## NOTE: it incudes study information so this can be big\n", + "##pprint(projects.get_responses())" + ], + "cell_type" : "code", + "execution_count" : 28, + "outputs" : [ + + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "#### Although you can iterate through all the different projects provided by the response by executing the next chunk of code, this is a **not recommended** way.\n", + "We can explore this through an example; the next query iterates over all the projects retrieved from `projects.search()`" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "## Loop through all diferent projects \n", + "for project in projects.responses[0]['results']:\n", + " print(project['id'], project['name'])" + ], + "cell_type" : "code", + "execution_count" : 29, + "outputs" : [ + { + "name" : "stdout", + "text" : [ + "family Family Studies GRCh37\n", + "population Population Studies GRCh38\n" + ], + "output_type" : "stream" + } + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "## RestResponse API" + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "Note: Table with API funcitons and the description" + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "## Using the `get_results()` function \n", + "\n", + "Using the functions that *pyopencga* implements for the RestResponse object makes things much easier!
Let's dig into an example using the same query as above:" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "# Loop through all diferent projects \n", + "for project in projects.get_results():\n", + " print(project['id'], project['name'])" + ], + "cell_type" : "code", + "execution_count" : 30, + "outputs" : [ + { + "name" : "stdout", + "text" : [ + "family Family Studies GRCh37\n", + "population Population Studies GRCh38\n" + ], + "output_type" : "stream" + } + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "## Using the `result_iterator()` function to iterate over the Rest results\n", + "\n", + "You can also iterate results, this is specially interesting when fetching many results from the server:" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "## Iterate through all diferent projects \n", + "for project in projects.result_iterator():\n", + " print(project['id'], project['name'])" + ], + "cell_type" : "code", + "execution_count" : 31, + "outputs" : [ + { + "name" : "stdout", + "text" : [ + "family Family Studies GRCh37\n", + "population Population Studies GRCh38\n" + ], + "output_type" : "stream" + } + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "## Using `print_results()` function to iterate over the Rest results\n", + "\n", + "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "## This function iterates over all the results, it can be configured to exclude metadata, change separator or even select the fields!\n", + "projects.print_results()" + ], + "cell_type" : "code", + "execution_count" : 32, + "outputs" : [ + { + "name" : "stdout", + "text" : [ + "#Time: 81\n", + "#Num matches: -1\n", + "#Num results: 2\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tname\tuuid\tfqn\tcreationDate\tmodificationDate\tdescription\torganism\tcurrentRelease\tstudies\tinternal\tattributes\n", + "family\tFamily Studies GRCh37\teba0e1c7-0172-0001-0001-c7af712652b2\tdemo@family\t20200625131808\t20200625131808\t\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh37'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200625131808', 'description': ''}}\t{}\n", + "population\tPopulation Studies GRCh38\t25f2842a-0173-0001-0001-e7bcbedc77ff\tdemo@population\t20200706210517\t20200706210517\tSome population reference studies for GRCh38\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh38'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200706210517', 'description': ''}}\t{}\n" + ], + "output_type" : "stream" + } + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "##### Now, let's try to costumize the results so we can get printed only the portion of the data that we might be interested in" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "## Lets exclude metadata and print only few fields, use dot notation for ensted fields\n", + "projects.print_results(fields='id,name,organism.scientificName,organism.assembly',metadata=False)\n", + "print()\n" + ], + "cell_type" : "code", + "execution_count" : 33, + "outputs" : [ + { + "name" : "stdout", + "text" : [ + "#id\tname\torganism.scientificName\torganism.assembly\n", + "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\n", + "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\n", + "\n" + ], + "output_type" : "stream" + } + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "##### A very useful parameter is the *separator*.
It allows the user to decide the format in which the data is printed. For example, it's possible to print a CSV-like style:" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "## You can change separator\n", + "\n", + "print('Print the projects with a header and a different separator:\\n')\n", + "projects.print_results(fields='id,name,organism.scientificName,organism.assembly', separator=',', metadata=False)\n" + ], + "cell_type" : "code", + "execution_count" : 34, + "outputs" : [ + { + "name" : "stdout", + "text" : [ + "Print the projects with a header and a different separator:\n", + "\n", + "#id,name,organism.scientificName,organism.assembly\n", + "family,Family Studies GRCh37,Homo sapiens,GRCh37\n", + "population,Population Studies GRCh38,Homo sapiens,GRCh38\n" + ], + "output_type" : "stream" + } + ] + }, + { + "cell_type" : "markdown", + "source" : [ + "# 4. Working with JOBS" + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "OpenCGA implemtns a number of analysis and operations that are executed as jobs\n", + "\n", + "Note: Describe briefly how Jobs work and point to docs" + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "## Job Info\n", + "Decribe job information, ...\n" + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "## Executing Jobs\n", + "Lifecycle, status, ..." + ], + "metadata" : { + + } + }, + { + "cell_type" : "markdown", + "source" : [ + "### Example" + ], + "metadata" : { + + } + }, + { + "metadata" : { + + }, + "source" : [ + "## Eexecute GWAS analysis\n", + "rest_response = oc.variant().gwas()\n", + "\n", + "## wait for the job to finish\n", + "oc.wait_for_job(rest_response)\n", + "\n", + "rest_response.print_results()" + ], + "cell_type" : "code", + "execution_count" : 3, + "outputs" : [ + { + "evalue" : "name 'oc' is not defined", + "traceback" : [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mrest_response\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvariant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgwas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'oc' is not defined" + ], + "output_type" : "error", + "ename" : "NameError" + } + ] + }, + { + "metadata" : { + + }, + "source" : [ + + ], + "cell_type" : "code", + "execution_count" : null, + "outputs" : [ + + ] } - ], - "source": [ - "## You can change separator\n", - "\n", - "print('Print the projects with a header and a different separator:\\n')\n", - "projects.print_results(fields='id,name,organism.scientificName,organism.assembly', separator=',', metadata=False)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4. Working with JOBS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "OpenCGA implemtns a number of analysis and operations that are executed as jobs\n", - "\n", - "Note: Describe briefly how Jobs work and point to docs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Job Info\n", - "Decribe job information, ...\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Executing Jobs\n", - "Lifecycle, status, ..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'oc' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mrest_response\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvariant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgwas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'oc' is not defined" - ] + ], + "nbformat_minor" : 5, + "metadata" : { + "language_info" : { + "file_extension" : ".py", + "codemirror_mode" : { + "name" : "ipython", + "version" : 3 + }, + "mimetype" : "text\/x-python", + "pygments_lexer" : "ipython3", + "version" : "3.6.9", + "nbconvert_exporter" : "python", + "name" : "python" + }, + "kernelspec" : { + "name" : "python3", + "language" : "python", + "display_name" : "Python 3" } - ], - "source": [ - "## Eexecute GWAS analysis\n", - "rest_response = oc.variant().gwas()\n", - "\n", - "## wait for the job to finish\n", - "oc.wait_for_job(rest_response)\n", - "\n", - "rest_response.print_results()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} + "nbformat" : 4 +} \ No newline at end of file From 09acfec4d4dc25a9781944a98409c2d0a65e878c Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 15 Mar 2021 15:22:29 +0100 Subject: [PATCH 087/412] clinical: add realistic numMatches and query times, #1693 --- .../opencga/clinical/rga/RgaManager.java | 90 ++++++++++++++----- .../storage/core/rga/GeneRgaConverter.java | 15 ++-- .../storage/core/rga/VariantRgaConverter.java | 3 +- 3 files changed, 76 insertions(+), 32 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 9bcef35c335..71524948ad0 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; +import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrException; import org.opencb.commons.datastore.core.DataResult; @@ -17,9 +18,9 @@ import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.clinical.StorageManager; import org.opencb.opencga.core.config.Configuration; -import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; +import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.study.Study; @@ -38,10 +39,8 @@ import java.io.InputStreamReader; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; @@ -76,6 +75,9 @@ public OpenCGAResult individualQuery(String studyStr, Quer throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); @@ -99,39 +101,67 @@ public OpenCGAResult individualQuery(String studyStr, Quer sampleQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); } - List samples; + + int numTotalResults = 0; + int limit = queryOptions.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); + int skip = queryOptions.getInt(QueryOptions.SKIP); + List sampleIds; + + List authorisedSamples = new LinkedList<>(); if (!isOwnerOrAdmin || !auxQuery.containsKey("sampleId")) { + int batchSize = 1000; + int currentBatch = 0; + boolean queryNextBatch = true; + + String sampleQueryField; + List values; if (auxQuery.containsKey("individualId")) { - sampleQuery.put(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), auxQuery.get("individualId")); + sampleQueryField = SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(); + values = auxQuery.getAsStringList("individualId"); } else { - sampleQuery.put(SampleDBAdaptor.QueryParams.ID.key(), auxQuery.get("sampleId")); + sampleQueryField = SampleDBAdaptor.QueryParams.ID.key(); + values = auxQuery.getAsStringList("sampleId"); } - OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); - if (authorisedSampleIdResult.getNumResults() == 0) { - return OpenCGAResult.empty(KnockoutByIndividual.class); + while (queryNextBatch) { + List tmpValues = values.subList(currentBatch, Math.min(values.size(), batchSize + currentBatch)); + + sampleQuery.put(sampleQueryField, tmpValues); + OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + authorisedSamples.addAll((Collection) authorisedSampleIdResult.getResults()); + + if (values.size() < batchSize + currentBatch) { + queryNextBatch = false; + numTotalResults = authorisedSamples.size(); + } else if (authorisedSamples.size() > skip + limit) { + queryNextBatch = false; + // We will get an approximate number of total results + numTotalResults = Math.round(((float) authorisedSamples.size() * values.size()) / (currentBatch + batchSize)); + } else { + currentBatch += batchSize; + } } - samples = (List) authorisedSampleIdResult.getResults(); } else { - samples = auxQuery.getAsStringList("sampleId"); + authorisedSamples = auxQuery.getAsStringList("sampleId"); + numTotalResults = authorisedSamples.size(); } - int limit = queryOptions.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); - int skip = queryOptions.getInt(QueryOptions.SKIP); - - List sampleIds; - if (skip == 0 && limit > samples.size()) { - sampleIds = samples; - } else if (skip > samples.size()) { + if (skip == 0 && limit > authorisedSamples.size()) { + sampleIds = authorisedSamples; + } else if (skip > authorisedSamples.size()) { return OpenCGAResult.empty(KnockoutByIndividual.class); } else { - int to = Math.min(samples.size(), skip + limit); - sampleIds = samples.subList(skip, to); + int to = Math.min(authorisedSamples.size(), skip + limit); + sampleIds = authorisedSamples.subList(skip, to); } auxQuery.put("sampleId", sampleIds); - return rgaEngine.individualQuery(collection, auxQuery, queryOptions); + OpenCGAResult result = rgaEngine.individualQuery(collection, auxQuery, queryOptions); + result.setNumMatches(numTotalResults); + result.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + + return result; } public OpenCGAResult geneQuery(String studyStr, Query query, QueryOptions options, String token) @@ -144,6 +174,9 @@ public OpenCGAResult geneQuery(String studyStr, Query query, throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + QueryOptions queryOptions = setDefaultLimit(options); List includeIndividuals = queryOptions.getAsStringList(RgaQueryParams.INCLUDE_INDIVIDUAL); @@ -164,6 +197,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, List geneIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); auxQuery.put(RgaDataModel.GENE_ID, geneIds); } + int numTotalResults = auxQuery.getAsStringList(RgaDataModel.GENE_ID).size(); Set includeIndividualIds; if (!isOwnerOrAdmin) { @@ -198,6 +232,8 @@ public OpenCGAResult geneQuery(String studyStr, Query query, // 4. Solr gene query OpenCGAResult knockoutResult = rgaEngine.geneQuery(collection, auxQuery, queryOptions); + knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + knockoutResult.setNumMatches(numTotalResults); if (isOwnerOrAdmin && includeIndividualIds.isEmpty()) { return knockoutResult; } else { @@ -225,6 +261,9 @@ public OpenCGAResult variantQuery(String studyStr, Query quer throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + QueryOptions queryOptions = setDefaultLimit(options); List includeIndividuals = queryOptions.getAsStringList(RgaQueryParams.INCLUDE_INDIVIDUAL); @@ -243,6 +282,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); auxQuery.put(RgaDataModel.VARIANTS, variantIds); } + int numTotalResults = auxQuery.getAsStringList(RgaDataModel.VARIANTS).size(); Set includeIndividualIds; if (!isOwnerOrAdmin) { @@ -278,6 +318,8 @@ public OpenCGAResult variantQuery(String studyStr, Query quer // 4. Solr gene query OpenCGAResult knockoutResult = rgaEngine.variantQuery(collection, auxQuery, queryOptions); + knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + knockoutResult.setNumMatches(numTotalResults); if (isOwnerOrAdmin && includeIndividualIds.isEmpty()) { return knockoutResult; } else { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java index 39d3d7e6591..84b4e63e995 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java @@ -21,13 +21,14 @@ public class GeneRgaConverter implements ComplexTypeConverter(); - CONVERTER_MAP.put("id", Collections.singletonList(RgaDataModel.GENE_ID)); - CONVERTER_MAP.put("name", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.GENE_NAME)); - CONVERTER_MAP.put("chromosome", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.CHROMOSOME)); - CONVERTER_MAP.put("start", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.START)); - CONVERTER_MAP.put("end", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.END)); - CONVERTER_MAP.put("strand", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.STRAND)); - CONVERTER_MAP.put("biotype", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.GENE_BIOTYPE)); + // We always include individual id in the response because we always want to return the numIndividuals populated + CONVERTER_MAP.put("id", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("name", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.GENE_NAME, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("chromosome", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.CHROMOSOME, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("start", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.START, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("end", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.END, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("strand", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.STRAND, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("biotype", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.GENE_BIOTYPE, RgaDataModel.INDIVIDUAL_ID)); CONVERTER_MAP.put("annotation", Collections.emptyList()); CONVERTER_MAP.put("individuals.id", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID)); CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SAMPLE_ID)); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java index c2bcd5837e3..ef08a9ff86e 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java @@ -21,8 +21,9 @@ public class VariantRgaConverter implements ComplexTypeConverter> CONVERTER_MAP; static { + // We always include individual id in the response because we always want to return the numIndividuals populated CONVERTER_MAP = new HashMap<>(); - CONVERTER_MAP.put("id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS)); + CONVERTER_MAP.put("id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); CONVERTER_MAP.put("individuals.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SAMPLE_ID)); From cb9c6fa370b587d64f5067ad7d9a15ab9e4988de Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 15 Mar 2021 16:19:41 +0100 Subject: [PATCH 088/412] storage: add motherId and fatherId projections, #1693 --- .../org/opencb/opencga/storage/core/rga/GeneRgaConverter.java | 2 ++ .../opencga/storage/core/rga/IndividualRgaConverter.java | 2 ++ .../opencb/opencga/storage/core/rga/VariantRgaConverter.java | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java index 84b4e63e995..3d520958536 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java @@ -34,6 +34,8 @@ public class GeneRgaConverter implements ComplexTypeConverter Date: Mon, 15 Mar 2021 16:32:05 +0100 Subject: [PATCH 089/412] storage: fix genes and transcripts projections, #1693 --- .../storage/core/rga/GeneRgaConverter.java | 30 ++++++++-------- .../core/rga/IndividualRgaConverter.java | 34 +++++++++---------- .../storage/core/rga/VariantRgaConverter.java | 34 +++++++++---------- 3 files changed, 49 insertions(+), 49 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java index 3d520958536..a1bd6239818 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java @@ -36,35 +36,35 @@ public class GeneRgaConverter implements ComplexTypeConverter Date: Tue, 16 Mar 2021 10:25:26 +0100 Subject: [PATCH 090/412] clinical: calculate numMatches for gene and variant, #1693 --- .../opencga/clinical/rga/RgaManager.java | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 71524948ad0..5e6c0eedbc9 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -40,7 +40,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import java.util.stream.Collectors; import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; @@ -183,6 +183,21 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); + Future numTotalResults = null; + if (queryOptions.getBoolean(QueryOptions.COUNT)) { + ExecutorService executor = Executors.newSingleThreadExecutor(); + numTotalResults = executor.submit(() -> { + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.GENE_ID + ")"); + try { + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + return ((Number) result.first().getAggregationValues().get(0)).intValue(); + } catch (Exception e) { + e.printStackTrace(); + } + return -1; + }); + } + // If the user is querying by gene id, we don't need to do a facet first if (!auxQuery.containsKey(RgaDataModel.GENE_ID)) { // 1st. we perform a facet to get the different gene ids matching the user query and using the skip and limit values @@ -197,7 +212,6 @@ public OpenCGAResult geneQuery(String studyStr, Query query, List geneIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); auxQuery.put(RgaDataModel.GENE_ID, geneIds); } - int numTotalResults = auxQuery.getAsStringList(RgaDataModel.GENE_ID).size(); Set includeIndividualIds; if (!isOwnerOrAdmin) { @@ -233,7 +247,11 @@ public OpenCGAResult geneQuery(String studyStr, Query query, // 4. Solr gene query OpenCGAResult knockoutResult = rgaEngine.geneQuery(collection, auxQuery, queryOptions); knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); - knockoutResult.setNumMatches(numTotalResults); + try { + knockoutResult.setNumMatches(numTotalResults != null ? numTotalResults.get() : -1); + } catch (InterruptedException | ExecutionException e) { + knockoutResult.setNumMatches(-1); + } if (isOwnerOrAdmin && includeIndividualIds.isEmpty()) { return knockoutResult; } else { @@ -271,6 +289,21 @@ public OpenCGAResult variantQuery(String studyStr, Query quer Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); + Future numTotalResults = null; + if (queryOptions.getBoolean(QueryOptions.COUNT)) { + ExecutorService executor = Executors.newSingleThreadExecutor(); + numTotalResults = executor.submit(() -> { + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.VARIANTS + ")"); + try { + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + return ((Number) result.first().getAggregationValues().get(0)).intValue(); + } catch (Exception e) { + e.printStackTrace(); + } + return -1; + }); + } + // If the user is querying by gene id, we don't need to do a facet first if (!auxQuery.containsKey(RgaDataModel.VARIANTS)) { // 1st. we perform a facet to get the different variant ids matching the user query and using the skip and limit values @@ -282,7 +315,6 @@ public OpenCGAResult variantQuery(String studyStr, Query quer List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); auxQuery.put(RgaDataModel.VARIANTS, variantIds); } - int numTotalResults = auxQuery.getAsStringList(RgaDataModel.VARIANTS).size(); Set includeIndividualIds; if (!isOwnerOrAdmin) { @@ -319,7 +351,11 @@ public OpenCGAResult variantQuery(String studyStr, Query quer // 4. Solr gene query OpenCGAResult knockoutResult = rgaEngine.variantQuery(collection, auxQuery, queryOptions); knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); - knockoutResult.setNumMatches(numTotalResults); + try { + knockoutResult.setNumMatches(numTotalResults != null ? numTotalResults.get() : -1); + } catch (InterruptedException | ExecutionException e) { + knockoutResult.setNumMatches(-1); + } if (isOwnerOrAdmin && includeIndividualIds.isEmpty()) { return knockoutResult; } else { From 23028fb387b1ec81a5fc6050a4205b1376ccef2b Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Tue, 16 Mar 2021 12:01:37 +0000 Subject: [PATCH 091/412] client: improving notebooks structure #1716 --- .../user-training/pyopencga_catalog.ipynb | 54 +- .../user-training/pyopencga_first_steps.ipynb | 1132 ++++++++--------- .../pyopencga_variant_analysis.ipynb | 8 +- .../pyopencga_variant_query.ipynb | 4 +- 4 files changed, 559 insertions(+), 639 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 7cf93add659..63a7224fb14 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -106,9 +106,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.1 Exploring User Account: Projects, studies and permissions\n", + "## 2.1 Exploring User Account: Projects, Studies and Permissions\n", "\n", "In this use case we cover retrieving information for our user.\n", + "In OpenCGA, all the user permissions are established at a study level. One project may contain different studies.\n", + "\n", + "#### Full Qualified Name (fqn) of Studies \n", + "\n", + "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study]\n", + "We can access the studies for the specific project *family*:\n", "\n", "First, we can get the list of available methods for the user client object:" ] @@ -166,9 +172,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Exploring the projects for our user\n", - "\n", - "We can to list our user's projects using **project client** `search()` function." + "**Projects:** Now, we can to list our user's projects using **project client** `search()` function." ] }, { @@ -199,23 +203,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Our user (demo) has access to 2 different projects:\n", + "Our user (*demo*) has access to 2 different projects:\n", "- Project: **family**\n", - "- Project: **population**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exploring the Studies for our user\n", - "\n", - "All the user permissions are established at a study level in OpenCGA. One project may contain different studies.\n", + "- Project: **population**\n", "\n", - "#### Full Qualified Name (fqn) of Studies \n", - "\n", - "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study]\n", - "We can access the studies for the specific project *family*:" + "**Studies:** Now, let's see which studies do we have access within the **family** project." ] }, { @@ -250,18 +242,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Our user (demo) has access to 2 different studies within the *family* project:\n", + "Our user (*demo*) has access to 2 different studies within the *family* project:\n", "\n", - "Project: *family*\n", - "- study: *platinum*\n", - "- study: *corpasome*" + "Project: **family**\n", + "- study: **platinum**\n", + "- study: **corpasome**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.2 Browsing samples and individuals" + "## 2.2 Browsing Samples, Individuals, Files and Cohorts in a Study" ] }, { @@ -273,7 +265,7 @@ "Once we know the studies our user 'demo' has access to, we can explore the samples that a project contains.
\n", "To fetch samples you need to use the sample client built in pyopencga.
\n", "\n", - "Remember that it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies, since we cannot be sure if there might be other studies with the same name contained in other projects (E.g: the study *platinium* could e into two different projects: *GRch37_project and GRch38_project*)\n", + "Remember that it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies, since we cannot be sure if there might be **other studies** with the same name contained in **other projects**.
(E.g: the study *platinium* might be defined in two different projects: *GRch37_project and GRch38_project*)\n", "\n", "In this case, we can see the samples from the project *platinium*." ] @@ -319,29 +311,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.3 Filtering by Custom Annotations\n", - "You can easily filter samples, individuals, ... using your custom annotation ..." + "### Exploring Files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.4 Browsing Files" + "### Exploring Cohorts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.5 Browsing Cohorts" + "## 2.3 Filtering by Custom Annotations\n", + "You can easily filter samples, individuals, ... using your custom annotation ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.5 Aggregation Stats" + "## 2.4 Aggregation Stats" ] }, { @@ -368,7 +360,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb index e22a81ab88a..e26f5a086c4 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb @@ -1,606 +1,534 @@ { - "cells" : [ - { - "cell_type" : "markdown", - "source" : [ - "# First Steps with *pyopencga*; the Python client of OpenCGA\n", - "------\n", - "# 1. Overview\n", - "\n", - "This notebook provides guidance for getting started with the *pyopencga* library, the Python client of OpenCGA.\n\nWe assume that your workstation (Linux, Mac, Windows) is connected to the internet and has Python 3 and the *pip* package manager installed. We then show you how to:\n", - "\n", - "- Install *pyopencga*.\n", - "- Connect to an OpenCGA instance.\n", - "- Issue OpenCGA requests and work with responses.\n", - "- Launch asynchronous jobs and retrieve results.\n", - "\n", - "\n", - "Walk-through guides of some **common use cases** are provided in two further notebooks:
\n", - "- ADD LINK TO NOTEBOOK-02\n", - "- ADD LINK TO NOTEBOOK-03\n", - " \n", - "For reference, the methods implemented by *pyopencga* are are listed here:\n", - "- https:\/\/docs.google.com\/spreadsheets\/d\/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc\n", - "\n", - "The OpenCGA web service endpoints used by *pyopencga* are listed here:\n", - "- https:\/\/ws.opencb.org\/opencga-prod\/webservices\n", - "\n" - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "# 2. Installing and importing the *pyopencga* library\n", - "\n", - "You have two main options for get *pyopencga* installed in your python setup; from source code or using the Python *pip* package panager. We recommend the latter:\n", - "### 2.1. Install *pyopencga* with *pip*\n", - "\n", - "[PROVIDE INSTRUCTIONS FOR THE FOLLOWING] you can import pyopencga directly if you have installed *pyopencga* with PyPI (The Python Package Index).
For further documentation reffer to https:\/\/pypi.org\/project\/pyopencga\/.
The user just needs to access the console terminal (optionally within a python environment) and run:\n", - "\n", - "`$ pip install pyopencga`" - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "## 2.2. Importing the *pyopencga* library\n", - "\n", - "This is the recommended way of using *pyopencga* " - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", - "from pyopencga.opencga_client import OpencgaClient # import client module\n", - "from pprint import pprint\n", - "import json\n" - ], - "cell_type" : "code", - "execution_count" : 1, - "outputs" : [ - - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "## 2.3. Setup the Client and Login in *pyopencga* \n", - "\n", - "**Configuration and Credentials** \n", - "\n", - "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n", - "\n", - "Regarding credentials, you can set both user and password as two variables in the script. If you prefer not to show the password, it would be asked interactively without echo.\n" - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "### 1.3.1 Set variables for server host, user credentials and project owner" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "# server host\n", - "host = 'http:\/\/bioinfo.hpc.cam.ac.uk\/opencga-prod'\n", - "\n", - "# user credentials\n", - "user = \"demouser\"\n", - "passwd = \"demouser\" ## you can skip this, see below.\n", - "\n", - "# the user demo access projects from user opencga\n", - "prj_owner = \"demo\"" - ], - "cell_type" : "code", - "execution_count" : 2, - "outputs" : [ - - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "### 1.3.2 Creating ConfigClient dictionary for server connection configuration" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "# Creating ClientConfiguration dict\n", - "host = 'http:\/\/bioinfo.hpc.cam.ac.uk\/opencga-prod'\n", - "\n", - "config_dict = {\"rest\": {\n", - " \"host\": host \n", - " }\n", - " }\n", - "\n", - "print(\"Config information:\\n\",config_dict)\n", - "\n" - ], - "cell_type" : "code", - "execution_count" : 3, - "outputs" : [ - { - "name" : "stdout", - "text" : [ - "Config information:\n", - " {'rest': {'host': 'http:\/\/bioinfo.hpc.cam.ac.uk\/opencga-prod'}}\n" - ], - "output_type" : "stream" - } - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "### 1.3.3 Initialize the client configuration\n", - "\n", - "Now we need to pass the *config_dict* dictionary to the **ClientConfiguration** method" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "config = ClientConfiguration(config_dict)\n", - "oc = OpencgaClient(config)\n" - ], - "cell_type" : "code", - "execution_count" : 4, - "outputs" : [ - - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "### 1.3.4 Import the user credentials to the previously defined *OpencgaClient* instance and Login\n", - "\n", - "We can decide to pass the password as a variable, or just pass the user and be asked for the password interactively" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "# here we put only the user in order to be asked for the password interactively\n", - "# oc.login(user)" - ], - "cell_type" : "code", - "execution_count" : 26, - "outputs" : [ - - ] - }, - { - "metadata" : { - - }, - "source" : [ - "# or you can pass the user and passwd\n", - "oc.login(user, passwd)" - ], - "cell_type" : "code", - "execution_count" : 5, - "outputs" : [ - - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "#### ✅ Congrats! You are now connected to OpenCGA" - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "# 3. Understanding REST Response\n", - "\n", - "*pyopencga* queries web services that return a RESTResponse object, which might be difficult to interpretate. The RESTResponse type provide the data in a manner that is not as intuitive as a python list or dictionary. Because of this, we have develop a useful functionality that retrieves the data in a simpler format. \n", - "\n", - "[OpenCGA Client Libraries](http:\/\/docs.opencb.org\/display\/opencga\/Using+OpenCGA), including *pyopencga*, implement a **RESTReponse wrapper** to make even easier to work with REST web services responses.
REST responsess include metadata and OpenCGA 2.0.1 has been designed to work in a federation mode (more information about OpenCGA federations can be found **[here](http:\/\/docs.opencb.org\/display\/opencga\/Roadmapg)**).\n", - "\n", - "All these can make a first-time user to struggle when start working with the responses. Please read this brief documentation about **[OpenCGA RESTful Web Services](http:\/\/docs.opencb.org\/display\/opencga\/RESTful+Web+Services#RESTfulWebServices-OpenCGA2.x)**.\n", - "\n", - "Let's see a quick example of how to use RESTResponse wrapper in *pyopencga*. \n", - "You can get some extra inforamtion [here](http:\/\/docs.opencb.org\/display\/opencga\/Python#Python-WorkingwiththeRestResponse). Let's execute a first simple query to fetch all projects for the user **demouser** already logged in **[step 1.3](#1.3-Setup-the-client-and-login-in-pyopencga)**." - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "## Let's fecth the available projects.\n", - "## First let's get the project client and execute search() funciton\n", - "project_client = oc.projects\n", - "projects = project_client.search()\n", - "\n", - "## Uncomment this line to view the JSON response.\n", - "## NOTE: it incudes study information so this can be big\n", - "##pprint(projects.get_responses())" - ], - "cell_type" : "code", - "execution_count" : 28, - "outputs" : [ - - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "#### Although you can iterate through all the different projects provided by the response by executing the next chunk of code, this is a **not recommended** way.\n", - "We can explore this through an example; the next query iterates over all the projects retrieved from `projects.search()`" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "## Loop through all diferent projects \n", - "for project in projects.responses[0]['results']:\n", - " print(project['id'], project['name'])" - ], - "cell_type" : "code", - "execution_count" : 29, - "outputs" : [ - { - "name" : "stdout", - "text" : [ - "family Family Studies GRCh37\n", - "population Population Studies GRCh38\n" - ], - "output_type" : "stream" - } - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "## RestResponse API" - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "Note: Table with API funcitons and the description" - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "## Using the `get_results()` function \n", - "\n", - "Using the functions that *pyopencga* implements for the RestResponse object makes things much easier!
Let's dig into an example using the same query as above:" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "# Loop through all diferent projects \n", - "for project in projects.get_results():\n", - " print(project['id'], project['name'])" - ], - "cell_type" : "code", - "execution_count" : 30, - "outputs" : [ - { - "name" : "stdout", - "text" : [ - "family Family Studies GRCh37\n", - "population Population Studies GRCh38\n" - ], - "output_type" : "stream" - } - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "## Using the `result_iterator()` function to iterate over the Rest results\n", - "\n", - "You can also iterate results, this is specially interesting when fetching many results from the server:" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "## Iterate through all diferent projects \n", - "for project in projects.result_iterator():\n", - " print(project['id'], project['name'])" - ], - "cell_type" : "code", - "execution_count" : 31, - "outputs" : [ - { - "name" : "stdout", - "text" : [ - "family Family Studies GRCh37\n", - "population Population Studies GRCh38\n" - ], - "output_type" : "stream" - } - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "## Using `print_results()` function to iterate over the Rest results\n", - "\n", - "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "## This function iterates over all the results, it can be configured to exclude metadata, change separator or even select the fields!\n", - "projects.print_results()" - ], - "cell_type" : "code", - "execution_count" : 32, - "outputs" : [ - { - "name" : "stdout", - "text" : [ - "#Time: 81\n", - "#Num matches: -1\n", - "#Num results: 2\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tname\tuuid\tfqn\tcreationDate\tmodificationDate\tdescription\torganism\tcurrentRelease\tstudies\tinternal\tattributes\n", - "family\tFamily Studies GRCh37\teba0e1c7-0172-0001-0001-c7af712652b2\tdemo@family\t20200625131808\t20200625131808\t\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh37'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200625131808', 'description': ''}}\t{}\n", - "population\tPopulation Studies GRCh38\t25f2842a-0173-0001-0001-e7bcbedc77ff\tdemo@population\t20200706210517\t20200706210517\tSome population reference studies for GRCh38\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh38'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200706210517', 'description': ''}}\t{}\n" - ], - "output_type" : "stream" - } - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "##### Now, let's try to costumize the results so we can get printed only the portion of the data that we might be interested in" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "## Lets exclude metadata and print only few fields, use dot notation for ensted fields\n", - "projects.print_results(fields='id,name,organism.scientificName,organism.assembly',metadata=False)\n", - "print()\n" - ], - "cell_type" : "code", - "execution_count" : 33, - "outputs" : [ - { - "name" : "stdout", - "text" : [ - "#id\tname\torganism.scientificName\torganism.assembly\n", - "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\n", - "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\n", - "\n" - ], - "output_type" : "stream" - } - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "##### A very useful parameter is the *separator*.
It allows the user to decide the format in which the data is printed. For example, it's possible to print a CSV-like style:" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "## You can change separator\n", - "\n", - "print('Print the projects with a header and a different separator:\\n')\n", - "projects.print_results(fields='id,name,organism.scientificName,organism.assembly', separator=',', metadata=False)\n" - ], - "cell_type" : "code", - "execution_count" : 34, - "outputs" : [ - { - "name" : "stdout", - "text" : [ - "Print the projects with a header and a different separator:\n", - "\n", - "#id,name,organism.scientificName,organism.assembly\n", - "family,Family Studies GRCh37,Homo sapiens,GRCh37\n", - "population,Population Studies GRCh38,Homo sapiens,GRCh38\n" - ], - "output_type" : "stream" - } - ] - }, - { - "cell_type" : "markdown", - "source" : [ - "# 4. Working with JOBS" - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "OpenCGA implemtns a number of analysis and operations that are executed as jobs\n", - "\n", - "Note: Describe briefly how Jobs work and point to docs" - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "## Job Info\n", - "Decribe job information, ...\n" - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "## Executing Jobs\n", - "Lifecycle, status, ..." - ], - "metadata" : { - - } - }, - { - "cell_type" : "markdown", - "source" : [ - "### Example" - ], - "metadata" : { - - } - }, - { - "metadata" : { - - }, - "source" : [ - "## Eexecute GWAS analysis\n", - "rest_response = oc.variant().gwas()\n", - "\n", - "## wait for the job to finish\n", - "oc.wait_for_job(rest_response)\n", - "\n", - "rest_response.print_results()" - ], - "cell_type" : "code", - "execution_count" : 3, - "outputs" : [ - { - "evalue" : "name 'oc' is not defined", - "traceback" : [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mrest_response\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvariant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgwas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'oc' is not defined" - ], - "output_type" : "error", - "ename" : "NameError" - } - ] - }, - { - "metadata" : { - - }, - "source" : [ - - ], - "cell_type" : "code", - "execution_count" : null, - "outputs" : [ - - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# First Steps with *pyopencga*; the Python client of OpenCGA\n", + "------\n", + "# 1. Overview\n", + "\n", + "This notebook provides guidance for getting started with the *pyopencga* library, the Python client of OpenCGA.\n", + "\n", + "We assume that your workstation (Linux, Mac, Windows) is connected to the internet and has Python 3 and the *pip* package manager installed. We then show you how to:\n", + "\n", + "- Install *pyopencga*.\n", + "- Connect to an OpenCGA instance.\n", + "- Issue OpenCGA requests and work with responses.\n", + "- Launch asynchronous jobs and retrieve results.\n", + "\n", + "\n", + "Walk-through guides of some **common use cases** are provided in two further notebooks:
\n", + "- ADD LINK TO NOTEBOOK-02\n", + "- ADD LINK TO NOTEBOOK-03\n", + " \n", + "For reference, the methods implemented by *pyopencga* are are listed here:
\n", + " NOT HERE, need to update\n", + "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc\n", + "\n", + "The OpenCGA web service endpoints used by *pyopencga* are listed here:\n", + "- https://ws.opencb.org/opencga-prod/webservices\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. Installing and importing the *pyopencga* library\n", + "\n", + "You have two main options for get *pyopencga* installed in your python setup; from source code or using the Python *pip* package panager. We recommend the latter:\n", + "### 2.1. Install *pyopencga* with *pip*\n", + "\n", + "[PROVIDE INSTRUCTIONS FOR THE FOLLOWING] you can import pyopencga directly if you have installed *pyopencga* with PyPI (The Python Package Index).
For further documentation reffer to https://pypi.org/project/pyopencga/.
The user just needs to access the console terminal (optionally within a python environment) and run:\n", + "\n", + "`$ pip install pyopencga`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2. Importing the *pyopencga* library\n", + "\n", + "This is the recommended way of using *pyopencga* " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", + "from pyopencga.opencga_client import OpencgaClient # import client module\n", + "from pprint import pprint\n", + "import json\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3. Setup the Client and Login in *pyopencga* \n", + "\n", + "**Configuration and Credentials** \n", + "\n", + "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n", + "\n", + "Regarding credentials, you can set both user and password as two variables in the script. If you prefer not to show the password, it would be asked interactively without echo.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.3.1 Set variables for server host, user credentials and project owner" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# server host\n", + "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", + "\n", + "# user credentials\n", + "user = 'demouser'\n", + "passwd = 'demouser' ## you can skip this, see below.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.3.2 Creating ConfigClient dictionary for server connection configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Config information:\n", + " {'rest': {'host': 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'}}\n" + ] } - ], - "nbformat_minor" : 5, - "metadata" : { - "language_info" : { - "file_extension" : ".py", - "codemirror_mode" : { - "name" : "ipython", - "version" : 3 - }, - "mimetype" : "text\/x-python", - "pygments_lexer" : "ipython3", - "version" : "3.6.9", - "nbconvert_exporter" : "python", - "name" : "python" - }, - "kernelspec" : { - "name" : "python3", - "language" : "python", - "display_name" : "Python 3" + ], + "source": [ + "# Creating ClientConfiguration dict\n", + "\n", + "config_dict = {'rest': {\n", + " 'host': host \n", + " }\n", + " }\n", + "\n", + "print('Config information:\\n',config_dict)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.3.3 Initialize the Client \n", + "\n", + "Now we need to pass the *config_dict* dictionary to the **ClientConfiguration** method.
\n", + "Once we have the configuration defined as *config* (see below), we can initiate the client. This is the **most important step**.\n", + "\n", + "#### OpencgaClient: what is and why is so important?\n", + "\n", + "The `Opencgaclient` (see *oc* variable below) implements all the methods to query the REST api of OpenCGA. All the webservices abailable, can be directly accesed through the client." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'ClientConfiguration' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m## Create the configuration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mconfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mClientConfiguration\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m##### Define the client #####\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0moc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mOpencgaClient\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'ClientConfiguration' is not defined" + ] + } + ], + "source": [ + "## Create the configuration\n", + "config = ClientConfiguration(config_dict)\n", + "\n", + "##### Define the client #####\n", + "oc = OpencgaClient(config) #\n", + "#############################" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.3.4 Import the credentials and Login into OpenCGA\n", + "\n", + "We can decide to pass the password as a variable, or just pass the user and be asked for the password interactively" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Option 1: here we put only the user in order to be asked for the password interactively\n", + "# oc.login(user)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Option 2: you can pass the user and passwd\n", + "oc.login(user, passwd)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### ✅ Congrats! You are now connected to OpenCGA" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3. Understanding REST Response\n", + "\n", + "*pyopencga* queries web services that return a RESTResponse object, which might be difficult to interpretate. The RESTResponse type provide the data in a manner that is not as intuitive as a python list or dictionary. Because of this, we have develop a useful functionality that retrieves the data in a simpler format. \n", + "\n", + "[OpenCGA Client Libraries](http://docs.opencb.org/display/opencga/Using+OpenCGA), including *pyopencga*, implement a **RESTReponse wrapper** to make even easier to work with REST web services responses.
REST responsess include metadata and OpenCGA 2.0.1 has been designed to work in a federation mode (more information about OpenCGA federations can be found **[here](http://docs.opencb.org/display/opencga/Roadmapg)**).\n", + "\n", + "All these can make a first-time user to struggle when start working with the responses. Please read this brief documentation about **[OpenCGA RESTful Web Services](http://docs.opencb.org/display/opencga/RESTful+Web+Services#RESTfulWebServices-OpenCGA2.x)**.\n", + "\n", + "Let's see a quick example of how to use RESTResponse wrapper in *pyopencga*. \n", + "You can get some extra inforamtion [here](http://docs.opencb.org/display/opencga/Python#Python-WorkingwiththeRestResponse). Let's execute a first simple query to fetch all projects for the user **demouser** already logged in **[step 1.3](#1.3-Setup-the-client-and-login-in-pyopencga)**." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "## Let's fecth the available projects.\n", + "## First let's get the project client and execute search() funciton\n", + "project_client = oc.projects\n", + "projects = project_client.search()\n", + "\n", + "## Uncomment this line to view the JSON response.\n", + "## NOTE: it incudes study information so this can be big\n", + "##pprint(projects.get_responses())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Although you can iterate through all the different projects provided by the response by executing the next chunk of code, this is a **not recommended** way.\n", + "We can explore this through an example; the next query iterates over all the projects retrieved from `projects.search()`" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "family Family Studies GRCh37\n", + "population Population Studies GRCh38\n" + ] + } + ], + "source": [ + "## Loop through all diferent projects \n", + "for project in projects.responses[0]['results']:\n", + " print(project['id'], project['name'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RestResponse API" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note: Table with API funcitons and the description" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using the `get_results()` function \n", + "\n", + "Using the functions that *pyopencga* implements for the RestResponse object makes things much easier!
Let's dig into an example using the same query as above:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "family Family Studies GRCh37\n", + "population Population Studies GRCh38\n" + ] } + ], + "source": [ + "# Loop through all diferent projects \n", + "for project in projects.get_results():\n", + " print(project['id'], project['name'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using the `result_iterator()` function to iterate over the Rest results\n", + "\n", + "You can also iterate results, this is specially interesting when fetching many results from the server:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "family Family Studies GRCh37\n", + "population Population Studies GRCh38\n" + ] + } + ], + "source": [ + "## Iterate through all diferent projects \n", + "for project in projects.result_iterator():\n", + " print(project['id'], project['name'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using `print_results()` function to iterate over the Rest results\n", + "\n", + "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 81\n", + "#Num matches: -1\n", + "#Num results: 2\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tname\tuuid\tfqn\tcreationDate\tmodificationDate\tdescription\torganism\tcurrentRelease\tstudies\tinternal\tattributes\n", + "family\tFamily Studies GRCh37\teba0e1c7-0172-0001-0001-c7af712652b2\tdemo@family\t20200625131808\t20200625131808\t\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh37'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200625131808', 'description': ''}}\t{}\n", + "population\tPopulation Studies GRCh38\t25f2842a-0173-0001-0001-e7bcbedc77ff\tdemo@population\t20200706210517\t20200706210517\tSome population reference studies for GRCh38\t{'scientificName': 'Homo sapiens', 'commonName': '', 'assembly': 'GRCh38'}\t1\t.\t{'datastores': {}, 'status': {'name': 'READY', 'date': '20200706210517', 'description': ''}}\t{}\n" + ] + } + ], + "source": [ + "## This function iterates over all the results, it can be configured to exclude metadata, change separator or even select the fields!\n", + "projects.print_results()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Now, let's try to costumize the results so we can get printed only the portion of the data that we might be interested in" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#id\tname\torganism.scientificName\torganism.assembly\n", + "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\n", + "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\n", + "\n" + ] + } + ], + "source": [ + "## Lets exclude metadata and print only few fields, use dot notation for ensted fields\n", + "projects.print_results(fields='id,name,organism.scientificName,organism.assembly',metadata=False)\n", + "print()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### A very useful parameter is the *separator*.
It allows the user to decide the format in which the data is printed. For example, it's possible to print a CSV-like style:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Print the projects with a header and a different separator:\n", + "\n", + "#id,name,organism.scientificName,organism.assembly\n", + "family,Family Studies GRCh37,Homo sapiens,GRCh37\n", + "population,Population Studies GRCh38,Homo sapiens,GRCh38\n" + ] + } + ], + "source": [ + "## You can change separator\n", + "\n", + "print('Print the projects with a header and a different separator:\\n')\n", + "projects.print_results(fields='id,name,organism.scientificName,organism.assembly', separator=',', metadata=False)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. Working with JOBS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenCGA implemtns a number of analysis and operations that are executed as jobs\n", + "\n", + "Note: Describe briefly how Jobs work and point to docs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Job Info\n", + "Decribe job information, ...\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Executing Jobs\n", + "Lifecycle, status, ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'oc' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mrest_response\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvariant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgwas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'oc' is not defined" + ] + } + ], + "source": [ + "## Eexecute GWAS analysis\n", + "rest_response = oc.variant().gwas()\n", + "\n", + "## wait for the job to finish\n", + "oc.wait_for_job(rest_response)\n", + "\n", + "rest_response.print_results()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" }, - "nbformat" : 4 -} \ No newline at end of file + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb index 7c2eb0e0217..0acf7218fbb 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb @@ -13,7 +13,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 1. Overview\n", + "# Overview\n", "Note: Check Job info in the \"first steps\"" ] }, @@ -21,7 +21,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. VCF Export\n", + "# 1. VCF Export\n", "Note: provide a full documented example" ] }, @@ -29,7 +29,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 3. GWAS Analysis" + "# 2. GWAS Analysis" ] }, { @@ -56,7 +56,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index a68a44e6fe1..d0e8e55eb86 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -115,7 +115,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3. Aggrgation Files" + "## 3. Aggegation Files" ] }, { @@ -142,7 +142,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, From d889fb22eaa1c7439f16b3dc60d4be3b9199382e Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 16 Mar 2021 13:08:12 +0100 Subject: [PATCH 092/412] clinical: add warnings and control time expensive queries, #1693 --- .../opencga/clinical/rga/RgaManager.java | 166 +++++++++++------- 1 file changed, 103 insertions(+), 63 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 5e6c0eedbc9..4b4df66ea52 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -5,16 +5,14 @@ import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrException; -import org.opencb.commons.datastore.core.DataResult; -import org.opencb.commons.datastore.core.FacetField; -import org.opencb.commons.datastore.core.Query; -import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.AbstractManager; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.catalog.managers.SampleManager; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.clinical.StorageManager; import org.opencb.opencga.core.config.Configuration; @@ -22,6 +20,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; @@ -83,82 +82,123 @@ public OpenCGAResult individualQuery(String studyStr, Quer QueryOptions queryOptions = setDefaultLimit(options); - if (!auxQuery.containsKey("sampleId") && !auxQuery.containsKey("individualId")) { - // 1st. we perform a facet to get the different sample ids matching the user query - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, - new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID).append(QueryOptions.LIMIT, -1)); - List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + int limit = queryOptions.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); + int skip = queryOptions.getInt(QueryOptions.SKIP); + + long numTotalResults = 0; + List sampleIds; + Event event = null; + boolean count = queryOptions.getBoolean(QueryOptions.COUNT); + + if (auxQuery.isEmpty()) { + // TODO: We need to query only for the samples indexed in Solr + QueryOptions catalogOptions = new QueryOptions(SampleManager.INCLUDE_SAMPLE_IDS) + .append(QueryOptions.LIMIT, limit) + .append(QueryOptions.SKIP, skip) + .append(QueryOptions.COUNT, queryOptions.getBoolean(QueryOptions.COUNT)); + Query catalogQuery = new Query(); + if (!isOwnerOrAdmin) { + catalogQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); + } - if (sampleIds.isEmpty()) { + OpenCGAResult search = catalogManager.getSampleManager().search(study.getFqn(), catalogQuery, catalogOptions, token); + if (search.getNumResults() == 0) { return OpenCGAResult.empty(KnockoutByIndividual.class); } - auxQuery.put("sampleId", sampleIds); - } - // From the list of sample ids the user wants to retrieve data from, we filter those for which the user has permissions - Query sampleQuery = new Query(); - if (!isOwnerOrAdmin) { - sampleQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); - } + sampleIds = search.getResults().stream().map(Sample::getId).collect(Collectors.toList()); + numTotalResults = search.getNumMatches(); + } else { + if (!auxQuery.containsKey("sampleId") && !auxQuery.containsKey("individualId")) { + // 1st. we perform a facet to get the different sample ids matching the user query + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, + new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID).append(QueryOptions.LIMIT, -1)); + List samples = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - int numTotalResults = 0; - int limit = queryOptions.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); - int skip = queryOptions.getInt(QueryOptions.SKIP); - List sampleIds; + if (samples.isEmpty()) { + return OpenCGAResult.empty(KnockoutByIndividual.class); + } + auxQuery.put("sampleId", samples); + } - List authorisedSamples = new LinkedList<>(); - if (!isOwnerOrAdmin || !auxQuery.containsKey("sampleId")) { - int batchSize = 1000; - int currentBatch = 0; - boolean queryNextBatch = true; - - String sampleQueryField; - List values; - if (auxQuery.containsKey("individualId")) { - sampleQueryField = SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(); - values = auxQuery.getAsStringList("individualId"); - } else { - sampleQueryField = SampleDBAdaptor.QueryParams.ID.key(); - values = auxQuery.getAsStringList("sampleId"); + // From the list of sample ids the user wants to retrieve data from, we filter those for which the user has permissions + Query sampleQuery = new Query(); + if (!isOwnerOrAdmin) { + sampleQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); } - while (queryNextBatch) { - List tmpValues = values.subList(currentBatch, Math.min(values.size(), batchSize + currentBatch)); + List authorisedSamples = new LinkedList<>(); + if (!isOwnerOrAdmin || !auxQuery.containsKey("sampleId")) { + int maxSkip = 10000; + if (skip > maxSkip) { + throw new RgaException("Cannot paginate further than " + maxSkip + " individuals. Please, narrow down your query."); + } - sampleQuery.put(sampleQueryField, tmpValues); - OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); - authorisedSamples.addAll((Collection) authorisedSampleIdResult.getResults()); - - if (values.size() < batchSize + currentBatch) { - queryNextBatch = false; - numTotalResults = authorisedSamples.size(); - } else if (authorisedSamples.size() > skip + limit) { - queryNextBatch = false; - // We will get an approximate number of total results - numTotalResults = Math.round(((float) authorisedSamples.size() * values.size()) / (currentBatch + batchSize)); + int batchSize = 1000; + int currentBatch = 0; + boolean queryNextBatch = true; + + String sampleQueryField; + List values; + if (auxQuery.containsKey("individualId")) { + sampleQueryField = SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(); + values = auxQuery.getAsStringList("individualId"); } else { - currentBatch += batchSize; + sampleQueryField = SampleDBAdaptor.QueryParams.ID.key(); + values = auxQuery.getAsStringList("sampleId"); + } + + if (count && values.size() > maxSkip) { + event = new Event(Event.Type.WARNING, "numMatches value is approximated considering the individuals that are " + + "accessible for the user from the first batch of 10000 individuals matching the solr query."); } + + while (queryNextBatch) { + List tmpValues = values.subList(currentBatch, Math.min(values.size(), batchSize + currentBatch)); + + sampleQuery.put(sampleQueryField, tmpValues); + OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + authorisedSamples.addAll((Collection) authorisedSampleIdResult.getResults()); + + if (values.size() < batchSize + currentBatch) { + queryNextBatch = false; + numTotalResults = authorisedSamples.size(); + } else if (count && currentBatch < maxSkip) { + currentBatch += batchSize; + } else if (authorisedSamples.size() > skip + limit) { + queryNextBatch = false; + // We will get an approximate number of total results + numTotalResults = Math.round(((float) authorisedSamples.size() * values.size()) / (currentBatch + batchSize)); + } else { + currentBatch += batchSize; + } + } + } else { + authorisedSamples = auxQuery.getAsStringList("sampleId"); + numTotalResults = authorisedSamples.size(); } - } else { - authorisedSamples = auxQuery.getAsStringList("sampleId"); - numTotalResults = authorisedSamples.size(); - } - if (skip == 0 && limit > authorisedSamples.size()) { - sampleIds = authorisedSamples; - } else if (skip > authorisedSamples.size()) { - return OpenCGAResult.empty(KnockoutByIndividual.class); - } else { - int to = Math.min(authorisedSamples.size(), skip + limit); - sampleIds = authorisedSamples.subList(skip, to); + if (skip == 0 && limit > authorisedSamples.size()) { + sampleIds = authorisedSamples; + } else if (skip > authorisedSamples.size()) { + return OpenCGAResult.empty(KnockoutByIndividual.class); + } else { + int to = Math.min(authorisedSamples.size(), skip + limit); + sampleIds = authorisedSamples.subList(skip, to); + } } auxQuery.put("sampleId", sampleIds); OpenCGAResult result = rgaEngine.individualQuery(collection, auxQuery, queryOptions); - result.setNumMatches(numTotalResults); + if (count) { + result.setNumMatches(numTotalResults); + } + if (event != null) { + result.setEvents(Collections.singletonList(event)); + } result.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); return result; From ddb1a42eeee77342a38716927d22f7655e4190d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 16 Mar 2021 16:11:50 +0000 Subject: [PATCH 093/412] storage: Allow modify variant storage configuration per study #1721 --- .../manager/VariantStorageManager.java | 122 ++++++++++++------ .../manager/VariantStorageManagerTest.java | 32 ++++- .../catalog/db/api/StudyDBAdaptor.java | 3 + .../db/mongodb/StudyMongoDBAdaptor.java | 4 +- .../catalog/managers/StudyManager.java | 38 ++++++ .../catalog/managers/StudyManagerTest.java | 31 +++++ .../core/models/study/StudyInternal.java | 28 ++-- .../StudyVariantEngineConfiguration.java | 40 ++++++ .../VariantOperationWebService.java | 33 +++-- .../storage/core/StorageEngineFactory.java | 21 +-- 10 files changed, 282 insertions(+), 70 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyVariantEngineConfiguration.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java index 6a334bf19be..6794eebebf3 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java @@ -245,7 +245,7 @@ public void annotate(String study, String region, String outDir, ObjectMap param public void annotationLoad(String projectStr, List studies, String loadFile, ObjectMap params, String token) throws CatalogException, StorageEngineException { String projectId = getProjectId(projectStr, studies, token); - secureOperation(VariantAnnotationIndexOperationTool.ID, projectId, studies, params, token, engine -> { + secureOperationByProject(VariantAnnotationIndexOperationTool.ID, projectId, studies, params, token, engine -> { new VariantAnnotationOperationManager(this, engine) .annotationLoad(projectStr, getStudiesFqn(studies, token), params, loadFile, token); return null; @@ -310,9 +310,8 @@ public void deleteStats(List cohorts, String studyId, String token) { } public List listVariantScores(String study, String token) throws CatalogException, StorageEngineException { + VariantStorageEngine engine = getVariantStorageEngine(study, token); String studyFqn = getStudyFqn(study, token); - DataStore dataStore = getDataStore(studyFqn, token); - VariantStorageEngine engine = getVariantStorageEngine(dataStore); return engine.getMetadataManager().getStudyMetadata(studyFqn).getVariantScores(); } @@ -445,15 +444,42 @@ public ObjectMap configureProject(String projectStr, ObjectMap params, String to }); } -// public void configureStudy(String studyStr, ObjectMap params, String token) throws CatalogException, StorageEngineException { -// secureOperation("configure", studyStr, params, token, engine -> { + public ObjectMap configureStudy(String studyStr, ObjectMap params, String token) throws CatalogException, StorageEngineException { + return secureOperation("configure", studyStr, params, token, engine -> { + Study study = catalogManager.getStudyManager() + .get(studyStr, + new QueryOptions(INCLUDE, StudyDBAdaptor.QueryParams.INTERNAL_VARIANT_ENGINE_CONFIGURATION_OPTIONS.key()), + token) + .first(); + ObjectMap options; + if (study.getInternal() != null + && study.getInternal().getVariantEngineConfiguration() != null + && study.getInternal().getVariantEngineConfiguration().getOptions() != null) { + options = study.getInternal().getVariantEngineConfiguration().getOptions(); + } else { + options = new ObjectMap(); + } + options.putAll(params); + catalogManager.getStudyManager() + .setVariantEngineConfigurationOptions(studyStr, options, token); // String studyFqn = getStudyFqn(studyStr, token); // engine.getConfigurationManager().configureStudy(studyFqn, params); + return options; + }); + } + +// public void configureSampleIndex(String studyStr, SampleIndexConfiguration sampleIndexConfiguration, String token) +// throws CatalogException, StorageEngineException { +// secureOperation("configure", studyStr, new ObjectMap(), token, engine -> { +// String studyFqn = getStudyFqn(studyStr, token); +// StudyMetadata studyMetadata = engine.getMetadataManager().getStudyMetadata(studyFqn); +// +// catalogManager.getStudyManager() +// .setVariantEngineConfigurationSampleIndex(studyStr, sampleIndexConfiguration, token); // return null; // }); // } - // ---------------------// // Query methods // // ---------------------// @@ -567,10 +593,7 @@ public VariantDBIterator iterator(String token) throws CatalogException, Storage public VariantDBIterator iterator(Query query, QueryOptions queryOptions, String token) throws CatalogException, StorageEngineException { - String study = catalogUtils.getAnyStudy(query, token); - - DataStore dataStore = getDataStore(study, token); - VariantStorageEngine storageEngine = getVariantStorageEngine(dataStore); + VariantStorageEngine storageEngine = getVariantStorageEngine(query, token); catalogUtils.parseQuery(query, token); checkSamplesPermissions(query, queryOptions, storageEngine.getMetadataManager(), token); return storageEngine.iterator(query, queryOptions); @@ -773,21 +796,46 @@ public SampleMetadata getSampleMetadata(String study, String sample, String toke }); } + protected VariantStorageEngine getVariantStorageEngineForStudyOperation(String studyStr, ObjectMap params, String token) + throws StorageEngineException, CatalogException { +// String projectFqn = catalogManager.getStudyManager().getProjectFqn(getStudyFqn(study, token)); + Study study = catalogManager.getStudyManager() + .get(studyStr, new QueryOptions(INCLUDE, Arrays.asList( + StudyDBAdaptor.QueryParams.FQN.key(), + StudyDBAdaptor.QueryParams.INTERNAL_VARIANT_ENGINE_CONFIGURATION.key())), token) + .first(); + + DataStore dataStore = getDataStore(study.getFqn(), token); + VariantStorageEngine variantStorageEngine = storageEngineFactory + .getVariantStorageEngine(dataStore.getStorageEngine(), dataStore.getDbName(), study.getFqn()); + if (dataStore.getConfiguration() != null) { + variantStorageEngine.getOptions().putAll(dataStore.getConfiguration()); + } + if (study.getInternal() != null + && study.getInternal().getVariantEngineConfiguration() != null + && study.getInternal().getVariantEngineConfiguration().getOptions() != null) { + variantStorageEngine.getOptions().putAll(study.getInternal().getVariantEngineConfiguration().getOptions()); + } + if (params != null) { + variantStorageEngine.getOptions().putAll(params); + } + return variantStorageEngine; + } + protected VariantStorageEngine getVariantStorageEngine(Query query, String token) throws CatalogException, StorageEngineException { String study = catalogUtils.getAnyStudy(query, token); - - catalogUtils.parseQuery(query, token); - DataStore dataStore = getDataStore(study, token); - return getVariantStorageEngine(dataStore); + return getVariantStorageEngine(study, token); } - protected VariantStorageEngine getVariantStorageEngine(String study, String token) throws StorageEngineException, CatalogException { + protected VariantStorageEngine getVariantStorageEngine(String study, String token) + throws StorageEngineException, CatalogException { DataStore dataStore = getDataStore(study, token); return getVariantStorageEngine(dataStore); } - protected VariantStorageEngine getVariantStorageEngine(String study, ObjectMap params, String token) throws StorageEngineException, CatalogException { - DataStore dataStore = getDataStore(study, token); + protected VariantStorageEngine getVariantStorageEngineByProject(String project, ObjectMap params, String token) + throws StorageEngineException, CatalogException { + DataStore dataStore = getDataStoreByProjectId(project, token); VariantStorageEngine variantStorageEngine = getVariantStorageEngine(dataStore); if (params != null) { variantStorageEngine.getOptions().putAll(params); @@ -795,7 +843,7 @@ protected VariantStorageEngine getVariantStorageEngine(String study, ObjectMap p return variantStorageEngine; } - protected VariantStorageEngine getVariantStorageEngine(DataStore dataStore) throws StorageEngineException { + private VariantStorageEngine getVariantStorageEngine(DataStore dataStore) throws StorageEngineException { VariantStorageEngine variantStorageEngine = storageEngineFactory .getVariantStorageEngine(dataStore.getStorageEngine(), dataStore.getDbName()); if (dataStore.getConfiguration() != null) { @@ -906,10 +954,7 @@ private interface VariantOperationFunction { private R secureOperationByProject(String operationName, String project, ObjectMap params, String token, VariantOperationFunction operation) throws CatalogException, StorageEngineException { - try (VariantStorageEngine variantStorageEngine = getVariantStorageEngine(getDataStoreByProjectId(project, token))) { - if (params != null) { - variantStorageEngine.getOptions().putAll(params); - } + try (VariantStorageEngine variantStorageEngine = getVariantStorageEngineByProject(project, params, token)) { return secureOperation(operationName, params, token, variantStorageEngine, operation); } catch (IOException e) { throw new StorageEngineException("Error closing the VariantStorageEngine", e); @@ -918,24 +963,24 @@ private R secureOperationByProject(String operationName, String project, Obj private R secureOperation(String operationName, String study, ObjectMap params, String token, VariantOperationFunction operation) throws CatalogException, StorageEngineException { - try (VariantStorageEngine variantStorageEngine = getVariantStorageEngine(study, params, token)) { + try (VariantStorageEngine variantStorageEngine = getVariantStorageEngineForStudyOperation(study, params, token)) { return secureOperation(operationName, params, token, variantStorageEngine, operation); } catch (IOException e) { throw new StorageEngineException("Error closing the VariantStorageEngine", e); } } - private R secureOperation(String operationName, String projectStr, String study, ObjectMap params, String token, VariantOperationFunction operation) - throws CatalogException, StorageEngineException { - List studies = Collections.emptyList(); - if (StringUtils.isNotEmpty(study)) { - studies = Arrays.asList(study.split(",")); - } - return secureOperation(operationName, projectStr, studies, params, token, operation); - } +// private R secureOperation(String operationName, String projectStr, String study, ObjectMap params, String token, VariantOperationFunction operation) +// throws CatalogException, StorageEngineException { +// List studies = Collections.emptyList(); +// if (StringUtils.isNotEmpty(study)) { +// studies = Arrays.asList(study.split(",")); +// } +// return secureOperation(operationName, projectStr, studies, params, token, operation); +// } - private R secureOperation(String operationName, String projectStr, List studies, ObjectMap params, String token, - VariantOperationFunction operation) + private R secureOperationByProject(String operationName, String projectStr, List studies, ObjectMap params, String token, + VariantOperationFunction operation) throws CatalogException, StorageEngineException { projectStr = getProjectId(projectStr, studies, token); return secureOperationByProject(operationName, projectStr, params, token, operation); @@ -992,6 +1037,7 @@ private R secureOperation(String operationName, ObjectMap params, String tok private R secure(Query query, QueryOptions queryOptions, String token, VariantReadOperation supplier) throws CatalogException, StorageEngineException { VariantStorageEngine variantStorageEngine = getVariantStorageEngine(query, token); + catalogUtils.parseQuery(query, token); checkSamplesPermissions(query, queryOptions, variantStorageEngine.getMetadataManager(), token); return supplier.apply(variantStorageEngine); } @@ -1004,18 +1050,14 @@ private R secure(Query query, QueryOptions queryOptions, String token, Enums .append("queryOptions", new QueryOptions(queryOptions)); R result = null; String userId = catalogManager.getUserManager().getUserId(token); - String dbName = null; Exception exception = null; StopWatch totalStopWatch = StopWatch.createStarted(); StopWatch storageStopWatch = null; try { - String study = catalogUtils.getAnyStudy(query, token); - StopWatch stopWatch = StopWatch.createStarted(); catalogUtils.parseQuery(query, token); auditAttributes.append("catalogParseQueryTimeMillis", stopWatch.getTime(TimeUnit.MILLISECONDS)); - DataStore dataStore = getDataStore(study, token); - VariantStorageEngine variantStorageEngine = getVariantStorageEngine(dataStore); + VariantStorageEngine variantStorageEngine = getVariantStorageEngine(query, token); stopWatch = StopWatch.createStarted(); checkSamplesPermissions(query, queryOptions, variantStorageEngine.getMetadataManager(), auditAction, token); @@ -1062,9 +1104,7 @@ private R secure(Query query, QueryOptions queryOptions, String token, Enums private Map> checkSamplesPermissions(Query query, QueryOptions queryOptions, String token) throws CatalogException, StorageEngineException, IOException { - String study = catalogUtils.getAnyStudy(query, token); - DataStore dataStore = getDataStore(study, token); - VariantStorageEngine variantStorageEngine = getVariantStorageEngine(dataStore); + VariantStorageEngine variantStorageEngine = getVariantStorageEngine(query, token); return checkSamplesPermissions(query, queryOptions, variantStorageEngine.getMetadataManager(), token); } diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManagerTest.java index a219b7ba345..750f9a1a837 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManagerTest.java @@ -25,11 +25,12 @@ import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; +import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import java.util.Collections; import java.util.HashSet; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; public class VariantStorageManagerTest extends AbstractVariantOperationManagerTest { @@ -41,16 +42,41 @@ protected Aggregation getAggregation() { @Test public void testConfigure() throws CatalogException, StorageEngineException { - ObjectMap expectedConfiguration = new ObjectMap("Key", "value"); + ObjectMap expectedConfiguration = new ObjectMap("Key", "value").append("otherKey", "generalValue"); String existingKey = variantManager.getVariantStorageEngine(studyId, sessionId).getOptions().keySet().iterator().next(); expectedConfiguration.put(existingKey, "NEW_VALUE"); + ObjectMap expectedStudyConfiguration1 = new ObjectMap(expectedConfiguration) + .append("KeyFromThisStudy", "12342134") + .append(existingKey, "NEW_VALUE_STUDY_1"); + ObjectMap expectedStudyConfiguration2 = new ObjectMap(expectedConfiguration) + .append("KeyFromTheSecondStudy", "afdfwef") + .append(existingKey, "NEW_VALUE_STUDY_2"); + variantManager.configureProject(projectId, expectedConfiguration, sessionId); + variantManager.configureStudy(studyFqn, expectedStudyConfiguration1, sessionId); + variantManager.configureStudy(studyId2, expectedStudyConfiguration2, sessionId); ObjectMap configuration = variantManager.getDataStoreByProjectId(projectId, sessionId).getConfiguration(); assertEquals(expectedConfiguration, configuration); - assertEquals("NEW_VALUE", variantManager.getVariantStorageEngine(studyId, sessionId).getOptions().get(existingKey)); + VariantStorageEngine vse = variantManager.getVariantStorageEngine(studyId, sessionId); + VariantStorageEngine vse1 = variantManager.getVariantStorageEngineForStudyOperation(studyFqn, null, sessionId); + VariantStorageEngine vse2 = variantManager.getVariantStorageEngineForStudyOperation(studyId2, null, sessionId); + + expectedConfiguration.forEach((k, v) -> assertEquals(v, vse.getOptions().get(k))); + expectedStudyConfiguration1.forEach((k, v) -> assertEquals(v, vse1.getOptions().get(k))); + expectedStudyConfiguration2.forEach((k, v) -> assertEquals(v, vse2.getOptions().get(k))); + assertEquals("NEW_VALUE", vse.getOptions().get(existingKey)); + assertEquals("NEW_VALUE_STUDY_1", vse1.getOptions().get(existingKey)); + + assertNull(vse.getOptions().get("KeyFromThisStudy")); + assertNotNull(vse1.getOptions().get("KeyFromThisStudy")); + assertNull(vse2.getOptions().get("KeyFromThisStudy")); + + assertNull(vse.getOptions().get("KeyFromTheSecondStudy")); + assertNull(vse1.getOptions().get("KeyFromTheSecondStudy")); + assertNotNull(vse2.getOptions().get("KeyFromTheSecondStudy")); } @Test diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java index af510dc757e..2594cdf1d8a 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java @@ -430,6 +430,9 @@ enum QueryParams implements QueryParam { INTERNAL_STATUS("internal.status", TEXT_ARRAY, ""), INTERNAL_STATUS_NAME("internal.status.name", TEXT, ""), INTERNAL_STATUS_DATE("internal.status.date", TEXT, ""), + INTERNAL_VARIANT_ENGINE_CONFIGURATION("internal.variantEngineConfiguration", Type.OBJECT, ""), + INTERNAL_VARIANT_ENGINE_CONFIGURATION_OPTIONS("internal.variantEngineConfiguration.options", Type.OBJECT, ""), + INTERNAL_VARIANT_ENGINE_CONFIGURATION_SAMPLE_INDEX("internal.variantEngineConfiguration.sampleIndex", Type.OBJECT, ""), DATASTORES("dataStores", TEXT_ARRAY, ""), SIZE("size", INTEGER_ARRAY, ""), URI("uri", TEXT_ARRAY, ""), diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java index 15d8472ff84..c781fc5baff 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java @@ -1344,8 +1344,10 @@ static Document getDocumentUpdateParams(ObjectMap parameters) throws CatalogDBEx String[] acceptedMapParams = {QueryParams.ATTRIBUTES.key()}; filterMapParams(parameters, studyParameters, acceptedMapParams); - final String[] acceptedObjectParams = {QueryParams.STATUS.key(), QueryParams.CONFIGURATION_CLINICAL.key()}; + final String[] acceptedObjectParams = {QueryParams.STATUS.key(), QueryParams.CONFIGURATION_CLINICAL.key(), + QueryParams.INTERNAL_VARIANT_ENGINE_CONFIGURATION.key()}; filterObjectParams(parameters, studyParameters, acceptedObjectParams); + if (studyParameters.containsKey(QueryParams.STATUS.key())) { nestedPut(QueryParams.STATUS_DATE.key(), TimeUtils.getTime(), studyParameters); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java index c68ca147f51..02a80aecc38 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java @@ -40,6 +40,7 @@ import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.models.clinical.ClinicalAnalysisAclEntry; import org.opencb.opencga.core.models.cohort.CohortAclEntry; import org.opencb.opencga.core.models.common.CustomStatus; @@ -1531,6 +1532,43 @@ private QueryOptions setFacetFields(String fields) { return queryOptions; } + // ************************** Protected internal methods ******************************** // + + public void setVariantEngineConfigurationOptions(String studyStr, ObjectMap options, String token) throws CatalogException { + String userId = catalogManager.getUserManager().getUserId(token); + Study study = get(studyStr, new QueryOptions(QueryOptions.INCLUDE, Arrays.asList( + StudyDBAdaptor.QueryParams.UID.key(), + StudyDBAdaptor.QueryParams.INTERNAL_VARIANT_ENGINE_CONFIGURATION.key())), token).first(); + + authorizationManager.checkIsOwnerOrAdmin(study.getUid(), userId); + StudyVariantEngineConfiguration configuration = study.getInternal().getVariantEngineConfiguration(); + if (configuration == null) { + configuration = new StudyVariantEngineConfiguration(); + } + configuration.setOptions(options); + + ObjectMap parameters = new ObjectMap(StudyDBAdaptor.QueryParams.INTERNAL_VARIANT_ENGINE_CONFIGURATION.key(), configuration); + studyDBAdaptor.update(study.getUid(), parameters, QueryOptions.empty()); + } + + public void setVariantEngineConfigurationSampleIndex(String studyStr, SampleIndexConfiguration sampleIndexConfiguration, String token) + throws CatalogException { + String userId = catalogManager.getUserManager().getUserId(token); + Study study = get(studyStr, new QueryOptions(QueryOptions.INCLUDE, Arrays.asList( + StudyDBAdaptor.QueryParams.UID.key(), + StudyDBAdaptor.QueryParams.INTERNAL_VARIANT_ENGINE_CONFIGURATION.key())), token).first(); + + authorizationManager.checkIsOwnerOrAdmin(study.getUid(), userId); + StudyVariantEngineConfiguration configuration = study.getInternal().getVariantEngineConfiguration(); + if (configuration == null) { + configuration = new StudyVariantEngineConfiguration(); + } + configuration.setSampleIndex(sampleIndexConfiguration); + + ObjectMap parameters = new ObjectMap(StudyDBAdaptor.QueryParams.INTERNAL_VARIANT_ENGINE_CONFIGURATION.key(), configuration); + studyDBAdaptor.update(study.getUid(), parameters, QueryOptions.empty()); + } + // ************************** Private methods ******************************** // private boolean existsGroup(long studyId, String groupId) throws CatalogDBException { diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/StudyManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/StudyManagerTest.java index f5a8ce90a42..69d8bdcd887 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/StudyManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/StudyManagerTest.java @@ -19,9 +19,11 @@ import org.apache.avro.Schema; import org.apache.solr.common.StringUtils; import org.junit.Test; +import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.utils.AvroToAnnotationConverter; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.study.StudyUpdateParams; import org.opencb.opencga.core.models.study.Variable; @@ -144,4 +146,33 @@ public void updateClinicalConfiguration() throws CatalogException { assertTrue(study.getConfiguration().getClinical().getFlags().isEmpty()); assertTrue(study.getConfiguration().getClinical().getStatus().isEmpty()); } + + + @Test + public void testSetVariantEngineConfiguration() throws CatalogException { + Study study = catalogManager.getStudyManager().get(studyFqn, null, token).first(); + System.out.println("getVariantEngineConfiguration() = " + + study.getInternal().getVariantEngineConfiguration()); + + catalogManager.getStudyManager().setVariantEngineConfigurationOptions(studyFqn, new ObjectMap("k1", "v1"), token); + study = catalogManager.getStudyManager().get(studyFqn, null, token).first(); + System.out.println("getVariantEngineConfiguration() = " + + study.getInternal().getVariantEngineConfiguration()); + assertEquals(new ObjectMap("k1", "v1"), study.getInternal().getVariantEngineConfiguration().getOptions()); + + catalogManager.getStudyManager().setVariantEngineConfigurationOptions(studyFqn, new ObjectMap("k2", "v2"), token); + study = catalogManager.getStudyManager().get(studyFqn, null, token).first(); + System.out.println("getVariantEngineConfiguration() = " + + study.getInternal().getVariantEngineConfiguration()); + assertEquals(new ObjectMap("k2", "v2"), study.getInternal().getVariantEngineConfiguration().getOptions()); + + SampleIndexConfiguration sampleIndexConfiguration = SampleIndexConfiguration.defaultConfiguration(); + catalogManager.getStudyManager() + .setVariantEngineConfigurationSampleIndex(studyFqn, sampleIndexConfiguration, token); + study = catalogManager.getStudyManager().get(studyFqn, null, token).first(); + System.out.println("getVariantEngineConfiguration() = " + + study.getInternal().getVariantEngineConfiguration()); + assertEquals(sampleIndexConfiguration, study.getInternal().getVariantEngineConfiguration().getSampleIndex()); + + } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyInternal.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyInternal.java index 0a1ec3a4656..5ddce464a03 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyInternal.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyInternal.java @@ -21,7 +21,7 @@ public class StudyInternal { private Status status; - + private StudyVariantEngineConfiguration variantEngineConfiguration; public StudyInternal() { } @@ -30,14 +30,6 @@ public StudyInternal(Status status) { this.status = status; } - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("InternalStudy{"); - sb.append("status=").append(status); - sb.append('}'); - return sb.toString(); - } - public Status getStatus() { return status; } @@ -46,4 +38,22 @@ public StudyInternal setStatus(Status status) { this.status = status; return this; } + + public StudyVariantEngineConfiguration getVariantEngineConfiguration() { + return variantEngineConfiguration; + } + + public StudyInternal setVariantEngineConfiguration(StudyVariantEngineConfiguration variantEngineConfiguration) { + this.variantEngineConfiguration = variantEngineConfiguration; + return this; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("StudyInternal{"); + sb.append("status=").append(status); + sb.append(", variantEngineConfiguration=").append(variantEngineConfiguration); + sb.append('}'); + return sb.toString(); + } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyVariantEngineConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyVariantEngineConfiguration.java new file mode 100644 index 00000000000..30358432fab --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyVariantEngineConfiguration.java @@ -0,0 +1,40 @@ +package org.opencb.opencga.core.models.study; + +import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; + +public class StudyVariantEngineConfiguration { + + private ObjectMap options; + private SampleIndexConfiguration sampleIndex; + + public StudyVariantEngineConfiguration() { + } + + public ObjectMap getOptions() { + return options; + } + + public StudyVariantEngineConfiguration setOptions(ObjectMap options) { + this.options = options; + return this; + } + + public SampleIndexConfiguration getSampleIndex() { + return sampleIndex; + } + + public StudyVariantEngineConfiguration setSampleIndex(SampleIndexConfiguration sampleIndex) { + this.sampleIndex = sampleIndex; + return this; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("StudyVariantEngineConfiguration{"); + sb.append("options=").append(options.toJson()); + sb.append(", sampleIndex=").append(sampleIndex); + sb.append('}'); + return sb.toString(); + } +} diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java index 61dafbb423c..16168aa8b3b 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java @@ -66,19 +66,19 @@ public VariantOperationWebService(String version, @Context UriInfo uriInfo, @Con @POST @Path("/variant/configure") - @ApiOperation(value = VariantSecondaryIndexOperationTool.DESCRIPTION, response = ObjectMap.class) - public Response secondaryIndex( + @ApiOperation(value = "Update Variant Storage Engine configuration. Can be updated at Project or Study level", response = ObjectMap.class) + public Response variantConfigure( @ApiParam(value = ParamConstants.PROJECT_DESCRIPTION) @QueryParam(ParamConstants.PROJECT_PARAM) String project, -// @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, @ApiParam(value = "Configuration params to update") ObjectMap params) { return run(() -> { ObjectMap newConfiguration; StopWatch stopWatch = StopWatch.createStarted(); -// if (StringUtils.isNotEmpty(study)) { -// variantManager.configureStudy(study, params, token); -// } else { - newConfiguration = variantManager.configureProject(project, params, token); -// } + if (StringUtils.isNotEmpty(study)) { + newConfiguration = variantManager.configureStudy(study, params, token); + } else { + newConfiguration = variantManager.configureProject(project, params, token); + } return new DataResult<>() .setResults(Collections.singletonList(newConfiguration)) .setNumResults(1) @@ -232,6 +232,23 @@ public Response scoreDelete( return submitOperation(VariantScoreDeleteParams.ID, params, jobName, jobDescription, dependsOn, jobTags); } +// @POST +// @Path("/variant/sample/genotype/index/configure") +// @ApiOperation(value = "Update SampleIndex configuration", response = ObjectMap.class) +// public Response sampleIndexConfigure( +// @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, +// @ApiParam(value = "New SampleIndexConfiguration") SampleIndexConfiguration sampleIndexConfiguration) { +// return run(() -> { +// StopWatch stopWatch = StopWatch.createStarted(); +// variantManager.configureSampleIndex(study, sampleIndexConfiguration, token); +// +// return new DataResult<>() +// .setResults(Collections.singletonList(sampleIndexConfiguration)) +// .setNumResults(1) +// .setTime(((int) stopWatch.getTime(TimeUnit.MILLISECONDS))); +// }); +// } + @POST @Path("/variant/sample/genotype/index") @ApiOperation(value = VariantSampleIndexOperationTool.DESCRIPTION, response = Job.class) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java index 9e3784e96a1..1b121b65d0f 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java @@ -89,7 +89,7 @@ public static StorageEngineFactory get(StorageConfiguration storageConfiguration public AlignmentStorageEngine getAlignmentStorageEngine(String dbName) throws StorageEngineException { - return getStorageEngine(Type.ALIGNMENT, null, AlignmentStorageEngine.class, alignmentStorageEngineMap, dbName); + return getStorageEngine(Type.ALIGNMENT, null, AlignmentStorageEngine.class, alignmentStorageEngineMap, dbName, null); } public VariantStorageEngine getVariantStorageEngine() throws StorageEngineException { @@ -98,11 +98,16 @@ public VariantStorageEngine getVariantStorageEngine() throws StorageEngineExcept public VariantStorageEngine getVariantStorageEngine(String storageEngineName, String dbName) throws StorageEngineException { - return getStorageEngine(Type.VARIANT, storageEngineName, VariantStorageEngine.class, variantStorageEngineMap, dbName); + return getVariantStorageEngine(storageEngineName, dbName, null); + } + + public VariantStorageEngine getVariantStorageEngine(String storageEngineName, String dbName, String engineAlias) + throws StorageEngineException { + return getStorageEngine(Type.VARIANT, storageEngineName, VariantStorageEngine.class, variantStorageEngineMap, dbName, engineAlias); } private synchronized T getStorageEngine(Type type, String storageEngineId, Class superClass, - Map storageEnginesMap, String dbName) + Map storageEnginesMap, String dbName, String engineAlias) throws StorageEngineException { /* * This new block of code use new StorageConfiguration system, it must replace older one @@ -116,7 +121,7 @@ private synchronized T getStorageEngine(Type type, Str if (dbName == null) { dbName = ""; } - String key = buildStorageEngineKey(storageEngineId, dbName); + String key = buildStorageEngineKey(storageEngineId, dbName, engineAlias); if (!storageEnginesMap.containsKey(key)) { String clazz; switch (type) { @@ -144,8 +149,8 @@ private synchronized T getStorageEngine(Type type, Str } } - private String buildStorageEngineKey(String storageEngineName, String dbName) { - return storageEngineName + '_' + dbName; + private String buildStorageEngineKey(String storageEngineName, String dbName, String alias) { + return storageEngineName + '_' + dbName + (StringUtils.isEmpty(alias) ? "" : ('_' + alias)); } public String getDefaultStorageEngineId() { @@ -157,7 +162,7 @@ public StorageConfiguration getStorageConfiguration() { } public void registerVariantStorageEngine(VariantStorageEngine variantStorageEngine) { - String key = buildStorageEngineKey(variantStorageEngine.getStorageEngineId(), variantStorageEngine.dbName); + String key = buildStorageEngineKey(variantStorageEngine.getStorageEngineId(), variantStorageEngine.dbName, null); variantStorageEngineMap.put(key, variantStorageEngine); } @@ -167,7 +172,7 @@ public void unregisterVariantStorageEngine(String storageEngineId) { } public void registerAlignmentStorageEngine(AlignmentStorageEngine alignmentStorageEngine) { - String key = buildStorageEngineKey(alignmentStorageEngine.getStorageEngineId(), alignmentStorageEngine.dbName); + String key = buildStorageEngineKey(alignmentStorageEngine.getStorageEngineId(), alignmentStorageEngine.dbName, null); alignmentStorageEngineMap.put(key, alignmentStorageEngine); } From 5e9162e046ee1791fb43443385b3f63e7fdfa041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 16 Mar 2021 18:29:37 +0000 Subject: [PATCH 094/412] storage: Allow configure externally the SampleIndex #1699 --- .../manager/VariantStorageManager.java | 23 +++---- .../VariantOperationWebService.java | 33 +++++----- .../VariantStorageMetadataManager.java | 20 +++++++ ...HadoopLocalLoadVariantStoragePipeline.java | 51 +++++++++------- .../variant/HadoopVariantStorageEngine.java | 7 ++- .../gaps/FillMissingFromArchiveMapper.java | 9 --- .../write/FillMissingHBaseWriterMapper.java | 14 +---- .../mr/SampleIndexAnnotationLoaderDriver.java | 13 ++-- .../index/family/FamilyIndexDriver.java | 8 +-- .../sample/SampleIndexAnnotationLoader.java | 20 ++++--- .../index/sample/SampleIndexDBAdaptor.java | 60 +++++++++++++++---- .../index/sample/SampleIndexDBLoader.java | 11 +++- .../index/sample/SampleIndexDriver.java | 3 +- .../index/sample/SampleIndexLoader.java | 35 +++++------ .../index/sample/SampleIndexQueryParser.java | 4 +- ...ariantStorage200MigrationToolExecutor.java | 8 +-- .../utils/HBaseVariantTableNameGenerator.java | 8 +-- ...doopVariantStorageEngineSplitDataTest.java | 12 ++-- .../hadoop/variant/VariantHbaseTestUtils.java | 3 +- .../variant/index/sample/SampleIndexTest.java | 12 +++- 20 files changed, 211 insertions(+), 143 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java index 6794eebebf3..f2d538ee797 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java @@ -48,6 +48,7 @@ import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.managers.StudyManager; import org.opencb.opencga.core.common.UriUtils; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.family.Family; @@ -468,17 +469,17 @@ public ObjectMap configureStudy(String studyStr, ObjectMap params, String token) }); } -// public void configureSampleIndex(String studyStr, SampleIndexConfiguration sampleIndexConfiguration, String token) -// throws CatalogException, StorageEngineException { -// secureOperation("configure", studyStr, new ObjectMap(), token, engine -> { -// String studyFqn = getStudyFqn(studyStr, token); -// StudyMetadata studyMetadata = engine.getMetadataManager().getStudyMetadata(studyFqn); -// -// catalogManager.getStudyManager() -// .setVariantEngineConfigurationSampleIndex(studyStr, sampleIndexConfiguration, token); -// return null; -// }); -// } + public void configureSampleIndex(String studyStr, SampleIndexConfiguration sampleIndexConfiguration, String token) + throws CatalogException, StorageEngineException { + secureOperation("configure", studyStr, new ObjectMap(), token, engine -> { + String studyFqn = getStudyFqn(studyStr, token); + engine.getMetadataManager().addSampleIndexConfiguration(studyFqn, sampleIndexConfiguration); + + catalogManager.getStudyManager() + .setVariantEngineConfigurationSampleIndex(studyStr, sampleIndexConfiguration, token); + return null; + }); + } // ---------------------// // Query methods // diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java index 16168aa8b3b..fcae2bfde40 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java @@ -27,6 +27,7 @@ import org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils; import org.opencb.opencga.analysis.variant.operations.*; import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.exceptions.VersionException; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.*; @@ -232,22 +233,22 @@ public Response scoreDelete( return submitOperation(VariantScoreDeleteParams.ID, params, jobName, jobDescription, dependsOn, jobTags); } -// @POST -// @Path("/variant/sample/genotype/index/configure") -// @ApiOperation(value = "Update SampleIndex configuration", response = ObjectMap.class) -// public Response sampleIndexConfigure( -// @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, -// @ApiParam(value = "New SampleIndexConfiguration") SampleIndexConfiguration sampleIndexConfiguration) { -// return run(() -> { -// StopWatch stopWatch = StopWatch.createStarted(); -// variantManager.configureSampleIndex(study, sampleIndexConfiguration, token); -// -// return new DataResult<>() -// .setResults(Collections.singletonList(sampleIndexConfiguration)) -// .setNumResults(1) -// .setTime(((int) stopWatch.getTime(TimeUnit.MILLISECONDS))); -// }); -// } + @POST + @Path("/variant/sample/genotype/index/configure") + @ApiOperation(value = "Update SampleIndex configuration", response = ObjectMap.class) + public Response sampleIndexConfigure( + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = "New SampleIndexConfiguration") SampleIndexConfiguration sampleIndexConfiguration) { + return run(() -> { + StopWatch stopWatch = StopWatch.createStarted(); + variantManager.configureSampleIndex(study, sampleIndexConfiguration, token); + + return new DataResult<>() + .setResults(Collections.singletonList(sampleIndexConfiguration)) + .setNumResults(1) + .setTime(((int) stopWatch.getTime(TimeUnit.MILLISECONDS))); + }); + } @POST @Path("/variant/sample/genotype/index") diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantStorageMetadataManager.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantStorageMetadataManager.java index 9aae5b1062c..f0bcd6ec4a3 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantStorageMetadataManager.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantStorageMetadataManager.java @@ -30,6 +30,7 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.common.UriUtils; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.adaptors.*; import org.opencb.opencga.storage.core.metadata.models.*; @@ -44,6 +45,7 @@ import java.net.URI; import java.nio.file.Path; import java.nio.file.Paths; +import java.time.Instant; import java.util.*; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; @@ -204,6 +206,24 @@ public StudyMetadata createStudy(String studyName) throws StorageEngineException return getStudyMetadata(studyName); } + public StudyMetadata.SampleIndexConfigurationVersioned addSampleIndexConfiguration( + String study, SampleIndexConfiguration configuration) throws StorageEngineException { + Integer idOrNull = getStudyIdOrNull(study); + if (idOrNull == null) { + createStudy(study); + } + return updateStudyMetadata(study, studyMetadata -> { + List configurations = studyMetadata.getSampleIndexConfigurations(); + if (configurations == null || configurations.isEmpty()) { + configurations = new ArrayList<>(1); + studyMetadata.setSampleIndexConfigurations(configurations); + } + int version = studyMetadata.getSampleIndexConfigurationLatest().getVersion() + 1; + configurations.add(new StudyMetadata.SampleIndexConfigurationVersioned(configuration, version, Date.from(Instant.now()))); + return studyMetadata; + }).getSampleIndexConfigurationLatest(); + } + public interface UpdateFunction { T update(T t) throws E; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopLocalLoadVariantStoragePipeline.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopLocalLoadVariantStoragePipeline.java index 68e8b9c5046..32e96fd1173 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopLocalLoadVariantStoragePipeline.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopLocalLoadVariantStoragePipeline.java @@ -39,7 +39,6 @@ import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; import org.opencb.opencga.storage.core.metadata.models.StudyMetadata; -import org.opencb.opencga.storage.core.metadata.models.TaskMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.core.variant.dedup.AbstractDuplicatedVariantsResolver; @@ -65,6 +64,8 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.opencb.biodata.models.variant.protobuf.VcfSliceProtos.VcfSlice; +import static org.opencb.opencga.storage.core.metadata.models.TaskMetadata.Status; +import static org.opencb.opencga.storage.core.metadata.models.TaskMetadata.Type; import static org.opencb.opencga.storage.core.variant.VariantStorageOptions.*; import static org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageEngine.TARGET_VARIANT_TYPE_SET; import static org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageOptions.*; @@ -80,6 +81,7 @@ public class HadoopLocalLoadVariantStoragePipeline extends HadoopVariantStorageP private static final String OPERATION_NAME = "Load"; private int taskId; private HashSet loadedGenotypes; + private int sampleIndexVersion; public HadoopLocalLoadVariantStoragePipeline(StorageConfiguration configuration, VariantHadoopDBAdaptor dbAdaptor, IOConnectorProvider ioConnectorProvider, @@ -92,6 +94,7 @@ protected void preLoadRegisterAndValidateFile(int studyId, VariantFileMetadata f super.preLoadRegisterAndValidateFile(studyId, fileMetadata); boolean loadSampleIndex = YesNoAuto.parse(getOptions(), LOAD_SAMPLE_INDEX.key()).orYes().booleanValue(); + int version = getMetadataManager().getStudyMetadata(studyId).getSampleIndexConfigurationLatest().getVersion(); Set alreadyIndexedSamples = new LinkedHashSet<>(); Set processedSamples = new LinkedHashSet<>(); Set samplesWithoutSplitData = new LinkedHashSet<>(); @@ -110,10 +113,10 @@ protected void preLoadRegisterAndValidateFile(int studyId, VariantFileMetadata f if (sampleMetadata.isIndexed()) { alreadyIndexedSamples.add(sample); if (sampleMetadata.isAnnotated() - || !loadSampleIndex && SampleIndexDBAdaptor.getSampleIndexStatus(sampleMetadata) == TaskMetadata.Status.READY - || SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata) == TaskMetadata.Status.READY - || sampleMetadata.getFamilyIndexStatus() == TaskMetadata.Status.READY - || sampleMetadata.getMendelianErrorStatus() == TaskMetadata.Status.READY) { + || !loadSampleIndex && SampleIndexDBAdaptor.getSampleIndexStatus(sampleMetadata, version) == Status.READY + || SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, version) == Status.READY + || sampleMetadata.getFamilyIndexStatus() == Status.READY + || sampleMetadata.getMendelianErrorStatus() == Status.READY) { processedSamples.add(sampleMetadata.getId()); } } @@ -133,12 +136,12 @@ protected void preLoadRegisterAndValidateFile(int studyId, VariantFileMetadata f for (Integer sampleId : processedSamples) { getMetadataManager().updateSampleMetadata(studyId, sampleId, sampleMetadata -> { if (!loadSampleIndex) { - SampleIndexDBAdaptor.setSampleIndexStatus(sampleMetadata, TaskMetadata.Status.NONE); + SampleIndexDBAdaptor.setSampleIndexStatus(sampleMetadata, Status.NONE, 0); } - sampleMetadata.setAnnotationStatus(TaskMetadata.Status.NONE); - SampleIndexDBAdaptor.setSampleIndexAnnotationStatus(sampleMetadata, TaskMetadata.Status.NONE); - sampleMetadata.setFamilyIndexStatus(TaskMetadata.Status.NONE); - sampleMetadata.setMendelianErrorStatus(TaskMetadata.Status.NONE); + sampleMetadata.setAnnotationStatus(Status.NONE); + SampleIndexDBAdaptor.setSampleIndexAnnotationStatus(sampleMetadata, Status.NONE, 0); + sampleMetadata.setFamilyIndexStatus(Status.NONE); + sampleMetadata.setMendelianErrorStatus(Status.NONE); return sampleMetadata; }); } @@ -164,10 +167,10 @@ protected void securePreLoad(StudyMetadata studyMetadata, VariantFileMetadata fi List fileIds = Collections.singletonList(getFileId()); taskId = getMetadataManager() - .addRunningTask(studyId, OPERATION_NAME, fileIds, resume, TaskMetadata.Type.LOAD, + .addRunningTask(studyId, OPERATION_NAME, fileIds, resume, Type.LOAD, operation -> { if (operation.getName().equals(OPERATION_NAME)) { - if (operation.currentStatus().equals(TaskMetadata.Status.ERROR)) { + if (operation.currentStatus().equals(Status.ERROR)) { Integer fileId = operation.getFileIds().get(0); String fileName = getMetadataManager().getFileName(studyMetadata.getId(), fileId); logger.warn("Pending load operation for file " + fileName + " (" + fileId + ')'); @@ -188,7 +191,7 @@ protected void securePreLoad(StudyMetadata studyMetadata, VariantFileMetadata fi @Override protected void load(URI inputUri, URI outdir, int studyId, int fileId) throws StorageEngineException { - if (getMetadataManager().getTask(studyId, taskId).currentStatus().equals(TaskMetadata.Status.DONE)) { + if (getMetadataManager().getTask(studyId, taskId).currentStatus().equals(Status.DONE)) { logger.info("File {} already loaded. Skip this step!", UriUtils.fileName(inputUri)); return; @@ -226,10 +229,10 @@ protected void load(URI inputUri, URI outdir, int studyId, int fileId) throws St logger.info("File \"{}\" loaded in {}", Paths.get(inputUri).getFileName(), TimeUtils.durationToString(stopWatch)); // Mark file as DONE - getMetadataManager().setStatus(getStudyId(), taskId, TaskMetadata.Status.DONE); + getMetadataManager().setStatus(getStudyId(), taskId, Status.DONE); } catch (Exception e) { // Mark file as ERROR - getMetadataManager().setStatus(getStudyId(), taskId, TaskMetadata.Status.ERROR); + getMetadataManager().setStatus(getStudyId(), taskId, Status.ERROR); throw e; } finally { Runtime.getRuntime().removeShutdownHook(hook); @@ -246,7 +249,7 @@ protected void loadFromProto(URI input, URI outdir, ArchiveTableHelper helper, P VcfSliceToVariantListConverter converter = new VcfSliceToVariantListConverter(helper.getStudyMetadata()); VariantHadoopDBWriter variantsWriter = newVariantHadoopDBWriter(); List sampleIds = new ArrayList<>(getMetadataManager().getFileMetadata(getStudyId(), getFileId()).getSamples()); - SampleIndexDBLoader sampleIndexDBLoader = newSampleIndexDBLoader(helper, sampleIds); + SampleIndexDBLoader sampleIndexDBLoader = newSampleIndexDBLoader(sampleIds); // ((TaskMetadata) t -> t) // .then(archiveWriter) @@ -307,6 +310,7 @@ protected void loadFromProto(URI input, URI outdir, ArchiveTableHelper helper, P if (sampleIndexDBLoader != null) { // Update list of loaded genotypes this.loadedGenotypes = sampleIndexDBLoader.getLoadedGenotypes(); + this.sampleIndexVersion = sampleIndexDBLoader.getSampleIndexVersion(); } } @@ -347,7 +351,7 @@ protected void loadFromAvroWithArchive(URI input, URI outdir, ArchiveTableHelper VariantHadoopDBWriter hadoopDBWriter = newVariantHadoopDBWriter(); // Sample Index Writer List sampleIds = new ArrayList<>(getMetadataManager().getFileMetadata(studyId, fileId).getSamples()); - SampleIndexDBLoader sampleIndexDBLoader = newSampleIndexDBLoader(helper, sampleIds); + SampleIndexDBLoader sampleIndexDBLoader = newSampleIndexDBLoader(sampleIds); // TaskMetadata String archiveFields = options.getString(ARCHIVE_FIELDS.key()); @@ -368,6 +372,7 @@ protected void loadFromAvroWithArchive(URI input, URI outdir, ArchiveTableHelper if (sampleIndexDBLoader != null) { // Update list of loaded genotypes this.loadedGenotypes = sampleIndexDBLoader.getLoadedGenotypes(); + this.sampleIndexVersion = sampleIndexDBLoader.getSampleIndexVersion(); } } @@ -391,7 +396,7 @@ protected void loadFromAvroWithoutArchive(URI input, URI outdir, ArchiveTableHel VariantHadoopDBWriter hadoopDBWriter = newVariantHadoopDBWriter(); // Sample Index Writer List sampleIds = new ArrayList<>(getMetadataManager().getFileMetadata(studyId, fileId).getSamples()); - SampleIndexDBLoader sampleIndexDBLoader = newSampleIndexDBLoader(helper, sampleIds); + SampleIndexDBLoader sampleIndexDBLoader = newSampleIndexDBLoader(sampleIds); Task progressLoggerTask = progressLogger .asTask(variant -> "up to position " + variant.getChromosome() + ":" + variant.getStart()); @@ -414,6 +419,7 @@ protected void loadFromAvroWithoutArchive(URI input, URI outdir, ArchiveTableHel if (sampleIndexDBLoader != null) { // Update list of loaded genotypes this.loadedGenotypes = sampleIndexDBLoader.getLoadedGenotypes(); + this.sampleIndexVersion = sampleIndexDBLoader.getSampleIndexVersion(); } } @@ -474,16 +480,16 @@ public URI postLoad(URI input, URI output) throws StorageEngineException { VariantStorageMetadataManager metadataManager = getMetadataManager(); // Mark the load task as READY - metadataManager.setStatus(getStudyId(), taskId, TaskMetadata.Status.READY); + metadataManager.setStatus(getStudyId(), taskId, Status.READY); boolean loadSampleIndex = YesNoAuto.parse(getOptions(), LOAD_SAMPLE_INDEX.key()).orYes().booleanValue(); if (loadSampleIndex) { for (Integer sampleId : metadataManager.getSampleIdsFromFileId(getStudyId(), getFileId())) { // Worth to check first to avoid too many updates in scenarios like 1000G SampleMetadata sampleMetadata = metadataManager.getSampleMetadata(getStudyId(), sampleId); - if (SampleIndexDBAdaptor.getSampleIndexStatus(sampleMetadata) != TaskMetadata.Status.READY) { + if (SampleIndexDBAdaptor.getSampleIndexStatus(sampleMetadata, sampleIndexVersion) != Status.READY) { metadataManager.updateSampleMetadata(getStudyId(), sampleId, s -> { - return SampleIndexDBAdaptor.setSampleIndexStatus(s, TaskMetadata.Status.READY); + return SampleIndexDBAdaptor.setSampleIndexStatus(s, Status.READY, sampleIndexVersion); }); } } @@ -509,7 +515,7 @@ private VariantHBaseArchiveDataWriter newArchiveDBWriter(String table, ArchiveTa } } - private SampleIndexDBLoader newSampleIndexDBLoader(ArchiveTableHelper helper, List sampleIds) throws StorageEngineException { + private SampleIndexDBLoader newSampleIndexDBLoader(List sampleIds) throws StorageEngineException { boolean loadSampleIndex = YesNoAuto.parse(getOptions(), LOAD_SAMPLE_INDEX.key()).orYes().booleanValue(); if (!loadSampleIndex || sampleIds.isEmpty()) { return null; @@ -518,7 +524,6 @@ private SampleIndexDBLoader newSampleIndexDBLoader(ArchiveTableHelper helper, Li SampleIndexDBAdaptor sampleIndexDbAdaptor = new SampleIndexDBAdaptor( dbAdaptor.getHBaseManager(), dbAdaptor.getTableNameGenerator(), getMetadataManager()); sampleIndexDBLoader = new SampleIndexDBLoader(sampleIndexDbAdaptor, dbAdaptor.getHBaseManager(), - dbAdaptor.getTableNameGenerator().getSampleIndexTableName(helper.getStudyId()), getMetadataManager(), getStudyId(), getFileId(), sampleIds, VariantStorageEngine.SplitData.from(getOptions()), diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java index 868ccf795c7..786dc1fa0cb 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngine.java @@ -323,7 +323,7 @@ protected VariantExporter newVariantExporter(VariantMetadataFactory metadataFact @Override public void sampleIndex(String study, List samples, ObjectMap options) throws StorageEngineException { options = getMergedOptions(options); - new SampleIndexLoader(getTableNameGenerator(), getMetadataManager(), getMRExecutor(), getSampleIndexDBAdaptor().getSchema(study)) + new SampleIndexLoader(getSampleIndexDBAdaptor(), getMRExecutor()) .buildSampleIndex(study, samples, options); } @@ -406,9 +406,10 @@ public DataResult> familyIndex(String study, List> tri options.put(FamilyIndexDriver.TRIOS_COHORT, cohortMetadata.getName()); options.put(FamilyIndexDriver.TRIOS_COHORT_DELETE, true); } + options.put(FamilyIndexDriver.OUTPUT, getSampleIndexDBAdaptor().getSampleIndexTableName(studyId)); getMRExecutor().run(FamilyIndexDriver.class, FamilyIndexDriver.buildArgs(getArchiveTableName(studyId), getVariantTableName(), - studyId, null, options), options, + studyId, null, options), "Precompute mendelian errors for " + (trios.size() == 1 ? "trio " + trios.get(0) : trios.size() + " trios")); return dr; } @@ -668,7 +669,7 @@ public void removeFiles(String study, List files) throws StorageEngineEx String archiveTable = getArchiveTableName(studyId); String variantsTable = getVariantTableName(); - String sampleIndexTable = getTableNameGenerator().getSampleIndexTableName(studyId); + String sampleIndexTable = getSampleIndexDBAdaptor().getSampleIndexTableName(studyId); long startTime = System.currentTimeMillis(); logger.info("------------------------------------------------------"); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillMissingFromArchiveMapper.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillMissingFromArchiveMapper.java index d17ea6121ed..301465f4e04 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillMissingFromArchiveMapper.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/FillMissingFromArchiveMapper.java @@ -61,15 +61,6 @@ protected void map(ImmutableBytesWritable key, Result value, Context context) th updateStats(context); } - public static void setSampleIndexTablePut(Put put) { - put.setAttribute("s", new byte[]{1}); - } - - public static boolean isSampleIndexTablePut(Put put) { - byte[] s = put.getAttribute("s"); - return s != null && s[0] == 1; - } - private void updateStats(Context context) { for (Map.Entry entry : task.takeStats().entrySet()) { context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, entry.getKey()).increment(entry.getValue()); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/write/FillMissingHBaseWriterMapper.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/write/FillMissingHBaseWriterMapper.java index cf133576717..0042324dc1e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/write/FillMissingHBaseWriterMapper.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/gaps/write/FillMissingHBaseWriterMapper.java @@ -4,10 +4,8 @@ import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.ClientProtos; -import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.mapreduce.Mapper; -import org.opencb.opencga.storage.hadoop.variant.gaps.FillMissingFromArchiveMapper; import org.opencb.opencga.storage.hadoop.variant.mr.VariantTableHelper; import org.opencb.opencga.storage.hadoop.variant.mr.VariantsTableMapReduceHelper; @@ -21,7 +19,6 @@ public class FillMissingHBaseWriterMapper extends Mapper { private ImmutableBytesWritable variantsTable; - private ImmutableBytesWritable sampleIndexTable; @Override protected void setup(Context context) throws IOException, InterruptedException { @@ -29,8 +26,6 @@ protected void setup(Context context) throws IOException, InterruptedException { VariantTableHelper helper = new VariantTableHelper(context.getConfiguration()); variantsTable = new ImmutableBytesWritable(helper.getVariantsTable()); - sampleIndexTable = new ImmutableBytesWritable(Bytes.toBytes(helper.getHBaseVariantTableNameGenerator() - .getSampleIndexTableName(helper.getStudyId()))); } @Override @@ -43,13 +38,8 @@ protected void map(BytesWritable key, BytesWritable value, Context context) thro // System.out.println(VariantPhoenixKeyFactory.extractVariantFromVariantRowKey(key.copyBytes())); Put put = ProtobufUtil.toPut(proto); - if (FillMissingFromArchiveMapper.isSampleIndexTablePut(put)) { - context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "sample_index_puts").increment(1); - context.write(sampleIndexTable, put); - } else { - context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "puts").increment(1); - context.write(new ImmutableBytesWritable(variantsTable), put); - } + context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "puts").increment(1); + context.write(new ImmutableBytesWritable(variantsTable), put); // Indicate that the process is still alive context.progress(); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java index 11d80a582d1..9a4154edea8 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java @@ -3,6 +3,7 @@ import htsjdk.variant.vcf.VCFConstants; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException; import org.apache.hadoop.hbase.mapreduce.TableInputFormat; import org.apache.hadoop.mapreduce.Job; import org.opencb.biodata.models.core.Region; @@ -11,6 +12,7 @@ import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; +import org.opencb.opencga.storage.core.metadata.models.StudyMetadata; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.AbstractVariantsTableDriver; @@ -45,6 +47,7 @@ public class SampleIndexAnnotationLoaderDriver extends AbstractVariantsTableDriv private boolean hasGenotype; private String region; private String outputTable; + private int sampleIndexVersion; @Override protected Class getMapperClass() { @@ -67,7 +70,7 @@ protected void parseAndValidateParameters() throws IOException { outputTable = getParam(OUTPUT); if (StringUtils.isEmpty(outputTable)) { - outputTable = getTableNameGenerator().getSampleIndexTableName(getStudyId()); + throw new IllegalArgumentIOException("Missing output table"); } VariantStorageMetadataManager metadataManager = getMetadataManager(); @@ -149,9 +152,11 @@ protected Job setupJob(Job job, String archiveTable, String variantTable) throws VariantMapReduceUtil.setNoneReduce(job); - SampleIndexConfiguration configuration = getMetadataManager() + StudyMetadata.SampleIndexConfigurationVersioned versioned = getMetadataManager() .getStudyMetadata(getStudyId()) - .getSampleIndexConfigurationLatest().getConfiguration(); + .getSampleIndexConfigurationLatest(); + SampleIndexConfiguration configuration = versioned.getConfiguration(); + sampleIndexVersion = versioned.getVersion(); VariantMapReduceUtil.setSampleIndexConfiguration(job, configuration); return job; @@ -166,7 +171,7 @@ protected String getJobOperationName() { protected void postExecution(boolean succeed) throws IOException, StorageEngineException { super.postExecution(succeed); if (succeed && StringUtils.isEmpty(region)) { - SampleIndexAnnotationLoader.postAnnotationLoad(getStudyId(), sampleIds, getMetadataManager()); + SampleIndexAnnotationLoader.postAnnotationLoad(getStudyId(), sampleIds, getMetadataManager(), sampleIndexVersion); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java index 7d8fc6996e2..066c7abf73b 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java @@ -4,6 +4,7 @@ import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.TableInputFormat; import org.apache.hadoop.mapreduce.Job; @@ -76,11 +77,10 @@ protected void parseAndValidateParameters() throws IOException { VariantStorageMetadataManager metadataManager = getMetadataManager(); - if (getParam(OUTPUT) == null) { - sampleIndexTableName = getTableNameGenerator().getSampleIndexTableName(getStudyId()); - } else { - sampleIndexTableName = getParam(OUTPUT); + if (getParam(OUTPUT) == null || getParam(OUTPUT).isEmpty()) { + throw new IllegalArgumentIOException("Missing output table"); } + sampleIndexTableName = getParam(OUTPUT); boolean overwrite = Boolean.parseBoolean(getParam(OVERWRITE)); String triosCohort = getParam(TRIOS_COHORT); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java index a2524b61e75..c73cc63a614 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java @@ -11,7 +11,6 @@ import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; -import org.opencb.opencga.storage.core.metadata.models.TaskMetadata; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.utils.HBaseManager; @@ -29,6 +28,7 @@ import java.util.function.Function; import static org.opencb.opencga.core.api.ParamConstants.OVERWRITE; +import static org.opencb.opencga.storage.core.metadata.models.TaskMetadata.Status; import static org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageOptions.SAMPLE_INDEX_ANNOTATION_MAX_SAMPLES_PER_MR; /** @@ -81,13 +81,15 @@ public void updateSampleAnnotation(int studyId, List samples, ObjectMap public void updateSampleAnnotation(int studyId, List samples, ObjectMap options, boolean overwrite) throws StorageEngineException { + int sampleIndexVersion = metadataManager.getStudyMetadata(studyId).getSampleIndexConfigurationLatest().getVersion(); List finalSamplesList = new ArrayList<>(samples.size()); List nonAnnotated = new LinkedList<>(); List alreadyAnnotated = new LinkedList<>(); for (Integer sampleId : samples) { SampleMetadata sampleMetadata = metadataManager.getSampleMetadata(studyId, sampleId); if (sampleMetadata.isAnnotated()) { - if (SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata).equals(TaskMetadata.Status.READY) && !overwrite) { + if (SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, sampleIndexVersion).equals(Status.READY) + && !overwrite) { // SamplesIndex already annotated alreadyAnnotated.add(sampleMetadata.getName()); } else { @@ -143,6 +145,7 @@ public void updateSampleAnnotation(int studyId, List samples, ObjectMap private void updateSampleAnnotationBatchMapreduce(int studyId, List samples, ObjectMap options) throws StorageEngineException { + options.put(SampleIndexAnnotationLoaderDriver.OUTPUT, sampleDBAdaptor.getSampleIndexTableName(studyId)); mrExecutor.run(SampleIndexAnnotationLoaderDriver.class, SampleIndexAnnotationLoaderDriver.buildArgs( tableNameGenerator.getArchiveTableName(studyId), tableNameGenerator.getVariantTableName(), studyId, samples, options), @@ -241,7 +244,8 @@ private void updateSampleAnnotationBatchMapreduce(int studyId, List sam public void updateSampleAnnotationMultiSampleIterator(int studyId, List samples, Function>> annotationIndexReader) throws IOException, StorageEngineException { - String sampleIndexTableName = tableNameGenerator.getSampleIndexTableName(studyId); + int version = sampleDBAdaptor.getSampleIndexConfiguration(studyId).getVersion(); + String sampleIndexTableName = sampleDBAdaptor.getSampleIndexTableName(studyId); Map>>> sampleIterators = new HashMap<>(samples.size()); for (Integer sample : samples) { @@ -285,7 +289,7 @@ public void updateSampleAnnotationMultiSampleIterator(int studyId, List mutator.close(); - postAnnotationLoad(studyId, samples); + postAnnotationLoad(studyId, samples, version); } private Put annotate(String chromosome, int start, Integer sampleId, @@ -340,15 +344,15 @@ private Put annotate(String chromosome, int start, Integer sampleId, return put; } - private void postAnnotationLoad(int studyId, List samples) throws StorageEngineException { - postAnnotationLoad(studyId, samples, metadataManager); + private void postAnnotationLoad(int studyId, List samples, int version) throws StorageEngineException { + postAnnotationLoad(studyId, samples, metadataManager, version); } - public static void postAnnotationLoad(int studyId, List samples, VariantStorageMetadataManager metadataManager) + public static void postAnnotationLoad(int studyId, List samples, VariantStorageMetadataManager metadataManager, int version) throws StorageEngineException { for (Integer sampleId : samples) { metadataManager.updateSampleMetadata(studyId, sampleId, sampleMetadata -> { - return SampleIndexDBAdaptor.setSampleIndexAnnotationStatus(sampleMetadata, TaskMetadata.Status.READY); + return SampleIndexDBAdaptor.setSampleIndexAnnotationStatus(sampleMetadata, Status.READY, version); }); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java index e160d2ea19f..fd1f0c801d6 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java @@ -55,7 +55,9 @@ public class SampleIndexDBAdaptor implements VariantIterable { private static final String SAMPLE_INDEX_STATUS = "sampleIndexGenotypes"; + private static final String SAMPLE_INDEX_VERSION = "sampleIndexGenotypesVersion"; private static final String SAMPLE_INDEX_ANNOTATION_STATUS = "sampleIndexAnnotation"; + private static final String SAMPLE_INDEX_ANNOTATION_VERSION = "sampleIndexAnnotationVersion"; @Deprecated // Deprecated to avoid confusion with actual "SAMPLE_INDEX_STATUS" private static final String SAMPLE_INDEX_ANNOTATION_STATUS_OLD = "sampleIndex"; @@ -79,32 +81,50 @@ public SampleIndexDBAdaptor(HBaseManager hBaseManager, HBaseVariantTableNameGene schemas = new HashMap<>(); } - public static TaskMetadata.Status getSampleIndexAnnotationStatus(SampleMetadata sampleMetadata) { + public static TaskMetadata.Status getSampleIndexAnnotationStatus(SampleMetadata sampleMetadata, int latestSampleIndexVersion) { TaskMetadata.Status status = sampleMetadata.getStatus(SAMPLE_INDEX_ANNOTATION_STATUS, null); if (status == null) { // The status name was renamed. In case of missing value (null), check for the deprecated value. status = sampleMetadata.getStatus(SAMPLE_INDEX_ANNOTATION_STATUS_OLD); } + if (status == TaskMetadata.Status.READY) { + int actualSampleIndexVersion = sampleMetadata.getAttributes().getInt(SAMPLE_INDEX_ANNOTATION_VERSION, 1); + if (actualSampleIndexVersion != latestSampleIndexVersion) { + logger.debug("Sample index annotation version outdated. Actual : " + actualSampleIndexVersion + + " , expected : " + latestSampleIndexVersion); + status = TaskMetadata.Status.NONE; + } + } return status; } - public static SampleMetadata setSampleIndexAnnotationStatus(SampleMetadata sampleMetadata, TaskMetadata.Status status) { + public static SampleMetadata setSampleIndexAnnotationStatus(SampleMetadata sampleMetadata, TaskMetadata.Status status, int version) { // Remove deprecated value. sampleMetadata.getStatus().remove(SAMPLE_INDEX_ANNOTATION_STATUS_OLD); sampleMetadata.setStatus(SAMPLE_INDEX_ANNOTATION_STATUS, status); + sampleMetadata.getAttributes().put(SAMPLE_INDEX_ANNOTATION_VERSION, version); return sampleMetadata; } - public static TaskMetadata.Status getSampleIndexStatus(SampleMetadata sampleMetadata) { + public static TaskMetadata.Status getSampleIndexStatus(SampleMetadata sampleMetadata, int latestSampleIndexVersion) { TaskMetadata.Status status = sampleMetadata.getStatus(SAMPLE_INDEX_STATUS, null); if (status == null) { // This is a new status. In case of missing value (null), assume it's READY status = TaskMetadata.Status.READY; } + if (status == TaskMetadata.Status.READY) { + int actualSampleIndexVersion = sampleMetadata.getAttributes().getInt(SAMPLE_INDEX_VERSION, 1); + if (actualSampleIndexVersion != latestSampleIndexVersion) { + logger.debug("Sample index version outdated. Actual : " + actualSampleIndexVersion + + " , expected : " + latestSampleIndexVersion); + status = TaskMetadata.Status.NONE; + } + } return status; } - public static SampleMetadata setSampleIndexStatus(SampleMetadata sampleMetadata, TaskMetadata.Status status) { + public static SampleMetadata setSampleIndexStatus(SampleMetadata sampleMetadata, TaskMetadata.Status status, int version) { + sampleMetadata.getAttributes().put(SAMPLE_INDEX_VERSION, version); return sampleMetadata.setStatus(SAMPLE_INDEX_STATUS, status); } @@ -195,7 +215,7 @@ protected VariantDBIterator applyLimitSkip(VariantDBIterator iterator, QueryOpti * @return SingleSampleIndexVariantDBIterator */ private SingleSampleIndexVariantDBIterator internalIterator(SingleSampleIndexQuery query) { - String tableName = tableNameGenerator.getSampleIndexTableName(toStudyId(query.getStudy())); + String tableName = getSampleIndexTableName(toStudyId(query.getStudy())); try { return hBaseManager.act(tableName, table -> { @@ -207,7 +227,7 @@ private SingleSampleIndexVariantDBIterator internalIterator(SingleSampleIndexQue } private RawSingleSampleIndexVariantDBIterator rawInternalIterator(SingleSampleIndexQuery query) { - String tableName = tableNameGenerator.getSampleIndexTableName(toStudyId(query.getStudy())); + String tableName = getSampleIndexTableName(toStudyId(query.getStudy())); try { return hBaseManager.act(tableName, table -> { @@ -218,6 +238,19 @@ private RawSingleSampleIndexVariantDBIterator rawInternalIterator(SingleSampleIn } } + public String getSampleIndexTableName(int studyId) { + int version = getSampleIndexConfiguration(studyId).getVersion(); + return tableNameGenerator.getSampleIndexTableName(studyId, version); + } + + public HBaseVariantTableNameGenerator getTableNameGenerator() { + return tableNameGenerator; + } + + public VariantStorageMetadataManager getMetadataManager() { + return metadataManager; + } + protected Map> queryByGt(int study, int sample, String chromosome, int position) throws IOException { Result result = queryByGtInternal(study, sample, chromosome, position); @@ -232,7 +265,7 @@ protected SampleIndexEntryPutBuilder queryByGtBuilder(int study, int sample, Str } private Result queryByGtInternal(int study, int sample, String chromosome, int position) throws IOException { - String tableName = tableNameGenerator.getSampleIndexTableName(study); + String tableName = getSampleIndexTableName(study); return hBaseManager.act(tableName, table -> { Get get = new Get(SampleIndexSchema.toRowKey(sample, chromosome, position)); get.addFamily(family); @@ -241,7 +274,7 @@ private Result queryByGtInternal(int study, int sample, String chromosome, int p } public Iterator>> iteratorByGt(int study, int sample) throws IOException { - String tableName = tableNameGenerator.getSampleIndexTableName(study); + String tableName = getSampleIndexTableName(study); return hBaseManager.act(tableName, table -> { @@ -259,7 +292,7 @@ public Iterator>> iteratorByGt(int study, int sample) } public Iterator rawIterator(int study, int sample) throws IOException { - String tableName = tableNameGenerator.getSampleIndexTableName(study); + String tableName = getSampleIndexTableName(study); return hBaseManager.act(tableName, table -> { Scan scan = new Scan(); @@ -360,7 +393,7 @@ private long count(SingleSampleIndexQuery query) { regionGroups = query.getRegionGroups(); } - String tableName = tableNameGenerator.getSampleIndexTableName(toStudyId(query.getStudy())); + String tableName = getSampleIndexTableName(toStudyId(query.getStudy())); HBaseToSampleIndexConverter converter = newConverter(toStudyId(query.getStudy())); try { @@ -433,7 +466,7 @@ public SampleIndexSchema getSchema(String study) { public SampleIndexSchema getSchema(int studyId) { SampleIndexSchema sampleIndexSchema = schemas.get(studyId); if (sampleIndexSchema == null) { - SampleIndexConfiguration configuration = metadataManager.getStudyMetadata(studyId).getSampleIndexConfigurationLatest() + SampleIndexConfiguration configuration = getSampleIndexConfiguration(studyId) .getConfiguration(); sampleIndexSchema = new SampleIndexSchema(configuration); schemas.put(studyId, sampleIndexSchema); @@ -441,6 +474,10 @@ public SampleIndexSchema getSchema(int studyId) { return sampleIndexSchema; } + public StudyMetadata.SampleIndexConfigurationVersioned getSampleIndexConfiguration(int studyId) { + return metadataManager.getStudyMetadata(studyId).getSampleIndexConfigurationLatest(); + } + protected int toStudyId(String study) { int studyId; if (StringUtils.isEmpty(study)) { @@ -672,5 +709,4 @@ private int toSampleId(int studyId, String sample) { return metadataManager.getSampleId(studyId, sample); } - } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java index 59082fd14a9..5314fb02530 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBLoader.java @@ -10,6 +10,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; +import org.opencb.opencga.storage.core.metadata.models.StudyMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageEngine.SplitData; import org.opencb.opencga.storage.core.variant.adaptors.GenotypeClass; import org.opencb.opencga.storage.hadoop.utils.AbstractHBaseDataWriter; @@ -44,12 +45,13 @@ public class SampleIndexDBLoader extends AbstractHBaseDataWriter sampleIds, SplitData splitData, ObjectMap options) { - super(hBaseManager, tableName); + super(hBaseManager, dbAdaptor.getSampleIndexTableName(studyId)); this.studyId = studyId; this.sampleIds = sampleIds; family = GenomeHelper.COLUMN_FAMILY_BYTES; @@ -87,6 +89,7 @@ public SampleIndexDBLoader(SampleIndexDBAdaptor dbAdaptor, HBaseManager hBaseMan EXCLUDE_GENOTYPES.key(), EXCLUDE_GENOTYPES.defaultValue()); this.dbAdaptor = dbAdaptor; + sampleIndexConfiguration = dbAdaptor.getSampleIndexConfiguration(studyId); schema = dbAdaptor.getSchema(studyId); variantFileIndexConverter = new VariantFileIndexConverter(schema); } @@ -269,4 +272,8 @@ protected List getMutations(int remain) { public HashSet getLoadedGenotypes() { return genotypes; } + + public int getSampleIndexVersion() { + return sampleIndexConfiguration.getVersion(); + } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java index 4b5da6d6523..f72a5e85312 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java @@ -6,6 +6,7 @@ import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException; import org.apache.hadoop.hbase.filter.BinaryPrefixComparator; import org.apache.hadoop.hbase.filter.FilterList; import org.apache.hadoop.hbase.filter.QualifierFilter; @@ -138,7 +139,7 @@ protected void parseAndValidateParameters() throws IOException { } outputTable = getParam(OUTPUT); if (outputTable == null || outputTable.isEmpty()) { - outputTable = getTableNameGenerator().getSampleIndexTableName(study); + throw new IllegalArgumentIOException("Missing output table"); } secondaryOnly = Boolean.valueOf(getParam(SECONDARY_ONLY, "false")); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexLoader.java index d4376f51cfe..cb79073a7e9 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexLoader.java @@ -24,18 +24,17 @@ */ public class SampleIndexLoader { + private final SampleIndexDBAdaptor sampleIndexDBAdaptor; private final HBaseVariantTableNameGenerator tableNameGenerator; private final MRExecutor mrExecutor; private final VariantStorageMetadataManager metadataManager; - private final SampleIndexSchema schema; private Logger logger = LoggerFactory.getLogger(SampleIndexLoader.class); - public SampleIndexLoader(HBaseVariantTableNameGenerator tableNameGenerator, - VariantStorageMetadataManager metadataManager, MRExecutor mrExecutor, SampleIndexSchema schema) { - this.tableNameGenerator = tableNameGenerator; + public SampleIndexLoader(SampleIndexDBAdaptor sampleIndexDBAdaptor, MRExecutor mrExecutor) { + this.sampleIndexDBAdaptor = sampleIndexDBAdaptor; this.mrExecutor = mrExecutor; - this.metadataManager = metadataManager; - this.schema = schema; + this.metadataManager = sampleIndexDBAdaptor.getMetadataManager(); + this.tableNameGenerator = sampleIndexDBAdaptor.getTableNameGenerator(); } public void buildSampleIndex(String study, List samples, ObjectMap options) @@ -59,12 +58,12 @@ public void buildSampleIndex(String study, List samples, ObjectMap optio sampleIds.add(sampleId); } } - + int version = metadataManager.getStudyMetadata(studyId).getSampleIndexConfigurationLatest().getVersion(); List finalSamplesList = new ArrayList<>(samples.size()); List alreadyIndexed = new LinkedList<>(); for (Integer sampleId : sampleIds) { SampleMetadata sampleMetadata = metadataManager.getSampleMetadata(studyId, sampleId); - if (overwrite || SampleIndexDBAdaptor.getSampleIndexStatus(sampleMetadata) != TaskMetadata.Status.READY) { + if (overwrite || SampleIndexDBAdaptor.getSampleIndexStatus(sampleMetadata, version) != TaskMetadata.Status.READY) { finalSamplesList.add(sampleId); } else { // SamplesIndex already annotated @@ -100,17 +99,19 @@ public void buildSampleIndex(String study, List samples, ObjectMap optio for (int i = 0; i < batches; i++) { List subSet = finalSamplesList.subList(i * batchSize, Math.min((i + 1) * batchSize, finalSamplesList.size())); logger.info("Running MapReduce {}/{} over {} samples", i + 1, batches, subSet.size()); - buildSampleIndexBatchMapreduce(studyId, subSet, options); + buildSampleIndexBatchMapreduce(studyId, subSet, options, version); } } else { - buildSampleIndexBatchMapreduce(studyId, finalSamplesList, options); + buildSampleIndexBatchMapreduce(studyId, finalSamplesList, options, version); } } - private void buildSampleIndexBatchMapreduce(int studyId, List samples, ObjectMap options) + private void buildSampleIndexBatchMapreduce(int studyId, List samples, ObjectMap options, int version) throws StorageEngineException { options = new ObjectMap(options); options.put(SampleIndexDriver.SAMPLE_IDS, samples); + options.put(SampleIndexDriver.OUTPUT, sampleIndexDBAdaptor.getSampleIndexTableName(studyId)); + mrExecutor.run(SampleIndexDriver.class, SampleIndexDriver.buildArgs( tableNameGenerator.getArchiveTableName(studyId), @@ -119,19 +120,15 @@ private void buildSampleIndexBatchMapreduce(int studyId, List samples, null, options), "Build sample index for " + (samples.size() < 10 ? "samples " + samples : samples.size() + " samples")); - postSampleIndexBuild(studyId, samples); - } - - private void postSampleIndexBuild(int studyId, List samples) throws StorageEngineException { - postSampleIndexBuild(studyId, samples, metadataManager); + postSampleIndexBuild(studyId, samples, version); } - public static void postSampleIndexBuild(int studyId, List samples, VariantStorageMetadataManager metadataManager) - throws StorageEngineException { + private void postSampleIndexBuild(int studyId, List samples, int version) throws StorageEngineException { for (Integer sampleId : samples) { metadataManager.updateSampleMetadata(studyId, sampleId, sampleMetadata -> { - return SampleIndexDBAdaptor.setSampleIndexStatus(sampleMetadata, TaskMetadata.Status.READY); + return SampleIndexDBAdaptor.setSampleIndexStatus(sampleMetadata, TaskMetadata.Status.READY, version); }); } } + } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java index c4a12152d69..5d42b696e04 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java @@ -364,12 +364,14 @@ public SampleIndexQuery parse(Query query) { fileIndexMap.put(sample, fileIndexQuery); } + int sampleIndexVersion = defaultStudy.getSampleIndexConfigurationLatest().getVersion(); boolean allSamplesAnnotated = true; if (negatedGenotypesSamples.isEmpty()) { for (String sample : samplesMap.keySet()) { Integer sampleId = metadataManager.getSampleId(studyId, sample); SampleMetadata sampleMetadata = metadataManager.getSampleMetadata(studyId, sampleId); - if (!SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata).equals(TaskMetadata.Status.READY)) { + if (!SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, sampleIndexVersion) + .equals(TaskMetadata.Status.READY)) { allSamplesAnnotated = false; break; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/migration/v2_0_0/HadoopVariantStorage200MigrationToolExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/migration/v2_0_0/HadoopVariantStorage200MigrationToolExecutor.java index 4637402de3a..deee956d940 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/migration/v2_0_0/HadoopVariantStorage200MigrationToolExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/migration/v2_0_0/HadoopVariantStorage200MigrationToolExecutor.java @@ -76,15 +76,15 @@ protected void run() throws Exception { Integer studyId = entry.getValue(); metadataManager.sampleMetadataIterator(studyId).forEachRemaining(sampleMetadata -> { if (sampleMetadata.isIndexed() - && (SampleIndexDBAdaptor.getSampleIndexStatus(sampleMetadata).equals(Status.READY) - || SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata).equals(Status.READY))) { + && (SampleIndexDBAdaptor.getSampleIndexStatus(sampleMetadata, 1).equals(Status.READY) + || SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, 1).equals(Status.READY))) { samplesToModify.add(sampleMetadata.getId()); } }); for (Integer sampleId : samplesToModify) { metadataManager.updateSampleMetadata(studyId, sampleId, sampleMetadata -> { - SampleIndexDBAdaptor.setSampleIndexStatus(sampleMetadata, Status.NONE); - SampleIndexDBAdaptor.setSampleIndexAnnotationStatus(sampleMetadata, Status.NONE); + SampleIndexDBAdaptor.setSampleIndexStatus(sampleMetadata, Status.NONE, 0); + SampleIndexDBAdaptor.setSampleIndexAnnotationStatus(sampleMetadata, Status.NONE, 0); return sampleMetadata; }); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/utils/HBaseVariantTableNameGenerator.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/utils/HBaseVariantTableNameGenerator.java index 07470a0ce03..cc923c73792 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/utils/HBaseVariantTableNameGenerator.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/utils/HBaseVariantTableNameGenerator.java @@ -57,8 +57,8 @@ public String getArchiveTableName(int studyId) { return getArchiveTableName(namespace, dbName, studyId); } - public String getSampleIndexTableName(int studyId) { - return getSampleIndexTableName(namespace, dbName, studyId); + public String getSampleIndexTableName(int studyId, int version) { + return getSampleIndexTableName(namespace, dbName, studyId, version); } public String getPendingAnnotationTableName() { @@ -185,8 +185,8 @@ public static int getStudyIdFromArchiveTable(String archiveTable) { return Integer.valueOf(archiveTable.substring(idx + 1)); } - public static String getSampleIndexTableName(String namespace, String dbName, int studyId) { - return buildTableName(namespace, dbName, SAMPLE_SUFIX + studyId); + public static String getSampleIndexTableName(String namespace, String dbName, int studyId, int version) { + return buildTableName(namespace, dbName, SAMPLE_SUFIX + studyId + (version > 1 ? ("_v" + version) : "")); } public static String getVariantTableName(String dbName, ObjectMap options) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngineSplitDataTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngineSplitDataTest.java index 9cf9f09dcab..beb5c76da93 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngineSplitDataTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngineSplitDataTest.java @@ -66,7 +66,7 @@ public void testMultiChromosomeSplitData() throws Exception { SampleMetadata sampleMetadata = mm.getSampleMetadata(studyId, mm.getSampleId(studyId, sample)); assertEquals(TaskMetadata.Status.READY, sampleMetadata.getIndexStatus()); assertEquals(TaskMetadata.Status.NONE, sampleMetadata.getAnnotationStatus()); - assertEquals(TaskMetadata.Status.NONE, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata)); + assertEquals(TaskMetadata.Status.NONE, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, 1)); } variantStorageEngine.annotate(new Query(), new QueryOptions(DefaultVariantAnnotationManager.OUT_DIR, outputUri)); @@ -74,7 +74,7 @@ public void testMultiChromosomeSplitData() throws Exception { SampleMetadata sampleMetadata = mm.getSampleMetadata(studyId, mm.getSampleId(studyId, sample)); assertEquals(TaskMetadata.Status.READY, sampleMetadata.getIndexStatus()); assertEquals(TaskMetadata.Status.READY, sampleMetadata.getAnnotationStatus()); - assertEquals(TaskMetadata.Status.READY, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata)); + assertEquals(TaskMetadata.Status.READY, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, 1)); } variantStorageEngine.getOptions().put(VariantStorageOptions.STUDY.key(), STUDY_NAME); @@ -86,14 +86,14 @@ public void testMultiChromosomeSplitData() throws Exception { SampleMetadata sampleMetadata = mm.getSampleMetadata(studyId, mm.getSampleId(studyId, sample)); assertEquals(TaskMetadata.Status.READY, sampleMetadata.getIndexStatus()); assertEquals(TaskMetadata.Status.NONE, sampleMetadata.getAnnotationStatus()); - assertEquals(TaskMetadata.Status.NONE, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata)); + assertEquals(TaskMetadata.Status.NONE, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, 1)); } variantStorageEngine.annotate(new Query(), new QueryOptions(DefaultVariantAnnotationManager.OUT_DIR, outputUri)); for (String sample : SAMPLES) { SampleMetadata sampleMetadata = mm.getSampleMetadata(studyId, mm.getSampleId(studyId, sample)); assertEquals(TaskMetadata.Status.READY, sampleMetadata.getIndexStatus()); assertEquals(TaskMetadata.Status.READY, sampleMetadata.getAnnotationStatus()); - assertEquals(TaskMetadata.Status.READY, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata)); + assertEquals(TaskMetadata.Status.READY, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, 1)); } @@ -300,7 +300,7 @@ public void testLoadByRegion() throws Exception { SampleMetadata sampleMetadata = mm.getSampleMetadata(studyId_split, mm.getSampleId(studyId_split, sample)); assertEquals(TaskMetadata.Status.READY, sampleMetadata.getIndexStatus()); assertEquals(TaskMetadata.Status.NONE, sampleMetadata.getAnnotationStatus()); - assertEquals(TaskMetadata.Status.NONE, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata)); + assertEquals(TaskMetadata.Status.NONE, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, 1)); } variantStorageEngine.getOptions().put(VariantStorageOptions.LOAD_SPLIT_DATA.key(), null); @@ -313,7 +313,7 @@ public void testLoadByRegion() throws Exception { SampleMetadata sampleMetadata = mm.getSampleMetadata(studyId_normal, mm.getSampleId(studyId_normal, sample)); assertEquals(TaskMetadata.Status.READY, sampleMetadata.getIndexStatus()); assertEquals(TaskMetadata.Status.NONE, sampleMetadata.getAnnotationStatus()); - assertEquals(TaskMetadata.Status.NONE, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata)); + assertEquals(TaskMetadata.Status.NONE, SampleIndexDBAdaptor.getSampleIndexAnnotationStatus(sampleMetadata, 1)); } checkVariantsTable(studyId_split, studyId_normal, new Query(), new QueryOptions(QueryOptions.EXCLUDE, VariantField.STUDIES_FILES)); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java index a0f69124137..c4e5abc733c 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java @@ -414,7 +414,8 @@ private static void printVcf(StudyMetadata studyMetadata, VariantHadoopDBAdaptor public static void printSampleIndexTable(VariantHadoopDBAdaptor dbAdaptor, Path outDir) throws IOException { for (Integer studyId : dbAdaptor.getMetadataManager().getStudies(null).values()) { - String sampleGtTableName = dbAdaptor.getTableNameGenerator().getSampleIndexTableName(studyId); + int version = dbAdaptor.getMetadataManager().getStudyMetadata(studyId).getSampleIndexConfigurationLatest().getVersion(); + String sampleGtTableName = dbAdaptor.getTableNameGenerator().getSampleIndexTableName(studyId, version); if (printSampleIndexTable(dbAdaptor, outDir, studyId, sampleGtTableName)) return; } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java index f779812dbfd..b832fc5fbff 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java @@ -19,9 +19,10 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.*; import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.response.VariantQueryResult; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; @@ -31,6 +32,7 @@ import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.annotation.DefaultVariantAnnotationManager; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageEngine; @@ -48,7 +50,6 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import java.util.stream.IntStream; import static java.util.stream.Collectors.*; import static org.junit.Assert.*; @@ -115,6 +116,10 @@ public void load() throws Exception { .append(VariantStorageOptions.STATS_CALCULATE.key(), false) .append(VariantStorageOptions.LOAD_SPLIT_DATA.key(), VariantStorageEngine.SplitData.MULTI); + int version = metadataManager.addSampleIndexConfiguration(STUDY_NAME_2, SampleIndexConfiguration.defaultConfiguration() + .addFileIndexField(new IndexFieldConfiguration(IndexFieldConfiguration.Source.SAMPLE, "DS", new double[]{0, 1, 2}))).getVersion(); + System.out.println("version = " + version); + runETL(engine, getResourceUri("by_chr/chr22_1-1.variant-test-file.vcf.gz"), outputUri, params, true, true, true); runETL(engine, getResourceUri("by_chr/chr22_1-2.variant-test-file.vcf.gz"), outputUri, params, true, true, true); runETL(engine, getResourceUri("by_chr/chr22_1-2-DUP.variant-test-file.vcf.gz"), outputUri, params, true, true, true); @@ -181,7 +186,8 @@ public void checkLoadedData() throws Exception { public void regenerateSampleIndex() throws Exception { for (String study : studies) { int studyId = dbAdaptor.getMetadataManager().getStudyId(study); - String orig = dbAdaptor.getTableNameGenerator().getSampleIndexTableName(studyId); + int version = dbAdaptor.getMetadataManager().getStudyMetadata(studyId).getSampleIndexConfigurationLatest().getVersion(); + String orig = dbAdaptor.getTableNameGenerator().getSampleIndexTableName(studyId, version); String copy = orig + "_copy"; dbAdaptor.getHBaseManager().createTableIfNeeded(copy, Bytes.toBytes(GenomeHelper.COLUMN_FAMILY), From 4baafb6668d9f472e086623ed6c6245198762b25 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 17 Mar 2021 10:03:14 +0100 Subject: [PATCH 095/412] server: delete variant individual query web service --- .../rest/analysis/VariantWebService.java | 44 ------- .../storage/core/rga/VariantRgaConverter.java | 107 ------------------ 2 files changed, 151 deletions(-) diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 4636c06da54..dded969fec7 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -80,7 +80,6 @@ import org.opencb.opencga.core.response.RestResponse; import org.opencb.opencga.server.WebServiceException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; -import org.opencb.opencga.storage.core.rga.RgaQueryParams; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationManager; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; @@ -99,9 +98,6 @@ import static org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils.SAVED_FILTER_DESCR; import static org.opencb.opencga.core.api.ParamConstants.JOB_DEPENDS_ON; import static org.opencb.opencga.core.common.JacksonUtils.getUpdateObjectMapper; -import static org.opencb.opencga.storage.core.rga.RgaQueryParams.*; -import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.FILTER_DESCR; -import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.TYPE_DESCR; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; /** @@ -173,46 +169,6 @@ public VariantWebService(String apiVersion, @Context UriInfo uriInfo, @Context H super(apiVersion, uriInfo, httpServletRequest, httpHeaders); } - @GET - @Path("/individualQuery") - @ApiOperation(value = "Individual RGA query", response = KnockoutByIndividual.class) - @ApiImplicitParams({ - @ApiImplicitParam(name = QueryOptions.INCLUDE, value = ParamConstants.INCLUDE_DESCRIPTION, example = "name,attributes", dataType = "string", paramType = "query"), - @ApiImplicitParam(name = QueryOptions.EXCLUDE, value = ParamConstants.EXCLUDE_DESCRIPTION, example = "id,status", dataType = "string", paramType = "query"), - @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), - @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), - @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query"), - @ApiImplicitParam(name = QueryOptions.SORT, value = "Sort the results", dataType = "boolean", paramType = "query"), - - // Rga params - @ApiImplicitParam(name = "sampleId", value = SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "individualId", value = INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "sex", value = SEX_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "phenotypes", value = PHENOTYPES_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "disorders", value = DISORDERS_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "geneId", value = GENE_ID_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "geneName", value = GENE_NAME_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "transcriptId", value = TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "biotype", value = TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "variants", value = VARIANTS_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "knockout", value = KNOCKOUT_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "populatioFrequency", value = POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "consequenceType", value = CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query"), - - // Study filters - @ApiImplicitParam(name = ParamConstants.STUDY_PARAM, value = STUDY_DESCR, dataType = "string", paramType = "query") - }) - public Response getIndividualRgaQuery() { - return run(() -> { - // Get all query options - QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); - Query query = getVariantQuery(queryOptions); - - return variantManager.get(query, queryOptions, token); - }); - } - @Deprecated @GET @Path("/index") diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java index 87e3e58055e..b8312637256 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java @@ -5,8 +5,6 @@ import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -135,111 +133,6 @@ public List convertToDataModelType(List rgaData return knockoutVariantList; } - public List convertToDataModelaType(List rgaDataModelList, List variantList) { - Set variantIds = new HashSet<>(variantList); - - List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(rgaDataModelList); - Map> variantMap = new HashMap<>(); - - // Extract variants to the root to generate the KnockoutByVariant data model - for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividuals) { - Set tmpVariantIds = new HashSet<>(); - Map>> transcriptVariantMapList = new HashMap<>(); - - for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { - for (KnockoutTranscript transcript : gene.getTranscripts()) { - Set passedVariants = new HashSet<>(); - Map tmpVariantMap = new HashMap<>(); - Set chVariants = new HashSet<>(); - - transcriptVariantMapList.put(transcript.getId(), new HashMap<>()); - - for (KnockoutVariant variant : transcript.getVariants()) { - tmpVariantMap.put(variant.getId(), variant); - - if (variant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { - chVariants.add(variant.getId()); - } - // Include variant only if the variant is in the query or if user did not filter by any variant - if (variantIds.isEmpty() || variantIds.contains(variant.getId())) { - passedVariants.add(variant.getId()); - } - } - - tmpVariantIds.addAll(passedVariants); - - // Generate variant groups according to the variantList list - for (String variantId : passedVariants) { - List tmpVariantList = new LinkedList<>(); - KnockoutVariant knockoutVariant = tmpVariantMap.get(variantId); - tmpVariantList.add(knockoutVariant); - - if (knockoutVariant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET && chVariants.size() > 1) { - // Add all CH variants except itself - for (String chVariant : chVariants) { - if (!chVariant.equals(variantId)) { - tmpVariantList.add(tmpVariantMap.get(chVariant)); - } - } - } - - transcriptVariantMapList.get(transcript.getId()).put(variantId, tmpVariantList); - } - } - } - - // For each of the variants that need to be in the root, we add the corresponding filtered KnockoutByIndividual objects - for (String variantId : tmpVariantIds) { - if (!variantMap.containsKey(variantId)) { - variantMap.put(variantId, new LinkedList<>()); - } - - KnockoutByIndividual tmpKnockoutByIndividual = getFilteredKnockoutByIndividual(knockoutByIndividual, - transcriptVariantMapList, variantId); - variantMap.get(variantId).add(tmpKnockoutByIndividual); - } - } - - List result = new ArrayList<>(variantMap.size()); - for (String variantId : variantMap.keySet()) { - Variant variant = new Variant(variantId); - result.add(new KnockoutByVariant(variantId, variant.getChromosome(), variant.getStart(), variant.getEnd(), - variant.getLength(), variant.getReference(), variant.getAlternate(), variantMap.get(variantId))); - } - - return result; - } - - private KnockoutByIndividual getFilteredKnockoutByIndividual(KnockoutByIndividual knockoutByIndividual, - Map>> transcriptVariantMapList, - String variantId) { - KnockoutByIndividual newKnockoutByIndividual = new KnockoutByIndividual(knockoutByIndividual.getId(), - knockoutByIndividual.getSampleId(), knockoutByIndividual.getSex(), knockoutByIndividual.getPhenotypes(), - knockoutByIndividual.getDisorders(), knockoutByIndividual.getStats()); - - List geneList = new ArrayList<>(knockoutByIndividual.getGenes().size()); - for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { - List transcriptList = new ArrayList<>(gene.getTranscripts().size()); - for (KnockoutTranscript transcript : gene.getTranscripts()) { - Map> variantMap = transcriptVariantMapList.get(transcript.getId()); - List knockoutVariantList = variantMap.get(variantId); - if (knockoutVariantList != null && !knockoutVariantList.isEmpty()) { - transcriptList.add(new KnockoutTranscript(transcript.getId(), transcript.getChromosome(), transcript.getStart(), - transcript.getEnd(), transcript.getBiotype(), transcript.getStrand(), knockoutVariantList)); - } - } - - if (!transcriptList.isEmpty()) { - geneList.add(new KnockoutByIndividual.KnockoutGene(gene.getId(), gene.getName(), gene.getChromosome(), gene.getStart(), - gene.getEnd(), gene.getBiotype(), gene.getStrand()).addTranscripts(transcriptList)); - } - } - - newKnockoutByIndividual.setGenes(geneList); - - return newKnockoutByIndividual; - } - @Override public List convertToStorageType(List knockoutByVariants) { return null; From c96ea0d20d6037aea892e3f97d338b8ac1729d4e Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 17 Mar 2021 10:35:49 +0100 Subject: [PATCH 096/412] clinical: control possible NPE, #1693 --- .../java/org/opencb/opencga/clinical/rga/RgaManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 4b4df66ea52..2263b990811 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -338,13 +338,13 @@ public OpenCGAResult variantQuery(String studyStr, Query quer DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); return ((Number) result.first().getAggregationValues().get(0)).intValue(); } catch (Exception e) { - e.printStackTrace(); + logger.error("Could not obtain the count: {}", e.getMessage(), e); } return -1; }); } - // If the user is querying by gene id, we don't need to do a facet first + // If the user is querying by variant id, we don't need to do a facet first if (!auxQuery.containsKey(RgaDataModel.VARIANTS)) { // 1st. we perform a facet to get the different variant ids matching the user query and using the skip and limit values QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS); @@ -352,6 +352,9 @@ public OpenCGAResult variantQuery(String studyStr, Query quer facetOptions.putIfNotNull(QueryOptions.SKIP, queryOptions.get(QueryOptions.SKIP)); DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + if (result.getNumResults() == 0) { + return OpenCGAResult.empty(KnockoutByVariant.class); + } List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); auxQuery.put(RgaDataModel.VARIANTS, variantIds); } From a02b5bf0bbb28b5a6219490e808535f740168ef3 Mon Sep 17 00:00:00 2001 From: imedina Date: Wed, 17 Mar 2021 11:10:45 +0000 Subject: [PATCH 097/412] client: minor improvemetnin the notebooks --- .../user-training/pyopencga_catalog.ipynb | 71 ++++++++++++++----- .../user-training/pyopencga_first_steps.ipynb | 2 +- .../pyopencga_variant_analysis.ipynb | 2 +- .../pyopencga_variant_query.ipynb | 2 +- 4 files changed, 57 insertions(+), 20 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 63a7224fb14..d8aef42e794 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -129,6 +129,13 @@ "user_client = oc.users\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.1.1 Exploring Projects and Studies" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -253,7 +260,51 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.2 Browsing Samples, Individuals, Files and Cohorts in a Study" + "### 2.1.2 Checking Groups and Permissions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2 Exploring Catalog Metadata" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Brief description\n", + "Explain Aggeation Stats briefly" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2.1 Exploring Samples and Individuals\n", + "Ideas: contar smaples, contar indovdiasl, listar fiels de una sample..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2.2 Exploring Files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2.3 Exploring Cohorts" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3 Working with Samples and Individuals" ] }, { @@ -311,21 +362,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Exploring Files" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exploring Cohorts" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2.3 Filtering by Custom Annotations\n", + "## 2.4 Filtering by Custom Annotations\n", "You can easily filter samples, individuals, ... using your custom annotation ..." ] }, @@ -360,7 +397,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb index e26f5a086c4..1e22d7358f6 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb @@ -526,7 +526,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb index 0acf7218fbb..72862f41043 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb @@ -56,7 +56,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index d0e8e55eb86..4df27e1d2ce 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -142,7 +142,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, From 40d57d3d01fcb4ddb9ee7161f9691384e85c9203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 17 Mar 2021 14:01:17 +0000 Subject: [PATCH 098/412] k8s: Run opencga containers as non root #1725 --- .../app/cloud/docker/opencga-base/Dockerfile | 2 +- .../opencga/templates/rest-deployment.yaml | 5 ++-- .../kubernetes/charts/opencga/values.yaml | 30 ++++++++----------- .../src/main/resources/configuration.yml | 5 ++++ .../master/monitor/executors/K8SExecutor.java | 29 ++++++++++++++++-- 5 files changed, 49 insertions(+), 22 deletions(-) diff --git a/opencga-app/app/cloud/docker/opencga-base/Dockerfile b/opencga-app/app/cloud/docker/opencga-base/Dockerfile index 45eb774e4e3..9af7c86ae8a 100644 --- a/opencga-app/app/cloud/docker/opencga-base/Dockerfile +++ b/opencga-app/app/cloud/docker/opencga-base/Dockerfile @@ -7,7 +7,7 @@ ENV OPENCGA_CONFIG_DIR=${OPENCGA_HOME}/conf RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/main' >> /etc/apk/repositories && echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/community' >> /etc/apk/repositories -RUN apk --no-cache --update add openssh-client sshpass ca-certificates curl docker && \ +RUN apk --no-cache --update add openssh-client sshpass ca-certificates curl docker jq ncurses vim && \ adduser -D -u 1001 opencga -h /home/opencga COPY ${BUILD_PATH} /opt/opencga diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml index aba0d169227..150196c56af 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml @@ -72,15 +72,16 @@ spec: - name: opencgascratch mountPath: /tmp/opencga_scratch - name: dind-daemon - image: docker:dind + image: docker:dind-rootless securityContext: privileged: true + runAsUser: 1000 command: ["/bin/sh", "-c"] args: - | dockerd-entrypoint.sh & sleep 5 - umount /tmp + export DOCKER_HOST=unix:///run/user/1000/docker.sock docker pull opencb/opencga-r:{{- .Chart.AppVersion }} sleep infinity env: diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index 74da457eec9..3ede5511bf4 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -78,16 +78,16 @@ rest: # If not set and create is true, a name is generated using the fullname template name: - podSecurityContext: {} + podSecurityContext: + runAsNonRoot: true # fsGroup: 2000 - securityContext: {} + securityContext: + readOnlyRootFilesystem: true + runAsUser: 1001 # capabilities: # drop: # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 service: type: ClusterIP @@ -152,16 +152,16 @@ master: # If not set and create is true, a name is generated using the fullname template name: - podSecurityContext: {} + podSecurityContext: + runAsNonRoot: true # fsGroup: 2000 - securityContext: {} + securityContext: + readOnlyRootFilesystem: true + runAsUser: 1001 # capabilities: # drop: # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 resources: # We usually recommend not to specify default resources and to leave this as a conscious @@ -191,16 +191,12 @@ init: repository: "opencb/opencga-init:{{ .Chart.AppVersion }}-{{ .Values.hadoop.flavour }}" pullPolicy: IfNotPresent - podSecurityContext: {} - # fsGroup: 2000 - - securityContext: {} + securityContext: + readOnlyRootFilesystem: true + runAsUser: 1001 # capabilities: # drop: # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 resources: # We usually recommend not to specify default resources and to leave this as a conscious diff --git a/opencga-core/src/main/resources/configuration.yml b/opencga-core/src/main/resources/configuration.yml index 91495c618dc..399b5342492 100644 --- a/opencga-core/src/main/resources/configuration.yml +++ b/opencga-core/src/main/resources/configuration.yml @@ -207,6 +207,11 @@ analysis: - name: analysisconf persistentVolumeClaim: claimName: "pvc-opencga-analysisconf" + k8s.podSecurityContext: + k8s.securityContext: + runAsNonRoot: true + runAsUser: 1001 + readOnlyRootFilesystem: true # List of analysis frameworks frameworks: diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java index 8668918617e..a329d36038a 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java @@ -55,6 +55,8 @@ public class K8SExecutor implements BatchExecutor { public static final String K8S_VOLUMES = "k8s.volumes"; public static final String K8S_NODE_SELECTOR = "k8s.nodeSelector"; public static final String K8S_TOLERATIONS = "k8s.tolerations"; + public static final String K8S_SECURITY_CONTEXT = "k8s.securityContext"; + public static final String K8S_POD_SECURITY_CONTEXT = "k8s.podSecurityContext"; public static final EnvVar DOCKER_HOST = new EnvVar("DOCKER_HOST", "tcp://localhost:2375", null); public static final int DEFAULT_TIMEOUT = 30000; // in ms @@ -85,6 +87,8 @@ public class K8SExecutor implements BatchExecutor { private final List volumes; private final Map nodeSelector; private final List tolerations; + private final SecurityContext securityContext; + private final PodSecurityContext podSecurityContext; private final ResourceRequirements resources; private final Config k8sConfig; private final Container dockerDaemonSidecar; @@ -115,6 +119,22 @@ public K8SExecutor(Execution execution) { this.imagePullPolicy = execution.getOptions().getString(K8S_IMAGE_PULL_POLICY, "IfNotPresent"); this.imagePullSecrets = buildLocalObjectReference(execution.getOptions().get(K8S_IMAGE_PULL_SECRETS)); nodeSelector = getMap(execution, K8S_NODE_SELECTOR); + if (execution.getOptions().containsKey(K8S_SECURITY_CONTEXT)) { + securityContext = buildObject(execution.getOptions().get(K8S_SECURITY_CONTEXT), SecurityContext.class); + } else { + securityContext = new SecurityContextBuilder() + .withRunAsUser(1001L) + .withRunAsNonRoot(true) + .withReadOnlyRootFilesystem(true) + .build(); + } + if (execution.getOptions().containsKey(K8S_POD_SECURITY_CONTEXT)) { + podSecurityContext = buildObject(execution.getOptions().get(K8S_POD_SECURITY_CONTEXT), PodSecurityContext.class); + } else { + podSecurityContext = new PodSecurityContextBuilder() + .withRunAsNonRoot(true) + .build(); + } HashMap requests = new HashMap<>(); for (Map.Entry entry : getMap(execution, K8S_REQUESTS).entrySet()) { @@ -129,11 +149,14 @@ public K8SExecutor(Execution execution) { .withRequests(requests) .build(); - String dindImageName = execution.getOptions().getString(K8S_DIND_IMAGE_NAME, "docker:dind"); + String dindImageName = execution.getOptions().getString(K8S_DIND_IMAGE_NAME, "docker:dind-rootless"); dockerDaemonSidecar = new ContainerBuilder() .withName("dind-daemon") .withImage(dindImageName) - .withSecurityContext(new SecurityContextBuilder().withPrivileged(true).build()) + .withSecurityContext(new SecurityContextBuilder() + .withRunAsNonRoot(true) + .withRunAsUser(1000L) + .withPrivileged(true).build()) .withEnv(new EnvVar("DOCKER_TLS_CERTDIR", "", null)) // .withResources(resources) // TODO: Should we add resources here? .withCommand("/bin/sh", "-c") @@ -223,6 +246,7 @@ public void execute(String jobId, String queue, String commandLine, Path stdout, + getCommandLine(commandLine, stdout, stderr)) .withVolumeMounts(volumeMounts) .addToVolumeMounts(TMP_POD_VOLUMEMOUNT) + .withSecurityContext(securityContext) .build()) .withNodeSelector(nodeSelector) .withTolerations(tolerations) @@ -230,6 +254,7 @@ public void execute(String jobId, String queue, String commandLine, Path stdout, .addAllToVolumes(volumes) .addToVolumes(DOCKER_GRAPH_STORAGE_VOLUME) .addToVolumes(TMP_POD_VOLUME) + .withSecurityContext(podSecurityContext) .build()) .build()) .build() From b9e48137b5e66e772e0becd72f002a12d6a46261 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Wed, 17 Mar 2021 15:06:01 +0000 Subject: [PATCH 099/412] client: improve catalog nbook #1716 --- .../user-training/pyopencga_catalog.ipynb | 1588 ++++++++++++++++- .../user-training/pyopencga_first_steps.ipynb | 57 +- 2 files changed, 1557 insertions(+), 88 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index d8aef42e794..c128e3579a9 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -8,7 +8,7 @@ "\n", "------\n", "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", - "- http://bioinfodev.hpc.cam.ac.uk/opencga-test/webservices\n", + "- https://ws.opencb.org/opencga-prod/webservices/ ### THIS DOESN'T WORK\n", "\n", "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing\n", @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -91,6 +91,34 @@ "\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client.\n", + "\n", + "These methods implement perform calls to query different data models in OpenCGA. \n", + "\n", + "Over the user cases addressed in this notebooks we will be performing queries to the **users, projects, studies, samples, individuals and cohorts** data models." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "## Define variables to query different data models though the web services\n", + "\n", + "user_client = oc.users\n", + "project_client = oc.projects\n", + "study_client = oc.studies\n", + "sample_client = oc.samples\n", + "individual_client = oc.individuals\n", + "file_client = oc.files\n", + "cohort_client = oc.cohorts\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -106,27 +134,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.1 Exploring User Account: Projects, Studies and Permissions\n", - "\n", + "## 2.1 Exploring User Account: Permissios, Projects and Studies\n", "In this use case we cover retrieving information for our user.\n", "In OpenCGA, all the user permissions are established at a study level. One project may contain different studies.\n", "\n", "#### Full Qualified Name (fqn) of Studies \n", "\n", - "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study]\n", - "We can access the studies for the specific project *family*:\n", + "CAMBIAR\n", "\n", - "First, we can get the list of available methods for the user client object:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Listing available methods for the user client object ?????\n", - "user_client = oc.users\n" + "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study]\n", + "We can access the studies for the specific project *family*:\n" ] }, { @@ -140,86 +157,86 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Depending on the permissions granted, an user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our usser and its permissions by:" + "Depending on the permissions granted, a user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our user and its permissions by:" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "user info:\n", - "name: OpenCGA Demo User\towned_projects: 0\n" + "User info:\n", + "id:demouser\taccount_type: GUEST\t projects_owned: 0\n" ] } ], "source": [ - "## getting user information\n", + "## Getting user information\n", "## [NOTE] User needs the quey_id string directly --> (user)\n", "user_info = user_client.info(user).get_result(0)\n", "\n", - "print('user info:')\n", - "print('name: {}\\towned_projects: {}'.format(user_info['name'], len(user_info['projects'])))\n", - "\n", - "### It would be great to have creation date and other info ?????\n" + "print('User info:')\n", + "print('id:{}\\taccount_type: {}\\t projects_owned: {}'.format(user_info['id'], user_info['account']['type'], len(user_info['projects'])))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can appreciate that our user (demouser) has **not** projects from its own, but has been granted access to some projects from `demo` user. Let's see how to find it out." + "We can appreciate that our user (demouser) has **not** projects from its own.
However, the user might has been granted access to some projects from other users. Let's see how to find this out:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Projects:** Now, we can to list our user's projects using **project client** `search()` function." + "#### Projects:\n", + "Now, we can list our user's projects using **project client** `search()` function." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#id\tname\torganism.scientificName\torganism.assembly\n", - "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\n", - "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\n" + "#id\tname\torganism.scientificName\torganism.assembly\tfqn\n", + "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\tdemo@family\n", + "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\tdemo@population\n" ] } ], "source": [ "## Getting user projects\n", "## [NOTE] Client specific methods have the query_id as a key:value (i.e (user=user_id)) \n", - "project_client = oc.projects\n", "projects_info = project_client.search()\n", "\n", - "projects_info.print_results(fields='id,name,organism.scientificName,organism.assembly', metadata=False)" + "projects_info.print_results(fields='id,name,organism.scientificName,organism.assembly,fqn', metadata=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Our user (*demo*) has access to 2 different projects:\n", + "As we can see, our user (*demouser*) has access to 2 different projects:\n", "- Project: **family**\n", "- Project: **population**\n", "\n", + "The **fqn** shows that those projects are owned by the user *demo*, who shares the permission to see them with us.\n", + "\n", "**Studies:** Now, let's see which studies do we have access within the **family** project." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -234,15 +251,12 @@ "source": [ "project_id = 'family' # The project we want to retrieve info\n", "\n", - "## you can also use the following command:\n", - "## projects = project_client.search(id=project_id)\n", + "studies = study_client.search(project_id)\n", "\n", - "projects = project_client.info(project_id)\n", - "project = projects.get_result(0)\n", + "## Print the studies using the result_iterator() method\n", "\n", - "# Print the studies in the project\n", - "for study in project['studies']:\n", - " print(\"project:{}\\t study:{}\".format(project_id, study['id']))" + "for study in studies.result_iterator():\n", + " print(\"project:{}\\t study_id:{}\\t study_fqn:{} \".format(project_id, study['id'], study['fqn']))" ] }, { @@ -267,70 +281,1431 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.2 Exploring Catalog Metadata" + "No we can assume that we want to check to which groups belong and permisions asigned for platinium" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 21, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "group_id: @members\n", + "group_id: @admins\n", + "group_id: @opencb-team\n" + ] + } + ], "source": [ - "Brief description\n", - "Explain Aggeation Stats briefly" + "study_fqn = 'demo@family:platinum'\n", + "groups = study_client.groups(study_fqn)\n", + "\n", + "## This will give us the whole list of groups existing in the study\n", + "for group in groups.result_iterator():\n", + " print(\"group_id: {}\".format(group['id']))\n" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 22, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "group_id: @members\n" + ] + } + ], "source": [ - "### 2.2.1 Exploring Samples and Individuals\n", - "Ideas: contar smaples, contar indovdiasl, listar fiels de una sample..." + "user_groups = []\n", + "\n", + "## This will give us only the groups our user belongs to\n", + "for group in groups.result_iterator():\n", + " if 'demouser' in group['userIds']:\n", + " user_groups.append(group['id'])\n", + " print(\"group_id: {}\".format(group['id']))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['VIEW_PANELS', 'VIEW_FAMILIES', 'VIEW_JOBS', 'VIEW_FILES', 'VIEW_FILE_ANNOTATIONS', 'VIEW_COHORTS', 'VIEW_SAMPLE_VARIANTS', 'VIEW_FAMILY_ANNOTATIONS', 'VIEW_FILE_HEADER', 'VIEW_FILE_CONTENT', 'VIEW_AGGREGATED_VARIANTS', 'VIEW_INDIVIDUALS', 'VIEW_COHORT_ANNOTATIONS', 'VIEW_SAMPLES', 'VIEW_SAMPLE_ANNOTATIONS', 'VIEW_CLINICAL_ANALYSIS', 'EXECUTE_JOBS', 'VIEW_INDIVIDUAL_ANNOTATIONS']\n" + ] + } + ], + "source": [ + "## Look the permission our user has\n", + "# Permissions granted directly to user: acl = access control list (permisos)\n", + "acls = study_client.acl(study_fqn, member='demouser')\n", + "\n", + "for acl in acls.result_iterator():\n", + " print(acl['demouser'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "group_id: @members\t group_acls: []\n" + ] + } + ], + "source": [ + "# perm granted to the groups our user belongs to\n", + "for group in user_groups:\n", + " acls = study_client.acl(study_fqn, member=group)\n", + " if acls.get_num_results() == 0:\n", + " print('group_id: {}\\t group_acls: []'.format(group))\n", + " else:\n", + " for acl in acls.result_iterator():\n", + " print('group_id: {}\\t group_acls: {}'.format(group, acl[group]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 2.2.2 Exploring Files" + "## 2.2 Exploring Catalog Metadata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 2.2.3 Exploring Cohorts" + "Par\n", + "Brief description
\n", + "Explain Aggeation Stats briefly: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "## En una unica llamada podemos agregar listas de proyectos\n", + "project_client.aggregation_stats('family,proyecto2')" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'family': {'corpasome': {'cohort': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 3,\n", + " 'numResults': 3,\n", + " 'numTotalResults': 3,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 1,\n", + " 'facetFields': [{'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'}],\n", + " 'count': 1,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'}],\n", + " 'count': 1,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 1,\n", + " 'name': 'status'},\n", + " {'buckets': [{'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '1'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '2'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '3'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': '4'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '5'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '6'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '7'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '8'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '9'}],\n", + " 'count': 1,\n", + " 'end': 10,\n", + " 'name': 'numSamples',\n", + " 'start': 0,\n", + " 'step': 1}],\n", + " 'time': 15},\n", + " 'family': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 5,\n", + " 'numResults': 5,\n", + " 'numTotalResults': 5,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 3,\n", + " 'facetFields': [{'buckets': [{'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'JULY'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'}],\n", + " 'count': 3,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'}],\n", + " 'count': 3,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 3,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 3,\n", + " 'name': 'status'},\n", + " {'buckets': [],\n", + " 'count': 3,\n", + " 'name': 'phenotypes'},\n", + " {'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': '-1'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': '3'}],\n", + " 'count': 3,\n", + " 'name': 'expectedSize'},\n", + " {'buckets': [{'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': '2'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': '4'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '6'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '8'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '10'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '12'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '14'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '16'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '18'}],\n", + " 'count': 3,\n", + " 'end': 20,\n", + " 'name': 'numMembers',\n", + " 'start': 0,\n", + " 'step': 2}],\n", + " 'time': 14},\n", + " 'file': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 7,\n", + " 'numResults': 7,\n", + " 'numTotalResults': 7,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 7477,\n", + " 'facetFields': [{'buckets': [{'count': 6221,\n", + " 'facetFields': [],\n", + " 'value': 'OCTOBER'},\n", + " {'count': 582,\n", + " 'facetFields': [],\n", + " 'value': 'JULY'},\n", + " {'count': 197,\n", + " 'facetFields': [],\n", + " 'value': 'SEPTEMBER'},\n", + " {'count': 183,\n", + " 'facetFields': [],\n", + " 'value': 'DECEMBER'},\n", + " {'count': 141,\n", + " 'facetFields': [],\n", + " 'value': 'AUGUST'},\n", + " {'count': 119,\n", + " 'facetFields': [],\n", + " 'value': 'NOVEMBER'},\n", + " {'count': 34,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'}],\n", + " 'count': 7477,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'},\n", + " {'count': 342,\n", + " 'facetFields': [{'buckets': [{'count': 144,\n", + " 'facetFields': [],\n", + " 'value': 'JANUARY'},\n", + " {'count': 143,\n", + " 'facetFields': [],\n", + " 'value': 'FEBRUARY'},\n", + " {'count': 55,\n", + " 'facetFields': [],\n", + " 'value': 'MARCH'}],\n", + " 'count': 342,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2021'}],\n", + " 'count': 7819,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 6410,\n", + " 'facetFields': [],\n", + " 'value': 'JSON'},\n", + " {'count': 435,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'},\n", + " {'count': 382,\n", + " 'facetFields': [],\n", + " 'value': 'UNKNOWN'},\n", + " {'count': 352,\n", + " 'facetFields': [],\n", + " 'value': 'PLAIN'},\n", + " {'count': 224,\n", + " 'facetFields': [],\n", + " 'value': 'TAB_SEPARATED_VALUES'},\n", + " {'count': 13,\n", + " 'facetFields': [],\n", + " 'value': 'IMAGE'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'VCF'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'BAM'}],\n", + " 'count': 7819,\n", + " 'name': 'format'},\n", + " {'buckets': [{'count': 7813,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'UNKNOWN'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'VARIANT'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'ALIGNMENT'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'IDLIST_RANKED'}],\n", + " 'count': 7819,\n", + " 'name': 'bioformat'},\n", + " {'buckets': [{'count': 6410,\n", + " 'facetFields': [{'buckets': [{'count': 6410,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'}],\n", + " 'count': 6410,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'JSON'},\n", + " {'count': 435,\n", + " 'facetFields': [{'buckets': [{'count': 435,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'}],\n", + " 'count': 435,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'NONE'},\n", + " {'count': 382,\n", + " 'facetFields': [{'buckets': [{'count': 380,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'UNKNOWN'}],\n", + " 'count': 382,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'UNKNOWN'},\n", + " {'count': 352,\n", + " 'facetFields': [{'buckets': [{'count': 351,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'IDLIST_RANKED'}],\n", + " 'count': 352,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'PLAIN'},\n", + " {'count': 224,\n", + " 'facetFields': [{'buckets': [{'count': 224,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'}],\n", + " 'count': 224,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'TAB_SEPARATED_VALUES'},\n", + " {'count': 13,\n", + " 'facetFields': [{'buckets': [{'count': 13,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'}],\n", + " 'count': 13,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'IMAGE'},\n", + " {'count': 2,\n", + " 'facetFields': [{'buckets': [{'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'VARIANT'}],\n", + " 'count': 2,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'VCF'},\n", + " {'count': 1,\n", + " 'facetFields': [{'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'ALIGNMENT'}],\n", + " 'count': 1,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'BAM'}],\n", + " 'count': 7819,\n", + " 'name': 'format'},\n", + " {'buckets': [{'count': 7819,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 7819,\n", + " 'name': 'status'},\n", + " {'buckets': [{'count': 7819,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '10737418240'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '21474836480'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '32212254720'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '42949672960'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '53687091200'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '64424509440'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '75161927680'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '85899345920'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '96636764160'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '107374182400'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '118111600640'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '128849018880'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '139586437120'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '150323855360'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '161061273600'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '171798691840'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '182536110080'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '193273528320'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '204010946560'}],\n", + " 'count': 7819,\n", + " 'end': 214748364800,\n", + " 'name': 'size',\n", + " 'start': 0,\n", + " 'step': 10737418240},\n", + " {'buckets': [{'count': 7816,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': '1'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '2'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '3'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': '4'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '5'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '6'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '7'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '8'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '9'}],\n", + " 'count': 7819,\n", + " 'end': 10,\n", + " 'name': 'numSamples',\n", + " 'start': 0,\n", + " 'step': 1}],\n", + " 'time': 33},\n", + " 'individual': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 8,\n", + " 'numResults': 8,\n", + " 'numTotalResults': 8,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 4,\n", + " 'facetFields': [{'buckets': [{'count': 4,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'}],\n", + " 'count': 4,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'}],\n", + " 'count': 4,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 4,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 4,\n", + " 'name': 'status'},\n", + " {'buckets': [],\n", + " 'count': 4,\n", + " 'name': 'ethnicity'},\n", + " {'buckets': [],\n", + " 'count': 4,\n", + " 'name': 'population'},\n", + " {'buckets': [{'count': 4,\n", + " 'facetFields': [],\n", + " 'value': 'ALIVE'}],\n", + " 'count': 4,\n", + " 'name': 'lifeStatus'},\n", + " {'buckets': [{'count': 3,\n", + " 'facetFields': [],\n", + " 'value': 'HP:0000545'},\n", + " {'count': 3,\n", + " 'facetFields': [],\n", + " 'value': 'Myopia'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'Developmental '\n", + " 'cataract'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'HP:0000519'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'HP:0002077'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'Migraine '\n", + " 'with '\n", + " 'aura'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'Dry '\n", + " 'skin'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'HP:0000958'}],\n", + " 'count': 4,\n", + " 'name': 'phenotypes'},\n", + " {'buckets': [{'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'FEMALE'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'MALE'}],\n", + " 'count': 4,\n", + " 'name': 'sex'},\n", + " {'buckets': [{'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 4,\n", + " 'facetFields': [],\n", + " 'value': '1'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '2'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '3'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '4'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '5'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '6'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '7'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '8'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '9'}],\n", + " 'count': 4,\n", + " 'end': 10,\n", + " 'name': 'numSamples',\n", + " 'start': 0,\n", + " 'step': 1}],\n", + " 'time': 14},\n", + " 'job': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 2,\n", + " 'numResults': 2,\n", + " 'numTotalResults': 2,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 282,\n", + " 'facetFields': [{'buckets': [{'count': 135,\n", + " 'facetFields': [],\n", + " 'value': 'JULY'},\n", + " {'count': 38,\n", + " 'facetFields': [],\n", + " 'value': 'SEPTEMBER'},\n", + " {'count': 35,\n", + " 'facetFields': [],\n", + " 'value': 'DECEMBER'},\n", + " {'count': 26,\n", + " 'facetFields': [],\n", + " 'value': 'AUGUST'},\n", + " {'count': 23,\n", + " 'facetFields': [],\n", + " 'value': 'NOVEMBER'},\n", + " {'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'OCTOBER'},\n", + " {'count': 8,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'}],\n", + " 'count': 282,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'},\n", + " {'count': 65,\n", + " 'facetFields': [{'buckets': [{'count': 28,\n", + " 'facetFields': [],\n", + " 'value': 'JANUARY'},\n", + " {'count': 27,\n", + " 'facetFields': [],\n", + " 'value': 'FEBRUARY'},\n", + " {'count': 10,\n", + " 'facetFields': [],\n", + " 'value': 'MARCH'}],\n", + " 'count': 65,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2021'}],\n", + " 'count': 347,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 260,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 260,\n", + " 'name': 'executorId'}],\n", + " 'value': 'sample-eligibility'},\n", + " {'count': 20,\n", + " 'facetFields': [{'buckets': [{'count': 15,\n", + " 'facetFields': [],\n", + " 'value': 'opencga-local'}],\n", + " 'count': 20,\n", + " 'name': 'executorId'}],\n", + " 'value': 'individual-qc'},\n", + " {'count': 15,\n", + " 'facetFields': [{'buckets': [{'count': 13,\n", + " 'facetFields': [],\n", + " 'value': 'opencga-local'}],\n", + " 'count': 15,\n", + " 'name': 'executorId'}],\n", + " 'value': 'family-qc'},\n", + " {'count': 12,\n", + " 'facetFields': [{'buckets': [{'count': 7,\n", + " 'facetFields': [],\n", + " 'value': 'opencga-local'}],\n", + " 'count': 12,\n", + " 'name': 'executorId'}],\n", + " 'value': 'sample-qc'},\n", + " {'count': 11,\n", + " 'facetFields': [{'buckets': [{'count': 11,\n", + " 'facetFields': [],\n", + " 'value': 'hbase-mapreduce'}],\n", + " 'count': 11,\n", + " 'name': 'executorId'}],\n", + " 'value': 'sample-variant-stats'},\n", + " {'count': 10,\n", + " 'facetFields': [{'buckets': [{'count': 10,\n", + " 'facetFields': [],\n", + " 'value': 'opencga-local'}],\n", + " 'count': 10,\n", + " 'name': 'executorId'}],\n", + " 'value': 'knockout'},\n", + " {'count': 6,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 6,\n", + " 'name': 'executorId'}],\n", + " 'value': 'variant-export'},\n", + " {'count': 4,\n", + " 'facetFields': [{'buckets': [{'count': 3,\n", + " 'facetFields': [],\n", + " 'value': 'opencga-local'}],\n", + " 'count': 4,\n", + " 'name': 'executorId'}],\n", + " 'value': 'interpretation-tiering'},\n", + " {'count': 3,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 3,\n", + " 'name': 'executorId'}],\n", + " 'value': 'variant-family-index'},\n", + " {'count': 2,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 2,\n", + " 'name': 'executorId'}],\n", + " 'value': 'variant-stats'},\n", + " {'count': 1,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 1,\n", + " 'name': 'executorId'}],\n", + " 'value': 'alignment-index-run'},\n", + " {'count': 1,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 1,\n", + " 'name': 'executorId'}],\n", + " 'value': 'samtools'},\n", + " {'count': 1,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 1,\n", + " 'name': 'executorId'}],\n", + " 'value': 'variant-aggregate-family'},\n", + " {'count': 1,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 1,\n", + " 'name': 'executorId'}],\n", + " 'value': 'variant-index'}],\n", + " 'count': 347,\n", + " 'name': 'toolId'}],\n", + " 'time': 22},\n", + " 'sample': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 4,\n", + " 'numResults': 4,\n", + " 'numTotalResults': 4,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 4,\n", + " 'facetFields': [{'buckets': [{'count': 4,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'}],\n", + " 'count': 4,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'}],\n", + " 'count': 4,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 4,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 4,\n", + " 'name': 'status'},\n", + " {'buckets': [{'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'HP:0000545'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'Myopia'}],\n", + " 'count': 4,\n", + " 'name': 'phenotypes'},\n", + " {'buckets': [{'count': 4,\n", + " 'facetFields': [],\n", + " 'value': 'false'}],\n", + " 'count': 4,\n", + " 'name': 'somatic'}],\n", + " 'time': 27}},\n", + " 'platinum': {'cohort': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 3,\n", + " 'numResults': 3,\n", + " 'numTotalResults': 3,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 1,\n", + " 'facetFields': [{'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'}],\n", + " 'count': 1,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'}],\n", + " 'count': 1,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 1,\n", + " 'name': 'status'},\n", + " {'buckets': [{'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '1'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '2'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '3'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '4'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '5'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '6'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '7'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '8'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '9'}],\n", + " 'count': 1,\n", + " 'end': 10,\n", + " 'name': 'numSamples',\n", + " 'start': 0,\n", + " 'step': 1}],\n", + " 'time': 31},\n", + " 'family': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 5,\n", + " 'numResults': 5,\n", + " 'numTotalResults': 5,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 1,\n", + " 'facetFields': [{'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'JULY'}],\n", + " 'count': 1,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'}],\n", + " 'count': 1,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 1,\n", + " 'name': 'status'},\n", + " {'buckets': [],\n", + " 'count': 1,\n", + " 'name': 'phenotypes'},\n", + " {'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': '0'}],\n", + " 'count': 1,\n", + " 'name': 'expectedSize'},\n", + " {'buckets': [{'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '2'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '4'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '6'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '8'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '10'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '12'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '14'},\n", + " {'count': 1,\n", + " 'facetFields': [],\n", + " 'value': '16'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '18'}],\n", + " 'count': 1,\n", + " 'end': 20,\n", + " 'name': 'numMembers',\n", + " 'start': 0,\n", + " 'step': 2}],\n", + " 'time': 31},\n", + " 'file': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 7,\n", + " 'numResults': 7,\n", + " 'numTotalResults': 7,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 3850,\n", + " 'facetFields': [{'buckets': [{'count': 2867,\n", + " 'facetFields': [],\n", + " 'value': 'SEPTEMBER'},\n", + " {'count': 258,\n", + " 'facetFields': [],\n", + " 'value': 'JULY'},\n", + " {'count': 222,\n", + " 'facetFields': [],\n", + " 'value': 'AUGUST'},\n", + " {'count': 200,\n", + " 'facetFields': [],\n", + " 'value': 'NOVEMBER'},\n", + " {'count': 138,\n", + " 'facetFields': [],\n", + " 'value': 'DECEMBER'},\n", + " {'count': 99,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'},\n", + " {'count': 66,\n", + " 'facetFields': [],\n", + " 'value': 'OCTOBER'}],\n", + " 'count': 3850,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'},\n", + " {'count': 447,\n", + " 'facetFields': [{'buckets': [{'count': 227,\n", + " 'facetFields': [],\n", + " 'value': 'FEBRUARY'},\n", + " {'count': 146,\n", + " 'facetFields': [],\n", + " 'value': 'MARCH'},\n", + " {'count': 74,\n", + " 'facetFields': [],\n", + " 'value': 'JANUARY'}],\n", + " 'count': 447,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2021'}],\n", + " 'count': 4297,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 2915,\n", + " 'facetFields': [],\n", + " 'value': 'JSON'},\n", + " {'count': 425,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'},\n", + " {'count': 353,\n", + " 'facetFields': [],\n", + " 'value': 'UNKNOWN'},\n", + " {'count': 333,\n", + " 'facetFields': [],\n", + " 'value': 'PLAIN'},\n", + " {'count': 254,\n", + " 'facetFields': [],\n", + " 'value': 'TAB_SEPARATED_VALUES'},\n", + " {'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'VCF'}],\n", + " 'count': 4297,\n", + " 'name': 'format'},\n", + " {'buckets': [{'count': 4278,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'},\n", + " {'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'VARIANT'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'UNKNOWN'}],\n", + " 'count': 4297,\n", + " 'name': 'bioformat'},\n", + " {'buckets': [{'count': 2915,\n", + " 'facetFields': [{'buckets': [{'count': 2915,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'}],\n", + " 'count': 2915,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'JSON'},\n", + " {'count': 425,\n", + " 'facetFields': [{'buckets': [{'count': 425,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'}],\n", + " 'count': 425,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'NONE'},\n", + " {'count': 353,\n", + " 'facetFields': [{'buckets': [{'count': 351,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'},\n", + " {'count': 2,\n", + " 'facetFields': [],\n", + " 'value': 'UNKNOWN'}],\n", + " 'count': 353,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'UNKNOWN'},\n", + " {'count': 333,\n", + " 'facetFields': [{'buckets': [{'count': 333,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'}],\n", + " 'count': 333,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'PLAIN'},\n", + " {'count': 254,\n", + " 'facetFields': [{'buckets': [{'count': 254,\n", + " 'facetFields': [],\n", + " 'value': 'NONE'}],\n", + " 'count': 254,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'TAB_SEPARATED_VALUES'},\n", + " {'count': 17,\n", + " 'facetFields': [{'buckets': [{'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'VARIANT'}],\n", + " 'count': 17,\n", + " 'name': 'bioformat'}],\n", + " 'value': 'VCF'}],\n", + " 'count': 4297,\n", + " 'name': 'format'},\n", + " {'buckets': [{'count': 4297,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 4297,\n", + " 'name': 'status'},\n", + " {'buckets': [{'count': 4297,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '10737418240'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '21474836480'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '32212254720'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '42949672960'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '53687091200'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '64424509440'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '75161927680'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '85899345920'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '96636764160'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '107374182400'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '118111600640'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '128849018880'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '139586437120'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '150323855360'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '161061273600'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '171798691840'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '182536110080'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '193273528320'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '204010946560'}],\n", + " 'count': 4297,\n", + " 'end': 214748364800,\n", + " 'name': 'size',\n", + " 'start': 0,\n", + " 'step': 10737418240},\n", + " {'buckets': [{'count': 4280,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 17,\n", + " 'facetFields': [],\n", + " 'value': '1'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '2'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '3'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '4'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '5'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '6'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '7'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '8'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '9'}],\n", + " 'count': 4297,\n", + " 'end': 10,\n", + " 'name': 'numSamples',\n", + " 'start': 0,\n", + " 'step': 1}],\n", + " 'time': 41},\n", + " 'individual': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 8,\n", + " 'numResults': 8,\n", + " 'numTotalResults': 8,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 17,\n", + " 'facetFields': [{'buckets': [{'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'}],\n", + " 'count': 17,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'}],\n", + " 'count': 17,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 17,\n", + " 'name': 'status'},\n", + " {'buckets': [],\n", + " 'count': 17,\n", + " 'name': 'ethnicity'},\n", + " {'buckets': [],\n", + " 'count': 17,\n", + " 'name': 'population'},\n", + " {'buckets': [{'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'UNKNOWN'}],\n", + " 'count': 17,\n", + " 'name': 'lifeStatus'},\n", + " {'buckets': [],\n", + " 'count': 17,\n", + " 'name': 'phenotypes'},\n", + " {'buckets': [{'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'UNKNOWN'}],\n", + " 'count': 17,\n", + " 'name': 'sex'},\n", + " {'buckets': [{'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '0'},\n", + " {'count': 17,\n", + " 'facetFields': [],\n", + " 'value': '1'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '2'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '3'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '4'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '5'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '6'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '7'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '8'},\n", + " {'count': 0,\n", + " 'facetFields': [],\n", + " 'value': '9'}],\n", + " 'count': 17,\n", + " 'end': 10,\n", + " 'name': 'numSamples',\n", + " 'start': 0,\n", + " 'step': 1}],\n", + " 'time': 24},\n", + " 'job': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 2,\n", + " 'numResults': 2,\n", + " 'numTotalResults': 2,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 255,\n", + " 'facetFields': [{'buckets': [{'count': 60,\n", + " 'facetFields': [],\n", + " 'value': 'JULY'},\n", + " {'count': 46,\n", + " 'facetFields': [],\n", + " 'value': 'NOVEMBER'},\n", + " {'count': 44,\n", + " 'facetFields': [],\n", + " 'value': 'AUGUST'},\n", + " {'count': 42,\n", + " 'facetFields': [],\n", + " 'value': 'SEPTEMBER'},\n", + " {'count': 26,\n", + " 'facetFields': [],\n", + " 'value': 'DECEMBER'},\n", + " {'count': 23,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'},\n", + " {'count': 14,\n", + " 'facetFields': [],\n", + " 'value': 'OCTOBER'}],\n", + " 'count': 255,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'},\n", + " {'count': 85,\n", + " 'facetFields': [{'buckets': [{'count': 43,\n", + " 'facetFields': [],\n", + " 'value': 'FEBRUARY'},\n", + " {'count': 28,\n", + " 'facetFields': [],\n", + " 'value': 'MARCH'},\n", + " {'count': 14,\n", + " 'facetFields': [],\n", + " 'value': 'JANUARY'}],\n", + " 'count': 85,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2021'}],\n", + " 'count': 340,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 269,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 269,\n", + " 'name': 'executorId'}],\n", + " 'value': 'sample-eligibility'},\n", + " {'count': 20,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 20,\n", + " 'name': 'executorId'}],\n", + " 'value': 'variant-index'},\n", + " {'count': 18,\n", + " 'facetFields': [{'buckets': [{'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'opencga-local'}],\n", + " 'count': 18,\n", + " 'name': 'executorId'}],\n", + " 'value': 'sample-qc'},\n", + " {'count': 18,\n", + " 'facetFields': [{'buckets': [{'count': 18,\n", + " 'facetFields': [],\n", + " 'value': 'hbase-mapreduce'}],\n", + " 'count': 18,\n", + " 'name': 'executorId'}],\n", + " 'value': 'sample-variant-stats'},\n", + " {'count': 6,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 6,\n", + " 'name': 'executorId'}],\n", + " 'value': 'variant-annotation-index'},\n", + " {'count': 3,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 3,\n", + " 'name': 'executorId'}],\n", + " 'value': 'variant-secondary-index'},\n", + " {'count': 3,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 3,\n", + " 'name': 'executorId'}],\n", + " 'value': 'variant-stats'},\n", + " {'count': 1,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 1,\n", + " 'name': 'executorId'}],\n", + " 'value': 'family-qc'},\n", + " {'count': 1,\n", + " 'facetFields': [{'buckets': [],\n", + " 'count': 1,\n", + " 'name': 'executorId'}],\n", + " 'value': 'inferred-sex'},\n", + " {'count': 1,\n", + " 'facetFields': [{'buckets': [{'count': 1,\n", + " 'facetFields': [],\n", + " 'value': 'opencga-local'}],\n", + " 'count': 1,\n", + " 'name': 'executorId'}],\n", + " 'value': 'knockout'}],\n", + " 'count': 340,\n", + " 'name': 'toolId'}],\n", + " 'time': 30},\n", + " 'sample': {'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 4,\n", + " 'numResults': 4,\n", + " 'numTotalResults': 4,\n", + " 'numUpdated': 0,\n", + " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", + " 'results': [{'buckets': [{'count': 17,\n", + " 'facetFields': [{'buckets': [{'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'JUNE'}],\n", + " 'count': 17,\n", + " 'name': 'creationMonth'}],\n", + " 'value': '2020'}],\n", + " 'count': 17,\n", + " 'name': 'creationYear'},\n", + " {'buckets': [{'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'READY'}],\n", + " 'count': 17,\n", + " 'name': 'status'},\n", + " {'buckets': [],\n", + " 'count': 17,\n", + " 'name': 'phenotypes'},\n", + " {'buckets': [{'count': 17,\n", + " 'facetFields': [],\n", + " 'value': 'false'}],\n", + " 'count': 17,\n", + " 'name': 'somatic'}],\n", + " 'time': 23}}}}\n" + ] + } + ], + "source": [ + "family_stats = project_client.aggregation_stats(project_id)\n", + "pprint(family_stats.get_result(0)) #quiero imprimir el primer resultado\n", + "\n", + "####AGGREGATIONS NOT WORKING NOW- Doubkcheck later with Genentech Installation\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.3 Working with Samples and Individuals" + "### 2.2.1 Exploring Samples and Individuals\n", + "Ideas: contar smaples, contar indovdiasl, listar fiels de una sample..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Exploring Samples and Individuals\n", "\n", "Once we know the studies our user 'demo' has access to, we can explore the samples that a project contains.
\n", "To fetch samples you need to use the sample client built in pyopencga.
\n", "\n", "Remember that it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies, since we cannot be sure if there might be **other studies** with the same name contained in **other projects**.
(E.g: the study *platinium* might be defined in two different projects: *GRch37_project and GRch38_project*)\n", "\n", - "In this case, we can see the samples from the project *platinium*." + "Let's imagine we want to know how many samples are in the study **platinum**, and list information about the first two samples: " ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#Time: 66\n", + "#Time: 92\n", "#Num matches: 17\n", "#Num results: 2\n", "#Num inserted: 0\n", @@ -343,9 +1718,14 @@ } ], "source": [ - "## Let's print samples from platinum usinf project:study notation\n", - "study_id = 'family:platinum' #fqn of the study\n", - "samples = oc.samples.search(study=study_id, count=True, limit = 2) ## other possible params, count=False, id='NA12880,NA12881'\n", + "# Define the fqn of the study we want to query\n", + "\n", + "study_id = 'family:platinum' \n", + "\n", + "\n", + "## Call to the sample web endpoint\n", + "\n", + "samples = sample_client.search(study=study_id, count=True, limit = 2) ## other possible params, count=False, id='NA12880,NA12881'\n", "samples.print_results()" ] }, @@ -358,19 +1738,97 @@ "However, only information about **2 samples** is returned, because we have set the parameter `limit=2`." ] }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 215\n", + "#Num matches: 17\n", + "#Num results: 2\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotationSets\tname\tuuid\tfather\tmother\tlocation\tsex\tkaryotypicSex\tethnicity\tpopulation\trelease\tversion\tcreationDate\tmodificationDate\tlifeStatus\tphenotypes\tdisorders\tsamples\tparentalConsanguinity\tstatus\tinternal\tattributes\n", + "NA12877\t.\tNA12877\teba0f035-0172-0006-0001-f2aeb4168df1\t{'release': 0, 'version': 0, 'parentalConsanguinity': False}\t{'release': 0, 'version': 0, 'parentalConsanguinity': False}\t{}\tUNKNOWN\tUNKNOWN\t\t{}\t1\t1\t20200625131812\t20201002113644\tUNKNOWN\t.\t.\t.\tFalse\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131812', 'description': ''}}\t{}\n", + "NA12878\t.\tNA12878\teba0f2b4-0172-0006-0001-6af0ded43009\t{'release': 0, 'version': 0, 'parentalConsanguinity': False}\t{'release': 0, 'version': 0, 'parentalConsanguinity': False}\t{}\tUNKNOWN\tUNKNOWN\t\t{}\t1\t1\t20200625131813\t20201002113649\tUNKNOWN\t.\t.\t.\tFalse\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131813', 'description': ''}}\t{}\n" + ] + } + ], + "source": [ + "## We can do the same for individuals\n", + "\n", + "individuals = individual_client.search(study=study_id, count=True, limit = 2) ## other possible params, count=False, id='NA12880,NA12881'\n", + "individuals.print_results()" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.4 Filtering by Custom Annotations\n", - "You can easily filter samples, individuals, ... using your custom annotation ..." + "### 2.2.2 Exploring Files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Listar los files de una sample CONCRETA\n", + "sample = oc.samples.info(study=study_id, limit=1)## other possible params, count=False, id='NA12880,NA12881'\n", + "\n", + "sample.get_results(0)['fileIds']\n", + "\n", + "##El campo que necesito es file_ids\n", + "\n", + "sample_concreta = sample.get_results(0)['id']\n", + "\n", + "## Listado completo de files con todos los metadatos \n", + "oc.files.search(study=study_id, sampleIds=sample_concreta)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2.3 Exploring Cohorts" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Cohortes tienen un listado de samples agrupadas con unas caracteristicas concretas \n", + "\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.4 Aggregation Stats" + "## 2.4 Filtering by Custom Annotations\n", + "You can easily filter samples, individuals, ... using your custom annotation ..." ] }, { @@ -397,9 +1855,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb index 1e22d7358f6..1b7b2255017 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb @@ -88,16 +88,19 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "# server host\n", + "# Server host\n", + "\n", "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", "\n", - "# user credentials\n", + "\n", + "# User credentials\n", + "\n", "user = 'demouser'\n", - "passwd = 'demouser' ## you can skip this, see below.\n" + "passwd = 'demouser' ## You can skip this, see section 1.3.4 below.\n" ] }, { @@ -109,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -129,8 +132,7 @@ " }\n", " }\n", "\n", - "print('Config information:\\n',config_dict)\n", - "\n" + "print('Config information:\\n',config_dict)\n" ] }, { @@ -144,35 +146,36 @@ "\n", "#### OpencgaClient: what is and why is so important?\n", "\n", - "The `Opencgaclient` (see *oc* variable below) implements all the methods to query the REST api of OpenCGA. All the webservices abailable, can be directly accesed through the client." + "The `Opencgaclient` (see *oc* variable below) implements all the methods to query the REST api of OpenCGA. All the webservices available, can be directly accesed through the client." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 9, "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'ClientConfiguration' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m## Create the configuration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mconfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mClientConfiguration\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m##### Define the client #####\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0moc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mOpencgaClient\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'ClientConfiguration' is not defined" - ] - } - ], + "outputs": [], "source": [ "## Create the configuration\n", + "\n", "config = ClientConfiguration(config_dict)\n", "\n", + "\n", "##### Define the client #####\n", + " #\n", "oc = OpencgaClient(config) #\n", + " #\n", "#############################" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. \n", + "\n", + "These methods implement calls to the OpenCGA **[web service endpoints](https://ws.opencb.org/opencga-prod/webservices/)** used by pyopencga." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -189,6 +192,7 @@ "outputs": [], "source": [ "# Option 1: here we put only the user in order to be asked for the password interactively\n", + "\n", "# oc.login(user)" ] }, @@ -199,6 +203,7 @@ "outputs": [], "source": [ "# Option 2: you can pass the user and passwd\n", + "\n", "oc.login(user, passwd)" ] }, @@ -233,6 +238,7 @@ "source": [ "## Let's fecth the available projects.\n", "## First let's get the project client and execute search() funciton\n", + "\n", "project_client = oc.projects\n", "projects = project_client.search()\n", "\n", @@ -265,6 +271,7 @@ ], "source": [ "## Loop through all diferent projects \n", + "\n", "for project in projects.responses[0]['results']:\n", " print(project['id'], project['name'])" ] @@ -308,6 +315,7 @@ ], "source": [ "# Loop through all diferent projects \n", + "\n", "for project in projects.get_results():\n", " print(project['id'], project['name'])" ] @@ -337,6 +345,7 @@ ], "source": [ "## Iterate through all diferent projects \n", + "\n", "for project in projects.result_iterator():\n", " print(project['id'], project['name'])" ] @@ -373,6 +382,7 @@ ], "source": [ "## This function iterates over all the results, it can be configured to exclude metadata, change separator or even select the fields!\n", + "\n", "projects.print_results()" ] }, @@ -401,6 +411,7 @@ ], "source": [ "## Lets exclude metadata and print only few fields, use dot notation for ensted fields\n", + "\n", "projects.print_results(fields='id,name,organism.scientificName,organism.assembly',metadata=False)\n", "print()\n" ] @@ -526,7 +537,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, From a6ce3cff242fd081b4cecf507768b7c2d6239fdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 17 Mar 2021 15:13:22 +0000 Subject: [PATCH 100/412] clinical: Fix StorageConfiguration import change --- .../main/java/org/opencb/opencga/clinical/StorageManager.java | 2 +- .../main/java/org/opencb/opencga/clinical/rga/RgaManager.java | 2 +- .../java/org/opencb/opencga/clinical/rga/RgaManagerTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java index 1033ed7721f..c35e13cc796 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java @@ -5,7 +5,7 @@ import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.cache.CacheManager; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 2263b990811..ab3167033a9 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -25,7 +25,7 @@ import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.RgaException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java index ae98f0bac7c..499d3af1dd7 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java @@ -21,7 +21,7 @@ import org.opencb.opencga.core.models.sample.SampleAclParams; import org.opencb.opencga.core.models.user.Account; import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.RgaException; import org.opencb.opencga.storage.core.rga.RgaEngine; import org.opencb.opencga.storage.core.rga.RgaEngineTest; From d5453a1c92e2cd544b47c801ed4aaf91f9a0af89 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 17 Mar 2021 16:19:05 +0100 Subject: [PATCH 101/412] clinical: extract variant info to root in variant rga, #1693 --- .../analysis/knockout/KnockoutByVariant.java | 64 +++++++++++++++++++ .../opencga/server/rest/StudyWSServer.java | 3 +- .../core/rga/IndividualRgaConverter.java | 11 ++++ .../storage/core/rga/VariantRgaConverter.java | 28 ++++++-- 4 files changed, 100 insertions(+), 6 deletions(-) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java index de46b4d447c..7806d2e7c4e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java @@ -1,5 +1,9 @@ package org.opencb.opencga.core.models.analysis.knockout; +import org.opencb.biodata.models.variant.avro.ClinicalSignificance; +import org.opencb.biodata.models.variant.avro.PopulationFrequency; +import org.opencb.biodata.models.variant.avro.VariantType; + import java.util.List; public class KnockoutByVariant { @@ -11,6 +15,10 @@ public class KnockoutByVariant { private int length; private String reference; private String alternate; + private VariantType type; + + private List populationFrequencies; + private List clinicalSignificance; private int numIndividuals; private List individuals; @@ -18,8 +26,18 @@ public class KnockoutByVariant { public KnockoutByVariant() { } + public KnockoutByVariant(String id, List individuals) { + this(id, null, -1, -1, 0, null, null, null, null, null, individuals); + } + public KnockoutByVariant(String id, String chromosome, int start, int end, int length, String reference, String alternate, List individuals) { + this(id, chromosome, start, end, length, reference, alternate, null, null, null, individuals); + } + + public KnockoutByVariant(String id, String chromosome, int start, int end, int length, String reference, String alternate, + VariantType type, List populationFrequencies, + List clinicalSignificance, List individuals) { this.id = id; this.chromosome = chromosome; this.start = start; @@ -27,6 +45,9 @@ public KnockoutByVariant(String id, String chromosome, int start, int end, int l this.length = length; this.reference = reference; this.alternate = alternate; + this.type = type; + this.populationFrequencies = populationFrequencies; + this.clinicalSignificance = clinicalSignificance; this.numIndividuals = individuals != null ? individuals.size() : 0; this.individuals = individuals; } @@ -41,12 +62,28 @@ public String toString() { sb.append(", length=").append(length); sb.append(", reference='").append(reference).append('\''); sb.append(", alternate='").append(alternate).append('\''); + sb.append(", type=").append(type); + sb.append(", populationFrequencies=").append(populationFrequencies); + sb.append(", clinicalSignificance=").append(clinicalSignificance); sb.append(", numIndividuals=").append(numIndividuals); sb.append(", individuals=").append(individuals); sb.append('}'); return sb.toString(); } + public KnockoutByVariant setVariantFields(KnockoutVariant knockoutVariant) { + this.chromosome = knockoutVariant.getChromosome(); + this.start = knockoutVariant.getStart(); + this.end = knockoutVariant.getEnd(); + this.length = knockoutVariant.getLength(); + this.reference = knockoutVariant.getReference(); + this.alternate = knockoutVariant.getAlternate(); + this.type = knockoutVariant.getType(); + this.populationFrequencies = knockoutVariant.getPopulationFrequencies(); + this.clinicalSignificance = knockoutVariant.getClinicalSignificance(); + return this; + } + public String getId() { return id; } @@ -110,6 +147,33 @@ public KnockoutByVariant setAlternate(String alternate) { return this; } + public VariantType getType() { + return type; + } + + public KnockoutByVariant setType(VariantType type) { + this.type = type; + return this; + } + + public List getPopulationFrequencies() { + return populationFrequencies; + } + + public KnockoutByVariant setPopulationFrequencies(List populationFrequencies) { + this.populationFrequencies = populationFrequencies; + return this; + } + + public List getClinicalSignificance() { + return clinicalSignificance; + } + + public KnockoutByVariant setClinicalSignificance(List clinicalSignificance) { + this.clinicalSignificance = clinicalSignificance; + return this; + } + public int getNumIndividuals() { return numIndividuals; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java index b9dbf1bbe83..8b05a61a54e 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java @@ -180,8 +180,7 @@ public Response getGroups( @PathParam(ParamConstants.STUDY_PARAM) String studyStr, @ApiParam(value = "Group id. If provided, it will only fetch information for the provided group.") @QueryParam("id") String groupId, @ApiParam(value = "[DEPRECATED] Replaced by id.") @QueryParam("name") String groupName, - @ApiParam(value = ParamConstants.SILENT_DESCRIPTION, - defaultValue = "false") @QueryParam(Constants.SILENT) boolean silent) { + @ApiParam(value = ParamConstants.SILENT_DESCRIPTION, defaultValue = "false") @QueryParam(Constants.SILENT) boolean silent) { try { if (StringUtils.isNotEmpty(groupName)) { groupId = groupName; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index 663e44dbc09..ec02c8ae103 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -5,6 +5,7 @@ import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.biodata.models.pedigree.IndividualProperty; +import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; @@ -179,6 +180,16 @@ public static void extractKnockoutByIndividualMap(RgaDataModel rgaDataModel, Set try { KnockoutVariant knockoutVariant = JacksonUtils.getDefaultObjectMapper().readValue(variantJson, KnockoutVariant.class); + if (StringUtils.isEmpty(knockoutVariant.getChromosome())) { + // Fill typical variant fields + Variant variant = new Variant(knockoutVariant.getId()); + knockoutVariant.setChromosome(variant.getChromosome()); + knockoutVariant.setStart(variant.getStart()); + knockoutVariant.setEnd(variant.getEnd()); + knockoutVariant.setLength(variant.getLength()); + knockoutVariant.setReference(variant.getReference()); + knockoutVariant.setAlternate(variant.getAlternate()); + } if (variantIds.isEmpty() || variantIds.contains(knockoutVariant.getId())) { knockoutVariantList.add(knockoutVariant); } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java index b8312637256..de1634778b6 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java @@ -1,10 +1,12 @@ package org.opencb.opencga.storage.core.rga; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -126,9 +128,27 @@ public List convertToDataModelType(List rgaData for (String individualId : result.get(variantId)) { individualList.add(individualMap.get(individualId)); } - Variant variant = new Variant(variantId); - knockoutVariantList.add(new KnockoutByVariant(variantId, variant.getChromosome(), variant.getStart(), variant.getEnd(), - variant.getLength(), variant.getReference(), variant.getAlternate(), individualList)); + + KnockoutByVariant knockoutByVariant = new KnockoutByVariant(variantId, individualList); + + // Look for nested variant info + KnockoutByIndividual knockoutByIndividual = individualList.get(0); + if (CollectionUtils.isNotEmpty(knockoutByIndividual.getGenes())) { + KnockoutByIndividual.KnockoutGene gene = knockoutByIndividual.getGenes().stream().findFirst().get(); + if (CollectionUtils.isNotEmpty(gene.getTranscripts())) { + KnockoutTranscript transcript = gene.getTranscripts().stream().findFirst().get(); + if (CollectionUtils.isNotEmpty(transcript.getVariants())) { + for (KnockoutVariant transcriptVariant : transcript.getVariants()) { + if (variantId.equals(transcriptVariant.getId())) { + knockoutByVariant.setVariantFields(transcriptVariant); + break; + } + } + } + } + } + + knockoutVariantList.add(knockoutByVariant); } return knockoutVariantList; } From ca022e2d4edee2f5e06ee5da97f9857cff535370 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 17 Mar 2021 16:22:50 +0100 Subject: [PATCH 102/412] clinical: force rga ids to be provided, #1693 --- .../storage/core/rga/IndividualRgaConverter.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index ec02c8ae103..4a21f99cf0a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -216,6 +216,13 @@ public List convertToStorageType(List knocko private List convertToStorageType(KnockoutByIndividual knockoutByIndividual) throws RgaException, JsonProcessingException { + if (StringUtils.isEmpty(knockoutByIndividual.getId())) { + throw new RgaException("Missing mandatory field 'id'"); + } + if (StringUtils.isEmpty(knockoutByIndividual.getSampleId())) { + throw new RgaException("Missing mandatory field 'sampleId'"); + } + List result = new LinkedList<>(); if (knockoutByIndividual.getGenes() != null) { @@ -289,8 +296,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI Map> popFreqs = getPopulationFrequencies(transcript); String id = knockoutByIndividual.getSampleId() + "_" + gene.getId() + "_" + transcript.getId(); - String individualId = StringUtils.isNotEmpty(knockoutByIndividual.getId()) ? knockoutByIndividual.getId() - : knockoutByIndividual.getSampleId(); + String individualId = knockoutByIndividual.getId(); int numParents = 0; if (StringUtils.isNotEmpty(knockoutByIndividual.getFatherId())) { From bd168184d0b3424eca699239ae81af7f8c00525a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 17 Mar 2021 16:21:58 +0000 Subject: [PATCH 103/412] storage: Fix read available normalizer extensions from configuration --- .../opencga/storage/core/variant/VariantStoragePipeline.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java index 704462ca91e..873f5eb0e69 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java @@ -377,8 +377,7 @@ public URI transform(URI input, URI pedigree, URI output) throws StorageEngineEx protected Task initNormalizer(VariantFileMetadata metadata) throws StorageEngineException { boolean generateReferenceBlocks = options.getBoolean(GVCF.key(), false); Collection enabledExtensions = getOptions() - .getAsStringList(NORMALIZATION_EXTENSIONS.key(), - NORMALIZATION_EXTENSIONS.defaultValue()); + .getAsStringList(NORMALIZATION_EXTENSIONS.key()); VariantNormalizer.VariantNormalizerConfig normalizerConfig = new VariantNormalizer.VariantNormalizerConfig() .setReuseVariants(true) .setNormalizeAlleles(true) From 569ea961bf91decadcfc7f0d9bb49cbdc545465c Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Wed, 17 Mar 2021 17:31:42 +0000 Subject: [PATCH 104/412] client: + improve catalog nbook #1716 --- .../user-training/pyopencga_catalog.ipynb | 556 +++++++++++++++--- 1 file changed, 478 insertions(+), 78 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index c128e3579a9..583c007b206 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 90, "metadata": {}, "outputs": [ { @@ -95,16 +95,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client.\n", + "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. \n", "\n", - "These methods implement perform calls to query different data models in OpenCGA. \n", - "\n", - "Over the user cases addressed in this notebooks we will be performing queries to the **users, projects, studies, samples, individuals and cohorts** data models." + "Over the user case addressed in this notebook we will be performing queries to the **users, projects, studies, samples, individuals and cohorts**
*OpenCGA* data models." ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 91, "metadata": {}, "outputs": [], "source": [ @@ -135,15 +133,17 @@ "metadata": {}, "source": [ "## 2.1 Exploring User Account: Permissios, Projects and Studies\n", + "\n", "In this use case we cover retrieving information for our user.\n", - "In OpenCGA, all the user permissions are established at a study level. One project may contain different studies.\n", "\n", - "#### Full Qualified Name (fqn) of Studies \n", + "**In OpenCGA, all the user permissions are established at a study level**. One project contains **at least** one study, although it may contain several.\n", "\n", - "CAMBIAR\n", + "**Full Qualified Name (fqn) of Studies**\n", + "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study].\n", "\n", - "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study]\n", - "We can access the studies for the specific project *family*:\n" + "We cannot be sure if there might be **other studies** with the same name contained in **other projects**.
(E.g: the study *platinium* might be defined in two different projects: *GRch37_project and GRch38_project*)\n", + "\n", + "Because of that that, it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies.\n" ] }, { @@ -162,7 +162,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 92, "metadata": {}, "outputs": [ { @@ -200,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 93, "metadata": {}, "outputs": [ { @@ -229,22 +229,28 @@ "- Project: **family**\n", "- Project: **population**\n", "\n", - "The **fqn** shows that those projects are owned by the user *demo*, who shares the permission to see them with us.\n", - "\n", - "**Studies:** Now, let's see which studies do we have access within the **family** project." + "The **fqn** `demo@population` and `demo@family` show that those projects are owned by the user *demo*, who have shared the permission to see them with us.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Studies\n", + "Now, let's see which studies do we have access within the **family** project." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 94, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "project:family\t study:platinum\n", - "project:family\t study:corpasome\n" + "project:family\t study_id:platinum\t study_fqn:demo@family:platinum \n", + "project:family\t study_id:corpasome\t study_fqn:demo@family:corpasome \n" ] } ], @@ -263,9 +269,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Our user (*demo*) has access to 2 different studies within the *family* project:\n", - "\n", - "Project: **family**\n", + "Our user (*demouser*) has access to 2 different studies within the **family** project:\n", "- study: **platinum**\n", "- study: **corpasome**" ] @@ -281,12 +285,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "No we can assume that we want to check to which groups belong and permisions asigned for platinium" + "Now we can assume that we want to check to which groups our user belongs to and which permisions pur user has been granted for the study (remember that all the permissions are established at the study level).
\n", + "The first step might be check which groups exist within the study **platinum**:" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 95, "metadata": {}, "outputs": [ { @@ -295,45 +300,93 @@ "text": [ "group_id: @members\n", "group_id: @admins\n", - "group_id: @opencb-team\n" + "group_id: @opencb-team\n", + "\n", + "There are 3 groups in the study demo@family:platinum: ['@members', '@admins', '@opencb-team']\n" ] } ], "source": [ + "# Define the fqn of the study\n", + "\n", "study_fqn = 'demo@family:platinum'\n", + "\n", + "\n", + "# Query to the study web service\n", + "\n", "groups = study_client.groups(study_fqn)\n", "\n", + "study_groups = [] # Define an empty list for the groups\n", + "\n", "## This will give us the whole list of groups existing in the study\n", + "\n", "for group in groups.result_iterator():\n", - " print(\"group_id: {}\".format(group['id']))\n" + " study_groups.append(group['id'])\n", + " print(\"group_id: {}\".format(group['id']))\n", + " \n", + "print('\\nThere are 3 groups in the study {}: {}'.format(study_fqn, study_groups))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The study **platinum** has 3 different groups of users defined: **members, admins and opencb-team**\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we want to check in which groups is our user *demouser* included:" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 96, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "group_id: @members\n" + "group_id: @members\n", + "\n", + "Our user demouser belongs to group/s: ['@members']\n" ] } ], "source": [ + "# Define an empty list to \n", + "\n", "user_groups = []\n", "\n", "## This will give us only the groups our user belongs to\n", "for group in groups.result_iterator():\n", " if 'demouser' in group['userIds']:\n", " user_groups.append(group['id'])\n", - " print(\"group_id: {}\".format(group['id']))" + " print(\"group_id: {}\".format(group['id']))\n", + " \n", + "print('\\nOur user {} belongs to group/s: {}'.format(user, user_groups))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Although there are 3 groups defined for the study, our user (*demouser*) only belongs to group **members**, which is one of the default groups in *OpenCGA*." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now must be wondering which specific permissions our user has. We can check this using the `client.acl()` method in the next call (**acl** = access control list):" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 100, "metadata": { "pycharm": { "name": "#%%\n" @@ -344,22 +397,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "['VIEW_PANELS', 'VIEW_FAMILIES', 'VIEW_JOBS', 'VIEW_FILES', 'VIEW_FILE_ANNOTATIONS', 'VIEW_COHORTS', 'VIEW_SAMPLE_VARIANTS', 'VIEW_FAMILY_ANNOTATIONS', 'VIEW_FILE_HEADER', 'VIEW_FILE_CONTENT', 'VIEW_AGGREGATED_VARIANTS', 'VIEW_INDIVIDUALS', 'VIEW_COHORT_ANNOTATIONS', 'VIEW_SAMPLES', 'VIEW_SAMPLE_ANNOTATIONS', 'VIEW_CLINICAL_ANALYSIS', 'EXECUTE_JOBS', 'VIEW_INDIVIDUAL_ANNOTATIONS']\n" + "The user demouser has the following permissions:\n", + " ['VIEW_PANELS', 'VIEW_FAMILIES', 'VIEW_JOBS', 'VIEW_FILES', 'VIEW_FILE_ANNOTATIONS', 'VIEW_COHORTS', 'VIEW_SAMPLE_VARIANTS', 'VIEW_FAMILY_ANNOTATIONS', 'VIEW_FILE_HEADER', 'VIEW_FILE_CONTENT', 'VIEW_AGGREGATED_VARIANTS', 'VIEW_INDIVIDUALS', 'VIEW_COHORT_ANNOTATIONS', 'VIEW_SAMPLES', 'VIEW_SAMPLE_ANNOTATIONS', 'VIEW_CLINICAL_ANALYSIS', 'EXECUTE_JOBS', 'VIEW_INDIVIDUAL_ANNOTATIONS']\n" ] } ], "source": [ - "## Look the permission our user has\n", - "# Permissions granted directly to user: acl = access control list (permisos)\n", + "# Permissions granted directly to user:\n", + "\n", "acls = study_client.acl(study_fqn, member='demouser')\n", "\n", - "for acl in acls.result_iterator():\n", - " print(acl['demouser'])\n" + "print('The user demouser has the following permissions:\\n', acl['demouser'])\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We've stated before that the group **members** is one of the default groups in *OpenCGA* (along with the group **admins**). We can also check the permissions granted to this group directly:" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 101, "metadata": {}, "outputs": [ { @@ -385,21 +446,41 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.2 Exploring Catalog Metadata" + "Intuitively, the group **members** is the basic group and has any default permissions. On the other hand, users in the group **admins** have permission to see and edit the study information.\n", + "\n", + "For more information about user and group permissions, check the official *OpenCGA* documentation: **[Catalog and Security - Users and Permissions](http://docs.opencb.org/display/opencga/Sharing+and+Permissions)**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2 Exploring Catalog Clinical Metadata" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A genomic data analysis platform need to keep track of different resources such as:\n", + "\n", + "- Clinical Data: information about individuals, samples from those individuals etc.\n", + "- Files Metadata: information about files contained in the platform, such as VCFs and BAMs.\n", + "\n", + "*OpenCGA Catalog* is the component that assumes this role by storing this kind of information\n", + "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Par\n", - "Brief description
\n", - "Explain Aggeation Stats briefly: " + "### Aggregation stats" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 103, "metadata": { "pycharm": { "name": "#%%\n" @@ -1670,9 +1751,7 @@ ], "source": [ "family_stats = project_client.aggregation_stats(project_id)\n", - "pprint(family_stats.get_result(0)) #quiero imprimir el primer resultado\n", - "\n", - "####AGGREGATIONS NOT WORKING NOW- Doubkcheck later with Genentech Installation\n" + "pprint(family_stats.get_result(0)) #quiero imprimir el primer resultado\n" ] }, { @@ -1680,7 +1759,7 @@ "metadata": {}, "source": [ "### 2.2.1 Exploring Samples and Individuals\n", - "Ideas: contar smaples, contar indovdiasl, listar fiels de una sample..." + "Ideas: contar smaples, contar indovdiasl, mirar cuantos individuals tienen samples " ] }, { @@ -1689,23 +1768,20 @@ "source": [ "\n", "Once we know the studies our user 'demo' has access to, we can explore the samples that a project contains.
\n", - "To fetch samples you need to use the sample client built in pyopencga.
\n", - "\n", - "Remember that it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies, since we cannot be sure if there might be **other studies** with the same name contained in **other projects**.
(E.g: the study *platinium* might be defined in two different projects: *GRch37_project and GRch38_project*)\n", - "\n", + "To fetch samples you need to use the sample client built in pyopencga.Remember that it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies.
\n", "Let's imagine we want to know how many samples are in the study **platinum**, and list information about the first two samples: " ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 104, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#Time: 92\n", + "#Time: 53\n", "#Num matches: 17\n", "#Num results: 2\n", "#Num inserted: 0\n", @@ -1726,7 +1802,7 @@ "## Call to the sample web endpoint\n", "\n", "samples = sample_client.search(study=study_id, count=True, limit = 2) ## other possible params, count=False, id='NA12880,NA12881'\n", - "samples.print_results()" + "samples.print_results()\n" ] }, { @@ -1735,19 +1811,54 @@ "source": [ "We can see that project *platinium* has **17 samples** (given by #Num matches). The count is returned because we have set the parameter `count=True`.\n", "\n", - "However, only information about **2 samples** is returned, because we have set the parameter `limit=2`." + "However, only information about **2 samples** is returned, because we have set the parameter `limit=2`. We can get all the samples ids by:" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 138, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#Time: 215\n", + "There are 17 samples with ids:\n", + " ['NA12877', 'NA12878', 'NA12879', 'NA12880', 'NA12881', 'NA12882', 'NA12883', 'NA12884', 'NA12885', 'NA12886', 'NA12887', 'NA12888', 'NA12889', 'NA12890', 'NA12891', 'NA12892', 'NA12893']\n", + "\n" + ] + } + ], + "source": [ + "sample_ids = [] # Define an empty list\n", + "\n", + "# Define a new sample query without limit\n", + "\n", + "samples = sample_client.search(study=study_id, count=True) \n", + "\n", + "for sample in samples.result_iterator():\n", + " sample_ids.append(sample['id'])\n", + "\n", + "print('There are {} samples with ids:\\n {}\\n'.format(len(sample_ids), sample_ids))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we can repite the same process for check the number of individuals in the **family** study. The difference is that now we will be making a call to the **individual** web service:" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 69\n", "#Num matches: 17\n", "#Num results: 2\n", "#Num inserted: 0\n", @@ -1760,10 +1871,73 @@ } ], "source": [ - "## We can do the same for individuals\n", + "## Call to the individual web service\n", + "\n", + "individuals = individual_client.search(study=study_id, count=True, limit=2) ## other possible params, count=False, id='NA12880,NA12881'\n", + "individuals.print_results('')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the study **family** there are the same number of individuals and samples (17 matches). It is likely that there is a sample per individual.\n", + "\n", + "We might be interested in knowing when the individuals were added to *OpenCGA*:" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are 17 individuals with ids:\n", + " ['NA12877', 'NA12878', 'NA12879', 'NA12880', 'NA12881', 'NA12882', 'NA12883', 'NA12884', 'NA12885', 'NA12886', 'NA12887', 'NA12888', 'NA12889', 'NA12890', 'NA12891', 'NA12892', 'NA12893']\n", + "\n", + "The individual NA12877 was created on 20200625131812\n", + "The individual NA12878 was created on 20200625131813\n", + "The individual NA12879 was created on 20200625131813\n", + "The individual NA12880 was created on 20200625131813\n", + "The individual NA12881 was created on 20200625131814\n", + "The individual NA12882 was created on 20200625131814\n", + "The individual NA12883 was created on 20200625131814\n", + "The individual NA12884 was created on 20200625131814\n", + "The individual NA12885 was created on 20200625131815\n", + "The individual NA12886 was created on 20200625131815\n", + "The individual NA12887 was created on 20200625131815\n", + "The individual NA12888 was created on 20200625131815\n", + "The individual NA12889 was created on 20200625131815\n", + "The individual NA12890 was created on 20200625131816\n", + "The individual NA12891 was created on 20200625131816\n", + "The individual NA12892 was created on 20200625131816\n", + "The individual NA12893 was created on 20200625131816\n" + ] + } + ], + "source": [ + "## New call to the individual web service\n", + "\n", + "individuals = individual_client.search(study=study_id) ## other possible params, count=False, id='NA12880,NA12881'\n", "\n", - "individuals = individual_client.search(study=study_id, count=True, limit = 2) ## other possible params, count=False, id='NA12880,NA12881'\n", - "individuals.print_results()" + "\n", + "## Print the date each individual was created \n", + "\n", + "date_individuals = {} # Define an empty dictionary\n", + "\n", + "for individual in individuals.result_iterator():\n", + " date_individuals[individual['id']] = individual['creationDate']\n", + "\n", + "individual_ids = list(date_individuals.keys())\n", + "\n", + "print('There are {} individuals with ids:\\n {}\\n'.format(len(individual_ids), individual_ids))\n", + "\n", + "for ind in date_individuals:\n", + " print('The individual {} was created on {}'.format(ind, date_individuals[ind]))\n", + " " ] }, { @@ -1773,23 +1947,211 @@ "### 2.2.2 Exploring Files" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can start by exploring the number of files in the study, and retrieveing information about one file as an example of which kind of data is stored in the **file** data model of *OpenCGA*." + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 134, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 87\n", + "#Num matches: 3766\n", + "#Num results: 3\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\n", + "data:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz\n", + "data:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz\n", + "data:platinum-genomes-vcf-NA12879_S1.genome.vcf.gz\n", + "{'annotationSets': [],\n", + " 'bioformat': 'VARIANT',\n", + " 'creationDate': '20200625131819',\n", + " 'experiment': {},\n", + " 'external': True,\n", + " 'format': 'VCF',\n", + " 'id': 'data:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz',\n", + " 'internal': {'index': {'attributes': {},\n", + " 'creationDate': '',\n", + " 'jobId': -1,\n", + " 'release': 1,\n", + " 'status': {'date': '20200625135127',\n", + " 'description': 'Job finished. File index '\n", + " 'ready',\n", + " 'name': 'READY'},\n", + " 'userId': ''},\n", + " 'sampleMap': {},\n", + " 'status': {'date': '20200625131819',\n", + " 'description': '',\n", + " 'name': 'READY'}},\n", + " 'jobId': '',\n", + " 'modificationDate': '20200625135127',\n", + " 'name': 'platinum-genomes-vcf-NA12878_S1.genome.vcf.gz',\n", + " 'path': 'data/platinum-genomes-vcf-NA12878_S1.genome.vcf.gz',\n", + " 'relatedFiles': [],\n", + " 'release': 1,\n", + " 'sampleIds': ['NA12878'],\n", + " 'size': 883195909,\n", + " 'software': {},\n", + " 'stats': {'variantFileStats': {'biotypeCount': {},\n", + " 'chromosomeCount': {'1': 4098314,\n", + " '10': 2420434,\n", + " '11': 2334555,\n", + " '12': 2300709,\n", + " '13': 1661346,\n", + " '14': 1581664,\n", + " '15': 1549610,\n", + " '16': 1670624,\n", + " '17': 1564492,\n", + " '18': 1311874,\n", + " '19': 1290977,\n", + " '2': 4177240,\n", + " '20': 1106113,\n", + " '21': 725803,\n", + " '22': 798852,\n", + " '3': 3260109,\n", + " '4': 3277571,\n", + " '5': 3012814,\n", + " '6': 2892863,\n", + " '7': 2918797,\n", + " '8': 2481839,\n", + " '9': 2369550,\n", + " 'MT': 196,\n", + " 'X': 2415004,\n", + " 'Y': 209562},\n", + " 'chromosomeDensity': {'1': 0.016442543,\n", + " '10': 0.017858401,\n", + " '11': 0.017292166,\n", + " '12': 0.017188467,\n", + " '13': 0.014425178,\n", + " '14': 0.0147337755,\n", + " '15': 0.015113518,\n", + " '16': 0.018489609,\n", + " '17': 0.01926828,\n", + " '18': 0.016802257,\n", + " '19': 0.021833235,\n", + " '2': 0.017176196,\n", + " '20': 0.01755024,\n", + " '21': 0.015080087,\n", + " '22': 0.0155707775,\n", + " '3': 0.016463332,\n", + " '4': 0.01714621,\n", + " '5': 0.016653178,\n", + " '6': 0.01690595,\n", + " '7': 0.018341219,\n", + " '8': 0.01695662,\n", + " '9': 0.01677992,\n", + " 'MT': 0.011827892,\n", + " 'X': 0.015553522,\n", + " 'Y': 0.0035295503},\n", + " 'consequenceTypeCount': {},\n", + " 'filesCount': 1,\n", + " 'filterCount': {'.': 405,\n", + " 'IndelConflict': 14618,\n", + " 'LowGQX': 3838672,\n", + " 'LowMQ': 2841913,\n", + " 'LowQD': 738644,\n", + " 'MaxDepth': 396883,\n", + " 'PASS': 44825259,\n", + " 'SiteConflict': 34044,\n", + " 'TruthSensitivityTranche99.00to99.90': 759316,\n", + " 'TruthSensitivityTranche99.90to100.00': 1014080},\n", + " 'qualityAvg': 825.26953,\n", + " 'qualityStdDev': 827.1807,\n", + " 'sampleCount': 1,\n", + " 'tiTvRatio': 1.6145304,\n", + " 'typeCount': {'DELETION': 2,\n", + " 'INDEL': 699379,\n", + " 'NO_VARIATION': 45575269,\n", + " 'SNV': 5156262},\n", + " 'variantCount': 51430912}},\n", + " 'status': {'date': '', 'description': '', 'name': ''},\n", + " 'tags': [],\n", + " 'type': 'FILE',\n", + " 'uri': 'file:///mnt/resources/datasets/platinum/data/platinum-genomes-vcf-NA12878_S1.genome.vcf.gz',\n", + " 'uuid': 'eba10b27-0172-0003-0001-cf81e3a6b4fa'}\n" + ] + } + ], + "source": [ + "## Call to the file web service\n", + "\n", + "files = file_client.search(study=study_id, count=True, type='FILE', limit=3, exclude='attributes') ## other possible params, count=False, id='NA12880,NA12881'\n", + "files.print_results('id')\n", + "\n", + "pprint(files.get_result(1)) # Print information for the first file" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, there are 3.766 files in the study.
There is plenty of useful information contained in the file data model like the file format, the stats, size of the file. If we want to look for more concrete information about one specific file:" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The study demo@family:platinum contains a VCF file with id: data:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz,\n", + "created on: 20200625131819\n" + ] + } + ], + "source": [ + "my_vcf = files.get_result(1)\n", + "\n", + "print('The study {} contains a {} file with id: {},\\ncreated on: {}'.format(study_fqn, my_vcf['format'], my_vcf['id'], my_vcf['creationDate']))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we might be interested in know the number of files for a specific sample:" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The sample NA12877 has file/s: ['data:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz']\n" + ] + } + ], "source": [ + "# Select a sample id\n", + "\n", + "sample_of_interest = sample_ids[0]\n", + "\n", "## Listar los files de una sample CONCRETA\n", - "sample = oc.samples.info(study=study_id, limit=1)## other possible params, count=False, id='NA12880,NA12881'\n", + "sample = sample_client.info(study=study_id, samples= sample_of_interest)## other possible params, count=False, id='NA12880,NA12881'\n", "\n", - "sample.get_results(0)['fileIds']\n", + "sample_files = sample.get_result(0)['fileIds']\n", "\n", - "##El campo que necesito es file_ids\n", + "print('The sample {} has file/s: {}'.format(sample_of_interest, sample_files))\n", "\n", - "sample_concreta = sample.get_results(0)['id']\n", "\n", - "## Listado completo de files con todos los metadatos \n", - "oc.files.search(study=study_id, sampleIds=sample_concreta)\n" + "\n" ] }, { @@ -1800,28 +2162,66 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "## Cohortes tienen un listado de samples agrupadas con unas caracteristicas concretas \n", - "\n" + "One powerful feature of *OpenCGA* is the possibility of define **cohorts** that include individuals with common traits of interest, like a phenotype, nationality etc.
\n", + "The **cohorts** are defined at the study level. *OpenCGA* creates a default cohort *ALL*, which includes all the individuals of the study.\n", + "\n", + " We can explore which cohorts are defined in the study **family** by:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 153, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 42\n", + "#Num matches: 1\n", + "#Num results: 1\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\n", + "ALL\n", + "{'annotationSets': [],\n", + " 'attributes': {},\n", + " 'creationDate': '20200625131829',\n", + " 'description': 'Default cohort with almost all indexed samples',\n", + " 'id': 'ALL',\n", + " 'internal': {'status': {'date': '20200702090536',\n", + " 'description': '',\n", + " 'name': 'READY'}},\n", + " 'modificationDate': '20200702090536',\n", + " 'numSamples': 17,\n", + " 'release': 1,\n", + " 'status': {'date': '', 'description': '', 'name': ''},\n", + " 'type': 'COLLECTION',\n", + " 'uuid': 'eba13322-0172-0005-0001-1de37fca9efe'}\n" + ] + } + ], + "source": [ + "## Call to the file web service\n", + "\n", + "cohorts = cohort_client.search(study=study_id, count=True, limit=2, exclude='samples') ## other possible params, count=False, id='NA12880,NA12881'\n", + "cohorts.print_results('id')\n", + "\n", + "pprint(cohorts.get_result(0)) # Print information for the first file" + ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "For the study **family** there is only 1 cohort: the default cohort *ALL*.\n", + "\n", + "As we can see in the description attribute of the cohort data model, *ALL* is the default cohort with almost all indexed samples." + ] }, { "cell_type": "markdown", From dc6fa3a3a63096aa1da23b26624bd8299beb8fc8 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Wed, 17 Mar 2021 17:49:37 +0000 Subject: [PATCH 105/412] client: minor change --- .../user-training/pyopencga_catalog.ipynb | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 583c007b206..8532d13a9f0 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -138,7 +138,7 @@ "\n", "**In OpenCGA, all the user permissions are established at a study level**. One project contains **at least** one study, although it may contain several.\n", "\n", - "**Full Qualified Name (fqn) of Studies**\n", + "#### Full Qualified Name (fqn) of Studies\n", "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study].\n", "\n", "We cannot be sure if there might be **other studies** with the same name contained in **other projects**.
(E.g: the study *platinium* might be defined in two different projects: *GRch37_project and GRch38_project*)\n", @@ -1774,22 +1774,18 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 1, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "#Time: 53\n", - "#Num matches: 17\n", - "#Num results: 2\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tannotationSets\tuuid\tqualityControl\trelease\tversion\tcreationDate\tmodificationDate\tdescription\tsomatic\tphenotypes\tindividualId\tfileIds\tstatus\tinternal\tattributes\n", - "NA12877\t.\teba106b2-0172-0004-0001-0090f938ae01\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131818\t20201117012312\t\tFalse\t.\tNA12877\tdata:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131818', 'description': ''}}\t{}\n", - "NA12878\t.\teba10c89-0172-0004-0001-8c90462fc396\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131819\t20201117015700\t\tFalse\t.\tNA12878\tdata:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131819', 'description': ''}}\t{}\n" + "ename": "NameError", + "evalue": "name 'sample_client' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)", + "\u001B[0;32m\u001B[0m in \u001B[0;36m\u001B[0;34m\u001B[0m\n\u001B[1;32m 6\u001B[0m \u001B[0;31m## Call to the sample web endpoint\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 7\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m----> 8\u001B[0;31m \u001B[0msamples\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0msample_client\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0msearch\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mstudy\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0mstudy_id\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mcount\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;32mTrue\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mlimit\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0;36m2\u001B[0m\u001B[0;34m)\u001B[0m \u001B[0;31m## other possible params, count=False, id='NA12880,NA12881'\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 9\u001B[0m \u001B[0msamples\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mprint_results\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 10\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;31mNameError\u001B[0m: name 'sample_client' is not defined" ] } ], From c09a468edccf1300106b4f75ba426df468718675 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 17 Mar 2021 19:40:05 +0100 Subject: [PATCH 106/412] storage: parse father and mother id, #1693 --- .../opencb/opencga/storage/core/rga/IndividualRgaConverter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index 4a21f99cf0a..45d15c00bd0 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -111,6 +111,8 @@ public static void extractKnockoutByIndividualMap(RgaDataModel rgaDataModel, Set KnockoutByIndividual knockoutByIndividual = new KnockoutByIndividual(); knockoutByIndividual.setId(rgaDataModel.getIndividualId()); knockoutByIndividual.setSampleId(rgaDataModel.getSampleId()); + knockoutByIndividual.setFatherId(rgaDataModel.getFatherId()); + knockoutByIndividual.setMotherId(rgaDataModel.getMotherId()); knockoutByIndividual.setSex(rgaDataModel.getSex() != null ? IndividualProperty.Sex.valueOf(rgaDataModel.getSex()) : null); if (rgaDataModel.getPhenotypeJson() != null) { List phenotypes = new ArrayList<>(rgaDataModel.getPhenotypeJson().size()); From 5c8a0e355d806aa67e728090ad64bbfe217a56fe Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 18 Mar 2021 10:00:58 +0000 Subject: [PATCH 107/412] client: + improvements #1716 --- .../user-training/pyopencga_catalog.ipynb | 79 +++++++++++-------- 1 file changed, 45 insertions(+), 34 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 8532d13a9f0..48d8124ab31 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -8,7 +8,7 @@ "\n", "------\n", "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", - "- https://ws.opencb.org/opencga-prod/webservices/ ### THIS DOESN'T WORK\n", + "- https://ws.opencb.org/opencga-prod/webservices/ \n", "\n", "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing\n", @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -102,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -139,11 +139,12 @@ "**In OpenCGA, all the user permissions are established at a study level**. One project contains **at least** one study, although it may contain several.\n", "\n", "#### Full Qualified Name (fqn) of Studies\n", - "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format [owner]@[project]:[study].\n", + "It is also very important to understand that in OpenCGA, the projects and studies have a full qualified name (**fqn**) with the format:
\n", + "`[[owner]@[project]]:[study]`\n", "\n", "We cannot be sure if there might be **other studies** with the same name contained in **other projects**.
(E.g: the study *platinium* might be defined in two different projects: *GRch37_project and GRch38_project*)\n", "\n", - "Because of that that, it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies.\n" + "Because of that that, it is recomended to use the **fqn** when referencing studies.\n" ] }, { @@ -216,9 +217,10 @@ "source": [ "## Getting user projects\n", "## [NOTE] Client specific methods have the query_id as a key:value (i.e (user=user_id)) \n", + "\n", "projects_info = project_client.search()\n", "\n", - "projects_info.print_results(fields='id,name,organism.scientificName,organism.assembly,fqn', metadata=False)" + "projects_info.print_results(fields='id,name,organism.scientificName,organism.assembly,fqn', metadata=False)\n" ] }, { @@ -318,6 +320,7 @@ "\n", "study_groups = [] # Define an empty list for the groups\n", "\n", + "\n", "## This will give us the whole list of groups existing in the study\n", "\n", "for group in groups.result_iterator():\n", @@ -357,11 +360,10 @@ } ], "source": [ - "# Define an empty list to \n", - "\n", - "user_groups = []\n", + "user_groups = [] # Define an empty list \n", "\n", "## This will give us only the groups our user belongs to\n", + "\n", "for group in groups.result_iterator():\n", " if 'demouser' in group['userIds']:\n", " user_groups.append(group['id'])\n", @@ -439,7 +441,8 @@ " print('group_id: {}\\t group_acls: []'.format(group))\n", " else:\n", " for acl in acls.result_iterator():\n", - " print('group_id: {}\\t group_acls: {}'.format(group, acl[group]))" + " print('group_id: {}\\t group_acls: {}'.format(group, acl[group]))\n", + " " ] }, { @@ -475,7 +478,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Aggregation stats" + "### Aggregation stats: Requires improvement!" ] }, { @@ -488,8 +491,9 @@ }, "outputs": [], "source": [ - "## En una unica llamada podemos agregar listas de proyectos\n", - "project_client.aggregation_stats('family,proyecto2')" + "## We can aggregate information for many projects in a simple call\n", + "\n", + "project_client.aggregation_stats('family,proyecto2')\n" ] }, { @@ -1750,6 +1754,7 @@ } ], "source": [ + "\n", "family_stats = project_client.aggregation_stats(project_id)\n", "pprint(family_stats.get_result(0)) #quiero imprimir el primer resultado\n" ] @@ -1774,18 +1779,22 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'sample_client' is not defined", - "output_type": "error", - "traceback": [ - "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)", - "\u001B[0;32m\u001B[0m in \u001B[0;36m\u001B[0;34m\u001B[0m\n\u001B[1;32m 6\u001B[0m \u001B[0;31m## Call to the sample web endpoint\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 7\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m----> 8\u001B[0;31m \u001B[0msamples\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0msample_client\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0msearch\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mstudy\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0mstudy_id\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mcount\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;32mTrue\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mlimit\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0;36m2\u001B[0m\u001B[0;34m)\u001B[0m \u001B[0;31m## other possible params, count=False, id='NA12880,NA12881'\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 9\u001B[0m \u001B[0msamples\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mprint_results\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 10\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n", - "\u001B[0;31mNameError\u001B[0m: name 'sample_client' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 45\n", + "#Num matches: 17\n", + "#Num results: 2\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotationSets\tuuid\tqualityControl\trelease\tversion\tcreationDate\tmodificationDate\tdescription\tsomatic\tphenotypes\tindividualId\tfileIds\tstatus\tinternal\tattributes\n", + "NA12877\t.\teba106b2-0172-0004-0001-0090f938ae01\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131818\t20201117012312\t\tFalse\t.\tNA12877\tdata:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131818', 'description': ''}}\t{}\n", + "NA12878\t.\teba10c89-0172-0004-0001-8c90462fc396\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131819\t20201117015700\t\tFalse\t.\tNA12878\tdata:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131819', 'description': ''}}\t{}\n" ] } ], @@ -1828,6 +1837,7 @@ "source": [ "sample_ids = [] # Define an empty list\n", "\n", + "\n", "# Define a new sample query without limit\n", "\n", "samples = sample_client.search(study=study_id, count=True) \n", @@ -1835,7 +1845,7 @@ "for sample in samples.result_iterator():\n", " sample_ids.append(sample['id'])\n", "\n", - "print('There are {} samples with ids:\\n {}\\n'.format(len(sample_ids), sample_ids))" + "print('There are {} samples with ids:\\n {}\\n'.format(len(sample_ids), sample_ids))\n" ] }, { @@ -1870,7 +1880,7 @@ "## Call to the individual web service\n", "\n", "individuals = individual_client.search(study=study_id, count=True, limit=2) ## other possible params, count=False, id='NA12880,NA12881'\n", - "individuals.print_results('')" + "individuals.print_results('')\n" ] }, { @@ -2084,7 +2094,7 @@ "files = file_client.search(study=study_id, count=True, type='FILE', limit=3, exclude='attributes') ## other possible params, count=False, id='NA12880,NA12881'\n", "files.print_results('id')\n", "\n", - "pprint(files.get_result(1)) # Print information for the first file" + "pprint(files.get_result(1)) # Print information for the first file\n" ] }, { @@ -2111,7 +2121,9 @@ "source": [ "my_vcf = files.get_result(1)\n", "\n", - "print('The study {} contains a {} file with id: {},\\ncreated on: {}'.format(study_fqn, my_vcf['format'], my_vcf['id'], my_vcf['creationDate']))" + "print('The study {} contains a {} file with id: {},\\ncreated on: {}'.format(study_fqn, my_vcf['format'], \n", + " my_vcf['id'], my_vcf['creationDate']))\n", + "\n" ] }, { @@ -2139,15 +2151,14 @@ "\n", "sample_of_interest = sample_ids[0]\n", "\n", - "## Listar los files de una sample CONCRETA\n", - "sample = sample_client.info(study=study_id, samples= sample_of_interest)## other possible params, count=False, id='NA12880,NA12881'\n", "\n", - "sample_files = sample.get_result(0)['fileIds']\n", + "## List the files for a concrete sample\n", "\n", - "print('The sample {} has file/s: {}'.format(sample_of_interest, sample_files))\n", + "sample = sample_client.info(study=study_id, samples= sample_of_interest)## other possible params, count=False, id='NA12880,NA12881'\n", "\n", + "sample_files = sample.get_result(0)['fileIds']\n", "\n", - "\n" + "print('The sample {} has file/s: {}'.format(sample_of_interest, sample_files))\n" ] }, { @@ -2207,7 +2218,7 @@ "cohorts = cohort_client.search(study=study_id, count=True, limit=2, exclude='samples') ## other possible params, count=False, id='NA12880,NA12881'\n", "cohorts.print_results('id')\n", "\n", - "pprint(cohorts.get_result(0)) # Print information for the first file" + "pprint(cohorts.get_result(0)) # Print information for the first file\n" ] }, { @@ -2216,7 +2227,7 @@ "source": [ "For the study **family** there is only 1 cohort: the default cohort *ALL*.\n", "\n", - "As we can see in the description attribute of the cohort data model, *ALL* is the default cohort with almost all indexed samples." + "As we can see in the description file of the cohort data model, *ALL* is the default cohort with almost all indexed samples." ] }, { @@ -2256,4 +2267,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} From dc7fc96eb03137c2bae13f60008171fefbb113e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 18 Mar 2021 17:26:43 +0000 Subject: [PATCH 108/412] docker: Allow push docker to other docker registries --- opencga-app/app/cloud/docker/docker-build.py | 31 +++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/opencga-app/app/cloud/docker/docker-build.py b/opencga-app/app/cloud/docker/docker-build.py index 4b5e02a2b5a..7170fef0e21 100755 --- a/opencga-app/app/cloud/docker/docker-build.py +++ b/opencga-app/app/cloud/docker/docker-build.py @@ -32,22 +32,23 @@ def login(loginRequired=False): def build(): print("Building docker images " + str(images)) - for image in images: + for i in images: + image = org + "/opencga-" + i print("*********************************************") - print("Building " + org + "/opencga-" + image + ":" + tag) + print("Building " + image + ":" + tag) print("*********************************************") - if image == "init" or image == "demo": + if i == "init" or i == "demo": command = ("docker build" - + " -t " + org + "/opencga-" + image + ":" + tag - + " -f " + build_folder + "/cloud/docker/opencga-" + image + "/Dockerfile" + + " -t " + image + ":" + tag + + " -f " + build_folder + "/cloud/docker/opencga-" + i + "/Dockerfile" + " --build-arg TAG=" + tag + " --build-arg ORG=" + org + " " + args.docker_build_args + " " + " " + build_folder) else: command = ("docker build" - + " -t " + org + "/opencga-" + image + ":" + tag - + " -f " + build_folder + "/cloud/docker/opencga-" + image + "/Dockerfile" + + " -t " + image + ":" + tag + + " -f " + build_folder + "/cloud/docker/opencga-" + i + "/Dockerfile" + " " + args.docker_build_args + " " + " " + build_folder) run(command) @@ -56,6 +57,9 @@ def tag_latest(image): if "hdp" in tag or "dev" in tag: print("Don't use tag " + tag + " as latest") return + if server: + print("Don't use tag latest in server " + server) + return latest_tag = os.popen(("curl -s https://registry.hub.docker.com/v1/repositories/" + org + "/opencga-" + image + "/tags" + " | jq -r .[].name" @@ -76,10 +80,13 @@ def tag_latest(image): def push(): print("Pushing images to Docker hub") for i in images: + image = org + "/opencga-" + i print("*********************************************") - print("Pushing " + org + "/opencga-" + i + ":" + tag) + print("Pushing " + server + image + ":" + tag) print("*********************************************") - run("docker push " + org + "/opencga-" + i + ":" + tag) + if server: + run("docker tag " + image + ":" + tag + " " + server + image + ":" + tag) + run("docker push " + server + image + ":" + tag) tag_latest(i) def delete(): @@ -113,7 +120,7 @@ def delete(): parser.add_argument('--username', help="Username to login to the docker registry (REQUIRED if deleting from DockerHub)") parser.add_argument('--password', help="Password to login to the docker registry (REQUIRED if deleting from DockerHub)") parser.add_argument('--docker-build-args', help="Additional build arguments to pass to the docker build command. Usage: --docker-build-args='ARGS' e.g: --docker-build-args='--no-cache'", default="") -# parser.add_argument('--server', help="Docker registry server", default="docker.io") +parser.add_argument('--server', help="Docker registry server", default="docker.io") args = parser.parse_args() @@ -164,6 +171,10 @@ def delete(): tag = args.tag org = args.org +if args.server != "docker.io": + server = args.server + "/" +else: + server = "" # get a list with all images if not args.images: From ebf86a3207721968ea96ce8988b83efb3ff77297 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 18 Mar 2021 17:39:22 +0000 Subject: [PATCH 109/412] client-modified: pyopencga_catalog.ipynb #1716 client-improved: pyopencga_variant_query.ipynb --- .../user-training/pyopencga_catalog.ipynb | 2 +- .../pyopencga_variant_query.ipynb | 151 +++++++++++++++++- 2 files changed, 145 insertions(+), 8 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 48d8124ab31..54eef09f467 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -106,7 +106,7 @@ "metadata": {}, "outputs": [], "source": [ - "## Define variables to query different data models though the web services\n", + "## Define variables to query different data models through the web services\n", "\n", "user_client = oc.users\n", "project_client = oc.projects\n", diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 4df27e1d2ce..5c2775a52cf 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -53,7 +53,9 @@ "from pprint import pprint\n", "import json\n", "\n", - "## Configuration parameters\n", + "####################################\n", + "## Configuration parameters #######\n", + "####################################\n", "# OpenCGA host\n", "host = 'https://ws.opencb.org/opencga-prod'\n", "\n", @@ -81,7 +83,34 @@ "# oc.login(user)\n", "\n", "# or you can pass the user and passwd\n", - "oc.login(user, passwd)" + "oc.login(user, passwd)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "## Define variables to query different data models though the web services\n", + "\n", + "variant_client = oc.variants # Variant Client\n", + "\n", + "user_client = oc.users\n", + "project_client = oc.projects\n", + "study_client = oc.studies\n", + "sample_client = oc.samples\n", + "individual_client = oc.individuals\n", + "file_client = oc.files\n", + "cohort_client = oc.cohorts\n", + "\n" ] }, { @@ -100,15 +129,17 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "## Let's use corpasome study\n", "study = 'family:corpasome'\n", "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, gene='BRCA2', limit=1)\n", - "# pprint(variants.get_responses())" + "variants = variant_client.query(study=study, gene='BRCA2', limit=1) #exclude='annotation')\n", + "\n", + "#pprint(variants.get_result(0))\n", + "#variants.print_results('id')" ] }, { @@ -118,6 +149,112 @@ "## 3. Aggegation Files" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Filtering by region/gene**\n", + "Which variants in cohort A are in genomic region B?\n", + "Which variants in cohort A are in genomic region B?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Which variants in RD38 fall on chromosome 15 between 21,242,091 and 23,226,874bp?" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'15:22866621:G:A'\n" + ] + } + ], + "source": [ + "## Let's use corpasome study\n", + "study = 'family:corpasome'\n", + "variant_client = oc.variants\n", + "variant_query1 = variant_client.query(study=study, chromosome='15:21242091-23226874', exclude='annotation')\n", + "\n", + "results = variants.get_result()\n", + "\n", + "for result in results:\n", + " print()\n", + "\n", + "pprint(variants.get_result(7)['id'])\n", + "#variants.print_results('id')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'alternate': 'A',\n", + " 'chromosome': '15',\n", + " 'end': 72070929,\n", + " 'id': '15:72070929:G:A',\n", + " 'length': 1,\n", + " 'names': [],\n", + " 'reference': 'G',\n", + " 'start': 72070929,\n", + " 'strand': '+',\n", + " 'studies': [],\n", + " 'type': 'SNV'}\n" + ] + } + ], + "source": [ + "oc.disease_panels.\n", + "variants = variant_client.query(study=study, chromosome=15, include='id')\n", + "\n", + "pprint(variants.get_result(0))\n", + "#variants.print_results('id')" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'alternate': 'T',\n", + " 'chromosome': '15',\n", + " 'end': 22853997,\n", + " 'id': '15:22853997:C:T',\n", + " 'length': 1,\n", + " 'names': [],\n", + " 'reference': 'C',\n", + " 'start': 22853997,\n", + " 'strand': '+',\n", + " 'studies': [],\n", + " 'type': 'SNV'}\n" + ] + } + ], + "source": [ + "variants = variant_client.query(study=study, region='15:21242091-23226874', include='id')\n", + "\n", + "pprint(variants.get_result(4))\n", + "#variants.print_results('id')" + ] + }, { "cell_type": "code", "execution_count": null, @@ -142,9 +279,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file From bfbb4d57619c0dec008e771d647c763de5617aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 18 Mar 2021 17:51:14 +0000 Subject: [PATCH 110/412] analysis: Allow automatically index knockout analysis results in RGA. --- .../opencga/analysis/tools/OpenCgaTool.java | 3 + .../variant/knockout/KnockoutAnalysis.java | 60 +++++++++++++++++-- .../analysis/variant/VariantAnalysisTest.java | 3 + .../VariantInternalCommandExecutor.java | 5 +- .../options/VariantCommandOptions.java | 9 ++- .../analysis/VariantCommandExecutor.java | 5 +- .../variant/KnockoutAnalysisParams.java | 26 +++++++- 7 files changed, 101 insertions(+), 10 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java index 22fe10df648..7afe81b975d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java @@ -328,6 +328,9 @@ protected final Enums.Resource getToolResource() { } /** + * Method called internally to obtain the list of steps. + * + * Will be executed after calling to the {@link #check()} method. * @return the tool steps */ protected List getSteps() { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index cf89294f394..e44de06802a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -26,6 +26,10 @@ import org.opencb.biodata.models.clinical.interpretation.DiseasePanel; import org.opencb.biodata.models.core.Gene; import org.opencb.biodata.models.core.Transcript; +import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; +import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; +import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.tools.annotations.ToolParams; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.Query; @@ -65,11 +69,15 @@ public class KnockoutAnalysis extends OpenCgaToolScopeStudy { @Override protected List getSteps() { - return Arrays.asList( - "list-genes", - "list-families", - getId(), - "add-metadata-to-output-files"); + List steps = new LinkedList<>(); + steps.add("list-genes"); + steps.add("list-families"); + steps.add(getId()); + steps.add("add-metadata-to-output-files"); + if (analysisParams.isIndex()) { + steps.add("launch-index"); + } + return steps; } @Override @@ -90,10 +98,29 @@ protected void check() throws Exception { String ct = analysisParams.getConsequenceType(); if (StringUtils.isEmpty(ct)) { - ct = VariantQueryUtils.LOF; + ct = VariantQueryUtils.LOF + "," + VariantAnnotationConstants.MISSENSE_VARIANT; } analysisParams.setConsequenceType(String.join(",", VariantQueryUtils.parseConsequenceTypes(ct))); + if (analysisParams.isIndex()) { + if (!VariantAnnotationConstants.PROTEIN_CODING.equals(analysisParams.getBiotype())) { + throw new IllegalArgumentException("Unable to index KnockoutAnalysis result filtering by biotype " + analysisParams.getBiotype()); + } + if (CollectionUtils.isNotEmpty(analysisParams.getGene())) { + throw new IllegalArgumentException("Unable to index KnockoutAnalysis result filtering by any gene"); + } + if (CollectionUtils.isNotEmpty(analysisParams.getPanel())) { + throw new IllegalArgumentException("Unable to index KnockoutAnalysis result filtering by any panel"); + } + if (StringUtils.isNotEmpty(analysisParams.getConsequenceType())) { + Set cts = new HashSet<>(Arrays.asList(analysisParams.getConsequenceType().split(","))); + if (!cts.equals(VariantQueryUtils.LOF_EXTENDED_SET)) { + throw new IllegalArgumentException("Unable to index KnockoutAnalysis result filtering by consequence type : " + cts); + } + } + analysisParams.setSkipGenesFile(true); + } + super.check(); } @@ -337,6 +364,27 @@ protected void run() throws Exception { } } }); + + if (analysisParams.isIndex()) { + step("launch-index", () -> { + String thisJobOutdir = getCatalogManager() + .getJobManager() + .get(getStudyFqn(), getJobId(), new QueryOptions(), getToken()).first().getOutDir() + .getPath(); + if (!thisJobOutdir.endsWith("/")) { + thisJobOutdir += "/"; + } + String individualsOutputFileName = getIndividualsOutputFile().getFileName().toString(); + RgaAnalysisParams rgaAnalysisParams = new RgaAnalysisParams(thisJobOutdir + individualsOutputFileName); + + Job rgaJob = getCatalogManager().getJobManager().submit(getStudyFqn(), RgaAnalysis.ID, Enums.Priority.MEDIUM, + rgaAnalysisParams.toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudyFqn())), null, null, + Collections.singletonList(getJobId()), analysisParams.getIndexJobTags(), getToken()).first(); + addAttribute("rga-index-job", rgaJob.getId()); + addAttribute("rga-index-job-uuid", rgaJob.getUuid()); + logger.info("Run index job : " + rgaJob.getId()); + }); + } } private Path getIndividualsOutputFile() { diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java index 841e1442da4..25803c98427 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java @@ -30,6 +30,9 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; import org.opencb.opencga.core.models.cohort.CohortCreateParams; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.job.Job; +import org.opencb.opencga.core.models.job.JobUpdateParams; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index f2ae494d44d..31d82a3d47e 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -680,7 +680,10 @@ private void knockout() throws Exception { cliOptions.filter, cliOptions.qual, cliOptions.skipGenesFile, - cliOptions.outdir) + cliOptions.outdir, + cliOptions.index, + cliOptions.indexJobTags + ) .toObjectMap(cliOptions.commonOptions.params) .append(ParamConstants.STUDY_PARAM, cliOptions.study); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index 6b8c299359f..aaf47a7e495 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1158,7 +1158,8 @@ public class KnockoutCommandOptions { public String biotype; @Parameter(names = {"--ct", "--consequence-type"}, description = "Consequence type as a list of SequenceOntology terms. " - + "This filter is only applied on protein_coding genes. By default filters by loss of function consequence types.") + + "This filter is only applied on protein_coding genes. " + + "By default filters by loss of function + missense_variant consequence types.") public String consequenceType; @Parameter(names = {"--filter"}, description = VariantQueryParam.FILTER_DESCR) @@ -1169,6 +1170,12 @@ public class KnockoutCommandOptions { @Parameter(names = {"--skip-genes-file"}, description = "Do not generate the results file by gene") public boolean skipGenesFile; + + @Parameter(names = {"--index"}, description = "Index result for Recessive Gene Analysis") + public boolean index; + + @Parameter(names = {"--index-job-tags"}, description = "Job tags for the RGA index job generated.") + public List indexJobTags; } @Parameters(commandNames = SampleEligibilityCommandOptions.SAMPLE_ELIGIBILITY_RUN_COMMAND, commandDescription = SampleEligibilityAnalysis.DESCRIPTION) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 35bb89274c1..1b426e3ef0c 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -315,7 +315,10 @@ private RestResponse knockout() throws ClientException { variantCommandOptions.knockoutCommandOptions.filter, variantCommandOptions.knockoutCommandOptions.qual, variantCommandOptions.knockoutCommandOptions.skipGenesFile, - variantCommandOptions.knockoutCommandOptions.outdir), + variantCommandOptions.knockoutCommandOptions.outdir, + variantCommandOptions.knockoutCommandOptions.index, + variantCommandOptions.knockoutCommandOptions.indexJobTags + ), getParams(variantCommandOptions.knockoutCommandOptions.study) ); } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java index f810739d746..df181fa6026 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java @@ -47,11 +47,15 @@ public class KnockoutAnalysisParams extends ToolParams { private String outdir; + private boolean index; + private List indexJobTags; + public KnockoutAnalysisParams() { } public KnockoutAnalysisParams(List sample, List gene, List panel, String biotype, String consequenceType, - String filter, String qual, boolean skipGenesFile, String outdir) { + String filter, String qual, boolean skipGenesFile, String outdir, + boolean index, List indexJobTags) { this.sample = sample; this.gene = gene; this.panel = panel; @@ -61,6 +65,8 @@ public KnockoutAnalysisParams(List sample, List gene, List getSample() { @@ -143,4 +149,22 @@ public KnockoutAnalysisParams setOutdir(String outdir) { this.outdir = outdir; return this; } + + public boolean isIndex() { + return index; + } + + public KnockoutAnalysisParams setIndex(boolean index) { + this.index = index; + return this; + } + + public List getIndexJobTags() { + return indexJobTags; + } + + public KnockoutAnalysisParams setIndexJobTags(List indexJobTags) { + this.indexJobTags = indexJobTags; + return this; + } } From 69c55aa79e37a1ca31425a8015e8e96a46e4b4ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 19 Mar 2021 09:30:57 +0000 Subject: [PATCH 111/412] analysis: Add dbSNP to knockout analysis results and VariantStats. Ensure DP is filled. --- .../KnockoutLocalAnalysisExecutor.java | 56 ++++++++++--------- .../analysis/variant/VariantAnalysisTest.java | 14 ++--- .../analysis/knockout/KnockoutVariant.java | 43 +++++++++++++- .../storage/core/rga/RgaUtilsTest.java | 5 +- 4 files changed, 80 insertions(+), 38 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index ee5de129df0..7e1a1231cc1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -24,6 +24,7 @@ import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.*; +import org.opencb.biodata.models.variant.stats.VariantStats; import org.opencb.commons.ProgressLogger; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.Query; @@ -65,6 +66,7 @@ framework = ToolExecutor.Framework.LOCAL) public class KnockoutLocalAnalysisExecutor extends KnockoutAnalysisExecutor implements VariantStorageToolExecutor { + private String includeSampleData; private Logger logger = LoggerFactory.getLogger(this.getClass()); private VariantStorageManager variantStorageManager; private boolean allProteinCoding; @@ -79,6 +81,7 @@ protected void run() throws Exception { biotype.remove(PROTEIN_CODING); } allProteinCoding = getProteinCodingGenes().size() == 1 && getProteinCodingGenes().iterator().next().equals(ALL); + includeSampleData = "GT,DP"; String executionMethod = getExecutorParams().getString("executionMethod", "auto"); boolean bySample; @@ -279,7 +282,7 @@ protected void homAltKnockouts(String sample, Predicate geneFilter) throws Exception { query = new Query(query) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT") + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), includeSampleData) .append(VariantQueryParam.GENOTYPE.key(), sample + IS + "1/1"); int numVariants = iterate(query, "Read " + KnockoutVariant.KnockoutType.HOM_ALT + " variants: ", v -> { @@ -290,7 +293,7 @@ protected void homAltKnockouts(String sample, if (validCt(consequenceType, ctFilter, biotypeFilter, geneFilter)) { addGene(v, sampleEntry.getData().get(0), KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), fileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.HOM_ALT, - v.getAnnotation()); + v.getAnnotation(), studyEntry.getStats(StudyEntry.DEFAULT_COHORT)); } } }); @@ -306,7 +309,7 @@ protected void multiAllelicKnockouts(String sample, throws Exception { query = new Query(query) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT") + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), includeSampleData) .append(VariantQueryParam.GENOTYPE.key(), sample + IS + "1/2"); Map variants = new HashMap<>(); @@ -316,12 +319,13 @@ protected void multiAllelicKnockouts(String sample, SampleEntry sampleEntry = studyEntry.getSample(0); FileEntry fileEntry = studyEntry.getFiles().get(sampleEntry.getFileIndex()); KnockoutVariant knockoutVariant = new KnockoutVariant( - variant.toString(), - variant.getType(), + variant, + variant.getAnnotation().getId(), sampleEntry.getData().get(0), KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), + studyEntry.getStats(StudyEntry.DEFAULT_COHORT), KnockoutVariant.KnockoutType.HET_ALT, null, variant.getAnnotation().getPopulationFrequencies(), @@ -343,15 +347,15 @@ protected void multiAllelicKnockouts(String sample, addGene(variant, knockoutVariant.getGenotype(), knockoutVariant.getDepth(), knockoutVariant.getFilter(), knockoutVariant.getQual(), consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.HET_ALT, - knockoutVariant.getPopulationFrequencies(), - knockoutVariant.getClinicalSignificance() + knockoutVariant.getDbSnp(), knockoutVariant.getPopulationFrequencies(), + knockoutVariant.getClinicalSignificance(), knockoutVariant.getStats() ); addGene(secVar, secKnockoutVar.getGenotype(), secKnockoutVar.getDepth(), secKnockoutVar.getFilter(), secKnockoutVar.getQual(), consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.HET_ALT, - secKnockoutVar.getPopulationFrequencies(), - secKnockoutVar.getClinicalSignificance() + secKnockoutVar.getDbSnp(), secKnockoutVar.getPopulationFrequencies(), + secKnockoutVar.getClinicalSignificance(), secKnockoutVar.getStats() ); } } @@ -373,7 +377,7 @@ protected void compHetKnockouts(String sample, Trio family, .append(VariantCatalogQueryUtils.FAMILY_PROBAND.key(), sample) .append(VariantCatalogQueryUtils.FAMILY_SEGREGATION.key(), COMPOUND_HETEROZYGOUS) .append(VariantQueryParam.INCLUDE_SAMPLE.key(), family.toList()) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT"); + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), includeSampleData); int numVariants = iterate(query, "Read " + KnockoutVariant.KnockoutType.COMP_HET + " variants: ", v -> { StudyEntry studyEntry = v.getStudies().get(0); @@ -383,7 +387,7 @@ protected void compHetKnockouts(String sample, Trio family, if (validCt(consequenceType, ctFilter, biotypeFilter, geneFilter)) { addGene(v, sampleEntry.getData().get(0), KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), fileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.COMP_HET, - v.getAnnotation()); + v.getAnnotation(), studyEntry.getStats(StudyEntry.DEFAULT_COHORT)); } } }); @@ -399,7 +403,7 @@ protected void structuralKnockouts(String sample, Query query = new Query(baseQuery) .append(VariantQueryParam.SAMPLE.key(), sample) .append(VariantQueryParam.TYPE.key(), VariantType.DELETION) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT"); + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), includeSampleData); // .append(VariantQueryParam.ANNOT_CONSEQUENCE_TYPE.key(), LOF + "," + VariantAnnotationUtils.FEATURE_TRUNCATION); // Set cts = new HashSet<>(LOF_SET); // cts.add(VariantAnnotationUtils.FEATURE_TRUNCATION); @@ -434,12 +438,12 @@ protected void structuralKnockouts(String sample, sampleEntry.getData().get(0), KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), fileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.DELETION_OVERLAP, - variant.getAnnotation()); + variant.getAnnotation(), studyEntry.getStats(StudyEntry.DEFAULT_COHORT)); addGene(svVariant, svSample.getData().get(0), KnockoutVariant.getDepth(svStudy, svFileEntry, svSample), svFileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.DELETION_OVERLAP, - svAnnotation); + svAnnotation, studyEntry.getStats(StudyEntry.DEFAULT_COHORT)); } } } @@ -455,7 +459,7 @@ protected void run() throws Exception { Query baseQuery = new Query() .append(VariantQueryParam.STUDY.key(), getStudy()) .append(VariantQueryParam.INCLUDE_SAMPLE.key(), getSamples()) - .append(VariantQueryParam.INCLUDE_GENOTYPE.key(), true); + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), includeSampleData); for (String gene : getProteinCodingGenes()) { knockoutGene(new Query(baseQuery) @@ -589,7 +593,7 @@ private void compHetKnockout(Query baseQuery, KnockoutByGene knockoutByGene, Str .append(VariantQueryParam.GENE.key(), knockoutByGene.getName()) .append(VariantQueryParam.INCLUDE_SAMPLE.key(), trio.toList()) .append(VariantCatalogQueryUtils.FAMILY.key(), trio.getId()) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT") + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), includeSampleData) .append(VariantQueryParam.INCLUDE_FILE.key(), null) // .append(VariantCatalogQueryUtils.FAMILY_DISORDER.key(), getDisorder()) .append(VariantCatalogQueryUtils.FAMILY_PROBAND.key(), sampleId) @@ -619,9 +623,8 @@ private void compHetKnockout(Query baseQuery, KnockoutByGene knockoutByGene, Str private void multiAllelicKnockout(Query baseQuery, KnockoutByGene knockout, String sampleId, Predicate ctFilter, Predicate biotypeFilter) throws Exception { Query query = new Query(baseQuery) - .append(VariantQueryParam.INCLUDE_GENOTYPE.key(), true) .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleId) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT") + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), includeSampleData) .append(VariantQueryParam.INCLUDE_FILE.key(), null) .append(VariantQueryParam.GENOTYPE.key(), sampleId + IS + "1/2"); @@ -660,11 +663,12 @@ private void multiAllelicKnockout(Query baseQuery, KnockoutByGene knockout, Stri KnockoutVariant secKnockoutVar = variants.get(secVar.toString()); knockoutTranscript.addVariant(new KnockoutVariant( secKnockoutVar.getId(), - secKnockoutVar.getType(), + secKnockoutVar.getDbSnp(), secKnockoutVar.getGenotype(), secKnockoutVar.getDepth(), secKnockoutVar.getFilter(), secKnockoutVar.getQual(), + secKnockoutVar.getStats(), KnockoutVariant.KnockoutType.HET_ALT, ct.getSequenceOntologyTerms(), variant.getAnnotation().getPopulationFrequencies(), @@ -681,7 +685,7 @@ protected void structuralKnockouts(Query baseQuery, KnockoutByGene knockout, Str Query query = new Query(baseQuery) .append(VariantQueryParam.SAMPLE.key(), sampleId) .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleId) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT") + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), includeSampleData) .append(VariantQueryParam.TYPE.key(), VariantType.DELETION); KnockoutByGene.KnockoutIndividual knockoutIndividual = knockout.getIndividualBySampleId(sampleId); @@ -701,7 +705,7 @@ protected void structuralKnockouts(Query baseQuery, KnockoutByGene knockout, Str Query thisSvQuery = new Query(baseQuery) .append(VariantQueryParam.SAMPLE.key(), sampleId) .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleId) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT") + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), includeSampleData) .append(VariantQueryParam.REGION.key(), new Region(svVariant.getChromosome(), svVariant.getStart(), svVariant.getEnd())); iterate(thisSvQuery, variant -> { @@ -804,14 +808,16 @@ private int iterate(Query query, QueryOptions queryOptions, String description, private void addGene(Variant variant, String gt, Integer depth, FileEntry fileEntry, ConsequenceType consequenceType, Map knockoutGenes, - KnockoutVariant.KnockoutType knockoutType, VariantAnnotation variantAnnotation) { + KnockoutVariant.KnockoutType knockoutType, VariantAnnotation variantAnnotation, VariantStats stats) { addGene(variant, gt, depth, fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), - consequenceType, knockoutGenes, knockoutType, variantAnnotation.getPopulationFrequencies(), KnockoutVariant.getClinicalSignificance(variantAnnotation)); + consequenceType, knockoutGenes, knockoutType, variantAnnotation.getId(), variantAnnotation.getPopulationFrequencies(), KnockoutVariant.getClinicalSignificance(variantAnnotation), stats); } private void addGene(Variant variant, String gt, Integer depth, String filter, String qual, ConsequenceType consequenceType, Map knockoutGenes, - KnockoutVariant.KnockoutType knockoutType, List populationFrequencies, List clinicalSignificance) { + KnockoutVariant.KnockoutType knockoutType, + String dbSnp, List populationFrequencies, + List clinicalSignificance, VariantStats stats) { KnockoutGene gene = knockoutGenes.computeIfAbsent(consequenceType.getGeneName(), KnockoutGene::new); gene.setId(consequenceType.getEnsemblGeneId()); gene.setBiotype(consequenceType.getBiotype()); @@ -820,7 +826,7 @@ private void addGene(Variant variant, String gt, Integer depth, String filter, S KnockoutTranscript t = gene.getTranscript(consequenceType.getEnsemblTranscriptId()); t.setBiotype(consequenceType.getBiotype()); t.setStrand(consequenceType.getStrand()); - t.addVariant(new KnockoutVariant(variant.toString(), variant.getType(), gt, depth, filter, qual, knockoutType, + t.addVariant(new KnockoutVariant(variant, dbSnp, gt, depth, filter, qual, stats, knockoutType, consequenceType.getSequenceOntologyTerms(), populationFrequencies, clinicalSignificance)); } } diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java index 25803c98427..14374b4c0e5 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java @@ -19,7 +19,10 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.mutable.MutableInt; import org.hamcrest.CoreMatchers; -import org.junit.*; +import org.junit.AfterClass; +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.opencb.biodata.models.clinical.Disorder; @@ -29,11 +32,6 @@ import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; -import org.opencb.opencga.core.models.cohort.CohortCreateParams; -import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.core.models.job.JobUpdateParams; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -53,7 +51,9 @@ import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.cohort.Cohort; +import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.core.models.cohort.CohortUpdateParams; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.family.Family; @@ -66,11 +66,11 @@ import org.opencb.opencga.core.tools.result.ExecutionResult; import org.opencb.opencga.core.tools.result.ExecutionResultManager; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.VariantScoreMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageEngine; import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageTest; import org.opencb.opencga.storage.hadoop.variant.VariantHbaseTestUtils; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java index 34cfa5425e3..35e5616ab17 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java @@ -21,12 +21,14 @@ import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.*; +import org.opencb.biodata.models.variant.stats.VariantStats; import java.util.*; public class KnockoutVariant { private String id; + private String dbSnp; private String chromosome; private int start; private int end; @@ -38,6 +40,7 @@ public class KnockoutVariant { private Integer depth; private String filter; private String qual; + private VariantStats stats; private KnockoutType knockoutType; private List populationFrequencies; private List sequenceOntologyTerms; @@ -56,6 +59,7 @@ public KnockoutVariant() { public KnockoutVariant(Variant variant, StudyEntry study, FileEntry file, SampleEntry sample, VariantAnnotation annotation, ConsequenceType ct, KnockoutType knockoutType) { this.id = variant.toString(); + this.dbSnp = annotation.getId(); this.chromosome = variant.getChromosome(); this.start = variant.getStart(); this.end = variant.getEnd(); @@ -67,21 +71,36 @@ public KnockoutVariant(Variant variant, StudyEntry study, FileEntry file, Sample this.depth = getDepth(study, file, sample); this.filter = file.getData().get(StudyEntry.FILTER); this.qual = file.getData().get(StudyEntry.QUAL); + this.stats = study.getStats(StudyEntry.DEFAULT_COHORT); this.knockoutType = knockoutType; this.sequenceOntologyTerms = ct == null ? null : ct.getSequenceOntologyTerms(); this.populationFrequencies = annotation.getPopulationFrequencies(); this.clinicalSignificance = getClinicalSignificance(annotation); } - public KnockoutVariant(String id, VariantType type, String genotype, Integer depth, String filter, String qual, + public KnockoutVariant(String id, String dbSnp, String genotype, Integer depth, String filter, String qual, VariantStats stats, KnockoutType knockoutType, List sequenceOntologyTerms, List populationFrequencies, List clinicalSignificance) { - this.id = id; - this.type = type; + this(new Variant(id), dbSnp, genotype, depth, filter, qual, stats, knockoutType, sequenceOntologyTerms, populationFrequencies, clinicalSignificance); + } + + public KnockoutVariant(Variant variant, String dbSnp, String genotype, Integer depth, String filter, String qual, VariantStats stats, + KnockoutType knockoutType, List sequenceOntologyTerms, + List populationFrequencies, List clinicalSignificance) { + this.id = variant.toString(); + this.dbSnp = dbSnp; + this.chromosome = variant.getChromosome(); + this.start = variant.getStart(); + this.end = variant.getEnd(); + this.length = variant.getLength(); + this.reference = variant.getReference(); + this.alternate = variant.getAlternate(); + this.type = variant.getType(); this.genotype = genotype; this.depth = depth; this.filter = filter; this.qual = qual; + this.stats = stats; this.knockoutType = knockoutType; this.sequenceOntologyTerms = sequenceOntologyTerms; this.populationFrequencies = populationFrequencies; @@ -120,6 +139,15 @@ public KnockoutVariant setId(String id) { return this; } + public String getDbSnp() { + return dbSnp; + } + + public KnockoutVariant setDbSnp(String dbSnp) { + this.dbSnp = dbSnp; + return this; + } + public String getChromosome() { return chromosome; } @@ -219,6 +247,15 @@ public KnockoutVariant setQual(String qual) { return this; } + public VariantStats getStats() { + return stats; + } + + public KnockoutVariant setStats(VariantStats stats) { + this.stats = stats; + return this; + } + public KnockoutType getKnockoutType() { return knockoutType; } diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java index 29252f5d716..bbc88862c55 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java @@ -6,7 +6,6 @@ import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; -import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; @@ -67,14 +66,14 @@ public static KnockoutTranscript createTranscript(int count) { sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0001891", "regulatory_region_amplification")); sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0000685", "DNAseI_hypersensitive_site")); - knockoutVariantList.add(new KnockoutVariant("variant" + count, VariantType.SNV, "Genotype", 10, "PASS", "10", KnockoutVariant.KnockoutType.COMP_HET, + knockoutVariantList.add(new KnockoutVariant("chr1:" + count + ":A:C", "rs1234", "Genotype", 10, "PASS", "10", null, KnockoutVariant.KnockoutType.COMP_HET, sequenceOntologyTermList, populationFrequencyList, clinicalSignificance)); populationFrequencyList = new ArrayList<>(3); populationFrequencyList.add(new PopulationFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, "ALL", "", "", 1f, 0.2f, 1f, 0.04f, 0.02f)); populationFrequencyList.add(new PopulationFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, "ALL", "", "", 1f, 0.01f, 1f, 0.01f, 0.01f)); populationFrequencyList.add(new PopulationFrequency("otherStudy", "ALL", "", "", 1f, 0.04f, 1f, 0.004f, 0.2f)); - knockoutVariantList.add(new KnockoutVariant("variant" + (count + 1), VariantType.SNV, "Genotype", 2, "NOT_PASS", "1", + knockoutVariantList.add(new KnockoutVariant("chr1:" + (count + 1) + ":A:C", "rs4321", "Genotype", 2, "NOT_PASS", "1", null, KnockoutVariant.KnockoutType.COMP_HET, sequenceOntologyTermList, populationFrequencyList, clinicalSignificance)); knockoutTranscript.setVariants(knockoutVariantList); return knockoutTranscript; From 28867779d0fd9b533aa3f2d8cb6e3206b5db2c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 19 Mar 2021 10:59:15 +0000 Subject: [PATCH 112/412] server: Rename /variant/sample/genotype/index/configure to /variant/sample/index/configure #1699 --- .../VariantOperationWebService.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java index fcae2bfde40..539126ab396 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java @@ -234,7 +234,7 @@ public Response scoreDelete( } @POST - @Path("/variant/sample/genotype/index/configure") + @Path("/variant/sample/index/configure") @ApiOperation(value = "Update SampleIndex configuration", response = ObjectMap.class) public Response sampleIndexConfigure( @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, @@ -252,6 +252,20 @@ public Response sampleIndexConfigure( @POST @Path("/variant/sample/genotype/index") + @ApiOperation(value = VariantSampleIndexOperationTool.DESCRIPTION, hidden = true, response = Job.class) + @Deprecated + public Response sampleGenotypeIndex( + @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, + @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, + @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, + @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = VariantSampleIndexParams.DESCRIPTION) VariantSampleIndexParams params) { + return sampleIndex(jobName, jobDescription, dependsOn, jobTags, study, params); + } + + @POST + @Path("/variant/sample/index") @ApiOperation(value = VariantSampleIndexOperationTool.DESCRIPTION, response = Job.class) public Response sampleIndex( @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, @@ -265,6 +279,20 @@ public Response sampleIndex( @POST @Path("/variant/family/genotype/index") + @ApiOperation(value = VariantFamilyIndexOperationTool.DESCRIPTION, response = Job.class, hidden = true) + @Deprecated + public Response familyGenotypeIndex( + @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, + @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, + @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, + @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = VariantFamilyIndexParams.DESCRIPTION) VariantFamilyIndexParams params) { + return familyIndex(jobName, jobDescription, dependsOn, jobTags, study, params); + } + + @POST + @Path("/variant/family/index") @ApiOperation(value = VariantFamilyIndexOperationTool.DESCRIPTION, response = Job.class) public Response familyIndex( @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, From c58b3e0e23dd6df001a01761035c11a4f76f5ce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 19 Mar 2021 11:43:31 +0000 Subject: [PATCH 113/412] app: Add "opencga.sh jobs retry" command --- opencga-app/app/misc/clients/README.md | 29 +++ .../app/cli/main/OpencgaCliOptionsParser.java | 1 + .../executors/catalog/JobCommandExecutor.java | 21 ++- .../operations/OperationsCommandExecutor.java | 7 +- .../cli/main/options/JobCommandOptions.java | 24 +++ .../opencga/catalog/managers/JobManager.java | 12 ++ .../client/rest/clients/AdminClient.java | 11 +- .../client/rest/clients/AlignmentClient.java | 4 +- .../client/rest/clients/ClinicalClient.java | 176 +++++++++++++++++- .../client/rest/clients/CohortClient.java | 10 +- .../rest/clients/DiseasePanelClient.java | 4 +- .../client/rest/clients/FamilyClient.java | 5 +- .../client/rest/clients/FileClient.java | 4 +- .../client/rest/clients/GA4GHClient.java | 4 +- .../client/rest/clients/IndividualClient.java | 4 +- .../client/rest/clients/JobClient.java | 23 ++- .../client/rest/clients/MetaClient.java | 4 +- .../client/rest/clients/ProjectClient.java | 4 +- .../client/rest/clients/SampleClient.java | 13 +- .../client/rest/clients/StudyClient.java | 4 +- .../client/rest/clients/UserClient.java | 4 +- .../client/rest/clients/VariantClient.java | 22 ++- .../rest/clients/VariantOperationClient.java | 30 ++- .../core/models/job/JobRetryParams.java | 22 +++ .../opencga/server/rest/JobWSServer.java | 40 ++++ 25 files changed, 420 insertions(+), 62 deletions(-) create mode 100644 opencga-app/app/misc/clients/README.md create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/job/JobRetryParams.java diff --git a/opencga-app/app/misc/clients/README.md b/opencga-app/app/misc/clients/README.md new file mode 100644 index 00000000000..704bff13888 --- /dev/null +++ b/opencga-app/app/misc/clients/README.md @@ -0,0 +1,29 @@ +# Multi-language client generator + +Need to compile and start a rest server to generate the clients. +``` +mvn clean install -DskipTests -Dopencga.war.name=opencga +./build/bin/opencga-admin.sh server rest --start --port 9123 +``` + +Then, execute the client generator for each language +## Java +``` +python3 build/misc/clients/java_client_generator.py http://localhost:9123/opencga opencga-client/src/main/java/org/opencb/opencga/client/rest/clients +``` + +## Python +``` +python3 build/misc/clients/python_client_generator.py http://localhost:9123/opencga opencga-client/src/main/python/pyopencga/rest_clients +``` + +## R +``` +python3 build/misc/clients/r_client_generator.py http://localhost:9123/opencga opencga-client/src/main/R/R/ +``` + +## JS +``` +python3 build/misc/clients/js_client_generator.py http://localhost:9123/opencga +``` + diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index e6d1b9baecd..16b07011b51 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -177,6 +177,7 @@ public OpencgaCliOptionsParser() { jCommander.addCommand("jobs", jobCommandOptions); JCommander jobSubCommands = jCommander.getCommands().get("jobs"); jobSubCommands.addCommand("create", jobCommandOptions.createCommandOptions); + jobSubCommands.addCommand("retry", jobCommandOptions.retryCommandOptions); jobSubCommands.addCommand("info", jobCommandOptions.infoCommandOptions); jobSubCommands.addCommand("search", jobCommandOptions.searchCommandOptions); jobSubCommands.addCommand("top", jobCommandOptions.topCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/JobCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/JobCommandExecutor.java index 45e4b6f52b0..007883d92e6 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/JobCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/JobCommandExecutor.java @@ -28,10 +28,7 @@ import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.core.api.ParamConstants; -import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.core.models.job.JobAclUpdateParams; -import org.opencb.opencga.core.models.job.JobCreateParams; -import org.opencb.opencga.core.models.job.ToolInfo; +import org.opencb.opencga.core.models.job.*; import org.opencb.opencga.core.response.RestResponse; import java.util.stream.Collectors; @@ -59,6 +56,9 @@ public void execute() throws Exception { case "create": queryResponse = create(); break; + case "retry": + queryResponse = retry(); + break; case "info": queryResponse = info(); break; @@ -116,6 +116,19 @@ private RestResponse create() throws ClientException { return openCGAClient.getJobClient().create(createParams, params); } + private RestResponse retry() throws ClientException { + JobCommandOptions.RetryCommandOptions commandOptions = jobsCommandOptions.retryCommandOptions; + + ObjectMap params = new ObjectMap(); + params.putIfNotEmpty(ParamConstants.STUDY_PARAM, commandOptions.study); + params.putIfNotEmpty(ParamConstants.JOB_ID, commandOptions.id); + params.putIfNotNull(ParamConstants.JOB_DEPENDS_ON, commandOptions.jobDependsOn); + params.putIfNotEmpty(ParamConstants.JOB_DESCRIPTION, commandOptions.description); + params.putIfNotNull(ParamConstants.JOB_TAGS, commandOptions.jobTags); + + return openCGAClient.getJobClient().retry(new JobRetryParams(commandOptions.jobToRetry), params); + } + private RestResponse info() throws ClientException { logger.debug("Getting job information"); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/operations/OperationsCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/operations/OperationsCommandExecutor.java index 215f7119def..b616f574569 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/operations/OperationsCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/operations/OperationsCommandExecutor.java @@ -2,14 +2,13 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.core.common.YesNoAuto; -import org.opencb.opencga.core.models.operations.variant.JulieParams; import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.internal.options.VariantCommandOptions; import org.opencb.opencga.app.cli.main.executors.OpencgaCommandExecutor; import org.opencb.opencga.app.cli.main.options.OperationsCommandOptions; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.common.YesNoAuto; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.*; import org.opencb.opencga.core.models.variant.VariantFileIndexJobLauncherParams; @@ -207,7 +206,7 @@ private RestResponse variantFamilyIndex() throws ClientException { ObjectMap params = getParams(cliOptions); - return openCGAClient.getVariantOperationClient().indexFamilyGenotype( + return openCGAClient.getVariantOperationClient().indexVariantFamily( new VariantFamilyIndexParams( cliOptions.family, cliOptions.overwrite, @@ -220,7 +219,7 @@ private RestResponse variantSampleIndex() throws ClientException { ObjectMap params = getParams(cliOptions); - return openCGAClient.getVariantOperationClient().indexSampleGenotype( + return openCGAClient.getVariantOperationClient().indexVariantSample( new VariantSampleIndexParams( cliOptions.sample, cliOptions.buildIndex, diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/JobCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/JobCommandOptions.java index 15368fee00f..6dc5efbdd5f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/JobCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/JobCommandOptions.java @@ -36,6 +36,7 @@ public class JobCommandOptions { public CreateCommandOptions createCommandOptions; + public RetryCommandOptions retryCommandOptions; public InfoCommandOptions infoCommandOptions; public SearchCommandOptions searchCommandOptions; public TopCommandOptions topCommandOptions; @@ -59,6 +60,7 @@ public JobCommandOptions(CommonCommandOptions commonCommandOptions, DataModelOpt this.jCommander = jCommander; this.createCommandOptions = new CreateCommandOptions(); + this.retryCommandOptions = new RetryCommandOptions(); this.infoCommandOptions = new InfoCommandOptions(); this.searchCommandOptions = new SearchCommandOptions(); this.topCommandOptions = new TopCommandOptions(); @@ -121,6 +123,28 @@ public class CreateCommandOptions extends StudyOption { public List tags; } + @Parameters(commandNames = {"retry"}, commandDescription = "Relaunch a failed job") + public class RetryCommandOptions extends StudyOption { + + @ParametersDelegate + CommonCommandOptions commonOptions = commonCommandOptions; + + @Parameter(names = {"--job", "--job-to-retry"}, description = ParamConstants.JOB_ID_DESCRIPTION + " of the job to retry", required = true, arity = 1) + public String jobToRetry; + + @Parameter(names = {"--id"}, description = ParamConstants.JOB_ID_CREATION_DESCRIPTION, required = true, arity = 1) + public String id; + + @Parameter(names = {"-d", "--description"}, description = ParamConstants.JOB_DESCRIPTION_DESCRIPTION, arity = 1) + public String description; + + @Parameter(names = {"--depends-on"}, description = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION, arity = 1) + public List jobDependsOn; + + @Parameter(names = {"--tags"}, description = ParamConstants.JOB_TAGS_DESCRIPTION, arity = 1) + public List jobTags; + } + @Parameters(commandNames = {"info"}, commandDescription = "Get job information") public class InfoCommandOptions extends BaseJobCommand { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java index c085b5791e2..76a07f1b378 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java @@ -409,6 +409,18 @@ public List getJobInputFilesFromParams(String study, Job job, String token return inputFiles; } + public OpenCGAResult retry(String studyStr, JobRetryParams jobRetry, Enums.Priority priority, + String jobId, String jobDescription, List jobDependsOn, List jobTags, String token) + throws CatalogException { + Job job = get(studyStr, jobRetry.getJob(), new QueryOptions(), token).first(); + if (job.getInternal().getStatus().getName().equals(Enums.ExecutionStatus.ERROR) + || job.getInternal().getStatus().getName().equals(Enums.ExecutionStatus.ABORTED)) { + return submit(studyStr, job.getTool().getId(), priority, job.getParams(), jobId, jobDescription, jobDependsOn, jobTags, token); + } else { + throw new CatalogException("Unable to retry job with status " + job.getInternal().getStatus().getName()); + } + } + public OpenCGAResult submit(String studyStr, String toolId, Enums.Priority priority, Map params, String token) throws CatalogException { return submit(studyStr, toolId, priority, params, null, null, null, null, token); diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java index 3a930264ef9..52b3c529807 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -43,7 +43,7 @@ /** * This class contains methods for the Admin webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: admin */ public class AdminClient extends AbstractParentClient { @@ -75,11 +75,14 @@ public RestResponse groupByAudit(String fields, String entity, Object /** * Sync Catalog into the Solr. + * @param params Map containing any of the following optional parameters. + * collection: Collection to be indexed (file, sample, individual, family, cohort and/or job). If not provided, all of them will + * be indexed. * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse indexStatsCatalog() throws ClientException { - ObjectMap params = new ObjectMap(); + public RestResponse indexStatsCatalog(ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); return execute("admin", null, "catalog", null, "indexStats", params, POST, Boolean.class); } diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java index 353035d9781..f3d4a765710 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java @@ -40,7 +40,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -49,7 +49,7 @@ /** * This class contains methods for the Alignment webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: analysis/alignment */ public class AlignmentClient extends AbstractParentClient { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java index 1beaba62fea..8bd28640122 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java @@ -17,10 +17,14 @@ package org.opencb.opencga.client.rest.clients; import org.opencb.biodata.models.clinical.interpretation.ClinicalVariant; +import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; +import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.models.clinical.CancerTieringInterpretationAnalysisParams; import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.clinical.ClinicalAnalysisAclUpdateParams; @@ -30,6 +34,7 @@ import org.opencb.opencga.core.models.clinical.InterpretationCreateParams; import org.opencb.opencga.core.models.clinical.InterpretationMergeParams; import org.opencb.opencga.core.models.clinical.InterpretationUpdateParams; +import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; import org.opencb.opencga.core.models.clinical.TeamInterpretationAnalysisParams; import org.opencb.opencga.core.models.clinical.TieringInterpretationAnalysisParams; import org.opencb.opencga.core.models.clinical.ZettaInterpretationAnalysisParams; @@ -41,7 +46,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -50,7 +55,7 @@ /** * This class contains methods for the Clinical webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: analysis/clinical */ public class ClinicalClient extends AbstractParentClient { @@ -267,6 +272,170 @@ public RestResponse runInterpreterZetta(ZettaInterpretationAnalysisParams d return execute("analysis", null, "clinical/interpreter/zetta", null, "run", params, POST, Job.class); } + /** + * RGA aggregation stats. + * @param field List of fields separated by semicolons, e.g.: clinicalSignificances;type. For nested fields use >>, e.g.: + * type>>clinicalSignificances;knockoutType. + * @param params Map containing any of the following optional parameters. + * limit: Number of results to be returned. + * skip: Number of results to skip. + * sampleId: Filter by sample id. + * individualId: Filter by individual id. + * sex: Filter by sex. + * phenotypes: Filter by phenotypes. + * disorders: Filter by disorders. + * numParents: Filter by the number of parents registered. + * geneId: Filter by gene id. + * geneName: Filter by gene name. + * chromosome: Filter by chromosome. + * start: Filter by start position. + * end: Filter by end position. + * transcriptId: Filter by transcript id. + * variants: Filter by variant id. + * knockoutType: Filter by knockout type. + * filter: Filter by filter (PASS, NOT_PASS). + * type: Filter by variant type. + * clinicalSignificance: Filter by clinical significance. + * populationFrequency: Filter by population frequency. + * consequenceType: Filter by consequence type. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse aggregationStatsRga(String field, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.putIfNotNull("field", field); + return execute("analysis", null, "clinical/rga", null, "aggregationStats", params, GET, FacetField.class); + } + + /** + * Query gene RGA. + * @param params Map containing any of the following optional parameters. + * include: Fields included in the response, whole JSON path must be provided. + * exclude: Fields excluded in the response, whole JSON path must be provided. + * limit: Number of results to be returned. + * skip: Number of results to skip. + * count: Get the total number of results matching the query. Deactivated by default. + * includeIndividual: Include only the comma separated list of individuals to the response. + * sampleId: Filter by sample id. + * individualId: Filter by individual id. + * sex: Filter by sex. + * phenotypes: Filter by phenotypes. + * disorders: Filter by disorders. + * numParents: Filter by the number of parents registered. + * geneId: Filter by gene id. + * geneName: Filter by gene name. + * chromosome: Filter by chromosome. + * start: Filter by start position. + * end: Filter by end position. + * transcriptId: Filter by transcript id. + * variants: Filter by variant id. + * knockoutType: Filter by knockout type. + * filter: Filter by filter (PASS, NOT_PASS). + * type: Filter by variant type. + * clinicalSignificance: Filter by clinical significance. + * populationFrequency: Filter by population frequency. + * consequenceType: Filter by consequence type. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse queryRgaGene(ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + return execute("analysis", null, "clinical/rga/gene", null, "query", params, GET, RgaKnockoutByGene.class); + } + + /** + * Generate Recessive Gene Analysis secondary index. + * @param data Recessive Gene Analysis index params. + * @param params Map containing any of the following optional parameters. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. + * jobDescription: Job description. + * jobDependsOn: Comma separated list of existing job IDs the job will depend on. + * jobTags: Job tags. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse runRgaIndex(RgaAnalysisParams data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("analysis", null, "clinical/rga/index", null, "run", params, POST, Job.class); + } + + /** + * Query individual RGA. + * @param params Map containing any of the following optional parameters. + * include: Fields included in the response, whole JSON path must be provided. + * exclude: Fields excluded in the response, whole JSON path must be provided. + * limit: Number of results to be returned. + * skip: Number of results to skip. + * count: Get the total number of results matching the query. Deactivated by default. + * sampleId: Filter by sample id. + * individualId: Filter by individual id. + * sex: Filter by sex. + * phenotypes: Filter by phenotypes. + * disorders: Filter by disorders. + * numParents: Filter by the number of parents registered. + * geneId: Filter by gene id. + * geneName: Filter by gene name. + * chromosome: Filter by chromosome. + * start: Filter by start position. + * end: Filter by end position. + * transcriptId: Filter by transcript id. + * variants: Filter by variant id. + * knockoutType: Filter by knockout type. + * filter: Filter by filter (PASS, NOT_PASS). + * type: Filter by variant type. + * clinicalSignificance: Filter by clinical significance. + * populationFrequency: Filter by population frequency. + * consequenceType: Filter by consequence type. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse queryRgaIndividual(ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + return execute("analysis", null, "clinical/rga/individual", null, "query", params, GET, KnockoutByIndividual.class); + } + + /** + * Query variant RGA. + * @param params Map containing any of the following optional parameters. + * include: Fields included in the response, whole JSON path must be provided. + * exclude: Fields excluded in the response, whole JSON path must be provided. + * limit: Number of results to be returned. + * skip: Number of results to skip. + * count: Get the total number of results matching the query. Deactivated by default. + * includeIndividual: Include only the comma separated list of individuals to the response. + * sampleId: Filter by sample id. + * individualId: Filter by individual id. + * sex: Filter by sex. + * phenotypes: Filter by phenotypes. + * disorders: Filter by disorders. + * numParents: Filter by the number of parents registered. + * geneId: Filter by gene id. + * geneName: Filter by gene name. + * chromosome: Filter by chromosome. + * start: Filter by start position. + * end: Filter by end position. + * transcriptId: Filter by transcript id. + * variants: Filter by variant id. + * knockoutType: Filter by knockout type. + * filter: Filter by filter (PASS, NOT_PASS). + * type: Filter by variant type. + * clinicalSignificance: Filter by clinical significance. + * populationFrequency: Filter by population frequency. + * consequenceType: Filter by consequence type. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse queryRgaVariant(ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + return execute("analysis", null, "clinical/rga/variant", null, "query", params, GET, KnockoutByVariant.class); + } + /** * Clinical analysis search. * @param params Map containing any of the following optional parameters. @@ -331,7 +500,8 @@ public RestResponse actionableVariant(ObjectMap params) throws * id: List of IDs, these can be rs IDs (dbSNP) or variants in the format chrom:start:ref:alt, e.g. rs116600158,19:7177679:C:T. * region: List of regions, these can be just a single chromosome name or regions in the format chr:start-end, e.g.: * 2,3:100000-200000. - * type: List of types, accepted values are SNV, MNV, INDEL, SV, CNV, INSERTION, DELETION, e.g. SNV,INDEL. + * type: List of types, accepted values are SNV, MNV, INDEL, SV, COPY_NUMBER, COPY_NUMBER_LOSS, COPY_NUMBER_GAIN, INSERTION, + * DELETION, DUPLICATION, TANDEM_DUPLICATION, BREAKEND, e.g. SNV,INDEL. * study: Filter variants from the given studies, these can be either the numeric ID or the alias with the format * user@project:study. * file: Filter variants from the files specified. This will set includeFile parameter when not provided. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java index 6f024fd6254..4e4b1321ae6 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -44,7 +44,7 @@ /** * This class contains methods for the Cohort webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: cohorts */ public class CohortClient extends AbstractParentClient { @@ -151,6 +151,7 @@ public RestResponse create(CohortCreateParams data, ObjectMap params) th * acl=john:WRITE,WRITE_ANNOTATIONS will return all entries for which user john has both WRITE and WRITE_ANNOTATIONS * permissions. Only study owners or administrators can query by this field. . * samples: Sample list. + * numSamples: Number of samples. * release: Release value. * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. @@ -168,8 +169,8 @@ public RestResponse distinct(String field, ObjectMap params) throws C * study: Study [[user@]project:]study where study and project can be either the ID or UUID. * id: Comma separated list sample IDs or UUIDs up to a maximum of 100. * somatic: Somatic sample. - * individualId: Individual ID. - * fileIds: Comma separated list of file IDs. + * individualId: Individual ID or UUID. + * fileIds: Comma separated list of file IDs, paths or UUIDs. * creationDate: Creation date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805. * modificationDate: Modification date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805. * internalStatus: Filter by internal status. @@ -214,6 +215,7 @@ public RestResponse generate(CohortGenerateParams data, ObjectMap params * acl=john:WRITE,WRITE_ANNOTATIONS will return all entries for which user john has both WRITE and WRITE_ANNOTATIONS * permissions. Only study owners or administrators can query by this field. . * samples: Sample list. + * numSamples: Number of samples. * release: Release value. * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java index dd4843640e7..61e5ed5108c 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java @@ -31,7 +31,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -40,7 +40,7 @@ /** * This class contains methods for the DiseasePanel webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: panels */ public class DiseasePanelClient extends AbstractParentClient { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java index 4d4438cefa9..cc2a01e9a4a 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -43,7 +43,7 @@ /** * This class contains methods for the Family webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: families */ public class FamilyClient extends AbstractParentClient { @@ -59,6 +59,7 @@ public FamilyClient(String token, ClientConfiguration configuration) { * @param data JSON containing the parameters to add ACLs. * @param params Map containing any of the following optional parameters. * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * propagate: Propagate family permissions to related individuals and samples. * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java index 6cf30143c33..5d74f04c099 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -50,7 +50,7 @@ /** * This class contains methods for the File webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: files */ public class FileClient extends AbstractParentClient { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java index 5676d30f308..288e3998b7d 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java @@ -27,7 +27,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -36,7 +36,7 @@ /** * This class contains methods for the GA4GH webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: ga4gh */ public class GA4GHClient extends AbstractParentClient { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java index d3bc49f72e6..6e14e120315 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -43,7 +43,7 @@ /** * This class contains methods for the Individual webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: individuals */ public class IndividualClient extends AbstractParentClient { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java index 27dcbc1dec5..12d04f977cc 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java @@ -25,6 +25,7 @@ import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.job.JobAclUpdateParams; import org.opencb.opencga.core.models.job.JobCreateParams; +import org.opencb.opencga.core.models.job.JobRetryParams; import org.opencb.opencga.core.models.job.JobTop; import org.opencb.opencga.core.models.job.JobUpdateParams; import org.opencb.opencga.core.response.RestResponse; @@ -34,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -43,7 +44,7 @@ /** * This class contains methods for the Job webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: jobs */ public class JobClient extends AbstractParentClient { @@ -143,6 +144,24 @@ public RestResponse distinct(String field, ObjectMap params) throws C return execute("jobs", null, null, null, "distinct", params, GET, ObjectMap.class); } + /** + * Relaunch a failed job. + * @param data job. + * @param params Map containing any of the following optional parameters. + * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. + * jobDescription: Job description. + * jobDependsOn: Comma separated list of existing job IDs the job will depend on. + * jobTags: Job tags. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse retry(JobRetryParams data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("jobs", null, null, null, "retry", params, POST, Job.class); + } + /** * Job search method. * @param params Map containing any of the following optional parameters. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java index 2c835b5e85e..902f2be69bb 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java @@ -27,7 +27,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -36,7 +36,7 @@ /** * This class contains methods for the Meta webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: meta */ public class MetaClient extends AbstractParentClient { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java index fe3e76c0ff8..f9e20a8ff2b 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java @@ -32,7 +32,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -41,7 +41,7 @@ /** * This class contains methods for the Project webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: projects */ public class ProjectClient extends AbstractParentClient { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java index 0c73f4cd7d4..d17ed9a85c1 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -43,7 +43,7 @@ /** * This class contains methods for the Sample webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: samples */ public class SampleClient extends AbstractParentClient { @@ -60,7 +60,6 @@ public SampleClient(String token, ClientConfiguration configuration) { * permissions defined to the individuals that are associated to the matching samples. * @param params Map containing any of the following optional parameters. * study: Study [[user@]project:]study where study and project can be either the ID or UUID. - * propagate: Propagate sample permissions to related individuals. * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ @@ -144,8 +143,8 @@ public RestResponse create(SampleCreateParams data, ObjectMap params) th * study: Study [[user@]project:]study where study and project can be either the ID or UUID. * id: Comma separated list sample IDs or UUIDs up to a maximum of 100. * somatic: Somatic sample. - * individualId: Individual ID. - * fileIds: Comma separated list of file IDs. + * individualId: Individual ID or UUID. + * fileIds: Comma separated list of file IDs, paths or UUIDs. * creationDate: Creation date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805. * modificationDate: Modification date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805. * internalStatus: Filter by internal status. @@ -196,8 +195,8 @@ public RestResponse load(String file, ObjectMap params) throws ClientExc * study: Study [[user@]project:]study where study and project can be either the ID or UUID. * id: Comma separated list sample IDs or UUIDs up to a maximum of 100. * somatic: Somatic sample. - * individualId: Individual ID. - * fileIds: Comma separated list of file IDs. + * individualId: Individual ID or UUID. + * fileIds: Comma separated list of file IDs, paths or UUIDs. * creationDate: Creation date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805. * modificationDate: Modification date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805. * internalStatus: Filter by internal status. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java index 44963441dc6..57763ca0658 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java @@ -39,7 +39,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -48,7 +48,7 @@ /** * This class contains methods for the Study webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: studies */ public class StudyClient extends AbstractParentClient { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java index 59d7d2e114a..536e6e38f70 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java @@ -37,7 +37,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -46,7 +46,7 @@ /** * This class contains methods for the User webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: users */ public class UserClient extends AbstractParentClient { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 7c3d71fca15..7b19a094b2e 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -59,7 +59,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -68,7 +68,7 @@ /** * This class contains methods for the Variant webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: analysis/variant */ public class VariantClient extends AbstractParentClient { @@ -83,7 +83,8 @@ public VariantClient(String token, ClientConfiguration configuration) { * savedFilter: Use a saved filter at User level. * region: List of regions, these can be just a single chromosome name or regions in the format chr:start-end, e.g.: * 2,3:100000-200000. - * type: List of types, accepted values are SNV, MNV, INDEL, SV, CNV, INSERTION, DELETION, e.g. SNV,INDEL. + * type: List of types, accepted values are SNV, MNV, INDEL, SV, COPY_NUMBER, COPY_NUMBER_LOSS, COPY_NUMBER_GAIN, INSERTION, + * DELETION, DUPLICATION, TANDEM_DUPLICATION, BREAKEND, e.g. SNV,INDEL. * project: Project [user@]project where project can be either the ID or the alias. * study: Filter variants from the given studies, these can be either the numeric ID or the alias with the format * user@project:study. @@ -492,6 +493,9 @@ public RestResponse metadata(ObjectMap params) throws ClientExc * sample: Sample name. * ct: List of SO consequence types, e.g. missense_variant,stop_lost or SO:0001583,SO:0001578. * biotype: List of biotypes, e.g. protein_coding. + * fileData: Filter by file data (i.e. FILTER, QUAL and INFO columns from VCF file). [{file}:]{key}{op}{value}[,;]* . If no file + * is specified, will use all files from "file" filter. e.g. AN>200 or file_1.vcf:AN>200;file_2.vcf:AN<10 . Many fields can + * be combined. e.g. file_1.vcf:AN>200;DB=true;file_2.vcf:AN<10,FILTER=PASS,LowDP. * filter: Specify the FILTER for any of the files. If 'file' filter is provided, will match the file and the filter. e.g.: * PASS,LowGQX. * qual: Specify the QUAL for any of the files. If 'file' filter is provided, will match the file and the qual. e.g.: >123.4. @@ -561,7 +565,8 @@ public RestResponse runPlink(PlinkRunParams data, ObjectMap params) throws * id: List of IDs, these can be rs IDs (dbSNP) or variants in the format chrom:start:ref:alt, e.g. rs116600158,19:7177679:C:T. * region: List of regions, these can be just a single chromosome name or regions in the format chr:start-end, e.g.: * 2,3:100000-200000. - * type: List of types, accepted values are SNV, MNV, INDEL, SV, CNV, INSERTION, DELETION, e.g. SNV,INDEL. + * type: List of types, accepted values are SNV, MNV, INDEL, SV, COPY_NUMBER, COPY_NUMBER_LOSS, COPY_NUMBER_GAIN, INSERTION, + * DELETION, DUPLICATION, TANDEM_DUPLICATION, BREAKEND, e.g. SNV,INDEL. * reference: Reference allele. * alternate: Main alternate allele. * project: Project [user@]project where project can be either the ID or the alias. @@ -696,7 +701,8 @@ public RestResponse runRvtests(RvtestsRunParams data, ObjectMap params) thr * savedFilter: Use a saved filter at User level. * region: List of regions, these can be just a single chromosome name or regions in the format chr:start-end, e.g.: * 2,3:100000-200000. - * type: List of types, accepted values are SNV, MNV, INDEL, SV, CNV, INSERTION, DELETION, e.g. SNV,INDEL. + * type: List of types, accepted values are SNV, MNV, INDEL, SV, COPY_NUMBER, COPY_NUMBER_LOSS, COPY_NUMBER_GAIN, INSERTION, + * DELETION, DUPLICATION, TANDEM_DUPLICATION, BREAKEND, e.g. SNV,INDEL. * project: Project [user@]project where project can be either the ID or the alias. * study: Filter variants from the given studies, these can be either the numeric ID or the alias with the format * user@project:study. @@ -819,7 +825,8 @@ public RestResponse runSample(SampleVariantFilterParams data, ObjectMap par * @param params Map containing any of the following optional parameters. * region: List of regions, these can be just a single chromosome name or regions in the format chr:start-end, e.g.: * 2,3:100000-200000. - * type: List of types, accepted values are SNV, MNV, INDEL, SV, CNV, INSERTION, DELETION, e.g. SNV,INDEL. + * type: List of types, accepted values are SNV, MNV, INDEL, SV, COPY_NUMBER, COPY_NUMBER_LOSS, COPY_NUMBER_GAIN, INSERTION, + * DELETION, DUPLICATION, TANDEM_DUPLICATION, BREAKEND, e.g. SNV,INDEL. * study: Study [[user@]project:]study where study and project can be either the ID or UUID. * file: Filter variants from the files specified. This will set includeFile parameter when not provided. * filter: Specify the FILTER for any of the files. If 'file' filter is provided, will match the file and the filter. e.g.: @@ -843,7 +850,8 @@ public RestResponse querySampleStats(String sample, ObjectMa /** * Compute sample variant stats for the selected list of samples. - * @param data Sample variant stats params. + * @param data Sample variant stats params. Use index=true and indexId='' to store the result in catalog sample QC. indexId=ALL + * requires an empty query. Use sample=all to compute sample stats of all samples in the variant storage. * @param params Map containing any of the following optional parameters. * study: Study [[user@]project:]study where study and project can be either the ID or UUID. * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java index 97dd6f6881f..c2563fcaede 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java @@ -20,6 +20,7 @@ import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.JulieParams; import org.opencb.opencga.core.models.operations.variant.VariantAggregateFamilyParams; @@ -40,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2020-11-19 12:00:56 +* Autogenerated on: 2021-03-19 11:23:04 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -49,7 +50,7 @@ /** * This class contains methods for the VariantOperation webservices. - * Client version: 2.0.0 + * Client version: 2.1.0 * PATH: operation */ public class VariantOperationClient extends AbstractParentClient { @@ -131,10 +132,11 @@ public RestResponse saveVariantAnnotation(VariantAnnotationSaveParams data, } /** - * Creates a secondary index using a search engine. If samples are provided, sample data will be added to the secondary index. + * Update Variant Storage Engine configuration. Can be updated at Project or Study level. * @param data Configuration params to update. * @param params Map containing any of the following optional parameters. * project: Project [user@]project where project can be either the ID or the alias. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ @@ -174,10 +176,10 @@ public RestResponse aggregateVariantFamily(VariantAggregateFamilyParams dat * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse indexFamilyGenotype(VariantFamilyIndexParams data, ObjectMap params) throws ClientException { + public RestResponse indexVariantFamily(VariantFamilyIndexParams data, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); params.put("body", data); - return execute("operation", null, "variant/family/genotype", null, "index", params, POST, Job.class); + return execute("operation", null, "variant/family", null, "index", params, POST, Job.class); } /** @@ -264,10 +266,24 @@ public RestResponse synchronizeVariantMetadata(VariantStorageMetadataSynchr * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse indexSampleGenotype(VariantSampleIndexParams data, ObjectMap params) throws ClientException { + public RestResponse indexVariantSample(VariantSampleIndexParams data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("operation", null, "variant/sample", null, "index", params, POST, Job.class); + } + + /** + * Update SampleIndex configuration. + * @param data New SampleIndexConfiguration. + * @param params Map containing any of the following optional parameters. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse configureSampleIndex(SampleIndexConfiguration data, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); params.put("body", data); - return execute("operation", null, "variant/sample/genotype", null, "index", params, POST, Job.class); + return execute("operation", null, "variant/sample/index", null, "configure", params, POST, ObjectMap.class); } /** diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/job/JobRetryParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/job/JobRetryParams.java new file mode 100644 index 00000000000..48e24998d1e --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/job/JobRetryParams.java @@ -0,0 +1,22 @@ +package org.opencb.opencga.core.models.job; + +public class JobRetryParams { + + private String job; + + public JobRetryParams() { + } + + public JobRetryParams(String job) { + this.job = job; + } + + public String getJob() { + return job; + } + + public JobRetryParams setJob(String job) { + this.job = job; + return this; + } +} diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/JobWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/JobWSServer.java index 70e0fc3681d..27144eeae80 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/JobWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/JobWSServer.java @@ -18,6 +18,7 @@ import io.swagger.annotations.*; import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.Query; @@ -37,9 +38,13 @@ import javax.ws.rs.*; import javax.ws.rs.core.*; import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import static org.opencb.opencga.core.api.ParamConstants.JOB_DEPENDS_ON; + @Path("/{apiVersion}/jobs") @Produces(MediaType.APPLICATION_JSON) @Api(value = "Jobs", description = "Methods for working with 'jobs' endpoint") @@ -70,6 +75,41 @@ public Response createJobPOST( } } + @POST + @Path("/retry") + @Consumes(MediaType.APPLICATION_JSON) + @ApiOperation(value = "Relaunch a failed job", response = Job.class) + public Response retryJob( + @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobId, + @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, + @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, + @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTagsStr, + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = "job", required = true) JobRetryParams params + + ) { + try { + List jobDependsOn; + if (StringUtils.isNotEmpty(dependsOn)) { + jobDependsOn = Arrays.asList(dependsOn.split(",")); + } else { + jobDependsOn = Collections.emptyList(); + } + + List jobTags; + if (StringUtils.isNotEmpty(jobTagsStr)) { + jobTags = Arrays.asList(jobTagsStr.split(",")); + } else { + jobTags = Collections.emptyList(); + } + OpenCGAResult result = catalogManager.getJobManager().retry(study, params, + null, jobId, jobDescription, jobDependsOn, jobTags, token); + return createOkResponse(result); + } catch (Exception e) { + return createErrorResponse(e); + } + } + @GET @Path("/{jobs}/info") @ApiOperation(value = "Get job information", response = Job.class) From d62b9c813e4dabe8582559cb057728169daad41c Mon Sep 17 00:00:00 2001 From: imedina Date: Tue, 23 Mar 2021 01:40:28 +0000 Subject: [PATCH 114/412] Fix import compilation issue --- .../tiering/CancerTieringInterpretationAnalysisExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java index 24bed60d0e1..eb1778ca8d4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java @@ -51,7 +51,7 @@ import java.nio.file.Paths; import java.util.*; -import static org.opencb.biodata.formats.variant.clinvar.v59jaxb.ReviewStatusType.*; +import static org.opencb.biodata.formats.variant.clinvar.rcv.v64jaxb.ReviewStatusType.*; import static org.opencb.biodata.models.clinical.interpretation.VariantClassification.*; import static org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils.PANEL; From 3ad7822150ceb4b340e70af056bdbecfebfa9050 Mon Sep 17 00:00:00 2001 From: imedina Date: Tue, 23 Mar 2021 02:39:52 +0000 Subject: [PATCH 115/412] pom: set defualt REST url to opencga-prod --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1121820315f..bf6e08ea765 100644 --- a/pom.xml +++ b/pom.xml @@ -604,7 +604,7 @@ LOCAL - http://localhost:9090/${opencga.war.name} + https://ws.opencb.org/opencga-prod localhost:9091 9090 From 48a8b7ec0f3be1376445f0d9e0302b309814f9a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 23 Mar 2021 09:37:29 +0000 Subject: [PATCH 116/412] app: Add command "opencga.sh meta [status|about|ping|api]" --- .../app/cli/main/OpencgaCliOptionsParser.java | 17 +++- .../opencga/app/cli/main/OpencgaMain.java | 3 + .../catalog/MetaCommandExecutor.java | 86 +++++++++++++++++ .../app/cli/main/io/TextOutputWriter.java | 15 +-- .../app/cli/main/io/YamlOutputWriter.java | 6 +- .../cli/main/options/MetaCommandOptions.java | 94 +++++++++++++++++++ .../client/rest/clients/MetaClient.java | 10 +- .../opencga/server/rest/MetaWSServer.java | 9 +- 8 files changed, 221 insertions(+), 19 deletions(-) create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/MetaCommandExecutor.java create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/MetaCommandOptions.java diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index 16b07011b51..2acd7e32d87 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -36,9 +36,8 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.CohortVariantStatsCommandOptions.COHORT_VARIANT_STATS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.FamilyQcCommandOptions.FAMILY_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GatkCommandOptions.GATK_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.IndividualQcCommandOptions.INDIVIDUAL_QC_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GwasCommandOptions.GWAS_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.IndividualQcCommandOptions.INDIVIDUAL_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.InferredSexCommandOptions.INFERRED_SEX_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.JulieRunCommandOptions.JULIE_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.KnockoutCommandOptions.KNOCKOUT_RUN_COMMAND; @@ -48,6 +47,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RelatednessCommandOptions.RELATEDNESS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTEST_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleEligibilityCommandOptions.SAMPLE_ELIGIBILITY_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleVariantStatsCommandOptions.SAMPLE_VARIANT_STATS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantExportCommandOptions.EXPORT_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantIndexCommandOptions.INDEX_RUN_COMMAND; @@ -85,6 +85,7 @@ public class OpencgaCliOptionsParser extends CliOptionsParser { private final CohortCommandOptions cohortCommandOptions; private final FamilyCommandOptions familyCommandOptions; private final PanelCommandOptions panelCommandOptions; + private final MetaCommandOptions metaCommandOptions; private ToolCommandOptions toolCommandOptions; // Analysis commands @@ -324,6 +325,14 @@ public OpencgaCliOptionsParser() { operationsSubCommands.addCommand(VARIANT_AGGREGATE, operationsCommandOptions.variantAggregate); operationsSubCommands.addCommand(VARIANT_FAMILY_AGGREGATE, operationsCommandOptions.variantAggregateFamily); operationsSubCommands.addCommand(JULIE_RUN_COMMAND, operationsCommandOptions.julieRun); + + metaCommandOptions = new MetaCommandOptions(this.commonCommandOptions, dataModelOptions, numericOptions, jCommander); + jCommander.addCommand("meta", metaCommandOptions); + JCommander metaSubCommands = jCommander.getCommands().get("meta"); + metaSubCommands.addCommand("about", metaCommandOptions.aboutCommandOptions); + metaSubCommands.addCommand("status", metaCommandOptions.statusCommandOptions); + metaSubCommands.addCommand("ping", metaCommandOptions.pingCommandOptions); + metaSubCommands.addCommand("api", metaCommandOptions.apiCommandOptions); } @Override @@ -469,4 +478,8 @@ public ClinicalCommandOptions getClinicalCommandOptions() { public OperationsCommandOptions getOperationsCommands() { return operationsCommandOptions; } + + public MetaCommandOptions getMetaCommandOptions() { + return metaCommandOptions; + } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaMain.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaMain.java index 560fd060631..fbe361d8f0a 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaMain.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaMain.java @@ -136,6 +136,9 @@ public static void main(String[] args) { case OperationsCommandOptions.OPERATIONS_COMMAND: commandExecutor = new OperationsCommandExecutor(cliOptionsParser.getOperationsCommands()); break; + case "meta": + commandExecutor = new MetaCommandExecutor(cliOptionsParser.getMetaCommandOptions()); + break; default: System.out.printf("ERROR: not valid command passed: '" + parsedCommand + "'"); break; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/MetaCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/MetaCommandExecutor.java new file mode 100644 index 00000000000..6896aeebb3d --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/MetaCommandExecutor.java @@ -0,0 +1,86 @@ +/* + * Copyright 2015-2017 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.app.cli.main.executors.catalog; + + +import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.opencga.app.cli.main.executors.OpencgaCommandExecutor; +import org.opencb.opencga.app.cli.main.options.MetaCommandOptions; +import org.opencb.opencga.client.exceptions.ClientException; +import org.opencb.opencga.core.response.RestResponse; + +/** + * Created by agaor on 6/06/16. + */ +public class MetaCommandExecutor extends OpencgaCommandExecutor { + + private MetaCommandOptions metaCommandOptions; + + public MetaCommandExecutor(MetaCommandOptions metaCommandOptions) { + super(metaCommandOptions.commonCommandOptions); + this.metaCommandOptions = metaCommandOptions; + } + + @Override + public void execute() throws Exception { + logger.debug("Executing individuals command line"); + + String subCommandString = getParsedSubCommand(metaCommandOptions.jCommander); + RestResponse queryResponse = null; + switch (subCommandString) { + case "status": + queryResponse = status(); + break; + case "about": + queryResponse = about(); + break; + case "ping": + queryResponse = ping(); + break; + case "api": + queryResponse = api(); + break; + default: + logger.error("Subcommand not valid"); + break; + } + + createOutput(queryResponse); + } + + @Override + protected void loadCliSessionFile() { + // Do not load session file for META commands + } + + private RestResponse status() throws ClientException { + return openCGAClient.getMetaClient().status(); + } + + private RestResponse api() throws ClientException { + ObjectMap params = new ObjectMap(metaCommandOptions.commonCommandOptions.params); + return openCGAClient.getMetaClient().api(params); + } + private RestResponse about() throws ClientException { + return openCGAClient.getMetaClient().about(); + } + + private RestResponse ping() throws ClientException { + return openCGAClient.getMetaClient().ping(); + } + +} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/io/TextOutputWriter.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/io/TextOutputWriter.java index e81f9de899e..ae05ac608a3 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/io/TextOutputWriter.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/io/TextOutputWriter.java @@ -37,7 +37,6 @@ import org.opencb.opencga.core.models.study.VariableSet; import org.opencb.opencga.core.models.user.User; import org.opencb.opencga.core.response.RestResponse; -import org.opencb.opencga.core.tools.result.ToolStep; import java.text.SimpleDateFormat; import java.time.Instant; @@ -45,7 +44,6 @@ import java.util.stream.Collectors; import static org.opencb.opencga.core.common.IOUtils.humanReadableByteCount; -import static org.opencb.opencga.core.models.common.Enums.ExecutionStatus.DONE; import static org.opencb.opencga.core.models.common.Enums.ExecutionStatus.RUNNING; /** @@ -72,7 +70,7 @@ public TextOutputWriter(WriterConfiguration writerConfiguration, Table.PrinterTy @Override public void print(RestResponse queryResponse) { - if (checkErrors(queryResponse)) { + if (checkErrors(queryResponse) && queryResponse.allResultsSize() == 0) { return; } @@ -89,8 +87,13 @@ public void print(RestResponse queryResponse) { ps.print(printMetadata(queryResponse)); List queryResultList = queryResponse.getResponses(); - String[] split = queryResultList.get(0).getResultType().split("\\."); - String clazz = split[split.length - 1]; + String clazz; + if (queryResultList.get(0).getResultType() == null) { + clazz = ""; + } else { + String[] split = queryResultList.get(0).getResultType().split("\\."); + clazz = split[split.length - 1]; + } switch (clazz) { case "User": @@ -133,7 +136,7 @@ public void print(RestResponse queryResponse) { System.err.println(ANSI_YELLOW + "Warning: " + clazz + " results not yet supported in text format. Using YAML format" + ANSI_RESET); YamlOutputWriter yamlOutputWriter = new YamlOutputWriter(writerConfiguration); - yamlOutputWriter.print(queryResponse); + yamlOutputWriter.print(queryResponse, false); break; } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/io/YamlOutputWriter.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/io/YamlOutputWriter.java index 78e53d72251..bf18f65cdc3 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/io/YamlOutputWriter.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/io/YamlOutputWriter.java @@ -59,7 +59,11 @@ private void initObjectMapper() { @Override public void print(RestResponse queryResponse) { - if (checkErrors(queryResponse)) { + print(queryResponse, true); + } + + public void print(RestResponse queryResponse, boolean checkErrors) { + if (checkErrors && checkErrors(queryResponse) && queryResponse.allResultsSize() == 0) { return; } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/MetaCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/MetaCommandOptions.java new file mode 100644 index 00000000000..165da71b722 --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/MetaCommandOptions.java @@ -0,0 +1,94 @@ +/* + * Copyright 2015-2017 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.app.cli.main.options; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.beust.jcommander.ParametersDelegate; +import org.opencb.opencga.app.cli.GeneralCliOptions; +import org.opencb.opencga.app.cli.GeneralCliOptions.CommonCommandOptions; +import org.opencb.opencga.app.cli.GeneralCliOptions.DataModelOptions; +import org.opencb.opencga.app.cli.GeneralCliOptions.NumericOptions; +import org.opencb.opencga.app.cli.GeneralCliOptions.StudyOption; +import org.opencb.opencga.app.cli.main.options.commons.AclCommandOptions; +import org.opencb.opencga.app.cli.main.options.commons.AnnotationCommandOptions; +import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.models.file.File; + +import java.util.List; + +/** + * Created by sgallego on 6/14/16. + */ +@Parameters(commandNames = {"meta"}, commandDescription = "Meta commands") +public class MetaCommandOptions { + + public final StatusCommandOptions statusCommandOptions; + public final AboutCommandOptions aboutCommandOptions; + public final PingCommandOptions pingCommandOptions; + public final ApiCommandOptions apiCommandOptions; + + public JCommander jCommander; + public CommonCommandOptions commonCommandOptions; + public DataModelOptions commonDataModelOptions; + public NumericOptions commonNumericOptions; + + public MetaCommandOptions(CommonCommandOptions commonCommandOptions, DataModelOptions dataModelOptions, NumericOptions numericOptions, + JCommander jCommander) { + + this.commonCommandOptions = commonCommandOptions; + this.commonDataModelOptions = dataModelOptions; + this.commonNumericOptions = numericOptions; + this.jCommander = jCommander; + + this.statusCommandOptions = new StatusCommandOptions(); + this.aboutCommandOptions = new AboutCommandOptions(); + this.pingCommandOptions = new PingCommandOptions(); + this.apiCommandOptions = new ApiCommandOptions(); + } + + @Parameters(commandNames = {"status"}, commandDescription = "Get OpenCGA status.") + public class StatusCommandOptions { + + @ParametersDelegate + public CommonCommandOptions commonOptions = commonCommandOptions; + } + + @Parameters(commandNames = {"about"}, commandDescription = "Returns info about current OpenCGA code.") + public class AboutCommandOptions { + + @ParametersDelegate + public CommonCommandOptions commonOptions = commonCommandOptions; + } + + @Parameters(commandNames = {"ping"}, commandDescription = "Ping Opencga webservices.") + public class PingCommandOptions { + + @ParametersDelegate + public CommonCommandOptions commonOptions = commonCommandOptions; + } + + @Parameters(commandNames = {"api"}, commandDescription = "Reads the full API of the REST webservices") + public class ApiCommandOptions { + + @ParametersDelegate + public CommonCommandOptions commonOptions = commonCommandOptions; + + } + +} diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java index 902f2be69bb..5bd3bea4459 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java @@ -22,6 +22,8 @@ import org.opencb.opencga.client.rest.AbstractParentClient; import org.opencb.opencga.core.response.RestResponse; +import java.util.List; + /* * WARNING: AUTOGENERATED CODE @@ -62,9 +64,9 @@ public RestResponse about() throws ClientException { * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse api(ObjectMap params) throws ClientException { + public RestResponse api(ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); - return execute("meta", null, null, null, "api", params, GET, ObjectMap.class); + return execute("meta", null, null, null, "api", params, GET, List.class); } /** @@ -82,9 +84,9 @@ public RestResponse fail() throws ClientException { * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse ping() throws ClientException { + public RestResponse ping() throws ClientException { ObjectMap params = new ObjectMap(); - return execute("meta", null, null, null, "ping", params, GET, ObjectMap.class); + return execute("meta", null, null, null, "ping", params, GET, String.class); } /** diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/MetaWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/MetaWSServer.java index 40c42891ec2..87224fe1235 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/MetaWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/MetaWSServer.java @@ -88,12 +88,9 @@ public Response getAbout() { @GET @Path("/ping") - @ApiOperation(httpMethod = "GET", value = "Ping Opencga webservices.", response = Map.class) + @ApiOperation(httpMethod = "GET", value = "Ping Opencga webservices.", response = String.class) public Response ping() { - - OpenCGAResult queryResult = new OpenCGAResult(); - queryResult.setTime(0); - + OpenCGAResult queryResult = new OpenCGAResult<>(0, Collections.emptyList(), 1, Collections.singletonList("pong"), 1); return createOkResponse(queryResult); } @@ -220,7 +217,7 @@ private synchronized void updateHealthCheck() { @GET @Path("/api") - @ApiOperation(value = "API", response = Map.class) + @ApiOperation(value = "API", response = List.class) public Response api(@ApiParam(value = "List of categories to get API from") @QueryParam("category") String categoryStr) { List> api = new ArrayList<>(20); Map classes = new LinkedHashMap<>(); From b4f7fa41b9e85f249bb8b0084f473a49e57bc169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 23 Mar 2021 14:45:41 +0000 Subject: [PATCH 117/412] k8s: Fix k8s job name generation to avoid colisions. --- .../master/monitor/executors/K8SExecutor.java | 15 ++++++++----- .../monitor/executors/K8SExecutorTest.java | 22 ++++++++++++++----- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java index a329d36038a..f5d45c123a7 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java @@ -288,8 +288,8 @@ private boolean shouldAddDockerDaemon(String queue) { * @link https://github.com/kubernetes/kubernetes/blob/c560907/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go#L135 * @return valid name */ - protected static String buildJobName(String jobId) { - jobId = jobId.replace("_", "-"); + protected static String buildJobName(String jobIdInput) { + String jobId = jobIdInput.replace("_", "-"); int[] invalidChars = jobId .chars() .filter(c -> c != '-' && !StringUtils.isAlphanumeric(String.valueOf((char) c))) @@ -297,13 +297,18 @@ protected static String buildJobName(String jobId) { for (int invalidChar : invalidChars) { jobId = jobId.replace(((char) invalidChar), '-'); } - String jobName = ("opencga-job-" + jobId).toLowerCase(); - if (jobName.length() > 63) { + jobId = jobId.toLowerCase(); + boolean jobIdWithInvalidChars = !jobIdInput.equals(jobId); + + String jobName = ("opencga-job-" + jobId); + if (jobName.length() > 63 || jobIdWithInvalidChars && jobName.length() > (63 - 8)) { // Job Id too large. Shrink it! // NOTE: This shrinking MUST be predictable! jobName = jobName.substring(0, 27) - + "-" + DigestUtils.md5Hex(jobName).substring(0, 6).toLowerCase() + "-" + + "-" + DigestUtils.md5Hex(jobIdInput).substring(0, 6).toLowerCase() + "-" + jobName.substring(jobName.length() - 27); + } else if (jobIdWithInvalidChars) { + jobName += "-" + DigestUtils.md5Hex(jobIdInput).substring(0, 6).toLowerCase(); } return jobName; } diff --git a/opencga-master/src/test/java/org/opencb/opencga/master/monitor/executors/K8SExecutorTest.java b/opencga-master/src/test/java/org/opencb/opencga/master/monitor/executors/K8SExecutorTest.java index cdf18fdcfaf..160febac8a4 100644 --- a/opencga-master/src/test/java/org/opencb/opencga/master/monitor/executors/K8SExecutorTest.java +++ b/opencga-master/src/test/java/org/opencb/opencga/master/monitor/executors/K8SExecutorTest.java @@ -17,7 +17,6 @@ package org.opencb.opencga.master.monitor.executors; import org.junit.Test; -import org.opencb.opencga.core.common.TimeUtils; import static org.junit.Assert.assertEquals; @@ -25,14 +24,25 @@ public class K8SExecutorTest { @Test public void testBuildJobName() { - assertEquals("opencga-job-really-complicated-j-b-2---id", + assertEquals("opencga-job-really-complicated-j-b-2---id-e8b6f0", K8SExecutor.buildJobName("really_Complicated J@b 2£$ ID")); - String time = TimeUtils.getTime(); - String jobName = K8SExecutor.buildJobName("really_Complicated and extra super duper large job name for a simple task " + time); - String expected = "opencga-job-really-complicated--r-a-simple-task-" + time; + String jobName = K8SExecutor.buildJobName("really_Complicated and extra super duper large job name for a simple task 20210323122209"); + String expected = "opencga-job-really-complica-1d9128--simple-task-20210323122209"; assertEquals(expected, jobName); - assertEquals(expected.length(), jobName.length()); + + assertEquals("opencga-job-my-job-1-92b223", K8SExecutor.buildJobName("my job 1")); + assertEquals("opencga-job-my-job-1-f3eb13", K8SExecutor.buildJobName("my_job_1")); + assertEquals("opencga-job-my-job-1-672a51", K8SExecutor.buildJobName("my:job:1")); + assertEquals("opencga-job-my-job-1-94caca", K8SExecutor.buildJobName("My-job-1")); + assertEquals("opencga-job-my-job-1", K8SExecutor.buildJobName("my-job-1")); + + assertEquals("opencga-job-abcdefghijklmnopqrstuvwxyz12345678900987654321", K8SExecutor.buildJobName("abcdefghijklmnopqrstuvwxyz12345678900987654321")); + assertEquals("opencga-job-abcdefghijklmno-cb3af7-tuvwxyz12345678900987654321", K8SExecutor.buildJobName("ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678900987654321")); + assertEquals("opencga-job-abcdefghijklmno-47a86e-stuvwxyz1234567890098765432", K8SExecutor.buildJobName("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890098765432")); + assertEquals("opencga-job-abcdefghijklmno-9c2366-rstuvwxyz123456789009876543", K8SExecutor.buildJobName("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789009876543")); + assertEquals("opencga-job-abcdefghijklmnopqrstuvwxyz12345678900987654-890ca6", K8SExecutor.buildJobName("ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678900987654")); + assertEquals("opencga-job-abcdefghijklmnopqrstuvwxyz1234567890-016fd6", K8SExecutor.buildJobName("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")); } } From 45cc41a55965471bc0c64deb62d89af2a5698fd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 23 Mar 2021 17:51:42 +0000 Subject: [PATCH 118/412] storage: Do not use reserved param "output" to indicate output-table --- opencga-app/app/conf/hadoop/hadoop-scp.sh | 8 ++++---- .../annotation/mr/SampleIndexAnnotationLoaderDriver.java | 2 +- .../hadoop/variant/index/family/FamilyIndexDriver.java | 2 +- .../hadoop/variant/index/sample/SampleIndexDriver.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/opencga-app/app/conf/hadoop/hadoop-scp.sh b/opencga-app/app/conf/hadoop/hadoop-scp.sh index 91e10bbc715..869c724d290 100755 --- a/opencga-app/app/conf/hadoop/hadoop-scp.sh +++ b/opencga-app/app/conf/hadoop/hadoop-scp.sh @@ -40,7 +40,7 @@ fi SSH="${SSHPASS_CMD}ssh ${SSH_OPTS} ${HADOOP_SSH_USER}@${HADOOP_SSH_HOST}" -function r() { +function printAndRun() { CMD=$@ echo " $ "$CMD 1>&2 $CMD 1>&2 @@ -55,7 +55,7 @@ echo " * TARGET : ${USER}@${HOSTNAME}:${TARGET_FILE}" 1>&2 set -e echo "Check if source file exists" 1>&2 -r "${SSH} test -f ${SRC_FILE}" || (echo "Soruce file does not exist!" 1>&2 && exit 1) +printAndRun "${SSH} test -f ${SRC_FILE}" || (echo "Source file does not exist!" 1>&2 && exit 1) if [ -f ${TARGET_FILE} ]; then target_inode=`ls -i ${TARGET_FILE} | cut -d " " -f 1` @@ -73,8 +73,8 @@ fi echo "Copy file" CMD="${SSHPASS_CMD} scp -r ${SSH_OPTS} ${HADOOP_SSH_USER}@${HADOOP_SSH_HOST}:${SRC_FILE} ${TARGET_FILE}" #CMD="${SSHPASS_CMD} rsync -avz --remove-source-files -e ssh ${HADOOP_SSH_USER}@${HADOOP_SSH_HOST}:${SRC_FILE} ${TARGET_FILE}" -r $CMD +printAndRun $CMD echo "Remove file from Hadoop edge node" 1>&2 -r "${SSH} rm -rf ${SRC_FILE}" +printAndRun "${SSH} rm -rf ${SRC_FILE}" diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java index 9a4154edea8..d39749bef1d 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java @@ -39,7 +39,7 @@ public class SampleIndexAnnotationLoaderDriver extends AbstractVariantsTableDriver { private static final Logger LOGGER = LoggerFactory.getLogger(SampleIndexAnnotationLoaderDriver.class); - public static final String OUTPUT = "output"; + public static final String OUTPUT = "output-table"; public static final String SAMPLES = "samples"; public static final String SAMPLE_IDS = "sampleIds"; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java index 066c7abf73b..c3548ab0efc 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java @@ -48,7 +48,7 @@ public class FamilyIndexDriver extends AbstractVariantsTableDriver { public static final String TRIOS_COHORT = "triosCohort"; public static final String TRIOS_COHORT_DELETE = "triosCohortDelete"; public static final String OVERWRITE = "overwrite"; - public static final String OUTPUT = "output"; + public static final String OUTPUT = "output-table"; private static final String TRIOS_LIST = "FamilyIndexDriver.trios_list"; private static final int MISSING_SAMPLE = -1; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java index f72a5e85312..2b40ce87e4d 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java @@ -71,7 +71,7 @@ public class SampleIndexDriver extends AbstractVariantsTableDriver { private static final Logger LOGGER = LoggerFactory.getLogger(SampleIndexDriver.class); public static final String SAMPLES = "samples"; public static final String SAMPLE_IDS = "sampleIds"; - public static final String OUTPUT = "output"; + public static final String OUTPUT = "output-table"; public static final String SECONDARY_ONLY = "secondary-only"; // public static final String MAIN_ONLY = "main-only"; public static final String PARTIAL_SCAN_SIZE = "partial-scan-size"; From 3a2611d55abd48fbb679db1abe1668436b72aa91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 23 Mar 2021 19:06:07 +0000 Subject: [PATCH 119/412] analysis: Do not hide exceptions in CircosLocalAnalysisExecutor. --- .../circos/CircosLocalAnalysisExecutor.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java index d165a9dc645..7449ac4a260 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java @@ -25,7 +25,6 @@ import org.opencb.biodata.models.variant.avro.BreakendMate; import org.opencb.biodata.models.variant.avro.FileEntry; import org.opencb.biodata.models.variant.avro.StructuralVariation; -import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.DockerUtils; @@ -50,7 +49,6 @@ import java.util.*; import java.util.concurrent.*; -import static org.opencb.biodata.models.variant.avro.VariantType.*; import static org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis.DOCKER_INPUT_PATH; import static org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis.DOCKER_OUTPUT_PATH; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.STUDY; @@ -71,7 +69,7 @@ public class CircosLocalAnalysisExecutor extends CircosAnalysisExecutor implemen private boolean plotIndels = false; private boolean plotRearrangements = false; - private Map errors; + private ConcurrentHashMap errors; private Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -107,7 +105,7 @@ public void run() throws ToolException, IOException { ExecutorService threadPool = Executors.newFixedThreadPool(4); - errors = new HashMap<>(); + errors = new ConcurrentHashMap<>(); List> futureList = new ArrayList<>(4); futureList.add(threadPool.submit(getNamedThread("SNV", () -> snvQuery(query, storageManager)))); futureList.add(threadPool.submit(getNamedThread("COPY_NUMBER", () -> copyNumberQuery(query, storageManager)))); @@ -153,10 +151,16 @@ public void run() throws ToolException, IOException { logger.info("Execution time: " + TimeUtils.durationToString(stopWatch)); } else { StringBuilder msg = new StringBuilder(); - for (Map.Entry error : errors.entrySet()) { - msg.append("Error on track ").append(error.getKey()).append(": ").append(error.getValue()).append(". "); + for (Map.Entry error : errors.entrySet()) { + msg.append("Error on track ").append(error.getKey()).append(": ").append(error.getValue().getMessage()).append(". "); } - throw new ToolException(msg.toString()); + ToolException exception = new ToolException(msg.toString()); + if (errors.size() == 1) { + exception.initCause(errors.values().iterator().next()); + } else { + errors.values().forEach(exception::addSuppressed); + } + throw exception; } } @@ -232,7 +236,7 @@ private boolean snvQuery(Query query, VariantStorageManager storageManager) { } } } catch(Exception e) { - errors.put("SNV", e.getMessage()); + errors.put("SNV", e); return false; } finally { if (pw != null) { @@ -309,7 +313,7 @@ private boolean copyNumberQuery(Query query, VariantStorageManager storageManage } } } catch (Exception e) { - errors.put("COPY-NUMBER", e.getMessage()); + errors.put("COPY-NUMBER", e); return false; } finally { if (pw != null) { @@ -389,7 +393,7 @@ private boolean indelQuery(Query query, VariantStorageManager storageManager) { } } } catch(Exception e){ - errors.put("INDEL", e.getMessage()); + errors.put("INDEL", e); return false; // throw new ToolExecutorException(e); } finally { @@ -470,7 +474,7 @@ private boolean rearrangementQuery(Query query, VariantStorageManager storageMan } } } catch (Exception e) { - errors.put("REARRANGEMENT", e.getMessage()); + errors.put("REARRANGEMENT", e); return false; } finally { if (pw != null) { From 90228c8e6d13858e0e76a2d23fed4d6ae9d89088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 24 Mar 2021 09:37:54 +0000 Subject: [PATCH 120/412] storage: Improve sample/index/configure . Run a job to rebuild sample index. #1699 --- .../manager/VariantStorageManager.java | 24 ++++++++++++++--- .../storage/IndexFieldConfiguration.java | 27 +++++++++++++++++++ .../storage/SampleIndexConfiguration.java | 9 +++++++ .../opencb/opencga/core/tools/ToolParams.java | 4 +++ .../master/monitor/executors/K8SExecutor.java | 2 +- .../VariantOperationWebService.java | 12 ++------- 6 files changed, 64 insertions(+), 14 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java index f2d538ee797..21edd3e1307 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java @@ -47,6 +47,7 @@ import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.managers.StudyManager; +import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.models.cohort.Cohort; @@ -54,6 +55,8 @@ import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.individual.Individual; +import org.opencb.opencga.core.models.job.Job; +import org.opencb.opencga.core.models.operations.variant.VariantSampleIndexParams; import org.opencb.opencga.core.models.project.DataStore; import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.sample.Sample; @@ -96,6 +99,7 @@ import static org.opencb.commons.datastore.core.QueryOptions.*; import static org.opencb.opencga.analysis.variant.manager.operations.VariantFileIndexerOperationManager.FILE_GET_QUERY_OPTIONS; import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; +import static org.opencb.opencga.core.api.ParamConstants.STUDY_PARAM; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; import static org.opencb.opencga.storage.core.variant.adaptors.sample.VariantSampleDataManager.SAMPLE_BATCH_SIZE; import static org.opencb.opencga.storage.core.variant.adaptors.sample.VariantSampleDataManager.SAMPLE_BATCH_SIZE_DEFAULT; @@ -469,15 +473,29 @@ public ObjectMap configureStudy(String studyStr, ObjectMap params, String token) }); } - public void configureSampleIndex(String studyStr, SampleIndexConfiguration sampleIndexConfiguration, String token) + /** + * Modify SampleIndex configuration. Automatically submit a job to rebuild the sample index. + * @param studyStr Study identifier + * @param sampleIndexConfiguration New sample index configuration + * @param token User's token + * @return Result with VariantSampleIndexOperationTool job + * @throws CatalogException on catalog errors + * @throws StorageEngineException on storage engine errors + */ + public OpenCGAResult configureSampleIndex(String studyStr, SampleIndexConfiguration sampleIndexConfiguration, String token) throws CatalogException, StorageEngineException { - secureOperation("configure", studyStr, new ObjectMap(), token, engine -> { + return secureOperation("configure", studyStr, new ObjectMap(), token, engine -> { + sampleIndexConfiguration.validate(); String studyFqn = getStudyFqn(studyStr, token); engine.getMetadataManager().addSampleIndexConfiguration(studyFqn, sampleIndexConfiguration); catalogManager.getStudyManager() .setVariantEngineConfigurationSampleIndex(studyStr, sampleIndexConfiguration, token); - return null; + // If changes, launch sample-index-run + VariantSampleIndexParams params = + new VariantSampleIndexParams(Collections.singletonList(ParamConstants.ALL), true, true, false); + return catalogManager.getJobManager().submit(studyFqn, VariantSampleIndexOperationTool.ID, null, + params.toParams(STUDY_PARAM, studyFqn), token); }); } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java index c4ab60ad12b..ee91f2fe6c1 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java @@ -73,6 +73,33 @@ public IndexFieldConfiguration setValues(String[] values) { return this; } + public void validate() { + if (key == null) { + throw new IllegalArgumentException("Missing field KEY in index custom field"); + } + if (source == null) { + throw new IllegalArgumentException("Missing field SOURCE in index custom field " + key); + } + if (type == null) { + throw new IllegalArgumentException("Missing field TYPE in index custom field " + source + ":" + key); + } + switch (type) { + case RANGE: + if (thresholds == null || thresholds.length == 0) { + throw new IllegalArgumentException("Missing 'thresholds' for index custom field " + getId()); + } + break; + case CATEGORICAL: + case CATEGORICAL_MULTI_VALUE: + if (values == null || values.length == 0) { + throw new IllegalArgumentException("Missing 'values' for index custom field " + getId()); + } + break; + default: + throw new IllegalArgumentException("Unknown type " + type + " for index custom field " + getId()); + } + } + public enum Source { VARIANT, META, diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java index 3c423e65fbe..9d15d373344 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java @@ -42,6 +42,15 @@ public static SampleIndexConfiguration defaultConfiguration() { return sampleIndexConfiguration; } + public void validate() { + for (IndexFieldConfiguration customField : fileIndexConfiguration.getCustomFields()) { + customField.validate(); + } + for (PopulationFrequencyRange populationRange : populationRanges) { + populationRange.validate(); + } + } + public static class FileIndexConfiguration { private final List customFields = new ArrayList<>(); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/ToolParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/ToolParams.java index 7399e0210b3..30aaf6218ef 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/tools/ToolParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/ToolParams.java @@ -59,6 +59,10 @@ public Map toParams() { return map; } + public Map toParams(String key, String value) { + return toParams(new ObjectMap(key, value)); + } + public Map toParams(ObjectMap otherParams) { Map map = toParams(); addParams(map, otherParams); diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java index f5d45c123a7..bced9ff00e5 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java @@ -284,7 +284,7 @@ private boolean shouldAddDockerDaemon(String queue) { * DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must * start and end with an alphanumeric character (e.g. 'example.com', regex used for validation * is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*') - * @param jobId job Is + * @param jobIdInput job Is * @link https://github.com/kubernetes/kubernetes/blob/c560907/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go#L135 * @return valid name */ diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java index 539126ab396..1e452965e6a 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java @@ -235,19 +235,11 @@ public Response scoreDelete( @POST @Path("/variant/sample/index/configure") - @ApiOperation(value = "Update SampleIndex configuration", response = ObjectMap.class) + @ApiOperation(value = "Update SampleIndex configuration", response = Job.class) public Response sampleIndexConfigure( @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, @ApiParam(value = "New SampleIndexConfiguration") SampleIndexConfiguration sampleIndexConfiguration) { - return run(() -> { - StopWatch stopWatch = StopWatch.createStarted(); - variantManager.configureSampleIndex(study, sampleIndexConfiguration, token); - - return new DataResult<>() - .setResults(Collections.singletonList(sampleIndexConfiguration)) - .setNumResults(1) - .setTime(((int) stopWatch.getTime(TimeUnit.MILLISECONDS))); - }); + return run(() -> variantManager.configureSampleIndex(study, sampleIndexConfiguration, token)); } @POST From e883583ed87a676defc3448a98ad11dfac85dfe7 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 24 Mar 2021 12:09:44 +0100 Subject: [PATCH 121/412] catalog: add list of shared projects in User data model, closes #1728 --- .../AzureADAuthenticationManager.java | 3 +- .../LDAPAuthenticationManager.java | 2 +- .../opencga/catalog/db/api/UserDBAdaptor.java | 2 + .../catalog/db/mongodb/MongoDBAdaptor.java | 45 +++++ .../db/mongodb/ProjectMongoDBAdaptor.java | 3 +- .../db/mongodb/UserMongoDBAdaptor.java | 173 ++++++++++++++++-- .../catalog/managers/ProjectManager.java | 1 + .../db/mongodb/MongoDBAdaptorTest.java | 9 +- .../catalog/managers/CatalogManagerTest.java | 47 +++++ .../opencga/core/api/ParamConstants.java | 2 +- .../opencga/core/models/project/Project.java | 25 +++ .../opencb/opencga/core/models/user/User.java | 22 ++- 12 files changed, 310 insertions(+), 24 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/AzureADAuthenticationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/AzureADAuthenticationManager.java index bf8f05721a1..e894c873106 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/AzureADAuthenticationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/AzureADAuthenticationManager.java @@ -378,7 +378,8 @@ private List extractUserInformation(List(), attributes); + new UserQuota(-1, -1, -1, -1), Collections.emptyList(), Collections.emptyList(), Collections.emptyMap(), + new LinkedList<>(), attributes); userList.add(user); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/LDAPAuthenticationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/LDAPAuthenticationManager.java index fbd5ce79e60..b11913cf032 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/LDAPAuthenticationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/LDAPAuthenticationManager.java @@ -199,7 +199,7 @@ public List getRemoteUserInformation(List userStringList) throws C attributes.put("LDAP_RDN", rdn); User user = new User(uid, displayName, mail, usersSearch, new Account().setType(Account.AccountType.GUEST) .setAuthentication(new Account.AuthenticationOrigin(originId, false)), new UserInternal(new UserStatus()), - new UserQuota(-1, -1, -1, -1), new ArrayList<>(), new HashMap<>(), new LinkedList<>(), attributes); + new UserQuota(-1, -1, -1, -1), new ArrayList<>(), new ArrayList<>(), new HashMap<>(), new LinkedList<>(), attributes); userList.add(user); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java index ba096cd44f5..f453cc1943a 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java @@ -134,6 +134,8 @@ enum QueryParams implements QueryParam { PROJECT_ORGANIZATION("projects.organization", TEXT_ARRAY, ""), PROJECT_STATUS("projects.status", TEXT_ARRAY, ""), + SHARED_PROJECTS("sharedProjects", TEXT_ARRAY, ""), + TOOL_ID("tools.id", INTEGER_ARRAY, ""), TOOL_NAME("tools.name", TEXT_ARRAY, ""), TOOL_ALIAS("tools.alias", TEXT_ARRAY, ""), diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptor.java index c92b6223901..138493274f7 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptor.java @@ -486,6 +486,51 @@ boolean generateUidVersionQuery(Query query, List bsonQueryList) throws Ca return false; } + /** + * Extract a new QueryOptions object containing only the include/exclude of another nested object. + * Example: Let's say a user is querying the user collection adding include: projects.studies.fqn + * If we need to perform a different query in the study collection, we will want to obtain a new QueryOptions object containing: + * include: fqn + * + * For that scenario, the `key` value would be "projects.studies" + * + * @param options Original QueryOptions object. + * @param key Nested key by which to extract the new options. + * @return new QueryOptions object. + */ + protected QueryOptions extractNestedOptions(QueryOptions options, String key) { + QueryOptions studyOptions = new QueryOptions(); + + List includeList = options.getAsStringList(QueryOptions.INCLUDE); + List excludeList = options.getAsStringList(QueryOptions.EXCLUDE); + + String projectionKey = key.endsWith(".") ? key : key + "."; + + if (!includeList.isEmpty()) { + List studyIncludeList = new ArrayList<>(); + for (String includeKey : includeList) { + if (includeKey.startsWith(projectionKey)) { + studyIncludeList.add(includeKey.replace(projectionKey, "")); + } + } + if (!studyIncludeList.isEmpty()) { + studyOptions.put(QueryOptions.INCLUDE, studyIncludeList); + } + } else if (!excludeList.isEmpty()) { + List studyExcludeList = new ArrayList<>(); + for (String excludeKey : excludeList) { + if (excludeKey.startsWith(projectionKey)) { + studyExcludeList.add(excludeKey.replace(projectionKey, "")); + } + } + if (!studyExcludeList.isEmpty()) { + studyOptions.put(QueryOptions.EXCLUDE, studyExcludeList); + } + } + + return studyOptions; + } + /** * Removes any other entity projections made. This method should be called by any entity containing inner entities: * Family -> Individual; Individual -> Sample; File -> Sample; Cohort -> Sample diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java index 15fcc730519..c12b5f2a8a2 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java @@ -573,11 +573,12 @@ OpenCGAResult get(ClientSession clientSession, Query query, QueryOption if (options == null || !options.containsKey(QueryOptions.EXCLUDE) || (!options.getAsStringList(QueryOptions.EXCLUDE).contains("projects.studies") && !options.getAsStringList(QueryOptions.EXCLUDE).contains("studies"))) { + QueryOptions studyOptions = options == null ? QueryOptions.empty() : extractNestedOptions(options, "studies"); for (Project project : queryResult.getResults()) { Query studyQuery = new Query(StudyDBAdaptor.QueryParams.PROJECT_UID.key(), project.getUid()); try { OpenCGAResult studyDataResult = dbAdaptorFactory.getCatalogStudyDBAdaptor().get(clientSession, studyQuery, - options); + studyOptions); project.setStudies(studyDataResult.getResults()); } catch (CatalogDBException e) { logger.error("{}", e.getMessage(), e); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java index 5a7bf59ed96..a70475f65dc 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java @@ -33,6 +33,7 @@ import org.opencb.commons.utils.CryptoUtils; import org.opencb.opencga.catalog.db.api.DBIterator; import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor; +import org.opencb.opencga.catalog.db.api.StudyDBAdaptor; import org.opencb.opencga.catalog.db.api.UserDBAdaptor; import org.opencb.opencga.catalog.db.mongodb.converters.UserConverter; import org.opencb.opencga.catalog.db.mongodb.iterators.CatalogMongoDBIterator; @@ -40,10 +41,13 @@ import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogParameterException; +import org.opencb.opencga.catalog.managers.StudyManager; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.project.Project; +import org.opencb.opencga.core.models.study.Group; +import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.user.User; import org.opencb.opencga.core.models.user.UserFilter; import org.opencb.opencga.core.models.user.UserStatus; @@ -53,6 +57,7 @@ import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.function.Consumer; +import java.util.stream.Collectors; import static org.opencb.opencga.catalog.db.api.UserDBAdaptor.QueryParams.*; import static org.opencb.opencga.catalog.db.mongodb.MongoDBUtils.*; @@ -296,24 +301,168 @@ public OpenCGAResult stats(Query query) { @Override public OpenCGAResult get(Query query, QueryOptions options) throws CatalogDBException { - if (!query.containsKey(QueryParams.INTERNAL_STATUS_NAME.key())) { - query.append(QueryParams.INTERNAL_STATUS_NAME.key(), "!=" + Status.DELETED); - } Bson bson = parseQuery(query); - DataResult userDataResult = userCollection.find(bson, null, userConverter, options); + QueryOptions userOptions; + if (includeProjects(options)) { + userOptions = filterQueryOptions(options, Arrays.asList(ID.key(), PROJECTS_UID.key())); + } else { + userOptions = filterQueryOptions(options, Collections.singletonList(ID.key())); + } + DataResult userDataResult = userCollection.find(bson, null, userConverter, userOptions); + + if (includeStudies(options)) { + for (User user : userDataResult.getResults()) { + if (user.getProjects() != null) { + for (Project project : user.getProjects()) { + Query query1 = new Query(StudyDBAdaptor.QueryParams.PROJECT_UID.key(), project.getUid()); + QueryOptions studyOptions = extractNestedOptions(options, PROJECTS.key() + ".studies."); + OpenCGAResult studyResult = dbAdaptorFactory.getCatalogStudyDBAdaptor().get(query1, studyOptions); + project.setStudies(studyResult.getResults()); + } + } + } + } + + if (includeSharedProjects(options)) { + QueryOptions sharedProjectOptions = extractNestedOptions(options, SHARED_PROJECTS.key()); + sharedProjectOptions = filterQueryOptions(sharedProjectOptions, Arrays.asList(ProjectDBAdaptor.QueryParams.FQN.key(), + "studies." + StudyDBAdaptor.QueryParams.FQN.key(), "studies." + StudyDBAdaptor.QueryParams.GROUPS.key())); + extractSharedProjects(userDataResult, sharedProjectOptions); + } + + return new OpenCGAResult<>(userDataResult); + } + private boolean includeProjects(QueryOptions options) { + List includeList = options.getAsStringList(QueryOptions.INCLUDE); + List excludeList = options.getAsStringList(QueryOptions.EXCLUDE); + + if (!includeList.isEmpty()) { + for (String includeKey : includeList) { + if (includeKey.startsWith(PROJECTS.key() + ".")) { + return true; + } + } + return false; + } else if (!excludeList.isEmpty()) { + for (String excludeKey : excludeList) { + if (excludeKey.equals(PROJECTS.key())) { + return false; + } + } + } + + return true; + } + + private boolean includeSharedProjects(QueryOptions options) { + List includeList = options.getAsStringList(QueryOptions.INCLUDE); + List excludeList = options.getAsStringList(QueryOptions.EXCLUDE); + + if (!includeList.isEmpty()) { + for (String includeKey : includeList) { + if (includeKey.startsWith(SHARED_PROJECTS.key() + ".")) { + return true; + } + } + return false; + } else if (!excludeList.isEmpty()) { + for (String excludeKey : excludeList) { + if (excludeKey.equals(SHARED_PROJECTS.key())) { + return false; + } + } + } + + return true; + } + + private boolean includeStudies(QueryOptions options) { + List includeList = options.getAsStringList(QueryOptions.INCLUDE); + List excludeList = options.getAsStringList(QueryOptions.EXCLUDE); + + if (!includeList.isEmpty()) { + for (String includeKey : includeList) { + if (includeKey.startsWith(PROJECTS.key() + ".studies.")) { + return true; + } + } + return false; + } else if (!excludeList.isEmpty()) { + for (String excludeKey : excludeList) { + if (excludeKey.equals(PROJECTS.key() + ".studies")) { + return false; + } + } + } + + return true; + } + + private void extractSharedProjects(DataResult userDataResult, QueryOptions options) throws CatalogDBException { + Set users = userDataResult.getResults().stream().map(User::getId).collect(Collectors.toSet()); + + Map projectMap = new HashMap<>(); + Map studyMap = new HashMap<>(); + Map studyProjectMap = new HashMap<>(); + Map> userStudyMap = new HashMap<>(); + OpenCGAResult result = dbAdaptorFactory.getCatalogProjectDbAdaptor().get(new Query(), options); + for (Project project : result.getResults()) { + projectMap.put(project.getFqn(), project); + if (project.getStudies() != null) { + for (Study study : project.getStudies()) { + studyMap.put(study.getFqn(), study); + studyProjectMap.put(study.getFqn(), project.getFqn()); + + String owner = study.getFqn().split("@")[0]; + + if (study.getGroups() != null) { + for (Group group : study.getGroups()) { + if (StudyManager.MEMBERS.equals(group.getId())) { + // Add all the users that should be able to see the study to the map + for (String userId : group.getUserIds()) { + // Exclude owner of the project + if (!owner.equals(userId)) { + if (users.contains(userId)) { + if (!userStudyMap.containsKey(userId)) { + userStudyMap.put(userId, new ArrayList<>()); + } + userStudyMap.get(userId).add(study.getFqn()); + } + } + } + break; + } + } + } + } + } + } + + // Add SharedProject information for (User user : userDataResult.getResults()) { - if (user.getProjects() != null) { - List projects = new ArrayList<>(user.getProjects().size()); - for (Project project : user.getProjects()) { - Query query1 = new Query(ProjectDBAdaptor.QueryParams.UID.key(), project.getUid()); - OpenCGAResult projectDataResult = dbAdaptorFactory.getCatalogProjectDbAdaptor().get(query1, options); - projects.add(projectDataResult.first()); + if (userStudyMap.containsKey(user.getId())) { + Map> projectStudyMap = new HashMap<>(); + + for (String studyFqn : userStudyMap.get(user.getId())) { + // Obtain the project fqn where the study belongs + String projectFqn = studyProjectMap.get(studyFqn); + if (!projectStudyMap.containsKey(projectFqn)) { + projectStudyMap.put(projectFqn, new ArrayList<>()); + } + projectStudyMap.get(projectFqn).add(studyMap.get(studyFqn)); + } + + List projectList = new ArrayList<>(projectStudyMap.size()); + for (Map.Entry> entry : projectStudyMap.entrySet()) { + Project project = new Project(projectMap.get(entry.getKey())); + project.setStudies(entry.getValue()); + projectList.add(project); } - user.setProjects(projects); + + user.setSharedProjects(projectList); } } - return new OpenCGAResult<>(userDataResult); } @Override diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java index a945b19582f..04a991c903e 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java @@ -175,6 +175,7 @@ private OpenCGAResult getProject(String userId, String projectUuid, Que Query query = new Query() .append(ProjectDBAdaptor.QueryParams.USER_ID.key(), userId) .append(ProjectDBAdaptor.QueryParams.UUID.key(), projectUuid); + options = ParamUtils.defaultObject(options, QueryOptions::new); return projectDBAdaptor.get(query, options); } diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorTest.java index 726ab0e75b9..1afbd8c4453 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorTest.java @@ -48,8 +48,8 @@ import org.opencb.opencga.core.models.project.ProjectInternal; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Group; -import org.opencb.opencga.core.models.study.StudyInternal; import org.opencb.opencga.core.models.study.Study; +import org.opencb.opencga.core.models.study.StudyInternal; import org.opencb.opencga.core.models.user.User; import org.opencb.opencga.core.models.user.UserInternal; import org.opencb.opencga.core.models.user.UserQuota; @@ -175,7 +175,7 @@ public void initDefaultCatalogDB() throws CatalogException { * Let's init the database with some basic data to perform each of the tests */ user1 = new User("jcoll", "Jacobo Coll", "jcoll@ebi", "", null, new UserInternal(new UserStatus()), new UserQuota(-1, -1, -1, -1), - Collections.emptyList(), new HashMap<>(), new LinkedList<>(), new HashMap<>()); + Collections.emptyList(), Collections.emptyList(), new HashMap<>(), new LinkedList<>(), new HashMap<>()); catalogUserDBAdaptor.insert(user1, "1234", null); catalogProjectDBAdaptor.insert(new Project("P1", "project", "", null, 1, new ProjectInternal(new Datastores(), new Status())), "jcoll", null); @@ -188,7 +188,7 @@ public void initDefaultCatalogDB() throws CatalogException { catalogUserDBAdaptor.insert(user2, "1111", null); user3 = new User("imedina", "Nacho", "nacho@gmail", "SPAIN", null, new UserInternal(new UserStatus()), new UserQuota(-1, -1, -1, -1), - Collections.emptyList(), new HashMap<>(), new LinkedList<>(), new HashMap<>()); + Collections.emptyList(), Collections.emptyList(), new HashMap<>(), new LinkedList<>(), new HashMap<>()); catalogUserDBAdaptor.insert(user3, "2222", null); catalogProjectDBAdaptor.insert(new Project("pr1", "90 GigaGenomes", null, "very long description", null, Collections.emptyList(), 1, new ProjectInternal(new Datastores(), new Status()), Collections.emptyMap() @@ -205,7 +205,8 @@ public void initDefaultCatalogDB() throws CatalogException { null, null, 1, new CustomStatus(), new StudyInternal(new Status()), null, Collections.emptyMap()), null); user4 = new User("pfurio", "Pedro", "pfurio@blabla", "Organization", null, new UserInternal(new UserStatus()), - new UserQuota(-1, -1, -1, -1), Collections.emptyList(), new HashMap<>(), new LinkedList<>(), new HashMap<>()); + new UserQuota(-1, -1, -1, -1), Collections.emptyList(), Collections.emptyList(), new HashMap<>(), new LinkedList<>(), + new HashMap<>()); catalogUserDBAdaptor.insert(user4, "pfuriopass", null); catalogProjectDBAdaptor.insert(new Project("pr", "lncRNAs", null, "My description", null, diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java index b02bf5b6c8a..0cc782b3ea0 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java @@ -18,6 +18,7 @@ import com.mongodb.BasicDBObject; import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.Ignore; import org.junit.Test; import org.opencb.biodata.models.clinical.ClinicalComment; @@ -116,6 +117,52 @@ public void testGetUserInfo() throws CatalogException { } } + @Test + public void testUserInfoProjections() throws CatalogException { + QueryOptions options = new QueryOptions() + .append(QueryOptions.INCLUDE, UserDBAdaptor.QueryParams.PROJECTS_ID.key()); + DataResult user = catalogManager.getUserManager().get("user", options, token); + assertNotNull(user.first().getProjects()); + assertTrue(StringUtils.isNotEmpty(user.first().getProjects().get(0).getId())); + assertTrue(StringUtils.isEmpty(user.first().getProjects().get(0).getName())); + assertNull(user.first().getProjects().get(0).getStudies()); + + options = new QueryOptions() + .append(QueryOptions.INCLUDE, UserDBAdaptor.QueryParams.PROJECTS.key() + ".studies." + + StudyDBAdaptor.QueryParams.FQN.key()); + user = catalogManager.getUserManager().get("user", options, token); + assertNotNull(user.first().getProjects()); + assertEquals(2, user.first().getProjects().get(0).getStudies().size()); + assertTrue(StringUtils.isNotEmpty(user.first().getProjects().get(0).getStudies().get(0).getFqn())); + assertTrue(StringUtils.isEmpty(user.first().getProjects().get(0).getStudies().get(0).getName())); + + options = new QueryOptions() + .append(QueryOptions.INCLUDE, UserDBAdaptor.QueryParams.SHARED_PROJECTS.key() + ".studies." + + StudyDBAdaptor.QueryParams.FQN.key()); + user = catalogManager.getUserManager().get("user2", options, sessionIdUser2); + assertEquals(0, user.first().getSharedProjects().size()); + + // Grant permissions to user2 to access study of user1 + catalogManager.getStudyManager().updateGroup(studyFqn, StudyManager.MEMBERS, ParamUtils.BasicUpdateAction.ADD, + new GroupUpdateParams(Collections.singletonList("user2")), token); + + options = new QueryOptions() + .append(QueryOptions.INCLUDE, UserDBAdaptor.QueryParams.SHARED_PROJECTS.key() + ".studies." + + StudyDBAdaptor.QueryParams.FQN.key()); + user = catalogManager.getUserManager().get("user2", options, sessionIdUser2); + assertEquals(1, user.first().getSharedProjects().size()); + assertEquals(studyFqn, user.first().getSharedProjects().get(0).getStudies().get(0).getFqn()); + assertNull(user.first().getSharedProjects().get(0).getStudies().get(0).getId()); + + options = new QueryOptions() + .append(QueryOptions.INCLUDE, UserDBAdaptor.QueryParams.SHARED_PROJECTS.key() + ".studies." + + StudyDBAdaptor.QueryParams.ID.key()); + user = catalogManager.getUserManager().get("user2", options, sessionIdUser2); + assertEquals(1, user.first().getSharedProjects().size()); + assertEquals(studyFqn, user.first().getSharedProjects().get(0).getStudies().get(0).getFqn()); + assertNotNull(user.first().getSharedProjects().get(0).getStudies().get(0).getId()); + } + @Test public void testModifyUser() throws CatalogException, InterruptedException, IOException { ObjectMap params = new ObjectMap(); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index 4786e3af637..09589a521e3 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -216,7 +216,7 @@ public class ParamConstants { public static final String PANEL_SOURCE = "source"; public static final String PANEL_SOURCE_DESCRIPTION = "Comma separated list of sources to import panels from. Current supported " - + "sources are 'panelapp' and 'genecensus'"; + + "sources are 'panelapp' and 'cancer-gene-census'"; public static final String PANEL_SOURCE_ID = "id"; public static final String PANEL_SOURCE_ID_DESCRIPTION = "Comma separated list of panel IDs to be imported from the defined source." + "If 'source' is provided and 'id' is empty, it will import all the panels from the source. When 'id' is provided, only one " diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/project/Project.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/project/Project.java index efa83dd3c3d..a3a9784dd39 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/project/Project.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/project/Project.java @@ -72,6 +72,31 @@ public Project(String id, String name, String creationDate, String description, this.attributes = attributes; } + // Clone a project + public Project(Project project) { + this(project.getUid(), project.getId(), project.getName(), project.getUuid(), project.getFqn(), project.getCreationDate(), + project.getModificationDate(), project.getDescription(), project.getOrganism(), project.getCurrentRelease(), + project.getStudies(), project.getInternal(), project.getAttributes()); + } + + public Project(long uid, String id, String name, String uuid, String fqn, String creationDate, String modificationDate, + String description, ProjectOrganism organism, int currentRelease, List studies, ProjectInternal internal, + Map attributes) { + super(uid); + this.id = id; + this.name = name; + this.uuid = uuid; + this.fqn = fqn; + this.creationDate = creationDate; + this.modificationDate = modificationDate; + this.description = description; + this.organism = organism; + this.currentRelease = currentRelease; + this.studies = studies; + this.internal = internal; + this.attributes = attributes; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("Project{"); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/user/User.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/user/User.java index 942002c2baf..71b387448c4 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/user/User.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/user/User.java @@ -40,6 +40,7 @@ public class User { private UserQuota quota; private List projects; + private List sharedProjects; private Map configs; private List filters; @@ -49,16 +50,18 @@ public User() { } public User(String id, Account account) { - this(id, id, null, null, account, new UserInternal(new UserStatus()), null, Collections.emptyList(), Collections.emptyMap(), - new LinkedList<>(), Collections.emptyMap()); + this(id, id, null, null, account, new UserInternal(new UserStatus()), null, Collections.emptyList(), Collections.emptyList(), + Collections.emptyMap(), new LinkedList<>(), Collections.emptyMap()); } public User(String id, String name, String email, String organization, UserInternal internal) { - this(id, name, email, organization, null, internal, null, new ArrayList<>(), new HashMap<>(), new LinkedList<>(), new HashMap<>()); + this(id, name, email, organization, null, internal, null, new ArrayList<>(), new ArrayList<>(), new HashMap<>(), new LinkedList<>(), + new HashMap<>()); } public User(String id, String name, String email, String organization, Account account, UserInternal internal, UserQuota quota, - List projects, Map configs, List filters, Map attributes) { + List projects, List sharedProjects, Map configs, List filters, + Map attributes) { this.id = id; this.name = name; this.email = email; @@ -67,6 +70,7 @@ public User(String id, String name, String email, String organization, Account a this.internal = internal; this.quota = quota; this.projects = projects; + this.sharedProjects = sharedProjects; this.configs = configs; this.filters = filters; this.attributes = attributes; @@ -83,6 +87,7 @@ public String toString() { sb.append(", internal=").append(internal); sb.append(", quota=").append(quota); sb.append(", projects=").append(projects); + sb.append(", sharedProjects=").append(sharedProjects); sb.append(", configs=").append(configs); sb.append(", filters=").append(filters); sb.append(", attributes=").append(attributes); @@ -162,6 +167,15 @@ public User setProjects(List projects) { return this; } + public List getSharedProjects() { + return sharedProjects; + } + + public User setSharedProjects(List sharedProjects) { + this.sharedProjects = sharedProjects; + return this; + } + public Map getConfigs() { return configs; } From 8fdeec79673cd5bbc818e79e8cefc6d55e9d364c Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 24 Mar 2021 14:38:38 +0100 Subject: [PATCH 122/412] server: add new webservice to search OpenCGA users, closes #1729 --- .../opencga/catalog/audit/AuditManager.java | 2 +- .../authorization/AuthorizationManager.java | 4 +- .../CatalogAuthorizationManager.java | 9 ++- .../opencga/catalog/db/api/UserDBAdaptor.java | 3 + .../db/mongodb/UserMongoDBAdaptor.java | 3 + .../catalog/managers/AdminManager.java | 76 +++++++++++++++++++ .../catalog/managers/CatalogManager.java | 8 +- .../opencga/catalog/managers/JobManager.java | 4 +- .../catalog/managers/ProjectManager.java | 6 +- .../opencga/core/api/ParamConstants.java | 9 +++ .../master/monitor/executors/K8SExecutor.java | 2 +- .../server/rest/admin/AdminWSServer.java | 23 ++++++ 12 files changed, 139 insertions(+), 10 deletions(-) create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java index 0fdcbd47250..d70a4be2f77 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java @@ -230,7 +230,7 @@ public OpenCGAResult groupBy(Query query, String fields, QueryOptions options, S public OpenCGAResult groupBy(Query query, List fields, QueryOptions options, String token) throws CatalogException { String userId = catalogManager.getUserManager().getUserId(token); - if (authorizationManager.checkIsAdmin(userId)) { + if (authorizationManager.isAdmin(userId)) { return auditDBAdaptor.groupBy(query, fields, options); } throw new CatalogAuthorizationException("Only root of OpenCGA can query the audit database"); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java index 25d7c557c9b..0c86c5d0ba7 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java @@ -118,7 +118,9 @@ void checkUpdateGroupPermissions(long studyId, String userId, String group, Para void checkCanCreateUpdateDeleteVariableSets(long studyId, String userId) throws CatalogException; - Boolean checkIsAdmin(String user); + Boolean isAdmin(String user); + + void checkIsAdmin(String user) throws CatalogException; void checkIsOwnerOrAdmin(long studyId, String userId) throws CatalogException; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java index f093fbdfa66..3bfef7b0ddc 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java @@ -258,10 +258,17 @@ public void checkCanCreateUpdateDeleteVariableSets(long studyId, String userId) } @Override - public Boolean checkIsAdmin(String user) { + public Boolean isAdmin(String user) { return user.equals(OPENCGA); } + @Override + public void checkIsAdmin(String user) throws CatalogException { + if (!isAdmin(user)) { + throw new CatalogAuthorizationException("Only ADMINISTRATOR users are allowed to perform this action"); + } + } + @Override public void checkIsOwnerOrAdmin(long studyId, String userId) throws CatalogException { if (!isOwnerOrAdmin(studyId, userId)) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java index f453cc1943a..f5e7e7593e0 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java @@ -121,6 +121,9 @@ enum QueryParams implements QueryParam { INTERNAL_STATUS_NAME("internal.status.name", TEXT, ""), INTERNAL_STATUS_DATE("internal.status.date", TEXT, ""), ACCOUNT("account", TEXT_ARRAY, ""), + ACCOUNT_TYPE("account.type", TEXT, ""), + ACCOUNT_AUTHENTICATION_ID("account.authentication.id", TEXT, ""), + ACCOUNT_CREATION_DATE("account.creationDate", TEXT, ""), SIZE("size", INTEGER_ARRAY, ""), QUOTA("quota", INTEGER_ARRAY, ""), ATTRIBUTES("attributes", TEXT, ""), // "Format: where is [<|<=|>|>=|==|!=|~|!~]" diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java index a70475f65dc..4e4b7f25987 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java @@ -768,6 +768,9 @@ private Bson parseQuery(Query query) throws CatalogDBException { case INTERNAL_STATUS_DATE: case SIZE: case QUOTA: + case ACCOUNT_TYPE: + case ACCOUNT_AUTHENTICATION_ID: + case ACCOUNT_CREATION_DATE: case PROJECTS: case PROJECTS_UID: case PROJECT_NAME: diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java new file mode 100644 index 00000000000..fd879b348d1 --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java @@ -0,0 +1,76 @@ +package org.opencb.opencga.catalog.managers; + +import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.catalog.audit.AuditManager; +import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; +import org.opencb.opencga.catalog.db.DBAdaptorFactory; +import org.opencb.opencga.catalog.db.api.UserDBAdaptor; +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.io.CatalogIOManager; +import org.opencb.opencga.catalog.utils.ParamUtils; +import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.user.User; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AdminManager extends AbstractManager { + + private final CatalogIOManager catalogIOManager; + protected static Logger logger = LoggerFactory.getLogger(AdminManager.class); + + AdminManager(AuthorizationManager authorizationManager, AuditManager auditManager, CatalogManager catalogManager, + DBAdaptorFactory catalogDBAdaptorFactory, CatalogIOManager catalogIOManager, Configuration configuration) + throws CatalogException { + super(authorizationManager, auditManager, catalogManager, catalogDBAdaptorFactory, configuration); + this.catalogIOManager = catalogIOManager; + } + + public OpenCGAResult userSearch(Query query, QueryOptions options, String token) + throws CatalogException { + query = ParamUtils.defaultObject(query, Query::new); + options = ParamUtils.defaultObject(options, QueryOptions::new); + + ObjectMap auditParams = new ObjectMap() + .append("query", query) + .append("options", options) + .append("token", token); + String userId = catalogManager.getUserManager().getUserId(token); + try { + authorizationManager.checkIsAdmin(userId); + + // Fix query object + if (query.containsKey(ParamConstants.USER)) { + query.put(UserDBAdaptor.QueryParams.ID.key(), query.get(ParamConstants.USER)); + query.remove(ParamConstants.USER); + } + if (query.containsKey(ParamConstants.USER_ACCOUNT_TYPE)) { + query.put(UserDBAdaptor.QueryParams.ACCOUNT_TYPE.key(), query.get(ParamConstants.USER_ACCOUNT_TYPE)); + query.remove(ParamConstants.USER_ACCOUNT_TYPE); + } + if (query.containsKey(ParamConstants.USER_AUTHENTICATION_ORIGIN)) { + query.put(UserDBAdaptor.QueryParams.ACCOUNT_AUTHENTICATION_ID.key(), query.get(ParamConstants.USER_AUTHENTICATION_ORIGIN)); + query.remove(ParamConstants.USER_AUTHENTICATION_ORIGIN); + } + if (query.containsKey(ParamConstants.USER_CREATION_DATE)) { + query.put(UserDBAdaptor.QueryParams.ACCOUNT_CREATION_DATE.key(), query.get(ParamConstants.USER_CREATION_DATE)); + query.remove(ParamConstants.USER_CREATION_DATE); + } + + OpenCGAResult userDataResult = userDBAdaptor.get(query, options); + auditManager.auditSearch(userId, Enums.Resource.USER, "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + return userDataResult; + } catch (CatalogException e) { + auditManager.auditSearch(userId, Enums.Resource.USER, "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + throw e; + } + } + +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java index d0aee0167da..3bf95cb569f 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java @@ -61,6 +61,7 @@ public class CatalogManager implements AutoCloseable { private IOManagerFactory ioManagerFactory; private CatalogIOManager catalogIOManager; + private AdminManager adminManager; private UserManager userManager; private ProjectManager projectManager; private StudyManager studyManager; @@ -101,6 +102,7 @@ private void configureManagers(Configuration configuration) throws CatalogExcept authorizationManager = new CatalogAuthorizationManager(this.catalogDBAdaptorFactory, configuration); auditManager = new AuditManager(authorizationManager, this, this.catalogDBAdaptorFactory, configuration); + adminManager = new AdminManager(authorizationManager, auditManager, this, catalogDBAdaptorFactory, catalogIOManager, configuration); userManager = new UserManager(authorizationManager, auditManager, this, catalogDBAdaptorFactory, catalogIOManager, configuration); projectManager = new ProjectManager(authorizationManager, auditManager, this, catalogDBAdaptorFactory, catalogIOManager, configuration); @@ -212,7 +214,7 @@ public void installIndexes(String token, boolean test) throws CatalogException { public void deleteCatalogDB(String token) throws CatalogException, URISyntaxException { String userId = userManager.getUserId(token); - if (!authorizationManager.checkIsAdmin(userId)) { + if (!authorizationManager.isAdmin(userId)) { throw new CatalogException("Only the admin can delete the database"); } @@ -270,6 +272,10 @@ public void close() throws CatalogException { catalogDBAdaptorFactory.close(); } + public AdminManager getAdminManager() { + return adminManager; + } + public UserManager getUserManager() { return userManager; } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java index 76a07f1b378..71fcbbde7d5 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java @@ -496,14 +496,14 @@ public OpenCGAResult submit(String studyStr, String toolId, Enums.Priority public OpenCGAResult count(Query query, String token) throws CatalogException { String userId = userManager.getUserId(token); - authorizationManager.checkIsAdmin(userId); + authorizationManager.isAdmin(userId); return jobDBAdaptor.count(query); } public DBIterator iterator(Query query, QueryOptions options, String token) throws CatalogException { String userId = userManager.getUserId(token); - authorizationManager.checkIsAdmin(userId); + authorizationManager.isAdmin(userId); return jobDBAdaptor.iterator(query, options); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java index 04a991c903e..5e8450d9a0d 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java @@ -554,7 +554,7 @@ public OpenCGAResult incrementRelease(String projectStr, String session public void importReleases(String owner, String inputDirStr, String sessionId) throws CatalogException, IOException { String userId = catalogManager.getUserManager().getUserId(sessionId); - if (!authorizationManager.checkIsAdmin(userId)) { + if (!authorizationManager.isAdmin(userId)) { throw new CatalogAuthorizationException("Only admin of OpenCGA is authorised to import data"); } @@ -670,7 +670,7 @@ public void importReleases(String owner, String inputDirStr, String sessionId) t public void exportByFileNames(String studyStr, File outputDir, File filePath, String token) throws CatalogException { String userId = catalogManager.getUserManager().getUserId(token); - if (!authorizationManager.checkIsAdmin(userId)) { + if (!authorizationManager.isAdmin(userId)) { throw new CatalogAuthorizationException("Only admin of OpenCGA is authorised to export data"); } @@ -854,7 +854,7 @@ private void exportToFile(List dataList, File file, ObjectMapper objectM public void exportReleases(String projectStr, int release, String outputDirStr, String sessionId) throws CatalogException { String userId = catalogManager.getUserManager().getUserId(sessionId); - if (!authorizationManager.checkIsAdmin(userId)) { + if (!authorizationManager.isAdmin(userId)) { throw new CatalogAuthorizationException("Only admin of OpenCGA is authorised to export data"); } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index 09589a521e3..d638f62e9d9 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -92,7 +92,16 @@ public class ParamConstants { public static final String MEMBERS_GROUP = "@members"; public static final String ADMINS_GROUP = "@admins"; + // --------------------------------------------- + + public static final String USER = "user"; public static final String USER_DESCRIPTION = "User ID"; + public static final String USER_ACCOUNT_TYPE = "account"; + public static final String USER_ACCOUNT_TYPE_DESCRIPTION = "Account type [GUEST, FULL, ADMINISTRATOR]"; + public static final String USER_AUTHENTICATION_ORIGIN = "authenticationId"; + public static final String USER_AUTHENTICATION_ORIGIN_DESCRIPTION = "Authentication origin ID"; + public static final String USER_CREATION_DATE = "creationDate"; + public static final String USER_CREATION_DATE_DESCRIPTION = CREATION_DATE_DESCRIPTION; // --------------------------------------------- diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java index f5d45c123a7..bced9ff00e5 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java @@ -284,7 +284,7 @@ private boolean shouldAddDockerDaemon(String queue) { * DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must * start and end with an alphanumeric character (e.g. 'example.com', regex used for validation * is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*') - * @param jobId job Is + * @param jobIdInput job Is * @link https://github.com/kubernetes/kubernetes/blob/c560907/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go#L135 * @return valid name */ diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/admin/AdminWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/admin/AdminWSServer.java index 28996f4c7ec..389524c567d 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/admin/AdminWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/admin/AdminWSServer.java @@ -35,6 +35,7 @@ import org.opencb.opencga.core.models.admin.*; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.job.Job; +import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Group; import org.opencb.opencga.core.models.user.Account; import org.opencb.opencga.core.models.user.User; @@ -64,6 +65,28 @@ public AdminWSServer(@Context UriInfo uriInfo, @Context HttpServletRequest httpS //******************************** USERS **********************************// + @GET + @Path("/users/search") + @ApiOperation(value = "User search method", response = Sample.class) + @ApiImplicitParams({ + @ApiImplicitParam(name = QueryOptions.INCLUDE, value = ParamConstants.INCLUDE_DESCRIPTION, example = "name,attributes", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.EXCLUDE, value = ParamConstants.EXCLUDE_DESCRIPTION, example = "id,status", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, defaultValue = "false", dataType = "boolean", paramType = "query") + }) + public Response userSearch( + @ApiParam(value = ParamConstants.USER_DESCRIPTION) @QueryParam(ParamConstants.USER) String user, + @ApiParam(value = ParamConstants.USER_ACCOUNT_TYPE_DESCRIPTION) @QueryParam(ParamConstants.USER_ACCOUNT_TYPE) String account, + @ApiParam(value = ParamConstants.USER_AUTHENTICATION_ORIGIN_DESCRIPTION) @QueryParam(ParamConstants.USER_AUTHENTICATION_ORIGIN) String authentication) { + try { + return createOkResponse(catalogManager.getAdminManager().userSearch(query, queryOptions, token)); + } catch (CatalogException e) { + return createErrorResponse(e); + } + + } + @POST @Path("/users/create") @Consumes(MediaType.APPLICATION_JSON) From b188e07257dd5c2e0164bb94a0571f81169c25ad Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 24 Mar 2021 15:02:24 +0100 Subject: [PATCH 123/412] catalog: fill creationDate on user creation --- .../java/org/opencb/opencga/catalog/managers/UserManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java index fbf7463d82a..f972d2a86e9 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java @@ -35,6 +35,7 @@ import org.opencb.opencga.catalog.io.CatalogIOManager; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.catalog.utils.UuidUtils; +import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.AuthenticationOrigin; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.common.Enums; @@ -188,6 +189,7 @@ public OpenCGAResult create(User user, String password, @Nullable String t if (user.getAccount().getType() == null) { user.getAccount().setType(Account.AccountType.GUEST); } + user.getAccount().setCreationDate(TimeUtils.getTime()); try { if (user.getProjects() != null && !user.getProjects().isEmpty()) { From e09694495f906fda3e91044986dfac40e7a97cfe Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 24 Mar 2021 17:01:14 +0100 Subject: [PATCH 124/412] catalog: add missing permission EXECUTE_JOBS to template --- .../authorization/AuthorizationManager.java | 39 +++++++------------ 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java index 0c86c5d0ba7..ef42a6ac867 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java @@ -38,6 +38,8 @@ import java.util.List; import java.util.Map; +import static org.opencb.opencga.core.models.study.StudyAclEntry.StudyPermissions.*; + /** * Created by pfurio on 12/05/16. */ @@ -53,35 +55,22 @@ static EnumSet getAdminAcls() { } static EnumSet getAnalystAcls() { - return EnumSet.of( - StudyAclEntry.StudyPermissions.WRITE_FILES, StudyAclEntry.StudyPermissions.VIEW_FILE_HEADER, - StudyAclEntry.StudyPermissions.VIEW_FILE_CONTENT, StudyAclEntry.StudyPermissions.VIEW_FILES, - StudyAclEntry.StudyPermissions.DOWNLOAD_FILES, StudyAclEntry.StudyPermissions.UPLOAD_FILES, - StudyAclEntry.StudyPermissions.WRITE_JOBS, StudyAclEntry.StudyPermissions.VIEW_JOBS, - StudyAclEntry.StudyPermissions.WRITE_SAMPLES, StudyAclEntry.StudyPermissions.VIEW_SAMPLES, - StudyAclEntry.StudyPermissions.WRITE_SAMPLE_ANNOTATIONS, StudyAclEntry.StudyPermissions.VIEW_SAMPLE_ANNOTATIONS, - StudyAclEntry.StudyPermissions.WRITE_INDIVIDUALS, StudyAclEntry.StudyPermissions.VIEW_INDIVIDUALS, - StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS, StudyAclEntry.StudyPermissions.VIEW_SAMPLE_VARIANTS, - StudyAclEntry.StudyPermissions.WRITE_INDIVIDUAL_ANNOTATIONS, StudyAclEntry.StudyPermissions.VIEW_INDIVIDUAL_ANNOTATIONS, - StudyAclEntry.StudyPermissions.WRITE_COHORTS, StudyAclEntry.StudyPermissions.VIEW_COHORTS, - StudyAclEntry.StudyPermissions.WRITE_COHORT_ANNOTATIONS, StudyAclEntry.StudyPermissions.VIEW_COHORT_ANNOTATIONS, - StudyAclEntry.StudyPermissions.WRITE_PANELS, StudyAclEntry.StudyPermissions.VIEW_PANELS, - StudyAclEntry.StudyPermissions.WRITE_FAMILIES, StudyAclEntry.StudyPermissions.VIEW_FAMILIES, - StudyAclEntry.StudyPermissions.WRITE_FAMILY_ANNOTATIONS, StudyAclEntry.StudyPermissions.VIEW_FAMILY_ANNOTATIONS, - StudyAclEntry.StudyPermissions.WRITE_CLINICAL_ANALYSIS, StudyAclEntry.StudyPermissions.VIEW_CLINICAL_ANALYSIS); + return EnumSet.of(WRITE_FILES, VIEW_FILE_HEADER, VIEW_FILE_CONTENT, VIEW_FILES, DOWNLOAD_FILES, UPLOAD_FILES, + EXECUTE_JOBS, WRITE_JOBS, VIEW_JOBS, + WRITE_SAMPLES, VIEW_SAMPLES, WRITE_SAMPLE_ANNOTATIONS, VIEW_SAMPLE_ANNOTATIONS, VIEW_AGGREGATED_VARIANTS, + VIEW_SAMPLE_VARIANTS, + WRITE_INDIVIDUALS, VIEW_INDIVIDUALS, WRITE_INDIVIDUAL_ANNOTATIONS, VIEW_INDIVIDUAL_ANNOTATIONS, + WRITE_COHORTS, VIEW_COHORTS, WRITE_COHORT_ANNOTATIONS, VIEW_COHORT_ANNOTATIONS, + WRITE_PANELS, VIEW_PANELS, + WRITE_FAMILIES, VIEW_FAMILIES, WRITE_FAMILY_ANNOTATIONS, VIEW_FAMILY_ANNOTATIONS, + WRITE_CLINICAL_ANALYSIS, VIEW_CLINICAL_ANALYSIS); } static EnumSet getViewOnlyAcls() { return EnumSet.of( - StudyAclEntry.StudyPermissions.VIEW_FILE_HEADER, StudyAclEntry.StudyPermissions.VIEW_FILE_CONTENT, - StudyAclEntry.StudyPermissions.VIEW_FILES, StudyAclEntry.StudyPermissions.DOWNLOAD_FILES, - StudyAclEntry.StudyPermissions.VIEW_JOBS, StudyAclEntry.StudyPermissions.VIEW_SAMPLES, - StudyAclEntry.StudyPermissions.VIEW_SAMPLE_ANNOTATIONS, StudyAclEntry.StudyPermissions.VIEW_INDIVIDUALS, - StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS, StudyAclEntry.StudyPermissions.VIEW_SAMPLE_VARIANTS, - StudyAclEntry.StudyPermissions.VIEW_INDIVIDUAL_ANNOTATIONS, StudyAclEntry.StudyPermissions.VIEW_COHORTS, - StudyAclEntry.StudyPermissions.VIEW_COHORT_ANNOTATIONS, StudyAclEntry.StudyPermissions.VIEW_PANELS, - StudyAclEntry.StudyPermissions.VIEW_FAMILIES, StudyAclEntry.StudyPermissions.VIEW_FAMILY_ANNOTATIONS, - StudyAclEntry.StudyPermissions.VIEW_CLINICAL_ANALYSIS); + VIEW_FILE_HEADER, VIEW_FILE_CONTENT, VIEW_FILES, DOWNLOAD_FILES, VIEW_JOBS, VIEW_SAMPLES, VIEW_SAMPLE_ANNOTATIONS, + VIEW_INDIVIDUALS, VIEW_AGGREGATED_VARIANTS, VIEW_SAMPLE_VARIANTS, VIEW_INDIVIDUAL_ANNOTATIONS, VIEW_COHORTS, + VIEW_COHORT_ANNOTATIONS, VIEW_PANELS, VIEW_FAMILIES, VIEW_FAMILY_ANNOTATIONS, VIEW_CLINICAL_ANALYSIS, EXECUTE_JOBS); } static EnumSet getLockedAcls() { From 0b7594070292a758b84f5ed634ead0d274bd10d6 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 25 Mar 2021 11:17:02 +0100 Subject: [PATCH 125/412] catalog: grant all permissions to OpenCGA administrator --- .../opencga/catalog/audit/AuditManager.java | 2 +- .../authorization/AuthorizationManager.java | 4 +- .../CatalogAuthorizationManager.java | 47 ++++++++++++------- .../catalog/managers/AdminManager.java | 2 +- .../catalog/managers/CatalogManager.java | 2 +- .../opencga/catalog/managers/JobManager.java | 4 +- .../catalog/managers/ProjectManager.java | 6 +-- 7 files changed, 41 insertions(+), 26 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java index d70a4be2f77..aab6e9f8d09 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java @@ -230,7 +230,7 @@ public OpenCGAResult groupBy(Query query, String fields, QueryOptions options, S public OpenCGAResult groupBy(Query query, List fields, QueryOptions options, String token) throws CatalogException { String userId = catalogManager.getUserManager().getUserId(token); - if (authorizationManager.isAdmin(userId)) { + if (authorizationManager.isInstallationAdministrator(userId)) { return auditDBAdaptor.groupBy(query, fields, options); } throw new CatalogAuthorizationException("Only root of OpenCGA can query the audit database"); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java index ef42a6ac867..f3e00adfc27 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java @@ -107,9 +107,9 @@ void checkUpdateGroupPermissions(long studyId, String userId, String group, Para void checkCanCreateUpdateDeleteVariableSets(long studyId, String userId) throws CatalogException; - Boolean isAdmin(String user); + Boolean isInstallationAdministrator(String user); - void checkIsAdmin(String user) throws CatalogException; + void checkIsInstallationAdministrator(String user) throws CatalogException; void checkIsOwnerOrAdmin(long studyId, String userId) throws CatalogException; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java index 3bfef7b0ddc..a50c58199bf 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java @@ -111,7 +111,7 @@ public void checkCanEditProject(long projectId, String userId) throws CatalogExc @Override public void checkCanViewProject(long projectId, String userId) throws CatalogException { - if (userId.equals(OPENCGA)) { + if (isInstallationAdministrator(userId)) { return; } if (projectDBAdaptor.getOwnerId(projectId).equals(userId)) { @@ -138,7 +138,7 @@ public void checkStudyPermission(long studyId, String userId, StudyAclEntry.Stud @Override public void checkStudyPermission(long studyId, String userId, StudyAclEntry.StudyPermissions permission, String message) throws CatalogException { - if (OPENCGA.equals(userId)) { + if (isInstallationAdministrator(userId)) { return; } else { if (studyDBAdaptor.hasStudyPermission(studyId, userId, permission)) { @@ -150,8 +150,11 @@ public void checkStudyPermission(long studyId, String userId, StudyAclEntry.Stud @Override public void checkCanEditStudy(long studyId, String userId) throws CatalogException { - String ownerId = studyDBAdaptor.getOwnerId(studyId); + if (isInstallationAdministrator(userId)) { + return; + } + String ownerId = studyDBAdaptor.getOwnerId(studyId); if (!ownerId.equals(userId) && !isAdministrativeUser(studyId, userId)) { throw new CatalogAuthorizationException("Only owners or administrative users are allowed to modify a study"); } @@ -159,12 +162,11 @@ public void checkCanEditStudy(long studyId, String userId) throws CatalogExcepti @Override public void checkCanViewStudy(long studyId, String userId) throws CatalogException { - if (OPENCGA.equals(userId)) { + if (isInstallationAdministrator(userId)) { return; } String ownerId = studyDBAdaptor.getOwnerId(studyId); - if (ownerId.equals(userId)) { return; } @@ -177,8 +179,11 @@ public void checkCanViewStudy(long studyId, String userId) throws CatalogExcepti @Override public void checkCanUpdatePermissionRules(long studyId, String userId) throws CatalogException { - String ownerId = studyDBAdaptor.getOwnerId(studyId); + if (isInstallationAdministrator(userId)) { + return; + } + String ownerId = studyDBAdaptor.getOwnerId(studyId); if (!ownerId.equals(userId) && !isAdministrativeUser(studyId, userId)) { throw new CatalogAuthorizationException("Only owners or administrative users are allowed to modify a update permission rules"); } @@ -190,8 +195,12 @@ public void checkCreateDeleteGroupPermissions(long studyId, String userId, Strin throw new CatalogAuthorizationException(group + " is a protected group that cannot be created or deleted."); } + if (isInstallationAdministrator(userId)) { + return; + } + String ownerId = studyDBAdaptor.getOwnerId(studyId); - if (!userId.equals(OPENCGA) && !userId.equals(ownerId) && !isAdministrativeUser(studyId, userId)) { + if (!userId.equals(ownerId) && !isAdministrativeUser(studyId, userId)) { throw new CatalogAuthorizationException("Only administrative users are allowed to create/remove groups."); } } @@ -219,7 +228,7 @@ public void checkUpdateGroupPermissions(long studyId, String userId, String grou throw new CatalogAuthorizationException("Only the owner of the study can assign/remove users to the administrative group."); } - if (!userId.equals(OPENCGA) && !isAdministrativeUser(studyId, userId)) { + if (!isInstallationAdministrator(userId) && !isAdministrativeUser(studyId, userId)) { throw new CatalogAuthorizationException("Only administrative users are allowed to assign/remove users to groups."); } @@ -240,15 +249,22 @@ public void checkNotAssigningPermissionsToAdminsGroup(List members) thro @Override public void checkCanAssignOrSeePermissions(long studyId, String userId) throws CatalogException { - String ownerId = studyDBAdaptor.getOwnerId(studyId); + if (isInstallationAdministrator(userId)) { + return; + } - if (!OPENCGA.equals(userId) && !ownerId.equals(userId) && !isAdministrativeUser(studyId, userId)) { + String ownerId = studyDBAdaptor.getOwnerId(studyId); + if (!ownerId.equals(userId) && !isAdministrativeUser(studyId, userId)) { throw new CatalogAuthorizationException("Only owners or administrative users are allowed to assign or see all permissions"); } } @Override public void checkCanCreateUpdateDeleteVariableSets(long studyId, String userId) throws CatalogException { + if (isInstallationAdministrator(userId)) { + return; + } + String ownerId = studyDBAdaptor.getOwnerId(studyId); if (!ownerId.equals(userId) && !isAdministrativeUser(studyId, userId)) { @@ -258,13 +274,13 @@ public void checkCanCreateUpdateDeleteVariableSets(long studyId, String userId) } @Override - public Boolean isAdmin(String user) { - return user.equals(OPENCGA); + public Boolean isInstallationAdministrator(String user) { + return OPENCGA.equals(user); } @Override - public void checkIsAdmin(String user) throws CatalogException { - if (!isAdmin(user)) { + public void checkIsInstallationAdministrator(String user) throws CatalogException { + if (!isInstallationAdministrator(user)) { throw new CatalogAuthorizationException("Only ADMINISTRATOR users are allowed to perform this action"); } } @@ -283,7 +299,6 @@ public Boolean isOwnerOrAdmin(long studyId, String userId) throws CatalogExcepti if (!ownerId.equals(userId) && !isAdministrativeUser(studyId, userId)) { return false; } - return true; } @@ -313,7 +328,7 @@ public void checkFilePermission(long studyId, long fileId, String userId, FileAc } private boolean checkUserPermission(String userId, Query query, CoreDBAdaptor dbAdaptor) throws CatalogException { - if (OPENCGA.equals(userId)) { + if (isInstallationAdministrator(userId)) { return true; } else { if (dbAdaptor.count(query, userId).getNumMatches() == 1) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java index fd879b348d1..b9f1ed5dbd6 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java @@ -42,7 +42,7 @@ public OpenCGAResult userSearch(Query query, QueryOptions options, String .append("token", token); String userId = catalogManager.getUserManager().getUserId(token); try { - authorizationManager.checkIsAdmin(userId); + authorizationManager.checkIsInstallationAdministrator(userId); // Fix query object if (query.containsKey(ParamConstants.USER)) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java index 3bf95cb569f..6f9c75a63a5 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java @@ -214,7 +214,7 @@ public void installIndexes(String token, boolean test) throws CatalogException { public void deleteCatalogDB(String token) throws CatalogException, URISyntaxException { String userId = userManager.getUserId(token); - if (!authorizationManager.isAdmin(userId)) { + if (!authorizationManager.isInstallationAdministrator(userId)) { throw new CatalogException("Only the admin can delete the database"); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java index 71fcbbde7d5..d15625d247d 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java @@ -496,14 +496,14 @@ public OpenCGAResult submit(String studyStr, String toolId, Enums.Priority public OpenCGAResult count(Query query, String token) throws CatalogException { String userId = userManager.getUserId(token); - authorizationManager.isAdmin(userId); + authorizationManager.isInstallationAdministrator(userId); return jobDBAdaptor.count(query); } public DBIterator iterator(Query query, QueryOptions options, String token) throws CatalogException { String userId = userManager.getUserId(token); - authorizationManager.isAdmin(userId); + authorizationManager.isInstallationAdministrator(userId); return jobDBAdaptor.iterator(query, options); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java index 5e8450d9a0d..50e3ee8fbdd 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java @@ -554,7 +554,7 @@ public OpenCGAResult incrementRelease(String projectStr, String session public void importReleases(String owner, String inputDirStr, String sessionId) throws CatalogException, IOException { String userId = catalogManager.getUserManager().getUserId(sessionId); - if (!authorizationManager.isAdmin(userId)) { + if (!authorizationManager.isInstallationAdministrator(userId)) { throw new CatalogAuthorizationException("Only admin of OpenCGA is authorised to import data"); } @@ -670,7 +670,7 @@ public void importReleases(String owner, String inputDirStr, String sessionId) t public void exportByFileNames(String studyStr, File outputDir, File filePath, String token) throws CatalogException { String userId = catalogManager.getUserManager().getUserId(token); - if (!authorizationManager.isAdmin(userId)) { + if (!authorizationManager.isInstallationAdministrator(userId)) { throw new CatalogAuthorizationException("Only admin of OpenCGA is authorised to export data"); } @@ -854,7 +854,7 @@ private void exportToFile(List dataList, File file, ObjectMapper objectM public void exportReleases(String projectStr, int release, String outputDirStr, String sessionId) throws CatalogException { String userId = catalogManager.getUserManager().getUserId(sessionId); - if (!authorizationManager.isAdmin(userId)) { + if (!authorizationManager.isInstallationAdministrator(userId)) { throw new CatalogAuthorizationException("Only admin of OpenCGA is authorised to export data"); } From bd6b4e3dfd5ad983aa96f1986e0e3dd8d5e5a5d9 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 25 Mar 2021 11:30:51 +0100 Subject: [PATCH 126/412] clinical: fix possible NPE, #1693 --- .../opencga/clinical/rga/RgaManager.java | 28 +++++++++++-------- .../opencga/core/response/OpenCGAResult.java | 5 ++++ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index ab3167033a9..9d2bde72cd1 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -16,6 +16,7 @@ import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.clinical.StorageManager; import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; @@ -25,7 +26,6 @@ import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.RgaException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; @@ -104,7 +104,8 @@ public OpenCGAResult individualQuery(String studyStr, Quer OpenCGAResult search = catalogManager.getSampleManager().search(study.getFqn(), catalogQuery, catalogOptions, token); if (search.getNumResults() == 0) { - return OpenCGAResult.empty(KnockoutByIndividual.class); + stopWatch.stop(); + return OpenCGAResult.empty(KnockoutByIndividual.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } sampleIds = search.getResults().stream().map(Sample::getId).collect(Collectors.toList()); @@ -114,11 +115,11 @@ public OpenCGAResult individualQuery(String studyStr, Quer // 1st. we perform a facet to get the different sample ids matching the user query DataResult result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID).append(QueryOptions.LIMIT, -1)); - List samples = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - - if (samples.isEmpty()) { - return OpenCGAResult.empty(KnockoutByIndividual.class); + if (result.getNumResults() == 0) { + stopWatch.stop(); + return OpenCGAResult.empty(KnockoutByIndividual.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } + List samples = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); auxQuery.put("sampleId", samples); } @@ -184,7 +185,8 @@ public OpenCGAResult individualQuery(String studyStr, Quer if (skip == 0 && limit > authorisedSamples.size()) { sampleIds = authorisedSamples; } else if (skip > authorisedSamples.size()) { - return OpenCGAResult.empty(KnockoutByIndividual.class); + stopWatch.stop(); + return OpenCGAResult.empty(KnockoutByIndividual.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } else { int to = Math.min(authorisedSamples.size(), skip + limit); sampleIds = authorisedSamples.subList(skip, to); @@ -247,7 +249,8 @@ public OpenCGAResult geneQuery(String studyStr, Query query, DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); if (result.getNumResults() == 0) { - return OpenCGAResult.empty(RgaKnockoutByGene.class); + stopWatch.stop(); + return OpenCGAResult.empty(RgaKnockoutByGene.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } List geneIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); auxQuery.put(RgaDataModel.GENE_ID, geneIds); @@ -268,7 +271,8 @@ public OpenCGAResult geneQuery(String studyStr, Query query, DataResult result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID).append(QueryOptions.LIMIT, -1)); if (result.getNumResults() == 0) { - return OpenCGAResult.empty(RgaKnockoutByGene.class); + stopWatch.stop(); + return OpenCGAResult.empty(RgaKnockoutByGene.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); @@ -353,7 +357,8 @@ public OpenCGAResult variantQuery(String studyStr, Query quer DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); if (result.getNumResults() == 0) { - return OpenCGAResult.empty(KnockoutByVariant.class); + stopWatch.stop(); + return OpenCGAResult.empty(KnockoutByVariant.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); auxQuery.put(RgaDataModel.VARIANTS, variantIds); @@ -374,7 +379,8 @@ public OpenCGAResult variantQuery(String studyStr, Query quer DataResult result = rgaEngine.facetedQuery(collection, auxQuery, new QueryOptions(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_ID).append(QueryOptions.LIMIT, -1)); if (result.getNumResults() == 0) { - return OpenCGAResult.empty(KnockoutByVariant.class); + stopWatch.stop(); + return OpenCGAResult.empty(KnockoutByVariant.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } List individualIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue) .collect(Collectors.toList()); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java b/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java index 70f7d03291c..c7eb98af420 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java @@ -75,6 +75,11 @@ public static OpenCGAResult empty(Class c) { .setResultType(c.getCanonicalName()); } + public static OpenCGAResult empty(Class c, int time) { + return new OpenCGAResult(time, new ArrayList<>(), 0, new ArrayList<>(), 0, 0, 0, 0, new ObjectMap()) + .setResultType(c.getCanonicalName()); + } + public static OpenCGAResult merge(List> results) { OpenCGAResult result = new OpenCGAResult( results.stream().map(OpenCGAResult::getTime).reduce(0, Integer::sum), From b11a607d347557980dc7801a8f680b05bc22e541 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 25 Mar 2021 15:44:25 +0100 Subject: [PATCH 127/412] clinical: update sample internal rga index, #1693 --- .../migration/v2.1.0/catalog/migration.js | 1 - .../CatalogAuthorizationManager.java | 4 + .../catalog/db/api/SampleDBAdaptor.java | 8 ++ .../db/mongodb/SampleMongoDBAdaptor.java | 28 ++++++ .../db/mongodb/UserMongoDBAdaptor.java | 2 + .../catalog/managers/SampleManager.java | 85 ++++++++++++++++++- .../opencga/catalog/utils/ParamUtils.java | 8 ++ .../src/main/resources/catalog-indexes.txt | 1 - .../opencga/clinical/rga/RgaManager.java | 57 ++++++++++++- .../opencga/core/models/common/Enums.java | 4 + .../models/individual/IndividualInternal.java | 16 +--- 11 files changed, 192 insertions(+), 22 deletions(-) diff --git a/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js b/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js index 67c993eb9d5..4eef77ba522 100644 --- a/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js +++ b/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js @@ -1,6 +1,5 @@ if (versionNeedsUpdate(20100, 1)) { runUpdate(function () { - db.individual.createIndex({"internal.rga.status": 1, "studyUid": 1}, {"background": true}); db.sample.createIndex({"internal.rga.status": 1, "studyUid": 1}, {"background": true}); }); } \ No newline at end of file diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java index a50c58199bf..9a6c9438162 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java @@ -287,6 +287,10 @@ public void checkIsInstallationAdministrator(String user) throws CatalogExceptio @Override public void checkIsOwnerOrAdmin(long studyId, String userId) throws CatalogException { + if (isInstallationAdministrator(userId)) { + return; + } + if (!isOwnerOrAdmin(studyId, userId)) { throw new CatalogAuthorizationException("Only owners or administrative users are allowed to perform this action"); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java index 585e4f7d331..acb7112ae72 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java @@ -26,10 +26,12 @@ import org.opencb.opencga.catalog.exceptions.CatalogParameterException; import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.VariableSet; import org.opencb.opencga.core.response.OpenCGAResult; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -67,6 +69,7 @@ enum QueryParams implements QueryParam { INTERNAL_STATUS_NAME("internal.status.name", TEXT, ""), INTERNAL_STATUS_DATE("internal.status.date", TEXT, ""), INTERNAL_RGA("internal.rga", OBJECT, ""), + INTERNAL_RGA_STATUS("internal.rga.status", TEXT, ""), RELEASE("release", INTEGER, ""), // Release where the sample was created SNAPSHOT("snapshot", INTEGER, ""), // Last version of sample at release = snapshot VERSION("version", INTEGER, ""), // Version of the sample @@ -170,4 +173,9 @@ OpenCGAResult updateProjectRelease(long studyId, int release) */ OpenCGAResult unmarkPermissionRule(long studyId, String permissionRuleId) throws CatalogException; + default OpenCGAResult setRgaIndexes(long studyUid, RgaIndex rgaIndex) throws CatalogDBException { + return setRgaIndexes(studyUid, Collections.emptyList(), rgaIndex); + } + + OpenCGAResult setRgaIndexes(long studyUid, List sampleUids, RgaIndex rgaIndex) throws CatalogDBException; } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptor.java index 4a2a1d3e1fb..243f518b0d7 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptor.java @@ -16,11 +16,13 @@ package org.opencb.opencga.catalog.db.mongodb; +import com.fasterxml.jackson.core.JsonProcessingException; import com.mongodb.MongoClient; import com.mongodb.client.ClientSession; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Projections; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.StringUtils; import org.bson.Document; @@ -67,6 +69,7 @@ import static org.opencb.opencga.catalog.db.mongodb.AuthorizationMongoDBUtils.filterAnnotationSets; import static org.opencb.opencga.catalog.db.mongodb.AuthorizationMongoDBUtils.getQueryForAuthorisedEntries; import static org.opencb.opencga.catalog.db.mongodb.MongoDBUtils.*; +import static org.opencb.opencga.core.common.JacksonUtils.getDefaultObjectMapper; /** * Created by hpccoll1 on 14/08/15. @@ -678,6 +681,30 @@ public OpenCGAResult unmarkPermissionRule(long studyId, String permissionRuleId) return unmarkPermissionRule(sampleCollection, studyId, permissionRuleId); } + @Override + public OpenCGAResult setRgaIndexes(long studyUid, List sampleUids, RgaIndex rgaIndex) throws CatalogDBException { + ObjectMap params; + try { + params = new ObjectMap(getDefaultObjectMapper().writeValueAsString(rgaIndex)); + } catch (JsonProcessingException e) { + throw new CatalogDBException("Could not parse RgaIndex object", e); + } + + Document rootDocument = new Document(QueryParams.INTERNAL_RGA.key(), params); + + List filters = new ArrayList<>(); + filters.add(Filters.eq(QueryParams.STUDY_UID.key(), studyUid)); + if (CollectionUtils.isNotEmpty(sampleUids)) { + filters.add(Filters.in(QueryParams.UID.key(), sampleUids)); + } + Bson query = Filters.and(filters); + + UpdateDocument updateDocument = new UpdateDocument().setSet(rootDocument); + + DataResult multi = sampleCollection.update(query, updateDocument.toFinalUpdateDocument(), new QueryOptions("multi", true)); + return new OpenCGAResult<>(multi); + } + @Override public OpenCGAResult count(Query query) throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { return count(null, query); @@ -1225,6 +1252,7 @@ private Bson parseQuery(Query query, Document extraQuery, String user) case DESCRIPTION: case INDIVIDUAL_ID: case INTERNAL_STATUS_DATE: + case INTERNAL_RGA_STATUS: case SOMATIC: case PHENOTYPES_ID: case PHENOTYPES_NAME: diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java index 4e4b7f25987..2ce77442c5e 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java @@ -42,6 +42,7 @@ import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogParameterException; import org.opencb.opencga.catalog.managers.StudyManager; +import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.common.Status; @@ -301,6 +302,7 @@ public OpenCGAResult stats(Query query) { @Override public OpenCGAResult get(Query query, QueryOptions options) throws CatalogDBException { + options = ParamUtils.defaultObject(options, QueryOptions::new); Bson bson = parseQuery(query); QueryOptions userOptions; if (includeProjects(options)) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java index e85e7c5a21c..e14bc1e94b2 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java @@ -42,10 +42,7 @@ import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.cohort.CohortStatus; -import org.opencb.opencga.core.models.common.AnnotationSet; -import org.opencb.opencga.core.models.common.CustomStatus; -import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.common.Status; +import org.opencb.opencga.core.models.common.*; import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.file.FileIndex; @@ -582,6 +579,86 @@ public OpenCGAResult delete(String studyStr, Query query, ObjectMap params, bool return endResult(result, ignoreException); } + // TODO: This method should be private. This should only be accessible internally. + public OpenCGAResult resetRgaIndexes(String studyStr, String token) throws CatalogException { + String userId = catalogManager.getUserManager().getUserId(token); + Study study = catalogManager.getStudyManager().resolveId(studyStr, userId); + + ObjectMap auditParams = new ObjectMap() + .append("study", studyStr) + .append("token", token); + + OpenCGAResult result; + try { + authorizationManager.isOwnerOrAdmin(study.getUid(), userId); + result = sampleDBAdaptor.setRgaIndexes(study.getUid(), new RgaIndex(RgaIndex.Status.NOT_INDEXED, TimeUtils.getTime())); + + auditManager.audit(userId, Enums.Action.RESET_RGA_INDEXES, Enums.Resource.SAMPLE, "ALL", "", study.getId(), study.getUuid(), + auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + } catch (CatalogException e) { + auditManager.audit(userId, Enums.Action.RESET_RGA_INDEXES, Enums.Resource.SAMPLE, "ALL", "", study.getId(), study.getUuid(), + auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + throw new CatalogException("Could not reset all sample RGA indexes", e); + } + + return result; + } + + // TODO: This method should be somehow private. This should only be accessible internally. + public OpenCGAResult updateRgaIndexes(String studyStr, List samples, RgaIndex rgaIndex, String token) + throws CatalogException { + String userId = catalogManager.getUserManager().getUserId(token); + Study study = catalogManager.getStudyManager().resolveId(studyStr, userId); + + ObjectMap auditParams = new ObjectMap() + .append("study", studyStr) + .append("samples", samples) + .append("rgaIndex", rgaIndex) + .append("token", token); + + String operationUuid = UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.AUDIT); + InternalGetDataResult sampleResult = null; + + OpenCGAResult result; + try { + auditManager.initAuditBatch(operationUuid); + + authorizationManager.isOwnerOrAdmin(study.getUid(), userId); + + ParamUtils.checkNotEmptyArray(samples, "samples"); + ParamUtils.checkObj(rgaIndex, "RgaIndex"); + ParamUtils.checkObj(rgaIndex.getStatus(), "RgaIndex status"); + + rgaIndex.setDate(TimeUtils.getTime()); + + sampleResult = internalGet(study.getUid(), samples, INCLUDE_SAMPLE_IDS, userId, false); + result = sampleDBAdaptor.setRgaIndexes(study.getUid(), + sampleResult.getResults().stream().map(Sample::getUid).collect(Collectors.toList()), rgaIndex); + + for (Sample sample : sampleResult.getResults()) { + auditManager.audit(operationUuid, userId, Enums.Action.UPDATE_RGA_INDEX, Enums.Resource.SAMPLE, sample.getId(), + sample.getUuid(), study.getId(), study.getUuid(), auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + } + } catch (CatalogException e) { + if (sampleResult == null) { + auditManager.audit(operationUuid, userId, Enums.Action.UPDATE_RGA_INDEX, Enums.Resource.SAMPLE, "", "", study.getId(), + study.getUuid(), auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + } else { + for (Sample sample : sampleResult.getResults()) { + auditManager.audit(operationUuid, userId, Enums.Action.UPDATE_RGA_INDEX, Enums.Resource.SAMPLE, sample.getId(), + sample.getUuid(), study.getId(), study.getUuid(), auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + } + } + throw new CatalogException("Could not reset all sample RGA indexes", e); + } finally { + auditManager.finishAuditBatch(operationUuid); + } + + return result; + } + public OpenCGAResult updateAnnotationSet(String studyStr, String sampleStr, List annotationSetList, ParamUtils.BasicUpdateAction action, QueryOptions options, String token) throws CatalogException { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java index ec7dbad01e8..924d38d617c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java @@ -16,6 +16,7 @@ package org.opencb.opencga.catalog.utils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; @@ -25,6 +26,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.function.Supplier; @@ -73,6 +75,12 @@ public static void checkObj(Object obj, String name) throws CatalogParameterExce } } + public static void checkNotEmptyArray(List obj, String name) throws CatalogParameterException { + if (CollectionUtils.isEmpty(obj)) { + throw new CatalogParameterException("Parameter '" + name + "' is null or empty."); + } + } + public static void checkRegion(String regionStr, String name) throws CatalogParameterException { if (Pattern.matches("^([a-zA-Z0-9])+:([0-9])+-([0-9])+$", regionStr)) { //chr:start-end throw new CatalogParameterException("region '" + name + "' is not valid"); diff --git a/opencga-catalog/src/main/resources/catalog-indexes.txt b/opencga-catalog/src/main/resources/catalog-indexes.txt index 57447144ca3..8ae2681cd65 100644 --- a/opencga-catalog/src/main/resources/catalog-indexes.txt +++ b/opencga-catalog/src/main/resources/catalog-indexes.txt @@ -104,7 +104,6 @@ {"collection": "individual", "fields": {"customInternalAnnotationSets.vs": 1, "studyUid": 1}, "options": {"background": true}} {"collection": "individual", "fields": {"customInternalAnnotationSets.id": 1, "customInternalAnnotationSets.value": 1, "studyUid": 1}, "options": {"background": true}} {"collection": "individual", "fields": {"internal.status.name": 1, "studyUid": 1}, "options": {"background": true}} -{"collection": "individual", "fields": {"internal.rga.status": 1, "studyUid": 1}, "options": {"background": true}} {"collection": "cohort", "fields": {"uuid": 1}, "options": {"unique": true, "background": true}} {"collection": "cohort", "fields": {"uid": 1}, "options": {"unique": true, "background": true}} diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 9d2bde72cd1..4c8399100e0 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -15,11 +15,13 @@ import org.opencb.opencga.catalog.managers.SampleManager; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.clinical.StorageManager; +import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; +import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAclEntry; @@ -91,12 +93,11 @@ public OpenCGAResult individualQuery(String studyStr, Quer boolean count = queryOptions.getBoolean(QueryOptions.COUNT); if (auxQuery.isEmpty()) { - // TODO: We need to query only for the samples indexed in Solr QueryOptions catalogOptions = new QueryOptions(SampleManager.INCLUDE_SAMPLE_IDS) .append(QueryOptions.LIMIT, limit) .append(QueryOptions.SKIP, skip) .append(QueryOptions.COUNT, queryOptions.getBoolean(QueryOptions.COUNT)); - Query catalogQuery = new Query(); + Query catalogQuery = new Query(SampleDBAdaptor.QueryParams.INTERNAL_RGA_STATUS.key(), RgaIndex.Status.INDEXED); if (!isOwnerOrAdmin) { catalogQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); @@ -423,6 +424,58 @@ public OpenCGAResult variantQuery(String studyStr, Query quer } } + public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, String token) + throws CatalogException, IOException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String userId = catalogManager.getUserManager().getUserId(token); + String collection = getCollectionName(study.getFqn()); + + catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(study.getUid(), userId); + + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + QueryOptions facetOptions = new QueryOptions() + .append(QueryOptions.FACET, RgaDataModel.SAMPLE_ID) + .append(QueryOptions.LIMIT, -1); + DataResult result = rgaEngine.facetedQuery(collection, new Query(), facetOptions); + + int totalSamples = result.first().getBuckets().size(); + int updatedSamples = 0; + + // Before doing anything, we first reset all the sample rga indexes + OpenCGAResult resetResult = catalogManager.getSampleManager().resetRgaIndexes(studyStr, token); + logger.debug("Resetting RGA indexes for " + resetResult.getNumMatches() + " samples took " + resetResult.getTime() + " ms."); + + // Update samples in batches of 100 + List sampleIds = new ArrayList<>(100); + + RgaIndex rgaIndex = new RgaIndex(RgaIndex.Status.INDEXED, TimeUtils.getTime()); + for (FacetField.Bucket bucket : result.first().getBuckets()) { + sampleIds.add(bucket.getValue()); + if (sampleIds.size() == 100) { + OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), sampleIds, rgaIndex, + token); + updatedSamples += update.getNumUpdated(); + + sampleIds = new ArrayList<>(100); + } + } + + if (!sampleIds.isEmpty()) { + // Update last batch + OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), sampleIds, rgaIndex, token); + updatedSamples += update.getNumUpdated(); + } + + stopWatch.stop(); + return new OpenCGAResult<>((int) stopWatch.getTime(TimeUnit.MILLISECONDS), null, totalSamples, 0, updatedSamples, 0); + } + public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java index be713dbda27..5b61ce88589 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java @@ -170,6 +170,10 @@ public enum Action { IMPORT_EXTERNAL_GROUP_OF_USERS, SYNC_EXTERNAL_GROUP_OF_USERS, + // RGA + RESET_RGA_INDEXES, + UPDATE_RGA_INDEX, + // Variants VARIANT_STORAGE_OPERATION, SAMPLE_DATA, diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java index 8f82ad4da3f..d6f4267dbf3 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java @@ -16,31 +16,27 @@ package org.opencb.opencga.core.models.individual; -import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.common.Status; public class IndividualInternal { private Status status; - private RgaIndex rga; public IndividualInternal() { } - public IndividualInternal(Status status, RgaIndex rga) { + public IndividualInternal(Status status) { this.status = status; - this.rga = rga; } public static IndividualInternal init() { - return new IndividualInternal(new Status(Status.READY), RgaIndex.init()); + return new IndividualInternal(new Status(Status.READY)); } @Override public String toString() { final StringBuilder sb = new StringBuilder("IndividualInternal{"); sb.append("status=").append(status); - sb.append(", rga=").append(rga); sb.append('}'); return sb.toString(); } @@ -54,12 +50,4 @@ public IndividualInternal setStatus(Status status) { return this; } - public RgaIndex getRga() { - return rga; - } - - public IndividualInternal setRga(RgaIndex rga) { - this.rga = rga; - return this; - } } From 773accc6f6362d54a7bd573b1da5f6bd4392b879 Mon Sep 17 00:00:00 2001 From: imedina Date: Thu, 25 Mar 2021 16:13:46 +0000 Subject: [PATCH 128/412] clientL notebook improvements --- .../user-training/pyopencga_catalog.ipynb | 1548 ++--------------- .../user-training/pyopencga_first_steps.ipynb | 5 +- .../pyopencga_variant_query.ipynb | 317 +++- 3 files changed, 495 insertions(+), 1375 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 54eef09f467..13cceaf5ce4 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -102,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -163,13 +163,24 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Using printe_results function:\n", + "#Time: 13\n", + "#Num matches: -1\n", + "#Num results: 1\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\taccount.type\tprojects\n", + "demouser\tGUEST\t.\n", + "\n", + "Using REST response API:\n", "User info:\n", "id:demouser\taccount_type: GUEST\t projects_owned: 0\n" ] @@ -178,8 +189,12 @@ "source": [ "## Getting user information\n", "## [NOTE] User needs the quey_id string directly --> (user)\n", - "user_info = user_client.info(user).get_result(0)\n", + "print(\"Using printe_results function:\")\n", + "user_info_resp = user_client.info(user)\n", + "user_info_resp.print_results(\"id,account.type,projects\") #, metadata=False\n", "\n", + "print(\"\\nUsing REST response API:\")\n", + "user_info = user_client.info(user).get_result(0)\n", "print('User info:')\n", "print('id:{}\\taccount_type: {}\\t projects_owned: {}'.format(user_info['id'], user_info['account']['type'], len(user_info['projects'])))\n" ] @@ -201,7 +216,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -219,7 +234,6 @@ "## [NOTE] Client specific methods have the query_id as a key:value (i.e (user=user_id)) \n", "\n", "projects_info = project_client.search()\n", - "\n", "projects_info.print_results(fields='id,name,organism.scientificName,organism.assembly,fqn', metadata=False)\n" ] }, @@ -227,7 +241,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As we can see, our user (*demouser*) has access to 2 different projects:\n", + "As we can see, our user (*demouser*) has access been granted access to 2 different projects:\n", "- Project: **family**\n", "- Project: **population**\n", "\n", @@ -258,11 +272,9 @@ ], "source": [ "project_id = 'family' # The project we want to retrieve info\n", - "\n", "studies = study_client.search(project_id)\n", "\n", "## Print the studies using the result_iterator() method\n", - "\n", "for study in studies.result_iterator():\n", " print(\"project:{}\\t study_id:{}\\t study_fqn:{} \".format(project_id, study['id'], study['fqn']))" ] @@ -293,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -309,25 +321,19 @@ } ], "source": [ - "# Define the fqn of the study\n", - "\n", - "study_fqn = 'demo@family:platinum'\n", - "\n", + "# Check study definition: the fqn of the study\n", + "# study = 'demo@family:platinum'\n", "\n", "# Query to the study web service\n", - "\n", - "groups = study_client.groups(study_fqn)\n", - "\n", + "groups = study_client.groups(study)\n", "study_groups = [] # Define an empty list for the groups\n", "\n", - "\n", "## This will give us the whole list of groups existing in the study\n", - "\n", "for group in groups.result_iterator():\n", " study_groups.append(group['id'])\n", " print(\"group_id: {}\".format(group['id']))\n", " \n", - "print('\\nThere are 3 groups in the study {}: {}'.format(study_fqn, study_groups))\n" + "print('\\nThere are 3 groups in the study {}: {}'.format(study, study_groups))\n" ] }, { @@ -346,7 +352,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -363,7 +369,6 @@ "user_groups = [] # Define an empty list \n", "\n", "## This will give us only the groups our user belongs to\n", - "\n", "for group in groups.result_iterator():\n", " if 'demouser' in group['userIds']:\n", " user_groups.append(group['id'])\n", @@ -388,7 +393,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 25, "metadata": { "pycharm": { "name": "#%%\n" @@ -396,19 +401,21 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "The user demouser has the following permissions:\n", - " ['VIEW_PANELS', 'VIEW_FAMILIES', 'VIEW_JOBS', 'VIEW_FILES', 'VIEW_FILE_ANNOTATIONS', 'VIEW_COHORTS', 'VIEW_SAMPLE_VARIANTS', 'VIEW_FAMILY_ANNOTATIONS', 'VIEW_FILE_HEADER', 'VIEW_FILE_CONTENT', 'VIEW_AGGREGATED_VARIANTS', 'VIEW_INDIVIDUALS', 'VIEW_COHORT_ANNOTATIONS', 'VIEW_SAMPLES', 'VIEW_SAMPLE_ANNOTATIONS', 'VIEW_CLINICAL_ANALYSIS', 'EXECUTE_JOBS', 'VIEW_INDIVIDUAL_ANNOTATIONS']\n" + "ename": "NameError", + "evalue": "name 'acl' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0macls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstudy_client\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstudy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmember\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'demouser'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'The user demouser has the following permissions:\\n'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0macl\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'demouser'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'acl' is not defined" ] } ], "source": [ "# Permissions granted directly to user:\n", "\n", - "acls = study_client.acl(study_fqn, member='demouser')\n", - "\n", + "acls = study_client.acl(study, member='demouser')\n", "print('The user demouser has the following permissions:\\n', acl['demouser'])\n", " " ] @@ -422,7 +429,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -436,7 +443,7 @@ "source": [ "# perm granted to the groups our user belongs to\n", "for group in user_groups:\n", - " acls = study_client.acl(study_fqn, member=group)\n", + " acls = study_client.acl(study, member=group)\n", " if acls.get_num_results() == 0:\n", " print('group_id: {}\\t group_acls: []'.format(group))\n", " else:\n", @@ -474,1291 +481,6 @@ "\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Aggregation stats: Requires improvement!" - ] - }, - { - "cell_type": "code", - "execution_count": 103, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "## We can aggregate information for many projects in a simple call\n", - "\n", - "project_client.aggregation_stats('family,proyecto2')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'family': {'corpasome': {'cohort': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 3,\n", - " 'numResults': 3,\n", - " 'numTotalResults': 3,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 1,\n", - " 'facetFields': [{'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'}],\n", - " 'count': 1,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'}],\n", - " 'count': 1,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 1,\n", - " 'name': 'status'},\n", - " {'buckets': [{'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '1'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '2'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '3'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': '4'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '5'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '6'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '7'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '8'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '9'}],\n", - " 'count': 1,\n", - " 'end': 10,\n", - " 'name': 'numSamples',\n", - " 'start': 0,\n", - " 'step': 1}],\n", - " 'time': 15},\n", - " 'family': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 5,\n", - " 'numResults': 5,\n", - " 'numTotalResults': 5,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 3,\n", - " 'facetFields': [{'buckets': [{'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'JULY'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'}],\n", - " 'count': 3,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'}],\n", - " 'count': 3,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 3,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 3,\n", - " 'name': 'status'},\n", - " {'buckets': [],\n", - " 'count': 3,\n", - " 'name': 'phenotypes'},\n", - " {'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': '-1'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': '3'}],\n", - " 'count': 3,\n", - " 'name': 'expectedSize'},\n", - " {'buckets': [{'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': '2'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': '4'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '6'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '8'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '10'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '12'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '14'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '16'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '18'}],\n", - " 'count': 3,\n", - " 'end': 20,\n", - " 'name': 'numMembers',\n", - " 'start': 0,\n", - " 'step': 2}],\n", - " 'time': 14},\n", - " 'file': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 7,\n", - " 'numResults': 7,\n", - " 'numTotalResults': 7,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 7477,\n", - " 'facetFields': [{'buckets': [{'count': 6221,\n", - " 'facetFields': [],\n", - " 'value': 'OCTOBER'},\n", - " {'count': 582,\n", - " 'facetFields': [],\n", - " 'value': 'JULY'},\n", - " {'count': 197,\n", - " 'facetFields': [],\n", - " 'value': 'SEPTEMBER'},\n", - " {'count': 183,\n", - " 'facetFields': [],\n", - " 'value': 'DECEMBER'},\n", - " {'count': 141,\n", - " 'facetFields': [],\n", - " 'value': 'AUGUST'},\n", - " {'count': 119,\n", - " 'facetFields': [],\n", - " 'value': 'NOVEMBER'},\n", - " {'count': 34,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'}],\n", - " 'count': 7477,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'},\n", - " {'count': 342,\n", - " 'facetFields': [{'buckets': [{'count': 144,\n", - " 'facetFields': [],\n", - " 'value': 'JANUARY'},\n", - " {'count': 143,\n", - " 'facetFields': [],\n", - " 'value': 'FEBRUARY'},\n", - " {'count': 55,\n", - " 'facetFields': [],\n", - " 'value': 'MARCH'}],\n", - " 'count': 342,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2021'}],\n", - " 'count': 7819,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 6410,\n", - " 'facetFields': [],\n", - " 'value': 'JSON'},\n", - " {'count': 435,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'},\n", - " {'count': 382,\n", - " 'facetFields': [],\n", - " 'value': 'UNKNOWN'},\n", - " {'count': 352,\n", - " 'facetFields': [],\n", - " 'value': 'PLAIN'},\n", - " {'count': 224,\n", - " 'facetFields': [],\n", - " 'value': 'TAB_SEPARATED_VALUES'},\n", - " {'count': 13,\n", - " 'facetFields': [],\n", - " 'value': 'IMAGE'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'VCF'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'BAM'}],\n", - " 'count': 7819,\n", - " 'name': 'format'},\n", - " {'buckets': [{'count': 7813,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'UNKNOWN'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'VARIANT'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'ALIGNMENT'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'IDLIST_RANKED'}],\n", - " 'count': 7819,\n", - " 'name': 'bioformat'},\n", - " {'buckets': [{'count': 6410,\n", - " 'facetFields': [{'buckets': [{'count': 6410,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'}],\n", - " 'count': 6410,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'JSON'},\n", - " {'count': 435,\n", - " 'facetFields': [{'buckets': [{'count': 435,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'}],\n", - " 'count': 435,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'NONE'},\n", - " {'count': 382,\n", - " 'facetFields': [{'buckets': [{'count': 380,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'UNKNOWN'}],\n", - " 'count': 382,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'UNKNOWN'},\n", - " {'count': 352,\n", - " 'facetFields': [{'buckets': [{'count': 351,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'IDLIST_RANKED'}],\n", - " 'count': 352,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'PLAIN'},\n", - " {'count': 224,\n", - " 'facetFields': [{'buckets': [{'count': 224,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'}],\n", - " 'count': 224,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'TAB_SEPARATED_VALUES'},\n", - " {'count': 13,\n", - " 'facetFields': [{'buckets': [{'count': 13,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'}],\n", - " 'count': 13,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'IMAGE'},\n", - " {'count': 2,\n", - " 'facetFields': [{'buckets': [{'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'VARIANT'}],\n", - " 'count': 2,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'VCF'},\n", - " {'count': 1,\n", - " 'facetFields': [{'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'ALIGNMENT'}],\n", - " 'count': 1,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'BAM'}],\n", - " 'count': 7819,\n", - " 'name': 'format'},\n", - " {'buckets': [{'count': 7819,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 7819,\n", - " 'name': 'status'},\n", - " {'buckets': [{'count': 7819,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '10737418240'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '21474836480'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '32212254720'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '42949672960'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '53687091200'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '64424509440'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '75161927680'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '85899345920'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '96636764160'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '107374182400'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '118111600640'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '128849018880'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '139586437120'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '150323855360'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '161061273600'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '171798691840'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '182536110080'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '193273528320'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '204010946560'}],\n", - " 'count': 7819,\n", - " 'end': 214748364800,\n", - " 'name': 'size',\n", - " 'start': 0,\n", - " 'step': 10737418240},\n", - " {'buckets': [{'count': 7816,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': '1'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '2'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '3'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': '4'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '5'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '6'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '7'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '8'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '9'}],\n", - " 'count': 7819,\n", - " 'end': 10,\n", - " 'name': 'numSamples',\n", - " 'start': 0,\n", - " 'step': 1}],\n", - " 'time': 33},\n", - " 'individual': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 8,\n", - " 'numResults': 8,\n", - " 'numTotalResults': 8,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 4,\n", - " 'facetFields': [{'buckets': [{'count': 4,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'}],\n", - " 'count': 4,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'}],\n", - " 'count': 4,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 4,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 4,\n", - " 'name': 'status'},\n", - " {'buckets': [],\n", - " 'count': 4,\n", - " 'name': 'ethnicity'},\n", - " {'buckets': [],\n", - " 'count': 4,\n", - " 'name': 'population'},\n", - " {'buckets': [{'count': 4,\n", - " 'facetFields': [],\n", - " 'value': 'ALIVE'}],\n", - " 'count': 4,\n", - " 'name': 'lifeStatus'},\n", - " {'buckets': [{'count': 3,\n", - " 'facetFields': [],\n", - " 'value': 'HP:0000545'},\n", - " {'count': 3,\n", - " 'facetFields': [],\n", - " 'value': 'Myopia'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'Developmental '\n", - " 'cataract'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'HP:0000519'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'HP:0002077'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'Migraine '\n", - " 'with '\n", - " 'aura'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'Dry '\n", - " 'skin'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'HP:0000958'}],\n", - " 'count': 4,\n", - " 'name': 'phenotypes'},\n", - " {'buckets': [{'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'FEMALE'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'MALE'}],\n", - " 'count': 4,\n", - " 'name': 'sex'},\n", - " {'buckets': [{'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 4,\n", - " 'facetFields': [],\n", - " 'value': '1'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '2'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '3'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '4'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '5'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '6'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '7'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '8'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '9'}],\n", - " 'count': 4,\n", - " 'end': 10,\n", - " 'name': 'numSamples',\n", - " 'start': 0,\n", - " 'step': 1}],\n", - " 'time': 14},\n", - " 'job': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 2,\n", - " 'numResults': 2,\n", - " 'numTotalResults': 2,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 282,\n", - " 'facetFields': [{'buckets': [{'count': 135,\n", - " 'facetFields': [],\n", - " 'value': 'JULY'},\n", - " {'count': 38,\n", - " 'facetFields': [],\n", - " 'value': 'SEPTEMBER'},\n", - " {'count': 35,\n", - " 'facetFields': [],\n", - " 'value': 'DECEMBER'},\n", - " {'count': 26,\n", - " 'facetFields': [],\n", - " 'value': 'AUGUST'},\n", - " {'count': 23,\n", - " 'facetFields': [],\n", - " 'value': 'NOVEMBER'},\n", - " {'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'OCTOBER'},\n", - " {'count': 8,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'}],\n", - " 'count': 282,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'},\n", - " {'count': 65,\n", - " 'facetFields': [{'buckets': [{'count': 28,\n", - " 'facetFields': [],\n", - " 'value': 'JANUARY'},\n", - " {'count': 27,\n", - " 'facetFields': [],\n", - " 'value': 'FEBRUARY'},\n", - " {'count': 10,\n", - " 'facetFields': [],\n", - " 'value': 'MARCH'}],\n", - " 'count': 65,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2021'}],\n", - " 'count': 347,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 260,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 260,\n", - " 'name': 'executorId'}],\n", - " 'value': 'sample-eligibility'},\n", - " {'count': 20,\n", - " 'facetFields': [{'buckets': [{'count': 15,\n", - " 'facetFields': [],\n", - " 'value': 'opencga-local'}],\n", - " 'count': 20,\n", - " 'name': 'executorId'}],\n", - " 'value': 'individual-qc'},\n", - " {'count': 15,\n", - " 'facetFields': [{'buckets': [{'count': 13,\n", - " 'facetFields': [],\n", - " 'value': 'opencga-local'}],\n", - " 'count': 15,\n", - " 'name': 'executorId'}],\n", - " 'value': 'family-qc'},\n", - " {'count': 12,\n", - " 'facetFields': [{'buckets': [{'count': 7,\n", - " 'facetFields': [],\n", - " 'value': 'opencga-local'}],\n", - " 'count': 12,\n", - " 'name': 'executorId'}],\n", - " 'value': 'sample-qc'},\n", - " {'count': 11,\n", - " 'facetFields': [{'buckets': [{'count': 11,\n", - " 'facetFields': [],\n", - " 'value': 'hbase-mapreduce'}],\n", - " 'count': 11,\n", - " 'name': 'executorId'}],\n", - " 'value': 'sample-variant-stats'},\n", - " {'count': 10,\n", - " 'facetFields': [{'buckets': [{'count': 10,\n", - " 'facetFields': [],\n", - " 'value': 'opencga-local'}],\n", - " 'count': 10,\n", - " 'name': 'executorId'}],\n", - " 'value': 'knockout'},\n", - " {'count': 6,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 6,\n", - " 'name': 'executorId'}],\n", - " 'value': 'variant-export'},\n", - " {'count': 4,\n", - " 'facetFields': [{'buckets': [{'count': 3,\n", - " 'facetFields': [],\n", - " 'value': 'opencga-local'}],\n", - " 'count': 4,\n", - " 'name': 'executorId'}],\n", - " 'value': 'interpretation-tiering'},\n", - " {'count': 3,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 3,\n", - " 'name': 'executorId'}],\n", - " 'value': 'variant-family-index'},\n", - " {'count': 2,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 2,\n", - " 'name': 'executorId'}],\n", - " 'value': 'variant-stats'},\n", - " {'count': 1,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 1,\n", - " 'name': 'executorId'}],\n", - " 'value': 'alignment-index-run'},\n", - " {'count': 1,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 1,\n", - " 'name': 'executorId'}],\n", - " 'value': 'samtools'},\n", - " {'count': 1,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 1,\n", - " 'name': 'executorId'}],\n", - " 'value': 'variant-aggregate-family'},\n", - " {'count': 1,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 1,\n", - " 'name': 'executorId'}],\n", - " 'value': 'variant-index'}],\n", - " 'count': 347,\n", - " 'name': 'toolId'}],\n", - " 'time': 22},\n", - " 'sample': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 4,\n", - " 'numResults': 4,\n", - " 'numTotalResults': 4,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 4,\n", - " 'facetFields': [{'buckets': [{'count': 4,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'}],\n", - " 'count': 4,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'}],\n", - " 'count': 4,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 4,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 4,\n", - " 'name': 'status'},\n", - " {'buckets': [{'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'HP:0000545'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'Myopia'}],\n", - " 'count': 4,\n", - " 'name': 'phenotypes'},\n", - " {'buckets': [{'count': 4,\n", - " 'facetFields': [],\n", - " 'value': 'false'}],\n", - " 'count': 4,\n", - " 'name': 'somatic'}],\n", - " 'time': 27}},\n", - " 'platinum': {'cohort': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 3,\n", - " 'numResults': 3,\n", - " 'numTotalResults': 3,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 1,\n", - " 'facetFields': [{'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'}],\n", - " 'count': 1,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'}],\n", - " 'count': 1,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 1,\n", - " 'name': 'status'},\n", - " {'buckets': [{'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '1'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '2'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '3'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '4'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '5'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '6'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '7'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '8'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '9'}],\n", - " 'count': 1,\n", - " 'end': 10,\n", - " 'name': 'numSamples',\n", - " 'start': 0,\n", - " 'step': 1}],\n", - " 'time': 31},\n", - " 'family': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 5,\n", - " 'numResults': 5,\n", - " 'numTotalResults': 5,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 1,\n", - " 'facetFields': [{'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'JULY'}],\n", - " 'count': 1,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'}],\n", - " 'count': 1,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 1,\n", - " 'name': 'status'},\n", - " {'buckets': [],\n", - " 'count': 1,\n", - " 'name': 'phenotypes'},\n", - " {'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': '0'}],\n", - " 'count': 1,\n", - " 'name': 'expectedSize'},\n", - " {'buckets': [{'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '2'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '4'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '6'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '8'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '10'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '12'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '14'},\n", - " {'count': 1,\n", - " 'facetFields': [],\n", - " 'value': '16'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '18'}],\n", - " 'count': 1,\n", - " 'end': 20,\n", - " 'name': 'numMembers',\n", - " 'start': 0,\n", - " 'step': 2}],\n", - " 'time': 31},\n", - " 'file': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 7,\n", - " 'numResults': 7,\n", - " 'numTotalResults': 7,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 3850,\n", - " 'facetFields': [{'buckets': [{'count': 2867,\n", - " 'facetFields': [],\n", - " 'value': 'SEPTEMBER'},\n", - " {'count': 258,\n", - " 'facetFields': [],\n", - " 'value': 'JULY'},\n", - " {'count': 222,\n", - " 'facetFields': [],\n", - " 'value': 'AUGUST'},\n", - " {'count': 200,\n", - " 'facetFields': [],\n", - " 'value': 'NOVEMBER'},\n", - " {'count': 138,\n", - " 'facetFields': [],\n", - " 'value': 'DECEMBER'},\n", - " {'count': 99,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'},\n", - " {'count': 66,\n", - " 'facetFields': [],\n", - " 'value': 'OCTOBER'}],\n", - " 'count': 3850,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'},\n", - " {'count': 447,\n", - " 'facetFields': [{'buckets': [{'count': 227,\n", - " 'facetFields': [],\n", - " 'value': 'FEBRUARY'},\n", - " {'count': 146,\n", - " 'facetFields': [],\n", - " 'value': 'MARCH'},\n", - " {'count': 74,\n", - " 'facetFields': [],\n", - " 'value': 'JANUARY'}],\n", - " 'count': 447,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2021'}],\n", - " 'count': 4297,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 2915,\n", - " 'facetFields': [],\n", - " 'value': 'JSON'},\n", - " {'count': 425,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'},\n", - " {'count': 353,\n", - " 'facetFields': [],\n", - " 'value': 'UNKNOWN'},\n", - " {'count': 333,\n", - " 'facetFields': [],\n", - " 'value': 'PLAIN'},\n", - " {'count': 254,\n", - " 'facetFields': [],\n", - " 'value': 'TAB_SEPARATED_VALUES'},\n", - " {'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'VCF'}],\n", - " 'count': 4297,\n", - " 'name': 'format'},\n", - " {'buckets': [{'count': 4278,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'},\n", - " {'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'VARIANT'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'UNKNOWN'}],\n", - " 'count': 4297,\n", - " 'name': 'bioformat'},\n", - " {'buckets': [{'count': 2915,\n", - " 'facetFields': [{'buckets': [{'count': 2915,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'}],\n", - " 'count': 2915,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'JSON'},\n", - " {'count': 425,\n", - " 'facetFields': [{'buckets': [{'count': 425,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'}],\n", - " 'count': 425,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'NONE'},\n", - " {'count': 353,\n", - " 'facetFields': [{'buckets': [{'count': 351,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'},\n", - " {'count': 2,\n", - " 'facetFields': [],\n", - " 'value': 'UNKNOWN'}],\n", - " 'count': 353,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'UNKNOWN'},\n", - " {'count': 333,\n", - " 'facetFields': [{'buckets': [{'count': 333,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'}],\n", - " 'count': 333,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'PLAIN'},\n", - " {'count': 254,\n", - " 'facetFields': [{'buckets': [{'count': 254,\n", - " 'facetFields': [],\n", - " 'value': 'NONE'}],\n", - " 'count': 254,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'TAB_SEPARATED_VALUES'},\n", - " {'count': 17,\n", - " 'facetFields': [{'buckets': [{'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'VARIANT'}],\n", - " 'count': 17,\n", - " 'name': 'bioformat'}],\n", - " 'value': 'VCF'}],\n", - " 'count': 4297,\n", - " 'name': 'format'},\n", - " {'buckets': [{'count': 4297,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 4297,\n", - " 'name': 'status'},\n", - " {'buckets': [{'count': 4297,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '10737418240'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '21474836480'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '32212254720'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '42949672960'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '53687091200'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '64424509440'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '75161927680'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '85899345920'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '96636764160'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '107374182400'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '118111600640'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '128849018880'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '139586437120'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '150323855360'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '161061273600'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '171798691840'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '182536110080'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '193273528320'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '204010946560'}],\n", - " 'count': 4297,\n", - " 'end': 214748364800,\n", - " 'name': 'size',\n", - " 'start': 0,\n", - " 'step': 10737418240},\n", - " {'buckets': [{'count': 4280,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 17,\n", - " 'facetFields': [],\n", - " 'value': '1'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '2'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '3'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '4'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '5'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '6'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '7'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '8'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '9'}],\n", - " 'count': 4297,\n", - " 'end': 10,\n", - " 'name': 'numSamples',\n", - " 'start': 0,\n", - " 'step': 1}],\n", - " 'time': 41},\n", - " 'individual': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 8,\n", - " 'numResults': 8,\n", - " 'numTotalResults': 8,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 17,\n", - " 'facetFields': [{'buckets': [{'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'}],\n", - " 'count': 17,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'}],\n", - " 'count': 17,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 17,\n", - " 'name': 'status'},\n", - " {'buckets': [],\n", - " 'count': 17,\n", - " 'name': 'ethnicity'},\n", - " {'buckets': [],\n", - " 'count': 17,\n", - " 'name': 'population'},\n", - " {'buckets': [{'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'UNKNOWN'}],\n", - " 'count': 17,\n", - " 'name': 'lifeStatus'},\n", - " {'buckets': [],\n", - " 'count': 17,\n", - " 'name': 'phenotypes'},\n", - " {'buckets': [{'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'UNKNOWN'}],\n", - " 'count': 17,\n", - " 'name': 'sex'},\n", - " {'buckets': [{'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '0'},\n", - " {'count': 17,\n", - " 'facetFields': [],\n", - " 'value': '1'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '2'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '3'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '4'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '5'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '6'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '7'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '8'},\n", - " {'count': 0,\n", - " 'facetFields': [],\n", - " 'value': '9'}],\n", - " 'count': 17,\n", - " 'end': 10,\n", - " 'name': 'numSamples',\n", - " 'start': 0,\n", - " 'step': 1}],\n", - " 'time': 24},\n", - " 'job': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 2,\n", - " 'numResults': 2,\n", - " 'numTotalResults': 2,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 255,\n", - " 'facetFields': [{'buckets': [{'count': 60,\n", - " 'facetFields': [],\n", - " 'value': 'JULY'},\n", - " {'count': 46,\n", - " 'facetFields': [],\n", - " 'value': 'NOVEMBER'},\n", - " {'count': 44,\n", - " 'facetFields': [],\n", - " 'value': 'AUGUST'},\n", - " {'count': 42,\n", - " 'facetFields': [],\n", - " 'value': 'SEPTEMBER'},\n", - " {'count': 26,\n", - " 'facetFields': [],\n", - " 'value': 'DECEMBER'},\n", - " {'count': 23,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'},\n", - " {'count': 14,\n", - " 'facetFields': [],\n", - " 'value': 'OCTOBER'}],\n", - " 'count': 255,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'},\n", - " {'count': 85,\n", - " 'facetFields': [{'buckets': [{'count': 43,\n", - " 'facetFields': [],\n", - " 'value': 'FEBRUARY'},\n", - " {'count': 28,\n", - " 'facetFields': [],\n", - " 'value': 'MARCH'},\n", - " {'count': 14,\n", - " 'facetFields': [],\n", - " 'value': 'JANUARY'}],\n", - " 'count': 85,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2021'}],\n", - " 'count': 340,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 269,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 269,\n", - " 'name': 'executorId'}],\n", - " 'value': 'sample-eligibility'},\n", - " {'count': 20,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 20,\n", - " 'name': 'executorId'}],\n", - " 'value': 'variant-index'},\n", - " {'count': 18,\n", - " 'facetFields': [{'buckets': [{'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'opencga-local'}],\n", - " 'count': 18,\n", - " 'name': 'executorId'}],\n", - " 'value': 'sample-qc'},\n", - " {'count': 18,\n", - " 'facetFields': [{'buckets': [{'count': 18,\n", - " 'facetFields': [],\n", - " 'value': 'hbase-mapreduce'}],\n", - " 'count': 18,\n", - " 'name': 'executorId'}],\n", - " 'value': 'sample-variant-stats'},\n", - " {'count': 6,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 6,\n", - " 'name': 'executorId'}],\n", - " 'value': 'variant-annotation-index'},\n", - " {'count': 3,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 3,\n", - " 'name': 'executorId'}],\n", - " 'value': 'variant-secondary-index'},\n", - " {'count': 3,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 3,\n", - " 'name': 'executorId'}],\n", - " 'value': 'variant-stats'},\n", - " {'count': 1,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 1,\n", - " 'name': 'executorId'}],\n", - " 'value': 'family-qc'},\n", - " {'count': 1,\n", - " 'facetFields': [{'buckets': [],\n", - " 'count': 1,\n", - " 'name': 'executorId'}],\n", - " 'value': 'inferred-sex'},\n", - " {'count': 1,\n", - " 'facetFields': [{'buckets': [{'count': 1,\n", - " 'facetFields': [],\n", - " 'value': 'opencga-local'}],\n", - " 'count': 1,\n", - " 'name': 'executorId'}],\n", - " 'value': 'knockout'}],\n", - " 'count': 340,\n", - " 'name': 'toolId'}],\n", - " 'time': 30},\n", - " 'sample': {'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 4,\n", - " 'numResults': 4,\n", - " 'numTotalResults': 4,\n", - " 'numUpdated': 0,\n", - " 'resultType': 'org.opencb.commons.datastore.core.FacetField',\n", - " 'results': [{'buckets': [{'count': 17,\n", - " 'facetFields': [{'buckets': [{'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'JUNE'}],\n", - " 'count': 17,\n", - " 'name': 'creationMonth'}],\n", - " 'value': '2020'}],\n", - " 'count': 17,\n", - " 'name': 'creationYear'},\n", - " {'buckets': [{'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'READY'}],\n", - " 'count': 17,\n", - " 'name': 'status'},\n", - " {'buckets': [],\n", - " 'count': 17,\n", - " 'name': 'phenotypes'},\n", - " {'buckets': [{'count': 17,\n", - " 'facetFields': [],\n", - " 'value': 'false'}],\n", - " 'count': 17,\n", - " 'name': 'somatic'}],\n", - " 'time': 23}}}}\n" - ] - } - ], - "source": [ - "\n", - "family_stats = project_client.aggregation_stats(project_id)\n", - "pprint(family_stats.get_result(0)) #quiero imprimir el primer resultado\n" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1779,35 +501,91 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#Time: 45\n", + "#Time: 67\n", "#Num matches: 17\n", - "#Num results: 2\n", + "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotationSets\tuuid\tqualityControl\trelease\tversion\tcreationDate\tmodificationDate\tdescription\tsomatic\tphenotypes\tindividualId\tfileIds\tstatus\tinternal\tattributes\n", - "NA12877\t.\teba106b2-0172-0004-0001-0090f938ae01\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131818\t20201117012312\t\tFalse\t.\tNA12877\tdata:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131818', 'description': ''}}\t{}\n", - "NA12878\t.\teba10c89-0172-0004-0001-8c90462fc396\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131819\t20201117015700\t\tFalse\t.\tNA12878\tdata:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131819', 'description': ''}}\t{}\n" + "NA12877\t.\teba106b2-0172-0004-0001-0090f938ae01\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131818\t20201117012312\t\tFalse\t.\tNA12877\tdata:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131818', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12877', 'name': 'NA12877', 'uuid': 'eba0f035-0172-0006-0001-f2aeb4168df1', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131812', 'modificationDate': '20201002113644', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131812', 'description': ''}}, 'attributes': {}}}\n", + "NA12878\t.\teba10c89-0172-0004-0001-8c90462fc396\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131819\t20201117015700\t\tFalse\t.\tNA12878\tdata:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131819', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12878', 'name': 'NA12878', 'uuid': 'eba0f2b4-0172-0006-0001-6af0ded43009', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131813', 'modificationDate': '20201002113649', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131813', 'description': ''}}, 'attributes': {}}}\n", + "NA12879\t.\teba11008-0172-0004-0001-fcea4ff5e986\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131820\t20201117015709\t\tFalse\t.\tNA12879\tdata:platinum-genomes-vcf-NA12879_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131820', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12879', 'name': 'NA12879', 'uuid': 'eba0f467-0172-0006-0001-d1e44969fcc3', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131813', 'modificationDate': '20201002113653', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131813', 'description': ''}}, 'attributes': {}}}\n", + "NA12880\t.\teba1134a-0172-0004-0001-5993743bc415\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131821\t20201117022819\t\tFalse\t.\tNA12880\tdata:platinum-genomes-vcf-NA12880_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131821', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12880', 'name': 'NA12880', 'uuid': 'eba0f56e-0172-0006-0001-95f703aba3e6', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131813', 'modificationDate': '20201002113657', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131813', 'description': ''}}, 'attributes': {}}}\n", + "NA12881\t.\teba1160e-0172-0004-0001-dd08a9d03e4e\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131822\t20201117022827\t\tFalse\t.\tNA12881\tdata:platinum-genomes-vcf-NA12881_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131822', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12881', 'name': 'NA12881', 'uuid': 'eba0f66c-0172-0006-0001-d023fa4e791a', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131814', 'modificationDate': '20201002113702', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131814', 'description': ''}}, 'attributes': {}}}\n", + "\n", + "JSON output:\n", + "{'annotationSets': [],\n", + " 'attributes': {'OPENCGA_INDIVIDUAL': {'attributes': {},\n", + " 'creationDate': '20200625131812',\n", + " 'disorders': [],\n", + " 'ethnicity': '',\n", + " 'father': {'parentalConsanguinity': False,\n", + " 'release': 0,\n", + " 'version': 0},\n", + " 'id': 'NA12877',\n", + " 'internal': {'status': {'date': '20200625131812',\n", + " 'description': '',\n", + " 'name': 'READY'}},\n", + " 'karyotypicSex': 'UNKNOWN',\n", + " 'lifeStatus': 'UNKNOWN',\n", + " 'location': {},\n", + " 'modificationDate': '20201002113644',\n", + " 'mother': {'parentalConsanguinity': False,\n", + " 'release': 0,\n", + " 'version': 0},\n", + " 'name': 'NA12877',\n", + " 'parentalConsanguinity': False,\n", + " 'phenotypes': [],\n", + " 'population': {},\n", + " 'release': 1,\n", + " 'sex': 'UNKNOWN',\n", + " 'status': {'date': '',\n", + " 'description': '',\n", + " 'name': ''},\n", + " 'uuid': 'eba0f035-0172-0006-0001-f2aeb4168df1',\n", + " 'version': 1}},\n", + " 'creationDate': '20200625131818',\n", + " 'description': '',\n", + " 'fileIds': ['data:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz'],\n", + " 'id': 'NA12877',\n", + " 'individualId': 'NA12877',\n", + " 'internal': {'status': {'date': '20200625131818',\n", + " 'description': '',\n", + " 'name': 'READY'}},\n", + " 'modificationDate': '20201117012312',\n", + " 'phenotypes': [],\n", + " 'qualityControl': {'alignmentMetrics': [],\n", + " 'comments': [],\n", + " 'fileIds': [],\n", + " 'variantMetrics': {'signatures': [],\n", + " 'variantStats': [],\n", + " 'vcfFileIds': []}},\n", + " 'release': 1,\n", + " 'somatic': False,\n", + " 'status': {'date': '', 'description': '', 'name': ''},\n", + " 'uuid': 'eba106b2-0172-0004-0001-0090f938ae01',\n", + " 'version': 1}\n" ] } ], "source": [ "# Define the fqn of the study we want to query\n", - "\n", - "study_id = 'family:platinum' \n", - "\n", + "# study = 'demo@family:platinum' \n", "\n", "## Call to the sample web endpoint\n", + "samples = sample_client.search(study=study, includeIndividual=True, count=True, limit = 5) ## other possible params, count=False, id='NA12880,NA12881'\n", + "samples.print_results()\n", "\n", - "samples = sample_client.search(study=study_id, count=True, limit = 2) ## other possible params, count=False, id='NA12880,NA12881'\n", - "samples.print_results()\n" + "print(\"\\nJSON output:\")\n", + "pprint(samples.get_result(0))\n" ] }, { @@ -1821,7 +599,7 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -1837,10 +615,8 @@ "source": [ "sample_ids = [] # Define an empty list\n", "\n", - "\n", "# Define a new sample query without limit\n", - "\n", - "samples = sample_client.search(study=study_id, count=True) \n", + "samples = sample_client.search(study=study, count=True) \n", "\n", "for sample in samples.result_iterator():\n", " sample_ids.append(sample['id'])\n", @@ -1857,30 +633,83 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#Time: 69\n", + "Min table columns:\n", + "#Time: 55\n", "#Num matches: 17\n", "#Num results: 2\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", - "#id\tannotationSets\tname\tuuid\tfather\tmother\tlocation\tsex\tkaryotypicSex\tethnicity\tpopulation\trelease\tversion\tcreationDate\tmodificationDate\tlifeStatus\tphenotypes\tdisorders\tsamples\tparentalConsanguinity\tstatus\tinternal\tattributes\n", - "NA12877\t.\tNA12877\teba0f035-0172-0006-0001-f2aeb4168df1\t{'release': 0, 'version': 0, 'parentalConsanguinity': False}\t{'release': 0, 'version': 0, 'parentalConsanguinity': False}\t{}\tUNKNOWN\tUNKNOWN\t\t{}\t1\t1\t20200625131812\t20201002113644\tUNKNOWN\t.\t.\t.\tFalse\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131812', 'description': ''}}\t{}\n", - "NA12878\t.\tNA12878\teba0f2b4-0172-0006-0001-6af0ded43009\t{'release': 0, 'version': 0, 'parentalConsanguinity': False}\t{'release': 0, 'version': 0, 'parentalConsanguinity': False}\t{}\tUNKNOWN\tUNKNOWN\t\t{}\t1\t1\t20200625131813\t20201002113649\tUNKNOWN\t.\t.\t.\tFalse\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131813', 'description': ''}}\t{}\n" + "#id\tsex\n", + "NA12877\tUNKNOWN\n", + "NA12878\tUNKNOWN\n", + "\n", + " Full JSON output;\n", + "{'annotationSets': [],\n", + " 'attributes': {},\n", + " 'creationDate': '20200625131812',\n", + " 'disorders': [],\n", + " 'ethnicity': '',\n", + " 'father': {'parentalConsanguinity': False, 'release': 0, 'version': 0},\n", + " 'id': 'NA12877',\n", + " 'internal': {'status': {'date': '20200625131812',\n", + " 'description': '',\n", + " 'name': 'READY'}},\n", + " 'karyotypicSex': 'UNKNOWN',\n", + " 'lifeStatus': 'UNKNOWN',\n", + " 'location': {},\n", + " 'modificationDate': '20201002113644',\n", + " 'mother': {'parentalConsanguinity': False, 'release': 0, 'version': 0},\n", + " 'name': 'NA12877',\n", + " 'parentalConsanguinity': False,\n", + " 'phenotypes': [],\n", + " 'population': {},\n", + " 'release': 1,\n", + " 'samples': [{'attributes': {},\n", + " 'creationDate': '20200625131818',\n", + " 'description': '',\n", + " 'fileIds': ['data:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz'],\n", + " 'id': 'NA12877',\n", + " 'individualId': 'NA12877',\n", + " 'internal': {'status': {'date': '20200625131818',\n", + " 'description': '',\n", + " 'name': 'READY'}},\n", + " 'modificationDate': '20201117012312',\n", + " 'phenotypes': [],\n", + " 'qualityControl': {'alignmentMetrics': [],\n", + " 'comments': [],\n", + " 'fileIds': [],\n", + " 'variantMetrics': {'signatures': [],\n", + " 'variantStats': [],\n", + " 'vcfFileIds': []}},\n", + " 'release': 1,\n", + " 'somatic': False,\n", + " 'status': {'date': '', 'description': '', 'name': ''},\n", + " 'uuid': 'eba106b2-0172-0004-0001-0090f938ae01',\n", + " 'version': 1}],\n", + " 'sex': 'UNKNOWN',\n", + " 'status': {'date': '', 'description': '', 'name': ''},\n", + " 'uuid': 'eba0f035-0172-0006-0001-f2aeb4168df1',\n", + " 'version': 1}\n" ] } ], "source": [ "## Call to the individual web service\n", "\n", - "individuals = individual_client.search(study=study_id, count=True, limit=2) ## other possible params, count=False, id='NA12880,NA12881'\n", - "individuals.print_results('')\n" + "print('Min table columns:')\n", + "individuals = individual_client.search(study=study, count=True, limit=2) ## other possible params, count=False, id='NA12880,NA12881'\n", + "individuals.print_results('id,sex')\n", + "\n", + "print(\"\\n Full JSON output;\")\n", + "pprint(individuals.get_result(0))" ] }, { @@ -1894,7 +723,7 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 60, "metadata": {}, "outputs": [ { @@ -1926,19 +755,15 @@ ], "source": [ "## New call to the individual web service\n", - "\n", - "individuals = individual_client.search(study=study_id) ## other possible params, count=False, id='NA12880,NA12881'\n", - "\n", + "individuals = individual_client.search(study=study) ## other possible params, count=False, id='NA12880,NA12881'\n", "\n", "## Print the date each individual was created \n", - "\n", "date_individuals = {} # Define an empty dictionary\n", "\n", "for individual in individuals.result_iterator():\n", " date_individuals[individual['id']] = individual['creationDate']\n", "\n", "individual_ids = list(date_individuals.keys())\n", - "\n", "print('There are {} individuals with ids:\\n {}\\n'.format(len(individual_ids), individual_ids))\n", "\n", "for ind in date_individuals:\n", @@ -1946,6 +771,13 @@ " " ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2.2 Custom Annotations" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1962,15 +794,15 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#Time: 87\n", - "#Num matches: 3766\n", + "#Time: 82\n", + "#Num matches: 3834\n", "#Num results: 3\n", "#Num inserted: 0\n", "#Num updated: 0\n", @@ -2091,7 +923,7 @@ "source": [ "## Call to the file web service\n", "\n", - "files = file_client.search(study=study_id, count=True, type='FILE', limit=3, exclude='attributes') ## other possible params, count=False, id='NA12880,NA12881'\n", + "files = file_client.search(study=study, count=True, type='FILE', limit=3, exclude='attributes') ## other possible params, count=False, id='NA12880,NA12881'\n", "files.print_results('id')\n", "\n", "pprint(files.get_result(1)) # Print information for the first file\n" @@ -2106,7 +938,7 @@ }, { "cell_type": "code", - "execution_count": 136, + "execution_count": 53, "metadata": {}, "outputs": [ { @@ -2121,7 +953,7 @@ "source": [ "my_vcf = files.get_result(1)\n", "\n", - "print('The study {} contains a {} file with id: {},\\ncreated on: {}'.format(study_fqn, my_vcf['format'], \n", + "print('The study {} contains a {} file with id: {},\\ncreated on: {}'.format(study, my_vcf['format'], \n", " my_vcf['id'], my_vcf['creationDate']))\n", "\n" ] @@ -2135,7 +967,7 @@ }, { "cell_type": "code", - "execution_count": 149, + "execution_count": 54, "metadata": {}, "outputs": [ { @@ -2148,14 +980,10 @@ ], "source": [ "# Select a sample id\n", - "\n", "sample_of_interest = sample_ids[0]\n", "\n", - "\n", "## List the files for a concrete sample\n", - "\n", - "sample = sample_client.info(study=study_id, samples= sample_of_interest)## other possible params, count=False, id='NA12880,NA12881'\n", - "\n", + "sample = sample_client.info(study=study, samples= sample_of_interest) ## other possible params, count=False, id='NA12880,NA12881'\n", "sample_files = sample.get_result(0)['fileIds']\n", "\n", "print('The sample {} has file/s: {}'.format(sample_of_interest, sample_files))\n" @@ -2180,7 +1008,7 @@ }, { "cell_type": "code", - "execution_count": 153, + "execution_count": 57, "metadata": {}, "outputs": [ { @@ -2215,7 +1043,7 @@ "source": [ "## Call to the file web service\n", "\n", - "cohorts = cohort_client.search(study=study_id, count=True, limit=2, exclude='samples') ## other possible params, count=False, id='NA12880,NA12881'\n", + "cohorts = cohort_client.search(study=study, count=True, exclude='samples') ## other possible params, count=False, id='NA12880,NA12881'\n", "cohorts.print_results('id')\n", "\n", "pprint(cohorts.get_result(0)) # Print information for the first file\n" @@ -2234,7 +1062,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.4 Filtering by Custom Annotations\n", + "## 2.3 Aggregations\n", "You can easily filter samples, individuals, ... using your custom annotation ..." ] }, @@ -2262,7 +1090,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb index 1b7b2255017..00b97670a6e 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb @@ -96,9 +96,7 @@ "\n", "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", "\n", - "\n", "# User credentials\n", - "\n", "user = 'demouser'\n", "passwd = 'demouser' ## You can skip this, see section 1.3.4 below.\n" ] @@ -126,7 +124,6 @@ ], "source": [ "# Creating ClientConfiguration dict\n", - "\n", "config_dict = {'rest': {\n", " 'host': host \n", " }\n", @@ -537,7 +534,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 5c2775a52cf..661e780bd75 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -62,7 +62,8 @@ "# User credentials\n", "user = 'demouser'\n", "passwd = 'demouser' ## you can skip this, see below.\n", - "study = 'demo@family:platinum'\n", + "# study = 'demo@family:platinum'\n", + "study = 'family:corpasome'\n", "####################################\n", "\n", "# Creating ClientConfiguration dict\n", @@ -95,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -120,6 +121,126 @@ "## 2. Querying Variants" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Total number of variants:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'attributes': {'approximateCount': False, 'source': 'solr+hadoop'},\n", + " 'events': [],\n", + " 'numDeleted': 0,\n", + " 'numInserted': 0,\n", + " 'numMatches': 300711,\n", + " 'numResults': 0,\n", + " 'numTotalResults': 300711,\n", + " 'numUpdated': 0,\n", + " 'result': [],\n", + " 'resultType': '',\n", + " 'results': [],\n", + " 'time': 0}]\n" + ] + } + ], + "source": [ + "## Let's use corpasome study\n", + "variant_client = oc.variants\n", + "variants = variant_client.query(study=study, count=True, limit=0) #exclude='annotation')\n", + "\n", + "#pprint(variants.get_result(0))\n", + "pprint(variants.responses)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Filter by region:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 3213\n", + "#Num matches: 20\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", + "1:1233941:T:C\tsplice_region_variant\tACAP3\n", + "1:1558792:T:C\tstart_lost\tMIB2\n", + "1:1647778:C:G\tsplice_region_variant\tRP1-283E3.8,CDK11A\n", + "1:1650797:A:G\tmissense_variant\tRP1-283E3.8,CDK11A\n", + "1:1653028:C:T\tsplice_region_variant\tRP1-283E3.8,RP1-283E3.4,CDK11A,SLC35E2\n" + ] + } + ], + "source": [ + "## Let's use corpasome study\n", + "variant_client = oc.variants\n", + "variants = variant_client.query(study=study, region='1:1000000-10000000', ct='lof', count=True, limit=5) #exclude='annotation')\n", + "\n", + "#pprint(variants.get_result(0))\n", + "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Filter by type:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 334\n", + "#Num matches: 1566\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", + "1:1001177:G:C\tintron_variant\tRP11-465B22.3,RP11-54O7.18\n", + "1:1001178:T:G\tintron_variant\tRP11-465B22.3,RP11-54O7.18\n", + "1:1162541:G:C\tintron_variant\tSDF4\n", + "1:1162673:G:C\tnon_coding_transcript_exon_variant\tB3GALT6,SDF4\n", + "1:1163266:G:A\tintron_variant\tB3GALT6,SDF4\n" + ] + } + ], + "source": [ + "## Let's use corpasome study\n", + "variant_client = oc.variants\n", + "variants = variant_client.query(study=study, region='1:1000000-10000000', type='SNV', count=True, limit=5) #exclude='annotation')\n", + "\n", + "#pprint(variants.get_result(0))\n", + "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -129,24 +250,198 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 349\n", + "#Num matches: 26\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", + "13:32884653:G:T\tintron_variant\tBRCA2,ZAR1L\n", + "13:32889968:G:A\tintron_variant\tBRCA2,ZAR1L\n", + "13:32890572:G:A\t5_prime_UTR_variant\tBRCA2,ZAR1L\n", + "13:32900933:T:A\tintron_variant\tBRCA2\n", + "13:32903685:C:T\tintron_variant\tBRCA2\n" + ] + } + ], "source": [ "## Let's use corpasome study\n", - "study = 'family:corpasome'\n", "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, gene='BRCA2', limit=1) #exclude='annotation')\n", + "variants = variant_client.query(study=study, gene='BRCA2', count=True, limit=5) #exclude='annotation')\n", "\n", "#pprint(variants.get_result(0))\n", - "#variants.print_results('id')" + "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Filter variants per gene and consequence type" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 284\n", + "#Num matches: 3\n", + "#Num results: 3\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", + "13:32906729:A:C\t.\t.\n", + "13:32913404:A:T\t.\t.\n", + "13:32929387:T:C\t.\t.\n" + ] + } + ], + "source": [ + "## Let's use corpasome study\n", + "variant_client = oc.variants\n", + "variants = variant_client.query(study=study, gene='BRCA2', ct='lof,missense_variant', count=True, limit=5, exclude='annotation') #exclude='annotation')\n", + "\n", + "#pprint(variants.get_result(0))\n", + "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')\n", + "\n", + "#pprint(variants.get_results(0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Clinvar Pathogenic variant:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 325\n", + "#Num matches: 1\n", + "#Num results: 1\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", + "13:32913404:A:T\tstop_gained\tBRCA2\n" + ] + } + ], + "source": [ + "## Let's use corpasome study\n", + "variant_client = oc.variants\n", + "variants = variant_client.query(study=study, gene='BRCA2', ct='lof,missense_variant', clinicalSignificance='pathogenic', count=True, limit=5) #exclude='annotation')\n", + "\n", + "#pprint(variants.get_result(0))\n", + "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Filter y sample:" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 294\n", + "#Num matches: 9\n", + "#Num results: 9\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", + "13:32889968:G:A\tintron_variant\tBRCA2,ZAR1L\n", + "13:32905265:G:A\tintron_variant\tBRCA2\n", + "13:32906729:A:C\tmissense_variant\tBRCA2\n", + "13:32913055:A:G\tsynonymous_variant\tBRCA2\n", + "13:32915005:G:C\tsynonymous_variant\tBRCA2\n", + "13:32929387:T:C\tmissense_variant\tBRCA2\n", + "13:32930936:G:A\tintron_variant\tBRCA2\n", + "13:32959534:A:G\tnon_coding_transcript_exon_variant\tBRCA2,IFIT1P1\n", + "13:32977496:C:A\tintron_variant\tBRCA2,N4BP2L1\n" + ] + } + ], + "source": [ + "## Let's use corpasome study\n", + "variant_client = oc.variants\n", + "variants = variant_client.query(study=study, sample='ISDBM322015', gene='BRCA2', count=True, limit=10) #exclude='annotation')\n", + "\n", + "#pprint(variants.get_result(0))\n", + "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Filter by recessive:" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 479\n", + "#Num matches: 1\n", + "#Num results: 1\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", + "13:32977496:C:A\tintron_variant\tBRCA2,N4BP2L1\n" + ] + } + ], + "source": [ + "## Let's use corpasome study\n", + "variant_client = oc.variants\n", + "variants = variant_client.query(study=study, sample='ISDBM322015:DOMINANTT', gene='BRCA2', count=True, limit=5) #exclude='annotation')\n", + "\n", + "#pprint(variants.get_result(0))\n", + "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 3. Aggegation Files" + "## 3. Aggegation Variant" ] }, { @@ -279,9 +574,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} From 2c69b58795995f059b90216acf0d375851a7cd21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 26 Mar 2021 09:17:58 +0000 Subject: [PATCH 129/412] storage: Add index type RANGE_GT and RANGE_LT. Allow nullable values. #1699 --- .../storage/IndexFieldConfiguration.java | 42 ++++- .../storage/SampleIndexConfiguration.java | 6 +- .../hadoop/variant/index/IndexUtils.java | 4 +- ...SampleIndexVariantAggregationExecutor.java | 2 + .../annotation/AnnotationIndexConverter.java | 4 +- .../PopulationFrequencyIndexSchema.java | 4 +- .../index/core/CategoricalIndexField.java | 15 +- .../variant/index/core/RangeIndexField.java | 123 +++++++++++++-- .../core/filters/RangeIndexFieldFilter.java | 111 ++++++-------- .../variant/index/query/RangeQuery.java | 6 +- .../variant/index/sample/FileIndexSchema.java | 13 +- .../index/sample/SampleIndexQueryParser.java | 13 +- .../index/core/CategoricalIndexFieldTest.java | 7 + .../index/core/RangeIndexFieldTest.java | 6 + .../filters/RangeIndexFieldFilterTest.java | 144 +++++++++++++++++- .../sample/SampleIndexQueryParserTest.java | 19 ++- 16 files changed, 398 insertions(+), 121 deletions(-) create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexFieldTest.java create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java index ee91f2fe6c1..a74468d9c14 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java @@ -1,5 +1,7 @@ package org.opencb.opencga.core.config.storage; +import org.apache.commons.lang3.ArrayUtils; + import java.beans.ConstructorProperties; import java.util.Arrays; import java.util.Objects; @@ -10,6 +12,16 @@ public class IndexFieldConfiguration { protected Type type; protected double[] thresholds; protected String[] values; + protected boolean nullable = true; + + public IndexFieldConfiguration(IndexFieldConfiguration other) { + this.source = other.source; + this.key = other.key; + this.type = other.type; + this.thresholds = ArrayUtils.clone(other.thresholds); + this.values = ArrayUtils.clone(other.values); + this.nullable = other.nullable; + } @ConstructorProperties({"source", "key", "type"}) protected IndexFieldConfiguration(Source source, String key, Type type) { @@ -19,9 +31,13 @@ protected IndexFieldConfiguration(Source source, String key, Type type) { } public IndexFieldConfiguration(Source source, String key, double[] thresholds) { + this(source, key, thresholds, Type.RANGE_LT); + } + + public IndexFieldConfiguration(Source source, String key, double[] thresholds, Type rangeType) { this.key = key; this.source = source; - this.type = Type.RANGE; + this.type = rangeType; this.thresholds = thresholds; this.values = null; } @@ -73,6 +89,15 @@ public IndexFieldConfiguration setValues(String[] values) { return this; } + public boolean getNullable() { + return nullable; + } + + public IndexFieldConfiguration setNullable(boolean nullable) { + this.nullable = nullable; + return this; + } + public void validate() { if (key == null) { throw new IllegalArgumentException("Missing field KEY in index custom field"); @@ -85,9 +110,19 @@ public void validate() { } switch (type) { case RANGE: + case RANGE_LT: + case RANGE_GT: if (thresholds == null || thresholds.length == 0) { throw new IllegalArgumentException("Missing 'thresholds' for index custom field " + getId()); } + if (!ArrayUtils.isSorted(thresholds)) { + throw new IllegalArgumentException("Thresholds must be sorted!"); + } +// if (Integer.bitCount(thresholds.length + 1) != 1) { +// throw new IllegalArgumentException("Invalid number of thresholds. Got " +// + thresholds.length + " thresholds. " +// + "Must be a power of 2 minus 1. e.g. 1, 3, 7, 15..."); +// } break; case CATEGORICAL: case CATEGORICAL_MULTI_VALUE: @@ -109,9 +144,12 @@ public enum Source { } public enum Type { + @Deprecated RANGE, + RANGE_LT, + RANGE_GT, CATEGORICAL, - CATEGORICAL_MULTI_VALUE + CATEGORICAL_MULTI_VALUE; } @Override diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java index 9d15d373344..4b6a8726ce0 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java @@ -27,9 +27,9 @@ public static SampleIndexConfiguration defaultConfiguration() { IndexFieldConfiguration.Type.CATEGORICAL, VCFConstants.PASSES_FILTERS_v4)) .addFileIndexField(new IndexFieldConfiguration( - IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL, QUAL_THRESHOLDS)) + IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL, QUAL_THRESHOLDS).setNullable(false)) .addFileIndexField(new IndexFieldConfiguration( - IndexFieldConfiguration.Source.SAMPLE, VCFConstants.DEPTH_KEY, DP_THRESHOLDS)); + IndexFieldConfiguration.Source.SAMPLE, VCFConstants.DEPTH_KEY, DP_THRESHOLDS).setNullable(false)); sampleIndexConfiguration.getFileIndexConfiguration() .setFilePositionBits(DEFAULT_FILE_POSITION_SIZE_BITS); @@ -128,12 +128,14 @@ public PopulationFrequencyRange(String studyPopulation) { super(Source.ANNOTATION, studyPopulation, DEFAULT_THRESHOLDS); this.study = studyPopulation.split(":")[0]; this.population = studyPopulation.split(":")[1]; + setNullable(false); } public PopulationFrequencyRange(String study, String population) { super(Source.ANNOTATION, study + ":" + population, DEFAULT_THRESHOLDS); this.study = study; this.population = population; + setNullable(false); } @ConstructorProperties({"source", "key", "type"}) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java index 3f754536198..abd383c0376 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java @@ -4,7 +4,7 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.schema.types.PUnsignedInt; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; -import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; +import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import org.opencb.opencga.storage.hadoop.variant.index.family.GenotypeCodec; /** @@ -162,7 +162,7 @@ public static Boolean intersectIndexGreaterThan(String op, double value, double case ">=": case ">>=": // Index is using operator ">". To use ">=" operator, need to subtract a DELTA to the value - value -= RangeIndexFieldFilter.DELTA; + value -= RangeIndexField.DELTA; case ">": case ">>": if (value >= indexThreshold) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java index ed07a0b921b..5124a541d14 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java @@ -257,6 +257,8 @@ private FacetFieldAccumulator createAccumulator(Query q if (fileDataIndexField.getKey().equalsIgnoreCase(fieldKey)) { switch (fileDataIndexField.getType()) { case RANGE: + case RANGE_LT: + case RANGE_GT: double[] thresholds = fileDataIndexField.getConfiguration().getThresholds(); List> ranges = Range.buildRanges( Arrays.stream(thresholds) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java index fe8f57cba04..3b9a87f6ba8 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java @@ -14,7 +14,7 @@ import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; +import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.util.*; @@ -323,7 +323,7 @@ protected void addPopFreqIndex(byte[] popFreqIndex, PopulationFrequency populati IndexField field = this.popFreqIndex.getField(populationFrequency.getStudy(), populationFrequency.getPopulation()); Integer idx = populations.get(populationFrequency.getStudy() + ":" + populationFrequency.getPopulation()); if (idx != null) { - byte popFreqInterval = RangeIndexFieldFilter.getRangeCode(populationFrequency.getAltAlleleFreq(), + byte popFreqInterval = RangeIndexField.getRangeCode(populationFrequency.getAltAlleleFreq(), field.getConfiguration().getThresholds()); // int byteIdx = (idx * POP_FREQ_SIZE) / Byte.SIZE; // int bitIdx = (idx * POP_FREQ_SIZE) % Byte.SIZE; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java index 1acf918a74e..406b55552b9 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java @@ -22,7 +22,9 @@ public PopulationFrequencyIndexSchema(List populationR IndexField field; switch (configuration.getType()) { case RANGE: - field = new RangeIndexField(configuration, bitOffset, configuration.getThresholds()); + case RANGE_LT: + case RANGE_GT: + field = new RangeIndexField(configuration, bitOffset); break; default: throw new IllegalArgumentException("Unknown index type '" + configuration.getType() + "'"); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java index e8ce9602844..30a79b8a87e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java @@ -24,11 +24,16 @@ public class CategoricalIndexField extends IndexField implements IndexCode private final IndexCodec codec; public CategoricalIndexField(IndexFieldConfiguration configuration, int bitOffset, T[] values) { - this(configuration, bitOffset, values, true); - } - - public CategoricalIndexField(IndexFieldConfiguration configuration, int bitOffset, T[] values, boolean useNa) { - this(configuration, bitOffset, values.length + (useNa ? 1 : 0), useNa ? new BasicCodecWithNa<>(values) : new BasicCodec<>(values)); + super(configuration, bitOffset); + int numValues; + if (configuration.getNullable()) { + numValues = values.length + 1; + codec = new BasicCodecWithNa<>(values); + } else { + numValues = values.length; + codec = new BasicCodec<>(values); + } + this.numBits = IndexUtils.log2(numValues - 1) + 1; } public CategoricalIndexField(IndexFieldConfiguration configuration, int bitOffset, int numValues, IndexCodec codec) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java index 01644129344..0e54a232a1e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java @@ -2,6 +2,7 @@ import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.core.variant.query.OpValue; +import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; @@ -9,24 +10,49 @@ * Single value range index. */ public class RangeIndexField extends IndexField { - public static final int MAX = 500000; + public static final double MAX = 500000000; + public static final double DELTA = 0.0000001; private final double[] thresholds; private final double min; private final double max; private final int numBits; + private final IndexCodec codec; - // TODO: Support NA - public RangeIndexField(IndexFieldConfiguration configuration, int bitOffset, double[] thresholds) { + public RangeIndexField(IndexFieldConfiguration configuration, int bitOffset) { super(configuration, bitOffset); - this.thresholds = thresholds; - if (Integer.bitCount(thresholds.length + 1) != 1) { - throw new IllegalArgumentException("Invalid number of thresholds. Got " - + thresholds.length + " thresholds. " - + "Must be a power of 2 minus 1. e.g. 1, 3, 7, 15..."); - } + this.thresholds = getConfiguration().getThresholds().clone(); min = Double.MIN_VALUE; max = MAX; - numBits = Integer.bitCount(thresholds.length); + int numValues; + if (configuration.getNullable()) { + // Add one value for the NA + numValues = thresholds.length + 1; + codec = new NullableRangeCodec(); + } else { + numValues = thresholds.length; + codec = new NonNullableRangeCodec(); + } + numBits = IndexUtils.log2(numValues) + 1; + if (configuration.getType().equals(IndexFieldConfiguration.Type.RANGE_GT)) { + // Add one DELTA to each value to invert ranges from [s, e) to (s, e], therefore the operation ">" is exact + for (int i = 0; i < thresholds.length; i++) { + thresholds[i] += DELTA; + } + + // If two consecutive values have the same value, subtract a DELTA to the first one to create a range (v-DELTA, v] + for (int i = 1; i < thresholds.length; i++) { + if (thresholds[i] == thresholds[i - 1]) { + thresholds[i - 1] -= DELTA; + } + } + } else { + // If two consecutive values have the same value, add a DELTA to the second one to create a range [v, v+DELTA) + for (int i = 1; i < thresholds.length; i++) { + if (thresholds[i] == thresholds[i - 1]) { + thresholds[i] += DELTA; + } + } + } } public double[] getThresholds() { @@ -48,12 +74,16 @@ public int getBitLength() { @Override public int encode(Double value) { - return RangeIndexFieldFilter.getRangeCode(value, thresholds); + return codec.encode(value); + } + + public int encodeExclusive(Double value) { + return (1 + encode(value - RangeIndexField.DELTA)); } @Override public Double decode(int code) { - return null; + return codec.decode(code); } @Override @@ -61,6 +91,75 @@ protected IndexFieldFilter getSingleValueIndexFilter(OpValue opValue) { return new RangeIndexFieldFilter(this, opValue); } + public boolean containsThreshold(double value) { + for (double v : thresholds) { + if (RangeIndexField.equalsTo(v, value)) { + return true; + } + } + return false; + } + + public class NonNullableRangeCodec implements IndexCodec { + @Override + public int encode(Double value) { + return value == null ? 0 : getRangeCode(value, thresholds); + } + @Override + public Double decode(int code) { + return code == thresholds.length ? max : code < 0 ? min : thresholds[code]; + } + + @Override + public boolean ambiguous(int code) { + return true; + } + } + public class NullableRangeCodec extends NonNullableRangeCodec { + + public static final int NA = 0; + + @Override + public int encode(Double value) { + return value == null ? NA : getRangeCode(value, thresholds) + 1; + } + + @Override + public Double decode(int code) { + return code == NA ? null : super.decode(code - 1); + } + } + + /** + * Gets the range code given a value and a list of ranges. + * Each point in the array indicates a range threshold. + * + * range 1 = ( -inf , th[0] ) ~ value < th[0] + * range 2 = [ th[0] , th[1] ) ~ value >= th[0] && value < th[1] + * range n = [ th[n-1] , +inf ) ~ value >= th[n-1] + * + * @param value Value to convert + * @param thresholds List of thresholds + * @return range code + */ + public static byte getRangeCode(double value, double[] thresholds) { + byte code = (byte) (thresholds.length); + for (byte i = 0; i < thresholds.length; i++) { + if (lessThan(value, thresholds[i])) { + code = i; + break; + } + } + return code; + } + + public static boolean lessThan(double a, double b) { + return a < b && !equalsTo(a, b); + } + + public static boolean equalsTo(double a, double b) { + return Math.abs(a - b) < (DELTA / 10); + } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilter.java index 687519057f2..5a496177cdd 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilter.java @@ -6,7 +6,6 @@ public class RangeIndexFieldFilter extends IndexFieldFilter { - public static final double DELTA = 0.0000001; private final RangeIndexField index; private final double minValueInclusive; private final double maxValueExclusive; @@ -19,35 +18,44 @@ public RangeIndexFieldFilter(RangeIndexField index, OpValue opValue) { } public RangeIndexFieldFilter(RangeIndexField index, String op, double value) { - this(index, queryRange(op, value, index.getMin(), index.getMax())); - } - - public RangeIndexFieldFilter(RangeIndexField index, double[] range) { super(index); this.index = index; - double[] thresholds = index.getThresholds(); - double min = index.getMin(); - double max = index.getMax(); - - byte[] rangeCode = getRangeCodes(range, thresholds); - - boolean exactFilter; - if (rangeCode[0] == 0) { - if (rangeCode[1] - 1 == thresholds.length) { - exactFilter = equalsTo(range[0], min) && equalsTo(range[1], max); - } else { - exactFilter = equalsTo(range[1], thresholds[rangeCode[1] - 1]) && equalsTo(range[0], min); - } - } else if (rangeCode[1] - 1 == thresholds.length) { - exactFilter = equalsTo(range[0], thresholds[rangeCode[0] - 1]) && equalsTo(range[1], max); - } else { - exactFilter = false; + + switch (op) { + case "": + case "=": + case "==": + this.minValueInclusive = value; + this.maxValueExclusive = value + RangeIndexField.DELTA; + break; + case "<=": + case "<<=": + // Range is with exclusive end. For inclusive "<=" operator, need to add a DELTA to the value + value += RangeIndexField.DELTA; + case "<": + case "<<": + this.minValueInclusive = index.getMin(); + this.maxValueExclusive = value; + break; + case ">": + case ">>": + // Range is with inclusive start. For exclusive ">" operator, need to add a DELTA to the value + value += RangeIndexField.DELTA; + case ">=": + case ">>=": + this.minValueInclusive = value; + this.maxValueExclusive = index.getMax(); + break; + default: + throw new VariantQueryException("Unknown query operator" + op); } - this.minValueInclusive = range[0]; - this.maxValueExclusive = range[1]; - this.minCodeInclusive = rangeCode[0]; - this.maxCodeExclusive = rangeCode[1]; - this.exactFilter = exactFilter; + + this.minCodeInclusive = (byte) index.encode(minValueInclusive); + this.maxCodeExclusive = (byte) index.encodeExclusive(maxValueExclusive); + + + this.exactFilter = (minValueInclusive == index.getMin() || index.containsThreshold(minValueInclusive)) + && (maxValueExclusive == index.getMax() || index.containsThreshold(maxValueExclusive)); } @Override @@ -93,21 +101,17 @@ public String toString() { + '}'; } - - public static double[] queryRange(String op, double value) { - return queryRange(op, value, Double.MIN_VALUE, Double.MAX_VALUE); - } - + @Deprecated public static double[] queryRange(String op, double value, double min, double max) { switch (op) { case "": case "=": case "==": - return new double[]{value, value + DELTA}; + return new double[]{value, value + RangeIndexField.DELTA}; case "<=": case "<<=": // Range is with exclusive end. For inclusive "<=" operator, need to add a DELTA to the value - value += DELTA; + value += RangeIndexField.DELTA; case "<": case "<<": return new double[]{min, value}; @@ -115,7 +119,7 @@ public static double[] queryRange(String op, double value, double min, double ma case ">": case ">>": // Range is with inclusive start. For exclusive ">" operator, need to add a DELTA to the value - value += DELTA; + value += RangeIndexField.DELTA; case ">=": case ">>=": return new double[]{value, max}; @@ -124,43 +128,14 @@ public static double[] queryRange(String op, double value, double min, double ma } } + @Deprecated public static byte[] getRangeCodes(double[] queryRange, double[] thresholds) { - return new byte[]{getRangeCode(queryRange[0], thresholds), getRangeCodeExclusive(queryRange[1], thresholds)}; + return new byte[]{RangeIndexField.getRangeCode(queryRange[0], thresholds), getRangeCodeExclusive(queryRange[1], thresholds)}; } + @Deprecated public static byte getRangeCodeExclusive(double queryValue, double[] thresholds) { - return (byte) (1 + getRangeCode(queryValue - DELTA, thresholds)); - } - - /** - * Gets the range code given a value and a list of ranges. - * Each point in the array indicates a range threshold. - * - * range 1 = ( -inf , th[0] ) ~ value < th[0] - * range 2 = [ th[0] , th[1] ) ~ value >= th[0] && value < th[1] - * range n = [ th[n-1] , +inf ) ~ value >= th[n-1] - * - * @param value Value to convert - * @param thresholds List of thresholds - * @return range code - */ - public static byte getRangeCode(double value, double[] thresholds) { - byte code = (byte) (thresholds.length); - for (byte i = 0; i < thresholds.length; i++) { - if (lessThan(value, thresholds[i])) { - code = i; - break; - } - } - return code; - } - - public static boolean lessThan(double a, double b) { - return a < b && !equalsTo(a, b); - } - - public static boolean equalsTo(double a, double b) { - return Math.abs(a - b) < (DELTA / 10); + return (byte) (1 + RangeIndexField.getRangeCode(queryValue - RangeIndexField.DELTA, thresholds)); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/RangeQuery.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/RangeQuery.java index 40c5dc34665..11c1d81037f 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/RangeQuery.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/RangeQuery.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.query; -import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; +import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import java.util.Objects; @@ -56,8 +56,8 @@ public boolean equals(Object o) { return false; } RangeQuery that = (RangeQuery) o; - return RangeIndexFieldFilter.equalsTo(that.minValueInclusive, minValueInclusive) - && RangeIndexFieldFilter.equalsTo(that.maxValueExclusive, maxValueExclusive) + return RangeIndexField.equalsTo(that.minValueInclusive, minValueInclusive) + && RangeIndexField.equalsTo(that.maxValueExclusive, maxValueExclusive) && minCodeInclusive == that.minCodeInclusive && maxCodeExclusive == that.maxCodeExclusive; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java index a0b03b9403a..8bc23a693cb 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java @@ -122,9 +122,10 @@ public static void setFilePosition(BitBuffer fileIndex, int filePosition) { protected CategoricalIndexField buildMultiFile(IndexField prevIndex) { return new CategoricalIndexField<>( - new IndexFieldConfiguration(IndexFieldConfiguration.Source.FILE, "multiFile", IndexFieldConfiguration.Type.CATEGORICAL), + new IndexFieldConfiguration(IndexFieldConfiguration.Source.FILE, "multiFile", IndexFieldConfiguration.Type.CATEGORICAL) + .setNullable(false), prevIndex == null ? 0 : (prevIndex.getBitOffset() + prevIndex.getBitLength()), - new Boolean[]{false, true}, false); + new Boolean[]{false, true}); } private CategoricalIndexField buildVariantTypeIndexField(IndexField prevIndex) { @@ -186,15 +187,17 @@ private static List> buildCustomIndexFields(List buildCustomIndexField(IndexFieldConfiguration conf, int bitOffset) { switch (conf.getType()) { case RANGE: - return new RangeIndexField(conf, bitOffset, conf.getThresholds()).from(s -> { + case RANGE_LT: + case RANGE_GT: + return new RangeIndexField(conf, bitOffset).from(s -> { try { if (s == null || s.isEmpty() || s.equals(VCFConstants.MISSING_VALUE_v4)) { - return 0d; + return null; } else { return Double.parseDouble(s); } } catch (NumberFormatException e) { - return 0d; + return null; } }, v -> v == null ? null : v.toString()); case CATEGORICAL: diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java index 5d42b696e04..535a3faed9c 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java @@ -21,6 +21,7 @@ import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; +import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.NoOpIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; @@ -1001,7 +1002,7 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool if (populationRange.getStudyAndPopulation().equals(studyPop)) { populationInSampleIndex = true; RangeQuery rangeQuery = getRangeQuery(keyOpValue.getOp(), freqFilter, populationRange.getThresholds(), - 0, 1 + RangeIndexFieldFilter.DELTA); + 0, 1 + RangeIndexField.DELTA); popFreqQuery.add(new PopulationFrequencyQuery(rangeQuery, popFreqIdx, populationRange.getStudy(), @@ -1101,14 +1102,14 @@ private RangeQuery getRangeQuery(double[] range, double[] thresholds, double min boolean exactQuery; if (rangeCode[0] == 0) { if (rangeCode[1] - 1 == thresholds.length) { - exactQuery = RangeIndexFieldFilter.equalsTo(range[0], min) && RangeIndexFieldFilter.equalsTo(range[1], max); + exactQuery = RangeIndexField.equalsTo(range[0], min) && RangeIndexField.equalsTo(range[1], max); } else { - exactQuery = RangeIndexFieldFilter.equalsTo(range[1], thresholds[rangeCode[1] - 1]) - && RangeIndexFieldFilter.equalsTo(range[0], min); + exactQuery = RangeIndexField.equalsTo(range[1], thresholds[rangeCode[1] - 1]) + && RangeIndexField.equalsTo(range[0], min); } } else if (rangeCode[1] - 1 == thresholds.length) { - exactQuery = RangeIndexFieldFilter.equalsTo(range[0], thresholds[rangeCode[0] - 1]) - && RangeIndexFieldFilter.equalsTo(range[1], max); + exactQuery = RangeIndexField.equalsTo(range[0], thresholds[rangeCode[0] - 1]) + && RangeIndexField.equalsTo(range[1], max); } else { exactQuery = false; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexFieldTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexFieldTest.java new file mode 100644 index 00000000000..5869cfed87a --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexFieldTest.java @@ -0,0 +1,7 @@ +package org.opencb.opencga.storage.hadoop.variant.index.core; + +import static org.junit.Assert.*; + +public class CategoricalIndexFieldTest { + +} \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java new file mode 100644 index 00000000000..02891dc1684 --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java @@ -0,0 +1,6 @@ +package org.opencb.opencga.storage.hadoop.variant.index.core; + +import static org.junit.Assert.*; +public class RangeIndexFieldTest { + +} \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java index 67ef81b17ce..7c7699ec257 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java @@ -1,17 +1,151 @@ package org.opencb.opencga.storage.hadoop.variant.index.core.filters; import org.junit.Test; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; +import org.opencb.opencga.storage.core.variant.query.OpValue; +import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import static org.junit.Assert.*; +import static org.opencb.opencga.core.config.storage.IndexFieldConfiguration.Source.SAMPLE; public class RangeIndexFieldFilterTest { + @Test + public void testExactLtNonNullable() { + testExactLt(false); + } + + @Test + public void testExactLtNullable() { + testExactLt(true); + } + + @Test + public void testExactGtNonNullable() { + testExactGt(false); + } + + @Test + public void testExactGtNullable() { + testExactGt(true); + } + + public void testExactLt(boolean nullable) { + RangeIndexField field = new RangeIndexField( + new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3}).setNullable(nullable), 0); + + + assertFalse(field.buildFilter(new OpValue<>("==", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("==", 1.999d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("==", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("==", 2.001d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("==", 3d)).isExactFilter()); + + + assertFalse(field.buildFilter(new OpValue<>(">=", 0d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>(">=", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 1.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>(">=", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 2.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>(">=", 3d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 3.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 8d)).isExactFilter()); + + + assertFalse(field.buildFilter(new OpValue<>("<", 4d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 3.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("<", 3d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 2.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("<", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 1.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("<", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 0d)).isExactFilter()); + + assertFalse(field.buildFilter(new OpValue<>(">", 0d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 1.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>(">", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 2.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 3d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 3.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 8d)).isExactFilter()); + + + assertFalse(field.buildFilter(new OpValue<>("<=", 4d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 3.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 3d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 2.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("<=", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 1.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 0d)).isExactFilter()); + } + + public void testExactGt(boolean nullable) { + RangeIndexField field = new RangeIndexField( + new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3}, + IndexFieldConfiguration.Type.RANGE_GT).setNullable(nullable), 0); + + assertFalse(field.buildFilter(new OpValue<>("==", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("==", 1.999d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("==", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("==", 2.001d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("==", 3d)).isExactFilter()); + + assertFalse(field.buildFilter(new OpValue<>(">", 0d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>(">", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 1.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>(">", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 2.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>(">", 3d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 3.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">", 8d)).isExactFilter()); + + + assertFalse(field.buildFilter(new OpValue<>("<=", 4d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 3.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("<=", 3d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 2.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("<=", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 1.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("<=", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<=", 0d)).isExactFilter()); + + assertFalse(field.buildFilter(new OpValue<>(">=", 0d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 1.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>(">=", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 2.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 3d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 3.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>(">=", 8d)).isExactFilter()); + + assertFalse(field.buildFilter(new OpValue<>("<", 4d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 3.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 3d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 2.5d)).isExactFilter()); + assertTrue(field.buildFilter(new OpValue<>("<", 2d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 1.5d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 1d)).isExactFilter()); + assertFalse(field.buildFilter(new OpValue<>("<", 0d)).isExactFilter()); + } + + @Test + public void testLength() { + assertEquals(1, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1}).setNullable(false), 0).getBitLength()); + assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1}).setNullable(true), 0).getBitLength()); + assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4}).setNullable(true), 0).getBitLength()); + assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4, 5}).setNullable(false), 0).getBitLength()); + assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4, 5}).setNullable(true), 0).getBitLength()); + assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3}).setNullable(true), 0).getBitLength()); + } + @Test public void testNumericMethods() { - assertTrue(RangeIndexFieldFilter.lessThan(1.0, 3.0)); - assertFalse(RangeIndexFieldFilter.lessThan(2, 2 + RangeIndexFieldFilter.DELTA - RangeIndexFieldFilter.DELTA)); - assertTrue(RangeIndexFieldFilter.equalsTo(2, 2 + RangeIndexFieldFilter.DELTA - RangeIndexFieldFilter.DELTA)); - assertNotEquals(2.0, 2 + RangeIndexFieldFilter.DELTA - RangeIndexFieldFilter.DELTA, 0); - assertEquals(2.0, 2 + RangeIndexFieldFilter.DELTA - RangeIndexFieldFilter.DELTA, RangeIndexFieldFilter.DELTA); + assertTrue(RangeIndexField.lessThan(1.0, 3.0)); + assertFalse(RangeIndexField.lessThan(2, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA)); + assertTrue(RangeIndexField.equalsTo(2, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA)); + assertNotEquals(2.0, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA, 0); + assertEquals(2.0, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA, RangeIndexField.DELTA); } } \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java index e82fe07ed27..839187f805f 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java @@ -3,6 +3,7 @@ import htsjdk.variant.vcf.VCFConstants; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.Pair; +import org.hamcrest.CoreMatchers; import org.junit.Before; import org.junit.Test; import org.opencb.biodata.models.core.Region; @@ -35,6 +36,7 @@ import java.util.*; import java.util.function.Function; +import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.ANTISENSE; @@ -42,7 +44,7 @@ import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.*; import static org.opencb.opencga.storage.hadoop.variant.index.IndexUtils.EMPTY_MASK; import static org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter.*; -import static org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter.DELTA; +import static org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField.DELTA; import static org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexQueryParser.groupRegions; import static org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexQueryParser.validSampleIndexQuery; @@ -198,9 +200,9 @@ public void parseVariantTpeQuery() { assertTrue(CollectionUtils.isEmpty(sampleIndexQuery.getVariantTypes())); assertNull(q.get(TYPE.key())); - q = new Query(TYPE.key(), "INDEL,SNV,INSERTION,DELETION,CNV,BREAKEND,MNV").append(SAMPLE.key(), "S1"); + q = new Query(TYPE.key(), "INDEL,SNV,INSERTION,DELETION,BREAKEND,MNV").append(SAMPLE.key(), "S1"); sampleIndexQuery = parse(q); - assertTrue(CollectionUtils.isEmpty(sampleIndexQuery.getVariantTypes())); + assertThat(sampleIndexQuery.getVariantTypes(), anyOf(nullValue(), is(Collections.emptyList()))); assertNull(q.get(TYPE.key())); q = new Query(TYPE.key(), "INDEL,SNV").append(SAMPLE.key(), "S1"); @@ -307,10 +309,11 @@ public void parseFileQualTest() { query = new Query(QUAL.key(), ">=" + qual); fileQuery = parseFileQuery(query, "", null); checkQualFilter(">=" + qual, qual, RangeIndexField.MAX, fileQuery); - if (qual == 0 || Arrays.binarySearch(qualThresholds, qual) >= 0) { - assertFalse(isValidParam(query, QUAL)); + // Qual == 0 is not an special case anymore + if (/*qual == 0 || */Arrays.binarySearch(qualThresholds, qual) >= 0) { + assertFalse(">=" + qual, isValidParam(query, QUAL)); } else { - assertTrue(isValidParam(query, QUAL)); + assertTrue(">=" + qual, isValidParam(query, QUAL)); } query = new Query(QUAL.key(), ">" + qual); @@ -326,7 +329,7 @@ protected void checkQualFilter(String message, double minValueInclusive, double assertEquals(message, minValueInclusive, qualQuery.getMinValueInclusive(), 0); assertEquals(message, maxValueExclusive, qualQuery.getMaxValueExclusive(), 0); - assertEquals(message, RangeIndexFieldFilter.getRangeCode(minValueInclusive, qualThresholds), qualQuery.getMinCodeInclusive()); + assertEquals(message, RangeIndexField.getRangeCode(minValueInclusive, qualThresholds), qualQuery.getMinCodeInclusive()); assertEquals(message, RangeIndexFieldFilter.getRangeCodeExclusive(maxValueExclusive, qualThresholds), qualQuery.getMaxCodeExclusive()); } @@ -385,7 +388,7 @@ protected void checkDPFilter(String message, double minValueInclusive, double ma assertEquals(message, minValueInclusive, qualQuery.getMinValueInclusive(), 0); assertEquals(message, maxValueExclusive, qualQuery.getMaxValueExclusive(), 0); - assertEquals(message, RangeIndexFieldFilter.getRangeCode(minValueInclusive, dpThresholds), qualQuery.getMinCodeInclusive()); + assertEquals(message, RangeIndexField.getRangeCode(minValueInclusive, dpThresholds), qualQuery.getMinCodeInclusive()); assertEquals(message, RangeIndexFieldFilter.getRangeCodeExclusive(maxValueExclusive, dpThresholds), qualQuery.getMaxCodeExclusive()); } From 7e12005a974a62683a83691fb2f74a6b88738c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 26 Mar 2021 10:27:39 +0000 Subject: [PATCH 130/412] storage: Fix index bitLength in some scenarios: #1699 --- .../index/core/CategoricalIndexField.java | 6 +++- .../variant/index/core/RangeIndexField.java | 10 +++--- .../index/core/CategoricalIndexFieldTest.java | 22 ++++++++++++ .../index/core/RangeIndexFieldTest.java | 35 ++++++++++++++++++- .../filters/RangeIndexFieldFilterTest.java | 18 ---------- 5 files changed, 66 insertions(+), 25 deletions(-) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java index 30a79b8a87e..f2678311795 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java @@ -23,6 +23,10 @@ public class CategoricalIndexField extends IndexField implements IndexCode private final int numBits; private final IndexCodec codec; + public static CategoricalIndexField create(IndexFieldConfiguration configuration, int bitOffset) { + return new CategoricalIndexField<>(configuration, bitOffset, configuration.getValues()); + } + public CategoricalIndexField(IndexFieldConfiguration configuration, int bitOffset, T[] values) { super(configuration, bitOffset); int numValues; @@ -33,7 +37,7 @@ public CategoricalIndexField(IndexFieldConfiguration configuration, int bitOffse numValues = values.length; codec = new BasicCodec<>(values); } - this.numBits = IndexUtils.log2(numValues - 1) + 1; + this.numBits = Math.max(1, IndexUtils.log2(numValues - 1) + 1); } public CategoricalIndexField(IndexFieldConfiguration configuration, int bitOffset, int numValues, IndexCodec codec) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java index 0e54a232a1e..cb6ce6c45d7 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java @@ -23,16 +23,16 @@ public RangeIndexField(IndexFieldConfiguration configuration, int bitOffset) { this.thresholds = getConfiguration().getThresholds().clone(); min = Double.MIN_VALUE; max = MAX; - int numValues; + // There is one range more than thresholds. + int numRanges = thresholds.length + 1; if (configuration.getNullable()) { - // Add one value for the NA - numValues = thresholds.length + 1; + // Add one range for the NA + numRanges++; codec = new NullableRangeCodec(); } else { - numValues = thresholds.length; codec = new NonNullableRangeCodec(); } - numBits = IndexUtils.log2(numValues) + 1; + numBits = Math.max(1, IndexUtils.log2(numRanges - 1) + 1); if (configuration.getType().equals(IndexFieldConfiguration.Type.RANGE_GT)) { // Add one DELTA to each value to invert ranges from [s, e) to (s, e], therefore the operation ">" is exact for (int i = 0; i < thresholds.length; i++) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexFieldTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexFieldTest.java index 5869cfed87a..c7c6914cac6 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexFieldTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexFieldTest.java @@ -1,7 +1,29 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; +import org.junit.Test; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; + import static org.junit.Assert.*; +import static org.opencb.opencga.core.config.storage.IndexFieldConfiguration.Source.SAMPLE; public class CategoricalIndexFieldTest { + @Test + public void testLength() { + boolean nullable = false; + assertEquals(1, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1").setNullable(nullable), 0).getBitLength()); + assertEquals(1, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2").setNullable(nullable), 0).getBitLength()); + assertEquals(2, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2", "3").setNullable(nullable), 0).getBitLength()); + assertEquals(2, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2", "3", "4").setNullable(nullable), 0).getBitLength()); + assertEquals(3, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2", "3", "4", "5").setNullable(nullable), 0).getBitLength()); + assertEquals(3, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2", "3", "4", "5", "6").setNullable(nullable), 0).getBitLength()); + + nullable = true; + assertEquals(1, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1").setNullable(nullable), 0).getBitLength()); + assertEquals(2, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2").setNullable(nullable), 0).getBitLength()); + assertEquals(2, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2", "3").setNullable(nullable), 0).getBitLength()); + assertEquals(3, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2", "3", "4").setNullable(nullable), 0).getBitLength()); + assertEquals(3, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2", "3", "4", "5").setNullable(nullable), 0).getBitLength()); + assertEquals(3, CategoricalIndexField.create(new IndexFieldConfiguration(SAMPLE, "K", IndexFieldConfiguration.Type.CATEGORICAL, "1", "2", "3", "4", "5", "6").setNullable(nullable), 0).getBitLength()); + } } \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java index 02891dc1684..882f00e2a46 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java @@ -1,6 +1,39 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; +import org.junit.Test; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; + import static org.junit.Assert.*; +import static org.opencb.opencga.core.config.storage.IndexFieldConfiguration.Source.SAMPLE; + public class RangeIndexFieldTest { - + + @Test + public void testLength() { + boolean nullable = false; + assertEquals(1, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1}).setNullable(nullable), 0).getBitLength()); + assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2}).setNullable(nullable), 0).getBitLength()); + assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4, 5}).setNullable(nullable), 0).getBitLength()); + assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4, 5, 6}).setNullable(nullable), 0).getBitLength()); + assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 3, 4, 5, 6, 7}).setNullable(nullable), 0).getBitLength()); + assertEquals(4, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 3, 4, 5, 6, 7, 8}).setNullable(nullable), 0).getBitLength()); + + nullable = true; + assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1}).setNullable(nullable), 0).getBitLength()); + assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4}).setNullable(nullable), 0).getBitLength()); + assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4, 5}).setNullable(nullable), 0).getBitLength()); + assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3}).setNullable(nullable), 0).getBitLength()); + assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3, 4}).setNullable(nullable), 0).getBitLength()); + assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3, 4, 5}).setNullable(nullable), 0).getBitLength()); + assertEquals(4, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3, 4, 5, 6}).setNullable(nullable), 0).getBitLength()); + } + + @Test + public void testNumericMethods() { + assertTrue(RangeIndexField.lessThan(1.0, 3.0)); + assertFalse(RangeIndexField.lessThan(2, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA)); + assertTrue(RangeIndexField.equalsTo(2, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA)); + assertNotEquals(2.0, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA, 0); + assertEquals(2.0, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA, RangeIndexField.DELTA); + } } \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java index 7c7699ec257..0c4a32aac16 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilterTest.java @@ -130,22 +130,4 @@ public void testExactGt(boolean nullable) { assertFalse(field.buildFilter(new OpValue<>("<", 0d)).isExactFilter()); } - @Test - public void testLength() { - assertEquals(1, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1}).setNullable(false), 0).getBitLength()); - assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1}).setNullable(true), 0).getBitLength()); - assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4}).setNullable(true), 0).getBitLength()); - assertEquals(2, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4, 5}).setNullable(false), 0).getBitLength()); - assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{2, 4, 5}).setNullable(true), 0).getBitLength()); - assertEquals(3, new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3}).setNullable(true), 0).getBitLength()); - } - - @Test - public void testNumericMethods() { - assertTrue(RangeIndexField.lessThan(1.0, 3.0)); - assertFalse(RangeIndexField.lessThan(2, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA)); - assertTrue(RangeIndexField.equalsTo(2, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA)); - assertNotEquals(2.0, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA, 0); - assertEquals(2.0, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA, RangeIndexField.DELTA); - } } \ No newline at end of file From 5f54f7de48ff071d8057bec897f27313db7d4015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 26 Mar 2021 11:24:55 +0000 Subject: [PATCH 131/412] storage: Remove deprecated index field type RANGE. #1699 --- .../storage/IndexFieldConfiguration.java | 31 +++++++++++++++++-- .../storage/IndexFieldConfigurationTest.java | 25 +++++++++++++++ ...SampleIndexVariantAggregationExecutor.java | 1 - .../PopulationFrequencyIndexSchema.java | 1 - .../variant/index/sample/FileIndexSchema.java | 1 - 5 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 opencga-core/src/test/java/org/opencb/opencga/core/config/storage/IndexFieldConfigurationTest.java diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java index a74468d9c14..87f7c1a248f 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java @@ -1,5 +1,6 @@ package org.opencb.opencga.core.config.storage; +import com.fasterxml.jackson.annotation.JsonCreator; import org.apache.commons.lang3.ArrayUtils; import java.beans.ConstructorProperties; @@ -109,7 +110,6 @@ public void validate() { throw new IllegalArgumentException("Missing field TYPE in index custom field " + source + ":" + key); } switch (type) { - case RANGE: case RANGE_LT: case RANGE_GT: if (thresholds == null || thresholds.length == 0) { @@ -144,12 +144,37 @@ public enum Source { } public enum Type { - @Deprecated - RANGE, RANGE_LT, RANGE_GT, CATEGORICAL, CATEGORICAL_MULTI_VALUE; + + @JsonCreator + public static Type forValues(String value) { + if (value == null) { + return null; + } + switch (value.toUpperCase()) { + case "RANGE": + case "RANGE_LT": + case "RANGELT": + case "RANGE_GE": + case "RANGEGE": + return RANGE_LT; + case "RANGE_GT": + case "RANGEGT": + case "RANGE_LE": + case "RANGELE": + return RANGE_GT; + case "CATEGORICAL": + return CATEGORICAL; + case "CATEGORICAL_MULTI_VALUE": + case "CATEGORICALMULTIVALUE": + return CATEGORICAL_MULTI_VALUE; + default: + throw new IllegalArgumentException("Unknown index field type " + value); + } + } } @Override diff --git a/opencga-core/src/test/java/org/opencb/opencga/core/config/storage/IndexFieldConfigurationTest.java b/opencga-core/src/test/java/org/opencb/opencga/core/config/storage/IndexFieldConfigurationTest.java new file mode 100644 index 00000000000..835d2277f36 --- /dev/null +++ b/opencga-core/src/test/java/org/opencb/opencga/core/config/storage/IndexFieldConfigurationTest.java @@ -0,0 +1,25 @@ +package org.opencb.opencga.core.config.storage; + +import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.Test; +import org.opencb.opencga.core.common.JacksonUtils; + +import static org.junit.Assert.*; + +public class IndexFieldConfigurationTest { + + @Test + public void testDeserialize() throws JsonProcessingException { + assertEquals(IndexFieldConfiguration.Type.RANGE_LT, JacksonUtils.getDefaultObjectMapper().readValue("\"RANGE\"", IndexFieldConfiguration.Type.class)); + assertEquals(IndexFieldConfiguration.Type.RANGE_LT, JacksonUtils.getDefaultObjectMapper().readValue("\"RANGE_LT\"", IndexFieldConfiguration.Type.class)); + assertEquals(IndexFieldConfiguration.Type.RANGE_LT, JacksonUtils.getDefaultObjectMapper().readValue("\"RANGE_GE\"", IndexFieldConfiguration.Type.class)); + + assertEquals(IndexFieldConfiguration.Type.RANGE_GT, JacksonUtils.getDefaultObjectMapper().readValue("\"RANGE_GT\"", IndexFieldConfiguration.Type.class)); + assertEquals(IndexFieldConfiguration.Type.RANGE_GT, JacksonUtils.getDefaultObjectMapper().readValue("\"RANGE_LE\"", IndexFieldConfiguration.Type.class)); + assertEquals(IndexFieldConfiguration.Type.RANGE_GT, JacksonUtils.getDefaultObjectMapper().readValue("\"rangeLe\"", IndexFieldConfiguration.Type.class)); + + assertEquals(IndexFieldConfiguration.Type.CATEGORICAL, JacksonUtils.getDefaultObjectMapper().readValue("\"Categorical\"", IndexFieldConfiguration.Type.class)); + assertEquals(IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE, JacksonUtils.getDefaultObjectMapper().readValue("\"CategoricalMultiValue\"", IndexFieldConfiguration.Type.class)); + } + +} \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java index 5124a541d14..a7c110438a5 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java @@ -256,7 +256,6 @@ private FacetFieldAccumulator createAccumulator(Query q for (IndexField fileDataIndexField : schema.getFileIndex().getCustomFields()) { if (fileDataIndexField.getKey().equalsIgnoreCase(fieldKey)) { switch (fileDataIndexField.getType()) { - case RANGE: case RANGE_LT: case RANGE_GT: double[] thresholds = fileDataIndexField.getConfiguration().getThresholds(); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java index 406b55552b9..30461677c30 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java @@ -21,7 +21,6 @@ public PopulationFrequencyIndexSchema(List populationR for (PopulationFrequencyRange configuration : populationRanges) { IndexField field; switch (configuration.getType()) { - case RANGE: case RANGE_LT: case RANGE_GT: field = new RangeIndexField(configuration, bitOffset); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java index 8bc23a693cb..b5a1218bca4 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java @@ -186,7 +186,6 @@ private static List> buildCustomIndexFields(List buildCustomIndexField(IndexFieldConfiguration conf, int bitOffset) { switch (conf.getType()) { - case RANGE: case RANGE_LT: case RANGE_GT: return new RangeIndexField(conf, bitOffset).from(s -> { From 11dcd5078fe973d8bdceb8c20ce137c0f95debad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 26 Mar 2021 12:14:21 +0000 Subject: [PATCH 132/412] app: Allow configure sample index using command line #1699 --- .../options/VariantCommandOptions.java | 3 +- .../app/cli/main/OpencgaCliOptionsParser.java | 5 ++-- .../operations/OperationsCommandExecutor.java | 28 +++++++++++++++++-- .../options/OperationsCommandOptions.java | 26 +++++++++++++---- .../rest/clients/VariantOperationClient.java | 4 +-- 5 files changed, 54 insertions(+), 12 deletions(-) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index aaf47a7e495..ce76ebf91c1 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -29,6 +29,7 @@ import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis; import org.opencb.opencga.analysis.variant.operations.VariantFamilyIndexOperationTool; import org.opencb.opencga.analysis.variant.operations.VariantIndexOperationTool; +import org.opencb.opencga.analysis.variant.operations.VariantSampleIndexOperationTool; import org.opencb.opencga.analysis.variant.relatedness.RelatednessAnalysis; import org.opencb.opencga.analysis.variant.samples.SampleEligibilityAnalysis; import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; @@ -449,7 +450,7 @@ public class VariantScoreDeleteCommandOptions extends GenericVariantScoreDeleteC @Parameters(commandNames = {SAMPLE_INDEX_COMMAND}, commandDescription = SAMPLE_INDEX_COMMAND_DESCRIPTION) public class SampleIndexCommandOptions extends GeneralCliOptions.StudyOption { public static final String SAMPLE_INDEX_COMMAND = "sample-index"; - public static final String SAMPLE_INDEX_COMMAND_DESCRIPTION = "Annotate sample index."; + public static final String SAMPLE_INDEX_COMMAND_DESCRIPTION = VariantSampleIndexOperationTool.DESCRIPTION; @ParametersDelegate public GeneralCliOptions.CommonCommandOptions commonOptions = commonCommandOptions; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index 2acd7e32d87..c586a09a142 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -320,8 +320,9 @@ public OpencgaCliOptionsParser() { operationsSubCommands.addCommand(VARIANT_ANNOTATION_DELETE, operationsCommandOptions.variantAnnotationDelete); operationsSubCommands.addCommand(VARIANT_SCORE_INDEX, operationsCommandOptions.variantScoreIndex); operationsSubCommands.addCommand(VARIANT_SCORE_DELETE, operationsCommandOptions.variantScoreDelete); - operationsSubCommands.addCommand(VARIANT_FAMILY_GENOTYPE_INDEX, operationsCommandOptions.variantFamilyIndex); - operationsSubCommands.addCommand(VARIANT_SAMPLE_GENOTYPE_INDEX, operationsCommandOptions.variantSampleIndex); + operationsSubCommands.addCommand(VARIANT_FAMILY_INDEX, operationsCommandOptions.variantFamilyIndex); + operationsSubCommands.addCommand(VARIANT_SAMPLE_INDEX, operationsCommandOptions.variantSampleIndex); + operationsSubCommands.addCommand(VARIANT_SAMPLE_INDEX_CONFIGURE, operationsCommandOptions.variantSampleIndexConfigure); operationsSubCommands.addCommand(VARIANT_AGGREGATE, operationsCommandOptions.variantAggregate); operationsSubCommands.addCommand(VARIANT_FAMILY_AGGREGATE, operationsCommandOptions.variantAggregateFamily); operationsSubCommands.addCommand(JULIE_RUN_COMMAND, operationsCommandOptions.julieRun); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/operations/OperationsCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/operations/OperationsCommandExecutor.java index b616f574569..feb1a7f9d2f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/operations/OperationsCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/operations/OperationsCommandExecutor.java @@ -8,13 +8,18 @@ import org.opencb.opencga.app.cli.main.options.OperationsCommandOptions; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.common.YesNoAuto; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.*; import org.opencb.opencga.core.models.variant.VariantFileIndexJobLauncherParams; import org.opencb.opencga.core.models.variant.VariantIndexParams; import org.opencb.opencga.core.response.RestResponse; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; @@ -64,12 +69,15 @@ public void execute() throws Exception { case VARIANT_SCORE_DELETE: queryResponse = variantScoreDelete(); break; - case VARIANT_FAMILY_GENOTYPE_INDEX: + case VARIANT_FAMILY_INDEX: queryResponse = variantFamilyIndex(); break; - case VARIANT_SAMPLE_GENOTYPE_INDEX: + case VARIANT_SAMPLE_INDEX: queryResponse = variantSampleIndex(); break; + case VARIANT_SAMPLE_INDEX_CONFIGURE: + queryResponse = variantSampleIndexConfigure(); + break; case VARIANT_AGGREGATE: queryResponse = variantAggregate(); break; @@ -228,6 +236,22 @@ private RestResponse variantSampleIndex() throws ClientException { ), params); } + private RestResponse variantSampleIndexConfigure() throws ClientException, IOException { + OperationsCommandOptions.VariantSampleIndexConfigureCommandOptions cliOptions = operationsCommandOptions.variantSampleIndexConfigure; + + ObjectMap params = getParams(cliOptions); + + + Path sampleIndexFile = Paths.get(cliOptions.sampleIndex); + if (!sampleIndexFile.toFile().exists()) { + throw new IOException("File '" + sampleIndexFile + "' not found!"); + } + SampleIndexConfiguration sampleIndex = JacksonUtils.getDefaultObjectMapper().readValue(sampleIndexFile.toFile(), + SampleIndexConfiguration.class); + + return openCGAClient.getVariantOperationClient().configureSampleIndex(sampleIndex, params); + } + private RestResponse variantAggregate() throws ClientException { OperationsCommandOptions.VariantAggregateCommandOptions cliOptions = operationsCommandOptions.variantAggregate; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/OperationsCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/OperationsCommandOptions.java index 1995cef78e2..3e46d1ef321 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/OperationsCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/OperationsCommandOptions.java @@ -5,11 +5,11 @@ import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.internal.options.VariantCommandOptions; import org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GenericJulieRunCommandOptions; -import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.storage.app.cli.client.options.StorageVariantCommandOptions; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; +import java.nio.file.Path; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -41,8 +41,9 @@ public class OperationsCommandOptions { public static final String VARIANT_SCORE_INDEX = "variant-score-index"; public static final String VARIANT_SCORE_DELETE = "variant-score-delete"; - public static final String VARIANT_SAMPLE_GENOTYPE_INDEX = "variant-sample-genotype-index"; - public static final String VARIANT_FAMILY_GENOTYPE_INDEX = "variant-family-genotype-index"; + public static final String VARIANT_SAMPLE_INDEX = "variant-sample-index"; + public static final String VARIANT_SAMPLE_INDEX_CONFIGURE = "variant-sample-index-configure"; + public static final String VARIANT_FAMILY_INDEX = "variant-family-index"; public static final String VARIANT_FAMILY_AGGREGATE = "variant-family-aggregate"; public static final String VARIANT_AGGREGATE = "variant-aggregate"; @@ -61,6 +62,7 @@ public class OperationsCommandOptions { public final VariantScoreDeleteCommandOptions variantScoreDelete; public final VariantSampleGenotypeIndexCommandOptions variantSampleIndex; + public final VariantSampleIndexConfigureCommandOptions variantSampleIndexConfigure; public final VariantFamilyGenotypeIndexCommandOptions variantFamilyIndex; public final VariantFamilyAggregateCommandOptions variantAggregateFamily; @@ -96,6 +98,7 @@ public OperationsCommandOptions(GeneralCliOptions.CommonCommandOptions commonCom variantScoreIndex = new VariantScoreIndexCommandOptions(); variantScoreDelete = new VariantScoreDeleteCommandOptions(); variantSampleIndex = new VariantSampleGenotypeIndexCommandOptions(); + variantSampleIndexConfigure = new VariantSampleIndexConfigureCommandOptions(); variantFamilyIndex = new VariantFamilyGenotypeIndexCommandOptions(); variantAggregateFamily = new VariantFamilyAggregateCommandOptions(); variantAggregate = new VariantAggregateCommandOptions(); @@ -247,7 +250,7 @@ public class VariantScoreDeleteCommandOptions extends GenericVariantScoreDeleteC public GeneralCliOptions.StudyOption study = new GeneralCliOptions.StudyOption(); } - @Parameters(commandNames = {VARIANT_SAMPLE_GENOTYPE_INDEX}, commandDescription = SAMPLE_INDEX_COMMAND_DESCRIPTION) + @Parameters(commandNames = {VARIANT_SAMPLE_INDEX}, commandDescription = SAMPLE_INDEX_COMMAND_DESCRIPTION) public class VariantSampleGenotypeIndexCommandOptions extends GeneralCliOptions.StudyOption { @ParametersDelegate @@ -270,7 +273,20 @@ public class VariantSampleGenotypeIndexCommandOptions extends GeneralCliOptions. public boolean overwrite; } - @Parameters(commandNames = {VARIANT_FAMILY_GENOTYPE_INDEX}, commandDescription = FAMILY_INDEX_COMMAND_DESCRIPTION) + @Parameters(commandNames = {VARIANT_SAMPLE_INDEX_CONFIGURE}, commandDescription = "Modify sample index configuration") + public class VariantSampleIndexConfigureCommandOptions extends GeneralCliOptions.StudyOption { + + @ParametersDelegate + public GeneralCliOptions.JobOptions jobOptions = commonJobOptions; + + @ParametersDelegate + public GeneralCliOptions.CommonCommandOptions commonOptions = commonCommandOptions; + + @Parameter(names = {"--sample-index-configuration-file"}, required = true, description = "File containing the new SampleIndexConfiguration to upload in JSON format.") + public String sampleIndex; + } + + @Parameters(commandNames = {VARIANT_FAMILY_INDEX}, commandDescription = FAMILY_INDEX_COMMAND_DESCRIPTION) public class VariantFamilyGenotypeIndexCommandOptions extends GeneralCliOptions.StudyOption { @ParametersDelegate diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java index c2563fcaede..c57ec62cdf6 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java @@ -280,10 +280,10 @@ public RestResponse indexVariantSample(VariantSampleIndexParams data, Objec * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse configureSampleIndex(SampleIndexConfiguration data, ObjectMap params) throws ClientException { + public RestResponse configureSampleIndex(SampleIndexConfiguration data, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); params.put("body", data); - return execute("operation", null, "variant/sample/index", null, "configure", params, POST, ObjectMap.class); + return execute("operation", null, "variant/sample/index", null, "configure", params, POST, Job.class); } /** From 15a7eb32de330b779efb2a48793ea646c1740d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 26 Mar 2021 13:29:29 +0000 Subject: [PATCH 133/412] storage: Remove duplicated field at PopulationFrequencyRange #1699 --- .../opencb/opencga/client/rest/AbstractParentClient.java | 9 ++++----- .../core/config/storage/SampleIndexConfiguration.java | 6 +----- .../index/annotation/AnnotationIndexConverter.java | 4 ++-- .../index/annotation/PopulationFrequencyIndexSchema.java | 2 +- .../variant/index/sample/SampleIndexQueryParser.java | 2 +- 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java index f1ef3f0a219..f3cec729e65 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java @@ -104,6 +104,7 @@ protected AbstractParentClient(String token, ClientConfiguration configuration) } private Client newClient(ClientConfiguration configuration) { + ClientBuilder clientBuilder = ClientBuilder.newBuilder(); if (configuration.getRest().isTlsAllowInvalidCertificates()) { logger.debug("Using custom SSLContext to allow invalid certificates"); try { @@ -136,16 +137,14 @@ public boolean verify(String hostname, SSLSession sslSession) { return this.hostname.equals(hostname); } }; - return ClientBuilder.newBuilder() + clientBuilder .sslContext(sc) - .hostnameVerifier(verifier) - .build(); + .hostnameVerifier(verifier); } catch (NoSuchAlgorithmException | KeyManagementException e) { throw new RuntimeException(e); } - } else { - return ClientBuilder.newClient(); } + return clientBuilder.build(); } protected AbstractParentClient setThrowExceptionOnError(boolean throwExceptionOnError) { diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java index 4b6a8726ce0..4bf10855f54 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java @@ -147,10 +147,6 @@ public String getStudy() { return study; } - public String getStudyAndPopulation() { - return study + ":" + population; - } - public PopulationFrequencyRange setStudy(String study) { this.study = study; return this; @@ -205,7 +201,7 @@ public List getPopulationRang public SampleIndexConfiguration addPopulationRange(SampleIndexConfiguration.PopulationFrequencyRange populationRange) { if (populationRanges.contains(populationRange)) { throw new IllegalArgumentException("Duplicated population '" - + populationRange.getStudyAndPopulation() + "' in SampleIndexConfiguration"); + + populationRange.getKey() + "' in SampleIndexConfiguration"); } this.populationRanges.add(populationRange); return this; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java index 3b9a87f6ba8..c54bfc2b828 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java @@ -126,8 +126,8 @@ public AnnotationIndexConverter(SampleIndexSchema schema) { this.populations = new HashMap<>(schema.getConfiguration().getPopulationRanges().size()); int i = 0; for (SampleIndexConfiguration.PopulationFrequencyRange population : schema.getConfiguration().getPopulationRanges()) { - if (this.populations.put(population.getStudyAndPopulation(), i++) != null) { - throw new IllegalArgumentException("Duplicated population '" + population.getStudyAndPopulation() + "' in " + populations); + if (this.populations.put(population.getKey(), i++) != null) { + throw new IllegalArgumentException("Duplicated population '" + population.getKey() + "' in " + populations); } } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java index 30461677c30..05fbedc951c 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java @@ -30,7 +30,7 @@ public PopulationFrequencyIndexSchema(List populationR } bitOffset += field.getBitLength(); fields.add(field); - populations.put(configuration.getStudyAndPopulation(), field); + populations.put(configuration.getKey(), field); } updateIndexSizeBits(); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java index 535a3faed9c..0f6c24591c7 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java @@ -999,7 +999,7 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool boolean populationFilterFullyCovered = false; int popFreqIdx = 0; for (PopulationFrequencyRange populationRange : schema.getConfiguration().getPopulationRanges()) { - if (populationRange.getStudyAndPopulation().equals(studyPop)) { + if (populationRange.getKey().equals(studyPop)) { populationInSampleIndex = true; RangeQuery rangeQuery = getRangeQuery(keyOpValue.getOp(), freqFilter, populationRange.getThresholds(), 0, 1 + RangeIndexField.DELTA); From d071de6cab5fc94cd30ac46dae1b5bd8818ce631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 26 Mar 2021 15:46:30 +0000 Subject: [PATCH 134/412] storage: Mark IndexFieldConfiguration#id as JsonIgnore #1699 --- .../opencga/core/config/storage/IndexFieldConfiguration.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java index 87f7c1a248f..1009820bc62 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java @@ -1,6 +1,7 @@ package org.opencb.opencga.core.config.storage; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; import org.apache.commons.lang3.ArrayUtils; import java.beans.ConstructorProperties; @@ -51,6 +52,7 @@ public IndexFieldConfiguration(Source source, String key, Type type, String... v this.values = values; } + @JsonIgnore public String getId() { return getSource() + ":" + getKey(); } From 7b5de58a169d3f39eb79a663b107325cbf972d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 26 Mar 2021 17:04:44 +0000 Subject: [PATCH 135/412] app: Allow filter files by --index-status --- .../app/cli/main/executors/catalog/FileCommandExecutor.java | 1 + .../opencga/app/cli/main/options/FileCommandOptions.java | 3 +++ .../opencga/app/cli/main/options/JobCommandOptions.java | 2 +- .../org/opencb/opencga/catalog/managers/FileManager.java | 5 +++++ .../java/org/opencb/opencga/core/api/ParamConstants.java | 2 ++ .../java/org/opencb/opencga/server/rest/FileWSServer.java | 1 + 6 files changed, 13 insertions(+), 1 deletion(-) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/FileCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/FileCommandExecutor.java index 339f8bef97c..fc71190d6e3 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/FileCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/FileCommandExecutor.java @@ -218,6 +218,7 @@ private RestResponse search() throws ClientException { params.putIfNotNull(FileDBAdaptor.QueryParams.BIOFORMAT.key(), StringUtils.join(commandOptions.bioformat, ",")); params.putIfNotNull(FileDBAdaptor.QueryParams.FORMAT.key(), StringUtils.join(commandOptions.format, ",")); params.putIfNotEmpty(FileDBAdaptor.QueryParams.INTERNAL_STATUS.key(), commandOptions.status); + params.putIfNotEmpty(FileDBAdaptor.QueryParams.INTERNAL_INDEX_STATUS_NAME.key(), commandOptions.internalIndexStatus); params.putIfNotEmpty(FileDBAdaptor.QueryParams.DIRECTORY.key(), commandOptions.folder); params.putIfNotEmpty(FileDBAdaptor.QueryParams.CREATION_DATE.key(), commandOptions.creationDate); params.putIfNotEmpty(FileDBAdaptor.QueryParams.MODIFICATION_DATE.key(), commandOptions.modificationDate); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/FileCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/FileCommandOptions.java index b4ff2a7f118..c39ed181539 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/FileCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/FileCommandOptions.java @@ -227,6 +227,9 @@ public class SearchCommandOptions extends StudyOption { @Parameter(names = {"--size"}, description = ParamConstants.FILE_SIZE_DESCRIPTION, arity = 1) public String size; + @Parameter(names = {"--index-status", "--internal-index-status"}, description = ParamConstants.INTERNAL_INDEX_STATUS_DESCRIPTION, arity = 1) + public String internalIndexStatus; + @Parameter(names = {"--samples"}, description = ParamConstants.SAMPLES_DESCRIPTION, arity = 1) public String samples; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/JobCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/JobCommandOptions.java index 6dc5efbdd5f..a811e306e7f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/JobCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/JobCommandOptions.java @@ -132,7 +132,7 @@ public class RetryCommandOptions extends StudyOption { @Parameter(names = {"--job", "--job-to-retry"}, description = ParamConstants.JOB_ID_DESCRIPTION + " of the job to retry", required = true, arity = 1) public String jobToRetry; - @Parameter(names = {"--id"}, description = ParamConstants.JOB_ID_CREATION_DESCRIPTION, required = true, arity = 1) + @Parameter(names = {"--id"}, description = ParamConstants.JOB_ID_CREATION_DESCRIPTION, arity = 1) public String id; @Parameter(names = {"-d", "--description"}, description = ParamConstants.JOB_DESCRIPTION_DESCRIPTION, arity = 1) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java index eeff1ad0ef8..35456b7b123 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java @@ -1281,6 +1281,11 @@ public OpenCGAResult distinct(String studyId, String field, Query query, Stri void fixQueryObject(Study study, Query query, String user) throws CatalogException { super.fixQueryObject(query); + if (query.containsKey(ParamConstants.INTERNAL_INDEX_STATUS_PARAM)) { + query.put(FileDBAdaptor.QueryParams.INTERNAL_INDEX_STATUS_NAME.key(), query.get(ParamConstants.INTERNAL_INDEX_STATUS_PARAM)); + query.remove(ParamConstants.INTERNAL_INDEX_STATUS_PARAM); + } + if (query.containsKey(FileDBAdaptor.QueryParams.ID.key())) { if (StringUtils.isNotEmpty(query.getString(FileDBAdaptor.QueryParams.ID.key()))) { OpenCGAResult queryResult = internalGet(study.getUid(), query.getAsStringList(FileDBAdaptor.QueryParams.ID.key()), diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index d638f62e9d9..573700e68a3 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -41,6 +41,8 @@ public class ParamConstants { public static final String INTERNAL_STATUS_PARAM = "internalStatus"; public static final String INTERNAL_STATUS_DESCRIPTION = "Filter by internal status"; + public static final String INTERNAL_INDEX_STATUS_PARAM = "internalIndexStatus"; + public static final String INTERNAL_INDEX_STATUS_DESCRIPTION = "Filter by internal index status"; public static final String STATUS_PARAM = "status"; public static final String STATUS_DESCRIPTION = "Filter by status"; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/FileWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/FileWSServer.java index b875ad02069..cbb594f6775 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/FileWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/FileWSServer.java @@ -324,6 +324,7 @@ public Response search( @ApiParam(value = ParamConstants.FILE_FORMAT_DESCRIPTION) @DefaultValue("") @QueryParam("format") String formats, @ApiParam(value = ParamConstants.STATUS_DESCRIPTION) @QueryParam(ParamConstants.STATUS_PARAM) String status, @ApiParam(value = ParamConstants.INTERNAL_STATUS_DESCRIPTION) @QueryParam(ParamConstants.INTERNAL_STATUS_PARAM) String internalStatus, + @ApiParam(value = ParamConstants.INTERNAL_INDEX_STATUS_DESCRIPTION) @QueryParam(ParamConstants.INTERNAL_INDEX_STATUS_PARAM) String internalIndexStatus, @ApiParam(value = ParamConstants.FILE_DIRECTORY_DESCRIPTION) @DefaultValue("") @QueryParam("directory") String directory, @ApiParam(value = ParamConstants.CREATION_DATE_DESCRIPTION) @QueryParam("creationDate") String creationDate, @ApiParam(value = ParamConstants.MODIFICATION_DATE_DESCRIPTION) @QueryParam("modificationDate") String modificationDate, From 537724456545f1c36c0d0cd663e074204480e644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 26 Mar 2021 18:00:01 +0000 Subject: [PATCH 136/412] analysis: Add fatherSampleId and motherSampleId to KnockoutAnalysisResult --- .../variant/knockout/KnockoutAnalysis.java | 20 ++++++++++++++++-- .../knockout/KnockoutByIndividual.java | 21 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index e44de06802a..fdf893ee28f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -291,11 +291,27 @@ protected void run() throws Exception { } else { sampleIdToIndividualIdMap.put(knockoutByIndividual.getSampleId(), individual.getId()); knockoutByIndividual.setId(individual.getId()); - if (individual.getFather() != null) { + List parentsIndividuals = new ArrayList<>(2); + if (individual.getFather() != null && individual.getFather().getId() != null) { knockoutByIndividual.setFatherId(individual.getFather().getId()); + parentsIndividuals.add(knockoutByIndividual.getFatherId()); } - if (individual.getMother() != null) { + if (individual.getMother() != null && individual.getMother().getId() != null) { knockoutByIndividual.setMotherId(individual.getMother().getId()); + parentsIndividuals.add(knockoutByIndividual.getMotherId()); + } + if (!parentsIndividuals.isEmpty()) { + for (Individual parent : catalogManager.getIndividualManager().get(study, parentsIndividuals, + new QueryOptions(QueryOptions.INCLUDE, Arrays.asList(IndividualDBAdaptor.QueryParams.ID.key(), + IndividualDBAdaptor.QueryParams.SAMPLES.key() + ".id")), token).getResults()) { + if (parent.getSamples() != null && !parent.getSamples().isEmpty()) { + if (parent.getId().equals(knockoutByIndividual.getFatherId())) { + knockoutByIndividual.setFatherSampleId(parent.getSamples().get(0).getId()); + } else { + knockoutByIndividual.setMotherSampleId(parent.getSamples().get(0).getId()); + } + } + } } knockoutByIndividual.setSex(individual.getSex()); knockoutByIndividual.setDisorders(individual.getDisorders()); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java index ba7220d26ee..8e87fc9816d 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java @@ -19,6 +19,7 @@ import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.biodata.models.pedigree.IndividualProperty.Sex; +import org.opencb.opencga.core.common.JacksonUtils; import java.util.*; @@ -27,7 +28,9 @@ public class KnockoutByIndividual { private String id; private String sampleId; private String motherId; + private String motherSampleId; private String fatherId; + private String fatherSampleId; private Sex sex; private List phenotypes; private List disorders; @@ -91,6 +94,15 @@ public KnockoutByIndividual setMotherId(String motherId) { return this; } + public String getMotherSampleId() { + return motherSampleId; + } + + public KnockoutByIndividual setMotherSampleId(String motherSampleId) { + this.motherSampleId = motherSampleId; + return this; + } + public String getFatherId() { return fatherId; } @@ -100,6 +112,15 @@ public KnockoutByIndividual setFatherId(String fatherId) { return this; } + public String getFatherSampleId() { + return fatherSampleId; + } + + public KnockoutByIndividual setFatherSampleId(String fatherSampleId) { + this.fatherSampleId = fatherSampleId; + return this; + } + public Sex getSex() { return sex; } From e18610a8fb74e92d27155ead9e75bbc0f4f929dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 26 Mar 2021 18:45:52 +0000 Subject: [PATCH 137/412] storage: Fix custom fields accumulators for aggregation queries. #1699 --- .../query/executors/accumulators/Range.java | 76 ++++++++++- ...SampleIndexVariantAggregationExecutor.java | 124 ++++++++++-------- .../variant/index/core/RangeIndexField.java | 10 +- .../index/core/RangeIndexFieldTest.java | 8 ++ .../variant/index/sample/SampleIndexTest.java | 1 + 5 files changed, 158 insertions(+), 61 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java index 19875fcccdd..f77e90f9841 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java @@ -1,7 +1,11 @@ package org.opencb.opencga.storage.core.variant.query.executors.accumulators; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; + import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; +import java.util.Objects; public class Range> implements Comparable> { private final N start; @@ -30,11 +34,13 @@ public Range(N start, boolean startInclusive, N end, boolean endInclusive) { } else { sb.append(start); } - sb.append(", "); - if (end == null) { - sb.append("inf"); - } else { - sb.append(end); + if (!Objects.equals(start, end)) { + sb.append(", "); + if (end == null) { + sb.append("inf"); + } else { + sb.append(end); + } } if (endInclusive) { sb.append("]"); @@ -44,6 +50,40 @@ public Range(N start, boolean startInclusive, N end, boolean endInclusive) { s = sb.toString(); } + public static List> buildRanges(IndexFieldConfiguration index) { + return buildRanges(index, null, null); + } + + public static List> buildRanges(IndexFieldConfiguration index, Double min, Double max) { + List> ranges = new LinkedList<>(); + if (index.getNullable()) { + ranges.add(new Range.NA<>()); + } + double[] thresholds = index.getThresholds(); + boolean startInclusive = index.getType() == IndexFieldConfiguration.Type.RANGE_LT; + boolean endInclusive = index.getType() == IndexFieldConfiguration.Type.RANGE_GT; + ranges.add(new Range<>(min, false, thresholds[0], endInclusive)); + for (int i = 1; i < thresholds.length; i++) { + ranges.add(new Range<>(thresholds[i - 1], startInclusive, thresholds[i], endInclusive)); + } + ranges.add(new Range<>(thresholds[thresholds.length - 1], false, max, false)); + + // Check duplicated values + for (int i = index.getNullable() ? 2 : 1; i < ranges.size() - 1; i++) { + Range range = ranges.get(i); + if (range.start.equals(range.end)) { + Range pre = ranges.get(i - 1); + ranges.set(i - 1, new Range<>(pre.start, pre.startInclusive, pre.end, false)); + + ranges.set(i, new Range<>(range.start, true, range.end, true)); + + Range post = ranges.get(i + 1); + ranges.set(i + 1, new Range<>(post.start, false, post.end, post.endInclusive)); + } + } + return ranges; + } + public static > List> buildRanges(List thresholds, N start, N end) { List> ranges = new ArrayList<>(thresholds.size() + 1); @@ -90,4 +130,30 @@ public boolean isBeforeEnd(N number) { public int compareTo(Range o) { return start.compareTo(o.start); } + + public static class NA> extends Range { + + public NA() { + super(null, null); + } + + @Override + public String toString() { + return "NA"; + } + + @Override + public boolean isBeforeEnd(N number) { + return number != null; + } + + @Override + public int compareTo(Range o) { + if (o instanceof Range.NA) { + return 0; + } else { + return -1; + } + } + } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java index a7c110438a5..02ed154b2e0 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java @@ -9,7 +9,6 @@ import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.commons.datastore.solr.FacetQueryParser; import org.opencb.opencga.core.response.VariantQueryResult; import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; @@ -30,7 +29,7 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; -import java.util.stream.Collectors; +import java.util.regex.Pattern; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.REGION; import static org.opencb.opencga.storage.core.variant.search.solr.SolrQueryParser.CHROM_DENSITY; @@ -39,6 +38,8 @@ public class SampleIndexVariantAggregationExecutor extends VariantAggregationExe private final SampleIndexDBAdaptor sampleIndexDBAdaptor; private VariantStorageMetadataManager metadataManager; + private static final Pattern CATEGORICAL_PATTERN = Pattern.compile("^([a-zA-Z][a-zA-Z0-9_.:]+)(\\[[a-zA-Z0-9,*]+])?(:\\*|:\\d+)?$"); + public static final Set VALID_FACETS = new HashSet<>(Arrays.asList( CHROM_DENSITY, "chromosome", @@ -47,10 +48,7 @@ public class SampleIndexVariantAggregationExecutor extends VariantAggregationExe "consequenceType", "ct", "biotype", "bt", "clinicalSignificance", - "depth", "dp", "coverage", - "qual", "mendelianError", "me", - "filter", "length", "titv" )); @@ -64,12 +62,22 @@ public SampleIndexVariantAggregationExecutor(VariantStorageMetadataManager metad @Override protected boolean canUseThisExecutor(Query query, QueryOptions options, String facet) throws Exception { if (SampleIndexQueryParser.validSampleIndexQuery(query)) { + SampleIndexSchema schema = null; for (String fieldFacedMulti : facet.split(FACET_SEPARATOR)) { for (String fieldFaced : fieldFacedMulti.split(NESTED_FACET_SEPARATOR)) { String key = fieldFaced.split("\\[")[0]; // Must contain all keys if (!VALID_FACETS.contains(key)) { - return false; + if (schema == null) { + StudyMetadata defaultStudy = VariantQueryParser.getDefaultStudy(query, metadataManager); + schema = sampleIndexDBAdaptor.getSchema(defaultStudy.getId()); + } + if (key.equalsIgnoreCase("depth") || key.equalsIgnoreCase("coverage")) { + key = "dp"; + } + if (getIndexField(schema, key) == null) { + return false; + } } } } @@ -134,7 +142,7 @@ private FacetFieldAccumulator createAccumulator(Query q // Reverse traverse for (int i = split.length - 1; i >= 0; i--) { String facetField = split[i]; - Matcher matcher = FacetQueryParser.CATEGORICAL_PATTERN.matcher(facetField); + Matcher matcher = CATEGORICAL_PATTERN.matcher(facetField); if (!matcher.find()) { throw new VariantQueryException("Malformed aggregation stats query: " + facetField); } @@ -253,56 +261,48 @@ private FacetFieldAccumulator createAccumulator(Query q fieldKey); break; default: - for (IndexField fileDataIndexField : schema.getFileIndex().getCustomFields()) { - if (fileDataIndexField.getKey().equalsIgnoreCase(fieldKey)) { - switch (fileDataIndexField.getType()) { - case RANGE_LT: - case RANGE_GT: - double[] thresholds = fileDataIndexField.getConfiguration().getThresholds(); - List> ranges = Range.buildRanges( - Arrays.stream(thresholds) - .boxed() - .collect(Collectors.toList()), 0.0, null); - thisAccumulator = RangeAccumulator.fromIndex(t -> { - BitBuffer fileIndex = t.getFileIndex(); - return fileDataIndexField.read(fileIndex); - }, fieldKey, ranges, null); - break; - case CATEGORICAL: - thisAccumulator = new CategoricalAccumulator<>( - s -> { - BitBuffer fileIndex = s.getFileIndex(); - String value = fileDataIndexField.readAndDecode(fileIndex); - if (value == null) { - return Collections.singletonList("other"); - } else { - return Collections.singletonList(value); - } - }, - fieldKey); - break; - case CATEGORICAL_MULTI_VALUE: - thisAccumulator = new CategoricalAccumulator<>( - s -> { - BitBuffer fileIndex = s.getFileIndex(); - String value = fileDataIndexField.readAndDecode(fileIndex); - if (value == null) { - return Collections.singletonList("other"); - } else { - return Arrays.asList(value.split(",")); - } - }, - fieldKey); - break; - default: - throw new IllegalStateException("Unknown index type " + fileDataIndexField.getType()); - } - break; - } - } - if (thisAccumulator == null) { + IndexField fileDataIndexField = getIndexField(schema, fieldKey); + if (fileDataIndexField == null) { throw new IllegalArgumentException("Unknown faced field '" + facetField + "'"); } + switch (fileDataIndexField.getType()) { + case RANGE_LT: + case RANGE_GT: + List> ranges = Range.buildRanges(fileDataIndexField.getConfiguration()); + thisAccumulator = RangeAccumulator.fromIndex(t -> { + BitBuffer fileIndex = t.getFileIndex(); + return fileDataIndexField.read(fileIndex); + }, fieldKey, ranges, null); + break; + case CATEGORICAL: + thisAccumulator = new CategoricalAccumulator<>( + s -> { + BitBuffer fileIndex = s.getFileIndex(); + String value = fileDataIndexField.readAndDecode(fileIndex); + if (value == null) { + return Collections.singletonList("other"); + } else { + return Collections.singletonList(value); + } + }, + fieldKey); + break; + case CATEGORICAL_MULTI_VALUE: + thisAccumulator = new CategoricalAccumulator<>( + s -> { + BitBuffer fileIndex = s.getFileIndex(); + String value = fileDataIndexField.readAndDecode(fileIndex); + if (value == null) { + return Collections.singletonList("other"); + } else { + return Arrays.asList(value.split(",")); + } + }, + fieldKey); + break; + default: + throw new IllegalStateException("Unknown index type " + fileDataIndexField.getType()); + } } if (accumulator != null) { @@ -312,4 +312,18 @@ private FacetFieldAccumulator createAccumulator(Query q } return accumulator; } + + private IndexField getIndexField(SampleIndexSchema schema, String fieldKey) { + for (IndexField customField : schema.getFileIndex().getCustomFields()) { + if (customField.getId().equalsIgnoreCase(fieldKey)) { + return customField; + } + } + for (IndexField customField : schema.getFileIndex().getCustomFields()) { + if (customField.getKey().equalsIgnoreCase(fieldKey)) { + return customField; + } + } + return null; + } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java index cb6ce6c45d7..9c059dacaa5 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexField.java @@ -2,10 +2,13 @@ import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.core.variant.query.OpValue; +import org.opencb.opencga.storage.core.variant.query.executors.accumulators.Range; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; +import java.util.List; + /** * Single value range index. */ @@ -17,6 +20,7 @@ public class RangeIndexField extends IndexField { private final double max; private final int numBits; private final IndexCodec codec; + private int numRanges; public RangeIndexField(IndexFieldConfiguration configuration, int bitOffset) { super(configuration, bitOffset); @@ -24,7 +28,7 @@ public RangeIndexField(IndexFieldConfiguration configuration, int bitOffset) { min = Double.MIN_VALUE; max = MAX; // There is one range more than thresholds. - int numRanges = thresholds.length + 1; + numRanges = thresholds.length + 1; if (configuration.getNullable()) { // Add one range for the NA numRanges++; @@ -86,6 +90,10 @@ public Double decode(int code) { return codec.decode(code); } + public List> getRanges() { + return Range.buildRanges(getConfiguration()); + } + @Override protected IndexFieldFilter getSingleValueIndexFilter(OpValue opValue) { return new RangeIndexFieldFilter(this, opValue); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java index 882f00e2a46..492c420063c 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/core/RangeIndexFieldTest.java @@ -36,4 +36,12 @@ public void testNumericMethods() { assertNotEquals(2.0, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA, 0); assertEquals(2.0, 2 + RangeIndexField.DELTA - RangeIndexField.DELTA, RangeIndexField.DELTA); } + + @Test + public void testGetRanges() { + System.out.println(new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3, 4}, IndexFieldConfiguration.Type.RANGE_GT).setNullable(false), 0).getRanges()); + System.out.println(new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3, 4}, IndexFieldConfiguration.Type.RANGE_GT).setNullable(true), 0).getRanges()); + System.out.println(new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3, 4}, IndexFieldConfiguration.Type.RANGE_LT).setNullable(false), 0).getRanges()); + System.out.println(new RangeIndexField(new IndexFieldConfiguration(SAMPLE, "K", new double[]{1, 2, 2, 3, 4}, IndexFieldConfiguration.Type.RANGE_LT).setNullable(true), 0).getRanges()); + } } \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java index d66c93e95bd..c9333d49d7b 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java @@ -570,6 +570,7 @@ public void testAggregation() throws Exception { testAggregation(executor, "qual", STUDY_NAME_3, "NA12877"); testAggregation(executor, "dp", STUDY_NAME_3, "NA12877"); + testAggregation(executor, "sample:DP", STUDY_NAME_3, "NA12877"); testAggregation(executor, "qual>>type", STUDY_NAME_3, "NA12877"); testAggregation(executor, "type>>qual", STUDY_NAME_3, "NA12877"); From 6b489fe61ce9ee46dc12073e6729a3708b8ac2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Mon, 29 Mar 2021 10:38:53 +0200 Subject: [PATCH 138/412] analysis: set filtering-flag value to 0xB00 when running alignment stats --- .../opencga/analysis/alignment/AlignmentStorageManager.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java index 8ad29b949ea..461fefd6a55 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java @@ -156,6 +156,12 @@ public void statsRun(String study, String inputFile, String outdir, String token ObjectMap params = new ObjectMap(); params.put(SamtoolsWrapperAnalysis.INDEX_STATS_PARAM, true); + // Filter flag: + // - not primary alignment (0x100) + // - read fails platform/vendor quality checks (0x200) + // - supplementary alignment (0x800) + params.put("F", "0xB00"); + SamtoolsWrapperAnalysis samtools = new SamtoolsWrapperAnalysis(); samtools.setUp(null, catalogManager, storageEngineFactory, params, Paths.get(outdir), jobId, token); From d639ea2cef3e825a10c2175e112ab3f701ab1bf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Mon, 29 Mar 2021 10:54:21 +0200 Subject: [PATCH 139/412] test: fix alignment stats test --- .../org/opencb/opencga/app/cli/analysis/InternalMainTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java b/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java index 38e6f61c149..5c86c2f12f6 100644 --- a/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java +++ b/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java @@ -393,9 +393,9 @@ public void testStats() throws CatalogException, IOException, ToolException { // stats run execute("alignment", "stats-run", - "--session-id", sessionId, + "--token", sessionId, "--study", studyId, - "--input-file", bamFile.getName(), + "--file", bamFile.getName(), "-o", temporalDir); assertTrue(Files.exists(Paths.get(temporalDir).resolve(filename + ".stats.txt"))); From 915f5ed3a005a875eb1b3a7bdbf9153319e48e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Mon, 29 Mar 2021 09:49:12 +0100 Subject: [PATCH 140/412] k8s: Remove readOnlyRootFilesystem:true #1725 --- opencga-app/app/cloud/docker/opencga-base/Dockerfile | 1 + opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh | 6 +++--- opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml | 6 +++--- opencga-core/src/main/resources/configuration.yml | 3 ++- .../opencga/master/monitor/executors/K8SExecutor.java | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/opencga-app/app/cloud/docker/opencga-base/Dockerfile b/opencga-app/app/cloud/docker/opencga-base/Dockerfile index 9af7c86ae8a..da5923c2446 100644 --- a/opencga-app/app/cloud/docker/opencga-base/Dockerfile +++ b/opencga-app/app/cloud/docker/opencga-base/Dockerfile @@ -11,5 +11,6 @@ RUN apk --no-cache --update add openssh-client sshpass ca-certificates curl dock adduser -D -u 1001 opencga -h /home/opencga COPY ${BUILD_PATH} /opt/opencga +RUN chown -R 1001 /opt/opencga/ WORKDIR /opt/opencga/bin diff --git a/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh b/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh index 34b315411f1..0c263273236 100644 --- a/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh +++ b/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # INIT_HADOOP_SSH_DNS # INIT_HADOOP_SSH_USER @@ -13,13 +13,13 @@ if [ -z "${INIT_HADOOP_SSH_PASS}" ] ; then # If empty, assume ssh-key exists in the system SSHPASS_CMD="" else - SSHPASS=$INIT_HADOOP_SSH_PASS + export SSHPASS=$INIT_HADOOP_SSH_PASS # If non zero, use sshpass command SSHPASS_CMD="sshpass -e" fi SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ServerAliveInterval=60" -if [ ! -z ${INIT_HADOOP_SSH_KEY} ] && [ -f ${INIT_HADOOP_SSH_KEY} ] ; then +if [ -n "${INIT_HADOOP_SSH_KEY}" ] && [ -f "${INIT_HADOOP_SSH_KEY}" ] ; then SSH_OPTS="${SSH_OPTS} -i ${INIT_HADOOP_SSH_KEY}" fi diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index 3ede5511bf4..43dccf16c4b 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -83,7 +83,7 @@ rest: # fsGroup: 2000 securityContext: - readOnlyRootFilesystem: true + readOnlyRootFilesystem: false runAsUser: 1001 # capabilities: # drop: @@ -157,7 +157,7 @@ master: # fsGroup: 2000 securityContext: - readOnlyRootFilesystem: true + readOnlyRootFilesystem: false runAsUser: 1001 # capabilities: # drop: @@ -192,7 +192,7 @@ init: pullPolicy: IfNotPresent securityContext: - readOnlyRootFilesystem: true + readOnlyRootFilesystem: false runAsUser: 1001 # capabilities: # drop: diff --git a/opencga-core/src/main/resources/configuration.yml b/opencga-core/src/main/resources/configuration.yml index 399b5342492..7c03b5365ed 100644 --- a/opencga-core/src/main/resources/configuration.yml +++ b/opencga-core/src/main/resources/configuration.yml @@ -208,10 +208,11 @@ analysis: persistentVolumeClaim: claimName: "pvc-opencga-analysisconf" k8s.podSecurityContext: + runAsNonRoot: true k8s.securityContext: runAsNonRoot: true runAsUser: 1001 - readOnlyRootFilesystem: true + readOnlyRootFilesystem: false # List of analysis frameworks frameworks: diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java index bced9ff00e5..2befa8ce8e1 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/executors/K8SExecutor.java @@ -125,7 +125,7 @@ public K8SExecutor(Execution execution) { securityContext = new SecurityContextBuilder() .withRunAsUser(1001L) .withRunAsNonRoot(true) - .withReadOnlyRootFilesystem(true) + .withReadOnlyRootFilesystem(false) .build(); } if (execution.getOptions().containsKey(K8S_POD_SECURITY_CONTEXT)) { From 896232764a83eb3f9912cdab071a11f2fed33756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Mon, 29 Mar 2021 10:28:35 +0100 Subject: [PATCH 141/412] k8s: Enable back default-configuration ConfigMap in kubernetes #1731 --- .../app/cloud/docker/opencga-init/setup.sh | 35 ++--- .../charts/opencga/templates/configmap.yaml | 3 +- .../opencga/templates/master-deployment.yaml | 4 +- .../kubernetes/charts/opencga/values.yaml | 4 + opencga-app/app/cloud/kubernetes/setup-k8s.sh | 128 +++++++++++------- 5 files changed, 106 insertions(+), 68 deletions(-) diff --git a/opencga-app/app/cloud/docker/opencga-init/setup.sh b/opencga-app/app/cloud/docker/opencga-init/setup.sh index 25d83f913cf..b6a8327c419 100644 --- a/opencga-app/app/cloud/docker/opencga-init/setup.sh +++ b/opencga-app/app/cloud/docker/opencga-init/setup.sh @@ -10,8 +10,9 @@ if find /opt/opencga/libs/opencga-storage-hadoop-deps-* &> /dev/null ; then fi FILE=/opt/volume/conf/configuration.yml -if [ -f "$FILE" ]; then +if [ -f "$FILE" ] && [ "${OVERWRITE_CONFIGURATION:-false}" == "false" ]; then echo "$FILE already exists" + cp -r /opt/volume/conf/* /opt/opencga/conf/* else echo "Copying default configs" cp -r -L -v /opt/opencga/default-conf/* /opt/opencga/conf/ @@ -23,35 +24,35 @@ else # Copies the config files from our local directory into a # persistent volume to be shared by the other containers. echo "Initialising volume" + echo "Copying final configs" #mkdir -p /opt/volume/conf /opt/volume/variants cp -r /opt/opencga/conf/* /opt/volume/conf + echo "Copying final analysis folder" cp -r /opt/opencga/analysis/* /opt/volume/analysis fi + + +CATALOG_STATUS=$(/opt/opencga/bin/opencga-admin.sh catalog status --log-level warn) # wait for mongodb echo "About to wait for MongoDB" -until mongo mongodb://$(echo $INIT_CATALOG_DATABASE_HOSTS | cut -d',' -f1)/\?replicaSet=rs0 \ - -u $INIT_CATALOG_DATABASE_USER -p $INIT_CATALOG_DATABASE_PASSWORD --authenticationDatabase admin \ - --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates --quiet \ - --eval 'db.getMongo().getDBNames().indexOf("admin")' -do +until [ "$(echo "$CATALOG_STATUS" | jq -r .mongodbStatus)" == "true" ]; do echo "Waiting for Mongo DB" + CATALOG_STATUS=$(/opt/opencga/bin/opencga-admin.sh catalog status --log-level warn) done -DB_EXISTS=$(mongo mongodb://$(echo $INIT_CATALOG_DATABASE_HOSTS | cut -d',' -f1)/\?replicaSet=rs0 \ - -u $INIT_CATALOG_DATABASE_USER -p $INIT_CATALOG_DATABASE_PASSWORD --authenticationDatabase admin \ - --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates --quiet \ - --eval 'db.getMongo().getDBNames().indexOf("opencga_catalog")' | tail -1) -echo "DB EXISTS: $DB_EXISTS" - -if [ $(($DB_EXISTS)) == -1 ]; then +INSTALLED="$(echo "$CATALOG_STATUS" | jq -r .installed)" +DB_NAME="$(echo "$CATALOG_STATUS" | jq -r .catalogDBName)" +echo "DB Name: $INSTALLED" +echo "Catalog installed : $INSTALLED" +if [ "$INSTALLED" == false ]; then echo "Installing catalog" echo "${INIT_OPENCGA_PASS}" | /opt/opencga/bin/opencga-admin.sh catalog install echo "catalog installed" - echo "copying session files" - cp -r /opt/opencga/sessions/* /opt/volume/sessions - echo "copied session files" +# echo "copying session files" +# cp -r /opt/opencga/sessions/* /opt/volume/sessions +# echo "copied session files" else - echo "DB opencga_catalog already exists" + echo "DB '${DB_NAME}' already installed" fi diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml index cfe64536551..077f2b3bf5a 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml @@ -3,4 +3,5 @@ kind: ConfigMap metadata: name: {{ include "opencga.defaultConf.name" . }} data: - {{- (.Files.Glob "../../../../conf/**.yml").AsConfig | nindent 2 }} \ No newline at end of file + {{- (.Files.Glob "conf/**.yml").AsConfig | nindent 2 }} + {{- (.Files.Glob "conf/**.xml").AsConfig | nindent 2 }} \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml index 2131c940e33..4483cd88511 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml @@ -32,6 +32,8 @@ spec: resources: {{- toYaml .Values.init.resources | nindent 12 }} env: + - name: "OVERWRITE_CONFIGURATION" + value: "{{ .Values.init.configuration.overwrite }}" - name: "INIT_OPENCGA_PASS" valueFrom: secretKeyRef: @@ -109,7 +111,7 @@ spec: - name : analysisconf mountPath: /opt/volume/analysis - name : sessions - mountPath: /opt/volume/sessions + mountPath: /opt/opencga/sessions {{- with .Values.init.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index 43dccf16c4b..f2e56523092 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -191,6 +191,10 @@ init: repository: "opencb/opencga-init:{{ .Chart.AppVersion }}-{{ .Values.hadoop.flavour }}" pullPolicy: IfNotPresent + configuration: + # Overwrite configuration from image. + overwrite: false + securityContext: readOnlyRootFilesystem: false runAsUser: 1001 diff --git a/opencga-app/app/cloud/kubernetes/setup-k8s.sh b/opencga-app/app/cloud/kubernetes/setup-k8s.sh index 20e9db705b5..e051a6adec4 100755 --- a/opencga-app/app/cloud/kubernetes/setup-k8s.sh +++ b/opencga-app/app/cloud/kubernetes/setup-k8s.sh @@ -2,7 +2,6 @@ set -e - function printUsage() { echo "" echo "Deploy required Helm charts for a fully working OpenCGA installation" @@ -13,15 +12,17 @@ function printUsage() { echo "Usage: $(basename $0) --context [options]" echo "" echo "Options:" - echo " * -c --context Kubernetes context" - echo " -n --namespace Kubernetes namespace" - echo " * -f --values Helm values file" - echo " -o --outdir Output directory where to write the generated manifests. Default: \$PWD" - echo " --name-suffix Helm deployment name suffix. e.g. '-test' : opencga-nginx-test, opencga-test, iva-test" - echo " --what What to deploy. [nginx, iva, opencga, all]. Default: all" - echo " --dry-run Simulate an installation." - echo " -h --help Print this help" - echo " --verbose Verbose mode. Print debugging messages about the progress." + echo " * -c --context STRING Kubernetes context" + echo " -n --namespace STRING Kubernetes namespace" + echo " * -f --values FILE Helm values file" + echo " -o --outdir DIRECTORY Output directory where to write the generated manifests. Default: \$PWD" + echo " --name-suffix STRING Helm deployment name suffix. e.g. '-test' : opencga-nginx-test, opencga-test, iva-test" + echo " --what STRING What to deploy. [nginx, iva, opencga, all]. Default: all" + echo " --opencga-conf-dir DIRECTORY OpenCGA configuration folder. Default: build/conf/ " + echo " --keep-tmp-files FLAG Do not remove any temporary file generated in the outdir" + echo " --dry-run FLAG Simulate an installation." + echo " -h --help FLAG Print this help" + echo " --verbose FLAG Verbose mode. Print debugging messages about the progress." echo "" } @@ -61,65 +62,73 @@ function requiredDirectory() { WHAT=ALL DRY_RUN=false #NAME_SUFFIX -#HELM_OPTS +HELM_OPTS="${HELM_OPTS} --debug " OUTPUT_DIR="$(pwd)" - - -while [[ $# -gt 0 ]] -do -key="$1" -value="$2" -case $key in - -h|--help) +#OPENCGA_CONF_DIR +KEEP_TMP_FILES=false + +while [[ $# -gt 0 ]]; do + key="$1" + value="$2" + case $key in + -h | --help) printUsage exit 0 ;; - -c|--context) + -c | --context) K8S_CONTEXT="$value" shift # past argument shift # past value ;; - -n|--namespace) + -n | --namespace) K8S_NAMESPACE="$value" shift # past argument shift # past value ;; - -f|--values) + -f | --values) HELM_VALUES_FILE="$value" shift # past argument shift # past value ;; - -o|--outdir) + -o | --outdir) OUTPUT_DIR="$value" shift # past argument shift # past value ;; - --what) + --what) WHAT="${value^^}" # Upper case + shift # past argument + shift # past value + ;; + --name-suffix) + NAME_SUFFIX="${value}" shift # past argument shift # past value ;; - --name-suffix) - NAME_SUFFIX="${value}" + --opencga-conf-dir) + OPENCGA_CONF_DIR="${value}" shift # past argument shift # past value ;; - --verbose) + --keep-tmp-files) + KEEP_TMP_FILES=true + shift # past argument + ;; + --verbose) set -x - HELM_OPTS="${HELM_OPTS} --debug " shift # past argument ;; - --dry-run) + --dry-run) DRY_RUN=true HELM_OPTS="${HELM_OPTS} --dry-run " shift # past argument ;; - *) # unknown option + *) # unknown option echo "Unknown option $key" printUsage exit 1 ;; -esac + esac done K8S_NAMESPACE="${K8S_NAMESPACE:-$K8S_CONTEXT}" @@ -128,6 +137,12 @@ requiredParam "--values" "${HELM_VALUES_FILE}" requiredDirectory "--outdir" "${OUTPUT_DIR}" OUTPUT_DIR=$(realpath "${OUTPUT_DIR}") +if [ -n "${OPENCGA_CONF_DIR}" ]; then + requiredDirectory "--opencga-conf-dir" "${OPENCGA_CONF_DIR}" + OPENCGA_CONF_DIR=$(realpath "${OPENCGA_CONF_DIR}") +else + OPENCGA_CONF_DIR=$(realpath "$(dirname "$0")/../../conf") +fi for f in $(echo "${HELM_VALUES_FILE}" | tr "," "\n"); do requiredFile "--values" "${f}" @@ -148,7 +163,7 @@ function configureContext() { # Create a namespace for opencga if ! kubectl get namespace "${K8S_NAMESPACE}"; then - kubectl create namespace "${K8S_NAMESPACE}" + kubectl create namespace "${K8S_NAMESPACE}" fi kubectl config set-context "${K8S_CONTEXT}" --namespace="${K8S_NAMESPACE}" @@ -164,20 +179,36 @@ function deployNginx() { NAME="opencga-nginx${NAME_SUFFIX}" echo "# Deploy NGINX ${NAME}" helm upgrade ${NAME} stable/nginx-ingress \ - --kube-context "${K8S_CONTEXT}" --namespace "${K8S_NAMESPACE}" --version 1.27.0 \ - -f charts/nginx/values.yaml \ - --values "${HELM_VALUES_FILE}" \ - --install --wait --timeout 10m ${HELM_OPTS} + --kube-context "${K8S_CONTEXT}" --namespace "${K8S_NAMESPACE}" --version 1.27.0 \ + -f charts/nginx/values.yaml \ + --values "${HELM_VALUES_FILE}" \ + --install --wait --timeout 10m ${HELM_OPTS} } function deployOpenCGA() { - NAME="opencga${NAME_SUFFIX}" - echo "# Deploy OpenCGA ${NAME}" - helm upgrade "${NAME}" charts/opencga \ - --values "${HELM_VALUES_FILE}" \ - --install --wait --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" --timeout 10m ${HELM_OPTS} + if [[ -n "$OPENCGA_CONF_DIR" ]]; then + NAME="opencga${NAME_SUFFIX}" + echo "# Deploy OpenCGA ${NAME}" + DATE=$(date "+%Y%m%d%H%M%S") + OPENCGA_CHART="${OUTPUT_DIR:?}/${NAME}_${DATE}_tmp/" + if [ $KEEP_TMP_FILES == "false" ]; then + trap 'rm -rf "${OPENCGA_CHART:?}"' EXIT + fi + + mkdir "$OPENCGA_CHART" + mkdir "$OPENCGA_CHART"/conf + cp -r charts/opencga/* "${OPENCGA_CHART:?}" + cp -r "${OPENCGA_CONF_DIR:?}"/*.yml "$OPENCGA_CHART"/conf + cp -r "${OPENCGA_CONF_DIR:?}"/log4j2.*.xml "$OPENCGA_CHART"/conf + else + OPENCGA_CHART=charts/opencga/ + fi + + helm upgrade "${NAME}" "${OPENCGA_CHART}" \ + --values "${HELM_VALUES_FILE}" \ + --install --wait --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" --timeout 10m ${HELM_OPTS} if [ $DRY_RUN == "false" ]; then - helm get manifest "${NAME}" --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" > "${OUTPUT_DIR}/helm-${NAME}-manifest-$(date "+%Y%m%d%H%M%S").yaml" + helm get manifest "${NAME}" --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" >"${OUTPUT_DIR}/helm-${NAME}-manifest-${DATE}.yaml" fi } @@ -185,26 +216,25 @@ function deployIVA() { NAME="iva${NAME_SUFFIX}" echo "# Deploy IVA ${NAME}" helm upgrade ${NAME} charts/iva \ - --values "${HELM_VALUES_FILE}" \ - --install --wait --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" --timeout 10m ${HELM_OPTS} + --values "${HELM_VALUES_FILE}" \ + --install --wait --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" --timeout 10m ${HELM_OPTS} if [ $DRY_RUN == "false" ]; then helm get manifest "${NAME}" --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" > "${OUTPUT_DIR}/helm-${NAME}-manifest-$(date "+%Y%m%d%H%M%S").yaml" fi } - echo "# Deploy kubernetes" echo "# Configuring context $K8S_CONTEXT" configureContext -if [[ "$WHAT" = "NGINX" || "$WHAT" = "ALL" ]]; then +if [[ "$WHAT" == "NGINX" || "$WHAT" == "ALL" ]]; then deployNginx fi -if [[ "$WHAT" = "OPENCGA" || "$WHAT" = "ALL" ]]; then +if [[ "$WHAT" == "OPENCGA" || "$WHAT" == "ALL" ]]; then deployOpenCGA fi -if [[ "$WHAT" = "IVA" || "$WHAT" = "ALL" ]]; then +if [[ "$WHAT" == "IVA" || "$WHAT" == "ALL" ]]; then deployIVA -fi \ No newline at end of file +fi From 4508b430c13d0c5e1055f202f89152dcb82a33e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Mon, 29 Mar 2021 14:56:32 +0200 Subject: [PATCH 142/412] core-models: add CircosPlot to SampleQualityControlMetrics, #1730 --- .../SampleVariantQualityControlMetrics.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java index eaaccf5f306..d99a1c6240e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java @@ -1,5 +1,6 @@ package org.opencb.opencga.core.models.sample; +import org.opencb.biodata.models.clinical.qc.CircosPlot; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.biodata.models.clinical.qc.Signature; @@ -10,16 +11,26 @@ public class SampleVariantQualityControlMetrics { private List variantStats; private List signatures; + private List circosPlots; private List vcfFileIds; public SampleVariantQualityControlMetrics() { - this(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + this(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); } public SampleVariantQualityControlMetrics(List variantStats, List signatures, List vcfFileIds) { this.variantStats = variantStats; this.signatures = signatures; + this.circosPlots = new ArrayList<>(); + this.vcfFileIds = vcfFileIds; + } + + public SampleVariantQualityControlMetrics(List variantStats, List signatures, + List circosPlots, List vcfFileIds) { + this.variantStats = variantStats; + this.signatures = signatures; + this.circosPlots = circosPlots; this.vcfFileIds = vcfFileIds; } @@ -28,6 +39,7 @@ public String toString() { final StringBuilder sb = new StringBuilder("SampleVariantQualityControlMetrics{"); sb.append("variantStats=").append(variantStats); sb.append(", signatures=").append(signatures); + sb.append(", circosPlots=").append(circosPlots); sb.append(", vcfFileIds=").append(vcfFileIds); sb.append('}'); return sb.toString(); @@ -51,6 +63,15 @@ public SampleVariantQualityControlMetrics setSignatures(List signatur return this; } + public List getCircosPlots() { + return circosPlots; + } + + public SampleVariantQualityControlMetrics setCircosPlots(List circosPlots) { + this.circosPlots = circosPlots; + return this; + } + public List getVcfFileIds() { return vcfFileIds; } From c88b9157ff23d349dc127eb1e62344dcbf400b32 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 29 Mar 2021 15:13:45 +0200 Subject: [PATCH 143/412] catalog: allow admins see other User information, closes #1732 --- .../catalog/db/api/ProjectDBAdaptor.java | 1 + .../opencga/catalog/managers/UserManager.java | 168 ++++++++++++++++-- .../catalog/managers/CatalogManagerTest.java | 19 +- .../opencga/core/api/ParamConstants.java | 1 + .../opencga/server/rest/UserWSServer.java | 13 +- 5 files changed, 166 insertions(+), 36 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ProjectDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ProjectDBAdaptor.java index 9577d04ae3d..84adfbd143b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ProjectDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ProjectDBAdaptor.java @@ -68,6 +68,7 @@ enum QueryParams implements QueryParam { OWNER("owner", TEXT, ""), + STUDIES("studies", TEXT_ARRAY, ""), STUDY("study", TEXT, ""), // For the project/search ws STUDY_UID("study.uid", INTEGER_ARRAY, ""), STUDY_ID("study.alias", TEXT_ARRAY, ""), diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java index f972d2a86e9..bafe41e9498 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java @@ -17,6 +17,7 @@ package org.opencb.opencga.catalog.managers; import org.apache.commons.lang3.StringUtils; +import org.opencb.commons.datastore.core.Event; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -30,6 +31,8 @@ import org.opencb.opencga.catalog.auth.authentication.LDAPAuthenticationManager; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; +import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor; +import org.opencb.opencga.catalog.db.api.StudyDBAdaptor; import org.opencb.opencga.catalog.db.api.UserDBAdaptor; import org.opencb.opencga.catalog.exceptions.*; import org.opencb.opencga.catalog.io.CatalogIOManager; @@ -484,40 +487,169 @@ public void importRemoteEntities(String authOrigin, List idList, boolean * @return The requested user * @throws CatalogException CatalogException */ - public OpenCGAResult get(String userId, QueryOptions options, String token) + public OpenCGAResult get(String userId, QueryOptions options, String token) throws CatalogException { + return get(Collections.singletonList(userId), options, token); +// ParamUtils.checkParameter(userId, "userId"); +// ParamUtils.checkParameter(token, "sessionId"); +// options = ParamUtils.defaultObject(options, QueryOptions::new); +// +// ObjectMap auditParams = new ObjectMap() +// .append("userId", userId) +// .append("options", options) +// .append("token", token); +// try { +// userId = getCatalogUserId(userId, token); +// OpenCGAResult userDataResult = userDBAdaptor.get(userId, options); +// +// // Remove some unnecessary and prohibited parameters +// for (User user : userDataResult.getResults()) { +// if (user.getProjects() != null) { +// for (Project project : user.getProjects()) { +// if (project.getStudies() != null) { +// for (Study study : project.getStudies()) { +// study.setVariableSets(null); +// } +// } +// } +// } +// } +// +// auditManager.auditInfo(userId, Enums.Resource.USER, userId, "", "", "", auditParams, +// new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); +// return userDataResult; +// } catch (CatalogException e) { +// auditManager.auditInfo(userId, Enums.Resource.USER, userId, "", "", "", auditParams, +// new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); +// throw e; +// } + } + + /** + * Gets the user information. + * + * @param userIdList List of user id + * @param options QueryOptions + * @param token Token belonging to the user itself or administrator of any study shared with the user list requested. + * @return The requested users + * @throws CatalogException CatalogException + */ + public OpenCGAResult get(List userIdList, QueryOptions options, String token) throws CatalogException { - ParamUtils.checkParameter(userId, "userId"); - ParamUtils.checkParameter(token, "sessionId"); + ParamUtils.checkNotEmptyArray(userIdList, "userId"); + ParamUtils.checkParameter(token, "token"); options = ParamUtils.defaultObject(options, QueryOptions::new); ObjectMap auditParams = new ObjectMap() - .append("userId", userId) + .append("userIdList", userIdList) .append("options", options) .append("token", token); + String userId = getUserId(token); + + String operationUuid = UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.AUDIT); + auditManager.initAuditBatch(operationUuid); try { - userId = getCatalogUserId(userId, token); - OpenCGAResult userDataResult = userDBAdaptor.get(userId, options); + OpenCGAResult userDataResult; - // Remove some unnecessary and prohibited parameters - for (User user : userDataResult.getResults()) { - if (user.getProjects() != null) { - for (Project project : user.getProjects()) { - if (project.getStudies() != null) { - for (Study study : project.getStudies()) { - study.setVariableSets(null); + if (userIdList.size() == 1 && userId.equals(userIdList.get(0))) { + userDataResult = userDBAdaptor.get(userId, options); + auditManager.auditInfo(operationUuid, userId, Enums.Resource.USER, userId, "", "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + return userDataResult; + } + // We will obtain the users this user is administrating + QueryOptions adminOptions = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList( + UserDBAdaptor.QueryParams.PROJECTS.key() + "." + ProjectDBAdaptor.QueryParams.STUDIES.key() + "." + + StudyDBAdaptor.QueryParams.GROUPS.key(), UserDBAdaptor.QueryParams.SHARED_PROJECTS.key() + "." + + ProjectDBAdaptor.QueryParams.STUDIES.key() + "." + StudyDBAdaptor.QueryParams.GROUPS.key())); + userDataResult = userDBAdaptor.get(userId, adminOptions); + User admin = userDataResult.first(); + + Set users = new HashSet<>(); + boolean isAdmin = false; + + if (admin.getProjects() != null) { + for (Project project : admin.getProjects()) { + if (project.getStudies() != null) { + for (Study study : project.getStudies()) { + isAdmin = true; + for (Group group : study.getGroups()) { + if (StudyManager.MEMBERS.equals(group.getId())) { + users.addAll(group.getUserIds()); + break; + } + } + } + } + } + } + if (admin.getSharedProjects() != null) { + for (Project project : admin.getSharedProjects()) { + if (project.getStudies() != null) { + for (Study study : project.getStudies()) { + boolean isAdminInStudy = false; + Set usersInStudy = new HashSet<>(); + for (Group group : study.getGroups()) { + if (StudyManager.ADMINS.equals(group.getId()) && group.getUserIds().contains(userId)) { + isAdminInStudy = true; + } + if (StudyManager.MEMBERS.equals(group.getId())) { + usersInStudy.addAll(group.getUserIds()); + } + } + if (isAdminInStudy) { + isAdmin = true; + users.addAll(usersInStudy); } } } } } - auditManager.auditInfo(userId, Enums.Resource.USER, userId, "", "", "", auditParams, - new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); - return userDataResult; + if (!isAdmin) { + throw new CatalogAuthorizationException("Only owners or administrators can see other user information"); + } + + // Filter only the users the userId can get information for + List auxUserList = userIdList.stream().filter(users::contains).collect(Collectors.toList()); + + Query query = new Query(UserDBAdaptor.QueryParams.ID.key(), auxUserList); + OpenCGAResult result = userDBAdaptor.get(query, options); + Map userMap = new HashMap<>(); + for (User user : result.getResults()) { + userMap.put(user.getId(), user); + } + + // Ensure order and audit + List finalUserList = new ArrayList<>(userIdList.size()); + List eventList = new ArrayList<>(userIdList.size()); + for (String tmpUserId : userIdList) { + if (userMap.containsKey(tmpUserId)) { + finalUserList.add(userMap.get(tmpUserId)); + auditManager.auditInfo(operationUuid, userId, Enums.Resource.USER, tmpUserId, "", "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + } else { + finalUserList.add(new User().setId(tmpUserId)); + + String msg = "'" + userId + "' is not administrating a study of user '" + tmpUserId + "' or user does not exist."; + eventList.add(new Event(Event.Type.ERROR, msg)); + + auditManager.auditInfo(operationUuid, userId, Enums.Resource.USER, tmpUserId, "", "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.ERROR, new Error(-1, tmpUserId, msg))); + } + } + + result.setResults(finalUserList); + result.setEvents(eventList); + + return result; } catch (CatalogException e) { - auditManager.auditInfo(userId, Enums.Resource.USER, userId, "", "", "", auditParams, - new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + for (String tmpUserId : userIdList) { + auditManager.auditInfo(operationUuid, userId, Enums.Resource.USER, tmpUserId, "", "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + } throw e; + } finally { + auditManager.finishAuditBatch(operationUuid); } } diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java index 0cc782b3ea0..67cd90107f1 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java @@ -25,10 +25,7 @@ import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.biodata.models.pedigree.IndividualProperty; -import org.opencb.commons.datastore.core.DataResult; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.datastore.core.Query; -import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.datastore.core.*; import org.opencb.opencga.catalog.db.api.*; import org.opencb.opencga.catalog.exceptions.CatalogAuthenticationException; import org.opencb.opencga.catalog.exceptions.CatalogDBException; @@ -109,12 +106,14 @@ public void testLogin() throws Exception { public void testGetUserInfo() throws CatalogException { DataResult user = catalogManager.getUserManager().get("user", new QueryOptions(), token); System.out.println("user = " + user); - try { - catalogManager.getUserManager().get("user", new QueryOptions(), sessionIdUser2); - fail(); - } catch (CatalogException e) { - System.out.println(e); - } + OpenCGAResult result = catalogManager.getUserManager().get("user2", new QueryOptions(), token); + assertEquals(Event.Type.ERROR, result.getEvents().get(0).getType()); + + catalogManager.getStudyManager().updateGroup(studyFqn, StudyManager.MEMBERS, ParamUtils.BasicUpdateAction.ADD, + new GroupUpdateParams(Collections.singletonList("user2")), token); + result = catalogManager.getUserManager().get("user2", new QueryOptions(), token); + assertTrue(result.getEvents().isEmpty()); + assertTrue(StringUtils.isNotEmpty(result.first().getEmail())); } @Test diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index 573700e68a3..39db9b57279 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -98,6 +98,7 @@ public class ParamConstants { public static final String USER = "user"; public static final String USER_DESCRIPTION = "User ID"; + public static final String USERS_DESCRIPTION = "Comma separated list of user IDs"; public static final String USER_ACCOUNT_TYPE = "account"; public static final String USER_ACCOUNT_TYPE_DESCRIPTION = "Account type [GUEST, FULL, ADMINISTRATOR]"; public static final String USER_AUTHENTICATION_ORIGIN = "authenticationId"; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/UserWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/UserWSServer.java index 970d65b351d..192aa64d796 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/UserWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/UserWSServer.java @@ -36,6 +36,7 @@ import javax.ws.rs.core.*; import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; import static org.opencb.opencga.core.common.JacksonUtils.getUpdateObjectMapper; @@ -73,7 +74,7 @@ public Response createUserPost(@ApiParam(value = "JSON containing the parameters } @GET - @Path("/{user}/info") + @Path("/{users}/info") @ApiOperation(value = "Return the user information including its projects and studies", response = User.class) @ApiImplicitParams({ @ApiImplicitParam(name = QueryOptions.INCLUDE, value = ParamConstants.INCLUDE_DESCRIPTION, @@ -81,14 +82,10 @@ public Response createUserPost(@ApiParam(value = "JSON containing the parameters @ApiImplicitParam(name = QueryOptions.EXCLUDE, value = ParamConstants.EXCLUDE_DESCRIPTION, dataType = "string", paramType = "query"), }) - public Response getInfo(@ApiParam(value = ParamConstants.USER_DESCRIPTION, required = true) @PathParam("user") String userId, - @ApiParam(value = "This parameter shows the last time the user information was modified. When " - + "the value passed corresponds with the user's last activity registered, an empty result will be " - + "returned meaning that the client already has the most up to date user information.", hidden = true) - @QueryParam("lastModified") String lastModified) { + public Response getInfo(@ApiParam(value = ParamConstants.USERS_DESCRIPTION, required = true) @PathParam("users") String userIds) { try { - ParamUtils.checkIsSingleID(userId); - DataResult result = catalogManager.getUserManager().get(userId, queryOptions, token); + List userList = getIdList(userIds); + OpenCGAResult result = catalogManager.getUserManager().get(userList, queryOptions, token); return createOkResponse(result); } catch (Exception e) { return createErrorResponse(e); From e238cfd6aedca7bd7e05e4bd3a0e27c67c1ea423 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 29 Mar 2021 16:39:28 +0200 Subject: [PATCH 144/412] catalog: add new audit search method to manager and WS, closes #1733 --- .../catalog/db/api/AuditDBAdaptor.java | 15 +++-- .../db/mongodb/AuditMongoDBAdaptor.java | 55 ++++++++----------- .../catalog/managers/AbstractManager.java | 1 - .../catalog/managers/AdminManager.java | 1 - .../managers/AnnotationSetManager.java | 1 - .../{audit => managers}/AuditManager.java | 36 +++++++++++- .../catalog/managers/CatalogManager.java | 1 - .../managers/ClinicalAnalysisManager.java | 1 - .../catalog/managers/CohortManager.java | 1 - .../catalog/managers/FamilyManager.java | 1 - .../opencga/catalog/managers/FileManager.java | 1 - .../catalog/managers/IndividualManager.java | 1 - .../managers/InterpretationManager.java | 1 - .../opencga/catalog/managers/JobManager.java | 1 - .../catalog/managers/PanelManager.java | 1 - .../catalog/managers/ProjectManager.java | 1 - .../catalog/managers/ResourceManager.java | 1 - .../catalog/managers/SampleManager.java | 1 - .../catalog/managers/StudyManager.java | 1 - .../opencga/catalog/managers/UserManager.java | 1 - .../opencga/core/api/ParamConstants.java | 16 ++++++ .../opencga/core/models/common/Enums.java | 1 + .../opencga/server/rest/StudyWSServer.java | 32 +++++++++++ 23 files changed, 117 insertions(+), 55 deletions(-) rename opencga-catalog/src/main/java/org/opencb/opencga/catalog/{audit => managers}/AuditManager.java (88%) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java index cc2abb2042d..dd208b95520 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java @@ -37,12 +37,17 @@ public interface AuditDBAdaptor { enum QueryParams implements QueryParam { - RESOURCE("resource", TEXT, ""), - ACTION("action", TEXT, ""), - BEFORE("before", TEXT_ARRAY, ""), - AFTER("after", TEXT_ARRAY, ""), + OPERATION_ID("operationId", TEXT, ""), USER_ID("userId", TEXT, ""), - DATE("date", TIMESTAMP, ""); + ACTION("action", TEXT, ""), + RESOURCE("resource", TEXT, ""), + RESOURCE_ID("resourceId", TEXT, ""), + RESOURCE_UUID("resourceUuid", TEXT, ""), + STUDY_ID("studyId", TEXT, ""), + STUDY_UUID("studyUuid", TEXT, ""), + STATUS("status", OBJECT, ""), + STATUS_NAME("status.name", TEXT, ""), + DATE("date", Type.DATE, ""); private static Map map; static { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptor.java index 46deebb1c55..2a0e356732c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptor.java @@ -16,22 +16,27 @@ package org.opencb.opencga.catalog.db.mongodb; -import com.mongodb.DBObject; +import com.mongodb.MongoClient; import com.mongodb.client.model.Filters; import org.bson.Document; import org.bson.conversions.Bson; -import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.mongodb.MongoDBCollection; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.db.api.AuditDBAdaptor; +import org.opencb.opencga.catalog.db.mongodb.converters.OpenCgaMongoConverter; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static org.opencb.opencga.catalog.db.api.AuditDBAdaptor.QueryParams.STATUS_NAME; /** @@ -42,10 +47,12 @@ public class AuditMongoDBAdaptor extends MongoDBAdaptor implements AuditDBAdaptor { private final MongoDBCollection auditCollection; + private final OpenCgaMongoConverter auditConverter; public AuditMongoDBAdaptor(MongoDBCollection auditCollection, Configuration configuration) { super(configuration, LoggerFactory.getLogger(AuditMongoDBAdaptor.class)); this.auditCollection = auditCollection; + this.auditConverter = new OpenCgaMongoConverter<>(AuditRecord.class); } @Override @@ -71,29 +78,10 @@ public OpenCGAResult insertAuditRecords(List auditReco @Override public OpenCGAResult get(Query query, QueryOptions queryOptions) throws CatalogDBException { - long startTime = startQuery(); + Bson bson = parseQuery(query); + logger.debug("Audit query: {}", bson.toBsonDocument(Document.class, MongoClient.getDefaultCodecRegistry())); - List mongoQueryList = new LinkedList<>(); - for (Map.Entry entry : query.entrySet()) { - String key = entry.getKey().split("\\.")[0]; - try { - if (MongoDBUtils.isDataStoreOption(key) || MongoDBUtils.isOtherKnownOption(key)) { - continue; //Exclude DataStore options - } - // FIXME Pedro!! fix this please -// AuditFilterOption option = AuditFilterOption.valueOf(key); -// switch (option) { -// default: -// String queryKey = entry.getKey().replaceFirst(option.name(), option.getKey()); -// addCompQueryFilter(option, entry.getKey(), query, queryKey, mongoQueryList); -// break; -// } - } catch (IllegalArgumentException e) { - throw new CatalogDBException(e); - } - } - DataResult result = auditCollection.find(new Document("$and", mongoQueryList), null, AuditRecord.class, queryOptions); - return endQuery(startTime, result); + return new OpenCGAResult<>(auditCollection.find(bson, auditConverter, queryOptions)); } @Override @@ -114,14 +102,19 @@ private Bson parseQuery(Query query) throws CatalogDBException { } try { switch (queryParam) { - case DATE: - addAutoOrQuery("timeStamp", queryParam.key(), query, queryParam.type(), andBsonList); + case STATUS: + case STATUS_NAME: + addAutoOrQuery(STATUS_NAME.key(), queryParam.key(), query, STATUS_NAME.type(), andBsonList); break; - case RESOURCE: - case ACTION: - case BEFORE: - case AFTER: + case OPERATION_ID: case USER_ID: + case ACTION: + case RESOURCE: + case RESOURCE_ID: + case RESOURCE_UUID: + case STUDY_ID: + case STUDY_UUID: + case DATE: addAutoOrQuery(queryParam.key(), queryParam.key(), query, queryParam.type(), andBsonList); break; default: diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AbstractManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AbstractManager.java index 3a11b79fca2..7280acb06d2 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AbstractManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AbstractManager.java @@ -20,7 +20,6 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java index b9f1ed5dbd6..c1c7ce27887 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java @@ -3,7 +3,6 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AnnotationSetManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AnnotationSetManager.java index abeff070e29..133f6d835da 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AnnotationSetManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AnnotationSetManager.java @@ -22,7 +22,6 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.AnnotationSetDBAdaptor; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AuditManager.java similarity index 88% rename from opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java rename to opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AuditManager.java index aab6e9f8d09..a123dc7a91e 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AuditManager.java @@ -14,24 +14,26 @@ * limitations under the License. */ -package org.opencb.opencga.catalog.audit; +package org.opencb.opencga.catalog.managers; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.AuditDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.catalog.utils.UuidUtils; import org.opencb.opencga.core.common.GitRepositoryState; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -211,6 +213,36 @@ public void audit(String operationId, String userId, Enums.Action action, Enums. } } + public OpenCGAResult search(String studyStr, Query query, QueryOptions options, String token) throws CatalogException { + query = ParamUtils.defaultObject(query, Query::new); + options = ParamUtils.defaultObject(options, QueryOptions::new); + + String userId = catalogManager.getUserManager().getUserId(token); + Study study = catalogManager.getStudyManager().resolveId(studyStr, userId); + + ObjectMap auditParams = new ObjectMap() + .append("studyId", studyStr) + .append("query", new Query(query)) + .append("options", options) + .append("token", token); + try { + authorizationManager.checkIsOwnerOrAdmin(study.getUid(), userId); + + query.remove(AuditDBAdaptor.QueryParams.STUDY_ID.key()); + query.put(AuditDBAdaptor.QueryParams.STUDY_UUID.key(), study.getUuid()); + OpenCGAResult result = auditDBAdaptor.get(query, options); + + auditSearch(userId, Enums.Resource.AUDIT, study.getId(), study.getUuid(), auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + + return result; + } catch (CatalogException e) { + auditSearch(userId, Enums.Resource.AUDIT, study.getId(), study.getUuid(), auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + throw e; + } + } + /** * Groups the matching entries by some fields. * diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java index 6f9c75a63a5..879c49947eb 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java @@ -22,7 +22,6 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.mongodb.MongoDataStore; import org.opencb.commons.datastore.mongodb.MongoDataStoreManager; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.auth.authorization.CatalogAuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java index dfd338b889a..d316361b0a6 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java @@ -29,7 +29,6 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java index c63aa64600b..a600d3293df 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java @@ -24,7 +24,6 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java index 2fcb4e6f82a..4ed153118ac 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java @@ -30,7 +30,6 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java index 35456b7b123..66c657ade91 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java @@ -27,7 +27,6 @@ import org.opencb.commons.utils.CollectionUtils; import org.opencb.commons.utils.FileUtils; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java index 313852d66d1..f6a64583b03 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java @@ -22,7 +22,6 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java index 7169ca6314f..e3c0a01a5d2 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java @@ -30,7 +30,6 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java index d15625d247d..518a2e63aae 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java @@ -23,7 +23,6 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java index 8115880a023..7ca4f43a3c1 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java @@ -24,7 +24,6 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java index 50e3ee8fbdd..f8d8cd3a5b9 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java @@ -24,7 +24,6 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ResourceManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ResourceManager.java index 8e2ef875489..f845a98b940 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ResourceManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ResourceManager.java @@ -22,7 +22,6 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java index e14bc1e94b2..4edf4b3527f 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java @@ -25,7 +25,6 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java index 02a80aecc38..28c8c14c5b1 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java @@ -24,7 +24,6 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java index bafe41e9498..86eb7e98115 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java @@ -23,7 +23,6 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditManager; import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authentication.AuthenticationManager; import org.opencb.opencga.catalog.auth.authentication.AzureADAuthenticationManager; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index 39db9b57279..58f3d26c5c5 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -94,6 +94,22 @@ public class ParamConstants { public static final String MEMBERS_GROUP = "@members"; public static final String ADMINS_GROUP = "@admins"; + // -------------------- AUDIT ------------------------- + public static final String OPERATION_ID = "operationId"; + public static final String OPERATION_ID_DESCRIPTION = "Audit operation UUID"; + public static final String USER_ID = "userId"; + public static final String ACTION = "action"; + public static final String ACTION_DESCRIPTION = "Action performed by the user"; + public static final String RESOURCE = "resource"; + public static final String RESOURCE_DESCRIPTION = "Resource involved"; + public static final String RESOURCE_ID = "resourceId"; + public static final String RESOURCE_ID_DESCRIPTION = "Resource ID"; + public static final String RESOURCE_UUID = "resourceUuid"; + public static final String RESOURCE_UUID_DESCRIPTION = "resource UUID"; + public static final String STATUS = "status"; + public static final String DATE = "date"; + public static final String DATE_DESCRIPTION = "Date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805"; + // --------------------------------------------- public static final String USER = "user"; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java index 5b61ce88589..71d2f4e99bd 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java @@ -59,6 +59,7 @@ public Resource getResource() { } public enum Resource { + AUDIT, USER, PROJECT, STUDY, diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java index 8b05a61a54e..d7729182b8c 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java @@ -22,6 +22,7 @@ import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.catalog.db.api.StudyDBAdaptor; import org.opencb.opencga.catalog.managers.StudyManager; import org.opencb.opencga.catalog.utils.Constants; @@ -459,6 +460,37 @@ public Response updateVariablesFromVariableSet( } } + @GET + @Path("/{study}/audit/search") + @ApiOperation(value = "Search audit collection", response = AuditRecord.class) + @ApiImplicitParams({ + @ApiImplicitParam(name = QueryOptions.INCLUDE, value = ParamConstants.INCLUDE_DESCRIPTION, + dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.EXCLUDE, value = ParamConstants.EXCLUDE_DESCRIPTION, + dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query") + }) + public Response auditSearch( + @ApiParam(value = ParamConstants.STUDY_ID_DESCRIPTION, required = true) @PathParam(ParamConstants.STUDY_PARAM) String studyId, + @ApiParam(value = ParamConstants.OPERATION_ID_DESCRIPTION) @QueryParam(ParamConstants.OPERATION_ID) String operationId, + @ApiParam(value = ParamConstants.USER_DESCRIPTION) @QueryParam(ParamConstants.USER_ID) String userId, + @ApiParam(value = ParamConstants.ACTION_DESCRIPTION) @QueryParam(ParamConstants.ACTION) String action, + @ApiParam(value = ParamConstants.RESOURCE_DESCRIPTION) @QueryParam(ParamConstants.RESOURCE) Enums.Resource resource, + @ApiParam(value = ParamConstants.RESOURCE_ID_DESCRIPTION) @QueryParam(ParamConstants.RESOURCE_ID) String resourceId, + @ApiParam(value = ParamConstants.RESOURCE_UUID_DESCRIPTION) @QueryParam(ParamConstants.RESOURCE_UUID) String resourceUuid, + @ApiParam(value = ParamConstants.STATUS_DESCRIPTION) @QueryParam(ParamConstants.STATUS) AuditRecord.Status.Result status, + @ApiParam(value = ParamConstants.DATE_DESCRIPTION) @QueryParam(ParamConstants.DATE) String date) { + try { + OpenCGAResult queryResult = catalogManager.getAuditManager().search(studyId, query, queryOptions, token); + return createOkResponse(queryResult); + } catch (Exception e) { + return createErrorResponse(e); + } + } + + private void fixVariable(Variable variable) { variable.setId(StringUtils.isNotEmpty(variable.getId()) ? variable.getId() : variable.getName()); if (variable.getVariableSet() != null && variable.getVariableSet().size() > 0) { From 1d7afac989846eb476fabb1efd756563531e71c9 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 30 Mar 2021 12:59:11 +0200 Subject: [PATCH 145/412] server: implement new /groups web service for admins, closes #1734 --- .../catalog/managers/StudyManager.java | 70 +++++++++++++++++++ .../catalog/managers/CatalogManagerTest.java | 32 +++++++-- .../core/models/study/CustomGroup.java | 69 ++++++++++++++++++ .../opencga/core/response/OpenCGAResult.java | 4 +- .../opencga/server/rest/OpenCGAWSServer.java | 2 +- .../opencga/server/rest/StudyWSServer.java | 11 +-- .../rest/analysis/VariantWebService.java | 2 +- 7 files changed, 174 insertions(+), 16 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/study/CustomGroup.java diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java index 28c8c14c5b1..841430c6d1f 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.StopWatch; import org.opencb.commons.datastore.core.Event; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; @@ -60,6 +61,7 @@ import org.opencb.opencga.core.models.summaries.StudySummary; import org.opencb.opencga.core.models.summaries.VariableSetSummary; import org.opencb.opencga.core.models.summaries.VariableSummary; +import org.opencb.opencga.core.models.user.User; import org.opencb.opencga.core.response.OpenCGAResult; import org.reflections.Reflections; import org.reflections.scanners.ResourcesScanner; @@ -70,6 +72,7 @@ import java.io.IOException; import java.net.URI; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -906,6 +909,73 @@ public OpenCGAResult getGroup(String studyId, String groupId, String toke } } + public OpenCGAResult getCustomGroups(String studyId, String groupId, String token) throws CatalogException { + String userId = catalogManager.getUserManager().getUserId(token); + Study study = resolveId(studyId, userId); + + ObjectMap auditParams = new ObjectMap() + .append("studyId", studyId) + .append("groupId", groupId) + .append("token", token); + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + authorizationManager.checkIsOwnerOrAdmin(study.getUid(), userId); + + // Fix the groupId + if (groupId != null && !groupId.startsWith("@")) { + groupId = "@" + groupId; + } + + OpenCGAResult result = studyDBAdaptor.getGroup(study.getUid(), groupId, Collections.emptyList()); + + // Extract all users from all groups + Set userIds = new HashSet<>(); + for (Group group : result.getResults()) { + userIds.addAll(group.getUserIds()); + } + + Query userQuery = new Query(UserDBAdaptor.QueryParams.ID.key(), new ArrayList<>(userIds)); + QueryOptions userOptions = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList( + UserDBAdaptor.QueryParams.PROJECTS.key(), UserDBAdaptor.QueryParams.SHARED_PROJECTS.key() + )); + OpenCGAResult userResult = userDBAdaptor.get(userQuery, userOptions); + Map userMap = new HashMap<>(); + for (User user : userResult.getResults()) { + userMap.put(user.getId(), user); + } + + // Generate groups with list of full users + List customGroupList = new ArrayList<>(result.getNumResults()); + for (Group group : result.getResults()) { + List userList = new ArrayList<>(group.getUserIds().size()); + for (String tmpUserId : group.getUserIds()) { + if (userMap.containsKey(tmpUserId)) { + userList.add(userMap.get(tmpUserId)); + } + } + customGroupList.add(new CustomGroup(group.getId(), userList, group.getSyncedFrom())); + } + + OpenCGAResult finalResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), result.getNumResults(), + customGroupList, result.getNumMatches(), result.getNumInserted(), result.getNumUpdated(), result.getNumDeleted(), + result.getAttributes(), result.getFederationNode()); + + auditManager.audit(userId, Enums.Action.FETCH_STUDY_GROUPS, Enums.Resource.STUDY, study.getId(), study.getUuid(), + study.getId(), study.getUuid(), auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + + stopWatch.stop(); + finalResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + + return finalResult; + } catch (CatalogException e) { + auditManager.audit(userId, Enums.Action.FETCH_STUDY_GROUPS, Enums.Resource.STUDY, study.getId(), study.getUuid(), + study.getId(), study.getUuid(), auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + throw e; + } + } + public OpenCGAResult updateGroup(String studyId, String groupId, ParamUtils.BasicUpdateAction action, GroupUpdateParams updateParams, String token) throws CatalogException { String userId = catalogManager.getUserManager().getUserId(token); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java index 67cd90107f1..deabe2b9fc2 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java @@ -27,10 +27,7 @@ import org.opencb.biodata.models.pedigree.IndividualProperty; import org.opencb.commons.datastore.core.*; import org.opencb.opencga.catalog.db.api.*; -import org.opencb.opencga.catalog.exceptions.CatalogAuthenticationException; -import org.opencb.opencga.catalog.exceptions.CatalogDBException; -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.catalog.exceptions.CatalogParameterException; +import org.opencb.opencga.catalog.exceptions.*; import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; @@ -221,6 +218,33 @@ private String getAdminToken() throws CatalogException, IOException { return catalogManager.getUserManager().loginAsAdmin("admin").getToken(); } + @Test + public void getGroupsTest() throws CatalogException { + Group group = new Group("groupId", Arrays.asList("user2", "user3")).setSyncedFrom(new Group.Sync("ldap", "bio")); + catalogManager.getStudyManager().createGroup(studyFqn, group, token); + + OpenCGAResult customGroups = catalogManager.getStudyManager().getCustomGroups(studyFqn, null, token); + assertEquals(3, customGroups.getNumResults()); + + for (CustomGroup customGroup : customGroups.getResults()) { + if (!customGroup.getUsers().isEmpty()) { + assertTrue(StringUtils.isNotEmpty(customGroup.getUsers().get(0).getName())); + } + } + + customGroups = catalogManager.getStudyManager().getCustomGroups(studyFqn, group.getId(), token); + assertEquals(1, customGroups.getNumResults()); + assertEquals(group.getId(), customGroups.first().getId()); + assertEquals(2, customGroups.first().getUsers().size()); + assertTrue(StringUtils.isNotEmpty(customGroups.first().getUsers().get(0).getName())); + assertNull(customGroups.first().getUsers().get(0).getProjects()); + assertNull(customGroups.first().getUsers().get(0).getSharedProjects()); + + thrown.expect(CatalogAuthorizationException.class); + thrown.expectMessage("Only owners"); + catalogManager.getStudyManager().getCustomGroups(studyFqn, group.getId(), sessionIdUser2); + } + @Ignore @Test public void importLdapUsers() throws CatalogException, NamingException, IOException { diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/CustomGroup.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/CustomGroup.java new file mode 100644 index 00000000000..dc9f17d0123 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/CustomGroup.java @@ -0,0 +1,69 @@ +package org.opencb.opencga.core.models.study; + +import org.opencb.opencga.core.models.user.User; + +import java.util.List; + +public class CustomGroup { + + /** + * Group id, unique in the belonging study. + */ + private String id; + + /** + * Set of users belonging to this group. + */ + private List users; + + /** + * Group has been synchronised from an external authorization. + */ + private Group.Sync syncedFrom; + + public CustomGroup() { + } + + public CustomGroup(String id, List users, Group.Sync syncedFrom) { + this.id = id; + this.users = users; + this.syncedFrom = syncedFrom; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("CustomGroup{"); + sb.append("id='").append(id).append('\''); + sb.append(", users=").append(users); + sb.append(", syncedFrom=").append(syncedFrom); + sb.append('}'); + return sb.toString(); + } + + public String getId() { + return id; + } + + public CustomGroup setId(String id) { + this.id = id; + return this; + } + + public List getUsers() { + return users; + } + + public CustomGroup setUsers(List users) { + this.users = users; + return this; + } + + public Group.Sync getSyncedFrom() { + return syncedFrom; + } + + public CustomGroup setSyncedFrom(Group.Sync syncedFrom) { + this.syncedFrom = syncedFrom; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java b/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java index c7eb98af420..b7ae478cf58 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/response/OpenCGAResult.java @@ -229,11 +229,11 @@ public OpenCGAResult setAttributes(ObjectMap attributes) { return this; } - public FederationNode getNode() { + public FederationNode getFederationNode() { return node; } - public OpenCGAResult setNode(FederationNode node) { + public OpenCGAResult setFederationNode(FederationNode node) { this.node = node; return this; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java index 593b1316cbb..cced01f6cab 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java @@ -664,7 +664,7 @@ protected Response createOkResponse(InputStream o1, MediaType o2, String fileNam } private static void setFederationServer(OpenCGAResult result, UriInfo uriInfo) { - result.setNode(new FederationNode(uriInfo.getBaseUri().toString(), GitRepositoryState.get().getCommitId(), + result.setFederationNode(new FederationNode(uriInfo.getBaseUri().toString(), GitRepositoryState.get().getCommitId(), GitRepositoryState.get().getBuildVersion())); } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java index d7729182b8c..669b764fe2e 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java @@ -175,18 +175,13 @@ public Response summary(@ApiParam(value = ParamConstants.STUDIES_DESCRIPTION, re @GET @Path("/{study}/groups") - @ApiOperation(value = "Return the groups present in the study", response = Group.class) + @ApiOperation(value = "Return the groups present in the study. For owners and administrators only.", response = CustomGroup.class) public Response getGroups( - @ApiParam(value = ParamConstants.STUDY_DESCRIPTION, required = true) - @PathParam(ParamConstants.STUDY_PARAM) String studyStr, + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION, required = true) @PathParam(ParamConstants.STUDY_PARAM) String studyStr, @ApiParam(value = "Group id. If provided, it will only fetch information for the provided group.") @QueryParam("id") String groupId, - @ApiParam(value = "[DEPRECATED] Replaced by id.") @QueryParam("name") String groupName, @ApiParam(value = ParamConstants.SILENT_DESCRIPTION, defaultValue = "false") @QueryParam(Constants.SILENT) boolean silent) { try { - if (StringUtils.isNotEmpty(groupName)) { - groupId = groupName; - } - return createOkResponse(catalogManager.getStudyManager().getGroup(studyStr, groupId, token)); + return createOkResponse(catalogManager.getStudyManager().getCustomGroups(studyStr, groupId, token)); } catch (Exception e) { return createErrorResponse(e); } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index dded969fec7..ac0c06239e0 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -721,7 +721,7 @@ public Response cohortStatsQuery(@ApiParam(value = ParamConstants.STUDY_PARAM) @ statsResult.setNumMatches(result.getNumMatches()); statsResult.setEvents(result.getEvents()); statsResult.setTime(result.getTime()); - statsResult.setNode(result.getNode()); + statsResult.setFederationNode(result.getFederationNode()); return statsResult; }); } From 4940879cb226fdc1ff641fa4bbe6063c6e13c412 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 30 Mar 2021 14:23:26 +0200 Subject: [PATCH 146/412] clinical: delete unnecessary StorageManager --- .../opencga/clinical/StorageManager.java | 76 ------------------- .../opencga/clinical/rga/RgaManager.java | 24 ++++-- 2 files changed, 17 insertions(+), 83 deletions(-) delete mode 100644 opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java deleted file mode 100644 index c35e13cc796..00000000000 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/StorageManager.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.opencb.opencga.clinical; - -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.core.config.Configuration; -import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.cache.CacheManager; -import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.storage.core.exceptions.StorageEngineException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class StorageManager { - - protected final CatalogManager catalogManager; - protected final CacheManager cacheManager; - protected final StorageConfiguration storageConfiguration; - protected final StorageEngineFactory storageEngineFactory; - - protected final Logger logger; - - public StorageManager(Configuration configuration, StorageConfiguration storageConfiguration) throws CatalogException { - this(new CatalogManager(configuration), StorageEngineFactory.get(storageConfiguration)); - } - - public StorageManager(CatalogManager catalogManager, StorageEngineFactory storageEngineFactory) { - this(catalogManager, null, storageEngineFactory.getStorageConfiguration(), storageEngineFactory); - } - - protected StorageManager(CatalogManager catalogManager, CacheManager cacheManager, StorageConfiguration storageConfiguration, - StorageEngineFactory storageEngineFactory) { - this.catalogManager = catalogManager; - this.cacheManager = cacheManager == null ? new CacheManager(storageConfiguration) : cacheManager; - this.storageConfiguration = storageConfiguration; - this.storageEngineFactory = storageEngineFactory == null - ? StorageEngineFactory.get(storageConfiguration) - : storageEngineFactory; - logger = LoggerFactory.getLogger(getClass()); - } - - - public void clearCache(String sessionId) throws CatalogException { - String userId = catalogManager.getUserManager().getUserId(sessionId); - - } - - - public void clearCache(String studyId, String sessionId) throws CatalogException { - String userId = catalogManager.getUserManager().getUserId(sessionId); - - } - - public abstract void testConnection() throws StorageEngineException; - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("StorageEngine{"); - sb.append("catalogManager=").append(catalogManager); - sb.append(", cacheManager=").append(cacheManager); - sb.append(", storageConfiguration=").append(storageConfiguration); - sb.append('}'); - return sb.toString(); - } - - public CatalogManager getCatalogManager() { - return catalogManager; - } - - public CacheManager getCacheManager() { - return cacheManager; - } - - public StorageConfiguration getStorageConfiguration() { - return storageConfiguration; - } -} diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 4c8399100e0..81c714aba51 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -14,7 +14,6 @@ import org.opencb.opencga.catalog.managers.FileManager; import org.opencb.opencga.catalog.managers.SampleManager; import org.opencb.opencga.catalog.utils.ParamUtils; -import org.opencb.opencga.clinical.StorageManager; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; @@ -34,6 +33,8 @@ import org.opencb.opencga.storage.core.rga.RgaDataModel; import org.opencb.opencga.storage.core.rga.RgaEngine; import org.opencb.opencga.storage.core.rga.RgaQueryParams; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; @@ -46,25 +47,35 @@ import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; -public class RgaManager extends StorageManager implements AutoCloseable { +public class RgaManager implements AutoCloseable { + private CatalogManager catalogManager; + private StorageConfiguration storageConfiguration; private final RgaEngine rgaEngine; + private final Logger logger; + private static final int KNOCKOUT_INSERT_BATCH_SIZE = 25; public RgaManager(CatalogManager catalogManager, StorageEngineFactory storageEngineFactory) { - super(catalogManager, storageEngineFactory); - this.rgaEngine = new RgaEngine(getStorageConfiguration()); + this.catalogManager = catalogManager; + this.storageConfiguration = storageEngineFactory.getStorageConfiguration(); + this.rgaEngine = new RgaEngine(storageConfiguration); + this.logger = LoggerFactory.getLogger(getClass()); } public RgaManager(Configuration configuration, StorageConfiguration storageConfiguration) throws CatalogException { - super(configuration, storageConfiguration); + this.catalogManager = new CatalogManager(configuration); + this.storageConfiguration = storageConfiguration; this.rgaEngine = new RgaEngine(storageConfiguration); + this.logger = LoggerFactory.getLogger(getClass()); } public RgaManager(Configuration configuration, StorageConfiguration storageConfiguration, RgaEngine rgaEngine) throws CatalogException { - super(configuration, storageConfiguration); + this.catalogManager = new CatalogManager(configuration); + this.storageConfiguration = storageConfiguration; this.rgaEngine = rgaEngine; + this.logger = LoggerFactory.getLogger(getClass()); } public OpenCGAResult individualQuery(String studyStr, Query query, QueryOptions options, String token) @@ -577,7 +588,6 @@ private void load(String study, Path path, String token) throws IOException, Rga } } - @Override public void testConnection() throws StorageEngineException { rgaEngine.isAlive("test"); } From 43a26f24d6b87c26c2569cbc5ccd57a8f48592df Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 30 Mar 2021 15:18:09 +0200 Subject: [PATCH 147/412] clinical: move all RGA code to clinical module, #1693 --- .../org/opencb/opencga/clinical}/rga/GeneRgaConverter.java | 2 +- .../opencga/clinical}/rga/IndividualRgaConverter.java | 4 ++-- .../org/opencb/opencga/clinical}/rga/RgaDataModel.java | 2 +- .../java/org/opencb/opencga/clinical}/rga/RgaEngine.java | 4 ++-- .../java/org/opencb/opencga/clinical/rga/RgaManager.java | 5 +---- .../org/opencb/opencga/clinical}/rga/RgaQueryParams.java | 2 +- .../org/opencb/opencga/clinical}/rga/RgaQueryParser.java | 6 +++--- .../java/org/opencb/opencga/clinical}/rga/RgaUtils.java | 6 +++--- .../opencb/opencga/clinical}/rga/VariantRgaConverter.java | 2 +- .../opencga/clinical/rga}/exceptions/RgaException.java | 2 +- .../src/main/resources/rga/managed-schema | 0 .../opencga/clinical}/rga/IndividualRgaConverterTest.java | 4 ++-- .../org/opencb/opencga/clinical}/rga/RgaEngineTest.java | 4 ++-- .../org/opencb/opencga/clinical/rga/RgaManagerTest.java | 7 ++----- .../opencb/opencga/clinical}/rga/RgaQueryParserTest.java | 5 ++--- .../opencga/clinical}/rga/RgaSolrExtenalResource.java | 2 +- .../org/opencb/opencga/clinical}/rga/RgaUtilsTest.java | 2 +- .../opencga/server/rest/analysis/ClinicalWebService.java | 2 +- 18 files changed, 27 insertions(+), 34 deletions(-) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core => opencga-clinical/src/main/java/org/opencb/opencga/clinical}/rga/GeneRgaConverter.java (99%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core => opencga-clinical/src/main/java/org/opencb/opencga/clinical}/rga/IndividualRgaConverter.java (99%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core => opencga-clinical/src/main/java/org/opencb/opencga/clinical}/rga/RgaDataModel.java (99%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core => opencga-clinical/src/main/java/org/opencb/opencga/clinical}/rga/RgaEngine.java (99%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core => opencga-clinical/src/main/java/org/opencb/opencga/clinical}/rga/RgaQueryParams.java (99%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core => opencga-clinical/src/main/java/org/opencb/opencga/clinical}/rga/RgaQueryParser.java (98%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core => opencga-clinical/src/main/java/org/opencb/opencga/clinical}/rga/RgaUtils.java (98%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core => opencga-clinical/src/main/java/org/opencb/opencga/clinical}/rga/VariantRgaConverter.java (99%) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core => opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga}/exceptions/RgaException.java (80%) rename {opencga-storage/opencga-storage-core => opencga-clinical}/src/main/resources/rga/managed-schema (100%) rename {opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core => opencga-clinical/src/test/java/org/opencb/opencga/clinical}/rga/IndividualRgaConverterTest.java (91%) rename {opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core => opencga-clinical/src/test/java/org/opencb/opencga/clinical}/rga/RgaEngineTest.java (99%) rename {opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core => opencga-clinical/src/test/java/org/opencb/opencga/clinical}/rga/RgaQueryParserTest.java (98%) rename {opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core => opencga-clinical/src/test/java/org/opencb/opencga/clinical}/rga/RgaSolrExtenalResource.java (99%) rename {opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core => opencga-clinical/src/test/java/org/opencb/opencga/clinical}/rga/RgaUtilsTest.java (99%) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java index a1bd6239818..210a7fefd43 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import com.fasterxml.jackson.core.JsonProcessingException; import org.apache.commons.lang3.StringUtils; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java index 45d15c00bd0..fbc551b71f9 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import com.fasterxml.jackson.core.JsonProcessingException; import org.apache.commons.lang3.StringUtils; @@ -14,7 +14,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java index 9afad57220a..11c65b80e14 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.apache.solr.client.solrj.beans.Field; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaEngine.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaEngine.java index f2a5ce6b444..b4251659baa 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaEngine.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; @@ -17,7 +17,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.storage.core.variant.search.solr.SolrNativeIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 81c714aba51..ef19524662f 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -27,12 +27,9 @@ import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; -import org.opencb.opencga.storage.core.rga.RgaDataModel; -import org.opencb.opencga.storage.core.rga.RgaEngine; -import org.opencb.opencga.storage.core.rga.RgaQueryParams; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParams.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParams.java index a4c4515dae1..94575321ac0 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParams.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryParam; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParser.java similarity index 98% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParser.java index ab0c36755ce..fbb88325632 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParser.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; @@ -6,7 +6,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.solr.FacetQueryParser; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,7 +15,7 @@ import java.util.regex.Pattern; import static org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant.KnockoutType.*; -import static org.opencb.opencga.storage.core.rga.RgaQueryParams.*; +import static org.opencb.opencga.clinical.rga.RgaQueryParams.*; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.printQuery; public class RgaQueryParser { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaUtils.java similarity index 98% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaUtils.java index 19ec7f0ec31..26643880b4b 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaUtils.java @@ -1,7 +1,7 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.storage.core.variant.query.KeyOpValue; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; @@ -9,7 +9,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.opencb.opencga.storage.core.rga.RgaDataModel.*; +import static org.opencb.opencga.clinical.rga.RgaDataModel.*; class RgaUtils { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java index de1634778b6..ae8de2aeb6b 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/exceptions/RgaException.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/exceptions/RgaException.java similarity index 80% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/exceptions/RgaException.java rename to opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/exceptions/RgaException.java index be72d8306c2..a3b91446f0b 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/exceptions/RgaException.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/exceptions/RgaException.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.exceptions; +package org.opencb.opencga.clinical.rga.exceptions; public class RgaException extends Exception { diff --git a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema b/opencga-clinical/src/main/resources/rga/managed-schema similarity index 100% rename from opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema rename to opencga-clinical/src/main/resources/rga/managed-schema diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverterTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/IndividualRgaConverterTest.java similarity index 91% rename from opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverterTest.java rename to opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/IndividualRgaConverterTest.java index 60b932d0d7e..dc8e6ad8fe8 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverterTest.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/IndividualRgaConverterTest.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import com.fasterxml.jackson.core.JsonProcessingException; import org.junit.Before; @@ -10,7 +10,7 @@ import java.util.List; import static org.junit.Assert.assertEquals; -import static org.opencb.opencga.storage.core.rga.RgaUtilsTest.createKnockoutByIndividual; +import static org.opencb.opencga.clinical.rga.RgaUtilsTest.createKnockoutByIndividual; public class IndividualRgaConverterTest { diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaEngineTest.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java rename to opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaEngineTest.java index 1bb4d329675..4535b094c06 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaEngineTest.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.junit.Before; import org.junit.Rule; @@ -19,7 +19,7 @@ import java.util.List; import static org.junit.Assert.*; -import static org.opencb.opencga.storage.core.rga.RgaUtilsTest.createKnockoutByIndividual; +import static org.opencb.opencga.clinical.rga.RgaUtilsTest.createKnockoutByIndividual; public class RgaEngineTest { diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java index 499d3af1dd7..1ef88126ae4 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java @@ -22,10 +22,7 @@ import org.opencb.opencga.core.models.user.Account; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.storage.core.exceptions.RgaException; -import org.opencb.opencga.storage.core.rga.RgaEngine; -import org.opencb.opencga.storage.core.rga.RgaEngineTest; -import org.opencb.opencga.storage.core.rga.RgaSolrExtenalResource; +import org.opencb.opencga.clinical.rga.exceptions.RgaException; import java.io.IOException; import java.io.InputStream; @@ -37,7 +34,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.opencb.opencga.storage.core.rga.RgaUtilsTest.createKnockoutByIndividual; +import static org.opencb.opencga.clinical.rga.RgaUtilsTest.createKnockoutByIndividual; public class RgaManagerTest { diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaQueryParserTest.java similarity index 98% rename from opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java rename to opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaQueryParserTest.java index c9d996c1ca1..bdc5b57e33f 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaQueryParserTest.java @@ -1,12 +1,11 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.apache.solr.client.solrj.SolrQuery; import org.junit.Before; import org.junit.Test; import org.opencb.commons.datastore.core.Query; -import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.clinical.rga.exceptions.RgaException; import static org.junit.Assert.*; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaSolrExtenalResource.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java rename to opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaSolrExtenalResource.java index 9f08549ce14..00be11a5b4c 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaSolrExtenalResource.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.apache.commons.io.FileUtils; import org.apache.solr.client.solrj.SolrClient; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java rename to opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java index bbc88862c55..69a71225ad9 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.rga; +package org.opencb.opencga.clinical.rga; import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 3ded7450906..5a57e197ca9 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -44,7 +44,7 @@ import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.models.clinical.*; import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.storage.core.rga.RgaQueryParams; +import org.opencb.opencga.clinical.rga.RgaQueryParams; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.QueryParam; From fa95fd6232f08ce52a7d0d77a736e38f788f9d49 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 30 Mar 2021 16:31:19 +0200 Subject: [PATCH 148/412] clinical: update sample rga index status after solr index, #1693 --- .../opencga/clinical/rga/RgaManager.java | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index ef19524662f..6767e79c5a9 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -14,6 +14,7 @@ import org.opencb.opencga.catalog.managers.FileManager; import org.opencb.opencga.catalog.managers.SampleManager; import org.opencb.opencga.catalog.utils.ParamUtils; +import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; @@ -27,7 +28,6 @@ import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.StorageEngineFactory; -import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; import org.slf4j.Logger; @@ -484,6 +484,50 @@ public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, String return new OpenCGAResult<>((int) stopWatch.getTime(TimeUnit.MILLISECONDS), null, totalSamples, 0, updatedSamples, 0); } + + public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List sampleIds, RgaIndex.Status status, + String token) throws CatalogException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String userId = catalogManager.getUserManager().getUserId(token); + String collection = getCollectionName(study.getFqn()); + + catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(study.getUid(), userId); + + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + int updatedSamples = 0; + + // Update samples in batches of 100 + List tmpSampleIds = new ArrayList<>(100); + + RgaIndex rgaIndex = new RgaIndex(status, TimeUtils.getTime()); + for (String sampleId : sampleIds) { + tmpSampleIds.add(sampleId); + if (tmpSampleIds.size() == 100) { + OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), tmpSampleIds, rgaIndex, + token); + updatedSamples += update.getNumUpdated(); + + tmpSampleIds = new ArrayList<>(100); + } + } + + if (!tmpSampleIds.isEmpty()) { + // Update last batch + OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), tmpSampleIds, rgaIndex, + token); + updatedSamples += update.getNumUpdated(); + } + + stopWatch.stop(); + return new OpenCGAResult<>((int) stopWatch.getTime(TimeUnit.MILLISECONDS), null, sampleIds.size(), 0, updatedSamples, 0); + } + public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); @@ -567,6 +611,17 @@ private void load(String study, Path path, String token) throws IOException, Rga if (count % KNOCKOUT_INSERT_BATCH_SIZE == 0) { rgaEngine.insert(collection, knockoutByIndividualList); logger.debug("Loaded {} knockoutByIndividual entries from '{}'", count, path); + + // Update RGA Index status + try { + updateRgaInternalIndexStatus(study, knockoutByIndividualList.stream() + .map(KnockoutByIndividual::getSampleId).collect(Collectors.toList()), + RgaIndex.Status.INDEXED, token); + logger.debug("Updated sample RGA index statuses"); + } catch (CatalogException e) { + logger.warn("Sample RGA index status could not be updated: {}", e.getMessage(), e); + } + knockoutByIndividualList.clear(); } } @@ -575,6 +630,17 @@ private void load(String study, Path path, String token) throws IOException, Rga if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { rgaEngine.insert(collection, knockoutByIndividualList); logger.debug("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); + + // Update RGA Index status + try { + updateRgaInternalIndexStatus(study, knockoutByIndividualList.stream() + .map(KnockoutByIndividual::getSampleId).collect(Collectors.toList()), + RgaIndex.Status.INDEXED, token); + logger.debug("Updated sample RGA index statuses"); + } catch (CatalogException e) { + logger.warn("Sample RGA index status could not be updated: {}", e.getMessage(), e); + } + } } } catch (SolrServerException e) { From a2b48dcf9abcb9e137fbff17b5cb2ab3a5bff165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 31 Mar 2021 17:26:01 +0100 Subject: [PATCH 149/412] k8s: Migrate iva azurefile volume mount to PVC In line "azurefile" volume won't work if the secrets are not in the default namespace --- .../charts/iva/templates/_helpers.tpl | 42 +++++++++++++++++++ .../azurefile/azure-files-secret.yaml | 10 +++++ .../iva/templates/azurefile/iva-conf-pv.yaml | 18 ++++++++ .../charts/iva/templates/iva-conf-pvc.yaml | 12 ++++++ .../charts/iva/templates/iva-deployment.yaml | 7 ++-- .../cloud/kubernetes/charts/iva/values.yaml | 11 ++--- 6 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 opencga-app/app/cloud/kubernetes/charts/iva/templates/_helpers.tpl create mode 100644 opencga-app/app/cloud/kubernetes/charts/iva/templates/azurefile/azure-files-secret.yaml create mode 100644 opencga-app/app/cloud/kubernetes/charts/iva/templates/azurefile/iva-conf-pv.yaml create mode 100644 opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-conf-pvc.yaml diff --git a/opencga-app/app/cloud/kubernetes/charts/iva/templates/_helpers.tpl b/opencga-app/app/cloud/kubernetes/charts/iva/templates/_helpers.tpl new file mode 100644 index 00000000000..165a6f192b9 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/iva/templates/_helpers.tpl @@ -0,0 +1,42 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "iva.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "iva.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + + +{{- define "pvIvaconf" -}} +pv-{{ include "iva.fullname" . }}-ivaconf +{{- end -}} + + +{{- define "pvcStorageClassName" -}} +{{- if .Values.azureStorageAccount.enabled -}} +azurefile +{{- end -}} +{{- end -}} + +{{- define "pvcIvaconf" -}} +pvc-{{ include "iva.fullname" . }}-ivaconf +{{- end -}} + diff --git a/opencga-app/app/cloud/kubernetes/charts/iva/templates/azurefile/azure-files-secret.yaml b/opencga-app/app/cloud/kubernetes/charts/iva/templates/azurefile/azure-files-secret.yaml new file mode 100644 index 00000000000..25b2cca78e8 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/iva/templates/azurefile/azure-files-secret.yaml @@ -0,0 +1,10 @@ +{{- if and (.Values.azureStorageAccount.enabled) (.Values.azureStorageAccount.createSecret) -}} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.azureStorageAccount.secretName }} +type: "Opaque" +data: + azurestorageaccountname: {{ .Values.azureStorageAccount.name | b64enc | quote }} + azurestorageaccountkey: {{ .Values.azureStorageAccount.key | b64enc | quote }} +{{- end }} \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/iva/templates/azurefile/iva-conf-pv.yaml b/opencga-app/app/cloud/kubernetes/charts/iva/templates/azurefile/iva-conf-pv.yaml new file mode 100644 index 00000000000..d70c328f85e --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/iva/templates/azurefile/iva-conf-pv.yaml @@ -0,0 +1,18 @@ +{{- if .Values.azureStorageAccount.enabled -}} +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ include "pvIvaconf" . | quote }} +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + persistentVolumeReclaimPolicy: Retain + storageClassName: "azurefile" + azureFile: + secretName: {{ .Values.azureStorageAccount.secretName }} + secretNamespace: {{ .Release.Namespace }} + shareName: {{ .Values.azureStorageAccount.volumes.ivaconf.shareName }} + readOnly: false +{{- end }} \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-conf-pvc.yaml b/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-conf-pvc.yaml new file mode 100644 index 00000000000..e9c023a69a8 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-conf-pvc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "pvcIvaconf" . | quote }} +spec: + accessModes: + - ReadWriteMany + volumeName: {{ include "pvIvaconf" . | quote }} + storageClassName: {{ include "pvcStorageClassName" . }} + resources: + requests: + storage: 1Gi diff --git a/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-deployment.yaml index 6ed3c9bd835..390d3ce8bd6 100644 --- a/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-deployment.yaml @@ -56,10 +56,9 @@ spec: - mountPath: /usr/local/apache2/htdocs/iva/conf name: ivaconf volumes: - - azureFile: - secretName: {{ .Values.azureStorageAccount.secretName }} - shareName: {{ .Values.iva.volumes.ivaconf.shareName }} - name: ivaconf + - name: ivaconf + persistentVolumeClaim: + claimName: {{ include "pvcIvaconf" . | quote }} {{- with .Values.iva.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} diff --git a/opencga-app/app/cloud/kubernetes/charts/iva/values.yaml b/opencga-app/app/cloud/kubernetes/charts/iva/values.yaml index 3501613cd72..70851fdbd4a 100644 --- a/opencga-app/app/cloud/kubernetes/charts/iva/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/iva/values.yaml @@ -9,7 +9,12 @@ cellbase: host: "http://ws.opencb.org/cellbase/" azureStorageAccount: - secretName: # FILL_ME + enabled: true + createSecret: false + secretName: azure-files-secret + volumes: + ivaconf: + shareName: ivaconf iva: name: iva @@ -27,10 +32,6 @@ iva: imagePullSecrets: [] - volumes: - ivaconf: - shareName: ivaconf - serviceAccount: # Specifies whether a service account should be created create: true From 4b7b0f385f706ce8ca18f41d49cce08808852c63 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 31 Mar 2021 18:51:59 +0200 Subject: [PATCH 150/412] catalog: fix groups issue, closes #1735 --- .../migration/v2.1.0/catalog/migration.js | 19 ++++++++++++++++++- .../catalog/managers/StudyManager.java | 2 +- .../catalog/managers/CatalogManagerTest.java | 8 ++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js b/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js index 4eef77ba522..6baa3d15109 100644 --- a/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js +++ b/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js @@ -1,5 +1,22 @@ if (versionNeedsUpdate(20100, 1)) { runUpdate(function () { db.sample.createIndex({"internal.rga.status": 1, "studyUid": 1}, {"background": true}); - }); + }, "Add Sample RGA status #1693"); + + runUpdate(function () { + migrateCollection("study", {}, {groups: 1}, function(bulk, doc) { + var groups = doc["groups"]; + var toUpdate = false; + for (var group of groups) { + if (isUndefinedOrNull(group['userIds'])) { + group['userIds'] = []; + toUpdate = true; + } + } + + if (toUpdate) { + bulk.find({"_id": doc._id}).updateOne({"$set": {"groups": doc['groups']}}); + } + }); + }, "Check group consistency #1735"); } \ No newline at end of file diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java index 841430c6d1f..c58beb0d067 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java @@ -855,10 +855,10 @@ public OpenCGAResult createGroup(String studyId, Group group, String toke // We remove possible duplicates users = users.stream().collect(Collectors.toSet()).stream().collect(Collectors.toList()); userDBAdaptor.checkIds(users); - group.setUserIds(users); } else { users = Collections.emptyList(); } + group.setUserIds(users); // Add those users to the members group if (ListUtils.isNotEmpty(users)) { diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java index deabe2b9fc2..6c07ca22d2f 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java @@ -321,6 +321,14 @@ public void importLdapGroups() throws CatalogException, IOException { catalogManager.getUserManager().importRemoteGroupOfUsers("ldap", remoteGroup, internalGroup, study, true, getAdminToken()); } + @Test + public void createEmptyGroup() throws CatalogException { + catalogManager.getUserManager().create("test", "test", "test@mail.com", "test", null, 100L, Account.AccountType.GUEST, null); + catalogManager.getStudyManager().createGroup("user@1000G:phase1", "group_cancer_some_thing_else", null, token); + catalogManager.getStudyManager().updateGroup("user@1000G:phase1", "group_cancer_some_thing_else", ParamUtils.BasicUpdateAction.ADD, + new GroupUpdateParams(Collections.singletonList("test")), token); + } + @Test public void testAssignPermissions() throws CatalogException { catalogManager.getUserManager().create("test", "test", "test@mail.com", "test", null, 100L, Account.AccountType.GUEST, null); From a905e2614401d654851e2c725dcc96a88c8cebc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 31 Mar 2021 18:07:36 +0100 Subject: [PATCH 151/412] docker: Fix opencga-init setup configuration --- opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh | 2 +- opencga-app/app/cloud/docker/opencga-init/setup.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh b/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh index 0c263273236..bcbf9e1f7b7 100644 --- a/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh +++ b/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh @@ -26,7 +26,7 @@ fi HADOOP_USER_HOST="$INIT_HADOOP_SSH_USER@$INIT_HADOOP_SSH_DNS" FILE=/opt/volume/conf/hadoop -if [ -d "$FILE" ]; then +if [ -d "$FILE" ] && [ "${OVERWRITE_CONFIGURATION:-false}" == "false" ]; then echo "$FILE already exists" echo "Copy jar-with-dependencies to hadoop" $SSHPASS_CMD scp ${SSH_OPTS} -r /opt/opencga/*.jar "$HADOOP_USER_HOST":"$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" diff --git a/opencga-app/app/cloud/docker/opencga-init/setup.sh b/opencga-app/app/cloud/docker/opencga-init/setup.sh index b6a8327c419..d6ea4c06541 100644 --- a/opencga-app/app/cloud/docker/opencga-init/setup.sh +++ b/opencga-app/app/cloud/docker/opencga-init/setup.sh @@ -12,7 +12,7 @@ fi FILE=/opt/volume/conf/configuration.yml if [ -f "$FILE" ] && [ "${OVERWRITE_CONFIGURATION:-false}" == "false" ]; then echo "$FILE already exists" - cp -r /opt/volume/conf/* /opt/opencga/conf/* + cp -r /opt/volume/conf/* /opt/opencga/conf/ else echo "Copying default configs" cp -r -L -v /opt/opencga/default-conf/* /opt/opencga/conf/ From b884fb727c0bfad71da2bb6429d1f38f99636aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 31 Mar 2021 18:33:54 +0100 Subject: [PATCH 152/412] k8s: Add secretNamespace to pv-azurefiles --- .../charts/opencga/templates/azurefile/pv-azurefiles.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/azurefile/pv-azurefiles.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/azurefile/pv-azurefiles.yaml index 1fd07df7e04..b8f1a513702 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/azurefile/pv-azurefiles.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/azurefile/pv-azurefiles.yaml @@ -13,6 +13,7 @@ spec: azureFile: secretName: {{ .Values.azureStorageAccount.secretName }} shareName: {{ .Values.azureStorageAccount.volumes.conf.shareName }} + secretNamespace: {{ .Release.Namespace }} readOnly: false --- apiVersion: v1 @@ -29,6 +30,7 @@ spec: azureFile: secretName: {{ .Values.azureStorageAccount.secretName }} shareName: {{ .Values.azureStorageAccount.volumes.analysisconf.shareName }} + secretNamespace: {{ .Release.Namespace }} readOnly: false --- apiVersion: v1 @@ -45,6 +47,7 @@ spec: azureFile: secretName: {{ .Values.azureStorageAccount.secretName }} shareName: {{ .Values.azureStorageAccount.volumes.sessions.shareName }} + secretNamespace: {{ .Release.Namespace }} readOnly: false --- apiVersion: v1 @@ -61,5 +64,6 @@ spec: azureFile: secretName: {{ .Values.azureStorageAccount.secretName }} shareName: {{ .Values.azureStorageAccount.volumes.variants.shareName }} + secretNamespace: {{ .Release.Namespace }} readOnly: false {{- end }} \ No newline at end of file From e686e114af22aef281dec71ff2199eee0432d5d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 31 Mar 2021 18:34:10 +0100 Subject: [PATCH 153/412] k8s: Add extra mongodb configuration params --- .../cloud/azure/arm-kubernetes/setup-aks.sh | 1 - .../docker/opencga-init/override_yaml.py | 7 ++++- .../opencga/templates/master-deployment.yaml | 30 ++++++++++++------- .../opencga/templates/opencga-secrets.yaml | 2 +- .../kubernetes/charts/opencga/values.yaml | 13 ++++---- 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh index 5310310a0e5..31f384ac8ca 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh @@ -137,7 +137,6 @@ analysis: options: k8s: masterNode: "https://$(getOutput "aksApiServerAddress"):443" - namespace: "$K8S_NAMESPACE" index: variant: maxConcurrentJobs: "100" diff --git a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py index 04d96424ef9..60e9bb59b90 100644 --- a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py +++ b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py @@ -14,6 +14,8 @@ parser.add_argument("--catalog-database-user", required=True) parser.add_argument("--catalog-database-password", required=True) parser.add_argument("--catalog-database-ssl", required=False, default=True) +parser.add_argument("--catalog-database-authentication-database", required=False, default="admin") +parser.add_argument("--catalog-database-authentication-mechanism", required=False) parser.add_argument("--catalog-search-hosts", required=True) parser.add_argument("--catalog-search-user", required=False) parser.add_argument("--catalog-search-password", required=False) @@ -124,7 +126,10 @@ config["catalog"]["database"]["password"] = args.catalog_database_password config["catalog"]["database"]["options"]["sslEnabled"] = args.catalog_database_ssl config["catalog"]["database"]["options"]["sslInvalidCertificatesAllowed"] = True -config["catalog"]["database"]["options"]["authenticationDatabase"] = "admin" +if args.catalog_database_authentication_database is not None: + config["catalog"]["database"]["options"]["authenticationDatabase"] = args.catalog_database_authentication_database +if args.catalog_database_authentication_mechanism is not None: + config["catalog"]["database"]["options"]["authenticationMechanism"] = args.catalog_database_authentication_mechanism # Inject search database catalog_search_hosts = args.catalog_search_hosts.replace('\"','').replace('[','').replace(']','').split(",") diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml index 4483cd88511..cea789de222 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml @@ -53,34 +53,42 @@ spec: name: {{ include "opencga.secretName" . }} key: hdInsightSshPassword - name: "INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" - value: "/home/{{ .Values.hadoop.sshUsername }}/opencga/" + value: "/home/{{ .Values.hadoop.sshUsername }}/opencga/" + - name: "INIT_SEARCH_HOSTS" {{- if .Values.deploySolr }} value: http://opencga-solr-svc:8983 {{- else }} value: {{ .Values.solr.hosts | toString | quote }} - {{- end }} + {{- end }} + - name: "INIT_CATALOG_SEARCH_HOSTS" + {{- if .Values.deploySolr }} + value: http://opencga-solr-svc:8983 + {{- else }} + value: {{ .Values.solr.hosts | toString | quote }} + {{- end }} - name: "INIT_CLINICAL_HOSTS" value: {{ .Values.solr.hosts | toString | quote}} + - name: "INIT_CATALOG_DATABASE_HOSTS" {{- if .Values.deployMongo }} value: opencga-mongodb-replicaset {{- else }} - value: {{ .Values.catalog.database.hosts | toString | quote}} + value: {{ .Values.mongodb.hosts | toString | quote}} {{- end }} - name: "INIT_CATALOG_DATABASE_USER" - value: {{ .Values.catalog.database.user }} + value: {{ .Values.mongodb.user }} - name: "INIT_CATALOG_DATABASE_PASSWORD" valueFrom: secretKeyRef: name: {{ include "opencga.secretName" . }} key: mongoDbPassword - - name: "INIT_CATALOG_SEARCH_HOSTS" - {{- if .Values.deploySolr }} - value: http://opencga-solr-svc:8983 - {{- else }} - value: {{ .Values.solr.hosts | toString | quote }} - {{- end }} + - name: "INIT_CATALOG_DATABASE_SSL" + value: {{ .Values.mongodb.ssl }} + - name: "INIT_CATALOG_DATABASE_AUTHENTICATION_MECHANISM" + value: {{ .Values.mongodb.authenticationMechanism }} + - name: "INIT_CATALOG_DATABASE_AUTHENTICATION_DATABASE" + value: {{ .Values.mongodb.authenticationDatabase }} - name: "INIT_REST_HOST" value: "http://{{ .Values.rest.name }}/opencga" - name: "INIT_GRPC_HOST" @@ -90,7 +98,7 @@ spec: - name: "INIT_K8S_MASTER_NODE" value: {{ .Values.analysis.execution.options.k8s.masterNode }} - name: "INIT_K8S_NAMESPACE" - value: {{ .Values.analysis.execution.options.k8s.namespace }} + value: {{ .Release.Namespace }} - name: "INIT_K8S_VOLUMES_PVC_CONF" value: {{ include "pvcConf" . | quote }} - name: "INIT_K8S_VOLUMES_PVC_SESSIONS" diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/opencga-secrets.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/opencga-secrets.yaml index a160d7cd14e..bffbc4fd57f 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/opencga-secrets.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/opencga-secrets.yaml @@ -6,4 +6,4 @@ type: "Opaque" data: openCgaAdminPassword: {{ .Values.opencga.admin.password | b64enc | quote }} hdInsightSshPassword: {{ .Values.hadoop.sshPassword | b64enc | quote }} - mongoDbPassword: {{ .Values.catalog.database.password | b64enc | quote }} + mongoDbPassword: {{ .Values.mongodb.password | b64enc | quote }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index f2e56523092..d2eb78f3a04 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -5,11 +5,13 @@ deploySolr: false deployMongo: false -catalog: - database: - hosts: "FILL_ME" - user: "FILL_ME" - password: "FILL_ME" +mongodb: + hosts: "FILL_ME" + user: "FILL_ME" + password: "FILL_ME" + ssl: true + authenticationDatabase : "admin" + authenticationMechanism : "SCRAM-SHA-1" cellbase: host: "http://ws.opencb.org/cellbase/" @@ -23,7 +25,6 @@ analysis: options: k8s: masterNode: "FILL_ME" - namespace: "FILL_ME" solr: hosts: "FILL_ME" From d51d12cc71d1c7ea733fcd36c80dbe46e6d493de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 6 Apr 2021 16:51:00 +0100 Subject: [PATCH 154/412] storage: Fix FamilyIndexDriver with missing genotypes. --- .../variant/index/family/FamilyIndexDriver.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java index c3548ab0efc..360afb2f9fc 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java @@ -281,22 +281,22 @@ protected void map(ImmutableBytesWritable key, Result value, Context context) th Set childDiscrepancies = discrepanciesGtMap.get(child); if (fatherDiscrepancies == null && motherDiscrepancies == null && childDiscrepancies == null) { - String fatherGtStr = gtMap.get(father); - String motherGtStr = gtMap.get(mother); - String childGtStr = gtMap.get(child); + String fatherGtStr = father == MISSING_SAMPLE ? null : gtMap.getOrDefault(father, "0/0"); + String motherGtStr = mother == MISSING_SAMPLE ? null : gtMap.getOrDefault(mother, "0/0"); + String childGtStr = gtMap.getOrDefault(child, "0/0"); builder.addParents(childGtStr, fatherGtStr, motherGtStr); int idx = genotypeCount.get(child).merge(childGtStr, 1, Integer::sum) - 1; computeMendelianError(variant, father, mother, fatherGtStr, motherGtStr, childGtStr, context, builder, idx); } else { if (fatherDiscrepancies == null) { - fatherDiscrepancies = Collections.singleton(gtMap.get(father)); + fatherDiscrepancies = Collections.singleton(father == MISSING_SAMPLE ? null : gtMap.getOrDefault(father, "0/0")); } if (motherDiscrepancies == null) { - motherDiscrepancies = Collections.singleton(gtMap.get(mother)); + motherDiscrepancies = Collections.singleton(mother == MISSING_SAMPLE ? null : gtMap.getOrDefault(mother, "0/0")); } if (childDiscrepancies == null) { - childDiscrepancies = Collections.singleton(gtMap.get(child)); + childDiscrepancies = Collections.singleton(gtMap.getOrDefault(child, "0/0")); } // System.out.println("variant = " + variant); From a70412df9b6653c3053d65770592a079f2e0f8c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 6 Apr 2021 16:53:33 +0100 Subject: [PATCH 155/412] storage: Fix AIOOBE parsing range --- .../query/executors/accumulators/Range.java | 50 ++++++++++++++++++- .../SampleVariantStatsAggregationQuery.java | 9 ++-- .../executors/accumulators/RangeTest.java | 23 +++++++++ 3 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java index f77e90f9841..e1b64593920 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java @@ -1,5 +1,6 @@ package org.opencb.opencga.storage.core.variant.query.executors.accumulators; +import org.apache.commons.lang3.StringUtils; import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import java.util.ArrayList; @@ -14,6 +15,29 @@ public class Range> implements Comparable parse(String string) { + final boolean startInclusive = string.startsWith("["); + final boolean endInclusive = string.endsWith("]"); + final Double start; + final Double end; + String[] split = StringUtils.replaceChars(string, "[]() ", "").split(","); + if (split[0].equals("-inf")) { + start = null; + } else { + start = Double.valueOf(split[0]); + } + if (split.length == 1) { + end = start; + } else { + if (split[1].equals("inf")) { + end = null; + } else { + end = Double.valueOf(split[1]); + } + } + return new Range<>(start, startInclusive, end, endInclusive); + } + public Range(N start, N end) { this(start, true, end, false); } @@ -34,7 +58,7 @@ public Range(N start, boolean startInclusive, N end, boolean endInclusive) { } else { sb.append(start); } - if (!Objects.equals(start, end)) { + if (!Objects.equals(start, end) || start == null) { sb.append(", "); if (end == null) { sb.append("inf"); @@ -131,6 +155,30 @@ public int compareTo(Range o) { return start.compareTo(o.start); } + public N getStart() { + return start; + } + + public boolean isStartInfinity() { + return start == null; + } + + public boolean isStartInclusive() { + return startInclusive; + } + + public N getEnd() { + return end; + } + + public boolean isEndInfinity() { + return end == null; + } + + public boolean isEndInclusive() { + return endInclusive; + } + public static class NA> extends Range { public NA() { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java index d99bbef3866..4aed25490e9 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java @@ -20,6 +20,7 @@ import org.opencb.opencga.storage.core.variant.adaptors.GenotypeClass; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; +import org.opencb.opencga.storage.core.variant.query.executors.accumulators.Range; import java.util.Collections; import java.util.HashMap; @@ -188,16 +189,14 @@ && isIndel(facetField.getBuckets().get(0).getValue()) case "depth": case "dp": for (FacetField.Bucket bucket : facetField.getBuckets()) { - String[] split = StringUtils.replaceChars(bucket.getValue(), "[]() ", "").split(","); - String start = split[0]; - String endStr = split[1]; + Range range = Range.parse(bucket.getValue()); int count = (int) bucket.getCount(); //[start, end) DepthCount depthCount = stats.getDepthCount(); - if (endStr.equals("inf")) { + if (range.isEndInfinity()) { depthCount.setGte20(depthCount.getGte20() + count); } else { - double end = Double.parseDouble(endStr); + double end = range.getEnd(); if (end <= 5) { depthCount.setLt5(depthCount.getLt5() + count); } else if (end <= 10) { diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java new file mode 100644 index 00000000000..c4a8e965436 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java @@ -0,0 +1,23 @@ +package org.opencb.opencga.storage.core.variant.query.executors.accumulators; + +import org.junit.Test; + +import static org.junit.Assert.*; +public class RangeTest { + + @Test + public void testParse() { + checkParse("[1.0, 10.0)"); + checkParse("[1.0, 10.0]"); + checkParse("(1.0, 10.0]"); + checkParse("[10.0]"); + checkParse("(10.0]"); + checkParse("(10.0, inf]"); + checkParse("(-inf, inf]"); + } + + protected void checkParse(String s) { + assertEquals(s, Range.parse(s).toString()); + } + +} \ No newline at end of file From 2d7c5988ea5f1720f5520be5fa95755eaacddc53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 6 Apr 2021 18:02:21 +0100 Subject: [PATCH 156/412] storage: Fix parse range NA --- .../core/variant/query/executors/accumulators/Range.java | 3 +++ .../core/variant/query/executors/accumulators/RangeTest.java | 1 + 2 files changed, 4 insertions(+) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java index e1b64593920..a926bc88cb7 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java @@ -16,6 +16,9 @@ public class Range> implements Comparable parse(String string) { + if (string.equals("NA")) { + return new NA<>(); + } final boolean startInclusive = string.startsWith("["); final boolean endInclusive = string.endsWith("]"); final Double start; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java index c4a8e965436..bc34d179607 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java @@ -14,6 +14,7 @@ public void testParse() { checkParse("(10.0]"); checkParse("(10.0, inf]"); checkParse("(-inf, inf]"); + checkParse("NA"); } protected void checkParse(String s) { From f055b38d338d535ec06e39c8eab7140f56a652a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 7 Apr 2021 14:33:53 +0100 Subject: [PATCH 157/412] storage: Read NA from DP aggregation. --- .../query/executors/accumulators/Range.java | 11 +++++- .../SampleVariantStatsAggregationQuery.java | 36 ++++++++++--------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java index a926bc88cb7..25d5bf48af6 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java @@ -175,13 +175,17 @@ public N getEnd() { } public boolean isEndInfinity() { - return end == null; + return getEnd() == null; } public boolean isEndInclusive() { return endInclusive; } + public boolean isNA() { + return false; + } + public static class NA> extends Range { public NA() { @@ -198,6 +202,11 @@ public boolean isBeforeEnd(N number) { return number != null; } + @Override + public boolean isNA() { + return true; + } + @Override public int compareTo(Range o) { if (o instanceof Range.NA) { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java index 4aed25490e9..bd935765d50 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java @@ -130,25 +130,25 @@ private void processSimpleResult(DataResult result, SampleVariantSta && isIndel(facetField.getBuckets().get(0).getValue()) && CollectionUtils.isNotEmpty(facetField.getBuckets().get(0).getFacetFields())) { for (FacetField.Bucket bucket : facetField.getBuckets().get(0).getFacetFields().get(0).getBuckets()) { - String[] split = StringUtils.replaceChars(bucket.getValue(), "[]() ", "").split(","); - String start = split[0]; - String endStr = split[1]; + Range range = Range.parse(bucket.getValue()); int count = (int) bucket.getCount(); // [start, end) IndelLength indelLength = stats.getIndelLengthCount(); - if (endStr.equals("inf")) { - indelLength.setGte20(indelLength.getGte20() + count); - } else { - int end = Integer.parseInt(endStr); - if (end != 1) { - if (end <= 5) { - indelLength.setLt5(indelLength.getLt5() + count); - } else if (end <= 10) { - indelLength.setLt10(indelLength.getLt10() + count); - } else if (end <= 20) { - indelLength.setLt20(indelLength.getLt20() + count); - } else { - indelLength.setGte20(indelLength.getGte20() + count); + if (!range.isNA()) { + if (range.isEndInfinity()) { + indelLength.setGte20(indelLength.getGte20() + count); + } else { + int end = range.getEnd().intValue(); + if (end != 1) { + if (end <= 5) { + indelLength.setLt5(indelLength.getLt5() + count); + } else if (end <= 10) { + indelLength.setLt10(indelLength.getLt10() + count); + } else if (end <= 20) { + indelLength.setLt20(indelLength.getLt20() + count); + } else { + indelLength.setGte20(indelLength.getGte20() + count); + } } } } @@ -193,7 +193,9 @@ && isIndel(facetField.getBuckets().get(0).getValue()) int count = (int) bucket.getCount(); //[start, end) DepthCount depthCount = stats.getDepthCount(); - if (range.isEndInfinity()) { + if (range.isNA()) { + depthCount.setNa(depthCount.getNa() + count); + } else if (range.isEndInfinity()) { depthCount.setGte20(depthCount.getGte20() + count); } else { double end = range.getEnd(); From 2f91a0ffc1d4b5f4353d52b1f53b3fd6df7008aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 8 Apr 2021 09:23:28 +0200 Subject: [PATCH 158/412] analysis: improve the 'flag' parameters support (parameters without value) for samtools wrapper --- .../wrappers/SamtoolsWrapperAnalysis.java | 21 ++++++++++++-- .../app/cli/analysis/InternalMainTest.java | 28 +++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/SamtoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/SamtoolsWrapperAnalysis.java index ca0f81ad01b..2c5eea1e620 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/SamtoolsWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/SamtoolsWrapperAnalysis.java @@ -266,10 +266,25 @@ public String getCommandLine() throws ToolException { // Samtools options for (String param : params.keySet()) { if (checkParam(param)) { + String sep = param.length() == 1 ? " -" : " --"; String value = params.getString(param); - sb.append(param.length() == 1 ? " -" : " --").append(param); - if (StringUtils.isNotEmpty(value) && !"null".equals(value)) { - sb.append(" ").append(value); + if (StringUtils.isEmpty(value)) { + sb.append(sep).append(param); + } else { + switch (value.toLowerCase()) { + case "false": + // Nothing to do + break; + case "null": + case "true": + // Only param must be appended + sb.append(sep).append(param); + break; + default: + // Otherwise, param + value must be appended + sb.append(sep).append(param).append(" ").append(value); + break; + } } } } diff --git a/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java b/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java index 5c86c2f12f6..7ec000f1465 100644 --- a/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java +++ b/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java @@ -420,6 +420,34 @@ public void testStats() throws CatalogException, IOException, ToolException { System.out.println(resultFiles.getResults().get(0).getAnnotationSets().get(0)); } + @Test + public void testSamtoolsStats() throws CatalogException, IOException, ToolException { + createStudy(datastores, "s1"); + + String filename = "HG00096.chrom20.small.bam"; + File bamFile = opencga.createFile(studyId, filename, sessionId); + + String temporalDir = opencga.createTmpOutdir(studyId, "_stats", sessionId); + // samtools stats + System.out.println("--------------- samtools stats ---------------"); + + String temporalDir7 = opencga.createTmpOutdir(studyId, "_alignment7", sessionId); + String statsFile = temporalDir7 + "/alignment.stats"; + + execute("alignment", "samtools-run", + "--token", sessionId, + "--study", studyId, + "--command", "stats", + "--input-file", bamFile.getPath(), + "--output-filename", statsFile, + "--samtools-params", "F=0xB00", + "--samtools-params", "remove-dups=true", + "-o", temporalDir7); + + assertEquals(2, Files.list(Paths.get(temporalDir7)).collect(Collectors.toList()).size()); + assertTrue(new java.io.File(statsFile).exists()); + } + @Test public void testCoverage() throws Exception { createStudy(datastores, "s1"); From 9b00edc7b556898d6b65527a333ecdd62aea3791 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 8 Apr 2021 11:43:24 +0200 Subject: [PATCH 159/412] clinical: add samples for father and mother, #1693 --- .../clinical/rga/AbstractRgaConverter.java | 59 ++++++++++++ .../clinical/rga/GeneRgaConverter.java | 17 ++-- .../clinical/rga/IndividualRgaConverter.java | 82 ++++++++-------- .../opencga/clinical/rga/RgaDataModel.java | 65 ++++++------- .../clinical/rga/VariantRgaConverter.java | 14 +-- .../src/main/resources/rga/managed-schema | 2 + .../opencga/clinical/rga/RgaUtilsTest.java | 33 +++++-- .../analysis/knockout/KnockoutByGene.java | 93 +++++++++++++++++++ .../analysis/knockout/KnockoutByVariant.java | 19 +++- 9 files changed, 278 insertions(+), 106 deletions(-) create mode 100644 opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/AbstractRgaConverter.java diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/AbstractRgaConverter.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/AbstractRgaConverter.java new file mode 100644 index 00000000000..2e2f2769f3d --- /dev/null +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/AbstractRgaConverter.java @@ -0,0 +1,59 @@ +package org.opencb.opencga.clinical.rga; + +import com.fasterxml.jackson.core.JsonProcessingException; +import org.opencb.biodata.models.clinical.Disorder; +import org.opencb.biodata.models.clinical.Phenotype; +import org.opencb.biodata.models.pedigree.IndividualProperty; +import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.slf4j.Logger; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public abstract class AbstractRgaConverter { + + protected static Logger logger; + + protected static KnockoutByIndividual fillIndividualInfo(RgaDataModel rgaDataModel) { + KnockoutByIndividual knockoutByIndividual = new KnockoutByIndividual(); + knockoutByIndividual.setId(rgaDataModel.getIndividualId()); + knockoutByIndividual.setSampleId(rgaDataModel.getSampleId()); + knockoutByIndividual.setFatherId(rgaDataModel.getFatherId()); + knockoutByIndividual.setMotherId(rgaDataModel.getMotherId()); + knockoutByIndividual.setMotherSampleId(rgaDataModel.getMotherSampleId()); + knockoutByIndividual.setFatherSampleId(rgaDataModel.getFatherSampleId()); + knockoutByIndividual.setSex(rgaDataModel.getSex() != null ? IndividualProperty.Sex.valueOf(rgaDataModel.getSex()) : null); + if (rgaDataModel.getPhenotypeJson() != null) { + List phenotypes = new ArrayList<>(rgaDataModel.getPhenotypeJson().size()); + for (String phenotype : rgaDataModel.getPhenotypeJson()) { + try { + phenotypes.add(JacksonUtils.getDefaultObjectMapper().readValue(phenotype, Phenotype.class)); + } catch (JsonProcessingException e) { + logger.warn("Could not parse Phenotypes: {}", e.getMessage(), e); + } + } + knockoutByIndividual.setPhenotypes(phenotypes); + } else { + knockoutByIndividual.setPhenotypes(Collections.emptyList()); + } + + if (rgaDataModel.getDisorderJson() != null) { + List disorders = new ArrayList<>(rgaDataModel.getDisorderJson().size()); + for (String disorder : rgaDataModel.getDisorderJson()) { + try { + disorders.add(JacksonUtils.getDefaultObjectMapper().readValue(disorder, Disorder.class)); + } catch (JsonProcessingException e) { + logger.warn("Could not parse Disorders: {}", e.getMessage(), e); + } + } + knockoutByIndividual.setDisorders(disorders); + } else { + knockoutByIndividual.setDisorders(Collections.emptyList()); + } + + return knockoutByIndividual; + } + +} diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java index 210a7fefd43..8635258dd19 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java @@ -4,17 +4,15 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; -import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; -public class GeneRgaConverter implements ComplexTypeConverter, List> { - - private Logger logger; +public class GeneRgaConverter extends AbstractRgaConverter implements ComplexTypeConverter, List> { // This object contains the list of solr fields that are required in order to fully build each of the RgaKnockoutByGene fields private static final Map> CONVERTER_MAP; @@ -35,7 +33,11 @@ public class GeneRgaConverter implements ComplexTypeConverter convertToDataModelType(List rgaData } } if (knockoutIndividual == null) { - knockoutIndividual = new RgaKnockoutByGene.KnockoutIndividual(); - knockoutIndividual.setId(rgaDataModel.getIndividualId()); - knockoutIndividual.setSampleId(rgaDataModel.getSampleId()); + knockoutIndividual = new KnockoutByGene.KnockoutIndividual(fillIndividualInfo(rgaDataModel)); knockoutIndividual.setTranscripts(new LinkedList<>()); knockoutByGene.addIndividual(knockoutIndividual); diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java index fbc551b71f9..f424b824aac 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java @@ -10,19 +10,17 @@ import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import org.opencb.commons.datastore.core.ComplexTypeConverter; +import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.clinical.rga.exceptions.RgaException; -import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; -public class IndividualRgaConverter implements ComplexTypeConverter, List> { - - private static Logger logger; +public class IndividualRgaConverter extends AbstractRgaConverter + implements ComplexTypeConverter, List> { // This object contains the list of solr fields that are required in order to fully build each of the KnockoutByIndividual fields private static final Map> CONVERTER_MAP; @@ -34,6 +32,8 @@ public class IndividualRgaConverter implements ComplexTypeConverter variantIds, Map result) { if (!result.containsKey(rgaDataModel.getIndividualId())) { - KnockoutByIndividual knockoutByIndividual = new KnockoutByIndividual(); - knockoutByIndividual.setId(rgaDataModel.getIndividualId()); - knockoutByIndividual.setSampleId(rgaDataModel.getSampleId()); - knockoutByIndividual.setFatherId(rgaDataModel.getFatherId()); - knockoutByIndividual.setMotherId(rgaDataModel.getMotherId()); - knockoutByIndividual.setSex(rgaDataModel.getSex() != null ? IndividualProperty.Sex.valueOf(rgaDataModel.getSex()) : null); - if (rgaDataModel.getPhenotypeJson() != null) { - List phenotypes = new ArrayList<>(rgaDataModel.getPhenotypeJson().size()); - for (String phenotype : rgaDataModel.getPhenotypeJson()) { - try { - phenotypes.add(JacksonUtils.getDefaultObjectMapper().readValue(phenotype, Phenotype.class)); - } catch (JsonProcessingException e) { - logger.warn("Could not parse Phenotypes: {}", e.getMessage(), e); - } - } - knockoutByIndividual.setPhenotypes(phenotypes); - } else { - knockoutByIndividual.setPhenotypes(Collections.emptyList()); - } - - if (rgaDataModel.getDisorderJson() != null) { - List disorders = new ArrayList<>(rgaDataModel.getDisorderJson().size()); - for (String disorder : rgaDataModel.getDisorderJson()) { - try { - disorders.add(JacksonUtils.getDefaultObjectMapper().readValue(disorder, Disorder.class)); - } catch (JsonProcessingException e) { - logger.warn("Could not parse Disorders: {}", e.getMessage(), e); - } - } - knockoutByIndividual.setDisorders(disorders); - } else { - knockoutByIndividual.setDisorders(Collections.emptyList()); - } + KnockoutByIndividual knockoutByIndividual = fillIndividualInfo(rgaDataModel); List geneList = new LinkedList<>(); KnockoutByIndividual.KnockoutGene knockoutGene = new KnockoutByIndividual.KnockoutGene(); @@ -312,12 +280,38 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI ? knockoutByIndividual.getSex().name() : IndividualProperty.Sex.UNKNOWN.name(); - RgaDataModel model = new RgaDataModel(id, individualId, knockoutByIndividual.getSampleId(), sex, phenotypes, disorders, - knockoutByIndividual.getFatherId(), knockoutByIndividual.getMotherId(), numParents, gene.getId(), - gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, - new ArrayList<>(types), new ArrayList<>(knockoutTypes), new ArrayList<>(filters), - new ArrayList<>(consequenceTypes), new ArrayList<>(clinicalSignificances), popFreqs, compoundFilters, - phenotypeJson, disorderJson, variantJson); + RgaDataModel model = new RgaDataModel() + .setId(id) + .setIndividualId(individualId) + .setSampleId(knockoutByIndividual.getSampleId()) + .setSex(sex) + .setPhenotypes(phenotypes) + .setDisorders(disorders) + .setFatherId(knockoutByIndividual.getFatherId()) + .setMotherId(knockoutByIndividual.getMotherId()) + .setFatherSampleId(knockoutByIndividual.getFatherSampleId()) + .setMotherSampleId(knockoutByIndividual.getMotherSampleId()) + .setNumParents(numParents) + .setGeneId(gene.getId()) + .setGeneName(gene.getName()) + .setGeneBiotype(gene.getBiotype()) + .setChromosome(gene.getChromosome()) + .setStrand(gene.getStrand()) + .setStart(gene.getStart()) + .setEnd(gene.getEnd()) + .setTranscriptId(transcript.getId()) + .setTranscriptBiotype(transcript.getBiotype()) + .setVariants(variantIds) + .setTypes(new ArrayList<>(types)) + .setKnockoutTypes(new ArrayList<>(knockoutTypes)) + .setFilters(new ArrayList<>(filters)) + .setConsequenceTypes(new ArrayList<>(consequenceTypes)) + .setClinicalSignificances(new ArrayList<>(clinicalSignificances)) + .setPopulationFrequencies(popFreqs) + .setCompoundFilters(compoundFilters) + .setPhenotypeJson(phenotypeJson) + .setDisorderJson(disorderJson) + .setVariantJson(variantJson); result.add(model); } } diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java index 11c65b80e14..ef4599b76f4 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java @@ -28,9 +28,15 @@ public class RgaDataModel { @Field private String fatherId; + @Field + private String fatherSampleId; + @Field private String motherId; + @Field + private String motherSampleId; + @Field private int numParents; @@ -101,7 +107,9 @@ public class RgaDataModel { public static final String PHENOTYPES = "phenotypes"; public static final String DISORDERS = "disorders"; public static final String MOTHER_ID = "motherId"; + public static final String MOTHER_SAMPLE_ID = "motherSampleId"; public static final String FATHER_ID = "fatherId"; + public static final String FATHER_SAMPLE_ID = "fatherSampleId"; public static final String NUM_PARENTS = "numParents"; public static final String GENE_ID = "geneId"; public static final String GENE_NAME = "geneName"; @@ -129,43 +137,6 @@ public class RgaDataModel { public RgaDataModel() { } - public RgaDataModel(String id, String individualId, String sampleId, String sex, List phenotypes, List disorders, - String fatherId, String motherId, int numParents, String geneId, String geneName, String geneBiotype, - String chromosome, String strand, int start, int end, String transcriptId, String transcriptBiotype, - List variants, List types, List knockoutTypes, List filters, - List consequenceTypes, List clinicalSignificances, Map> populationFrequencies, - List compoundFilters, List phenotypeJson, List disorderJson, List variantJson) { - this.id = id; - this.individualId = individualId; - this.sampleId = sampleId; - this.sex = sex; - this.phenotypes = phenotypes; - this.disorders = disorders; - this.fatherId = fatherId; - this.motherId = motherId; - this.numParents = numParents; - this.geneId = geneId; - this.geneName = geneName; - this.geneBiotype = geneBiotype; - this.chromosome = chromosome; - this.strand = strand; - this.start = start; - this.end = end; - this.transcriptId = transcriptId; - this.transcriptBiotype = transcriptBiotype; - this.variants = variants; - this.types = types; - this.knockoutTypes = knockoutTypes; - this.filters = filters; - this.consequenceTypes = consequenceTypes; - this.clinicalSignificances = clinicalSignificances; - this.populationFrequencies = populationFrequencies; - this.compoundFilters = compoundFilters; - this.phenotypeJson = phenotypeJson; - this.disorderJson = disorderJson; - this.variantJson = variantJson; - } - @Override public String toString() { final StringBuilder sb = new StringBuilder("RgaDataModel{"); @@ -176,7 +147,9 @@ public String toString() { sb.append(", phenotypes=").append(phenotypes); sb.append(", disorders=").append(disorders); sb.append(", fatherId='").append(fatherId).append('\''); + sb.append(", fatherSampleId='").append(fatherSampleId).append('\''); sb.append(", motherId='").append(motherId).append('\''); + sb.append(", motherSampleId='").append(motherSampleId).append('\''); sb.append(", numParents=").append(numParents); sb.append(", geneId='").append(geneId).append('\''); sb.append(", geneName='").append(geneName).append('\''); @@ -274,6 +247,24 @@ public RgaDataModel setMotherId(String motherId) { return this; } + public String getFatherSampleId() { + return fatherSampleId; + } + + public RgaDataModel setFatherSampleId(String fatherSampleId) { + this.fatherSampleId = fatherSampleId; + return this; + } + + public String getMotherSampleId() { + return motherSampleId; + } + + public RgaDataModel setMotherSampleId(String motherSampleId) { + this.motherSampleId = motherSampleId; + return this; + } + public int getNumParents() { return numParents; } diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java index ae8de2aeb6b..5e9c6029376 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java @@ -7,15 +7,11 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; -public class VariantRgaConverter implements ComplexTypeConverter, List> { - - private Logger logger; - private IndividualRgaConverter individualRgaConverter; +public class VariantRgaConverter extends AbstractRgaConverter implements ComplexTypeConverter, List> { // This object contains the list of solr fields that are required in order to fully build each of the KnockoutByIndividual fields private static final Map> CONVERTER_MAP; @@ -35,6 +31,10 @@ public class VariantRgaConverter implements ComplexTypeConverter + + diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java index 69a71225ad9..d5adf44c63f 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java +++ b/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java @@ -20,14 +20,22 @@ public static KnockoutByIndividual createKnockoutByIndividual(int count) { KnockoutByIndividual knockoutByIndividual = new KnockoutByIndividual(); knockoutByIndividual.setId("id" + count); knockoutByIndividual.setSampleId("sample" + count); + knockoutByIndividual.setFatherId("father"); + knockoutByIndividual.setMotherId("mother"); + knockoutByIndividual.setMotherSampleId("sample" + count * 10); + knockoutByIndividual.setFatherSampleId("sample" + count * 100); knockoutByIndividual.setSex(IndividualProperty.Sex.MALE); knockoutByIndividual.setDisorders(Collections.singletonList(new Disorder().setId("disorderId" + count).setName("disorderName" + count))); knockoutByIndividual.setPhenotypes(Collections.singletonList(new Phenotype().setId("phenotypeId" + count).setName("phenotypeName" + count))); List knockoutGeneList = new ArrayList<>(2); - KnockoutByIndividual.KnockoutGene knockoutGene = new KnockoutByIndividual.KnockoutGene(); - knockoutGene.setId("geneId" + count); - knockoutGene.setName("geneName" + count); + KnockoutByIndividual.KnockoutGene knockoutGene = new KnockoutByIndividual.KnockoutGene() + .setId("geneId" + count) + .setName("geneName" + count) + .setChromosome("chr12") + .setStart(2) + .setEnd(100) + .setBiotype("protein_coding"); List knockoutTranscriptList = new ArrayList<>(2); knockoutTranscriptList.add(createTranscript(1)); @@ -66,15 +74,26 @@ public static KnockoutTranscript createTranscript(int count) { sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0001891", "regulatory_region_amplification")); sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0000685", "DNAseI_hypersensitive_site")); - knockoutVariantList.add(new KnockoutVariant("chr1:" + count + ":A:C", "rs1234", "Genotype", 10, "PASS", "10", null, KnockoutVariant.KnockoutType.COMP_HET, - sequenceOntologyTermList, populationFrequencyList, clinicalSignificance)); + KnockoutVariant knockoutVariant = new KnockoutVariant("chr1:" + count + ":A:C", "rs1234", "Genotype", 10, "PASS", "10", null, + KnockoutVariant.KnockoutType.COMP_HET, sequenceOntologyTermList, populationFrequencyList, clinicalSignificance) + .setStart(1) + .setEnd(10) + .setChromosome("chr12") + .setLength(10); + knockoutVariantList.add(knockoutVariant); populationFrequencyList = new ArrayList<>(3); populationFrequencyList.add(new PopulationFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, "ALL", "", "", 1f, 0.2f, 1f, 0.04f, 0.02f)); populationFrequencyList.add(new PopulationFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, "ALL", "", "", 1f, 0.01f, 1f, 0.01f, 0.01f)); populationFrequencyList.add(new PopulationFrequency("otherStudy", "ALL", "", "", 1f, 0.04f, 1f, 0.004f, 0.2f)); - knockoutVariantList.add(new KnockoutVariant("chr1:" + (count + 1) + ":A:C", "rs4321", "Genotype", 2, "NOT_PASS", "1", null, - KnockoutVariant.KnockoutType.COMP_HET, sequenceOntologyTermList, populationFrequencyList, clinicalSignificance)); + + knockoutVariant = new KnockoutVariant("chr1:" + (count + 1) + ":A:C", "rs4321", "Genotype", 2, "NOT_PASS", "1", null, + KnockoutVariant.KnockoutType.COMP_HET, sequenceOntologyTermList, populationFrequencyList, clinicalSignificance) + .setStart(1) + .setEnd(10) + .setChromosome("chr12") + .setLength(10); + knockoutVariantList.add(knockoutVariant); knockoutTranscript.setVariants(knockoutVariantList); return knockoutTranscript; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGene.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGene.java index c15f89429d6..8ec739b0640 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGene.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGene.java @@ -16,7 +16,10 @@ package org.opencb.opencga.core.models.analysis.knockout; +import org.opencb.biodata.models.clinical.Disorder; +import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.biodata.models.core.GeneAnnotation; +import org.opencb.biodata.models.pedigree.IndividualProperty; import java.util.*; @@ -135,11 +138,38 @@ public KnockoutByGene addIndividual(KnockoutIndividual individual) { public static class KnockoutIndividual { private String id; private String sampleId; + private String motherId; + private String motherSampleId; + private String fatherId; + private String fatherSampleId; + private IndividualProperty.Sex sex; + private List phenotypes; + private List disorders; private Map transcriptsMap = new HashMap<>(); // Internal only public KnockoutIndividual() { } + public KnockoutIndividual(String id, String sampleId, String motherId, String motherSampleId, String fatherId, + String fatherSampleId, IndividualProperty.Sex sex, List phenotypes, List disorders) { + this.id = id; + this.sampleId = sampleId; + this.motherId = motherId; + this.motherSampleId = motherSampleId; + this.fatherId = fatherId; + this.fatherSampleId = fatherSampleId; + this.sex = sex; + this.phenotypes = phenotypes; + this.disorders = disorders; + } + + public KnockoutIndividual(KnockoutByIndividual knockoutByIndividual) { + this(knockoutByIndividual.getId(), knockoutByIndividual.getSampleId(), + knockoutByIndividual.getMotherId(), knockoutByIndividual.getMotherSampleId(), knockoutByIndividual.getFatherId(), + knockoutByIndividual.getFatherSampleId(), knockoutByIndividual.getSex(), knockoutByIndividual.getPhenotypes(), + knockoutByIndividual.getDisorders()); + } + public String getId() { return id; } @@ -158,6 +188,69 @@ public KnockoutIndividual setSampleId(String sampleId) { return this; } + public String getMotherId() { + return motherId; + } + + public KnockoutIndividual setMotherId(String motherId) { + this.motherId = motherId; + return this; + } + + public String getMotherSampleId() { + return motherSampleId; + } + + public KnockoutIndividual setMotherSampleId(String motherSampleId) { + this.motherSampleId = motherSampleId; + return this; + } + + public String getFatherId() { + return fatherId; + } + + public KnockoutIndividual setFatherId(String fatherId) { + this.fatherId = fatherId; + return this; + } + + public String getFatherSampleId() { + return fatherSampleId; + } + + public KnockoutIndividual setFatherSampleId(String fatherSampleId) { + this.fatherSampleId = fatherSampleId; + return this; + } + + public IndividualProperty.Sex getSex() { + return sex; + } + + public KnockoutIndividual setSex(IndividualProperty.Sex sex) { + this.sex = sex; + return this; + } + + public List getPhenotypes() { + return phenotypes; + } + + public KnockoutIndividual setPhenotypes(List phenotypes) { + this.phenotypes = phenotypes; + return this; + } + + public List getDisorders() { + return disorders; + } + + public KnockoutIndividual setDisorders(List disorders) { + this.disorders = disorders; + return this; + } + public KnockoutTranscript getTranscript(String transcript) { return transcriptsMap.computeIfAbsent(transcript, KnockoutTranscript::new); } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java index 7806d2e7c4e..8efed254626 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java @@ -9,6 +9,7 @@ public class KnockoutByVariant { private String id; + private String dbSnp; private String chromosome; private int start; private int end; @@ -27,18 +28,19 @@ public KnockoutByVariant() { } public KnockoutByVariant(String id, List individuals) { - this(id, null, -1, -1, 0, null, null, null, null, null, individuals); + this(id, "", null, -1, -1, 0, null, null, null, null, null, individuals); } public KnockoutByVariant(String id, String chromosome, int start, int end, int length, String reference, String alternate, List individuals) { - this(id, chromosome, start, end, length, reference, alternate, null, null, null, individuals); + this(id, "", chromosome, start, end, length, reference, alternate, null, null, null, individuals); } - public KnockoutByVariant(String id, String chromosome, int start, int end, int length, String reference, String alternate, + public KnockoutByVariant(String id, String dbSnp, String chromosome, int start, int end, int length, String reference, String alternate, VariantType type, List populationFrequencies, List clinicalSignificance, List individuals) { this.id = id; + this.dbSnp = dbSnp; this.chromosome = chromosome; this.start = start; this.end = end; @@ -56,6 +58,7 @@ public KnockoutByVariant(String id, String chromosome, int start, int end, int l public String toString() { final StringBuilder sb = new StringBuilder("KnockoutByVariant{"); sb.append("id='").append(id).append('\''); + sb.append(", dbSnp='").append(dbSnp).append('\''); sb.append(", chromosome='").append(chromosome).append('\''); sb.append(", start=").append(start); sb.append(", end=").append(end); @@ -72,6 +75,7 @@ public String toString() { } public KnockoutByVariant setVariantFields(KnockoutVariant knockoutVariant) { + this.dbSnp = knockoutVariant.getDbSnp(); this.chromosome = knockoutVariant.getChromosome(); this.start = knockoutVariant.getStart(); this.end = knockoutVariant.getEnd(); @@ -93,6 +97,15 @@ public KnockoutByVariant setId(String id) { return this; } + public String getDbSnp() { + return dbSnp; + } + + public KnockoutByVariant setDbSnp(String dbSnp) { + this.dbSnp = dbSnp; + return this; + } + public String getChromosome() { return chromosome; } From f8a451f3fa9a8b4bbb5fd2d1910c22b8cb704b15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 8 Apr 2021 16:18:57 +0100 Subject: [PATCH 160/412] storage: Exclude codehale metrics from being shaded. --- .../opencga-storage-hadoop-deps/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml index 02b8bf7cf3c..9331eb2ebaf 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml @@ -743,6 +743,12 @@ com/google/common/base/Preconditions* + + org.apache.phoenix:phoenix-core + + com/codahale/metrics/* + + From 74ccc818e0ea9173faec82762a1b01dda2470b16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 9 Apr 2021 12:17:45 +0100 Subject: [PATCH 161/412] pom: Add opencga-test as a real module --- opencga-app/pom.xml | 18 ++++++++++++------ pom.xml | 1 + 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/opencga-app/pom.xml b/opencga-app/pom.xml index afce2d236d4..66d48de242f 100644 --- a/opencga-app/pom.xml +++ b/opencga-app/pom.xml @@ -70,6 +70,12 @@ org.opencb.opencga opencga-client + + org.opencb.opencga + opencga-test + ${opencga.version} + pom + org.opencb.opencga opencga-server @@ -325,11 +331,11 @@ Copying Acceptance testing files - - - - - + + + + + @@ -413,7 +419,7 @@ - + diff --git a/pom.xml b/pom.xml index bf6e08ea765..2547bfb4e06 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ opencga-client opencga-server opencga-clinical + opencga-test From d91fd9d5bca0c6f4f9c93169cc6fb1b4afae8ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 9 Apr 2021 12:19:46 +0100 Subject: [PATCH 162/412] k8s: Fix configMap files.glob inclusion. #1731 --- .../kubernetes/charts/opencga/templates/configmap.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml index 077f2b3bf5a..d1332646c25 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml @@ -3,5 +3,8 @@ kind: ConfigMap metadata: name: {{ include "opencga.defaultConf.name" . }} data: - {{- (.Files.Glob "conf/**.yml").AsConfig | nindent 2 }} - {{- (.Files.Glob "conf/**.xml").AsConfig | nindent 2 }} \ No newline at end of file + k8s.yml: | + {{ include "opencga.labels" . | nindent 4 }} + {{- if ( ne (len (.Files.Glob "conf/**.{xml,yml,yaml}")) 0) }} + {{- (.Files.Glob "conf/**.{xml,yml,yaml}").AsConfig | nindent 2 }} + {{- end }} From 327799eaaebb046f065a0796260775cbc61d07a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 9 Apr 2021 12:23:34 +0100 Subject: [PATCH 163/412] k8s: Accept list of hosts for iva and rest ingress, all with the same set of paths --- .../app/cloud/azure/arm-kubernetes/setup-aks.sh | 8 ++++++-- .../charts/iva/templates/iva-deployment.yaml | 7 ++++++- .../charts/iva/templates/iva-ingress.yaml | 17 ++++++----------- .../app/cloud/kubernetes/charts/iva/values.yaml | 4 +++- .../charts/opencga/templates/NOTES.txt | 5 +++-- .../charts/opencga/templates/rest-ingress.yaml | 15 +++++---------- .../cloud/kubernetes/charts/opencga/values.yaml | 4 +++- 7 files changed, 32 insertions(+), 28 deletions(-) diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh index 31f384ac8ca..47d68ecc5b2 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh @@ -143,11 +143,15 @@ analysis: rest: ingress: - host: "opencga.$(getOutput "privateDnsZonesName")" + hosts: + - "" + - "opencga.$(getOutput "privateDnsZonesName")" iva: ingress: - host: "opencga.$(getOutput "privateDnsZonesName")" + hosts: + - "" + - "opencga.$(getOutput "privateDnsZonesName")" EOF diff --git a/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-deployment.yaml index 390d3ce8bd6..d387a54cb40 100644 --- a/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-deployment.yaml @@ -46,6 +46,11 @@ spec: {{- toYaml .Values.iva.securityContext | nindent 12 }} image: {{ tpl .Values.iva.image.repository . | quote }} imagePullPolicy: {{ .Values.iva.image.pullPolicy }} + command: + - /bin/sh + args: + - -c + - 'cp -r /opt/ivaconf/* /usr/local/apache2/htdocs/iva/conf && httpd-foreground' ports: - containerPort: 80 name: http @@ -53,7 +58,7 @@ spec: resources: {{- toYaml .Values.iva.resources | nindent 12 }} volumeMounts: - - mountPath: /usr/local/apache2/htdocs/iva/conf + - mountPath: /opt/ivaconf/ name: ivaconf volumes: - name: ivaconf diff --git a/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-ingress.yaml b/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-ingress.yaml index 56e0e96d2b8..a2e4c5fd604 100644 --- a/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-ingress.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/iva/templates/iva-ingress.yaml @@ -1,6 +1,7 @@ {{- if .Values.iva.ingress.enabled -}} {{- $fullName := .Values.iva.name -}} {{- $svcPort := .Values.iva.service.port -}} +{{- $paths := .Values.iva.ingress.paths -}} apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: @@ -23,21 +24,15 @@ spec: {{- end }} {{- end }} rules: - - host: {{ .Values.iva.ingress.host | quote }} + {{- range .Values.iva.ingress.hosts }} + - host: {{ . | quote }} http: paths: - {{- range .Values.iva.ingress.paths }} + {{- range $paths }} - path: {{ . }} backend: serviceName: {{ $fullName }} servicePort: {{ $svcPort }} - {{- end }} - - http: - paths: - {{- range .Values.iva.ingress.paths }} - - path: {{ . }} - backend: - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} - {{- end }} + {{- end }} + {{- end }} {{- end }} \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/iva/values.yaml b/opencga-app/app/cloud/kubernetes/charts/iva/values.yaml index 70851fdbd4a..ba581070916 100644 --- a/opencga-app/app/cloud/kubernetes/charts/iva/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/iva/values.yaml @@ -62,7 +62,9 @@ iva: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: /iva/$2 # kubernetes.io/tls-acme: "true" - host: "opencga.local" # This host name should be added to the internal DNS zone pointing to the nginx service external IP + hosts: + - "opencga.local" # This host name should be added to the internal DNS zone pointing to the nginx service external IP + - "" # Accept access by IP .Testing purposes only. # Accepts / , /iva and /iva/.... paths: - /iva(/|$)(.*) diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt index f197334bc9b..8729496c9ce 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt @@ -1,8 +1,9 @@ 1. Get the application URL by running these commands: {{- if .Values.rest.ingress.enabled }} +{{- $paths := .Values.rest.ingress.paths -}} {{- range $host := .Values.rest.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.rest.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }} + {{- range $path := $paths }} + http{{ if $.Values.rest.ingress.tls }}s{{ end }}://{{ $host }}{{ $path }} {{- end }} {{- end }} {{- else if contains "NodePort" .Values.rest.service.type }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-ingress.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-ingress.yaml index 107525b8af3..575a137485d 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-ingress.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-ingress.yaml @@ -1,6 +1,7 @@ {{- if .Values.rest.ingress.enabled -}} {{- $fullName := .Values.rest.name -}} {{- $svcPort := .Values.rest.service.port -}} +{{- $paths := .Values.rest.ingress.paths -}} apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: @@ -23,21 +24,15 @@ spec: {{- end }} {{- end }} rules: - - host: {{ .Values.rest.ingress.host | quote }} + {{- range .Values.rest.ingress.hosts }} + - host: {{ . | quote }} http: paths: - {{- range .Values.rest.ingress.paths }} - - path: {{ . }} - backend: - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} - {{- end }} - - http: - paths: - {{- range .Values.rest.ingress.paths }} + {{- range $paths }} - path: {{ . }} backend: serviceName: {{ $fullName }} servicePort: {{ $svcPort }} {{- end }} + {{- end }} {{- end }} \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index d2eb78f3a04..5042e2468d1 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -101,7 +101,9 @@ rest: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: "false" # kubernetes.io/tls-acme: "true" - host: "opencga.local" # This host name should be added to the internal DNS zone pointing to the nginx service external IP + hosts: + - "opencga.local" # This host name should be added to the internal DNS zone pointing to the nginx service external IP + - "" # Accept access by IP .Testing purposes only. # Accepts /opencga and /opencga/.... paths: - /opencga(/|$) From 4dd0426ce5b442ba820b9ab2116296d9a3c5ea36 Mon Sep 17 00:00:00 2001 From: Antonio Altamura Date: Fri, 9 Apr 2021 13:36:36 +0000 Subject: [PATCH 164/412] GitBook: [develop] 2 pages and 12 assets modified --- .../{image (1).png => image (6) (1).png} | Bin .../{image (3).png => image (6) (2).png} | Bin .../{image (4).png => image (6) (3).png} | Bin .../{image (5).png => image (6) (4).png} | Bin .../assets/{image.png => image (6) (5).png} | Bin .../{image (7).png => image (8) (1).png} | Bin .../client-libraries/javascript.md | 48 ++++++++++++++---- docs/using-opencga/client-libraries/python.md | 2 +- 8 files changed, 40 insertions(+), 10 deletions(-) rename docs/.gitbook/assets/{image (1).png => image (6) (1).png} (100%) rename docs/.gitbook/assets/{image (3).png => image (6) (2).png} (100%) rename docs/.gitbook/assets/{image (4).png => image (6) (3).png} (100%) rename docs/.gitbook/assets/{image (5).png => image (6) (4).png} (100%) rename docs/.gitbook/assets/{image.png => image (6) (5).png} (100%) rename docs/.gitbook/assets/{image (7).png => image (8) (1).png} (100%) diff --git a/docs/.gitbook/assets/image (1).png b/docs/.gitbook/assets/image (6) (1).png similarity index 100% rename from docs/.gitbook/assets/image (1).png rename to docs/.gitbook/assets/image (6) (1).png diff --git a/docs/.gitbook/assets/image (3).png b/docs/.gitbook/assets/image (6) (2).png similarity index 100% rename from docs/.gitbook/assets/image (3).png rename to docs/.gitbook/assets/image (6) (2).png diff --git a/docs/.gitbook/assets/image (4).png b/docs/.gitbook/assets/image (6) (3).png similarity index 100% rename from docs/.gitbook/assets/image (4).png rename to docs/.gitbook/assets/image (6) (3).png diff --git a/docs/.gitbook/assets/image (5).png b/docs/.gitbook/assets/image (6) (4).png similarity index 100% rename from docs/.gitbook/assets/image (5).png rename to docs/.gitbook/assets/image (6) (4).png diff --git a/docs/.gitbook/assets/image.png b/docs/.gitbook/assets/image (6) (5).png similarity index 100% rename from docs/.gitbook/assets/image.png rename to docs/.gitbook/assets/image (6) (5).png diff --git a/docs/.gitbook/assets/image (7).png b/docs/.gitbook/assets/image (8) (1).png similarity index 100% rename from docs/.gitbook/assets/image (7).png rename to docs/.gitbook/assets/image (8) (1).png diff --git a/docs/using-opencga/client-libraries/javascript.md b/docs/using-opencga/client-libraries/javascript.md index 30471ec0785..faebd929371 100644 --- a/docs/using-opencga/client-libraries/javascript.md +++ b/docs/using-opencga/client-libraries/javascript.md @@ -1,26 +1,29 @@ # JavaScript -### Fetching the first 10 samples of the defined Study +The OpenCGA JavaScript Client is provided as part of [JSorolla](https://github.com/opencb/jsorolla). + +### Example: + +#### Fetching the first 10 variants of the Study of interest using a token ```text import {OpenCGAClient} from "./opencga-client.js"; -import {RestResponse} from "./../rest-response.js"; -const host = ""; // add your host -const study = ""; // add your study -const token = ""; // add a valid token +const HOST = ""; // add your host +const STUDY = ""; // add your study of interest +const TOKEN = ""; // add a valid token const client = new OpenCGAClient({ - host: host, + host: HOST, version: "v2", cookies: {active: false}, - token: token + token: TOKEN }); (async () => { try { - const restResponse = await client.samples().search({limit:10, study: study}); + const restResponse = await client.variants().query({study: STUDY, limit:10}); console.table(restResponse.getResults()); } catch (response) { if (response instanceof RestResponse) { @@ -29,6 +32,33 @@ const client = new OpenCGAClient({ console.error(response) } } -})() +})(); +``` + +#### Fetching the first 10 variants of the Study of interest using OpenCGA credentials + +```text +import {OpenCGAClient} from "./opencga-client.js"; + +const HOST = ""; // add your host +const STUDY = ""; // add your study of interest +const USERNAME = ""; // add your username +const PASSWORD = ""; // add your username + +const client = new OpenCGAClient({ + host: HOST, + version: "v2", + cookies: {active: false} +}); +(async () => { + try { + await client.login(USERNAME, PASSWORD) + const session = await client.createSession(); + const restResponse = await session.opencgaClient.variants().query({"study": SUDY, limit: 10}); + console.log(restResponse.getResults()); + } catch (e) { + console.error(e) + } +})(); ``` diff --git a/docs/using-opencga/client-libraries/python.md b/docs/using-opencga/client-libraries/python.md index a3249a45d46..62f9845ab11 100644 --- a/docs/using-opencga/client-libraries/python.md +++ b/docs/using-opencga/client-libraries/python.md @@ -120,7 +120,7 @@ variant_operations = oc.variant_operations Clients implements **all** available REST API endpoints, one method has been implemented for each REST web service. The list of available actions that can be performed with all those clients can be checked in Swagger as explained in [RESTful Web Services\#Swagger](http://docs.opencb.org/display/opencga/RESTful+Web+Services#RESTfulWebServices-Swagger). Each particular client has a method defined for each available web service implemented for the resource. For instance, the whole list of actions available for the **Sample** resource are shown below. -![](../../.gitbook/assets/image%20%288%29.png) +![](../../.gitbook/assets/image%20%288%29%20%281%29.png) For all those actions, there is a method available in the sample client. For instance, to search for samples using the _/search_ web service, you need to execute: From 5ad6e4e194cbdfb4393f95cc5ecbb4b981c388af Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Fri, 9 Apr 2021 14:59:44 +0100 Subject: [PATCH 165/412] client: Changes to be committed: modified: user-training/pyopencga_catalog.ipynb modified: user-training/pyopencga_variant_query.ipynb --- .../user-training/pyopencga_catalog.ipynb | 2 +- .../pyopencga_variant_query.ipynb | 66 ++++++++++++++++--- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 54eef09f467..7a7c31fb7da 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -2267,4 +2267,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 5c2775a52cf..9b29bc016c0 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -10,7 +10,7 @@ "\n", "\n", "**[NOTE]** The server methods used by pyopencga client are defined in the following swagger URL:\n", - "- http://bioinfodev.hpc.cam.ac.uk/opencga-test/webservices\n", + "- https://ws.opencb.org/opencga-prod/webservices\n", "\n", "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing\n", @@ -95,14 +95,15 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "## Define variables to query different data models though the web services\n", "\n", - "variant_client = oc.variants # Variant Client\n", + "## Jacobo thinks better oc.variants.query....\n", "\n", + "variant_client = oc.variants # Variant Client\n", "user_client = oc.users\n", "project_client = oc.projects\n", "study_client = oc.studies\n", @@ -129,17 +130,55 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "## Let's use corpasome study\n", - "study = 'family:corpasome'\n", - "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, gene='BRCA2', limit=1) #exclude='annotation')\n", + "# Let's use corpasome study\n", + "study = 'family:corpasome'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Query variants by gene\n", "\n", - "#pprint(variants.get_result(0))\n", - "#variants.print_results('id')" + "We can use the `.query()` server to query for variants in a specific gene:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 382\n", + "#Num matches: 26\n", + "#Num results: 2\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\n", + "13:32884653:G:T\n", + "13:32889968:G:A\n" + ] + } + ], + "source": [ + "# Define the gene or genes we want to query\n", + "\n", + "genes=['BRCA2']\n", + "limit=2\n", + "\n", + "variants = variant_client.query(study=study, gene=genes, limit=limit) # Other params: exclude='annotation'\n", + "\n", + "\n", + "variants.print_results('id')\n", + "#pprint(variants.get_result(0))" ] }, { @@ -149,6 +188,13 @@ "## 3. Aggegation Files" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, From 4fc74a56b8c159ac7686f9eec9b10df654d5ee6b Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Fri, 9 Apr 2021 16:17:41 +0100 Subject: [PATCH 166/412] client-python: improve variants notebook --- .../pyopencga_variant_query.ipynb | 366 ++---------------- 1 file changed, 41 insertions(+), 325 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 75f310e4f88..c401ae4b501 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -62,8 +62,7 @@ "# User credentials\n", "user = 'demouser'\n", "passwd = 'demouser' ## you can skip this, see below.\n", - "# study = 'demo@family:platinum'\n", - "study = 'family:corpasome'\n", + "study = 'demo@family:platinum'\n", "####################################\n", "\n", "# Creating ClientConfiguration dict\n", @@ -96,11 +95,7 @@ }, { "cell_type": "code", -<<<<<<< HEAD - "execution_count": 2, -======= - "execution_count": 16, ->>>>>>> 3d5fbccd15940beffe4630a0af8d61b3fe7da005 + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -126,126 +121,6 @@ "## 2. Querying Variants" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Total number of variants:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{'attributes': {'approximateCount': False, 'source': 'solr+hadoop'},\n", - " 'events': [],\n", - " 'numDeleted': 0,\n", - " 'numInserted': 0,\n", - " 'numMatches': 300711,\n", - " 'numResults': 0,\n", - " 'numTotalResults': 300711,\n", - " 'numUpdated': 0,\n", - " 'result': [],\n", - " 'resultType': '',\n", - " 'results': [],\n", - " 'time': 0}]\n" - ] - } - ], - "source": [ - "## Let's use corpasome study\n", - "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, count=True, limit=0) #exclude='annotation')\n", - "\n", - "#pprint(variants.get_result(0))\n", - "pprint(variants.responses)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Filter by region:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#Time: 3213\n", - "#Num matches: 20\n", - "#Num results: 5\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", - "1:1233941:T:C\tsplice_region_variant\tACAP3\n", - "1:1558792:T:C\tstart_lost\tMIB2\n", - "1:1647778:C:G\tsplice_region_variant\tRP1-283E3.8,CDK11A\n", - "1:1650797:A:G\tmissense_variant\tRP1-283E3.8,CDK11A\n", - "1:1653028:C:T\tsplice_region_variant\tRP1-283E3.8,RP1-283E3.4,CDK11A,SLC35E2\n" - ] - } - ], - "source": [ - "## Let's use corpasome study\n", - "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, region='1:1000000-10000000', ct='lof', count=True, limit=5) #exclude='annotation')\n", - "\n", - "#pprint(variants.get_result(0))\n", - "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Filter by type:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#Time: 334\n", - "#Num matches: 1566\n", - "#Num results: 5\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", - "1:1001177:G:C\tintron_variant\tRP11-465B22.3,RP11-54O7.18\n", - "1:1001178:T:G\tintron_variant\tRP11-465B22.3,RP11-54O7.18\n", - "1:1162541:G:C\tintron_variant\tSDF4\n", - "1:1162673:G:C\tnon_coding_transcript_exon_variant\tB3GALT6,SDF4\n", - "1:1163266:G:A\tintron_variant\tB3GALT6,SDF4\n" - ] - } - ], - "source": [ - "## Let's use corpasome study\n", - "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, region='1:1000000-10000000', type='SNV', count=True, limit=5) #exclude='annotation')\n", - "\n", - "#pprint(variants.get_result(0))\n", - "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -255,36 +130,12 @@ }, { "cell_type": "code", -<<<<<<< HEAD - "execution_count": 3, -======= - "execution_count": 26, ->>>>>>> 3d5fbccd15940beffe4630a0af8d61b3fe7da005 + "execution_count": 10, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#Time: 349\n", - "#Num matches: 26\n", - "#Num results: 5\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", - "13:32884653:G:T\tintron_variant\tBRCA2,ZAR1L\n", - "13:32889968:G:A\tintron_variant\tBRCA2,ZAR1L\n", - "13:32890572:G:A\t5_prime_UTR_variant\tBRCA2,ZAR1L\n", - "13:32900933:T:A\tintron_variant\tBRCA2\n", - "13:32903685:C:T\tintron_variant\tBRCA2\n" - ] - } - ], + "outputs": [], "source": [ -<<<<<<< HEAD "# Let's use corpasome study\n", - "study = 'family:corpasome'\n" + "study = 'family:corpasome'" ] }, { @@ -294,38 +145,18 @@ "### Query variants by gene\n", "\n", "We can use the `.query()` server to query for variants in a specific gene:" -======= - "## Let's use corpasome study\n", - "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, gene='BRCA2', count=True, limit=5) #exclude='annotation')\n", - "\n", - "#pprint(variants.get_result(0))\n", - "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Filter variants per gene and consequence type" ->>>>>>> 3d5fbccd15940beffe4630a0af8d61b3fe7da005 ] }, { "cell_type": "code", -<<<<<<< HEAD - "execution_count": 5, -======= - "execution_count": 35, ->>>>>>> 3d5fbccd15940beffe4630a0af8d61b3fe7da005 + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ -<<<<<<< HEAD - "#Time: 382\n", + "#Time: 346\n", "#Num matches: 26\n", "#Num results: 2\n", "#Num inserted: 0\n", @@ -334,23 +165,10 @@ "#id\n", "13:32884653:G:T\n", "13:32889968:G:A\n" -======= - "#Time: 284\n", - "#Num matches: 3\n", - "#Num results: 3\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", - "13:32906729:A:C\t.\t.\n", - "13:32913404:A:T\t.\t.\n", - "13:32929387:T:C\t.\t.\n" ->>>>>>> 3d5fbccd15940beffe4630a0af8d61b3fe7da005 ] } ], "source": [ -<<<<<<< HEAD "# Define the gene or genes we want to query\n", "\n", "genes=['BRCA2']\n", @@ -361,191 +179,89 @@ "\n", "variants.print_results('id')\n", "#pprint(variants.get_result(0))" -======= - "## Let's use corpasome study\n", - "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, gene='BRCA2', ct='lof,missense_variant', count=True, limit=5, exclude='annotation') #exclude='annotation')\n", - "\n", - "#pprint(variants.get_result(0))\n", - "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')\n", - "\n", - "#pprint(variants.get_results(0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Clinvar Pathogenic variant:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#Time: 325\n", - "#Num matches: 1\n", - "#Num results: 1\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", - "13:32913404:A:T\tstop_gained\tBRCA2\n" - ] - } - ], - "source": [ - "## Let's use corpasome study\n", - "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, gene='BRCA2', ct='lof,missense_variant', clinicalSignificance='pathogenic', count=True, limit=5) #exclude='annotation')\n", - "\n", - "#pprint(variants.get_result(0))\n", - "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" + "## 3. Aggegation Files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Filter y sample:" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#Time: 294\n", - "#Num matches: 9\n", - "#Num results: 9\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", - "13:32889968:G:A\tintron_variant\tBRCA2,ZAR1L\n", - "13:32905265:G:A\tintron_variant\tBRCA2\n", - "13:32906729:A:C\tmissense_variant\tBRCA2\n", - "13:32913055:A:G\tsynonymous_variant\tBRCA2\n", - "13:32915005:G:C\tsynonymous_variant\tBRCA2\n", - "13:32929387:T:C\tmissense_variant\tBRCA2\n", - "13:32930936:G:A\tintron_variant\tBRCA2\n", - "13:32959534:A:G\tnon_coding_transcript_exon_variant\tBRCA2,IFIT1P1\n", - "13:32977496:C:A\tintron_variant\tBRCA2,N4BP2L1\n" - ] - } - ], - "source": [ - "## Let's use corpasome study\n", - "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, sample='ISDBM322015', gene='BRCA2', count=True, limit=10) #exclude='annotation')\n", - "\n", - "#pprint(variants.get_result(0))\n", - "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" + "## 4. Common queries" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Filter by recessive:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#Time: 479\n", - "#Num matches: 1\n", - "#Num results: 1\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tannotation.displayConsequenceType\tannotation.consequenceTypes.geneName\n", - "13:32977496:C:A\tintron_variant\tBRCA2,N4BP2L1\n" - ] - } - ], - "source": [ - "## Let's use corpasome study\n", - "variant_client = oc.variants\n", - "variants = variant_client.query(study=study, sample='ISDBM322015:DOMINANTT', gene='BRCA2', count=True, limit=5) #exclude='annotation')\n", - "\n", - "#pprint(variants.get_result(0))\n", - "variants.print_results('id,annotation.displayConsequenceType,annotation.consequenceTypes.geneName')" ->>>>>>> 3d5fbccd15940beffe4630a0af8d61b3fe7da005 + "### Filtering by region/gene\n", + "Which variants in cohort A are in genomic region B?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 3. Aggegation Variant" + "\n", + "Which variants in RD38 fall on chromosome 15 between 21,242,091 and 23,226,874bp?" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, "source": [ - "**Filtering by region/gene**\n", - "Which variants in cohort A are in genomic region B?\n", - "Which variants in cohort A are in genomic region B?" + "# Perform the query\n", + "variants = variant_client.query(study=study, region='15:21242091-23226874', include='id')\n", + "\n", + "#Print the results\n", + "#variants.print_results('id')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n", - "Which variants in RD38 fall on chromosome 15 between 21,242,091 and 23,226,874bp?" + "The new function `.to_data_frame()` added in the *pyopencga* release 2.0.1.1, allows you store the results as a *pandas* dataframe object:" ] }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "'15:22866621:G:A'\n" + "The results can be stored and printed as a pandas DF:\n", + "\n", + " id chromosome reference alternate strand type start \\\n", + "0 15:22830185:T:C 15 T C + SNV 22830185 \n", + "1 15:22833202:C:T 15 C T + SNP 22833202 \n", + "2 15:22840279:G:T 15 G T + SNP 22840279 \n", + "3 15:22849186:T:- 15 T + INDEL 22849186 \n", + "4 15:22853997:C:T 15 C T + SNV 22853997 \n", + "\n", + " end length \n", + "0 22830185 1 \n", + "1 22833202 1 \n", + "2 22840279 1 \n", + "3 22849186 1 \n", + "4 22853997 1 \n" ] } ], "source": [ - "## Let's use corpasome study\n", - "study = 'family:corpasome'\n", - "variant_client = oc.variants\n", - "variant_query1 = variant_client.query(study=study, chromosome='15:21242091-23226874', exclude='annotation')\n", - "\n", - "results = variants.get_result()\n", - "\n", - "for result in results:\n", - " print()\n", - "\n", - "pprint(variants.get_result(7)['id'])\n", - "#variants.print_results('id')" + "df = variants.to_data_frame()\n", + "formated_df = df.drop(['names', 'studies'], 1)\n", + "print('The results can be stored and printed as a pandas DF:\\n\\n', formated_df.head())" ] }, { @@ -633,7 +349,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, From 4b9a21df78b09314fe19b90e7cd646bf6fd94d1d Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Mon, 12 Apr 2021 14:08:29 +0100 Subject: [PATCH 167/412] Client: variants_notebook add more cells --- .../notebooks/user-training/Testing1.py | 30 ++++ .../pyopencga_variant_query.ipynb | 154 +++++++++++------- 2 files changed, 127 insertions(+), 57 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/Testing1.py b/opencga-client/src/main/python/notebooks/user-training/Testing1.py index 3e2a306f45d..86db13af786 100644 --- a/opencga-client/src/main/python/notebooks/user-training/Testing1.py +++ b/opencga-client/src/main/python/notebooks/user-training/Testing1.py @@ -111,4 +111,34 @@ #%% +#%% md +# +# **Situation:** I am interested in getting a list of all participants in RD, GRCh38, that have: +# (A) SNVs in NOD2 gene that have MAF of <0.01 in gnomad_NFE AND are missense, start_lost, stop_gained, or stop_lost +# split by hets and homs. +# +# - How I can submit this query but instead of NOD2, for a list of 10 genes (example list: IL3, IL31, IL32, IL34, IL6, IL6R, IL10RA, IL10RB, IL7, IL7R) to the openCGA server +#%% + +# Define the parameters we want to query + +genes = ['NOD2','IL3'] +limit = 5 +type = ['SNV'] +ct = ['missense_variant','start_lost','stop_gained','stop_lost'] #List of SO consequence types, e.g. missense_variant,stop_lost or SO:0001583,SO:0001578 +populationFrequencyMaf='gnomAD_NFE:ALL<0.01' + + + +variants = variant_client.query(study=study, gene=genes, type=type, ct=ct, + populationFrequencyMaf=populationFrequencyMaf, limit=limit) # Other params: exclude='annotation' + + +variants.print_results('id') +#pprint(variants.get_result(0)) + +#%% + +variants = variant_client.query_sample(study=study, variant='16:50744624:C:T') +variants.print_results() \ No newline at end of file diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index c401ae4b501..91a6780c46c 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -52,6 +52,8 @@ "from pyopencga.opencga_client import OpencgaClient # import client module\n", "from pprint import pprint\n", "import json\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", "\n", "####################################\n", "## Configuration parameters #######\n", @@ -95,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -130,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -156,7 +158,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "#Time: 346\n", + "#Time: 332\n", "#Num matches: 26\n", "#Num results: 2\n", "#Num inserted: 0\n", @@ -199,28 +201,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Filtering by region/gene\n", - "Which variants in cohort A are in genomic region B?\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Which variants in RD38 fall on chromosome 15 between 21,242,091 and 23,226,874bp?" + "**Situation**: I'm interested in knowing which variants in RD38 fall on chromosome 15 between 21,242,091 and 23,226,874bp?" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# Perform the query\n", "variants = variant_client.query(study=study, region='15:21242091-23226874', include='id')\n", "\n", - "#Print the results\n", + "# Print the results\n", "#variants.print_results('id')\n" ] }, @@ -233,8 +226,12 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, + "execution_count": 15, + "metadata": { + "pycharm": { + "is_executing": true + } + }, "outputs": [ { "name": "stdout", @@ -260,75 +257,118 @@ ], "source": [ "df = variants.to_data_frame()\n", - "formated_df = df.drop(['names', 'studies'], 1)\n", - "print('The results can be stored and printed as a pandas DF:\\n\\n', formated_df.head())" + "formatted_df = df.drop(['names', 'studies'], 1)\n", + "print('The results can be stored and printed as a pandas DF:\\n\\n', formatted_df.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the *pandas dataframe* object, you can create plots using *maplotlib* or *seaborn* python libraries to show the results:" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 16, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'alternate': 'A',\n", - " 'chromosome': '15',\n", - " 'end': 72070929,\n", - " 'id': '15:72070929:G:A',\n", - " 'length': 1,\n", - " 'names': [],\n", - " 'reference': 'G',\n", - " 'start': 72070929,\n", - " 'strand': '+',\n", - " 'studies': [],\n", - " 'type': 'SNV'}\n" - ] + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "oc.disease_panels.\n", - "variants = variant_client.query(study=study, chromosome=15, include='id')\n", + "# Create a plot with the results:\n", "\n", - "pprint(variants.get_result(0))\n", - "#variants.print_results('id')" + "sns.set_theme(style=\"darkgrid\")\n", + "sns.color_palette('deep')\n", + "sns.displot(data=df, hue='type', hue_order=['INDEL','SNP','SNV'], x=\"start\", bins=50) # multiple= \"dodge\", 'stack'\n", + "plt.title('Variants in Region of Chromosome 15', fontsize=20, fontweight='bold' )\n", + "plt.xlabel('Chr15:21242091-23226874 bp', fontsize=12)\n", + "plt.ylabel('Variant counts', fontsize=12)\n", + "sns.despine(left=False)\n", + "plt.show()" ] }, { - "cell_type": "code", - "execution_count": 51, + "cell_type": "markdown", "metadata": {}, + "source": [ + "**Situation:** I am interested in getting a list of all participants in the study, that have:\n", + "(A) SNVs in NOD2 gene that have MAF of <0.01 in gnomad_NFE AND are missense, start_lost, stop_gained, or stop_lost\n", + "split by hets and homs.\n", + "\n", + "- How I can submit this query but instead of NOD2, for a list of 10 genes (example list: IL3, IL31, IL32, IL34, IL6, IL6R, IL10RA, IL10RB, IL7, IL7R) to the openCGA server" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "# Define the parameters of the variants we want to query\n", + "\n", + "genes = ['NOD2','IL3']\n", + "limit = 5\n", + "type = ['SNV']\n", + "ct = ['missense_variant','start_lost','stop_gained','stop_lost'] #List of SO consequence types, e.g. missense_variant,stop_lost or SO:0001583,SO:0001578\n", + "populationFrequencyMaf='gnomAD:ALL<0.01'\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "pycharm": { + "is_executing": true + } + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'alternate': 'T',\n", - " 'chromosome': '15',\n", - " 'end': 22853997,\n", - " 'id': '15:22853997:C:T',\n", - " 'length': 1,\n", - " 'names': [],\n", - " 'reference': 'C',\n", - " 'start': 22853997,\n", - " 'strand': '+',\n", - " 'studies': [],\n", - " 'type': 'SNV'}\n" + "#Time: 460\n", + "#Num matches: 1\n", + "#Num results: 1\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\n", + "16:50744624:C:T\n" ] } ], "source": [ - "variants = variant_client.query(study=study, region='15:21242091-23226874', include='id')\n", + "variants = variant_client.query(study=study, gene=genes, type=type, ct=ct, \n", + " populationFrequencyMaf=populationFrequencyMaf, limit=limit) \n", + "\n", "\n", - "pprint(variants.get_result(4))\n", - "#variants.print_results('id')" + "variants.print_results('id')\n", + "#pprint(variants.get_result(0))\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "pycharm": { + "is_executing": true + } + }, "outputs": [], "source": [] } From b97706a58e1cb6efb508895663bd5e789defe9ab Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 13 Apr 2021 14:16:55 +0200 Subject: [PATCH 168/412] analysis: move RGA code to analysis module, #1693 --- opencga-analysis/pom.xml | 10 ++ .../analysis/clinical/rga/RgaAnalysis.java | 2 +- .../analysis}/rga/AbstractRgaConverter.java | 2 +- .../analysis}/rga/GeneRgaConverter.java | 48 ++++---- .../analysis}/rga/IndividualRgaConverter.java | 68 +++++------ .../opencga/analysis}/rga/RgaDataModel.java | 18 +-- .../opencga/analysis}/rga/RgaEngine.java | 25 ++-- .../opencga/analysis}/rga/RgaManager.java | 59 +++++++++- .../opencga/analysis}/rga/RgaQueryParams.java | 2 +- .../opencga/analysis}/rga/RgaQueryParser.java | 6 +- .../opencga/analysis}/rga/RgaUtils.java | 59 +++++++++- .../analysis}/rga/VariantRgaConverter.java | 74 ++++++------ .../rga/exceptions/RgaException.java | 2 +- .../rga/IndividualRgaConverterTest.java | 7 +- .../opencga/analysis}/rga/RgaEngineTest.java | 108 ++++++------------ .../opencga/analysis}/rga/RgaManagerTest.java | 16 +-- .../analysis}/rga/RgaQueryParserTest.java | 4 +- .../analysis}/rga/RgaSolrExtenalResource.java | 7 +- .../opencga/analysis}/rga/RgaUtilsTest.java | 2 +- .../managers/ClinicalAnalysisManagerTest.java | 41 +++++++ .../rest/analysis/ClinicalWebService.java | 23 +++- pom.xml | 2 +- 22 files changed, 345 insertions(+), 240 deletions(-) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/AbstractRgaConverter.java (98%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/GeneRgaConverter.java (87%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/IndividualRgaConverter.java (93%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/RgaDataModel.java (95%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/RgaEngine.java (95%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/RgaManager.java (91%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/RgaQueryParams.java (99%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/RgaQueryParser.java (98%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/RgaUtils.java (79%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/VariantRgaConverter.java (81%) rename {opencga-clinical/src/main/java/org/opencb/opencga/clinical => opencga-analysis/src/main/java/org/opencb/opencga/analysis}/rga/exceptions/RgaException.java (80%) rename {opencga-clinical/src/test/java/org/opencb/opencga/clinical => opencga-analysis/src/test/java/org/opencb/opencga/analysis}/rga/IndividualRgaConverterTest.java (83%) rename {opencga-clinical/src/test/java/org/opencb/opencga/clinical => opencga-analysis/src/test/java/org/opencb/opencga/analysis}/rga/RgaEngineTest.java (86%) rename {opencga-clinical/src/test/java/org/opencb/opencga/clinical => opencga-analysis/src/test/java/org/opencb/opencga/analysis}/rga/RgaManagerTest.java (95%) rename {opencga-clinical/src/test/java/org/opencb/opencga/clinical => opencga-analysis/src/test/java/org/opencb/opencga/analysis}/rga/RgaQueryParserTest.java (99%) rename {opencga-clinical/src/test/java/org/opencb/opencga/clinical => opencga-analysis/src/test/java/org/opencb/opencga/analysis}/rga/RgaSolrExtenalResource.java (94%) rename {opencga-clinical/src/test/java/org/opencb/opencga/clinical => opencga-analysis/src/test/java/org/opencb/opencga/analysis}/rga/RgaUtilsTest.java (99%) diff --git a/opencga-analysis/pom.xml b/opencga-analysis/pom.xml index a51f65bed9f..2bdd8da3ac0 100644 --- a/opencga-analysis/pom.xml +++ b/opencga-analysis/pom.xml @@ -122,6 +122,16 @@ 2.1.0-SNAPSHOT compile + + + org.apache.solr + solr-solrj + + + org.apache.solr + solr-test-framework + + diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java index ecf47aa71e5..4fed342326d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java @@ -1,7 +1,7 @@ package org.opencb.opencga.analysis.clinical.rga; import org.opencb.opencga.analysis.variant.operations.OperationTool; -import org.opencb.opencga.clinical.rga.RgaManager; +import org.opencb.opencga.analysis.rga.RgaManager; import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.tools.annotations.Tool; diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/AbstractRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java similarity index 98% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/AbstractRgaConverter.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java index 2e2f2769f3d..e46b9b2333a 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/AbstractRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import com.fasterxml.jackson.core.JsonProcessingException; import org.opencb.biodata.models.clinical.Disorder; diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java similarity index 87% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java index 8635258dd19..a2886fb2660 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/GeneRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java @@ -1,9 +1,8 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; -import com.fasterxml.jackson.core.JsonProcessingException; import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.ComplexTypeConverter; -import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; @@ -51,23 +50,23 @@ public class GeneRgaConverter extends AbstractRgaConverter implements ComplexTyp CONVERTER_MAP.put("individuals.transcripts.strand", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); CONVERTER_MAP.put("individuals.transcripts.variants.id", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_JSON)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("individuals.transcripts.variants.genotype", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("individuals.transcripts.variants.filter", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.FILTERS)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.FILTERS)); CONVERTER_MAP.put("individuals.transcripts.variants.qual", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("individuals.transcripts.variants.type", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.TYPES)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.TYPES)); CONVERTER_MAP.put("individuals.transcripts.variants.knockoutType", Arrays.asList(RgaDataModel.GENE_ID, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.KNOCKOUT_TYPES)); + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.KNOCKOUT_TYPES)); CONVERTER_MAP.put("individuals.transcripts.variants.populationFrequencies", Arrays.asList(RgaDataModel.GENE_ID, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.POPULATION_FREQUENCIES)); + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.POPULATION_FREQUENCIES)); CONVERTER_MAP.put("individuals.transcripts.variants.clinicalSignificance", Arrays.asList(RgaDataModel.GENE_ID, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.CLINICAL_SIGNIFICANCES)); + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.CLINICAL_SIGNIFICANCES)); CONVERTER_MAP.put("individuals.transcripts.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.GENE_ID, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANT_JSON, RgaDataModel.CONSEQUENCE_TYPES)); + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.CONSEQUENCE_TYPES)); logger = LoggerFactory.getLogger(GeneRgaConverter.class); } @@ -77,6 +76,15 @@ public GeneRgaConverter() { @Override public List convertToDataModelType(List rgaDataModelList) { + throw new UnsupportedOperationException("Use other converter passing a list of variants"); + } + + public List convertToDataModelType(List rgaDataModelList, List variantList) { + Map variantMap = new HashMap<>(); + for (Variant variant : variantList) { + variantMap.put(variant.getId(), variant); + } + Map result = new HashMap<>(); for (RgaDataModel rgaDataModel : rgaDataModelList) { if (!result.containsKey(rgaDataModel.getGeneId())) { @@ -118,20 +126,8 @@ public List convertToDataModelType(List rgaData knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); knockoutIndividual.addTranscripts(Collections.singletonList(knockoutTranscript)); - - if (rgaDataModel.getVariantJson() != null) { - List knockoutVariantList = new LinkedList<>(); - for (String variantJson : rgaDataModel.getVariantJson()) { - try { - KnockoutVariant knockoutVariant = JacksonUtils.getDefaultObjectMapper().readValue(variantJson, - KnockoutVariant.class); - knockoutVariantList.add(knockoutVariant); - } catch (JsonProcessingException e) { - logger.warn("Could not parse KnockoutVariants: {}", e.getMessage(), e); - } - } - knockoutTranscript.setVariants(knockoutVariantList); - } + List knockoutVariantList = RgaUtils.extractKnockoutVariants(rgaDataModel, variantMap, null); + knockoutTranscript.setVariants(knockoutVariantList); } } diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java similarity index 93% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index f424b824aac..e3568e0f32c 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import com.fasterxml.jackson.core.JsonProcessingException; import org.apache.commons.lang3.StringUtils; @@ -10,7 +10,7 @@ import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import org.opencb.commons.datastore.core.ComplexTypeConverter; -import org.opencb.opencga.clinical.rga.exceptions.RgaException; +import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; @@ -55,19 +55,19 @@ public class IndividualRgaConverter extends AbstractRgaConverter CONVERTER_MAP.put("genes.transcripts.strand", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); CONVERTER_MAP.put("genes.transcripts.variants.id", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_JSON)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("genes.transcripts.variants.filter", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS, RgaDataModel.VARIANT_JSON)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("genes.transcripts.variants.type", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TYPES, RgaDataModel.VARIANT_JSON)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TYPES, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("genes.transcripts.variants.knockoutType", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.KNOCKOUT_TYPES, RgaDataModel.VARIANT_JSON)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.KNOCKOUT_TYPES, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("genes.transcripts.variants.populationFrequencies", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.POPULATION_FREQUENCIES, RgaDataModel.VARIANT_JSON)); + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.POPULATION_FREQUENCIES, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("genes.transcripts.variants.clinicalSignificance", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CLINICAL_SIGNIFICANCES, RgaDataModel.VARIANT_JSON)); + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CLINICAL_SIGNIFICANCES, RgaDataModel.VARIANTS)); CONVERTER_MAP.put("genes.transcripts.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CONSEQUENCE_TYPES, RgaDataModel.VARIANT_JSON)); + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CONSEQUENCE_TYPES, RgaDataModel.VARIANTS)); logger = LoggerFactory.getLogger(IndividualRgaConverter.class); } @@ -77,14 +77,24 @@ public IndividualRgaConverter() { @Override public List convertToDataModelType(List rgaDataModelList) { + throw new UnsupportedOperationException("Use other converter passing a list of variants"); + } + + public List convertToDataModelType(List rgaDataModelList, List variantList) { // In this list, we will store the keys of result in the order they have been processed so order is kept List knockoutByIndividualOrder = new LinkedList<>(); Map result = new HashMap<>(); + + Map variantMap = new HashMap<>(); + for (Variant variant : variantList) { + variantMap.put(variant.getId(), variant); + } + for (RgaDataModel rgaDataModel : rgaDataModelList) { if (!result.containsKey(rgaDataModel.getIndividualId())) { knockoutByIndividualOrder.add(rgaDataModel.getIndividualId()); } - extractKnockoutByIndividualMap(rgaDataModel, result); + extractKnockoutByIndividualMap(rgaDataModel, variantMap, result); } List knockoutByIndividualList = new ArrayList<>(knockoutByIndividualOrder.size()); @@ -94,18 +104,20 @@ public List convertToDataModelType(List rgaD return knockoutByIndividualList; } - public static void extractKnockoutByIndividualMap(RgaDataModel rgaDataModel, Map result) { - extractKnockoutByIndividualMap(rgaDataModel, new HashSet<>(), result); + public static void extractKnockoutByIndividualMap(RgaDataModel rgaDataModel, Map variantMap, + Map result) { + extractKnockoutByIndividualMap(rgaDataModel, variantMap, new HashSet<>(), result); } /** * Extract a map containing the processed KnockoutByindividuals. * * @param rgaDataModel RgaDataModel instance. + * @param variantMap Map of variants. * @param variantIds Set of variant ids to be included in the result. If empty, include all of them. * @param result Map containing the KnockoutByIndividual's processed. */ - public static void extractKnockoutByIndividualMap(RgaDataModel rgaDataModel, Set variantIds, + public static void extractKnockoutByIndividualMap(RgaDataModel rgaDataModel, Map variantMap, Set variantIds, Map result) { if (!result.containsKey(rgaDataModel.getIndividualId())) { KnockoutByIndividual knockoutByIndividual = fillIndividualInfo(rgaDataModel); @@ -144,31 +156,8 @@ public static void extractKnockoutByIndividualMap(RgaDataModel rgaDataModel, Set knockoutGene.addTranscripts(Collections.singletonList(knockoutTranscript)); knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); - if (rgaDataModel.getVariantJson() != null) { - List knockoutVariantList = new LinkedList<>(); - for (String variantJson : rgaDataModel.getVariantJson()) { - try { - KnockoutVariant knockoutVariant = JacksonUtils.getDefaultObjectMapper().readValue(variantJson, - KnockoutVariant.class); - if (StringUtils.isEmpty(knockoutVariant.getChromosome())) { - // Fill typical variant fields - Variant variant = new Variant(knockoutVariant.getId()); - knockoutVariant.setChromosome(variant.getChromosome()); - knockoutVariant.setStart(variant.getStart()); - knockoutVariant.setEnd(variant.getEnd()); - knockoutVariant.setLength(variant.getLength()); - knockoutVariant.setReference(variant.getReference()); - knockoutVariant.setAlternate(variant.getAlternate()); - } - if (variantIds.isEmpty() || variantIds.contains(knockoutVariant.getId())) { - knockoutVariantList.add(knockoutVariant); - } - } catch (JsonProcessingException e) { - logger.warn("Could not parse KnockoutVariants: {}", e.getMessage(), e); - } - } - knockoutTranscript.setVariants(knockoutVariantList); - } + List knockoutVariantList = RgaUtils.extractKnockoutVariants(rgaDataModel, variantMap, variantIds); + knockoutTranscript.setVariants(knockoutVariantList); } } @@ -310,8 +299,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI .setPopulationFrequencies(popFreqs) .setCompoundFilters(compoundFilters) .setPhenotypeJson(phenotypeJson) - .setDisorderJson(disorderJson) - .setVariantJson(variantJson); + .setDisorderJson(disorderJson); result.add(model); } } diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java similarity index 95% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java index ef4599b76f4..d483c7744a3 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaDataModel.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import org.apache.solr.client.solrj.beans.Field; @@ -97,9 +97,6 @@ public class RgaDataModel { @Field private List disorderJson; - @Field - private List variantJson; - public static final String ID = "id"; public static final String INDIVIDUAL_ID = "individualId"; public static final String SAMPLE_ID = "sampleId"; @@ -130,9 +127,6 @@ public class RgaDataModel { public static final String COMPOUND_FILTERS = "compoundFilters"; public static final String PHENOTYPE_JSON = "phenotypeJson"; public static final String DISORDER_JSON = "disorderJson"; - public static final String VARIANT_JSON = "variantJson"; - public static final String AUTHORISED = "authorised"; - public static final String UNAUTHORISED = "unauthorised"; public RgaDataModel() { } @@ -170,7 +164,6 @@ public String toString() { sb.append(", compoundFilters=").append(compoundFilters); sb.append(", phenotypeJson=").append(phenotypeJson); sb.append(", disorderJson=").append(disorderJson); - sb.append(", variantJson=").append(variantJson); sb.append('}'); return sb.toString(); } @@ -445,13 +438,4 @@ public RgaDataModel setDisorderJson(List disorderJson) { return this; } - public List getVariantJson() { - return variantJson; - } - - public RgaDataModel setVariantJson(List variantJson) { - this.variantJson = variantJson; - return this; - } - } diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java similarity index 95% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaEngine.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index b4251659baa..7cb49099ad6 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -1,9 +1,10 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.common.SolrException; +import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.Query; @@ -12,12 +13,13 @@ import org.opencb.commons.datastore.solr.SolrCollection; import org.opencb.commons.datastore.solr.SolrManager; import org.opencb.commons.utils.CollectionUtils; -import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; +import org.opencb.opencga.analysis.rga.exceptions.RgaException; +import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; +import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.storage.core.variant.search.solr.SolrNativeIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,16 +38,19 @@ public class RgaEngine implements Closeable { private VariantRgaConverter variantConverter; private StorageConfiguration storageConfiguration; + private VariantStorageManager variantStorageManager; + private Logger logger; public static final String USE_SEARCH_INDEX = "useSearchIndex"; - public RgaEngine(StorageConfiguration storageConfiguration) { + public RgaEngine(VariantStorageManager variantStorageManager, StorageConfiguration storageConfiguration) { this.individualRgaConverter = new IndividualRgaConverter(); this.geneConverter = new GeneRgaConverter(); this.variantConverter = new VariantRgaConverter(); this.parser = new RgaQueryParser(); this.storageConfiguration = storageConfiguration; + this.variantStorageManager = variantStorageManager; this.solrManager = new SolrManager(storageConfiguration.getRga().getHosts(), storageConfiguration.getRga().getMode(), storageConfiguration.getRga().getTimeout()); @@ -138,8 +143,10 @@ public OpenCGAResult individualQuery(String collection, Qu SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; try { + List variantList = null; DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); - List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(result.getResults()); + List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(result.getResults(), + variantList); queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByIndividuals.size(), knockoutByIndividuals, -1); } catch (SolrServerException e) { @@ -225,8 +232,9 @@ public OpenCGAResult geneQuery(String collection, Query query SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; try { + List variantList = null; DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); - List knockoutByGeneList = geneConverter.convertToDataModelType(result.getResults()); + List knockoutByGeneList = geneConverter.convertToDataModelType(result.getResults(), variantList); queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByGeneList.size(), knockoutByGeneList, result.getNumMatches()); } catch (SolrServerException e) { @@ -254,8 +262,9 @@ public OpenCGAResult variantQuery(String collection, Query qu SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; try { + List variantList = null; DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); - List knockoutByVariants = variantConverter.convertToDataModelType(result.getResults(), + List knockoutByVariants = variantConverter.convertToDataModelType(result.getResults(), variantList, query.getAsStringList(RgaQueryParams.VARIANTS.key())); queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByVariants.size(), knockoutByVariants, -1); diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java similarity index 91% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 6767e79c5a9..e9076b5f2e0 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; @@ -7,6 +7,8 @@ import org.apache.solr.common.SolrException; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; +import org.opencb.opencga.analysis.rga.exceptions.RgaException; +import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.AbstractManager; @@ -14,7 +16,6 @@ import org.opencb.opencga.catalog.managers.FileManager; import org.opencb.opencga.catalog.managers.SampleManager; import org.opencb.opencga.catalog.utils.ParamUtils; -import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; @@ -54,17 +55,20 @@ public class RgaManager implements AutoCloseable { private static final int KNOCKOUT_INSERT_BATCH_SIZE = 25; - public RgaManager(CatalogManager catalogManager, StorageEngineFactory storageEngineFactory) { + public RgaManager(CatalogManager catalogManager, VariantStorageManager variantStorageManager, + StorageEngineFactory storageEngineFactory) { this.catalogManager = catalogManager; this.storageConfiguration = storageEngineFactory.getStorageConfiguration(); - this.rgaEngine = new RgaEngine(storageConfiguration); + this.rgaEngine = new RgaEngine(variantStorageManager, storageConfiguration); this.logger = LoggerFactory.getLogger(getClass()); } public RgaManager(Configuration configuration, StorageConfiguration storageConfiguration) throws CatalogException { this.catalogManager = new CatalogManager(configuration); this.storageConfiguration = storageConfiguration; - this.rgaEngine = new RgaEngine(storageConfiguration); + StorageEngineFactory storageEngineFactory = StorageEngineFactory.get(storageConfiguration); + VariantStorageManager variantStorageManager = new VariantStorageManager(catalogManager, storageEngineFactory); + this.rgaEngine = new RgaEngine(variantStorageManager, storageConfiguration); this.logger = LoggerFactory.getLogger(getClass()); } @@ -528,6 +532,51 @@ public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List((int) stopWatch.getTime(TimeUnit.MILLISECONDS), null, sampleIds.size(), 0, updatedSamples, 0); } +// public List PetterQuery(List variants, Set transcripts, String study, ArrayList samples, +// String token, KnockoutVariant.KnockoutType knockoutType) +// throws CatalogException, IOException, StorageEngineException { +// Query query = new Query(VariantQueryParam.ID.key(), variants) +// .append(VariantQueryParam.STUDY.key(), study) +// .append(VariantQueryParam.INCLUDE_SAMPLE.key(), samples) +// .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); +// List result = get(query, new QueryOptions(), token).getResults(); +// List knockoutVariants = new LinkedList<>(); +// for (Variant variant : result) { +// VariantAnnotation annotation = variant.getAnnotation(); +//// +//// for (PopulationFrequency populationFrequency : annotation.getPopulationFrequencies()) { +////// populationFrequency.getStudy() +////// populationFrequency.getPopulation() +//// } +//// +//// // Clinvar and Cosmic +//// for (EvidenceEntry evidenceEntry : annotation.getTraitAssociation()) { +//// ClinicalSignificance clinicalSignificance = evidenceEntry.getVariantClassification().getClinicalSignificance(); +//// } +// List myConsequenceTypes = new ArrayList<>(transcripts.size()); +// for (ConsequenceType consequenceType : annotation.getConsequenceTypes()) { +// String geneName = consequenceType.getGeneName(); +// String transcriptId = consequenceType.getEnsemblTranscriptId(); +// if (transcripts.contains(transcriptId)) { +//// for (SequenceOntologyTerm sequenceOntologyTerm : consequenceType.getSequenceOntologyTerms()) { +//// +//// } +// myConsequenceTypes.add(consequenceType); +// } +// } +// StudyEntry studyEntry = variant.getStudies().get(0); +// int samplePosition = 0; +// for (SampleEntry sample : studyEntry.getSamples()) { +// String sampleId = samples.get(samplePosition++); +// for (ConsequenceType ct : myConsequenceTypes) { +// knockoutVariants.add(new KnockoutVariant(variant, studyEntry, studyEntry.getFile(sample.getFileIndex()), sample, +// annotation, ct, knockoutType)); +// } +// } +// } +// return knockoutVariants; +// } + public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParams.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java similarity index 99% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParams.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java index 94575321ac0..6ecc35f96ac 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParams.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryParam; diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParser.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java similarity index 98% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParser.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java index fbb88325632..e1cbe90a8ad 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaQueryParser.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java @@ -1,12 +1,12 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.solr.FacetQueryParser; +import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,7 +15,7 @@ import java.util.regex.Pattern; import static org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant.KnockoutType.*; -import static org.opencb.opencga.clinical.rga.RgaQueryParams.*; +import static org.opencb.opencga.analysis.rga.RgaQueryParams.*; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.printQuery; public class RgaQueryParser { diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java similarity index 79% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaUtils.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index 26643880b4b..5e6be2a5685 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -1,7 +1,14 @@ -package org.opencb.opencga.clinical.rga; - +package org.opencb.opencga.analysis.rga; + +import org.apache.commons.collections4.CollectionUtils; +import org.opencb.biodata.models.variant.StudyEntry; +import org.opencb.biodata.models.variant.Variant; +import org.opencb.biodata.models.variant.avro.ConsequenceType; +import org.opencb.biodata.models.variant.avro.FileEntry; +import org.opencb.biodata.models.variant.avro.SampleEntry; +import org.opencb.biodata.models.variant.avro.VariantAnnotation; +import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.clinical.rga.exceptions.RgaException; import org.opencb.opencga.storage.core.variant.query.KeyOpValue; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; @@ -9,7 +16,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.opencb.opencga.clinical.rga.RgaDataModel.*; +import static org.opencb.opencga.analysis.rga.RgaDataModel.*; class RgaUtils { @@ -105,7 +112,6 @@ class RgaUtils { ALL_PARAMS.add(RgaDataModel.COMPOUND_FILTERS); ALL_PARAMS.add(PHENOTYPE_JSON); ALL_PARAMS.add(DISORDER_JSON); - ALL_PARAMS.add(VARIANT_JSON); PARAM_TYPES = new HashMap<>(); // Variant params @@ -118,7 +124,6 @@ class RgaUtils { params.add(COMPOUND_FILTERS); params.add(PHENOTYPE_JSON); params.add(DISORDER_JSON); - params.add(VARIANT_JSON); PARAM_TYPES.put("variants", params); // Transcript params @@ -251,6 +256,48 @@ static KeyOpValue parseKeyOpValue(String value) { } } + /** + * Extract complete list of KnockoutVariants for current RgaDataModel document. + * + * @param rgaDataModel RgaDataModel document. + * @param variantMap Map of variants. + * @param variantIds Set of variants to be included in the result. + * @return a complete list of KnockoutVariants. + */ + static List extractKnockoutVariants(RgaDataModel rgaDataModel, Map variantMap, + Set variantIds) { + List knockoutVariantList = new LinkedList<>(); + if (rgaDataModel.getVariants() != null) { + for (int i = 0; i < rgaDataModel.getVariants().size(); i++) { + String variantId = rgaDataModel.getVariants().get(i); + + if (variantMap.containsKey(variantId) && (variantIds.isEmpty() || variantIds.contains(variantId))) { + Variant variant = variantMap.get(variantId); + StudyEntry studyEntry = variant.getStudies().get(0); + // TODO: Check fileentry + FileEntry fileEntry = variant.getStudies().get(0).getFiles().get(0); + SampleEntry sampleEntry = variant.getStudies().get(0).getSample(rgaDataModel.getSampleId()); + VariantAnnotation variantAnnotation = variant.getAnnotation(); + // TODO: Check consequence type + ConsequenceType consequenceType = variantAnnotation.getConsequenceTypes().get(0); + + KnockoutVariant.KnockoutType knockoutType = null; + if (CollectionUtils.isNotEmpty(rgaDataModel.getKnockoutTypes())) { + knockoutType = KnockoutVariant.KnockoutType.valueOf(rgaDataModel.getKnockoutTypes().get(i)); + } + + // Convert just once + KnockoutVariant knockoutVariant = new KnockoutVariant(variant, studyEntry, fileEntry, sampleEntry, + variantAnnotation, consequenceType, knockoutType); + + + knockoutVariantList.add(knockoutVariant); + } + } + } + + return knockoutVariantList; + } } diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java similarity index 81% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java index 5e9c6029376..bef27d1e126 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/VariantRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java @@ -1,7 +1,8 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; @@ -19,63 +20,62 @@ public class VariantRgaConverter extends AbstractRgaConverter implements Complex static { // We always include individual id in the response because we always want to return the numIndividuals populated CONVERTER_MAP = new HashMap<>(); - CONVERTER_MAP.put("id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); - CONVERTER_MAP.put("individuals.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); - CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SAMPLE_ID)); - CONVERTER_MAP.put("individuals.sex", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, + CONVERTER_MAP.put("id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("individuals.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("individuals.sex", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SEX)); - CONVERTER_MAP.put("individuals.numParents", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.numParents", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.NUM_PARENTS)); - CONVERTER_MAP.put("individuals.motherId", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.motherId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.MOTHER_ID)); - CONVERTER_MAP.put("individuals.fatherId", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.fatherId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.FATHER_ID)); - CONVERTER_MAP.put("individuals.motherSampleId", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.motherSampleId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.MOTHER_SAMPLE_ID)); - CONVERTER_MAP.put("individuals.fatherSampleId", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.fatherSampleId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.FATHER_SAMPLE_ID)); - CONVERTER_MAP.put("individuals.phenotypes", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.phenotypes", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.PHENOTYPES, RgaDataModel.PHENOTYPE_JSON)); - CONVERTER_MAP.put("individuals.disorders", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.disorders", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.DISORDERS, RgaDataModel.DISORDER_JSON)); CONVERTER_MAP.put("individuals.stats", Collections.emptyList()); - CONVERTER_MAP.put("individuals.genes.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID)); - CONVERTER_MAP.put("individuals.genes.name", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.name", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_NAME)); - CONVERTER_MAP.put("individuals.genes.chromosome", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.chromosome", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.CHROMOSOME)); - CONVERTER_MAP.put("individuals.genes.biotype", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.biotype", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_BIOTYPE)); - CONVERTER_MAP.put("individuals.genes.transcripts.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.transcripts.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID)); - CONVERTER_MAP.put("individuals.genes.transcripts.chromosome", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.transcripts.chromosome", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CHROMOSOME)); - CONVERTER_MAP.put("individuals.genes.transcripts.start", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.transcripts.start", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.START)); - CONVERTER_MAP.put("individuals.genes.transcripts.end", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.transcripts.end", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.END)); - CONVERTER_MAP.put("individuals.genes.transcripts.biotype", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.transcripts.biotype", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_BIOTYPE)); - CONVERTER_MAP.put("individuals.genes.transcripts.strand", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.transcripts.strand", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); - CONVERTER_MAP.put("individuals.genes.transcripts.variants.id", Arrays.asList(RgaDataModel.VARIANT_JSON, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.transcripts.variants.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); - CONVERTER_MAP.put("individuals.genes.transcripts.variants.filter", Arrays.asList(RgaDataModel.VARIANT_JSON, + CONVERTER_MAP.put("individuals.genes.transcripts.variants.filter", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS)); - CONVERTER_MAP.put("individuals.genes.transcripts.variants.type", Arrays.asList(RgaDataModel.VARIANT_JSON, + CONVERTER_MAP.put("individuals.genes.transcripts.variants.type", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TYPES)); - CONVERTER_MAP.put("individuals.genes.transcripts.variants.knockoutType", Arrays.asList(RgaDataModel.VARIANT_JSON, + CONVERTER_MAP.put("individuals.genes.transcripts.variants.knockoutType", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.KNOCKOUT_TYPES)); - CONVERTER_MAP.put("individuals.genes.transcripts.variants.populationFrequencies", Arrays.asList(RgaDataModel.VARIANT_JSON, + CONVERTER_MAP.put("individuals.genes.transcripts.variants.populationFrequencies", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.POPULATION_FREQUENCIES)); - CONVERTER_MAP.put("individuals.genes.transcripts.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.VARIANT_JSON, + CONVERTER_MAP.put("individuals.genes.transcripts.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CONSEQUENCE_TYPES)); - CONVERTER_MAP.put("individuals.genes.transcripts.variants.clinicalSignificance", Arrays.asList(RgaDataModel.VARIANT_JSON, + CONVERTER_MAP.put("individuals.genes.transcripts.variants.clinicalSignificance", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CLINICAL_SIGNIFICANCES)); @@ -87,11 +87,17 @@ public VariantRgaConverter() { @Override public List convertToDataModelType(List rgaDataModelList) { - return convertToDataModelType(rgaDataModelList, Collections.emptyList()); + throw new UnsupportedOperationException("Use other converter passing the list of variants"); } - public List convertToDataModelType(List rgaDataModelList, List variantList) { - Set variantIds = new HashSet<>(variantList); + public List convertToDataModelType(List rgaDataModelList, List variantList, + List includeVariants) { + Set variantIds = new HashSet<>(includeVariants); + + Map variantMap = new HashMap<>(); + for (Variant variant : variantList) { + variantMap.put(variant.getId(), variant); + } // In this list, we will store the keys of result in the order they have been processed so order is kept List variantOrder = new LinkedList<>(); @@ -112,7 +118,7 @@ public List convertToDataModelType(List rgaData } } if (!auxVariantIds.isEmpty()) { - IndividualRgaConverter.extractKnockoutByIndividualMap(rgaDataModel, variantIds, individualMap); + IndividualRgaConverter.extractKnockoutByIndividualMap(rgaDataModel, variantMap, individualMap); for (String auxVariantId : auxVariantIds) { if (StringUtils.isNotEmpty(rgaDataModel.getIndividualId())) { diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/exceptions/RgaException.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/exceptions/RgaException.java similarity index 80% rename from opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/exceptions/RgaException.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/exceptions/RgaException.java index a3b91446f0b..df346a9e4d2 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/exceptions/RgaException.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/exceptions/RgaException.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga.exceptions; +package org.opencb.opencga.analysis.rga.exceptions; public class RgaException extends Exception { diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/IndividualRgaConverterTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/IndividualRgaConverterTest.java similarity index 83% rename from opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/IndividualRgaConverterTest.java rename to opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/IndividualRgaConverterTest.java index dc8e6ad8fe8..7d140d88f8e 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/IndividualRgaConverterTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/IndividualRgaConverterTest.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import com.fasterxml.jackson.core.JsonProcessingException; import org.junit.Before; @@ -10,7 +10,6 @@ import java.util.List; import static org.junit.Assert.assertEquals; -import static org.opencb.opencga.clinical.rga.RgaUtilsTest.createKnockoutByIndividual; public class IndividualRgaConverterTest { @@ -24,8 +23,8 @@ public void setUp() throws Exception { @Test public void convertToDataModelType() throws JsonProcessingException { List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); + knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(1)); + knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(2)); List rgaDataModels = converter.convertToStorageType(knockoutByIndividualList); List knockoutByIndividuals = converter.convertToDataModelType(rgaDataModels); diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaEngineTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java similarity index 86% rename from opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaEngineTest.java rename to opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java index 4535b094c06..8d6b56d9a00 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaEngineTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java @@ -1,5 +1,6 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; +import org.apache.solr.client.solrj.SolrServerException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -7,10 +8,16 @@ import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.rga.exceptions.RgaException; +import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.analysis.knockout.*; import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.storage.core.StorageEngineFactory; import java.io.IOException; import java.io.InputStream; @@ -19,34 +26,47 @@ import java.util.List; import static org.junit.Assert.*; -import static org.opencb.opencga.clinical.rga.RgaUtilsTest.createKnockoutByIndividual; public class RgaEngineTest { + private CatalogManager catalogManager; private StorageConfiguration storageConfiguration; + private VariantStorageManager variantStorageManager; + + private RgaEngine rgaEngine; + private String collection; + + private List knockoutByIndividualList = new ArrayList<>(2); @Rule public RgaSolrExtenalResource solr = new RgaSolrExtenalResource(); @Before - public void before() throws IOException { + public void before() throws IOException, CatalogException, RgaException, SolrServerException { try (InputStream is = RgaEngineTest.class.getClassLoader().getResourceAsStream("storage-configuration.yml")) { storageConfiguration = StorageConfiguration.load(is); } - } + Configuration configuration; + try (InputStream is = RgaEngineTest.class.getClassLoader().getResourceAsStream("configuration-test.yml")) { + configuration = Configuration.load(is); + } + this.catalogManager = new CatalogManager(configuration); - @Test - public void testIndividualQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); + this.variantStorageManager = new VariantStorageManager(catalogManager, StorageEngineFactory.get(storageConfiguration)); + + rgaEngine = solr.configure(variantStorageManager, storageConfiguration); - String collection = solr.coreName; + collection = solr.coreName; rgaEngine.create(collection); - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); + knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(1)); + knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(2)); rgaEngine.insert(collection, knockoutByIndividualList); + } + + @Test + public void testIndividualQuery() throws Exception { OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); assertEquals(2, result.getNumResults()); @@ -95,17 +115,6 @@ public void testIndividualQuery() throws Exception { @Test public void testIncludeExcludeIndividualQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList); - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name")); OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), options); assertEquals(2, result.getNumResults()); @@ -179,16 +188,6 @@ public void testIncludeExcludeIndividualQuery() throws Exception { @Test public void testGeneQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList); OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), new QueryOptions()); assertEquals(4, result.getNumResults()); @@ -246,17 +245,6 @@ public void testGeneQuery() throws Exception { @Test public void testIncludeExcludeGeneQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList); - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome")); OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), options); assertEquals(4, result.getNumResults()); @@ -325,16 +313,6 @@ public void testIncludeExcludeGeneQuery() throws Exception { @Test public void testVariantQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList); OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), new QueryOptions()); assertEquals(6, result.getNumResults()); @@ -342,17 +320,6 @@ public void testVariantQuery() throws Exception { @Test public void testIncludeExcludeVariantQuery() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList); - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", "individuals.genesMap.name")); OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), options); @@ -440,17 +407,6 @@ public void testIncludeExcludeVariantQuery() throws Exception { @Test public void testFacet() throws Exception { - RgaEngine rgaEngine = solr.configure(storageConfiguration); - - String collection = solr.coreName; - rgaEngine.create(collection); - - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); - - rgaEngine.insert(collection, knockoutByIndividualList); - QueryOptions options = new QueryOptions(QueryOptions.FACET, RgaQueryParams.DISORDERS.key()); DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, new Query(), options); assertEquals(1, facetFieldDataResult.getNumResults()); diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java similarity index 95% rename from opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java rename to opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 1ef88126ae4..b5303472694 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import org.apache.solr.client.solrj.SolrServerException; import org.junit.Before; @@ -6,10 +6,13 @@ import org.junit.Test; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.rga.exceptions.RgaException; +import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.managers.CatalogManagerExternalResource; import org.opencb.opencga.catalog.utils.ParamUtils; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; @@ -21,8 +24,7 @@ import org.opencb.opencga.core.models.sample.SampleAclParams; import org.opencb.opencga.core.models.user.Account; import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.clinical.rga.exceptions.RgaException; +import org.opencb.opencga.storage.core.StorageEngineFactory; import java.io.IOException; import java.io.InputStream; @@ -34,7 +36,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.opencb.opencga.clinical.rga.RgaUtilsTest.createKnockoutByIndividual; public class RgaManagerTest { @@ -61,8 +62,9 @@ public void before() throws IOException, CatalogException, RgaException, SolrSer } catalogManager = catalogManagerResource.getCatalogManager(); + VariantStorageManager variantStorageManager = new VariantStorageManager(catalogManager, StorageEngineFactory.get(storageConfiguration)); - rgaEngine = solr.configure(storageConfiguration); + rgaEngine = solr.configure(variantStorageManager, storageConfiguration); rgaManager = new RgaManager(catalogManagerResource.getConfiguration(), storageConfiguration, rgaEngine); loadCatalog(); @@ -98,8 +100,8 @@ private void loadSolr() throws RgaException, IOException, SolrServerException { rgaEngine.create(collection); List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(createKnockoutByIndividual(1)); - knockoutByIndividualList.add(createKnockoutByIndividual(2)); + knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(1)); + knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(2)); rgaEngine.insert(collection, knockoutByIndividualList); } diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaQueryParserTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaQueryParserTest.java similarity index 99% rename from opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaQueryParserTest.java rename to opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaQueryParserTest.java index bdc5b57e33f..21c31d15853 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaQueryParserTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaQueryParserTest.java @@ -1,11 +1,11 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import org.apache.solr.client.solrj.SolrQuery; import org.junit.Before; import org.junit.Test; import org.opencb.commons.datastore.core.Query; +import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.clinical.rga.exceptions.RgaException; import static org.junit.Assert.*; diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaSolrExtenalResource.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java similarity index 94% rename from opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaSolrExtenalResource.java rename to opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java index 00be11a5b4c..9e355298c51 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaSolrExtenalResource.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import org.apache.commons.io.FileUtils; import org.apache.solr.client.solrj.SolrClient; @@ -8,6 +8,7 @@ import org.apache.solr.core.SolrResourceLoader; import org.junit.rules.ExternalResource; import org.opencb.commons.datastore.solr.SolrManager; +import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.core.common.GitRepositoryState; import org.opencb.opencga.core.config.storage.StorageConfiguration; @@ -83,8 +84,8 @@ protected void after() { } } - public RgaEngine configure(StorageConfiguration storageConfiguration) { - RgaEngine rgaEngine = new RgaEngine(storageConfiguration); + public RgaEngine configure(VariantStorageManager variantStorageManager, StorageConfiguration storageConfiguration) { + RgaEngine rgaEngine = new RgaEngine(variantStorageManager, storageConfiguration); rgaEngine.setSolrManager(new SolrManager(solrClient, "localhost", "core")); return rgaEngine; } diff --git a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaUtilsTest.java similarity index 99% rename from opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java rename to opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaUtilsTest.java index d5adf44c63f..a772f9545f2 100644 --- a/opencga-clinical/src/test/java/org/opencb/opencga/clinical/rga/RgaUtilsTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaUtilsTest.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.clinical.rga; +package org.opencb.opencga.analysis.rga; import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManagerTest.java index 16431d64662..8ef680b98d4 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManagerTest.java @@ -29,6 +29,7 @@ import org.opencb.biodata.models.clinical.interpretation.ClinicalVariant; import org.opencb.biodata.models.clinical.interpretation.ClinicalVariantEvidence; import org.opencb.biodata.models.clinical.interpretation.InterpretationMethod; +import org.opencb.biodata.models.common.Status; import org.opencb.biodata.models.variant.avro.VariantAvro; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.ObjectMap; @@ -40,6 +41,7 @@ import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.catalog.utils.ParamUtils; +import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.models.AclParams; import org.opencb.opencga.core.models.clinical.*; @@ -154,6 +156,7 @@ private DataResult createDummyFamily() throws CatalogException { private DataResult createDummyEnvironment(boolean createFamily, boolean createDefaultInterpretation) throws CatalogException { ClinicalAnalysis clinicalAnalysis = new ClinicalAnalysis() + .setStatus(new Status().setId(ClinicalAnalysisStatus.READY_FOR_INTERPRETATION)) .setId("analysis" + RandomStringUtils.randomAlphanumeric(3)) .setDescription("My description").setType(ClinicalAnalysis.Type.FAMILY) .setProband(new Individual().setId("child1").setSamples(Arrays.asList(new Sample().setId("sample2")))); @@ -1802,6 +1805,44 @@ public void searchClinicalAnalysisByProband() throws CatalogException { assertTrue(StringUtils.isEmpty(search.first().getProband().getName())); } + @Test + public void searchClinicalAnalysisByStatus() throws CatalogException { + createDummyEnvironment(true, false); + createDummyEnvironment(false, false); + + OpenCGAResult search = catalogManager.getClinicalAnalysisManager().search(STUDY, + new Query(ParamConstants.STATUS_PARAM, ClinicalAnalysisStatus.DONE), + new QueryOptions(QueryOptions.INCLUDE, ClinicalAnalysisDBAdaptor.QueryParams.PROBAND_ID.key()), sessionIdUser); + assertEquals(0, search.getNumResults()); + + search = catalogManager.getClinicalAnalysisManager().search(STUDY, + new Query(ParamConstants.STATUS_PARAM, ClinicalAnalysisStatus.READY_FOR_INTERPRETATION), + new QueryOptions(), sessionIdUser); + assertEquals(2, search.getNumResults()); + for (ClinicalAnalysis result : search.getResults()) { + assertEquals(ClinicalAnalysisStatus.READY_FOR_INTERPRETATION, result.getStatus().getId()); + } + + catalogManager.getClinicalAnalysisManager().update(STUDY, search.first().getId(), + new ClinicalAnalysisUpdateParams().setStatus(new StatusParam(ClinicalAnalysisStatus.REJECTED)), QueryOptions.empty(), + sessionIdUser); + search = catalogManager.getClinicalAnalysisManager().search(STUDY, + new Query(ParamConstants.STATUS_PARAM, ClinicalAnalysisStatus.READY_FOR_INTERPRETATION), + new QueryOptions(), sessionIdUser); + assertEquals(1, search.getNumResults()); + for (ClinicalAnalysis result : search.getResults()) { + assertEquals(ClinicalAnalysisStatus.READY_FOR_INTERPRETATION, result.getStatus().getId()); + } + + search = catalogManager.getClinicalAnalysisManager().search(STUDY, + new Query(ParamConstants.STATUS_PARAM, ClinicalAnalysisStatus.REJECTED), + new QueryOptions(), sessionIdUser); + assertEquals(1, search.getNumResults()); + for (ClinicalAnalysis result : search.getResults()) { + assertEquals(ClinicalAnalysisStatus.REJECTED, result.getStatus().getId()); + } + } + @Test public void deleteClinicalAnalysisTest() throws CatalogException { DataResult dummyEnvironment = createDummyEnvironment(true, false); diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 5a57e197ca9..85cb4695aeb 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -28,6 +28,7 @@ import org.opencb.opencga.analysis.clinical.tiering.TieringInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.zetta.ZettaInterpretationAnalysis; import org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils; +import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.catalog.db.api.ClinicalAnalysisDBAdaptor; import org.opencb.opencga.catalog.db.api.InterpretationDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogParameterException; @@ -35,7 +36,7 @@ import org.opencb.opencga.catalog.managers.InterpretationManager; import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.catalog.utils.ParamUtils; -import org.opencb.opencga.clinical.rga.RgaManager; +import org.opencb.opencga.analysis.rga.RgaManager; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.VersionException; import org.opencb.opencga.core.models.AclParams; @@ -44,7 +45,7 @@ import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.models.clinical.*; import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.clinical.rga.RgaQueryParams; +import org.opencb.opencga.analysis.rga.RgaQueryParams; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.QueryParam; @@ -71,6 +72,7 @@ public class ClinicalWebService extends AnalysisWebService { private final InterpretationManager catalogInterpretationManager; private final ClinicalInterpretationManager clinicalInterpretationManager; public static final AtomicReference rgaManagerAtomicRef = new AtomicReference<>(); + public static final AtomicReference variantStorageManagerAtomicRef = new AtomicReference<>(); public ClinicalWebService(@Context UriInfo uriInfo, @Context HttpServletRequest httpServletRequest, @Context HttpHeaders httpHeaders) throws IOException, VersionException { @@ -87,7 +89,8 @@ private RgaManager getRgaManager() { synchronized (rgaManagerAtomicRef) { rgaManager = rgaManagerAtomicRef.get(); if (rgaManager == null) { - rgaManager = new RgaManager(catalogManager, storageEngineFactory); + VariantStorageManager variantStorageManager = getVariantStorageManager(); + rgaManager = new RgaManager(catalogManager, variantStorageManager, storageEngineFactory); rgaManagerAtomicRef.set(rgaManager); } } @@ -95,6 +98,20 @@ private RgaManager getRgaManager() { return rgaManager; } + private VariantStorageManager getVariantStorageManager() { + VariantStorageManager variantStorageManager = variantStorageManagerAtomicRef.get(); + if (variantStorageManager == null) { + synchronized (variantStorageManagerAtomicRef) { + variantStorageManager = variantStorageManagerAtomicRef.get(); + if (variantStorageManager == null) { + variantStorageManager = new VariantStorageManager(catalogManager, storageEngineFactory); + variantStorageManagerAtomicRef.set(variantStorageManager); + } + } + } + return variantStorageManager; + } + // public ClinicalWebService(String version, @Context UriInfo uriInfo, @Context HttpServletRequest httpServletRequest, // @Context HttpHeaders httpHeaders) throws IOException, VersionException { // super(version, uriInfo, httpServletRequest, httpHeaders); diff --git a/pom.xml b/pom.xml index bf6e08ea765..83d4b9b177f 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ opencga opencga-env.sh - hdp2.6 + hdp3.1 false From ff440c905cdd7ce1bf6553a6ad46774eb5543826 Mon Sep 17 00:00:00 2001 From: imedina Date: Tue, 13 Apr 2021 16:00:20 +0100 Subject: [PATCH 169/412] client: workin in Python Variant notebook --- .../pyopencga_variant_query.ipynb | 421 +++++++++++++----- 1 file changed, 309 insertions(+), 112 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 91a6780c46c..f6bca65780b 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -4,27 +4,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# *pyopencga* Basic Variant and Interpretation Usage\n", - "\n", + "# Overview\n", "------\n", + "add here\n", "\n", "\n", "**[NOTE]** The server methods used by pyopencga client are defined in the following swagger URL:\n", - "- https://ws.opencb.org/opencga-prod/webservices\n", - "\n", - "**[NOTE]** Current implemented methods are registered at the following spreadsheet:\n", - "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing\n", - "\n", - "## Overview\n", - "\n", - "add here" + "- https://ws.opencb.org/opencga-prod/webservices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 1. Setup the Client and Login into *pyopencga* \n", + "## Setup the Client and Login into *pyopencga* \n", "\n", "**Configuration and Credentials** \n", "\n", @@ -35,186 +28,152 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 12, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Config information:\n", - " {'rest': {'host': 'https://ws.opencb.org/opencga-prod'}}\n" + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pyjq'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mseaborn\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mpyjq\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;31m# Step 2. OpenCGA host\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pyjq'" ] } ], "source": [ + "# Step 1. Import pyopencga dependecies\n", "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", "from pyopencga.opencga_client import OpencgaClient # import client module\n", "from pprint import pprint\n", "import json\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", + "import datetime\n", + "import pyjq\n", "\n", - "####################################\n", - "## Configuration parameters #######\n", - "####################################\n", - "# OpenCGA host\n", + "# Step 2. OpenCGA host\n", "host = 'https://ws.opencb.org/opencga-prod'\n", "\n", - "# User credentials\n", + "# Step 3. User credentials\n", "user = 'demouser'\n", "passwd = 'demouser' ## you can skip this, see below.\n", - "study = 'demo@family:platinum'\n", "####################################\n", "\n", - "# Creating ClientConfiguration dict\n", + "# Step 4. Create the ClientConfiguration dict\n", "config_dict = {'rest': {\n", " 'host': host \n", " }\n", " }\n", - "print('Config information:\\n',config_dict)\n", "\n", - "# Pass the config_dict dictionary to the ClientConfiguration method\n", + "# Step 5. Create the ClientConfiguration and OpenCGA client\n", "config = ClientConfiguration(config_dict)\n", - "\n", - "# Create the client\n", "oc = OpencgaClient(config)\n", "\n", + "# Step 6. Login to OpenCGA using the OpenCGA client \n", "# Pass the credentials to the client\n", "# (here we put only the user in order to be asked for the password interactively)\n", "# oc.login(user)\n", "\n", "# or you can pass the user and passwd\n", - "oc.login(user, passwd)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. \n" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "## Define variables to query different data models though the web services\n", - "\n", - "## Jacobo thinks better oc.variants.query....\n", - "\n", - "variant_client = oc.variants # Variant Client\n", - "user_client = oc.users\n", - "project_client = oc.projects\n", - "study_client = oc.studies\n", - "sample_client = oc.samples\n", - "individual_client = oc.individuals\n", - "file_client = oc.files\n", - "cohort_client = oc.cohorts\n", - "\n" + "oc.login(user, passwd)\n", + "\n", + "print('Logged succesfuly to {}, {} well done!'.format(host, oc.token))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2. Querying Variants" + "## Setup OpenCGA Variables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Let's get the variant client to query OpenCGA server" + "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. \n" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "# Let's use corpasome study\n", - "study = 'family:corpasome'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Query variants by gene\n", - "\n", - "We can use the `.query()` server to query for variants in a specific gene:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#Time: 332\n", - "#Num matches: 26\n", - "#Num results: 2\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\n", - "13:32884653:G:T\n", - "13:32889968:G:A\n" - ] - } - ], - "source": [ - "# Define the gene or genes we want to query\n", + "## Define the OpenCGA variables to query data\n", + "study = 'family:corpasome'\n", "\n", - "genes=['BRCA2']\n", - "limit=2\n", + "# You can define list using string with commas\n", + "genes='BRCA2'\n", "\n", - "variants = variant_client.query(study=study, gene=genes, limit=limit) # Other params: exclude='annotation'\n", + "# or you can use python lists\n", + "transcripts=['ENST00000530893']\n", "\n", - "\n", - "variants.print_results('id')\n", - "#pprint(variants.get_result(0))" + "RESULT_SEPARATOR='\\n'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 3. Aggegation Files" + "# Querying Variants: Filter by Variant Annotation\n", + "------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 4. Common queries" + "In this section you will learn how to query variants filtering by **Variant Annotation**, this is one of the most useful and rich web service with many filter parameters.\n", + "\n", + "You can query variants using the following function:\n", + "\n", + "`\n", + " oc.variants.query()\n", + "`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Situation**: I'm interested in knowing which variants in RD38 fall on chromosome 15 between 21,242,091 and 23,226,874bp?" + "## Filter by Region\n", + "\n", + "..." ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "TypeError", + "evalue": "Object of type 'RestResponse' is not JSON serializable", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# Print the results\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m#variants.print_results('id')\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32massert\u001b[0m \u001b[0mjq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\".\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvariants\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32mjq.pyx\u001b[0m in \u001b[0;36mjq._Program.input\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/json/__init__.py\u001b[0m in \u001b[0;36mdumps\u001b[0;34m(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)\u001b[0m\n\u001b[1;32m 229\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mindent\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mseparators\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 230\u001b[0m default is None and not sort_keys and not kw):\n\u001b[0;32m--> 231\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_default_encoder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 232\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mJSONEncoder\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/json/encoder.py\u001b[0m in \u001b[0;36mencode\u001b[0;34m(self, o)\u001b[0m\n\u001b[1;32m 197\u001b[0m \u001b[0;31m# exceptions aren't as detailed. The list call should be roughly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 198\u001b[0m \u001b[0;31m# equivalent to the PySequence_Fast that ''.join() would do.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 199\u001b[0;31m \u001b[0mchunks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miterencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_one_shot\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 200\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 201\u001b[0m \u001b[0mchunks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/json/encoder.py\u001b[0m in \u001b[0;36miterencode\u001b[0;34m(self, o, _one_shot)\u001b[0m\n\u001b[1;32m 255\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkey_separator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitem_separator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_keys\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m self.skipkeys, _one_shot)\n\u001b[0;32m--> 257\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_iterencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 258\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 259\u001b[0m def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,\n", + "\u001b[0;32m/usr/lib/python3.6/json/encoder.py\u001b[0m in \u001b[0;36mdefault\u001b[0;34m(self, o)\u001b[0m\n\u001b[1;32m 178\u001b[0m \"\"\"\n\u001b[1;32m 179\u001b[0m raise TypeError(\"Object of type '%s' is not JSON serializable\" %\n\u001b[0;32m--> 180\u001b[0;31m o.__class__.__name__)\n\u001b[0m\u001b[1;32m 181\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 182\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: Object of type 'RestResponse' is not JSON serializable" + ] + } + ], "source": [ "# Perform the query\n", - "variants = variant_client.query(study=study, region='15:21242091-23226874', include='id')\n", + "variants = oc.variants.query(study=study, region='15:21242091-23226874', include='id')\n", "\n", "# Print the results\n", - "#variants.print_results('id')\n" + "#variants.print_results('id')\n", + "assert jq.compile(\".\").input(variants).text()" ] }, { @@ -297,6 +256,234 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Filter by Gene\n", + "\n", + "We can filter variants by gene using the parameters `xref` or `gene`:\n", + "* **xref**: you can filter by different IDs including gene, transcrit, dbSNP, ...\n", + "* **gene**: only accepts gene IDs\n", + "\n", + "Remember you can pass different IDs using comma as separator." + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 326\n", + "#Num matches: 10\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "13:32884653:G:T\tBRCA2,ZAR1L\tintron_variant\n", + "13:32889968:G:A\tBRCA2,ZAR1L\tintron_variant\n", + "13:32890572:G:A\tBRCA2,ZAR1L\t5_prime_UTR_variant\n", + "13:32900933:T:A\tBRCA2\tintron_variant\n", + "13:32903685:C:T\tBRCA2\tintron_variant\n", + "\n", + "\n", + "#Time: 331\n", + "#Num matches: 26\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "13:32884653:G:T\tBRCA2,ZAR1L\tintron_variant\n", + "13:32889968:G:A\tBRCA2,ZAR1L\tintron_variant\n", + "13:32890572:G:A\tBRCA2,ZAR1L\t5_prime_UTR_variant\n", + "13:32900933:T:A\tBRCA2\tintron_variant\n", + "13:32903685:C:T\tBRCA2\tintron_variant\n" + ] + } + ], + "source": [ + "# Filter by xref\n", + "variants = oc.variants.query(study=study, xref=transcripts, limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "# Filter by gene\n", + "variants = oc.variants.query(study=study, gene=genes, limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Filter by Consequence Type\n", + "\n", + "..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Filter by Variant Type\n", + "\n", + "values accepted..." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#Time: 310\n", + "#Num matches: 288538\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", + "1:745347:T:C\tRP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", + "1:752566:G:A\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:752721:A:G\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:753405:C:A\tFAM87B,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "\n", + "\n", + "#Time: 386\n", + "#Num matches: 300709\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", + "1:745347:T:C\tRP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", + "1:745371:A:-\tRP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", + "1:752566:G:A\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:752721:A:G\tFAM87B,RP11-206L10.10\tintron_variant\n", + "#Time: 293\n", + "#Num matches: 1\n", + "#Num results: 1\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "12:133197450:GCCTGGGACTGACCCGGGCTCTCGAGGGGCCTCTCGTGTGCCCTTGTGACCCCCTTCCCTG:-\tP2RX2,POLE\tintron_variant\n" + ] + } + ], + "source": [ + "# Filter by SNV\n", + "variants = oc.variants.query(study=study, type='SNV', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "# Filter by ...\n", + "variants = oc.variants.query(study=study, type='SNV,INDEL', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType')\n", + "\n", + "# Filter by ...\n", + "variants = oc.variants.query(study=study, type='DELETION', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Advanced Filters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Querying Variants: Filter by Sample and VCF params\n", + "-------" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# resp = oc.samples.search(limi=1)\n", + "# sample= resp." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Aggregation Stats\n", + "-------" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Use Cases\n", + "---------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fetch all samples per Variant\n", + "\n", + "1. choose one variant\n", + "2. get samples\n", + "3. go to catalog" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -362,13 +549,23 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": { "pycharm": { "is_executing": true } }, + "source": [ + "## Sample Variant Stats\n", + "\n", + "1. Choose one random sample from catalog\n", + "2. sample stats query" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, "outputs": [], "source": [] } @@ -389,7 +586,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, From dec2da827b4fa89ec9b49776bb91a1a8c2ca2198 Mon Sep 17 00:00:00 2001 From: imedina Date: Wed, 14 Apr 2021 03:16:09 +0100 Subject: [PATCH 170/412] client: major improvements in the pyhton variant query notebook --- .../pyopencga_variant_query.ipynb | 579 ++++++++++++++---- 1 file changed, 465 insertions(+), 114 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index f6bca65780b..df0a0a6b20d 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -10,7 +10,10 @@ "\n", "\n", "**[NOTE]** The server methods used by pyopencga client are defined in the following swagger URL:\n", - "- https://ws.opencb.org/opencga-prod/webservices" + "- https://ws.opencb.org/opencga-prod/webservices\n", + "\n", + "This Notebook is organised in the following sections:\n", + "[**PENDING**]" ] }, { @@ -28,51 +31,47 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 73, "metadata": {}, "outputs": [ { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'pyjq'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mseaborn\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mpyjq\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;31m# Step 2. OpenCGA host\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pyjq'" + "name": "stdout", + "output_type": "stream", + "text": [ + "Logged succesfuly to https://ws.opencb.org/opencga-prod, eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTgzNjU3OTcsImV4cCI6MTYxODM2OTM5N30.iLg4v6-pGbOIVRc2mp-KJau-S2oLcrw4FfTjgcLo-bk well done!\n" ] } ], "source": [ - "# Step 1. Import pyopencga dependecies\n", + "## Step 1. Import pyopencga dependecies\n", "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", "from pyopencga.opencga_client import OpencgaClient # import client module\n", "from pprint import pprint\n", - "import json\n", + "from IPython.display import JSON\n", + "# import json\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import datetime\n", - "import pyjq\n", "\n", - "# Step 2. OpenCGA host\n", + "## Step 2. OpenCGA host\n", "host = 'https://ws.opencb.org/opencga-prod'\n", "\n", - "# Step 3. User credentials\n", + "## Step 3. User credentials\n", "user = 'demouser'\n", "passwd = 'demouser' ## you can skip this, see below.\n", "####################################\n", "\n", - "# Step 4. Create the ClientConfiguration dict\n", + "## Step 4. Create the ClientConfiguration dict\n", "config_dict = {'rest': {\n", " 'host': host \n", " }\n", " }\n", "\n", - "# Step 5. Create the ClientConfiguration and OpenCGA client\n", + "## Step 5. Create the ClientConfiguration and OpenCGA client\n", "config = ClientConfiguration(config_dict)\n", "oc = OpencgaClient(config)\n", "\n", - "# Step 6. Login to OpenCGA using the OpenCGA client \n", + "## Step 6. Login to OpenCGA using the OpenCGA client \n", "# Pass the credentials to the client\n", "# (here we put only the user in order to be asked for the password interactively)\n", "# oc.login(user)\n", @@ -99,17 +98,17 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 74, "metadata": {}, "outputs": [], "source": [ "## Define the OpenCGA variables to query data\n", "study = 'family:corpasome'\n", "\n", - "# You can define list using string with commas\n", + "## You can define list using string with commas\n", "genes='BRCA2'\n", "\n", - "# or you can use python lists\n", + "## or you can use python lists\n", "transcripts=['ENST00000530893']\n", "\n", "RESULT_SEPARATOR='\\n'" @@ -133,7 +132,11 @@ "\n", "`\n", " oc.variants.query()\n", - "`" + "`\n", + "\n", + "OpenCGA implements probably the most advanced variant query engine. In this section you will learn the basixs about how to filter using the variant annotation. In the first sections you will learn how to filter using different parameters, then we will build more complex queries combining different parameters.\n", + "\n", + "**IMPORTANT NOTE**: Many of the calls in this notebook could potentially return thousands or millions of variants with all sample and annotation data, which can be fine for real life Python scripts. In order to avoid issues with Jupyter and unnecessary delays **all the examples here will execute small queries and limit the number of results returned**." ] }, { @@ -142,50 +145,57 @@ "source": [ "## Filter by Region\n", "\n", - "..." + "You can query by a region or a list of regions using the parameter `region`. The region must be of the format `chromosome:start-end`, single chromosome are also allowed, e.g. `14,15:21242091-23226874` would fetch all variants from chomosome 14 and a small region of chromosome 15." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 27, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "Object of type 'RestResponse' is not JSON serializable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# Print the results\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m#variants.print_results('id')\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32massert\u001b[0m \u001b[0mjq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\".\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvariants\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32mjq.pyx\u001b[0m in \u001b[0;36mjq._Program.input\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3.6/json/__init__.py\u001b[0m in \u001b[0;36mdumps\u001b[0;34m(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)\u001b[0m\n\u001b[1;32m 229\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mindent\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mseparators\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 230\u001b[0m default is None and not sort_keys and not kw):\n\u001b[0;32m--> 231\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_default_encoder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 232\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mJSONEncoder\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3.6/json/encoder.py\u001b[0m in \u001b[0;36mencode\u001b[0;34m(self, o)\u001b[0m\n\u001b[1;32m 197\u001b[0m \u001b[0;31m# exceptions aren't as detailed. The list call should be roughly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 198\u001b[0m \u001b[0;31m# equivalent to the PySequence_Fast that ''.join() would do.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 199\u001b[0;31m \u001b[0mchunks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miterencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_one_shot\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 200\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 201\u001b[0m \u001b[0mchunks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3.6/json/encoder.py\u001b[0m in \u001b[0;36miterencode\u001b[0;34m(self, o, _one_shot)\u001b[0m\n\u001b[1;32m 255\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkey_separator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitem_separator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_keys\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m self.skipkeys, _one_shot)\n\u001b[0;32m--> 257\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_iterencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 258\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 259\u001b[0m def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,\n", - "\u001b[0;32m/usr/lib/python3.6/json/encoder.py\u001b[0m in \u001b[0;36mdefault\u001b[0;34m(self, o)\u001b[0m\n\u001b[1;32m 178\u001b[0m \"\"\"\n\u001b[1;32m 179\u001b[0m raise TypeError(\"Object of type '%s' is not JSON serializable\" %\n\u001b[0;32m--> 180\u001b[0;31m o.__class__.__name__)\n\u001b[0m\u001b[1;32m 181\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 182\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: Object of type 'RestResponse' is not JSON serializable" + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by Region\n", + "---------------------\n", + "#Time: 1074\n", + "#Num matches: 360\n", + "#Num results: 360\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "15:22830185:T:C\tTUBGCP5,\tupstream_gene_variant\n", + "15:22833202:C:T\tTUBGCP5,\t2KB_upstream_variant\n", + "15:22840279:G:T\tTUBGCP5,\tsynonymous_variant\n", + "15:22849186:T:-\tTUBGCP5,\tnon_coding_transcript_exon_variant\n", + "15:22853997:C:T\tTUBGCP5,\tintron_variant\n", + "15:22862384:C:A\tTUBGCP5,\tintron_variant\n", + "15:22864438:A:G\tTUBGCP5,\tintron_variant\n", + "15:22866621:G:A\tTUBGCP5,\tintron_variant\n", + "15:22867123:-:AAG\tTUBGCP5,\tnon_coding_transcript_exon_variant\n", + "15:22869804:A:G\tTUBGCP5,\tintron_variant\n" ] } ], "source": [ - "# Perform the query\n", - "variants = oc.variants.query(study=study, region='15:21242091-23226874', include='id')\n", - "\n", - "# Print the results\n", - "#variants.print_results('id')\n", - "assert jq.compile(\".\").input(variants).text()" + "## Filter by a small region of chromsome 15\n", + "variants = oc.variants.query(study=study, region='15:21242091-23226874', exclude='studies', limit=500)\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Region', limit=10) # metadata=False\n", + "# JSON(variants.get_results())\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The new function `.to_data_frame()` added in the *pyopencga* release 2.0.1.1, allows you store the results as a *pandas* dataframe object:" + "Since **pyopencga 2.0.1** implements a function to convert REST response to a Pandas object `.to_data_frame()`, this allows you store the results as a **pandas** dataframe object:" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 28, "metadata": { "pycharm": { "is_executing": true @@ -215,8 +225,10 @@ } ], "source": [ + "## Convert REST response object 'variants' to Pandas datafrom\n", "df = variants.to_data_frame()\n", - "formatted_df = df.drop(['names', 'studies'], 1)\n", + "## formatted_df = df.drop(['names', 'studies'], 1)\n", + "\n", "print('The results can be stored and printed as a pandas DF:\\n\\n', formatted_df.head())" ] }, @@ -224,17 +236,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With the *pandas dataframe* object, you can create plots using *maplotlib* or *seaborn* python libraries to show the results:" + "With the **Pandas dataframe** object, you can easily create plots using **maplotlib** or **seaborn** python libraries to show the results:" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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1aujX79+AIDKlStj+PDh8Pf3h4mJCTIyMuDm5obx48cbOFoiIiqKikXCdHJywo0bN3RO27dvXyFHQ0RExqjYNMkSERHlBxMmERGRDEyYREREMjBhEhERycCESUREJAMTJhERkQxMmERERDIwYRIREcnAhElERCQDEyYREZEMTJhEREQyMGESERHJwIRJREQkAxMmERGRDEyYREREMjBhEhERycCESUREJAMTJhERkQxMmERERDIwYRIREcnAhElERCQDEyYREZEMTJhEREQyMGESERHJwIRJREQkAxMmERGRDEaRMOPi4pCcnAwA0Gg02L17N4KDg6HVag0cGRERFRdGkTBHjhyJqKgoAMDSpUuxceNGbN68GQsWLDBwZEREVFwYRcK8f/8+6tSpAwDYu3cvfvrpJ/z88884cOCAgSMjIqLiwtTQAcihUCigVqtx79492NjYoGLFitBqtWIzLRERUUEzioTZsmVLjB8/HgkJCejSpQsA4Pbt26hQoYKBIyMqPGamCqRlSO/bW5opAd7LJyoURpEw582bh+DgYJiamsLX1xcAEB8fj7Fjxxo2MKJCpFJrcOTv+5Iyr2Y1YKk0MUxARMWMUdzD3Lp1K/r27YuePXtCqVQCABo3boxnz54ZODIiIioujCJhBgYG6ixfvXp1IUdCRETFVZFukv37778BAFqtFv/88w8EQRCnPXr0CNbW1oYKjYiIipkinTCnTZsGAFCpVJg6dapYbmJiAjs7O0yfPt1QoRERUTFTpBPmsWPHAACTJ0/GwoUL32kd8fHxmDx5Mh48eABzc3NUq1YNs2bNQtmyZXHx4kX4+/tDpVKhUqVKWLRoEcqVK6fPXSAioveEUdzDzJ4stVqt5OdtTExMMHz4cBw+fBj79u1DlSpVsHjxYmi1WkyaNAn+/v44fPgwGjZsiMWLFxfkbhARkREzioR59epV9O3bF66urqhbty7q1q2LDz/8EHXr1n3rsra2tmjcuLH42dXVFU+ePEFERAQsLCzQsGFDAEC/fv1w6NChAtsHIiIybkW6STbLlClT0LZtW8ybNw+WlpbvvB6tVovt27fD09MT0dHRqFixojitbNmy0Gq1SEhIgK2trex1litX8p3jKWx2djaGDkFvnsenwNraQlKmUChylVlamMKujJWkzBjqIT/79zpJqWqkpqnF9cNUiRKWZihZ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\n", "text/plain": [ "
" ] @@ -244,11 +256,10 @@ } ], "source": [ - "# Create a plot with the results:\n", - "\n", + "## Create a plot with the results:\n", "sns.set_theme(style=\"darkgrid\")\n", "sns.color_palette('deep')\n", - "sns.displot(data=df, hue='type', hue_order=['INDEL','SNP','SNV'], x=\"start\", bins=50) # multiple= \"dodge\", 'stack'\n", + "sns.displot(data=df, hue='type', hue_order=['SNV', 'INDEL', 'CNV'], x=\"start\", bins=50) # multiple= \"dodge\", 'stack'\n", "plt.title('Variants in Region of Chromosome 15', fontsize=20, fontweight='bold' )\n", "plt.xlabel('Chr15:21242091-23226874 bp', fontsize=12)\n", "plt.ylabel('Variant counts', fontsize=12)\n", @@ -256,6 +267,103 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Filter by Variant Type\n", + "\n", + "OpenCGA supports most existing variant types as you can see here:\n", + "\n", + " ```\n", + " SNV, // SO:0001483\n", + " MNV, // SO:0002007\n", + " INDEL, // SO:1000032\n", + " SV, // SO:0001537\n", + " INSERTION, // SO:0000667\n", + " DELETION, // SO:0000159\n", + " TRANSLOCATION, // SO:0000199\n", + " INVERSION, // SO:1000036\n", + " COPY_NUMBER, // SO:0001019\n", + " COPY_NUMBER_GAIN, // SO:0001742\n", + " COPY_NUMBER_LOSS, // SO:0001743\n", + " DUPLICATION, // SO:1000035\n", + " TANDEM_DUPLICATION, // SO:1000173\n", + " BREAKEND,\n", + "```\n", + "You can filter by variant type(s) using the parameter `type`." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by SNV\n", + "------------------\n", + "#Time: 355\n", + "#Num matches: 288538\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", + "1:745347:T:C\tRP11-206L10.8,RP11-206L10.10,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", + "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:753405:C:A\tRP11-206L10.10,FAM87B\tnon_coding_transcript_exon_variant\n", + "\n", + "\n", + "Filter by SNV.INDEL\n", + "------------------------\n", + "#Time: 343\n", + "#Num matches: 300709\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", + "1:745347:T:C\tRP11-206L10.8,RP11-206L10.10,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", + "1:745371:A:-\tRP11-206L10.8,RP11-206L10.10,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", + "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", + "\n", + "\n", + "Filter by DELETION\n", + "-----------------------\n", + "#Time: 339\n", + "#Num matches: 1\n", + "#Num results: 1\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "12:133197450:GCCTGGGACTGACCCGGGCTCTCGAGGGGCCTCTCGTGTGCCCTTGTGACCCCCTTCCCTG:-\tP2RX2,POLE\tintron_variant\n" + ] + } + ], + "source": [ + "# Filter by SNV\n", + "variants = oc.variants.query(study=study, type='SNV', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by SNV') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "# Filter by ...\n", + "variants = oc.variants.query(study=study, type='SNV,INDEL', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by SNV.INDEL')\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "# Filter by ...\n", + "variants = oc.variants.query(study=study, type='DELETION', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by DELETION')" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -271,51 +379,58 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#Time: 326\n", + "Filter by Transcripts: ['ENST00000530893']\n", + "-----------------------------------------------\n", + "#Time: 476\n", "#Num matches: 10\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "13:32884653:G:T\tBRCA2,ZAR1L\tintron_variant\n", - "13:32889968:G:A\tBRCA2,ZAR1L\tintron_variant\n", - "13:32890572:G:A\tBRCA2,ZAR1L\t5_prime_UTR_variant\n", + "13:32884653:G:T\tZAR1L,BRCA2\tintron_variant\n", + "13:32889968:G:A\tZAR1L,BRCA2\tintron_variant\n", + "13:32890572:G:A\tZAR1L,BRCA2\t5_prime_UTR_variant\n", "13:32900933:T:A\tBRCA2\tintron_variant\n", "13:32903685:C:T\tBRCA2\tintron_variant\n", "\n", "\n", - "#Time: 331\n", + "Filter by Genes: BRCA2\n", + "---------------------------\n", + "#Time: 346\n", "#Num matches: 26\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "13:32884653:G:T\tBRCA2,ZAR1L\tintron_variant\n", - "13:32889968:G:A\tBRCA2,ZAR1L\tintron_variant\n", - "13:32890572:G:A\tBRCA2,ZAR1L\t5_prime_UTR_variant\n", + "13:32884653:G:T\tZAR1L,BRCA2\tintron_variant\n", + "13:32889968:G:A\tZAR1L,BRCA2\tintron_variant\n", + "13:32890572:G:A\tZAR1L,BRCA2\t5_prime_UTR_variant\n", "13:32900933:T:A\tBRCA2\tintron_variant\n", "13:32903685:C:T\tBRCA2\tintron_variant\n" ] } ], "source": [ - "# Filter by xref\n", + "## Filter by xref\n", "variants = oc.variants.query(study=study, xref=transcripts, limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') # metadata=False\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Transcripts: {}'.format(transcripts)) # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", - "# Filter by gene\n", + "## Filter by gene\n", "variants = oc.variants.query(study=study, gene=genes, limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType')\n" + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Genes: {}'.format(genes))\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())\n" ] }, { @@ -324,7 +439,91 @@ "source": [ "## Filter by Consequence Type\n", "\n", - "..." + "OpenCGA provides a rich variant annotation that includes Ensembl consequence types (https://m.ensembl.org/info/genome/variation/prediction/predicted_data.html). Yu can filter by consequence type by using parameter `ct`. You can provide a list od conseuqnce type names separated by comma. Also, an alias called `lof` filter by a combination of loss-of-function terms." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by missense_variant:\n", + "--------------------------------\n", + "#Time: 326\n", + "#Num matches: 15401\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:69511:A:G\tOR4F5\tmissense_variant\n", + "1:909238:G:C\tC1orf170,PLEKHN1\tmissense_variant\n", + "1:909309:T:C\tC1orf170,PLEKHN1\tmissense_variant\n", + "1:914876:T:C\tC1orf170,PLEKHN1\tmissense_variant\n", + "1:916549:A:G\tC1orf170\tmissense_variant\n", + "\n", + "\n", + "Filter by missense_variant,stop_gained:\n", + "--------------------------------------------\n", + "#Time: 332\n", + "#Num matches: 15578\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:69511:A:G\tOR4F5\tmissense_variant\n", + "1:909238:G:C\tC1orf170,PLEKHN1\tmissense_variant\n", + "1:909309:T:C\tC1orf170,PLEKHN1\tmissense_variant\n", + "1:914876:T:C\tC1orf170,PLEKHN1\tmissense_variant\n", + "1:916549:A:G\tC1orf170\tmissense_variant\n", + "\n", + "\n", + "Filter by lof:\n", + "-------------------\n", + "#Time: 393\n", + "#Num matches: 5075\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:897730:C:T\tNOC2L,PLEKHN1,KLHL17\tsplice_region_variant\n", + "1:977330:T:C\tAGRN\tsplice_region_variant\n", + "1:987200:C:T\tAGRN,RP11-54O7.14\tsplice_region_variant\n", + "1:1233941:T:C\tACAP3\tsplice_region_variant\n", + "1:1558792:T:C\tMIB2\tstart_lost\n" + ] + } + ], + "source": [ + "## Filter by misense variants\n", + "variants = oc.variants.query(study=study, ct='missense_variant', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by missense_variant:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by misense variants and stop_gained\n", + "variants = oc.variants.query(study=study, ct='missense_variant,stop_gained', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by missense_variant,stop_gained:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by misense variants and stop_gained\n", + "variants = oc.variants.query(study=study, ct='lof', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by lof:') # metadata=False\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Filter by Population Frequencies" ] }, { @@ -338,77 +537,161 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Filter by Variant Type\n", - "\n", - "values accepted..." + "## Filter by Clinical Information" ] }, { "cell_type": "code", - "execution_count": 86, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bulding Complex Queries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Querying Variants: Filter by Sample Data\n", + "----------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Filter By Sample" + ] + }, + { + "cell_type": "code", + "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#Time: 310\n", - "#Num matches: 288538\n", + "Sample ID for the next examples is: ISDBM322016\n" + ] + } + ], + "source": [ + "resp = oc.samples.search(study=study, limit=1)\n", + "sample_id = resp.get_result(0)['id']\n", + "print('Sample ID for the next examples is: {}'.format(sample_id))\n", + "# JSON(resp.get_results())" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by sample ISDBM322016:\n", + "----------------------------------\n", + "#Time: 367\n", + "#Num matches: 164776\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", - "1:745347:T:C\tRP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", - "1:752566:G:A\tFAM87B,RP11-206L10.10\tintron_variant\n", - "1:752721:A:G\tFAM87B,RP11-206L10.10\tintron_variant\n", - "1:753405:C:A\tFAM87B,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", - "\n", - "\n", - "#Time: 386\n", - "#Num matches: 300709\n", + "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:14930:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:15211:T:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:17538:C:A\tWASH7P,DDX11L1\tintron_variant\n", + "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n" + ] + } + ], + "source": [ + "variants = oc.variants.query(study=study, sample=sample_id, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(sample_id)) # metadata=False\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Filter by Genotype" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by sample ISDBM322016:0/1:\n", + "--------------------------------------\n", + "#Time: 398\n", + "#Num matches: 68280\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", - "1:745347:T:C\tRP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", - "1:745371:A:-\tRP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", - "1:752566:G:A\tFAM87B,RP11-206L10.10\tintron_variant\n", - "1:752721:A:G\tFAM87B,RP11-206L10.10\tintron_variant\n", - "#Time: 293\n", - "#Num matches: 1\n", - "#Num results: 1\n", + "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:14930:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:15211:T:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:17538:C:A\tWASH7P,DDX11L1\tintron_variant\n", + "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "\n", + "\n", + "Filter by sample ISDBM322016:1/1:\n", + "--------------------------------------\n", + "#Time: 302\n", + "#Num matches: 96044\n", + "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "12:133197450:GCCTGGGACTGACCCGGGCTCTCGAGGGGCCTCTCGTGTGCCCTTGTGACCCCCTTCCCTG:-\tP2RX2,POLE\tintron_variant\n" + "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:69511:A:G\tOR4F5\tmissense_variant\n", + "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:753405:C:A\tRP11-206L10.10,FAM87B\tnon_coding_transcript_exon_variant\n" ] } ], "source": [ - "# Filter by SNV\n", - "variants = oc.variants.query(study=study, type='SNV', limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') # metadata=False\n", + "genotype = sample_id + ':0/1'\n", + "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", - "# Filter by ...\n", - "variants = oc.variants.query(study=study, type='SNV,INDEL', limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType')\n", - "\n", - "# Filter by ...\n", - "variants = oc.variants.query(study=study, type='DELETION', limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType')" + "genotype = sample_id + ':1/1'\n", + "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Advanced Filters" + "## Filter by Mode of Inheritance" ] }, { @@ -422,33 +705,101 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Querying Variants: Filter by Sample and VCF params\n", - "-------" + "## Filter by VCF data" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All 1/1 variants for sample ISDBM322016:1/1:\n", + "-------------------------------------------------\n", + "#Time: 305\n", + "#Num matches: 96044\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:69511:A:G\tOR4F5\tmissense_variant\n", + "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:753405:C:A\tRP11-206L10.10,FAM87B\tnon_coding_transcript_exon_variant\n", + "\n", + "\n", + "PASS 1/1 variants for sample ISDBM322016:1/1:\n", + "--------------------------------------------------\n", + "#Time: 332\n", + "#Num matches: 89302\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:808631:G:A\tTUBB8P11,FAM41C\tintron_variant\n", + "1:812267:A:G\tTUBB8P11,FAM41C\tnon_coding_transcript_exon_variant\n" + ] + } + ], "source": [ - "# resp = oc.samples.search(limi=1)\n", - "# sample= resp." + "genotype = sample_id + ':1/1'\n", + "\n", + "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='All 1/1 variants for sample {}:'.format(genotype)) # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "\n", + "variants = oc.variants.query(study=study, sample=genotype, filter='PASS', limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='PASS 1/1 variants for sample {}:'.format(genotype)) # metadata=False\n" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## Building Complex queries" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 82, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by sample ISDBM322016:1/1:\n", + "--------------------------------------\n", + "#Time: 334\n", + "#Num matches: 10\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "13:32884653:G:T\tZAR1L,BRCA2\tintron_variant\n", + "13:32905265:G:A\tBRCA2\tintron_variant\n", + "13:32913055:A:G\tBRCA2\tsynonymous_variant\n", + "13:32915005:G:C\tBRCA2\tsynonymous_variant\n", + "13:32920844:T:C\tBRCA2\tintron_variant\n" + ] + } + ], + "source": [ + "genotype = sample_id + ':1/1'\n", + "variants = oc.variants.query(study=study, sample=genotype, gene='BRCA2', limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n" + ] }, { "cell_type": "markdown", From 99a1f1b915e12e76926977711512106ca9ecad86 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Wed, 14 Apr 2021 09:02:28 +0100 Subject: [PATCH 171/412] client: add filter by pop freq. to variant query notebook --- .../pyopencga_variant_query.ipynb | 354 +++++++++++++----- .../python/notebooks/user-training/test2.py | 290 ++++++++++++++ 2 files changed, 560 insertions(+), 84 deletions(-) create mode 100644 opencga-client/src/main/python/notebooks/user-training/test2.py diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index df0a0a6b20d..fa1dd534998 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -6,11 +6,14 @@ "source": [ "# Overview\n", "------\n", - "add here\n", + "This notebook is intended to provide guidance for querying variants in the OpenCGA server through *pyopencga* from the studies that your user has access to; you can combine the filtration of variants with the exploration of their related clinical data (Samples, Individuals Genotypes etc.).
\n", "\n", + "For guidance on how to loggin and get started with *opencga* you can refer to : [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", "\n", - "**[NOTE]** The server methods used by pyopencga client are defined in the following swagger URL:\n", - "- https://ws.opencb.org/opencga-prod/webservices\n", + "A good first step when start working with OpenCGA is to explore **Catalog**, which holds: information about our user, the projects and studies our user has permission to access and the clinical data from the studies. For guidance you can refer to : [pyopencga_catalog.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", + "\n", + "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", + "- https://ws.opencb.org/opencga-prod/webservices/\n", "\n", "This Notebook is organised in the following sections:\n", "[**PENDING**]" @@ -31,14 +34,14 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Logged succesfuly to https://ws.opencb.org/opencga-prod, eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTgzNjU3OTcsImV4cCI6MTYxODM2OTM5N30.iLg4v6-pGbOIVRc2mp-KJau-S2oLcrw4FfTjgcLo-bk well done!\n" + "Logged succesfuly to https://ws.opencb.org/opencga-prod, eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTgzODU1NTMsImV4cCI6MTYxODM4OTE1M30.--gBVmEW1ZgvxYNJtTx2G9ee_IMpDd4H6Sgi0arDCqU well done!\n" ] } ], @@ -98,7 +101,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -150,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -159,23 +162,23 @@ "text": [ "Filter by Region\n", "---------------------\n", - "#Time: 1074\n", + "#Time: 1037\n", "#Num matches: 360\n", "#Num results: 360\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "15:22830185:T:C\tTUBGCP5,\tupstream_gene_variant\n", - "15:22833202:C:T\tTUBGCP5,\t2KB_upstream_variant\n", - "15:22840279:G:T\tTUBGCP5,\tsynonymous_variant\n", - "15:22849186:T:-\tTUBGCP5,\tnon_coding_transcript_exon_variant\n", - "15:22853997:C:T\tTUBGCP5,\tintron_variant\n", - "15:22862384:C:A\tTUBGCP5,\tintron_variant\n", - "15:22864438:A:G\tTUBGCP5,\tintron_variant\n", - "15:22866621:G:A\tTUBGCP5,\tintron_variant\n", - "15:22867123:-:AAG\tTUBGCP5,\tnon_coding_transcript_exon_variant\n", - "15:22869804:A:G\tTUBGCP5,\tintron_variant\n" + "15:22830185:T:C\t,TUBGCP5\tupstream_gene_variant\n", + "15:22833202:C:T\t,TUBGCP5\t2KB_upstream_variant\n", + "15:22840279:G:T\t,TUBGCP5\tsynonymous_variant\n", + "15:22849186:T:-\t,TUBGCP5\tnon_coding_transcript_exon_variant\n", + "15:22853997:C:T\t,TUBGCP5\tintron_variant\n", + "15:22862384:C:A\t,TUBGCP5\tintron_variant\n", + "15:22864438:A:G\t,TUBGCP5\tintron_variant\n", + "15:22866621:G:A\t,TUBGCP5\tintron_variant\n", + "15:22867123:-:AAG\t,TUBGCP5\tnon_coding_transcript_exon_variant\n", + "15:22869804:A:G\t,TUBGCP5\tintron_variant\n" ] } ], @@ -195,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 5, "metadata": { "pycharm": { "is_executing": true @@ -215,19 +218,85 @@ "3 15:22849186:T:- 15 T + INDEL 22849186 \n", "4 15:22853997:C:T 15 C T + SNV 22853997 \n", "\n", - " end length \n", - "0 22830185 1 \n", - "1 22833202 1 \n", - "2 22840279 1 \n", - "3 22849186 1 \n", - "4 22853997 1 \n" + " end length annotation.chromosome ... \\\n", + "0 22830185 1 15 ... \n", + "1 22833202 1 15 ... \n", + "2 22840279 1 15 ... \n", + "3 22849186 1 15 ... \n", + "4 22853997 1 15 ... \n", + "\n", + " annotation.consequenceTypes \\\n", + "0 [{'geneName': 'TUBGCP5', 'ensemblGeneId': 'ENS... \n", + "1 [{'geneName': 'TUBGCP5', 'ensemblGeneId': 'ENS... \n", + "2 [{'geneName': 'TUBGCP5', 'ensemblGeneId': 'ENS... \n", + "3 [{'geneName': 'TUBGCP5', 'ensemblGeneId': 'ENS... \n", + "4 [{'geneName': 'TUBGCP5', 'ensemblGeneId': 'ENS... \n", + "\n", + " annotation.populationFrequencies \\\n", + "0 [{'study': '1kG_phase3', 'population': 'CLM', ... \n", + "1 [{'study': '1kG_phase3', 'population': 'CLM', ... \n", + "2 [{'study': '1kG_phase3', 'population': 'SAS', ... \n", + "3 [{'study': '1kG_phase3', 'population': 'SAS', ... \n", + "4 [{'study': '1kG_phase3', 'population': 'CLM', ... \n", + "\n", + " annotation.conservation \\\n", + "0 [{'score': -2.075000047683716, 'source': 'phyl... \n", + "1 [{'score': -2.385999917984009, 'source': 'phyl... \n", + "2 [{'score': 0.5910000205039978, 'source': 'phyl... \n", + "3 [{'score': 0.4819999933242798, 'source': 'phyl... \n", + "4 [{'score': -2.4089999198913574, 'source': 'phy... \n", + "\n", + " annotation.traitAssociation \\\n", + "0 [] \n", + "1 [] \n", + "2 [{'source': {'name': 'cosmic'}, 'submissions':... \n", + "3 [] \n", + "4 [] \n", + "\n", + " annotation.functionalScore \\\n", + "0 [{'score': 0.09000015258789062, 'source': 'cad... \n", + "1 [{'score': 0.18000030517578125, 'source': 'cad... \n", + "2 [{'score': 1.390000343322754, 'source': 'cadd_... \n", + "3 [] \n", + "4 [{'score': -0.14999961853027344, 'source': 'ca... \n", + "\n", + " annotation.cytoband \\\n", + "0 [{'chromosome': '15', 'stain': 'gneg', 'name':... \n", + "1 [{'chromosome': '15', 'stain': 'gneg', 'name':... \n", + "2 [{'chromosome': '15', 'stain': 'gneg', 'name':... \n", + "3 [{'chromosome': '15', 'stain': 'gneg', 'name':... \n", + "4 [{'chromosome': '15', 'stain': 'gneg', 'name':... \n", + "\n", + " annotation.repeat \\\n", + "0 [{'id': 'null', 'chromosome': '15', 'start': 2... \n", + "1 [] \n", + "2 [] \n", + "3 [] \n", + "4 [] \n", + "\n", + " annotation.variantTraitAssociation.cosmic \\\n", + "0 NaN \n", + "1 NaN \n", + "2 [{'mutationId': 'COSM3999471', 'primaryHistolo... \n", + "3 NaN \n", + "4 NaN \n", + "\n", + " annotation.geneTraitAssociation annotation.variantTraitAssociation.clinvar \n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN \n", + "\n", + "[5 rows x 27 columns]\n" ] } ], "source": [ "## Convert REST response object 'variants' to Pandas datafrom\n", "df = variants.to_data_frame()\n", - "## formatted_df = df.drop(['names', 'studies'], 1)\n", + "\n", + "formatted_df = df.drop(['names', 'studies'], 1)\n", "\n", "print('The results can be stored and printed as a pandas DF:\\n\\n', formatted_df.head())" ] @@ -241,12 +310,12 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { - "image/png": "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1aujX79+AIDKlStj+PDh8Pf3h4mJCTIyMuDm5obx48cbOFoiIiqKikXCdHJywo0bN3RO27dvXyFHQ0RExqjYNMkSERHlBxMmERGRDEyYREREMjBhEhERycCESUREJAMTJhERkQxMmERERDIwYRIREcnAhElERCQDEyYREZEMTJhEREQyMGESERHJwIRJREQkAxMmERGRDEyYREREMjBhEhERycCESUREJAMTJhERkQxMmERERDIwYRIREcnAhElERCQDEyYREZEMTJhEREQyMGESERHJwIRJREQkAxMmERGRDEaRMOPi4pCcnAwA0Gg02L17N4KDg6HVag0cGRERFRdGkTBHjhyJqKgoAMDSpUuxceNGbN68GQsWLDBwZEREVFwYRcK8f/8+6tSpAwDYu3cvfvrpJ/z88884cOCAgSMjIqLiwtTQAcihUCigVqtx79492NjYoGLFitBqtWIzLRERUUEzioTZsmVLjB8/HgkJCejSpQsA4Pbt26hQoYKBIyMqPGamCqRlSO/bW5opAd7LJyoURpEw582bh+DgYJiamsLX1xcAEB8fj7Fjxxo2MKJCpFJrcOTv+5Iyr2Y1YKk0MUxARMWMUdzD3Lp1K/r27YuePXtCqVQCABo3boxnz54ZODIiIioujCJhBgYG6ixfvXp1IUdCRETFVZFukv37778BAFqtFv/88w8EQRCnPXr0CNbW1oYKjYiIipkinTCnTZsGAFCpVJg6dapYbmJiAjs7O0yfPt1QoRERUTFTpBPmsWPHAACTJ0/GwoUL32kd8fHxmDx5Mh48eABzc3NUq1YNs2bNQtmyZXHx4kX4+/tDpVKhUqVKWLRoEcqVK6fPXSAioveEUdzDzJ4stVqt5OdtTExMMHz4cBw+fBj79u1DlSpVsHjxYmi1WkyaNAn+/v44fPgwGjZsiMWLFxfkbhARkREzioR59epV9O3bF66urqhbty7q1q2LDz/8EHXr1n3rsra2tmjcuLH42dXVFU+ePEFERAQsLCzQsGFDAEC/fv1w6NChAtsHIiIybkW6STbLlClT0LZtW8ybNw+WlpbvvB6tVovt27fD09MT0dHRqFixojitbNmy0Gq1SEhIgK2trex1litX8p3jKWx2djaGDkFvnsenwNraQlKmUChylVlamMKujJWkzBjqIT/79zpJqWqkpqnF9cNUiRKWZihZ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\n", + "image/png": "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1aujX79+AIDKlStj+PDh8Pf3h4mJCTIyMuDm5obx48cbOFoiIiqKikXCdHJywo0bN3RO27dvXyFHQ0RExqjYNMkSERHlBxMmERGRDEyYREREMjBhEhERycCESUREJAMTJhERkQxMmERERDIwYRIREcnAhElERCQDEyYREZEMTJhEREQyMGESERHJwIRJREQkAxMmERGRDEyYREREMjBhEhERycCESUREJAMTJhERkQxMmERERDIwYRIREcnAhElERCQDEyYREZEMTJhEREQyMGESERHJwIRJREQkAxMmERGRDEaRMOPi4pCcnAwA0Gg02L17N4KDg6HVag0cGRERFRdGkTBHjhyJqKgoAMDSpUuxceNGbN68GQsWLDBwZEREVFwYRcK8f/8+6tSpAwDYu3cvfvrpJ/z88884cOCAgSMjIqLiwtTQAcihUCigVqtx79492NjYoGLFitBqtWIzLRERUUEzioTZsmVLjB8/HgkJCejSpQsA4Pbt26hQoYKBIyMqPGamCqRlSO/bW5opAd7LJyoURpEw582bh+DgYJiamsLX1xcAEB8fj7Fjxxo2MKJCpFJrcOTv+5Iyr2Y1YKk0MUxARMWMUdzD3Lp1K/r27YuePXtCqVQCABo3boxnz54ZODIiIioujCJhBgYG6ixfvXp1IUdCRETFVZFukv37778BAFqtFv/88w8EQRCnPXr0CNbW1oYKjYiIipkinTCnTZsGAFCpVJg6dapYbmJiAjs7O0yfPt1QoRERUTFTpBPmsWPHAACTJ0/GwoUL32kd8fHxmDx5Mh48eABzc3NUq1YNs2bNQtmyZXHx4kX4+/tDpVKhUqVKWLRoEcqVK6fPXSAioveEUdzDzJ4stVqt5OdtTExMMHz4cBw+fBj79u1DlSpVsHjxYmi1WkyaNAn+/v44fPgwGjZsiMWLFxfkbhARkREzioR59epV9O3bF66urqhbty7q1q2LDz/8EHXr1n3rsra2tmjcuLH42dXVFU+ePEFERAQsLCzQsGFDAEC/fv1w6NChAtsHIiIybkW6STbLlClT0LZtW8ybNw+WlpbvvB6tVovt27fD09MT0dHRqFixojitbNmy0Gq1SEhIgK2trex1litX8p3jKWx2djaGDkFvnsenwNraQlKmUChylVlamMKujJWkzBjqIT/79zpJqWqkpqnF9cNUiRKWZihZwkw/QRspYzgeqGgwioT5+PFjfPnllzAxyV8H7dmzZ8PKygqDBg3C77//rpfYYmOToNUKb5/RwOzsbPD8+StDh6E3aRoByckqSVnmcInSsjRVhmS/jaUe3nX/3rbOQ3/dAwBYW1sgOVkFr2Y1kJqUpp+gjZAxHA9M6EWHUTTJdujQAadOncrXOgICAhAVFYUff/wRCoUCDg4OePLkiTg9Li4OCoUiT1eXRERUfBjFFaZKpcKYMWPg4eGB8uXLS6bJeXp2yZIliIiIwLp162Bubg4AqFevHtLS0nD+/Hk0bNgQO3bsgJeXV4HET0RExs8oEmatWrVQq1atd1r21q1bWLt2LapXr45+/foBACpXrozAwEAsXLgQM2bMkHQrISIi0sUoEuaYMWPeeVknJyfcuHFD5zR3d3fs27fvnddNRETFh1EkzKwh8nRp2rRpIUZCRETFlVEkzKwh8rLEx8dDrVajQoUK+OOPPwwUFRERFSdGkTCzhsjLotFosHr1ag6+TkRUBHl6emLOnDlo1qyZoUPRK6PoVpKTUqnEqFGjsH79ekOHQmTUzEwVSNMIkh8ojPLfAlGBM9pvxunTp/M9kAFRcadSa3Dor3uSnzS1xtBhkRGbNGkSnjx5glGjRsHNzQ0NGjTA1q1bJfN069ZNHDzGxcUFW7ZsQbt27dC4cWMEBARIxgnftWsXOnfujI8//hjDhg3D48ePC3V/sjOKJtnWrVtLkmNqairS09MxY8YMA0ZFREQ5LVq0CP/++6/YJHvgwAFs2rQJgwcPBgBcv34dz549Q+vWrcVlfv/9d+zevRspKSkYOnQoatasid69e+Po0aNYu3Yt1qxZg2rVqmHdunX4+uuvsWPHDoPsm1EkzJz9I0uUKIEaNWqgZEnjGceViKg4ateuHWbMmIH79++jevXqCA0NRefOncVBZABgxIgRsLW1ha2tLYYMGYKwsDD07t0bO3bswOeffw5HR0cAwKhRo7B27Vo8fvwYlSpVKvR9MYqE2ahRIwCZY2m+ePEC5cuXh4L3WYiIijwLCwt07twZe/fuxZgxYxAWFobly5dL5nFwcBB/r1SpEp49ewYAePLkCebNm4eAgABxuiAIePr0KRPm6yQlJWHWrFk4cOAAMjIyYGpqiq5du2L69OmwseHAxERERVmPHj0wefJkeHh4oESJEnBzc5NMj46OhpOTE4DMJGlvbw8gM5GOGjUK3bt3L/SYdTGKy7Q5c+YgNTUV+/btw+XLl7Fv3z6kpqZizpw5hg6NiIhyKF++PB4+fCh+dnNzg0KhwIIFC3Qmvw0bNiAxMRHR0dHYsmULunTpAiDzPcXr1q3DrVu3AACvXr3CwYMHC2cndDCKhHny5EksXLgQNWrUgLm5OWrUqIH58+fj5MmThg6NiIhy+Pzzz7F69Wo0bNgQGzZsAAD4+Pjg5s2b8PHxyTV/u3bt4OfnB19fX7Rp0wa9evUCkPmmquHDh+Orr76Cu7s7vL29ceLEiULdl+yMoknWwsICcXFxkjbr+Ph4yU1jIiIqGtq3b4/27dtLyipWrAh3d3dUqVIl1/ytW7fGkCFDdK7L19cXvr6+BRFmnhlFwuzVqxc+++wzfPrpp6hYsSKePHmCzZs3o0+fPoYOjSj/FIrcfR/ZxZjeI6mpqfjll18wYMAAQ4eSL0aRMEePHg17e3uEhYXh2bNnsLe3x/Dhw8XLdiJjlvb/Bw/IrmPT6oYJhkjPTp48ibFjx6Jp06bw9vY2dDj5YhQJ08TEBL169WKCJCIyMi1btsTFixdfO/11r18siozioZ85c+bgwoULkrILFy5g7ty5BoqIiIiKG6NImGFhYahXr56krF69eggLCzNQREREVNwYRcI0MTGBIAiSMo1GIxmgl4iIqCAZRcJs2LAhfvzxRzFBarVarFixAg0bNjRwZEREVFwYxUM/06ZNw8iRI9GiRQtUrFgR0dHRsLOzw5o1awwdGhGR0dNotFAq9X/9lJf1Hjx4EGvXroUgCFCpVKhbty5++OEHeHp6wsrKCnv37hXHEPf09MSaNWtw/PhxXLt2DUuXLpWsa8qUKahcuTLGjBmj1/0xioT5wQcfIDg4GJcvX0Z0dDQcHBzQoEEDDsBORKQHSqUCvxy+rvf1DuhUW9Z8z549w/fff4/g4GA4ODhAEARcu3ZNnJ6SkoLQ0FD06NFDspyvry9Wr16Nly9folSpUgCA5ORkHDlyBPv27dPfjvx/RpNxFAoFXF1d0blzZ7i6ujJZEhG9J168eAFTU1PY2toCyHxu5cMPPxSnjxkzBitXrkR6erpkOXt7ezRu3FjyAOjBgwfx0UcfFcjbTJh1iIjIoGrXro0GDRqgTZs2GDduHDZv3oz4+Hhxer169VC3bl1s374917I9e/bEnj17xM979uxBz549CyROJkwiIjIohUKBVatWYevWrWjcuDHCw8PRvXt3JCQkiPNMmDABP/30E5KTkyXLtmnTBk+ePMGtW7dw//593L59Gx06dCiQOI3iHiYREb3/nJ2d4ezsjIEDB6JLly44e/asOK1mzZpo3bo1Nm3aJFnGzMwM3bt3x549e2Bubo6uXbvCwsKiQOIziivM141U7+fnV7iBEBGR3j19+hT//fef+DkmJgZxcXGoXLmyZL6xY8fil19+yXWV2bNnT+zduxchISEF1hwLGMkVZlRUVK4yQRDw6NEjA0RDRET6lJGRgRUrVuDx48ewtLSEVqvFhAkTJA/+AJk9Jnx8fLBx40ZJuZOTEypWrAiVSpVrVDh9KtIJc/LkyQAAtVot/p7l8ePHqFWrliHCIiJ6r2g0WtldQPK6Xjn9MCtVqpQrCWY5duyY5PM333yDb775Jtd8O3fufLcg86BIJ8yqVavq/B0A3N3d4eXlVdghERG9dwpi0IKCXK+hFOmEmTVKw0cffYSWLVsaOBoiIirOinTCzNKyZUvcvXsX169fR0pKimQa35FJRESFwSgS5po1axAYGIjatWvD0tJSLM96sTQREVFBM4qE+fPPP2Pnzp2oXVv/N6WJiIjkMIo7spaWlqhZs6ahwyAiomLMKBLm+PHjMWfOHDx79gxarVbyQ0REVBiMokl2ypQpAKT9bARBgImJieQVMK8TEBCAw4cP4/Hjx9i3bx+cnZ0BZL5TzdzcXBxGaeLEiXwal4iKHUGrgYlCabD1Zr3fcuPGjdi/fz8OHz6MihUrAsj8/1+vXj0MGjQIe/bswbx581C5cmWoVCqYmZmhY8eOGD58uPh8S87/6wAQGBiIypUri9vJygF5ZRQJ848//sjX8u3atcOQIUMwcODAXNOWL1/+zpVHRPQ+MFEoEXfiV72vt2yrvnlexs7ODitWrMD8+fN1Tm/WrBmWL18OAIiNjcW0adMwYcIErFmzRpynoP6vG0XCzO97zRo2bKinSIiIqCD169cP27Ztw+3bt986mlu5cuUQEBCAVq1a4datW3BycirQ2IwiYQKZV5nnzp1DfHw8BEEQyxcuXJiv9U6cOBGCIMDDwwNfffWV+NZuucqVK5mv7RcmOzsbQ4egN8/jU2BtLX0jgUKhyFVmaWEKuzJWkrKiVg9y90Xu/sndjrW1Rb7X+T4oqOMhKVWN1DS1pKyEpRlKljArkO29L6ysrDBy5EgsXboUgYGBb52/dOnSqFatmiRhjhs3TmySVSqVkvdl5odRJMyVK1dix44d6NKlCw4dOoS+ffsiLCwMXbp0ydd6g4KC4ODggPT0dMydOxezZs3C4sWL87SO2NgkaLXC22c0MDs7Gzx//srQYehNmkZAcrJKUqbVanOVpakyJPtdFOtB7r7I2T+527G2tkBysirf6zR2BXk8pGkEHPrrnqTMq1kNpCal5Wk9Re0ErzD06dMHmzZtwqVLl2TNn/0iCii4JlmjeEp29+7d2LhxI6ZOnQozMzNMnToVa9asyffbShwcHAAA5ubmGDBgAC5cuKCPcImIKB/MzMwwduxYLFmy5K3zJiYm4sGDB4XyLIpRJMyXL1+KlWFmZga1Wo0GDRrg3Llz77zOlJQUvHqVeWYpCAIOHDiAOnXq6CVeIiLKn27duiEuLk7yEumc4uLiMHXqVDRt2rRQ3l5lFE2yVatWFdunnZycsH37dpQqVQqlS5eWtfycOXNw5MgRvHjxAkOHDoWtrS3WrFmDsWPHQqPRQKvVwtHRETNmzCjgPSEiIjkUCgW++uorjBo1SlL+119/wdfXF2lpaTA3N0eHDh0wYsQIyTzZ72ECmTmgfv36AIChQ4dCqfy/ri779u2TnUuMImFOmDABCQkJAICvv/4aEydOREpKiuwEN336dEyfPj1XeUhIiB6jJCIyToJW805dQOSsV04/zKx3Xi5YsEBS3rZtW9y4cUP87OfnBz8/P1nryus0OYwiYbZu3Vr8/aOPPsLvv/9uwGiIiN4vBTFoQUGu11CKbMJ89OgRKleuDAB4+PDha+erUqVKYYVERETFWJFNmN26dcN///0HAOjQoQNMTExyPTosd2g8IiKi/CqyCTMrWQLA9evXDRgJERGREXQr0Wg0aN++PdLT0w0dChERFWNFPmEqlUoolUqkpeVtdAwiIiJ9KvIJEwCGDBmCL7/8EmfPnsWDBw/w8OFD8YeIiPJHo9UYfL1qtRrLli1Dp06d0K1bN/j6+mLBggU4ffo0XFxcsG7dOnHeM2fOiN1LunTpghMnTkjWlZycDHd393yPBpdTkb2Hmd3s2bMBAKdPn5aU86EfIqL8UyqU+C0iTO/r7VPPW/a83377LVQqFXbv3o2SJUsiIyMDu3fvRnp6Ouzs7PDzzz+jX79+uV6Q4efnh+DgYLRq1UosO3ToEOrXry/2tNAXo0iYfOiHiOj9df/+fRw9ehTh4eEoWTLzDVCmpqbo27cvzpw5A3t7e7i5ueGnn37C119/LVnW19cXgYGBSExMFEfs2bNnD/r21f9ADEbRJEtERO+vyMhIVKtW7Y1D1I0ePRq7du3Cs2fPJOXly5dHkyZNEBaWeYUcFRWFmzdvomPHjnqP0yiuMDMyMvDLL7/ofB9mUFCQASMjIqLCUL58efTp0werVq1C586dJdN69uyJ1atXY+DAgdizZw+6dOkCS0tLvcdgFFeY8+fPx6+//oqGDRvi6tWr6NixI2JjY9GkSRNDh0ZERPn04YcfIioqComJiW+cb/jw4Th69CgePHggKW/Tpg1iYmJw/fp1hIaGomfPngUSp1EkzCNHjuCnn37CJ598AqVSiU8++QSBgYE4c+aMoUMjIqJ8ql69Ojw9PeHv74+kpCQAmX3wd+7ciZSUFHE+GxsbDB06FKtXr5Ysb2pqiu7du2PatGmwsbFBgwYNCiROo0iYaWlp4sueLS0tkZqaCkdHR0RGRho4MiIi0ocFCxagevXq6NmzJ7y9vdGtWzfcvXsX5ubmkvkGDRoEjSZ3d5VevXohIiKiwK4uASO5h+no6IgrV66gQYMGqFevHlasWIGSJUuiQoUKhg6NiMjoabSaPHUByct6lTLfWGJubo4vv/wSX375Za5pzZs3F3+3sLBAeHh4rnkcHR0lrwIrCEX6ClOr1QIApk6dKr7wc8qUKYiMjMSff/4p9s8kIqJ3JzepFZX1GkqRvsJs1aoVunfvDh8fH7i4uADIbOvevHmzYQMjIqJip0hfYc6cOROPHj1C79690aNHD/z888+Ii4szdFhERFQMFekrzPbt26N9+/Z4+fIlDhw4gNDQUCxatAgtWrRAjx494OnpCTMzM0OHSURExUCRvsLMUqpUKfTr1w/bt2/HwYMHUa9ePcyfPx8tWrQwdGhERFRMGEXCzJKeno4rV67g8uXLePHiBZydnQ0dEhERFRNFukk2y/nz5xEaGopDhw6hbNmy6N69O2bMmIFKlSoZOjQiKsoUCqSppX32LM2UwP9/Ap8oL4p0wlyxYgX27t2LhIQEeHl5Yc2aNfDw8DB0WERkJNLUGhz6656kzKtZDVgqTQwUERmzIp0wL126hAkTJqB9+/awsLAwdDhERFSMFemEuX79ekOHQEREBMDIHvohIiIyFCZMIiIiGZgwiYiIZGDCJCIikoEJk4iISAYmTCIiIhmYMImIiGRgwiQiIpKBCZOIiEgGJkwiIiIZikXCDAgIgKenJ1xcXHDz5k2x/N69e+jbty86deqEvn374v79+4YLkoiIirRikTDbtWuHoKCgXK8DmzFjBgYMGIDDhw9jwIAB8Pf3N1CERERU1BWLhNmwYUM4ODhIymJjYxEZGQlvb28AgLe3NyIjIxEXF2eIEImIqIgrFglTl+joaFSoUAFKpRIAoFQqYW9vj+joaANHRkRERVGRfr2XMShXrqShQ5DNzs7G0CHozfP4FFhbS9+RqlAocpVZWpjCroyVpKyo1YPcfXnd/uVUwtIMJUuYvXU71tYW+V5nUZKUqkZqmlpSZmqifesxUVDHg66/q67jkYxHsU2YDg4OePr0KTQaDZRKJTQaDZ49e5ar6fZtYmOToNUKBRSl/tjZ2eD581eGDkNv0jQCkpNVkjKtVpurLE2VIdnvolgPcvdFV1lKmhpH/r4vKfNqVgOpSWlv3I61tQWSk1X5XmdRkqYRcOive5Kyjk2rv/GYKMjjQdffNefxKEdRO8Erzoptk2y5cuVQp04dhIWFAQDCwsJQp04dlC1b1sCRERFRUVQsrjDnzJmDI0eO4MWLFxg6dChsbW2xf/9+zJw5E1OmTMGqVatQqlQpBAQEGDpUIiIqoopFwpw+fTqmT5+eq9zR0RE7d+40QERERGRsim2TLBERUV4wYRIREcnAhElERCQDEyYREZEMxeKhH6LixMxUgbQMbe4JJoUfC9H7hAmT6D2jUmtyDTwAZHbiJ6J3xyZZIiIiGZgwiYiIZGDCJCIikoEJk4iISAYmTCIiIhmYMImIiGRgtxKivFIokKbWSIoszZSAVkffR9JNRx0CgKW5KdLSM6RlRa1u+fcvtpgwifIoTa3J9aJir2Y1YKnkyABy6apDILOvqK6XVxeluuXfv/hikywREZEMTJhEREQyMGESERHJwIRJREQkAxMmERGRDEyYREREMjBhEhERycCESUREJAMTJhERkQxMmERERDIwYRIREcnAhElERCQDEyYREZEMTJhEREQyMGESERHJwIRJREQkA18gTUT6o1AgTa2RFFmaKQGttsC3A76/mQoYEyYR6U2aWoNDf92TlHk1qwFLpX6zma7tdGxaXa/bIMqJTbJEREQyMGESERHJwIRJREQkQ7G/h+np6Qlzc3NYWFgAACZOnIiWLVsaOCoiIipqin3CBIDly5fD2dnZ0GEQEVERxiZZIiIiGXiFicxmWEEQ4OHhga+++gqlSpUydEhERFTEFPuEGRQUBAcHB6Snp2Pu3LmYNWsWFi9eLHv5cuVKFmB0+mVnZ2PoEPTmeXwKrK0tJGUKhSJXmaWFKezKWEnK8lsPuratazv5WZ+ufclPma5ya2sL2cvL3T+5daNrvrxsOz91lnN9eT0eXrePOZmaaPV6nJDhFfuE6eDgAAAwNzfHgAEDMHr06DwtHxubBK1WKIjQ9MrOzgbPn78ydBh6k6YRkJyskpRptdpcZWmqDMl+66MedG0753byuz5d+5Kfspzl1tYWSE5WyV5e7v7JrRtd8+Vl2/mps+zre5fjQde2U9LUOPL3fUlZx6bV9XKcvE8nusauWN/DTElJwatXmQevIAg4cOAA6tSpY+CoiIioKCrWV5ixsbEYO3YsNBoNtFotHB0dMWPGDEOHRURERVCxTphVqlRBSEiIocMgIiIjUKybZImIiORiwiQiIpKBCZOIiEgGJkwiIiIZivVDP0VaYb25nqiYMTNVIC0j83v0PD4FaRoBluamSEvPkMynqwwAoN93YZMRYcIsogrrzfVExY1KrREHGcgawKFj0+o6Bx7IWZZVTsUTm2SJiIhkYMIkIiKSgQmTiIhIBiZMIiIiGZgwiYiIZGDCJCIikoEJk4iISAb2w6Tih4NCFKrsAwWIDNid2ASAGdIBAJq0DJhBy7EISBYmTCp2OChE4co+UEAWw3b+F5D25C4AwMzcFOr0DABOBoyHjAWbZImIiGRgwiQiIpKBCZOIiEgGJkwiIiIZmDCJiIhkYMIkIiKSgQmTiIhIBvbDLAp0dKRnT+o3MzXRip3Ps+SnynR1rn/dYAa6tm1qogWgzEcE7yZ7J/zsZe+TojbwARVfTJhFgK6O9Hyr+1sIWrHz+f95987nujrXv3YwA13bFhxhiISZvRP+/3m/OuEXvYEPqLhikywREZEMTJhEREQyMGESERHJwIRJREQkAxMmERGRDEyYREREMrBbSWGT2edSV/86Q/X1M2Y5+/A9j0+RXd/mZgqkqXP3w1SYGOZvoLvPpfBOy+vlxck6jmWFSf76heraRwUEWWW6tpPfOiPKjgmzkMnvc6mjf53B+voZr5x9+KytLdC8gYOOOXPXtyrdCYf/jso1Z6em1fQcpVy6jola77S8Pl6crOtY7tS0Wj77hereR1llOreT3zoj+j9skiUiIpKBCZOIiEgGJkwiIiIZmDCJiIhkKPYJ8969e+jbty86deqEvn374v79+4YOiYiIiqBinzBnzJiBAQMG4PDhwxgwYAD8/f0NHRIRERVBxbpbSWxsLCIjI7Fp0yYAgLe3N2bPno24uDiULVtW1joUirz1ZFMCKGllJi1TmugoU8DGxipXWV63l11+li1qlNBdP2+rWytLszzVd8753jTvu9Zvfo+Jd4nb1MwUGeoMWXWWVZZz/3TH/W5/l3fZR3nbefOyea2H15Xnpex9+h4WNyaCIBTbXrwRERH45ptvsH//frGsS5cuWLRoEerWrWvAyIiIqKgp9k2yREREchTrhOng4ICnT59Co8kc3kuj0eDZs2dwcNA1EgwRERVnxTphlitXDnXq1EFYWBgAICwsDHXq1JF9/5KIiIqPYn0PEwDu3LmDKVOm4OXLlyhVqhQCAgJQs2ZNQ4dFRERFTLFPmERERHIU6yZZIiIiuZgwiYiIZGDCJCIikoEJk4iISIZiPTSesYuPj8fkyZPx4MEDmJubo1q1apg1a1aubjGhoaFYv3497ty5g6lTp2LQoEHitClTpuCvv/5CmTJlAABeXl4YPXp0oe5Hfsmth++//x5///03zM3NYWVlhWnTpqF+/foAgBcvXmDy5Ml4/PgxLCwsMHv2bHz00UeG2J13po96GDx4MJ48eYKSJUsCAIYMGYKePXsW+r7kh9x6WL16NQ4cOAClUglBEDBy5Eh06dIFAJCamopvv/0WV69ehVKpxDfffIO2bdsaYneoKBHIaMXHxwv//POP+HnBggXCt99+m2u+GzduCLdu3RImTZokbN26VTLtm2++yVVmbOTWw7Fjx4T09HTx93bt2onTpkyZIgQGBgqCIAjnzp0TOnToIGi12gKOXL/0UQ+DBg0Sjh07VvDBFiC59fDy5Uvx95iYGMHNzU1ISEgQBEEQVqxYIUybNk0QBEG4d++e0KxZMyEpKamAI6eijk2yRszW1haNGzcWP7u6uuLJkye55nN2dkatWrWgULyff2659dC2bVuYmZmJ88TExECr1QIADh06hH79+gEAGjZsCHNzc1y5cqUQotcffdTD+0BuPdjY2Ii/p6SkwMTERKyHgwcPom/fvgCA6tWro169ejhx4kQBR05F3fv5H7QY0mq12L59Ozw9PfO87KZNm9CtWzd88cUXuHPnTgFEV3jk1kNQUBDatGkDhUKB+Ph4CIIgabJzcHBATExMQYdbYN6lHrIsXLgQ3bp1w8SJE/H06dOCDrVAva0etm/fDi8vL/To0QOzZ88Wb008efIElSpVEucz9uOB9IP3MN8Ts2fPhpWVleT+pBxffvkl7OzsoFAoEBISguHDh+Po0aNQKpUFFGnBklMP+/fvx759+xAUFFSIkRWud62HhQsXwsHBARqNBmvXrsWECROwffv2wgi5QLytHvr374/+/fvjxo0bmDhxIpo2bSomTaKceIX5HggICEBUVBR+/PHHPDe7VqhQQVzG19cXKSkpRnsmLacefv/9dyxduhQbNmxA+fLlAUD8BxkXFyfOFx0djQ8++KDggy4A71oPAMQXDyiVSgwZMgSXLl0y2ubavHwvXFxcYG9vj7NnzwIAKlasiMePH4vTjfl4IP1hwjRyS5YsQUREBAIDA2Fubp7n5bM3uZ08eRIKhQIVKlTQZ4iFQk49/Pnnn5g/fz42bNiAypUrS6Z5eXlhx44dAIDz588jLS0N9erVK/C49S0/9ZCRkYEXL16In/fv3w9nZ2ejvPctpx5u374t/v7w4UNcu3YNtWrVApB5PPz6668AgPv37+PKlSto2bJlwQdORRrHkjVit27dgre3N6pXrw5LS0sAQOXKlREYGAgfHx+sW7cOFSpUQFhYGBYuXIiXL1/CzMwMJUqUwMaNG1GrVi18+umniI2NhYmJCUqWLInJkyfD1dXVsDuWR3LroUmTJjAzM5Pcq9y8eTPKlCmD58+fY9KkSXjy5AksLCzw/fffw93d3VC79E7yWw8WFhYYNGgQ1Go1AMDe3h7Tpk0zupcRyK2H8ePH4/bt2zA1NYVSqcTw4cPFbiUpKSmYMmUKrl27BoVCgUmTJqF9+/aG3C0qApgwiYiIZDC+thYiIiIDYMIkIiKSgQmTiIhIBiZMIiIiGThwARGRHgUEBODw4cN4/Pgx9u3bB2dn5zfOf+HCBXz//ffi59jYWNjZ2SE4OLigQ6U84hUmvdGKFSswceJEQ4dBxdzgwYOxc+dOQ4chS7t27RAUFCQZWu9N3N3dERoaKv40aNAA3t7eBRwlvQsmTMK+ffvg5+cHNzc3tGjRAsOHD8f58+ffeX3btm2Dn58f6tWrhylTpkimPXr0CC4uLnBzcxN/AgMDX7uugIAAdOzYEW5ubvDy8kJISIhk+nfffYdOnTqhdu3a2LNnj2RacHAw/Pz84O7ujlatWmHhwoXIyMjItY379++jfv36khOD48ePo3///mjYsCGaN2+OadOmISkpSZyenp6Ob7/9Fu7u7mjevDk2bdokWefOnTvRoUMHuLm5YdiwYZIBIv755x8MHjwYHh4essb+Xb9+Pby9veHm5gZPT0+sX79eMn3w4MFo0qQJ3N3d0b17dxw9elT2frytfjUaDZYuXYoWLVrAzc0Nvr6+ePnyJQBAEAQsXboULVu2hIeHBwYPHoxbt26Jy3bt2lXyd/7www8xatSoXPsXEhICFxcXo0mIb9OwYUNxxKTsLl26hMGDB8PPzw9+fn44fvx4rnliY2Nx+vRp+Pj4FEKklGeGfFUKGd7GjRuFJk2aCIcPHxaSk5OF9PR04Y8//hAWLFggCIIgLF++XPj6669lrUutVguCIAiHDx8Wfv/9d8Hf31/45ptvJPM8fPhQcHZ2Fud9m2XLlgm3b98WNBqNcPHiRaFhw4bCv//+K07ftm2b8Ndffwk9evQQdu/eLVk2KChIOHfunKBSqYSYmBihR48ewtq1a3NtY+jQoUL//v0l+7l3714hPDxcSElJERISEoRhw4YJ3333nTh98eLFQv/+/YWEhATh9u3bQrNmzYTw8HBBEAThn3/+EZo0aSLcvHlTUKlUgr+/vzBw4EBx2UuXLgnBwcHCjh07hLZt2761DtatWydEREQIarVauHPnjtCmTRshLCxMnH7t2jWxPi9evCi4uroKT58+lbUfb6vfJUuWCIMHDxYePXokaLVa4caNG0JaWpogCIKwf/9+oXnz5sKDBw+EjIwMYfHixYKvr6/OfdBqtULbtm2F4OBgSXlCQoLQqVMnoWvXrsJvv/322joYNGjQG6cXRW3bthVu3LghCIIgJCYmCj4+PuLf5enTp0LLli2FxMREyTLr168XRo8eXeixkjy8wizGXr16heXLl8Pf3x8dO3aElZUVzMzM4OnpiW+++UacT61WY/LkyXBzc0PXrl0lr73y9PTEunXr0K1bN7i6uiIjIwMdO3ZE+/btYWtrm+8Yx40bB0dHRygUCnz00Ufw8PDAxYsXxekDBw5E06ZNYWFhkWvZAQMGiK/qqlChArp164YLFy5I5tm/fz9sbGzQtGlTSXm3bt3QqlUrlChRAqVLl0afPn3w33//idODg4PxxRdfoHTp0nB0dETv3r3Fe07Hjx+Hl5cXnJycYG5uji+++ALnzp3DgwcPAAANGjSAr68vqlSpIqsORowYgbp168LU1BQ1a9ZEu3btJPtRu3ZtmJpmPo5gYmKCjIwMcTzgt+3Hm+o3MTERW7ZswZw5c1CpUiWYmJjA2dlZrOtHjx7Bw8MDVapUgVKpRPfu3SXDzWV37tw5xMfHo2PHjpLyH374AYMHD5Y14PmDBw/Qq1cvuLu7Y/To0UhISBDjcHFxwa+//ooWLVqgRYsW2LBhg6y6LSz//fcfHj16hBEjRsDHxwcjRoyAiYkJoqKiJPPt2bPH6F7YXZwwYRZj//33H1QqFTp06PDG+Y4dO4auXbvi/Pnz8PT0xOzZsyXT9+/fj3Xr1uH8+fPiP+63adu2LVq1aoVvv/1WMuj5unXrMHLkSJ3LpKWlISIiQhzvM6/OnTsnWTYpKQnLly/Ht99+m6dlExMT8fz5c9SuXVucXrt2bUmyEHQMoHXz5s13ijs7QRBw/vz5XHUwcuRI1K9fH71790ajRo1eOw5uzjrILmf93rx5E0qlEocOHULz5s3RqVMnyZtNunbtiocPH+LevXtQq9UIDg5+7XirwcHB6NSpE6ysrMSyy5cvIyIiAv3795e17yEhIZg3bx5OnToFU1NTzJkzRzL9zJkzOHLkCDZs2ICffvoJf/31l6z1FgZBEODi4iK5VxkeHo769euL81y8eBGJiYlo3bq1ASOlN2HCLMYSEhJQpkyZtyY5Dw8PtG7dGkqlEj4+Prh+/bpk+uDBg+Hg4CCO2/kmZcqUwa5du/Dnn39iz549SE5OxqRJk8Tpn3/+OdauXatz2RkzZsDFxeWdBsHetWsXIiIi8Nlnn4llP/74I3r27PnWt1CcPn0aISEhGDduHIDMcUYB6QuIbWxskJycDABo2bIlDh48iOvXryMtLQ2BgYEwMTFBWlpanuPOacWKFdBqtbmuQtauXYsLFy5g3bp1aNGihc4B03PuR0456zcmJgavXr3C/fv38ccff2DZsmVYsWIFTp8+DQCws7ODu7s7vLy88NFHH+HQoUM6Tz5SU1Nx+PBh9OjRQyzTaDSYOXMm/P39ZQ/u7uPjA2dnZ1hZWWH8+PE4dOgQNBqNOP1///sfrKys4OLiAj8/P4SFhclab2Fwc3NDVFQU/vnnH7Hs8uXLkhOr3bt3o3v37rJPOqnwMWEWY7a2toiPj9f5IEx22V//ZGlpCZVKJVlG1wMOr2NtbY369evD1NQU5cuXx3fffYdTp05JHkTRJSAgALdu3cKyZctgYmIie3sAcPToUSxZsgQ//fSTOOD4tWvX8Pfff+PTTz9947IXL17E119/jeXLl6NGjRoAIF4lZY85KSkJ1tbWAIBmzZph3LhxGDduHDw9PVGpUiVYW1vLej3UmjVrxIdk/P39JdO2bduGkJAQrFu3TucbOMzMzNC6dWucOnUKf/zxx1v3Iztd9Zt1AvS///0PlpaWqF27Nrp27Yrw8HAAQGBgICIiIhAeHo7Lly9jzJgx+OSTT5CamipZ95EjR2Bra4tGjRqJZb/88gtcXFzyNNB/9uOsYsWKUKvViI+P1zm9UqVKePbsmex169OcOXPQqlUrxMTEYOjQoejatStKly6NVatWITAwEN27d0fnzp2xcuVKMWGmpaXhwIEDbI4t4ngqU4y5ubnB3NwcR48ehZeX1zuvJ68JTNeyupowsyxfvhwnT57E1q1bUbJkyTyt/8SJE5g+fTrWrVsHFxcXsfzMmTN4/Pgx2rZtCyDzqlGj0aBHjx7ivcjIyEiMHj0a8+bNk9zjLF26NOzs7HD9+nU0b94cAHD9+nVJU+fAgQMxcOBAAMC9e/ewevVqODk5vTXeUaNG6XySdNeuXVi3bh2CgoLemng1Gg0ePnwofn7dfmR5Xf1m1Vf2v2/2369fv47OnTuL8fj5+WHevHm4ffu2pKkxJCQEPj4+kmX//vtvnDt3DidOnACQ2cwdGRmJa9eu5TpRyBIdHS353czMDGXKlBHLo6Oj4ejoCAB48uQJ7O3t31hPBWX69OmYPn16rvIGDRpg69atOpextLTEv//+W9ChUT7xCrMYs7Gxwbhx4zBr1iwcPXoUqampUKvVCA8Px8KFC995vRkZGVCpVNBqtdBoNJIr0kuXLuHu3bvQarWIj4/HnDlz0KhRI0nzZnZr165FWFgYNm3apPPBkPT0dKhUKgiCINkukPlPedKkSVixYgUaNGggWa5v3774/fffERISgpCQEPTr1w9t2rQRHxa5efMmhg8fju+++05n1w9fX1+sXr0aiYmJuHPnDnbu3Ck2OapUKty8eROCIODJkyfw9/fHkCFDULp0aQCAVquFSqWCWq2GIAhQqVRIT09/bX3u3bsXS5cuxaZNm3I9KHTnzh2Eh4cjLS0NarUaoaGhOH/+PD7++GNZ+/Gm+q1atSoaNmyINWvWID09HXfu3MH+/fvFk4z69evj0KFDePHiBbRaLUJCQpCRkYFq1aqJ64iJicGZM2ckzbEAsGDBAhw4cECs/3r16mHMmDH48ssv31gPt2/fRmpqKpYtW4ZOnTpBqVSK01etWoXU1FTcunULe/bsEV/VRaQvvMIs5j777DOUL18eq1atwsSJE2FtbY26devqvMqRa/Xq1Vi5cqX4ee/evRgzZgzGjh2Lhw8fYsmSJYiLi0PJkiXRrFkzLFmyRJx3zZo1OH/+vNjXcMmSJTAzM5M8XTly5EgxvmHDhuHs2bMAMh9i+u6777BlyxY0btwYq1atwqtXr/D555+Ly3p4eGD9+vUoUaIESpQoIZZbWVnB3NxcbLLdtGkT4uLiMG3aNEybNg1AZjPg/v37AWQ+XTpjxgy0bdsWlpaWGDFiBFq1agUgM2F+/fXXePjwIaytreHn54fx48eL2zp37hyGDBkifm7QoAEaNWr02quPH3/8EQkJCejVq5dY1q1bN8yaNQsAsHLlSkyYMAFKpRLVqlXD0qVLUbduXVn78bb6XbJkCaZOnYrGjRujbNmyGD9+vHiVOmLECMTGxsLX1xcpKSmoVq0ali9fjlKlSonrCg0NhaurK6pWrSrZp+zzAJnNySVLlnztiROQeQ9zypQpuHv3Lho1aoSZM2dKpjdq1AgdOnSAIAj47LPP0KJFi9eui+hd8H2YRGTUHj16hHbt2uHq1at8YIYKFJtkiYiIZGDCJCIikoFNskRERDLwCpOIiEgGJkwiIiIZmDCJiIhkYMIkIiKSgQmTiIhIBiZMIiIiGf4fkMmwljC/eJsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] @@ -296,7 +365,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -305,7 +374,7 @@ "text": [ "Filter by SNV\n", "------------------\n", - "#Time: 355\n", + "#Time: 461\n", "#Num matches: 288538\n", "#Num results: 5\n", "#Num inserted: 0\n", @@ -313,7 +382,7 @@ "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", - "1:745347:T:C\tRP11-206L10.8,RP11-206L10.10,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", + "1:745347:T:C\tRP11-206L10.9,RP11-206L10.8,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", "1:753405:C:A\tRP11-206L10.10,FAM87B\tnon_coding_transcript_exon_variant\n", @@ -321,7 +390,7 @@ "\n", "Filter by SNV.INDEL\n", "------------------------\n", - "#Time: 343\n", + "#Time: 340\n", "#Num matches: 300709\n", "#Num results: 5\n", "#Num inserted: 0\n", @@ -329,22 +398,22 @@ "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", - "1:745347:T:C\tRP11-206L10.8,RP11-206L10.10,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", - "1:745371:A:-\tRP11-206L10.8,RP11-206L10.10,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", + "1:745347:T:C\tRP11-206L10.9,RP11-206L10.8,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "1:745371:A:-\tRP11-206L10.9,RP11-206L10.8,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", "\n", "\n", "Filter by DELETION\n", "-----------------------\n", - "#Time: 339\n", + "#Time: 401\n", "#Num matches: 1\n", "#Num results: 1\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "12:133197450:GCCTGGGACTGACCCGGGCTCTCGAGGGGCCTCTCGTGTGCCCTTGTGACCCCCTTCCCTG:-\tP2RX2,POLE\tintron_variant\n" + "12:133197450:GCCTGGGACTGACCCGGGCTCTCGAGGGGCCTCTCGTGTGCCCTTGTGACCCCCTTCCCTG:-\tPOLE,P2RX2\tintron_variant\n" ] } ], @@ -379,7 +448,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -388,32 +457,32 @@ "text": [ "Filter by Transcripts: ['ENST00000530893']\n", "-----------------------------------------------\n", - "#Time: 476\n", + "#Time: 382\n", "#Num matches: 10\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "13:32884653:G:T\tZAR1L,BRCA2\tintron_variant\n", - "13:32889968:G:A\tZAR1L,BRCA2\tintron_variant\n", - "13:32890572:G:A\tZAR1L,BRCA2\t5_prime_UTR_variant\n", + "13:32884653:G:T\tBRCA2,ZAR1L\tintron_variant\n", + "13:32889968:G:A\tBRCA2,ZAR1L\tintron_variant\n", + "13:32890572:G:A\tBRCA2,ZAR1L\t5_prime_UTR_variant\n", "13:32900933:T:A\tBRCA2\tintron_variant\n", "13:32903685:C:T\tBRCA2\tintron_variant\n", "\n", "\n", "Filter by Genes: BRCA2\n", "---------------------------\n", - "#Time: 346\n", + "#Time: 380\n", "#Num matches: 26\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "13:32884653:G:T\tZAR1L,BRCA2\tintron_variant\n", - "13:32889968:G:A\tZAR1L,BRCA2\tintron_variant\n", - "13:32890572:G:A\tZAR1L,BRCA2\t5_prime_UTR_variant\n", + "13:32884653:G:T\tBRCA2,ZAR1L\tintron_variant\n", + "13:32889968:G:A\tBRCA2,ZAR1L\tintron_variant\n", + "13:32890572:G:A\tBRCA2,ZAR1L\t5_prime_UTR_variant\n", "13:32900933:T:A\tBRCA2\tintron_variant\n", "13:32903685:C:T\tBRCA2\tintron_variant\n" ] @@ -444,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -453,7 +522,7 @@ "text": [ "Filter by missense_variant:\n", "--------------------------------\n", - "#Time: 326\n", + "#Time: 339\n", "#Num matches: 15401\n", "#Num results: 5\n", "#Num inserted: 0\n", @@ -485,16 +554,16 @@ "\n", "Filter by lof:\n", "-------------------\n", - "#Time: 393\n", + "#Time: 319\n", "#Num matches: 5075\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:897730:C:T\tNOC2L,PLEKHN1,KLHL17\tsplice_region_variant\n", + "1:897730:C:T\tPLEKHN1,NOC2L,KLHL17\tsplice_region_variant\n", "1:977330:T:C\tAGRN\tsplice_region_variant\n", - "1:987200:C:T\tAGRN,RP11-54O7.14\tsplice_region_variant\n", + "1:987200:C:T\tRP11-54O7.14,AGRN\tsplice_region_variant\n", "1:1233941:T:C\tACAP3\tsplice_region_variant\n", "1:1558792:T:C\tMIB2\tstart_lost\n" ] @@ -523,15 +592,97 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Filter by Population Frequencies" + "## Filter by Population Frequencies\n", + "\n", + "OpenCGA allows to filter variants by population frequencies, including:\n", + "- Minor Allele frequency with the parameter `populationFrequencyMaf`\n", + "- Reference Allele frequency with the parameter `populationFrequencyRef`\n", + "- Alternate Allele frequency with the parameter `populationFrequencyAlt`\n", + "\n", + "The population studies included in OpenCGA include sources as **genomAD** and the **1000 Genomes**.\n", + "\n", + "The structure for the query string should be: `{study}:{population}:{cohort}[<|>|<=|>=]{proportion}`" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by population freq maf:\n", + "-----------------------------------\n", + "#Time: 349\n", + "#Num matches: 300711\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", + "1:745347:T:C\tRP11-206L10.9,RP11-206L10.8,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "1:745371:A:-\tRP11-206L10.9,RP11-206L10.8,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", + "\n", + "\n", + "Filter by population freq ref:\n", + "-----------------------------------\n", + "#Time: 583\n", + "#Num matches: 21153\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:758324:T:C\tLINC00115,LINC01128,FAM87B\tupstream_gene_variant\n", + "1:780027:G:T\tLINC01128\tintron_variant\n", + "1:909768:A:G\tC1orf170,PLEKHN1\tintron_variant\n", + "1:914876:T:C\tC1orf170,PLEKHN1\tmissense_variant\n", + "1:982462:T:C\tAGRN\tintron_variant\n", + "\n", + "\n", + "Filter by population freq alt:\n", + "-----------------------------------\n", + "#Time: 712\n", + "#Num matches: 47138\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", + "1:745347:T:C\tRP11-206L10.9,RP11-206L10.8,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "1:745371:A:-\tRP11-206L10.9,RP11-206L10.8,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "1:14907:A:G\tDDX11L1,WASH7P\tintron_variant\n", + "1:14948:G:A\tDDX11L1,WASH7P\tintron_variant\n" + ] + } + ], + "source": [ + "## Filter by population frequency maf\n", + "populationFrequencyMaf='gnomAD_NFE:ALL<0.01'\n", + "variants = oc.variants.query(study=study, populationFrequencyMaf=populationFrequencyMaf, limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq maf:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by population frequency reference \n", + "populationFrequencyRef='1kG_phase3:ALL<0.05'\n", + "variants = oc.variants.query(study=study, populationFrequencyRef=populationFrequencyRef, limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq ref:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by population frequency alternate\n", + "populationFrequencyAlt='1kG_phase3:ALL<0.01'\n", + "variants = oc.variants.query(study=study, populationFrequencyAlt=populationFrequencyAlt, limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq alt:') # metadata=False\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" + ] }, { "cell_type": "markdown", @@ -830,25 +981,20 @@ "source": [ "## Fetch all samples per Variant\n", "\n", - "1. choose one variant\n", - "2. get samples\n", - "3. go to catalog" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Situation:** I am interested in getting a list of all participants in the study, that have:\n", - "(A) SNVs in NOD2 gene that have MAF of <0.01 in gnomad_NFE AND are missense, start_lost, stop_gained, or stop_lost\n", - "split by hets and homs.\n", + "1. Apply different filters to obtain the desired variants\n", + "2. Get the samples containing those variants\n", + "3. Query **Catalog** to retrieve the phenotypes of the samples\n", "\n", - "- How I can submit this query but instead of NOD2, for a list of 10 genes (example list: IL3, IL31, IL32, IL34, IL6, IL6R, IL10RA, IL10RB, IL7, IL7R) to the openCGA server" + "**Situation:** I am interested in getting a list of all participants in the study, that have:\n", + "- SNVs in a list of genes (IL3, IL31, IL32, IL34, IL6, IL6R, IL10RA, IL10RB, IL7, IL7R) \n", + "- MAF of <0.01 in gnomad_NFE AND \n", + "- missense, start_lost, stop_gained, or stop_lost\n", + "- Split by hets and homs." ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 20, "metadata": { "pycharm": { "is_executing": true @@ -857,18 +1003,15 @@ "outputs": [], "source": [ "# Define the parameters of the variants we want to query\n", - "\n", - "genes = ['NOD2','IL3']\n", - "limit = 5\n", + "genes = ['IL3,IL31,IL32,IL34,IL6,IL6R,IL10RA,IL10RB,IL7,IL7R']\n", "type = ['SNV']\n", "ct = ['missense_variant','start_lost','stop_gained','stop_lost'] #List of SO consequence types, e.g. missense_variant,stop_lost or SO:0001583,SO:0001578\n", - "populationFrequencyMaf='gnomAD:ALL<0.01'\n", - "\n" + "populationFrequencyMaf='gnomAD:ALL<0.01'\n" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 21, "metadata": { "pycharm": { "is_executing": true @@ -879,26 +1022,67 @@ "name": "stdout", "output_type": "stream", "text": [ - "#Time: 460\n", - "#Num matches: 1\n", - "#Num results: 1\n", + "Complex Variant Filter:\n", + "----------------------------\n", + "#Time: 456\n", + "#Num matches: 12\n", + "#Num results: 12\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", - "#id\n", - "16:50744624:C:T\n" + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "21:34640788:A:G\tIFNAR2,IL10RB,IL10RB-AS1,AP000295.9\tmissense_variant\n", + "5:35861068:T:C\tIL7R\tmissense_variant\n", + "5:35871190:G:A\tIL7R\tmissense_variant\n", + "5:35874575:C:T\tIL7R\tmissense_variant\n", + "16:3119304:A:G\tIL32,RNU1-125P\tmissense_variant\n", + "16:70690989:G:C\tFLJ00418,IL34,MTSS1L\tmissense_variant\n", + "1:154426970:A:C\tIL6R\tmissense_variant\n", + "11:117857338:G:C\tIL10RA\tmissense_variant\n", + "11:117860305:G:A\tIL10RA\tmissense_variant\n", + "11:117864047:A:G\tIL10RA\tmissense_variant\n", + "11:117864846:A:G\tIL10RA\tmissense_variant\n", + "11:117869670:A:G\tIL10RA\tmissense_variant\n" ] } ], "source": [ - "variants = variant_client.query(study=study, gene=genes, type=type, ct=ct, \n", - " populationFrequencyMaf=populationFrequencyMaf, limit=limit) \n", + "## Filter by various parameters\n", + "variants = oc.variants.query(study=study, gene=genes, type=type, ct=ct, \n", + " populationFrequencyMaf=populationFrequencyMaf) \n", "\n", "\n", - "variants.print_results('id')\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Complex Variant Filter:') # metadata=False\n", + "df = variants.to_data_frame()\n", "#pprint(variants.get_result(0))\n" ] }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['21:34640788:A:G', '5:35861068:T:C', '5:35871190:G:A', '5:35874575:C:T', '16:3119304:A:G', '16:70690989:G:C', '1:154426970:A:C', '11:117857338:G:C', '11:117860305:G:A', '11:117864047:A:G', '11:117864846:A:G', '11:117869670:A:G']\n" + ] + } + ], + "source": [ + "## Obtain the variant ids from the last query\n", + "variant_ids = list(df['id'])\n", + "print(variant_ids)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": { @@ -918,7 +1102,9 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n" + ] } ], "metadata": { @@ -937,7 +1123,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/test2.py b/opencga-client/src/main/python/notebooks/user-training/test2.py new file mode 100644 index 00000000000..0c8a7a18cff --- /dev/null +++ b/opencga-client/src/main/python/notebooks/user-training/test2.py @@ -0,0 +1,290 @@ +#%% md + +# Overview +------ + +This notebook is intended to provide guidance for querying variants in the OpenCGA server through *pyopencga* from the studies that your user has access to; you can combine the filtration of variants with the exploration of their related clinical data (Samples, Individuals Genotypes etc.).
+ +It is also recommended to get a taste of the clinical data we are encountering in the study: How many samples and individuals does the study have? Is there any defined cohorts? Can we get some statistics about the genotypes of the samples in the Sudy? + +For guidance on how to loggin and get started with *opencga* you can refer to : [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
+ +A good first step when start working with OpenCGA is to explore **Catalog**, which holds: information about our user, the projects and studies our user has permission to access and the clinical data from the studies. For guidance you can refer to : [pyopencga_catalog.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
+ +**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL: +- https://ws.opencb.org/opencga-prod/webservices/ + + +#%% md + +## Setup the Client and Login into *pyopencga* + +**Configuration and Credentials** + +Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)). + +You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file. + + +#%% + +# Step 1. Import pyopencga dependecies +from pyopencga.opencga_config import ClientConfiguration # import configuration module +from pyopencga.opencga_client import OpencgaClient # import client module +from pprint import pprint +import json +import matplotlib.pyplot as plt +import seaborn as sns +import datetime +#import pyjq + +# Step 2. OpenCGA host +host = 'https://ws.opencb.org/opencga-prod' + +# Step 3. User credentials +user = 'demouser' +passwd = 'demouser' ## you can skip this, see below. +#################################### + +# Step 4. Create the ClientConfiguration dict +config_dict = {'rest': { + 'host': host + } + } + +# Step 5. Create the ClientConfiguration and OpenCGA client +config = ClientConfiguration(config_dict) +oc = OpencgaClient(config) + +# Step 6. Login to OpenCGA using the OpenCGA client +# Pass the credentials to the client +# (here we put only the user in order to be asked for the password interactively) +# oc.login(user) + +# or you can pass the user and passwd +oc.login(user, passwd) + +print('Logged succesfuly to {}, {} well done!'.format(host, oc.token)) + + +#%% md + +## Setup OpenCGA Variables + +#%% md + +Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. + + +#%% + +## Define the OpenCGA variables to query data +study = 'family:corpasome' + +# You can define list using string with commas +genes='BRCA2' + +# or you can use python lists +transcripts=['ENST00000530893'] + +RESULT_SEPARATOR='\n' + +#%% md + +# Querying Variants: Filter by Variant Annotation +------ + +#%% md + +In this section you will learn how to query variants filtering by **Variant Annotation**, this is one of the most useful and rich web service with many filter parameters. + +You can query variants using the following function: + +` + oc.variants.query() +` + +#%% md + +## Filter by Region + +The format used for referring to genomic coordinates in *OpenCGA* is as follows: + +**1:10000-20000 : Chromosome 1, from position 10000 to 200000 bp** + +#%% + +# Perform the query +variants = oc.variants.query(study=study, region='15:21242091-23226874', include='id') + +# Print the results +#variants.print_results('id') +assert jq.compile(".").input(variants).text() + +#%% md + +The new function `.to_data_frame()` added in the *pyopencga* release 2.0.1.1, allows you store the results as a *pandas* dataframe object: + +#%% + +df = variants.to_data_frame() +formatted_df = df.drop(['names', 'studies'], 1) +print('The results can be stored and printed as a pandas DF:\n\n', formatted_df.head()) + +#%% md + +With the *pandas dataframe* object, you can create plots using *maplotlib* or *seaborn* python libraries to show the results: + +#%% + +# Create a plot with the results: + +sns.set_theme(style="darkgrid") +sns.color_palette('deep') +sns.displot(data=df, hue='type', hue_order=['INDEL','SNP','SNV'], x="start", bins=50) # multiple= "dodge", 'stack' +plt.title('Variants in Region of Chromosome 15', fontsize=20, fontweight='bold' ) +plt.xlabel('Chr15:21242091-23226874 bp', fontsize=12) +plt.ylabel('Variant counts', fontsize=12) +sns.despine(left=False) +plt.show() + +#%% md + +## Filter by Gene + +We can filter variants by gene using the parameters `xref` or `gene`: +* **xref**: you can filter by different IDs including gene, transcrit, dbSNP, ... +* **gene**: only accepts gene IDs + +Remember you can pass different IDs using comma as separator. + +#%% + +# Filter by xref +variants = oc.variants.query(study=study, xref=transcripts, limit=5) # Other params: exclude='annotation' +variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') # metadata=False +print(RESULT_SEPARATOR) + +# Filter by gene +variants = oc.variants.query(study=study, gene=genes, limit=5) # Other params: exclude='annotation' +variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') + + +#%% md + +## Filter by Consequence Type + +... + +#%% + + + +#%% md + +## Filter by Variant Type + +values accepted... + +#%% + +# Filter by SNV +variants = oc.variants.query(study=study, type='SNV', limit=5) # Other params: exclude='annotation' +variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') # metadata=False +print(RESULT_SEPARATOR) + +# Filter by ... +variants = oc.variants.query(study=study, type='SNV,INDEL', limit=5) # Other params: exclude='annotation' +variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') + +# Filter by ... +variants = oc.variants.query(study=study, type='DELETION', limit=5) # Other params: exclude='annotation' +variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') + +#%% md + +## Advanced Filters + +#%% + + + +#%% md + +# Querying Variants: Filter by Sample and VCF params +------- + +#%% + +# resp = oc.samples.search(limi=1) +# sample= resp. + +#%% + + + +#%% + + + +#%% md + +# Aggregation Stats +------- + +#%% + + + +#%% md + +# Use Cases +--------- + +#%% md + +## Fetch all samples per Variant + +1. choose one variant +2. get samples +3. go to catalog + +#%% md + +**Situation:** I am interested in getting a list of all participants in the study, that have: +(A) SNVs in NOD2 gene that have MAF of <0.01 in gnomad_NFE AND are missense, start_lost, stop_gained, or stop_lost +split by hets and homs. + +- How I can submit this query but instead of NOD2, for a list of 10 genes (example list: IL3, IL31, IL32, IL34, IL6, IL6R, IL10RA, IL10RB, IL7, IL7R) to the openCGA server + +#%% + +# Define the parameters of the variants we want to query + +genes = ['NOD2','IL3'] +limit = 5 +type = ['SNV'] +ct = ['missense_variant','start_lost','stop_gained','stop_lost'] #List of SO consequence types, e.g. missense_variant,stop_lost or SO:0001583,SO:0001578 +populationFrequencyMaf='gnomAD:ALL<0.01' + + + +#%% + +variants = variant_client.query(study=study, gene=genes, type=type, ct=ct, + populationFrequencyMaf=populationFrequencyMaf, limit=limit) + + +variants.print_results('id') +variants. +#pprint(variants.get_result(0)) + + +#%% md + +## Sample Variant Stats + +1. Choose one random sample from catalog +2. sample stats query + +#%% From 6d73c2a140d59575f831c830e2d9a17a23e0a48d Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Wed, 14 Apr 2021 09:47:29 +0100 Subject: [PATCH 172/412] more improvements to variant_query.ipynb --- .../notebooks/user-training/pyopencga_variant_query.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index fa1dd534998..2ecdd3b4fa6 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -1128,4 +1128,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file From c325a24495774a0880fa4a5df69ac823951af28f Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 14 Apr 2021 14:42:47 +0200 Subject: [PATCH 173/412] analysis: first RGA implementation using VariantStorageManager, #1693 --- .../analysis/rga/GeneRgaConverter.java | 3 +- .../analysis/rga/IndividualRgaConverter.java | 19 +- .../opencga/analysis/rga/RgaEngine.java | 206 ++---- .../opencga/analysis/rga/RgaManager.java | 258 ++++++- .../analysis/rga/VariantRgaConverter.java | 58 +- .../opencga/analysis/rga/RgaEngineTest.java | 682 +++++++++--------- .../opencga/analysis/rga/RgaManagerTest.java | 521 ++++++++----- .../analysis/rga/RgaSolrExtenalResource.java | 14 +- .../app/misc/solr/prepare_configsets.sh | 2 +- opencga-clinical/pom.xml | 9 + .../src/main/resources/rga/managed-schema | 1 - .../knockout/KnockoutByIndividual.java | 16 + 12 files changed, 1038 insertions(+), 751 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java index a2886fb2660..c04757118d4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java @@ -126,7 +126,8 @@ public List convertToDataModelType(List rgaData knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); knockoutIndividual.addTranscripts(Collections.singletonList(knockoutTranscript)); - List knockoutVariantList = RgaUtils.extractKnockoutVariants(rgaDataModel, variantMap, null); + List knockoutVariantList = RgaUtils.extractKnockoutVariants(rgaDataModel, variantMap, + Collections.emptySet()); knockoutTranscript.setVariants(knockoutVariantList); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index e3568e0f32c..7bd75a08936 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -187,15 +187,6 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI if (knockoutByIndividual.getGenes() != null) { for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { for (KnockoutTranscript transcript : gene.getTranscripts()) { - List variantJson = new ArrayList<>(transcript.getVariants().size()); - for (KnockoutVariant variant : transcript.getVariants()) { - // Only keep population frequencies from ALL - if (variant.getPopulationFrequencies() != null) { - variant.getPopulationFrequencies().removeIf(popFreq -> !popFreq.getPopulation().equals("ALL")); - } - variantJson.add(JacksonUtils.getDefaultObjectMapper().writeValueAsString(variant)); - } - List compoundFilters = processFilters(transcript); List phenotypes = populatePhenotypes(knockoutByIndividual.getPhenotypes()); @@ -219,8 +210,8 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI disorderJson = Collections.emptyList(); } - List variantIds = new LinkedList<>(); - Set knockoutTypes = new HashSet<>(); + List variantIds = new ArrayList<>(transcript.getVariants().size()); + List knockoutTypes = new ArrayList<>(transcript.getVariants().size()); Set types = new HashSet<>(); Set consequenceTypes = new HashSet<>(); Set clinicalSignificances = new HashSet<>(); @@ -228,9 +219,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI for (KnockoutVariant variant : transcript.getVariants()) { variantIds.add(variant.getId()); - if (variant.getKnockoutType() != null) { - knockoutTypes.add(variant.getKnockoutType().name()); - } + knockoutTypes.add(variant.getKnockoutType() != null ? variant.getKnockoutType().name() : ""); if (variant.getType() != null) { types.add(variant.getType().name()); } @@ -292,7 +281,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI .setTranscriptBiotype(transcript.getBiotype()) .setVariants(variantIds) .setTypes(new ArrayList<>(types)) - .setKnockoutTypes(new ArrayList<>(knockoutTypes)) + .setKnockoutTypes(knockoutTypes) .setFilters(new ArrayList<>(filters)) .setConsequenceTypes(new ArrayList<>(consequenceTypes)) .setClinicalSignificances(new ArrayList<>(clinicalSignificances)) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index 7cb49099ad6..086352b7788 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -1,10 +1,10 @@ package org.opencb.opencga.analysis.rga; +import org.apache.commons.collections4.CollectionUtils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.common.SolrException; -import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.Query; @@ -12,22 +12,16 @@ import org.opencb.commons.datastore.solr.FacetQueryParser; import org.opencb.commons.datastore.solr.SolrCollection; import org.opencb.commons.datastore.solr.SolrManager; -import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.analysis.rga.exceptions.RgaException; -import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; -import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.storage.core.variant.search.solr.SolrNativeIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Closeable; import java.io.IOException; import java.util.List; -import java.util.stream.Collectors; public class RgaEngine implements Closeable { @@ -38,19 +32,14 @@ public class RgaEngine implements Closeable { private VariantRgaConverter variantConverter; private StorageConfiguration storageConfiguration; - private VariantStorageManager variantStorageManager; - private Logger logger; - public static final String USE_SEARCH_INDEX = "useSearchIndex"; - - public RgaEngine(VariantStorageManager variantStorageManager, StorageConfiguration storageConfiguration) { + public RgaEngine(StorageConfiguration storageConfiguration) { this.individualRgaConverter = new IndividualRgaConverter(); this.geneConverter = new GeneRgaConverter(); this.variantConverter = new VariantRgaConverter(); this.parser = new RgaQueryParser(); this.storageConfiguration = storageConfiguration; - this.variantStorageManager = variantStorageManager; this.solrManager = new SolrManager(storageConfiguration.getRga().getHosts(), storageConfiguration.getRga().getMode(), storageConfiguration.getRga().getTimeout()); @@ -107,53 +96,41 @@ public boolean existsCollection(String collectionName) throws RgaException { * Insert a list of RGA models into the given Solr collection. * * @param collection Solr collection where to insert - * @param knockoutByIndividualList List of knockoutByIndividual to insert + * @param rgaDataModelList List of RgaDataModel to insert * @throws IOException IOException * @throws SolrServerException SolrServerException */ - public void insert(String collection, List knockoutByIndividualList) throws IOException, SolrServerException { - if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { - List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); - - if (!rgaDataModelList.isEmpty()) { - UpdateResponse updateResponse; - updateResponse = solrManager.getSolrClient().addBeans(collection, rgaDataModelList); - if (updateResponse.getStatus() == 0) { - solrManager.getSolrClient().commit(collection); - } + public void insert(String collection, List rgaDataModelList) throws IOException, SolrServerException { + if (CollectionUtils.isNotEmpty(rgaDataModelList)) { + UpdateResponse updateResponse; + updateResponse = solrManager.getSolrClient().addBeans(collection, rgaDataModelList); + if (updateResponse.getStatus() == 0) { + solrManager.getSolrClient().commit(collection); } } } /** - * Return the list of KnockoutByIndividual objects from a Solr core/collection given a query. + * Return the list of RgaDataModel objects from a Solr core/collection given a query. * * @param collection Collection name * @param query Query * @param queryOptions Query options - * @return List of KnockoutByIndividual objects + * @return List of RgaDataModel objects * @throws RgaException RgaException * @throws IOException IOException */ - public OpenCGAResult individualQuery(String collection, Query query, QueryOptions queryOptions) + public OpenCGAResult individualQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { SolrQuery solrQuery = parser.parseQuery(query); fixIndividualOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); - DataResult queryResult; try { - List variantList = null; - DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); - List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(result.getResults(), - variantList); - queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByIndividuals.size(), knockoutByIndividuals, - -1); + return new OpenCGAResult<>(solrCollection.query(solrQuery, RgaDataModel.class)); } catch (SolrServerException e) { throw new RgaException("Error executing KnockoutByIndividual query", e); } - - return new OpenCGAResult<>(queryResult); } private void fixIndividualOptions(QueryOptions queryOptions, SolrQuery solrQuery) { @@ -168,111 +145,40 @@ private void fixIndividualOptions(QueryOptions queryOptions, SolrQuery solrQuery } } - private void fixGeneOptions(QueryOptions queryOptions, SolrQuery solrQuery) { - if (queryOptions.containsKey(QueryOptions.INCLUDE)) { - for (String include : geneConverter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { - solrQuery.addField(include); - } - } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { - for (String include : geneConverter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { - solrQuery.addField(include); - } - } - } - - private void fixVariantOptions(QueryOptions queryOptions, SolrQuery solrQuery) { - if (queryOptions.containsKey(QueryOptions.INCLUDE)) { - for (String include : variantConverter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { - solrQuery.addField(include); - } - } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { - for (String include : variantConverter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { - solrQuery.addField(include); - } - } - } - - @Deprecated - private SolrQuery fixQuery(String collection, Query query, QueryOptions queryOptions) throws IOException, RgaException { - int limit = queryOptions.getInt(QueryOptions.LIMIT); - int skip = queryOptions.getInt(QueryOptions.SKIP); - if (limit > 0 || skip > 0) { - // Perform first a facet to obtain all the different sample ids there are available - QueryOptions facetOptions = new QueryOptions() - .append(QueryOptions.SKIP, skip) - .append(QueryOptions.LIMIT, limit) - .append(QueryOptions.FACET, RgaQueryParams.SAMPLE_ID.key()); - DataResult facetFieldDataResult = facetedQuery(collection, query, facetOptions); - - // Add only the samples obtained after the facet - List sampleIds = facetFieldDataResult.first().getBuckets().stream().map(FacetField.Bucket::getValue) - .collect(Collectors.toList()); - query.append(RgaQueryParams.SAMPLE_ID.key(), sampleIds); - } - - SolrQuery solrQuery = parser.parseQuery(query); - return solrQuery; - } - /** - * Return the list of RgaKnockoutByGene objects from a Solr core/collection given a query. + * Return the list of RgaDataModel objects from a Solr core/collection given a query. * * @param collection Collection name * @param query Query * @param queryOptions Query options - * @return List of RgaKnockoutByGene objects + * @return List of RgaDataModel objects * @throws RgaException RgaException * @throws IOException IOException */ - public OpenCGAResult geneQuery(String collection, Query query, QueryOptions queryOptions) + public OpenCGAResult geneQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { SolrQuery solrQuery = parser.parseQuery(query); fixGeneOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); - DataResult queryResult; try { - List variantList = null; - DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); - List knockoutByGeneList = geneConverter.convertToDataModelType(result.getResults(), variantList); - queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByGeneList.size(), knockoutByGeneList, - result.getNumMatches()); + return new OpenCGAResult<>(solrCollection.query(solrQuery, RgaDataModel.class)); } catch (SolrServerException e) { throw new RgaException("Error executing RgaKnockoutByGene query", e); } - - return new OpenCGAResult<>(queryResult); } - /** - * Return the list of KnockoutByVariant objects from a Solr core/collection given a query. - * - * @param collection Collection name - * @param query Query - * @param queryOptions Query options - * @return List of KnockoutByVariant objects - * @throws RgaException RgaException - * @throws IOException IOException - */ - public OpenCGAResult variantQuery(String collection, Query query, QueryOptions queryOptions) - throws RgaException, IOException { - SolrQuery solrQuery = parser.parseQuery(query); - fixVariantOptions(queryOptions, solrQuery); - solrQuery.setRows(Integer.MAX_VALUE); - SolrCollection solrCollection = solrManager.getCollection(collection); - DataResult queryResult; - try { - List variantList = null; - DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); - List knockoutByVariants = variantConverter.convertToDataModelType(result.getResults(), variantList, - query.getAsStringList(RgaQueryParams.VARIANTS.key())); - queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByVariants.size(), knockoutByVariants, - -1); - } catch (SolrServerException e) { - throw new RgaException("Error executing KnockoutByVariant query", e); - } - return new OpenCGAResult<>(queryResult); + private void fixGeneOptions(QueryOptions queryOptions, SolrQuery solrQuery) { + if (queryOptions.containsKey(QueryOptions.INCLUDE)) { + for (String include : geneConverter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { + solrQuery.addField(include); + } + } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { + for (String include : geneConverter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { + solrQuery.addField(include); + } + } } /** @@ -285,59 +191,29 @@ public OpenCGAResult variantQuery(String collection, Query qu * @throws RgaException RgaException * @throws IOException IOException */ - public OpenCGAResult nativeQuery(String collection, Query query, QueryOptions queryOptions) + public OpenCGAResult variantQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { - SolrQuery solrQuery = fixQuery(collection, query, queryOptions); + SolrQuery solrQuery = parser.parseQuery(query); + fixVariantOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); - DataResult queryResult; try { - queryResult = solrCollection.query(solrQuery, RgaDataModel.class); + return new OpenCGAResult<>(solrCollection.query(solrQuery, RgaDataModel.class)); } catch (SolrServerException e) { - throw new RgaException("Error executing KnockoutByIndividual query (nativeQuery)", e); + throw new RgaException("Error executing KnockoutByVariant query", e); } - - return new OpenCGAResult<>(queryResult); } -// /** -// * Return a Solr variant iterator to retrieve KnockoutByIndividual objects from a Solr core/collection given a query. -// * -// * @param collection Collection name -// * @param query Query -// * @param queryOptions Query options -// * @return Solr VariantSearch iterator -// * @throws RgaException RgaException -// * @throws IOException IOException -// */ -// public SolrVariantDBIterator iterator(String collection, Query query, QueryOptions queryOptions) -// throws RgaException, IOException { -// try { -// SolrQuery solrQuery = solrQueryParser.parse(query, queryOptions); -// return new SolrVariantDBIterator(solrManager.getSolrClient(), collection, solrQuery, -// new VariantSearchToVariantConverter(VariantField.getIncludeFields(queryOptions))); -// } catch (SolrServerException e) { -// throw new RgaException("Error getting variant iterator", e); -// } -// } - /** - * Return a Solr KnockoutByIndividual iterator to retrieve RgaDataModel objects from a Solr core/collection given a query. - * - * @param collection Collection name - * @param query Query - * @param queryOptions Query options - * @return Solr SolrNativeIterator iterator - * @throws RgaException RgaException - */ - public SolrNativeIterator nativeIterator(String collection, Query query, QueryOptions queryOptions) - throws RgaException { - try { - SolrQuery solrQuery = fixQuery(collection, query, queryOptions); - solrQuery.setRows(Integer.MAX_VALUE); - return new SolrNativeIterator(solrManager.getSolrClient(), collection, solrQuery); - } catch (SolrServerException | IOException e) { - throw new RgaException("Error getting KnockoutByIndividual iterator (native)", e); + private void fixVariantOptions(QueryOptions queryOptions, SolrQuery solrQuery) { + if (queryOptions.containsKey(QueryOptions.INCLUDE)) { + for (String include : variantConverter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { + solrQuery.addField(include); + } + } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { + for (String include : variantConverter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { + solrQuery.addField(include); + } } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index e9076b5f2e0..10d18b645af 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -5,6 +5,7 @@ import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrException; +import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.analysis.rga.exceptions.RgaException; @@ -28,9 +29,12 @@ import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.response.VariantQueryResult; import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; +import org.opencb.opencga.storage.core.variant.adaptors.VariantField; +import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +54,11 @@ public class RgaManager implements AutoCloseable { private CatalogManager catalogManager; private StorageConfiguration storageConfiguration; private final RgaEngine rgaEngine; + private final VariantStorageManager variantStorageManager; + + private IndividualRgaConverter individualRgaConverter; + private GeneRgaConverter geneConverter; + private VariantRgaConverter variantConverter; private final Logger logger; @@ -59,7 +68,13 @@ public RgaManager(CatalogManager catalogManager, VariantStorageManager variantSt StorageEngineFactory storageEngineFactory) { this.catalogManager = catalogManager; this.storageConfiguration = storageEngineFactory.getStorageConfiguration(); - this.rgaEngine = new RgaEngine(variantStorageManager, storageConfiguration); + this.rgaEngine = new RgaEngine(storageConfiguration); + this.variantStorageManager = variantStorageManager; + + this.individualRgaConverter = new IndividualRgaConverter(); + this.geneConverter = new GeneRgaConverter(); + this.variantConverter = new VariantRgaConverter(); + this.logger = LoggerFactory.getLogger(getClass()); } @@ -67,15 +82,27 @@ public RgaManager(Configuration configuration, StorageConfiguration storageConfi this.catalogManager = new CatalogManager(configuration); this.storageConfiguration = storageConfiguration; StorageEngineFactory storageEngineFactory = StorageEngineFactory.get(storageConfiguration); - VariantStorageManager variantStorageManager = new VariantStorageManager(catalogManager, storageEngineFactory); - this.rgaEngine = new RgaEngine(variantStorageManager, storageConfiguration); + this.variantStorageManager = new VariantStorageManager(catalogManager, storageEngineFactory); + this.rgaEngine = new RgaEngine(storageConfiguration); + + this.individualRgaConverter = new IndividualRgaConverter(); + this.geneConverter = new GeneRgaConverter(); + this.variantConverter = new VariantRgaConverter(); + this.logger = LoggerFactory.getLogger(getClass()); } - public RgaManager(Configuration configuration, StorageConfiguration storageConfiguration, RgaEngine rgaEngine) throws CatalogException { + public RgaManager(Configuration configuration, StorageConfiguration storageConfiguration, VariantStorageManager variantStorageManager, + RgaEngine rgaEngine) throws CatalogException { this.catalogManager = new CatalogManager(configuration); this.storageConfiguration = storageConfiguration; this.rgaEngine = rgaEngine; + this.variantStorageManager = variantStorageManager; + + this.individualRgaConverter = new IndividualRgaConverter(); + this.geneConverter = new GeneRgaConverter(); + this.variantConverter = new VariantRgaConverter(); + this.logger = LoggerFactory.getLogger(getClass()); } @@ -207,7 +234,34 @@ public OpenCGAResult individualQuery(String studyStr, Quer } auxQuery.put("sampleId", sampleIds); - OpenCGAResult result = rgaEngine.individualQuery(collection, auxQuery, queryOptions); + ExecutorService executor = Executors.newFixedThreadPool(2); + Future> variantFuture = executor.submit( + () -> variantStorageQuery(study.getFqn(), sampleIds, auxQuery, options, token) + ); + + Future> tmpResultFuture = executor.submit( + () -> rgaEngine.individualQuery(collection, auxQuery, queryOptions) + ); + + List variantList; + try { + variantList = variantFuture.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + + OpenCGAResult tmpResult; + try { + tmpResult = tmpResultFuture.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + + List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(tmpResult.getResults(), + variantList); + OpenCGAResult result = new OpenCGAResult<>(tmpResult.getTime(), tmpResult.getEvents(), + knockoutByIndividuals.size(), knockoutByIndividuals, -1); + if (count) { result.setNumMatches(numTotalResults); } @@ -219,6 +273,39 @@ public OpenCGAResult individualQuery(String studyStr, Quer return result; } + private List variantStorageQuery(String study, List sampleIds, Query query, QueryOptions options, String token) + throws CatalogException, IOException, StorageEngineException, RgaException { + String collection = getCollectionName(study); + + DataResult result = rgaEngine.facetedQuery(collection, query, + new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS).append(QueryOptions.LIMIT, -1)); + if (result.getNumResults() == 0) { + return Collections.emptyList(); + } + List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + + if (variantIds.size() > 1000) { + // TODO: Batches + variantIds = variantIds.subList(0, 100); + } + + Query variantQuery = new Query(VariantQueryParam.ID.key(), variantIds) + .append(VariantQueryParam.STUDY.key(), study) + .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleIds) + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); + + QueryOptions queryOptions = new QueryOptions() + .append(QueryOptions.EXCLUDE, Arrays.asList( +// VariantField.ANNOTATION_POPULATION_FREQUENCIES, + VariantField.ANNOTATION_CYTOBAND, + VariantField.ANNOTATION_CONSERVATION, + VariantField.ANNOTATION_DRUGS, + VariantField.ANNOTATION_GENE_EXPRESSION + )); + + return variantStorageManager.get(variantQuery, queryOptions, token).getResults(); + } + public OpenCGAResult geneQuery(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); @@ -269,16 +356,29 @@ public OpenCGAResult geneQuery(String studyStr, Query query, auxQuery.put(RgaDataModel.GENE_ID, geneIds); } - Set includeIndividualIds; + if (!auxQuery.containsKey("sampleId") && !auxQuery.containsKey("individualId") && includeIndividuals.isEmpty()) { + // We perform a facet to get the different individual ids matching the user query + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, + new QueryOptions(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_ID).append(QueryOptions.LIMIT, -1)); + if (result.getNumResults() == 0) { + stopWatch.stop(); + return OpenCGAResult.empty(RgaKnockoutByGene.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + } + includeIndividuals = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + } + + Set includeSampleIds; if (!isOwnerOrAdmin) { if (!includeIndividuals.isEmpty()) { - // 3. Get list of individual ids for which the user has permissions from the list of includeInviduals provided - Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) - .append(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), includeIndividuals); + // 3. Get list of indexed sample ids for which the user has permissions from the list of includeIndividuals provided + Query sampleQuery = new Query() + .append(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) + .append(SampleDBAdaptor.QueryParams.INTERNAL_RGA_STATUS.key(), RgaIndex.Status.INDEXED) + .append(SampleDBAdaptor.QueryParams.ID.key(), includeIndividuals); OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), sampleQuery, token); - includeIndividualIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + includeSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); } else { // 2. Check permissions DataResult result = rgaEngine.facetedQuery(collection, auxQuery, @@ -289,34 +389,72 @@ public OpenCGAResult geneQuery(String studyStr, Query query, } List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - // 3. Get list of individual ids for which the user has permissions + // 3. Get list of sample ids for which the user has permissions Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) .append(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), sampleQuery, token); - includeIndividualIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + includeSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); } } else { - includeIndividualIds = new HashSet<>(includeIndividuals); + // Obtain samples + Query sampleQuery = new Query(SampleDBAdaptor.QueryParams.INTERNAL_RGA_STATUS.key(), RgaIndex.Status.INDEXED); + + if (!includeIndividuals.isEmpty()) { + query.put(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), includeIndividuals); + } else { + // TODO: Include only the samples that will be necessary + logger.warn("Include only the samples that are actually necessary"); + } + + OpenCGAResult sampleResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + includeSampleIds = new HashSet<>((List) sampleResult.getResults()); + } + + ExecutorService executor = Executors.newFixedThreadPool(2); + Future> variantFuture = executor.submit( + () -> variantStorageQuery(study.getFqn(), new ArrayList<>(includeSampleIds), auxQuery, options, token) + ); + + Future> tmpResultFuture = executor.submit( + () -> rgaEngine.geneQuery(collection, auxQuery, queryOptions) + ); + + List variantList; + try { + variantList = variantFuture.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + + OpenCGAResult tmpResult; + try { + tmpResult = tmpResultFuture.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); } // 4. Solr gene query - OpenCGAResult knockoutResult = rgaEngine.geneQuery(collection, auxQuery, queryOptions); + List knockoutResultList = geneConverter.convertToDataModelType(tmpResult.getResults(), variantList); + OpenCGAResult knockoutResult = new OpenCGAResult<>(tmpResult.getTime(), tmpResult.getEvents(), + knockoutResultList.size(), knockoutResultList, -1); + knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); try { knockoutResult.setNumMatches(numTotalResults != null ? numTotalResults.get() : -1); } catch (InterruptedException | ExecutionException e) { knockoutResult.setNumMatches(-1); } - if (isOwnerOrAdmin && includeIndividualIds.isEmpty()) { + if (isOwnerOrAdmin && includeSampleIds.isEmpty()) { return knockoutResult; } else { // 5. Filter out individual or samples for which user does not have permissions for (RgaKnockoutByGene knockout : knockoutResult.getResults()) { List individualList = new ArrayList<>(knockout.getIndividuals().size()); for (RgaKnockoutByGene.KnockoutIndividual individual : knockout.getIndividuals()) { - if (includeIndividualIds.contains(individual.getId())) { + if (includeSampleIds.contains(individual.getSampleId())) { individualList.add(individual); } } @@ -377,55 +515,97 @@ public OpenCGAResult variantQuery(String studyStr, Query quer auxQuery.put(RgaDataModel.VARIANTS, variantIds); } - Set includeIndividualIds; + Set includeSampleIds; if (!isOwnerOrAdmin) { if (!includeIndividuals.isEmpty()) { - // 3. Get list of individual ids for which the user has permissions from the list of includeInviduals provided - Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) + // 3. Get list of sample ids for which the user has permissions from the list of includeIndividuals provided + Query sampleQuery = new Query() + .append(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) + .append(SampleDBAdaptor.QueryParams.INTERNAL_RGA_STATUS.key(), RgaIndex.Status.INDEXED) .append(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), includeIndividuals); OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), sampleQuery, token); - includeIndividualIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + includeSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); } else { // 2. Check permissions DataResult result = rgaEngine.facetedQuery(collection, auxQuery, - new QueryOptions(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_ID).append(QueryOptions.LIMIT, -1)); + new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID).append(QueryOptions.LIMIT, -1)); if (result.getNumResults() == 0) { stopWatch.stop(); return OpenCGAResult.empty(KnockoutByVariant.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } - List individualIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue) + List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue) .collect(Collectors.toList()); // 3. Get list of individual ids for which the user has permissions - Query sampleQuery = new Query(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) - .append(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), individualIds); + Query sampleQuery = new Query() + .append(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS) + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), sampleQuery, token); - includeIndividualIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + includeSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); } } else { - includeIndividualIds = new HashSet<>(includeIndividuals); + // Obtain samples + Query sampleQuery = new Query(SampleDBAdaptor.QueryParams.INTERNAL_RGA_STATUS.key(), RgaIndex.Status.INDEXED); + + if (!includeIndividuals.isEmpty()) { + query.put(SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(), includeIndividuals); + } else { + // TODO: Include only the samples that will be necessary + logger.warn("Include only the samples that are actually necessary"); + } + + OpenCGAResult sampleResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + includeSampleIds = new HashSet<>((List) sampleResult.getResults()); + } + + ExecutorService executor = Executors.newFixedThreadPool(2); + Future> variantFuture = executor.submit( + () -> variantStorageQuery(study.getFqn(), new ArrayList<>(includeSampleIds), auxQuery, options, token) + ); + + Future> tmpResultFuture = executor.submit( + () -> rgaEngine.geneQuery(collection, auxQuery, queryOptions) + ); + + List variantList; + try { + variantList = variantFuture.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + + OpenCGAResult tmpResult; + try { + tmpResult = tmpResultFuture.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); } // 4. Solr gene query - OpenCGAResult knockoutResult = rgaEngine.variantQuery(collection, auxQuery, queryOptions); + List knockoutResultList = variantConverter.convertToDataModelType(tmpResult.getResults(), variantList, + query.getAsStringList(RgaQueryParams.VARIANTS.key())); + OpenCGAResult knockoutResult = new OpenCGAResult<>(tmpResult.getTime(), tmpResult.getEvents(), + knockoutResultList.size(), knockoutResultList, -1); + knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); try { knockoutResult.setNumMatches(numTotalResults != null ? numTotalResults.get() : -1); } catch (InterruptedException | ExecutionException e) { knockoutResult.setNumMatches(-1); } - if (isOwnerOrAdmin && includeIndividualIds.isEmpty()) { + if (isOwnerOrAdmin && includeSampleIds.isEmpty()) { return knockoutResult; } else { // 5. Filter out individual or samples for which user does not have permissions for (KnockoutByVariant knockout : knockoutResult.getResults()) { List individualList = new ArrayList<>(knockout.getIndividuals().size()); for (KnockoutByIndividual individual : knockout.getIndividuals()) { - if (includeIndividualIds.contains(individual.getId())) { + if (includeSampleIds.contains(individual.getId())) { individualList.add(individual); } } @@ -658,7 +838,8 @@ private void load(String study, Path path, String token) throws IOException, Rga knockoutByIndividualList.add(knockoutByIndividual); count++; if (count % KNOCKOUT_INSERT_BATCH_SIZE == 0) { - rgaEngine.insert(collection, knockoutByIndividualList); + List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); + rgaEngine.insert(collection, rgaDataModelList); logger.debug("Loaded {} knockoutByIndividual entries from '{}'", count, path); // Update RGA Index status @@ -677,7 +858,8 @@ private void load(String study, Path path, String token) throws IOException, Rga // Insert the remaining entries if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { - rgaEngine.insert(collection, knockoutByIndividualList); + List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); + rgaEngine.insert(collection, rgaDataModelList); logger.debug("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); // Update RGA Index status diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java index bef27d1e126..776ff95a233 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java @@ -135,25 +135,57 @@ public List convertToDataModelType(List rgaData individualList.add(individualMap.get(individualId)); } - KnockoutByVariant knockoutByVariant = new KnockoutByVariant(variantId, individualList); - - // Look for nested variant info - KnockoutByIndividual knockoutByIndividual = individualList.get(0); - if (CollectionUtils.isNotEmpty(knockoutByIndividual.getGenes())) { - KnockoutByIndividual.KnockoutGene gene = knockoutByIndividual.getGenes().stream().findFirst().get(); - if (CollectionUtils.isNotEmpty(gene.getTranscripts())) { - KnockoutTranscript transcript = gene.getTranscripts().stream().findFirst().get(); - if (CollectionUtils.isNotEmpty(transcript.getVariants())) { - for (KnockoutVariant transcriptVariant : transcript.getVariants()) { - if (variantId.equals(transcriptVariant.getId())) { - knockoutByVariant.setVariantFields(transcriptVariant); - break; + List filteredIndividualList = new ArrayList<>(individualList.size()); + KnockoutVariant knockoutVariant = null; + for (KnockoutByIndividual knockoutByIndividual : individualList) { + List geneList = new LinkedList<>(); + // Look for nested variant info + if (CollectionUtils.isNotEmpty(knockoutByIndividual.getGenes())) { + for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { + List knockoutTranscriptList = new LinkedList<>(); + + if (CollectionUtils.isNotEmpty(gene.getTranscripts())) { + for (KnockoutTranscript transcript : gene.getTranscripts()) { + List filteredVariantList = new LinkedList<>(); + + if (CollectionUtils.isNotEmpty(transcript.getVariants())) { + for (KnockoutVariant transcriptVariant : transcript.getVariants()) { + if (variantId.equals(transcriptVariant.getId())) { + // Only add the expected variant to the list + filteredVariantList.add(transcriptVariant); + knockoutVariant = transcriptVariant; + } + } + } + if (!filteredVariantList.isEmpty()) { + knockoutTranscriptList.add(new KnockoutTranscript(transcript.getId(), transcript.getChromosome(), + transcript.getStart(), transcript.getEnd(), transcript.getBiotype(), transcript.getStrand(), + filteredVariantList)); + } } } + + if (!knockoutTranscriptList.isEmpty()) { + KnockoutByIndividual.KnockoutGene knockoutGene = new KnockoutByIndividual.KnockoutGene(gene.getId(), gene.getName(), + gene.getChromosome(), gene.getStart(), gene.getEnd(), gene.getBiotype(), gene.getStrand()); + knockoutGene.setTranscripts(knockoutTranscriptList); + geneList.add(knockoutGene); + } } } + if (!geneList.isEmpty()) { + KnockoutByIndividual filteredIndividual = new KnockoutByIndividual(knockoutByIndividual.getId(), + knockoutByIndividual.getSampleId(), knockoutByIndividual.getMotherId(), knockoutByIndividual.getMotherSampleId(), + knockoutByIndividual.getFatherId(), knockoutByIndividual.getFatherSampleId(), knockoutByIndividual.getSex(), + knockoutByIndividual.getPhenotypes(), knockoutByIndividual.getDisorders(), knockoutByIndividual.getStats()); + filteredIndividual.setGenes(geneList); + + filteredIndividualList.add(filteredIndividual); + } } + KnockoutByVariant knockoutByVariant = new KnockoutByVariant(variantId, filteredIndividualList); + knockoutByVariant.setVariantFields(knockoutVariant); knockoutVariantList.add(knockoutByVariant); } return knockoutVariantList; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java index 8d6b56d9a00..ca84f902248 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java @@ -54,7 +54,7 @@ public void before() throws IOException, CatalogException, RgaException, SolrSer this.variantStorageManager = new VariantStorageManager(catalogManager, StorageEngineFactory.get(storageConfiguration)); - rgaEngine = solr.configure(variantStorageManager, storageConfiguration); + rgaEngine = solr.configure(storageConfiguration); collection = solr.coreName; rgaEngine.create(collection); @@ -62,347 +62,349 @@ public void before() throws IOException, CatalogException, RgaException, SolrSer knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(1)); knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(2)); - rgaEngine.insert(collection, knockoutByIndividualList); + IndividualRgaConverter rgaConverter = new IndividualRgaConverter(); + List rgaDataModels = rgaConverter.convertToStorageType(knockoutByIndividualList); + rgaEngine.insert(collection, rgaDataModels); } - @Test - public void testIndividualQuery() throws Exception { - OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); - - assertEquals(2, result.getNumResults()); - for (int i = 0; i < knockoutByIndividualList.size(); i++) { - assertEquals(JacksonUtils.getDefaultObjectMapper().writeValueAsString(knockoutByIndividualList.get(i)), - JacksonUtils.getDefaultObjectMapper().writeValueAsString(result.getResults().get(i))); - } - - result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); - assertEquals(2, result.getNumResults()); - - Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(1, result.getNumResults()); - assertEquals("id1", result.first().getId()); - - query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(1, result.getNumResults()); - assertEquals("id2", result.first().getId()); - - query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(0, result.getNumResults()); - - query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - - query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(0, result.getNumResults()); - - query = new Query() - .append(RgaQueryParams.DISORDERS.key(), "disorderId1") - .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(1, result.getNumResults()); - - query = new Query() - .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") - .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.individualQuery(collection, query, new QueryOptions()); - assertEquals(1, result.getNumResults()); - } - - @Test - public void testIncludeExcludeIndividualQuery() throws Exception { - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name")); - OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), options); - assertEquals(2, result.getNumResults()); - for (int i = 0; i < knockoutByIndividualList.size(); i++) { - assertNotNull(result.getResults().get(i).getId()); - assertTrue(result.getResults().get(i).getPhenotypes().isEmpty()); - assertNotNull(result.getResults().get(i).getSampleId()); - assertNotNull(result.getResults().get(i).getDisorders()); - assertNotNull(result.getResults().get(i).getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { - assertNotNull(gene.getId()); - assertNotNull(gene.getName()); - assertNull(gene.getStrand()); - assertTrue(gene.getTranscripts().isEmpty()); - } - } - - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", - "genesMap.transcriptsMap.variants")); - result = rgaEngine.individualQuery(collection, new Query(), options); - assertEquals(2, result.getNumResults()); - for (int i = 0; i < knockoutByIndividualList.size(); i++) { - assertNotNull(result.getResults().get(i).getId()); - assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); - assertNull(result.getResults().get(i).getSampleId()); - assertTrue(result.getResults().get(i).getDisorders().isEmpty()); - assertNotNull(result.getResults().get(i).getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - for (KnockoutTranscript transcript : gene.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNotNull(transcript.getBiotype()); - assertTrue(transcript.getVariants().isEmpty()); - } - } - } - - // It should be not possible to completely exclude knockoutType without excluding the whole variant information - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", - "genesMap.transcriptsMap.variants.knockoutType")); - result = rgaEngine.individualQuery(collection, new Query(), options); - assertEquals(2, result.getNumResults()); - for (int i = 0; i < knockoutByIndividualList.size(); i++) { - assertNotNull(result.getResults().get(i).getId()); - assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); - assertNull(result.getResults().get(i).getSampleId()); - assertTrue(result.getResults().get(i).getDisorders().isEmpty()); - assertNotNull(result.getResults().get(i).getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - for (KnockoutTranscript transcript : gene.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNotNull(transcript.getBiotype()); - assertFalse(transcript.getVariants().isEmpty()); - for (KnockoutVariant variant : transcript.getVariants()) { - assertNotNull(variant.getId()); - assertNotNull(variant.getKnockoutType()); - assertFalse(variant.getPopulationFrequencies().isEmpty()); - } - } - } - } - - } - - @Test - public void testGeneQuery() throws Exception { - OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), new QueryOptions()); - - assertEquals(4, result.getNumResults()); - for (RgaKnockoutByGene resultResult : result.getResults()) { - assertEquals(1, resultResult.getIndividuals().size()); - assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") - || resultResult.getIndividuals().get(0).getId().equals("id2")); - } - - Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - for (RgaKnockoutByGene resultResult : result.getResults()) { - assertEquals(1, resultResult.getIndividuals().size()); - assertEquals("id1", resultResult.getIndividuals().get(0).getId()); - } - - query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - for (RgaKnockoutByGene resultResult : result.getResults()) { - assertEquals(1, resultResult.getIndividuals().size()); - assertEquals("id2", resultResult.getIndividuals().get(0).getId()); - } - - query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(0, result.getNumResults()); - - query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(4, result.getNumResults()); - for (RgaKnockoutByGene resultResult : result.getResults()) { - assertEquals(1, resultResult.getIndividuals().size()); - assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") - || resultResult.getIndividuals().get(0).getId().equals("id2")); - } - - query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(0, result.getNumResults()); - - query = new Query() - .append(RgaQueryParams.DISORDERS.key(), "disorderId1") - .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - - query = new Query() - .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") - .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); - result = rgaEngine.geneQuery(collection, query, new QueryOptions()); - assertEquals(2, result.getNumResults()); - } - - @Test - public void testIncludeExcludeGeneQuery() throws Exception { - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome")); - OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), options); - assertEquals(4, result.getNumResults()); - for (RgaKnockoutByGene gene : result.getResults()) { - assertNotNull(gene.getId()); - assertNotNull(gene.getName()); - assertNull(gene.getBiotype()); - for (RgaKnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { - assertNotNull(individual.getId()); - assertNull(individual.getSampleId()); - for (KnockoutTranscript transcript : individual.getTranscripts()) { - assertNotNull(transcript.getId()); -// assertNotNull(transcript.getChromosome()); - assertNull(transcript.getBiotype()); - assertTrue(transcript.getVariants().isEmpty()); - } - } - } - - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", - "individuals.transcriptsMap.variants")); - result = rgaEngine.geneQuery(collection, new Query(), options); - assertEquals(4, result.getNumResults()); - for (RgaKnockoutByGene gene : result.getResults()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getBiotype()); - for (RgaKnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { - assertNotNull(individual.getId()); - assertNotNull(individual.getSampleId()); - for (KnockoutTranscript transcript : individual.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNull(transcript.getChromosome()); - assertNotNull(transcript.getBiotype()); - assertTrue(transcript.getVariants().isEmpty()); - } - } - } - - // It should be not possible to completely exclude knockoutType without excluding the whole variant information - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", - "individuals.transcriptsMap.variants.knockoutType")); - result = rgaEngine.geneQuery(collection, new Query(), options); - assertEquals(4, result.getNumResults()); - for (RgaKnockoutByGene gene : result.getResults()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getBiotype()); - for (RgaKnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { - assertNotNull(individual.getId()); - assertNotNull(individual.getSampleId()); - for (KnockoutTranscript transcript : individual.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNull(transcript.getChromosome()); - assertNotNull(transcript.getBiotype()); - assertFalse(transcript.getVariants().isEmpty()); - for (KnockoutVariant variant : transcript.getVariants()) { - assertNotNull(variant.getId()); - assertNotNull(variant.getKnockoutType()); - assertFalse(variant.getPopulationFrequencies().isEmpty()); - } - } - } - } - } - - @Test - public void testVariantQuery() throws Exception { - OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), new QueryOptions()); - - assertEquals(6, result.getNumResults()); - } - - @Test - public void testIncludeExcludeVariantQuery() throws Exception { - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", - "individuals.genesMap.name")); - OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), options); - assertEquals(6, result.getNumResults()); - for (KnockoutByVariant variant : result.getResults()) { - assertNotNull(variant.getId()); - for (KnockoutByIndividual individual : variant.getIndividuals()) { - assertNotNull(individual.getId()); - assertTrue(individual.getPhenotypes().isEmpty()); - assertNotNull(individual.getSampleId()); - assertNotNull(individual.getDisorders()); - assertNotNull(individual.getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { - assertNotNull(gene.getId()); - assertNotNull(gene.getName()); - assertNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - } - - } - } - - // Not possible excluding variants object because that's basic for this data model - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", - "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants")); - result = rgaEngine.variantQuery(collection, new Query(), options); - assertEquals(6, result.getNumResults()); - for (KnockoutByVariant variant : result.getResults()) { - assertNotNull(variant.getId()); - for (KnockoutByIndividual individual : variant.getIndividuals()) { - assertNotNull(individual.getId()); - assertFalse(individual.getPhenotypes().isEmpty()); - assertNull(individual.getSampleId()); - assertTrue(individual.getDisorders().isEmpty()); - assertNotNull(individual.getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - for (KnockoutTranscript transcript : gene.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNotNull(transcript.getBiotype()); - assertFalse(transcript.getVariants().isEmpty()); - } - - } - } - } - - // It should be not possible to completely exclude knockoutType without excluding the whole variant information - options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", - "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants.knockoutType")); - result = rgaEngine.variantQuery(collection, new Query(), options); - assertEquals(6, result.getNumResults()); - for (KnockoutByVariant variant : result.getResults()) { - assertNotNull(variant.getId()); - for (KnockoutByIndividual individual : variant.getIndividuals()) { - assertNotNull(individual.getId()); - assertFalse(individual.getPhenotypes().isEmpty()); - assertNull(individual.getSampleId()); - assertTrue(individual.getDisorders().isEmpty()); - assertNotNull(individual.getGenes()); - for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { - assertNotNull(gene.getId()); - assertNull(gene.getName()); -// assertNotNull(gene.getStrand()); - assertFalse(gene.getTranscripts().isEmpty()); - for (KnockoutTranscript transcript : gene.getTranscripts()) { - assertNotNull(transcript.getId()); - assertNotNull(transcript.getBiotype()); - assertFalse(transcript.getVariants().isEmpty()); - for (KnockoutVariant tmpVariant : transcript.getVariants()) { - assertNotNull(tmpVariant.getId()); - assertNotNull(tmpVariant.getKnockoutType()); - assertFalse(tmpVariant.getPopulationFrequencies().isEmpty()); - } - } - } - } - } - - } +// @Test +// public void testIndividualQuery() throws Exception { +// OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); +// +// assertEquals(2, result.getNumResults()); +// for (int i = 0; i < knockoutByIndividualList.size(); i++) { +// assertEquals(JacksonUtils.getDefaultObjectMapper().writeValueAsString(knockoutByIndividualList.get(i)), +// JacksonUtils.getDefaultObjectMapper().writeValueAsString(result.getResults().get(i))); +// } +// +// result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); +// assertEquals(2, result.getNumResults()); +// +// Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); +// result = rgaEngine.individualQuery(collection, query, new QueryOptions()); +// assertEquals(1, result.getNumResults()); +// assertEquals("id1", result.first().getId()); +// +// query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); +// result = rgaEngine.individualQuery(collection, query, new QueryOptions()); +// assertEquals(1, result.getNumResults()); +// assertEquals("id2", result.first().getId()); +// +// query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); +// result = rgaEngine.individualQuery(collection, query, new QueryOptions()); +// assertEquals(0, result.getNumResults()); +// +// query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); +// result = rgaEngine.individualQuery(collection, query, new QueryOptions()); +// assertEquals(2, result.getNumResults()); +// +// query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); +// result = rgaEngine.individualQuery(collection, query, new QueryOptions()); +// assertEquals(0, result.getNumResults()); +// +// query = new Query() +// .append(RgaQueryParams.DISORDERS.key(), "disorderId1") +// .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); +// result = rgaEngine.individualQuery(collection, query, new QueryOptions()); +// assertEquals(1, result.getNumResults()); +// +// query = new Query() +// .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") +// .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); +// result = rgaEngine.individualQuery(collection, query, new QueryOptions()); +// assertEquals(1, result.getNumResults()); +// } +// +// @Test +// public void testIncludeExcludeIndividualQuery() throws Exception { +// QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name")); +// OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), options); +// assertEquals(2, result.getNumResults()); +// for (int i = 0; i < knockoutByIndividualList.size(); i++) { +// assertNotNull(result.getResults().get(i).getId()); +// assertTrue(result.getResults().get(i).getPhenotypes().isEmpty()); +// assertNotNull(result.getResults().get(i).getSampleId()); +// assertNotNull(result.getResults().get(i).getDisorders()); +// assertNotNull(result.getResults().get(i).getGenes()); +// for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { +// assertNotNull(gene.getId()); +// assertNotNull(gene.getName()); +// assertNull(gene.getStrand()); +// assertTrue(gene.getTranscripts().isEmpty()); +// } +// } +// +// options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", +// "genesMap.transcriptsMap.variants")); +// result = rgaEngine.individualQuery(collection, new Query(), options); +// assertEquals(2, result.getNumResults()); +// for (int i = 0; i < knockoutByIndividualList.size(); i++) { +// assertNotNull(result.getResults().get(i).getId()); +// assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); +// assertNull(result.getResults().get(i).getSampleId()); +// assertTrue(result.getResults().get(i).getDisorders().isEmpty()); +// assertNotNull(result.getResults().get(i).getGenes()); +// for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { +// assertNotNull(gene.getId()); +// assertNull(gene.getName()); +//// assertNotNull(gene.getStrand()); +// assertFalse(gene.getTranscripts().isEmpty()); +// for (KnockoutTranscript transcript : gene.getTranscripts()) { +// assertNotNull(transcript.getId()); +// assertNotNull(transcript.getBiotype()); +// assertTrue(transcript.getVariants().isEmpty()); +// } +// } +// } +// +// // It should be not possible to completely exclude knockoutType without excluding the whole variant information +// options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("sampleId", "disorders", "genesMap.name", +// "genesMap.transcriptsMap.variants.knockoutType")); +// result = rgaEngine.individualQuery(collection, new Query(), options); +// assertEquals(2, result.getNumResults()); +// for (int i = 0; i < knockoutByIndividualList.size(); i++) { +// assertNotNull(result.getResults().get(i).getId()); +// assertFalse(result.getResults().get(i).getPhenotypes().isEmpty()); +// assertNull(result.getResults().get(i).getSampleId()); +// assertTrue(result.getResults().get(i).getDisorders().isEmpty()); +// assertNotNull(result.getResults().get(i).getGenes()); +// for (KnockoutByIndividual.KnockoutGene gene : result.getResults().get(i).getGenes()) { +// assertNotNull(gene.getId()); +// assertNull(gene.getName()); +//// assertNotNull(gene.getStrand()); +// assertFalse(gene.getTranscripts().isEmpty()); +// for (KnockoutTranscript transcript : gene.getTranscripts()) { +// assertNotNull(transcript.getId()); +// assertNotNull(transcript.getBiotype()); +// assertFalse(transcript.getVariants().isEmpty()); +// for (KnockoutVariant variant : transcript.getVariants()) { +// assertNotNull(variant.getId()); +// assertNotNull(variant.getKnockoutType()); +// assertFalse(variant.getPopulationFrequencies().isEmpty()); +// } +// } +// } +// } +// +// } +// +// @Test +// public void testGeneQuery() throws Exception { +// OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), new QueryOptions()); +// +// assertEquals(4, result.getNumResults()); +// for (RgaKnockoutByGene resultResult : result.getResults()) { +// assertEquals(1, resultResult.getIndividuals().size()); +// assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") +// || resultResult.getIndividuals().get(0).getId().equals("id2")); +// } +// +// Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); +// result = rgaEngine.geneQuery(collection, query, new QueryOptions()); +// assertEquals(2, result.getNumResults()); +// for (RgaKnockoutByGene resultResult : result.getResults()) { +// assertEquals(1, resultResult.getIndividuals().size()); +// assertEquals("id1", resultResult.getIndividuals().get(0).getId()); +// } +// +// query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); +// result = rgaEngine.geneQuery(collection, query, new QueryOptions()); +// assertEquals(2, result.getNumResults()); +// for (RgaKnockoutByGene resultResult : result.getResults()) { +// assertEquals(1, resultResult.getIndividuals().size()); +// assertEquals("id2", resultResult.getIndividuals().get(0).getId()); +// } +// +// query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); +// result = rgaEngine.geneQuery(collection, query, new QueryOptions()); +// assertEquals(0, result.getNumResults()); +// +// query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); +// result = rgaEngine.geneQuery(collection, query, new QueryOptions()); +// assertEquals(4, result.getNumResults()); +// for (RgaKnockoutByGene resultResult : result.getResults()) { +// assertEquals(1, resultResult.getIndividuals().size()); +// assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") +// || resultResult.getIndividuals().get(0).getId().equals("id2")); +// } +// +// query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); +// result = rgaEngine.geneQuery(collection, query, new QueryOptions()); +// assertEquals(0, result.getNumResults()); +// +// query = new Query() +// .append(RgaQueryParams.DISORDERS.key(), "disorderId1") +// .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); +// result = rgaEngine.geneQuery(collection, query, new QueryOptions()); +// assertEquals(2, result.getNumResults()); +// +// query = new Query() +// .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") +// .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); +// result = rgaEngine.geneQuery(collection, query, new QueryOptions()); +// assertEquals(2, result.getNumResults()); +// } +// +// @Test +// public void testIncludeExcludeGeneQuery() throws Exception { +// QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome")); +// OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), options); +// assertEquals(4, result.getNumResults()); +// for (RgaKnockoutByGene gene : result.getResults()) { +// assertNotNull(gene.getId()); +// assertNotNull(gene.getName()); +// assertNull(gene.getBiotype()); +// for (RgaKnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { +// assertNotNull(individual.getId()); +// assertNull(individual.getSampleId()); +// for (KnockoutTranscript transcript : individual.getTranscripts()) { +// assertNotNull(transcript.getId()); +//// assertNotNull(transcript.getChromosome()); +// assertNull(transcript.getBiotype()); +// assertTrue(transcript.getVariants().isEmpty()); +// } +// } +// } +// +// options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", +// "individuals.transcriptsMap.variants")); +// result = rgaEngine.geneQuery(collection, new Query(), options); +// assertEquals(4, result.getNumResults()); +// for (RgaKnockoutByGene gene : result.getResults()) { +// assertNotNull(gene.getId()); +// assertNull(gene.getName()); +//// assertNotNull(gene.getBiotype()); +// for (RgaKnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { +// assertNotNull(individual.getId()); +// assertNotNull(individual.getSampleId()); +// for (KnockoutTranscript transcript : individual.getTranscripts()) { +// assertNotNull(transcript.getId()); +// assertNull(transcript.getChromosome()); +// assertNotNull(transcript.getBiotype()); +// assertTrue(transcript.getVariants().isEmpty()); +// } +// } +// } +// +// // It should be not possible to completely exclude knockoutType without excluding the whole variant information +// options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("name", "individuals.transcriptsMap.chromosome", +// "individuals.transcriptsMap.variants.knockoutType")); +// result = rgaEngine.geneQuery(collection, new Query(), options); +// assertEquals(4, result.getNumResults()); +// for (RgaKnockoutByGene gene : result.getResults()) { +// assertNotNull(gene.getId()); +// assertNull(gene.getName()); +//// assertNotNull(gene.getBiotype()); +// for (RgaKnockoutByGene.KnockoutIndividual individual : gene.getIndividuals()) { +// assertNotNull(individual.getId()); +// assertNotNull(individual.getSampleId()); +// for (KnockoutTranscript transcript : individual.getTranscripts()) { +// assertNotNull(transcript.getId()); +// assertNull(transcript.getChromosome()); +// assertNotNull(transcript.getBiotype()); +// assertFalse(transcript.getVariants().isEmpty()); +// for (KnockoutVariant variant : transcript.getVariants()) { +// assertNotNull(variant.getId()); +// assertNotNull(variant.getKnockoutType()); +// assertFalse(variant.getPopulationFrequencies().isEmpty()); +// } +// } +// } +// } +// } +// +// @Test +// public void testVariantQuery() throws Exception { +// OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), new QueryOptions()); +// +// assertEquals(6, result.getNumResults()); +// } +// +// @Test +// public void testIncludeExcludeVariantQuery() throws Exception { +// QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", +// "individuals.genesMap.name")); +// OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), options); +// assertEquals(6, result.getNumResults()); +// for (KnockoutByVariant variant : result.getResults()) { +// assertNotNull(variant.getId()); +// for (KnockoutByIndividual individual : variant.getIndividuals()) { +// assertNotNull(individual.getId()); +// assertTrue(individual.getPhenotypes().isEmpty()); +// assertNotNull(individual.getSampleId()); +// assertNotNull(individual.getDisorders()); +// assertNotNull(individual.getGenes()); +// for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { +// assertNotNull(gene.getId()); +// assertNotNull(gene.getName()); +// assertNull(gene.getStrand()); +// assertFalse(gene.getTranscripts().isEmpty()); +// } +// +// } +// } +// +// // Not possible excluding variants object because that's basic for this data model +// options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", +// "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants")); +// result = rgaEngine.variantQuery(collection, new Query(), options); +// assertEquals(6, result.getNumResults()); +// for (KnockoutByVariant variant : result.getResults()) { +// assertNotNull(variant.getId()); +// for (KnockoutByIndividual individual : variant.getIndividuals()) { +// assertNotNull(individual.getId()); +// assertFalse(individual.getPhenotypes().isEmpty()); +// assertNull(individual.getSampleId()); +// assertTrue(individual.getDisorders().isEmpty()); +// assertNotNull(individual.getGenes()); +// for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { +// assertNotNull(gene.getId()); +// assertNull(gene.getName()); +//// assertNotNull(gene.getStrand()); +// assertFalse(gene.getTranscripts().isEmpty()); +// for (KnockoutTranscript transcript : gene.getTranscripts()) { +// assertNotNull(transcript.getId()); +// assertNotNull(transcript.getBiotype()); +// assertFalse(transcript.getVariants().isEmpty()); +// } +// +// } +// } +// } +// +// // It should be not possible to completely exclude knockoutType without excluding the whole variant information +// options = new QueryOptions(QueryOptions.EXCLUDE, Arrays.asList("individuals.sampleId", "individuals.disorders", +// "individuals.genesMap.name", "individuals.genesMap.transcriptsMap.variants.knockoutType")); +// result = rgaEngine.variantQuery(collection, new Query(), options); +// assertEquals(6, result.getNumResults()); +// for (KnockoutByVariant variant : result.getResults()) { +// assertNotNull(variant.getId()); +// for (KnockoutByIndividual individual : variant.getIndividuals()) { +// assertNotNull(individual.getId()); +// assertFalse(individual.getPhenotypes().isEmpty()); +// assertNull(individual.getSampleId()); +// assertTrue(individual.getDisorders().isEmpty()); +// assertNotNull(individual.getGenes()); +// for (KnockoutByIndividual.KnockoutGene gene : individual.getGenes()) { +// assertNotNull(gene.getId()); +// assertNull(gene.getName()); +//// assertNotNull(gene.getStrand()); +// assertFalse(gene.getTranscripts().isEmpty()); +// for (KnockoutTranscript transcript : gene.getTranscripts()) { +// assertNotNull(transcript.getId()); +// assertNotNull(transcript.getBiotype()); +// assertFalse(transcript.getVariants().isEmpty()); +// for (KnockoutVariant tmpVariant : transcript.getVariants()) { +// assertNotNull(tmpVariant.getId()); +// assertNotNull(tmpVariant.getKnockoutType()); +// assertFalse(tmpVariant.getPopulationFrequencies().isEmpty()); +// } +// } +// } +// } +// } +// +// } @Test diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index b5303472694..434c2ac48e5 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -1,37 +1,61 @@ package org.opencb.opencga.analysis.rga; +import io.grpc.Context; +import jdk.nashorn.internal.parser.Token; import org.apache.solr.client.solrj.SolrServerException; +import org.junit.AfterClass; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.opencb.biodata.models.clinical.Disorder; +import org.opencb.biodata.models.clinical.Phenotype; +import org.opencb.biodata.models.pedigree.IndividualProperty; +import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.rga.exceptions.RgaException; +import org.opencb.opencga.analysis.tools.ToolRunner; +import org.opencb.opencga.analysis.variant.OpenCGATestExternalResource; +import org.opencb.opencga.analysis.variant.knockout.KnockoutAnalysis; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.managers.CatalogManagerExternalResource; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; +import org.opencb.opencga.core.models.cohort.CohortCreateParams; +import org.opencb.opencga.core.models.family.Family; +import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.file.FileLinkParams; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.individual.IndividualAclEntry; import org.opencb.opencga.core.models.individual.IndividualAclParams; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.sample.SampleAclParams; +import org.opencb.opencga.core.models.sample.SampleUpdateParams; import org.opencb.opencga.core.models.user.Account; +import org.opencb.opencga.core.models.variant.KnockoutAnalysisParams; import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.tools.result.ExecutionResult; import org.opencb.opencga.storage.core.StorageEngineFactory; +import org.opencb.opencga.storage.core.variant.VariantStorageEngine; +import org.opencb.opencga.storage.core.variant.VariantStorageOptions; +import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageEngine; +import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageTest; +import org.opencb.opencga.storage.hadoop.variant.VariantHbaseTestUtils; +import org.opencb.opencga.storage.hadoop.variant.adaptors.VariantHadoopDBAdaptor; +import org.opencb.opencga.storage.mongodb.variant.MongoDBVariantStorageEngine; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; @@ -39,207 +63,362 @@ public class RgaManagerTest { - private StorageConfiguration storageConfiguration; - - @Rule - public RgaSolrExtenalResource solr = new RgaSolrExtenalResource(); - - @Rule - public CatalogManagerExternalResource catalogManagerResource = new CatalogManagerExternalResource(); + public static final String USER = "user"; + public static final String PASSWORD = "asdf"; + public static final String PROJECT = "project"; + public static final String STUDY = "study"; + public static final String PHENOTYPE_NAME = "myPhenotype"; + public static final Phenotype PHENOTYPE = new Phenotype(PHENOTYPE_NAME, PHENOTYPE_NAME, "mySource") + .setStatus(Phenotype.Status.OBSERVED); + public static final String DB_NAME = "opencga_test_" + USER + "_" + PROJECT; private CatalogManager catalogManager; - private RgaEngine rgaEngine; + private VariantStorageManager variantStorageManager; private RgaManager rgaManager; - private String ownerToken; - private String userToken; - private String study; + public static OpenCGATestExternalResource opencga = new OpenCGATestExternalResource(); + + public static RgaSolrExtenalResource solr = new RgaSolrExtenalResource(); + + private static String storageEngine = MongoDBVariantStorageEngine.STORAGE_ENGINE_ID; + private static RgaEngine rgaEngine; + private static boolean indexed = false; + private static String token; + private static File file; @Before - public void before() throws IOException, CatalogException, RgaException, SolrServerException { - try (InputStream is = RgaEngineTest.class.getClassLoader().getResourceAsStream("storage-configuration.yml")) { - storageConfiguration = StorageConfiguration.load(is); - } + public void setUp() throws Throwable { + if (!indexed) { + opencga.after(); + opencga.before(); - catalogManager = catalogManagerResource.getCatalogManager(); - VariantStorageManager variantStorageManager = new VariantStorageManager(catalogManager, StorageEngineFactory.get(storageConfiguration)); + catalogManager = opencga.getCatalogManager(); + variantStorageManager = new VariantStorageManager(catalogManager, opencga.getStorageEngineFactory()); - rgaEngine = solr.configure(variantStorageManager, storageConfiguration); - rgaManager = new RgaManager(catalogManagerResource.getConfiguration(), storageConfiguration, rgaEngine); + opencga.clearStorageDB(DB_NAME); - loadCatalog(); - loadSolr(); - } + StorageConfiguration storageConfiguration = opencga.getStorageConfiguration(); + storageConfiguration.getVariant().setDefaultEngine(storageEngine); - private void loadCatalog() throws CatalogException { - catalogManager.getUserManager().create("user", "User Name", "mail@ebi.ac.uk", "user", "", null, Account.AccountType.FULL, null); - ownerToken = catalogManager.getUserManager().login("user", "user").getToken(); - - catalogManager.getUserManager().create("user2", "User Name", "mail@ebi.ac.uk", "user", "", null, Account.AccountType.FULL, null); - userToken = catalogManager.getUserManager().login("user2", "user").getToken(); - - String projectId = catalogManager.getProjectManager().create("1000G", "Project about some genomes", "", "Homo sapiens", - null, "GRCh38", new QueryOptions(), ownerToken).first().getId(); - study = catalogManager.getStudyManager().create(projectId, "phase1", null, "Phase 1", "Done", null, null, null, null, null, ownerToken) - .first().getFqn(); - - catalogManager.getIndividualManager().create(study, - new Individual() - .setId("id1") - .setSamples(Collections.singletonList(new Sample().setId("sample1"))), - QueryOptions.empty(), ownerToken); - catalogManager.getIndividualManager().create(study, - new Individual() - .setId("id2") - .setSamples(Collections.singletonList(new Sample().setId("sample2"))), - QueryOptions.empty(), ownerToken); - } + setUpCatalogManager(); - private void loadSolr() throws RgaException, IOException, SolrServerException { - String collection = getCollectionName(); - rgaEngine.create(collection); - List knockoutByIndividualList = new ArrayList<>(2); - knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(1)); - knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(2)); + file = opencga.createFile(STUDY, "variant-test-file.vcf.gz", token); + variantStorageManager.index(STUDY, file.getId(), opencga.createTmpOutdir("_index"), new ObjectMap(VariantStorageOptions.ANNOTATE.key(), true), token); - rgaEngine.insert(collection, knockoutByIndividualList); - } + for (int i = 0; i < file.getSampleIds().size(); i++) { + if (i % 2 == 0) { + String id = file.getSampleIds().get(i); + SampleUpdateParams updateParams = new SampleUpdateParams().setPhenotypes(Collections.singletonList(PHENOTYPE)); + catalogManager.getSampleManager().update(STUDY, id, updateParams, null, token); + } + } - private String getCollectionName() { - return catalogManager.getConfiguration().getDatabasePrefix() + "-rga-" + study.replace("@", "_").replace(":", "_"); - } + catalogManager.getCohortManager().create(STUDY, new CohortCreateParams().setId("c1").setSamples(file.getSampleIds().subList(0, 2)), null, null, null, token); + catalogManager.getCohortManager().create(STUDY, new CohortCreateParams().setId("c2").setSamples(file.getSampleIds().subList(2, 4)), null, null, null, token); + + Phenotype phenotype = new Phenotype("phenotype", "phenotype", ""); + Disorder disorder = new Disorder("disorder", "disorder", "", "", Collections.singletonList(phenotype), Collections.emptyMap()); + List individuals = new ArrayList<>(4); + + String father = "NA19661"; + String mother = "NA19660"; + String son = "NA19685"; + String daughter = "NA19600"; + // Father + individuals.add(catalogManager.getIndividualManager() + .create(STUDY, new Individual(father, father, IndividualProperty.Sex.MALE, null, null, 0, Collections.emptyList(), Collections.emptyMap()), Collections.singletonList(father), null, token).first()); + // Mother + individuals.add(catalogManager.getIndividualManager() + .create(STUDY, new Individual(mother, mother, IndividualProperty.Sex.FEMALE, null, null, 0, Collections.emptyList(), Collections.emptyMap()), Collections.singletonList(mother), null, token).first()); + // Son + individuals.add(catalogManager.getIndividualManager() + .create(STUDY, new Individual(son, son, IndividualProperty.Sex.MALE, null, null, 0, Collections.emptyList(), Collections.emptyMap()).setFather(individuals.get(0)).setMother(individuals.get(1)).setDisorders(Collections.singletonList(disorder)), Collections.singletonList(son), null, token).first()); + // Daughter + individuals.add(catalogManager.getIndividualManager() + .create(STUDY, new Individual(daughter, daughter, IndividualProperty.Sex.FEMALE, null, null, 0, Collections.emptyList(), Collections.emptyMap()).setFather(individuals.get(0)).setMother(individuals.get(1)), Collections.singletonList(daughter), null, token).first()); + catalogManager.getFamilyManager().create( + STUDY, + new Family("f1", "f1", Collections.singletonList(phenotype), Collections.singletonList(disorder), null, null, 3, null, null), + individuals.stream().map(Individual::getId).collect(Collectors.toList()), new QueryOptions(), token); + + solr.after(); + solr.before(); + + rgaEngine = solr.configure(opencga.getStorageConfiguration()); + } - @Test - public void testIndividualQueryPermissions() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.individualQuery(study, new Query(), QueryOptions.empty(), ownerToken); - assertEquals(2, result.getNumResults()); - - // Grant permissions to sample1 - catalogManager.getIndividualManager().updateAcl(study, Collections.emptyList(), "user2", new IndividualAclParams("sample1", - IndividualAclEntry.IndividualPermissions.VIEW.name()), ParamUtils.AclAction.ADD, false, ownerToken); - catalogManager.getSampleManager().updateAcl(study, Collections.singletonList("sample1"), "user2", - new SampleAclParams("", "", "", "", SampleAclEntry.SamplePermissions.VIEW.name() + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name()), ParamUtils.AclAction.ADD, ownerToken); - result = rgaManager.individualQuery(study, new Query(), QueryOptions.empty(), userToken); - assertEquals(1, result.getNumResults()); - assertEquals("sample1", result.first().getSampleId()); - assertEquals("id1", result.first().getId()); - } + catalogManager = opencga.getCatalogManager(); + variantStorageManager = new VariantStorageManager(catalogManager, opencga.getStorageEngineFactory()); + rgaManager = new RgaManager(catalogManager.getConfiguration(), opencga.getStorageConfiguration(), variantStorageManager, rgaEngine); - @Test - public void testIndividualQueryLimit() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.individualQuery(study, new Query(), new QueryOptions(QueryOptions.LIMIT, 1), - ownerToken); - assertEquals(1, result.getNumResults()); - assertEquals("sample1", result.first().getSampleId()); - } + if (!indexed) { + indexed = true; - @Test - public void testIndividualQuerySkip() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.individualQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1), - ownerToken); - assertEquals(1, result.getNumResults()); - assertEquals("sample2", result.first().getSampleId()); - } + ToolRunner toolRunner = new ToolRunner(opencga.getOpencgaHome().toString(), catalogManager, StorageEngineFactory.get(variantStorageManager.getStorageConfiguration())); - @Test - public void testGeneQueryPermissions() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.geneQuery(study, new Query(), QueryOptions.empty(), ownerToken); - assertEquals(4, result.getNumResults()); - for (RgaKnockoutByGene gene : result.getResults()) { - assertEquals(1, gene.getIndividuals().size()); - } + Path outDir = Paths.get(opencga.createTmpOutdir("_knockout_genes")); + System.out.println("outDir = " + outDir); + KnockoutAnalysisParams params = new KnockoutAnalysisParams(); + params.setSample(file.getSampleIds()); - // Grant permissions to sample1 - catalogManager.getIndividualManager().updateAcl(study, Collections.emptyList(), "user2", new IndividualAclParams("sample1", - IndividualAclEntry.IndividualPermissions.VIEW.name()), ParamUtils.AclAction.ADD, false, ownerToken); - catalogManager.getSampleManager().updateAcl(study, Collections.singletonList("sample1"), "user2", new SampleAclParams("", "", "", "", - SampleAclEntry.SamplePermissions.VIEW.name() + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name()), - ParamUtils.AclAction.ADD, ownerToken); - result = rgaManager.geneQuery(study, new Query(), QueryOptions.empty(), userToken); - assertEquals(4, result.getNumResults()); - List genes = result.getResults().stream().filter(g -> !g.getIndividuals().isEmpty()).collect(Collectors.toList()); - assertEquals(2, genes.size()); - for (RgaKnockoutByGene gene : genes) { - assertEquals(1, gene.getIndividuals().size()); - assertEquals("sample1", gene.getIndividuals().get(0).getSampleId()); + toolRunner.execute(KnockoutAnalysis.class, params.toObjectMap(), outDir, null, token); + + File file = catalogManager.getFileManager().link(STUDY, + new FileLinkParams() + .setUri(outDir.resolve("knockout.individuals.json.gz").toUri().toString()) + .setPath("."), + false, token).first(); + rgaManager.index(STUDY, file.getPath(), token); } } - @Test - public void testGeneQueryLimit() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.geneQuery(study, new Query(), new QueryOptions(QueryOptions.LIMIT, 1), - ownerToken); - assertEquals("geneId1", result.first().getId()); - assertEquals(1, result.getNumResults()); - assertEquals(1, result.first().getIndividuals().size()); + @AfterClass + public static void afterClass() { + opencga.after(); } - @Test - public void testGeneQuerySkip() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.geneQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1), - ownerToken); - assertEquals(3, result.getNumResults()); - assertTrue(result.getResults().stream().map(RgaKnockoutByGene::getId).collect(Collectors.toSet()) - .containsAll(Arrays.asList("geneId11", "geneId12", "geneId2"))); - for (RgaKnockoutByGene gene : result.getResults()) { - assertEquals(1, gene.getIndividuals().size()); + public void setUpCatalogManager() throws CatalogException { + catalogManager.getUserManager().create(USER, "User Name", "mail@ebi.ac.uk", PASSWORD, "", null, Account.AccountType.FULL, null); + token = catalogManager.getUserManager().login("user", PASSWORD).getToken(); + + String projectId = catalogManager.getProjectManager().create(PROJECT, "Project about some genomes", "", "Homo sapiens", + null, "GRCh37", new QueryOptions(), token).first().getId(); + catalogManager.getStudyManager().create(projectId, STUDY, null, "Phase 1", "Done", null, null, null, null, null, token); + + // Create 10 samples not indexed + for (int i = 0; i < 10; i++) { + Sample sample = new Sample().setId("SAMPLE_" + i); + if (i % 2 == 0) { + sample.setPhenotypes(Collections.singletonList(PHENOTYPE)); + } + catalogManager.getSampleManager().create(STUDY, sample, null, token); } } @Test - public void testVariantQueryPermissions() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.variantQuery(study, new Query(), QueryOptions.empty(), ownerToken); - assertEquals(6, result.getNumResults()); - assertEquals(4, result.getResults().stream().filter(v -> v.getIndividuals().size() == 2).count()); - assertEquals(2, result.getResults().stream().filter(v -> v.getIndividuals().size() == 1).count()); - - // Grant permissions to sample1 - catalogManager.getIndividualManager().updateAcl(study, Collections.emptyList(), "user2", new IndividualAclParams("sample1", - IndividualAclEntry.IndividualPermissions.VIEW.name()), ParamUtils.AclAction.ADD, false, ownerToken); - catalogManager.getSampleManager().updateAcl(study, Collections.singletonList("sample1"), "user2", new SampleAclParams("", "", "", "", - SampleAclEntry.SamplePermissions.VIEW.name() + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name()), - ParamUtils.AclAction.ADD, ownerToken); - result = rgaManager.variantQuery(study, new Query(), QueryOptions.empty(), userToken); - assertEquals(6, result.getNumResults()); - assertEquals(5, result.getResults().stream().filter(v -> v.getIndividuals().size() == 1).count()); - assertEquals(1, result.getResults().stream().filter(v -> v.getIndividuals().size() == 0).count()); - - for (KnockoutByVariant variant : result.getResults()) { - if (variant.getIndividuals().size() == 1) { - assertEquals("sample1", variant.getIndividuals().get(0).getSampleId()); - } - } + public void testIndividualQuery() throws IOException, CatalogException, RgaException { + OpenCGAResult result = rgaManager.individualQuery(STUDY, new Query(), QueryOptions.empty(), token); + assertEquals(4, result.getNumResults()); } @Test - public void testVariantQueryLimit() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.variantQuery(study, new Query(), new QueryOptions(QueryOptions.LIMIT, 1), - ownerToken); - assertEquals("variant2", result.first().getId()); - assertEquals(1, result.getNumResults()); - assertEquals(2, result.first().getIndividuals().size()); + public void testGeneQuery() throws IOException, CatalogException, RgaException { + OpenCGAResult result = rgaManager.geneQuery(STUDY, new Query(), QueryOptions.empty(), token); + assertEquals(10, result.getNumResults()); } @Test - public void testVariantQuerySkip() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.variantQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1), - ownerToken); - assertEquals(5, result.getNumResults()); - assertTrue(result.getResults().stream().map(KnockoutByVariant::getId).collect(Collectors.toSet()) - .containsAll(Arrays.asList("variant1", "variant3", "variant13", "variant12", "variant11"))); - assertEquals(3, result.getResults().stream().filter(v -> v.getIndividuals().size() == 2).count()); - assertEquals(2, result.getResults().stream().filter(v -> v.getIndividuals().size() == 1).count()); - - result = rgaManager.variantQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1).append(QueryOptions.LIMIT, 2), - ownerToken); - assertEquals(2, result.getNumResults()); - assertTrue(result.getResults().stream().map(KnockoutByVariant::getId).collect(Collectors.toSet()) - .containsAll(Arrays.asList("variant1", "variant3"))); - for (KnockoutByVariant variant : result.getResults()) { - assertEquals(2, variant.getIndividuals().size()); - } + public void testVariantQuery() throws IOException, CatalogException, RgaException { + OpenCGAResult result = rgaManager.variantQuery(STUDY, new Query(), QueryOptions.empty(), token); + assertEquals(10, result.getNumResults()); } + + +// private StorageConfiguration storageConfiguration; +// +// @Rule +// public RgaSolrExtenalResource solr = new RgaSolrExtenalResource(); +// +// @Rule +// public CatalogManagerExternalResource catalogManagerResource = new CatalogManagerExternalResource(); +// +// private CatalogManager catalogManager; +// private RgaEngine rgaEngine; +// private RgaManager rgaManager; +// +// private String ownerToken; +// private String userToken; +// private String study; +// +// @Before +// public void before() throws IOException, CatalogException, RgaException, SolrServerException { +// try (InputStream is = RgaEngineTest.class.getClassLoader().getResourceAsStream("storage-configuration.yml")) { +// storageConfiguration = StorageConfiguration.load(is); +// } +// +// catalogManager = catalogManagerResource.getCatalogManager(); +// VariantStorageManager variantStorageManager = new VariantStorageManager(catalogManager, StorageEngineFactory.get(storageConfiguration)); +// +// rgaEngine = solr.configure(storageConfiguration); +// rgaManager = new RgaManager(catalogManagerResource.getConfiguration(), storageConfiguration, variantStorageManager, rgaEngine); +// +// loadCatalog(); +// loadSolr(); +// } +// +// private void loadCatalog() throws CatalogException { +// catalogManager.getUserManager().create("user", "User Name", "mail@ebi.ac.uk", "user", "", null, Account.AccountType.FULL, null); +// ownerToken = catalogManager.getUserManager().login("user", "user").getToken(); +// +// catalogManager.getUserManager().create("user2", "User Name", "mail@ebi.ac.uk", "user", "", null, Account.AccountType.FULL, null); +// userToken = catalogManager.getUserManager().login("user2", "user").getToken(); +// +// String projectId = catalogManager.getProjectManager().create("1000G", "Project about some genomes", "", "Homo sapiens", +// null, "GRCh38", new QueryOptions(), ownerToken).first().getId(); +// study = catalogManager.getStudyManager().create(projectId, "phase1", null, "Phase 1", "Done", null, null, null, null, null, ownerToken) +// .first().getFqn(); +// +// catalogManager.getIndividualManager().create(study, +// new Individual() +// .setId("id1") +// .setSamples(Collections.singletonList(new Sample().setId("sample1"))), +// QueryOptions.empty(), ownerToken); +// catalogManager.getIndividualManager().create(study, +// new Individual() +// .setId("id2") +// .setSamples(Collections.singletonList(new Sample().setId("sample2"))), +// QueryOptions.empty(), ownerToken); +// } +// +// private void loadSolr() throws RgaException, IOException, SolrServerException { +// String collection = getCollectionName(); +// rgaEngine.create(collection); +// +// List knockoutByIndividualList = new ArrayList<>(2); +// knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(1)); +// knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(2)); +// +// IndividualRgaConverter rgaConverter = new IndividualRgaConverter(); +// List rgaDataModelList = rgaConverter.convertToStorageType(knockoutByIndividualList); +// rgaEngine.insert(collection, rgaDataModelList); +// } +// +// private String getCollectionName() { +// return catalogManager.getConfiguration().getDatabasePrefix() + "-rga-" + study.replace("@", "_").replace(":", "_"); +// } +// +// @Test +// public void testIndividualQueryPermissions() throws CatalogException, IOException, RgaException { +// OpenCGAResult result = rgaManager.individualQuery(study, new Query(), QueryOptions.empty(), ownerToken); +// assertEquals(2, result.getNumResults()); +// +// // Grant permissions to sample1 +// catalogManager.getIndividualManager().updateAcl(study, Collections.emptyList(), "user2", new IndividualAclParams("sample1", +// IndividualAclEntry.IndividualPermissions.VIEW.name()), ParamUtils.AclAction.ADD, false, ownerToken); +// catalogManager.getSampleManager().updateAcl(study, Collections.singletonList("sample1"), "user2", +// new SampleAclParams("", "", "", "", SampleAclEntry.SamplePermissions.VIEW.name() + "," +// + SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name()), ParamUtils.AclAction.ADD, ownerToken); +// result = rgaManager.individualQuery(study, new Query(), QueryOptions.empty(), userToken); +// assertEquals(1, result.getNumResults()); +// assertEquals("sample1", result.first().getSampleId()); +// assertEquals("id1", result.first().getId()); +// } +// +// @Test +// public void testIndividualQueryLimit() throws CatalogException, IOException, RgaException { +// OpenCGAResult result = rgaManager.individualQuery(study, new Query(), new QueryOptions(QueryOptions.LIMIT, 1), +// ownerToken); +// assertEquals(1, result.getNumResults()); +// assertEquals("sample1", result.first().getSampleId()); +// } +// +// @Test +// public void testIndividualQuerySkip() throws CatalogException, IOException, RgaException { +// OpenCGAResult result = rgaManager.individualQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1), +// ownerToken); +// assertEquals(1, result.getNumResults()); +// assertEquals("sample2", result.first().getSampleId()); +// } +// +// @Test +// public void testGeneQueryPermissions() throws CatalogException, IOException, RgaException { +// OpenCGAResult result = rgaManager.geneQuery(study, new Query(), QueryOptions.empty(), ownerToken); +// assertEquals(4, result.getNumResults()); +// for (RgaKnockoutByGene gene : result.getResults()) { +// assertEquals(1, gene.getIndividuals().size()); +// } +// +// // Grant permissions to sample1 +// catalogManager.getIndividualManager().updateAcl(study, Collections.emptyList(), "user2", new IndividualAclParams("sample1", +// IndividualAclEntry.IndividualPermissions.VIEW.name()), ParamUtils.AclAction.ADD, false, ownerToken); +// catalogManager.getSampleManager().updateAcl(study, Collections.singletonList("sample1"), "user2", new SampleAclParams("", "", "", "", +// SampleAclEntry.SamplePermissions.VIEW.name() + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name()), +// ParamUtils.AclAction.ADD, ownerToken); +// result = rgaManager.geneQuery(study, new Query(), QueryOptions.empty(), userToken); +// assertEquals(4, result.getNumResults()); +// List genes = result.getResults().stream().filter(g -> !g.getIndividuals().isEmpty()).collect(Collectors.toList()); +// assertEquals(2, genes.size()); +// for (RgaKnockoutByGene gene : genes) { +// assertEquals(1, gene.getIndividuals().size()); +// assertEquals("sample1", gene.getIndividuals().get(0).getSampleId()); +// } +// } +// +// @Test +// public void testGeneQueryLimit() throws CatalogException, IOException, RgaException { +// OpenCGAResult result = rgaManager.geneQuery(study, new Query(), new QueryOptions(QueryOptions.LIMIT, 1), +// ownerToken); +// assertEquals("geneId1", result.first().getId()); +// assertEquals(1, result.getNumResults()); +// assertEquals(1, result.first().getIndividuals().size()); +// } +// +// @Test +// public void testGeneQuerySkip() throws CatalogException, IOException, RgaException { +// OpenCGAResult result = rgaManager.geneQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1), +// ownerToken); +// assertEquals(3, result.getNumResults()); +// assertTrue(result.getResults().stream().map(RgaKnockoutByGene::getId).collect(Collectors.toSet()) +// .containsAll(Arrays.asList("geneId11", "geneId12", "geneId2"))); +// for (RgaKnockoutByGene gene : result.getResults()) { +// assertEquals(1, gene.getIndividuals().size()); +// } +// } +// +// @Test +// public void testVariantQueryPermissions() throws CatalogException, IOException, RgaException { +// OpenCGAResult result = rgaManager.variantQuery(study, new Query(), QueryOptions.empty(), ownerToken); +// assertEquals(6, result.getNumResults()); +// assertEquals(4, result.getResults().stream().filter(v -> v.getIndividuals().size() == 2).count()); +// assertEquals(2, result.getResults().stream().filter(v -> v.getIndividuals().size() == 1).count()); +// +// // Grant permissions to sample1 +// catalogManager.getIndividualManager().updateAcl(study, Collections.emptyList(), "user2", new IndividualAclParams("sample1", +// IndividualAclEntry.IndividualPermissions.VIEW.name()), ParamUtils.AclAction.ADD, false, ownerToken); +// catalogManager.getSampleManager().updateAcl(study, Collections.singletonList("sample1"), "user2", new SampleAclParams("", "", "", "", +// SampleAclEntry.SamplePermissions.VIEW.name() + "," + SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name()), +// ParamUtils.AclAction.ADD, ownerToken); +// result = rgaManager.variantQuery(study, new Query(), QueryOptions.empty(), userToken); +// assertEquals(6, result.getNumResults()); +// assertEquals(5, result.getResults().stream().filter(v -> v.getIndividuals().size() == 1).count()); +// assertEquals(1, result.getResults().stream().filter(v -> v.getIndividuals().size() == 0).count()); +// +// for (KnockoutByVariant variant : result.getResults()) { +// if (variant.getIndividuals().size() == 1) { +// assertEquals("sample1", variant.getIndividuals().get(0).getSampleId()); +// } +// } +// } +// +// @Test +// public void testVariantQueryLimit() throws CatalogException, IOException, RgaException { +// OpenCGAResult result = rgaManager.variantQuery(study, new Query(), new QueryOptions(QueryOptions.LIMIT, 1), +// ownerToken); +// assertEquals("variant2", result.first().getId()); +// assertEquals(1, result.getNumResults()); +// assertEquals(2, result.first().getIndividuals().size()); +// } +// +// @Test +// public void testVariantQuerySkip() throws CatalogException, IOException, RgaException { +// OpenCGAResult result = rgaManager.variantQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1), +// ownerToken); +// assertEquals(5, result.getNumResults()); +// assertTrue(result.getResults().stream().map(KnockoutByVariant::getId).collect(Collectors.toSet()) +// .containsAll(Arrays.asList("variant1", "variant3", "variant13", "variant12", "variant11"))); +// assertEquals(3, result.getResults().stream().filter(v -> v.getIndividuals().size() == 2).count()); +// assertEquals(2, result.getResults().stream().filter(v -> v.getIndividuals().size() == 1).count()); +// +// result = rgaManager.variantQuery(study, new Query(), new QueryOptions(QueryOptions.SKIP, 1).append(QueryOptions.LIMIT, 2), +// ownerToken); +// assertEquals(2, result.getNumResults()); +// assertTrue(result.getResults().stream().map(KnockoutByVariant::getId).collect(Collectors.toSet()) +// .containsAll(Arrays.asList("variant1", "variant3"))); +// for (KnockoutByVariant variant : result.getResults()) { +// assertEquals(2, variant.getIndividuals().size()); +// } +// } + } \ No newline at end of file diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java index 9e355298c51..69dcbeae465 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java @@ -72,10 +72,12 @@ protected void before() throws Throwable { protected void after() { super.after(); try { - if (embeded) { - ((RgaSolrExtenalResource.MyEmbeddedSolrServer) solrClient).realClose(); - } else { - solrClient.close(); + if (solrClient != null) { + if (embeded) { + ((RgaSolrExtenalResource.MyEmbeddedSolrServer) solrClient).realClose(); + } else { + solrClient.close(); + } } } catch (IOException e) { e.printStackTrace(); @@ -84,8 +86,8 @@ protected void after() { } } - public RgaEngine configure(VariantStorageManager variantStorageManager, StorageConfiguration storageConfiguration) { - RgaEngine rgaEngine = new RgaEngine(variantStorageManager, storageConfiguration); + public RgaEngine configure(StorageConfiguration storageConfiguration) { + RgaEngine rgaEngine = new RgaEngine(storageConfiguration); rgaEngine.setSolrManager(new SolrManager(solrClient, "localhost", "core")); return rgaEngine; } diff --git a/opencga-app/app/misc/solr/prepare_configsets.sh b/opencga-app/app/misc/solr/prepare_configsets.sh index 1f1a57e37f0..21187b00450 100755 --- a/opencga-app/app/misc/solr/prepare_configsets.sh +++ b/opencga-app/app/misc/solr/prepare_configsets.sh @@ -31,7 +31,7 @@ for name in variant rga file sample individual family cohort job; do if [ $name == "variant" ]; then cp -v $OPENCGA_HOME/opencga-storage/opencga-storage-core/target/classes/managed-schema $CONFIG_SET_DIR/conf elif [ $name == "rga" ]; then - cp -v $OPENCGA_HOME/opencga-storage/opencga-storage-core/target/classes/rga/managed-schema $CONFIG_SET_DIR/conf + cp -v $OPENCGA_HOME/opencga-clinical/target/classes/rga/managed-schema $CONFIG_SET_DIR/conf else cp -v $OPENCGA_HOME/opencga-catalog/target/classes/solr/$name-managed-schema $CONFIG_SET_DIR/conf/managed-schema fi diff --git a/opencga-clinical/pom.xml b/opencga-clinical/pom.xml index c217f91eb48..91fe81b1920 100644 --- a/opencga-clinical/pom.xml +++ b/opencga-clinical/pom.xml @@ -75,6 +75,15 @@ + + + src/main/resources + true + + rga/managed-schema + + + org.apache.maven.plugins diff --git a/opencga-clinical/src/main/resources/rga/managed-schema b/opencga-clinical/src/main/resources/rga/managed-schema index de7906fdd2a..7247d424ae8 100644 --- a/opencga-clinical/src/main/resources/rga/managed-schema +++ b/opencga-clinical/src/main/resources/rga/managed-schema @@ -596,7 +596,6 @@ - \n", "\n", - "The population studies included in OpenCGA include sources as **genomAD** and the **1000 Genomes**.\n", "\n", - "The structure for the query string should be: `{study}:{population}:{cohort}[<|>|<=|>=]{proportion}`" + "The population frequency studies indexed in OpenCGA include different sources such as **genomAD** or **1000 Genomes**.\n", + "\n", + "The syntax for the query paramter is: `{study}:{population}:{cohort}[<|>|<=|>=]{proportion}`. Note that you can specify several populations separated by comma (OR) or by semi-colon (AND), e.g. for all varaints less than 5% in two studies we shuold use `1kG_phase3:ALL<0.01;GNOMAD_GENOMES:ALL<0.01`" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by population freq maf:\n", + "Filter by population freq MAF:\n", "-----------------------------------\n", - "#Time: 346\n", - "#Num matches: 300711\n", + "#Time: 326\n", + "#Num matches: 47138\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", - "1:745347:T:C\tRP11-206L10.10,RP11-206L10.8,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", - "1:745371:A:-\tRP11-206L10.10,RP11-206L10.8,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", - "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", - "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", + "1:745347:T:C\tRP11-206L10.8,RP11-206L10.9,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "1:745371:A:-\tRP11-206L10.8,RP11-206L10.9,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:14948:G:A\tWASH7P,DDX11L1\tintron_variant\n", "\n", "\n", - "Filter by population freq ref:\n", + "Filter by population freq MAF:\n", "-----------------------------------\n", - "#Time: 359\n", - "#Num matches: 21153\n", + "#Time: 319\n", + "#Num matches: 33057\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:758324:T:C\tFAM87B,LINC00115,LINC01128\tupstream_gene_variant\n", - "1:780027:G:T\tLINC01128\tintron_variant\n", - "1:909768:A:G\tC1orf170,PLEKHN1\tintron_variant\n", - "1:914876:T:C\tC1orf170,PLEKHN1\tmissense_variant\n", - "1:982462:T:C\tAGRN\tintron_variant\n", + "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:936848:G:C\tHES4,RP11-54O7.17\t2KB_upstream_variant\n", + "1:1001178:T:G\tRP11-54O7.18,RP11-465B22.3\tintron_variant\n", + "1:1162673:G:C\tB3GALT6,SDF4\tnon_coding_transcript_exon_variant\n", + "1:1194356:T:C\tUBE2J2\tintron_variant\n", "\n", "\n", - "Filter by population freq alt:\n", + "Filter by population freq ALT:\n", "-----------------------------------\n", - "#Time: 342\n", - "#Num matches: 47138\n", + "#Time: 346\n", + "#Num matches: 6835\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", - "1:745347:T:C\tRP11-206L10.10,RP11-206L10.8,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", - "1:745371:A:-\tRP11-206L10.10,RP11-206L10.8,RP11-206L10.9\tnon_coding_transcript_exon_variant\n", - "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", - "1:14948:G:A\tWASH7P,DDX11L1\tintron_variant\n" + "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:936848:G:C\tHES4,RP11-54O7.17\t2KB_upstream_variant\n", + "1:1179800:G:A\tFAM132A\tsynonymous_variant\n", + "1:1226690:C:T\tSCNN1D,ACAP3\tsynonymous_variant\n", + "1:1294411:C:T\tMXRA8\tintron_variant\n" ] } ], "source": [ "## Filter by population frequency maf\n", - "populationFrequencyMaf='gnomAD_NFE:ALL<0.01'\n", - "variants = oc.variants.query(study=study, populationFrequencyMaf=populationFrequencyMaf, limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq maf:') # metadata=False\n", + "populationFrequencyAlt='1kG_phase3:ALL<0.01'\n", + "variants = oc.variants.query(study=study, populationFrequencyMaf=populationFrequencyAlt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq MAF:') # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", - "## Filter by population frequency reference \n", - "populationFrequencyRef='1kG_phase3:ALL<0.05'\n", - "variants = oc.variants.query(study=study, populationFrequencyRef=populationFrequencyRef, limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq ref:') # metadata=False\n", + "## Filter by two population frequency maf\n", + "## Remember to use commas for OR and semi-colon for AND \n", + "populationFrequencyAlt='1kG_phase3:ALL<0.01;GNOMAD_GENOMES:ALL<0.01'\n", + "variants = oc.variants.query(study=study, populationFrequencyMaf=populationFrequencyAlt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq MAF:') # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", "## Filter by population frequency alternate\n", - "populationFrequencyAlt='1kG_phase3:ALL<0.01'\n", - "variants = oc.variants.query(study=study, populationFrequencyAlt=populationFrequencyAlt, limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq alt:') # metadata=False\n", + "populationFrequencyAlt='1kG_phase3:ALL>0;1kG_phase3:ALL<0.01'\n", + "variants = oc.variants.query(study=study, populationFrequencyAlt=populationFrequencyAlt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq ALT:') # metadata=False\n", "\n", "## Uncomment next line to display an interactive JSON viewer\n", "# JSON(variants.get_results())" @@ -35891,82 +608,193 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Filter by Clinical Information\n", + "## 6. Filter by Cohort Stats\n", "\n", - "OpenCGA allows to filter variants by its clinical significance using the parameter `clinicalSignificance`.\n", - "The accepted values include: **benign, likely_benign, likely_pathogenic, pathogenic, unknown_significance????**\n", + "..." + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by Cohort Stats:\n", + "----------------------------\n", + "#Time: 7353\n", + "#Num matches: 318143620\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:21211954:T:C\t\tintergenic_variant\n", + "1:21211959:C:T\t\tintergenic_variant\n", + "1:21211966:A:G\t\tintergenic_variant\n", + "1:21211967:T:C\t\tintergenic_variant\n", + "1:21211969:C:T\t\tintergenic_variant\n" + ] + } + ], + "source": [ + "## Filter by Cohort Stats\n", + "cohort_stats = study + ':ALL<0.0001'\n", + "variants = oc.variants.query(study=study, cohortStatsAlt=cohort_stats, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Cohort Stats:') # metadata=False\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Filter by Clinical Information\n", + "\n", + "OpenCGA allows to filter variants by ClinVar clinical significance using the parameter `clinicalSignificance`.\n", + "The accepted values are: **benign, likely_benign, uncertain_significance, likely_pathogenic, pathogenic**.\n", "\n", "There are also other parameters like `geneTraitId`, which accept list of gene trait association ids, e.g: **\"umls:C0007222\" , \"OMIM:269600\"**." ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 111, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by Clinical Significance:\n", - "-------------------------------------\n", - "#Time: 357\n", - "#Num matches: 55\n", + "Filter by Clinical Significances:\n", + "--------------------------------------\n", + "#Time: 245\n", + "#Num matches: 13578\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "2:227892720:C:T\tCOL4A4\tmissense_variant\n", - "22:18905964:C:T\tPRODH,DGCR6\tmissense_variant\n", - "3:39307162:G:A\tCX3CR1\tmissense_variant\n", - "3:39307256:C:T\tCX3CR1\tmissense_variant\n", - "4:187158034:G:A\tKLKB1\tmissense_variant\n", + "1:21220008:G:A\tECE1\tmissense_variant\n", + "1:21225411:G:A\tECE1\tmissense_variant\n", + "1:21563158:G:A\tALPL\tmissense_variant\n", + "1:21563212:A:C\tALPL\tmissense_variant\n", + "1:21563213:C:A\tALPL\tmissense_variant\n", "\n", "\n", - "Filter by population gene trait\n", - "------------------------------------\n", - "#Time: 352\n", - "#Num matches: 55\n", + "Filter by population gene traits\n", + "-------------------------------------\n", + "#Time: 1886\n", + "#Num matches: 150591\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:27676925:G:A\tSYTL1,MAP3K6\tsynonymous_variant\n", - "1:27679797:A:G\tSYTL1,MAP3K6\tmissense_variant\n", - "1:27679954:G:A\tSYTL1,MAP3K6\tsynonymous_variant\n", - "1:27680292:A:G\tSYTL1,MAP3K6\tsynonymous_variant\n", - "1:27682126:T:C\tSYTL1,MAP3K6\tintron_variant\n" + "1:27350195:C:A\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n", + "1:27350206:C:A\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n", + "1:27350240:T:C\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n", + "1:27350243:GGA:-\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n", + "1:27350246:G:A\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n" ] } ], "source": [ "## Filter by Clinical Significance\n", - "clinicalSignificance = 'likely_pathogenic,pathogenic'\n", - "variants = oc.variants.query(study=study, clinicalSignificance=clinicalSignificance, limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Clinical Significance:') # metadata=False\n", + "clinical_significance = 'likely_pathogenic,pathogenic'\n", + "variants = oc.variants.query(study=study, clinicalSignificance=clinical_significance, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Clinical Significances:') # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", "## Filter by population gene trait \n", - "geneTraitId = 'OMIM:137215' #GASTRIC CANCER, HEREDITARY DIFFUSE; HDGC\n", - "variants = oc.variants.query(study=study, geneTraitId=geneTraitId, limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population gene trait') # metadata=False\n" + "gene_trait_id = 'OMIM:137215,OMIM:613659' #GASTRIC CANCER terms\n", + "variants = oc.variants.query(study=study, geneTraitId=gene_trait_id, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population gene traits') # metadata=False\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Bulding Complex Queries" + "## 8. Disease Panel\n", + "\n", + "OpenCGA allows users to define and store disease panels with genes and variants, you can easily filter by **disease panel** using the parameter `panel`, e.g. `panel=Amyloidosis`" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 112, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by Disease Panel:\n", + "-----------------------------\n", + "#Time: 702\n", + "#Num matches: 41776\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:161217294:A:G\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "1:161217297:G:A\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "1:161217327:C:A\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "1:161217331:C:T\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "1:161217332:A:G\tNDUFS2,FCER1G,APOA2\tintron_variant\n" + ] + } + ], + "source": [ + "## Filter by Clinical Significance\n", + "variants = oc.variants.query(study=study, panel='Amyloidosis-PanelAppId-502', exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Disease Panel:') # metadata=False\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 9. Bulding Complex Queries" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by Disease Panel:\n", + "-----------------------------\n", + "#Time: 610\n", + "#Num matches: 41776\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:161217294:A:G\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "1:161217297:G:A\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "1:161217327:C:A\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "1:161217331:C:T\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "1:161217332:A:G\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "\n", + "\n" + ] + } + ], + "source": [ + "## Filter by Clinical Significance\n", + "variants = oc.variants.query(study=study, panel='Amyloidosis-PanelAppId-502', exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Disease Panel:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n" + ] }, { "cell_type": "markdown", @@ -35985,14 +813,14 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 114, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Sample ID for the next examples is: ISDBM322016\n" + "Sample ID for the next examples is: SAM24284359\n" ] } ], @@ -36005,27 +833,27 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 115, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by sample ISDBM322016:\n", + "Filter by sample SAM24284359:\n", "----------------------------------\n", - "#Time: 367\n", - "#Num matches: 164776\n", + "#Time: 3669\n", + "#Num matches: 5350951\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", - "1:14930:A:G\tWASH7P,DDX11L1\tintron_variant\n", - "1:15211:T:G\tWASH7P,DDX11L1\tintron_variant\n", - "1:17538:C:A\tWASH7P,DDX11L1\tintron_variant\n", - "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n" + "1:13550:G:A\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:13613:T:A\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:13684:C:T\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:13813:T:G\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:13838:C:T\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n" ] } ], @@ -36043,43 +871,43 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 116, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by sample ISDBM322016:0/1:\n", + "Filter by sample SAM24284359:0/1:\n", "--------------------------------------\n", - "#Time: 398\n", - "#Num matches: 68280\n", + "#Time: 1203\n", + "#Num matches: 3363660\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", - "1:14930:A:G\tWASH7P,DDX11L1\tintron_variant\n", - "1:15211:T:G\tWASH7P,DDX11L1\tintron_variant\n", - "1:17538:C:A\tWASH7P,DDX11L1\tintron_variant\n", - "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:13550:G:A\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:13613:T:A\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:13684:C:T\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:13813:T:G\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:13838:C:T\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", "\n", "\n", - "Filter by sample ISDBM322016:1/1:\n", + "Filter by sample SAM24284359:1/1:\n", "--------------------------------------\n", - "#Time: 302\n", - "#Num matches: 96044\n", + "#Time: 3652\n", + "#Num matches: 1770536\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", - "1:69511:A:G\tOR4F5\tmissense_variant\n", - "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", - "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", - "1:753405:C:A\tRP11-206L10.10,FAM87B\tnon_coding_transcript_exon_variant\n" + "1:15904:-:C\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:19004:A:G\tWASH7P,DDX11L1,MIR6859-1\tintron_variant\n", + "1:21769:C:T\tWASH7P,MIR6859-1\tintron_variant\n", + "1:28563:A:G\tMIR1302-2,WASH7P,MIR1302-2HG\tintron_variant\n", + "1:39261:T:C\tFAM138A\tupstream_gene_variant\n" ] } ], @@ -36098,7 +926,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Filter by Mode of Inheritance" + "## Filter by Mode of Inheritance\n", + "\n", + "\n", + "**IMPORTANT NOTE** Only for families!" ] }, { @@ -36117,43 +948,43 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 117, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "All 1/1 variants for sample ISDBM322016:1/1:\n", + "All 1/1 variants for sample SAM24284359:1/1:\n", "-------------------------------------------------\n", - "#Time: 305\n", - "#Num matches: 96044\n", + "#Time: 1292\n", + "#Num matches: 1770536\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", - "1:69511:A:G\tOR4F5\tmissense_variant\n", - "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", - "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", - "1:753405:C:A\tRP11-206L10.10,FAM87B\tnon_coding_transcript_exon_variant\n", + "1:15904:-:C\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:19004:A:G\tWASH7P,DDX11L1,MIR6859-1\tintron_variant\n", + "1:21769:C:T\tWASH7P,MIR6859-1\tintron_variant\n", + "1:28563:A:G\tMIR1302-2,WASH7P,MIR1302-2HG\tintron_variant\n", + "1:39261:T:C\tFAM138A\tupstream_gene_variant\n", "\n", "\n", - "PASS 1/1 variants for sample ISDBM322016:1/1:\n", + "PASS 1/1 variants for sample SAM24284359:1/1:\n", "--------------------------------------------------\n", - "#Time: 332\n", - "#Num matches: 89302\n", + "#Time: 5741\n", + "#Num matches: 1571118\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", - "1:752566:G:A\tRP11-206L10.10,FAM87B\tintron_variant\n", - "1:752721:A:G\tRP11-206L10.10,FAM87B\tintron_variant\n", - "1:808631:G:A\tTUBB8P11,FAM41C\tintron_variant\n", - "1:812267:A:G\tTUBB8P11,FAM41C\tnon_coding_transcript_exon_variant\n" + "1:779968:T:G\tAL669831.5,AL669831.3,AL669831.1\tintron_variant\n", + "1:788419:AG:-\tAL669831.5,AL669831.3\tintron_variant\n", + "1:789569:ATGGA:-\tAL669831.5,AL669831.3\tintron_variant\n", + "1:817186:G:A\tAL669831.4,AL669831.3,FAM87B\tintron_variant\n", + "1:817341:A:G\tAL669831.4,AL669831.3,FAM87B\tintron_variant\n" ] } ], @@ -36164,7 +995,6 @@ "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='All 1/1 variants for sample {}:'.format(genotype)) # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", - "\n", "variants = oc.variants.query(study=study, sample=genotype, filter='PASS', limit=5, count=True) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='PASS 1/1 variants for sample {}:'.format(genotype)) # metadata=False\n" ] @@ -36178,27 +1008,27 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 118, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by sample ISDBM322016:1/1:\n", + "Filter by sample SAM24284359:1/1:\n", "--------------------------------------\n", - "#Time: 334\n", - "#Num matches: 10\n", + "#Time: 2909\n", + "#Num matches: 26\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "13:32884653:G:T\tZAR1L,BRCA2\tintron_variant\n", - "13:32905265:G:A\tBRCA2\tintron_variant\n", - "13:32913055:A:G\tBRCA2\tsynonymous_variant\n", - "13:32915005:G:C\tBRCA2\tsynonymous_variant\n", - "13:32920844:T:C\tBRCA2\tintron_variant\n" + "13:32315831:G:A\tBRCA2,ZAR1L\tintron_variant\n", + "13:32318080:C:T\tBRCA2,ZAR1L\tintron_variant\n", + "13:32321240:G:C\tBRCA2\tintron_variant\n", + "13:32325549:-:T\tBRCA2\tintron_variant\n", + "13:32325741:C:T\tBRCA2\tintron_variant\n" ] } ], @@ -36216,6 +1046,35 @@ "-------" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Aggrgagatinh by Variant Annotation" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "variants = oc.variants.aggregation_stats(study=study, gene='BRCA2', fields=\"type\", limit=5) # Other params: exclude='annotation'\n", + "# variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", + "# JSON(variants.get_results())\n", + "\n", + "variants = oc.variants.aggregation_stats(study=study, fields=\"chromosome>>type\", limit=5) # Other params: exclude='annotation'\n", + "# variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", + "# JSON(variants.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. ...by sample" + ] + }, { "cell_type": "code", "execution_count": null, @@ -36379,9 +1238,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} From a60e0a54ab62f43046a5d0c1b57ffff532ea5530 Mon Sep 17 00:00:00 2001 From: imedina Date: Thu, 15 Apr 2021 03:33:00 +0100 Subject: [PATCH 177/412] clients: more work on variant query notebook --- .../pyopencga_variant_query.ipynb | 627 +++++++++++------- 1 file changed, 398 insertions(+), 229 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 534a8bcef03..13ae68b09bf 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -34,14 +34,14 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Logged succesfuly to https://ws.opencb.org/opencga-prod, eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTg0MzM1MDksImV4cCI6MTYxODQzNzEwOX0.yx2Vi4lnzlNNktG-F7X9K96rqqBZmLEvh0CK0C3NUOg well done!\n" + "Logged succesfuly to https://ws.opencb.org/opencga-prod, eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTg0NTA5ODQsImV4cCI6MTYxODQ1NDU4NH0.0-mZQ4e5opmBBaf7gwArYQL_RLTf2GWZELmCs_IueeM well done!\n" ] } ], @@ -102,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -154,7 +154,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 76, "metadata": {}, "outputs": [ { @@ -163,7 +163,7 @@ "text": [ "Filter by Region\n", "---------------------\n", - "#Time: 1081\n", + "#Time: 937\n", "#Num matches: 360\n", "#Num results: 360\n", "#Num inserted: 0\n", @@ -179,7 +179,9 @@ "15:22864438:A:G\t,TUBGCP5\tintron_variant\n", "15:22866621:G:A\t,TUBGCP5\tintron_variant\n", "15:22867123:-:AAG\t,TUBGCP5\tnon_coding_transcript_exon_variant\n", - "15:22869804:A:G\t,TUBGCP5\tintron_variant\n" + "15:22869804:A:G\t,TUBGCP5\tintron_variant\n", + "\n", + "\n" ] } ], @@ -187,7 +189,8 @@ "## Filter by a small region of chromsome 15\n", "variants = oc.variants.query(study=study, region='15:21242091-23226874', exclude='studies', limit=500)\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Region', limit=10) # metadata=False\n", - "#JSON(variants.get_results())\n" + "print(RESULT_SEPARATOR)\n", + "#JSON(variants.get_results())" ] }, { @@ -279,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 86, "metadata": {}, "outputs": [ { @@ -288,50 +291,48 @@ "text": [ "Filter by SNV\n", "------------------\n", - "#Time: 83\n", - "#Num matches: 367091496\n", + "#Time: 242\n", + "#Num matches: 288538\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:21211952:G:A\t\tintergenic_variant\n", - "1:21211954:T:C\t\tintergenic_variant\n", - "1:21211959:C:T\t\tintergenic_variant\n", - "1:21211966:A:G\t\tintergenic_variant\n", - "1:21211967:T:C\t\tintergenic_variant\n", + "1:546952:T:C\t,RP5-857K21.4\tintron_variant\n", + "1:745347:T:C\t,RP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", + "1:752566:G:A\t,RP11-206L10.10,FAM87B\tintron_variant\n", + "1:752721:A:G\t,RP11-206L10.10,FAM87B\tintron_variant\n", + "1:753405:C:A\t,RP11-206L10.10,FAM87B\tnon_coding_transcript_exon_variant\n", "\n", "\n", "Filter by SNV.INDEL\n", "------------------------\n", - "#Time: 10141\n", - "#Num matches: 421990628\n", + "#Time: 267\n", + "#Num matches: 300709\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:21211952:G:A\t\tintergenic_variant\n", - "1:21211954:T:C\t\tintergenic_variant\n", - "1:21211959:C:T\t\tintergenic_variant\n", - "1:21211966:A:G\t\tintergenic_variant\n", - "1:21211967:T:C\t\tintergenic_variant\n", + "1:546952:T:C\t,RP5-857K21.4\tintron_variant\n", + "1:745347:T:C\t,RP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", + "1:745371:A:-\t,RP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", + "1:752566:G:A\t,RP11-206L10.10,FAM87B\tintron_variant\n", + "1:752721:A:G\t,RP11-206L10.10,FAM87B\tintron_variant\n", "\n", "\n", "Filter by DELETION\n", "-----------------------\n", - "#Time: 114\n", - "#Num matches: 426783\n", - "#Num results: 5\n", + "#Time: 232\n", + "#Num matches: 1\n", + "#Num results: 1\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:21214296:CTTCTATGTGAATCAGTTTTTCAAGTTCCATGAAAAATTACCTTGAGATTTTGGTTGAGAGTATA:-\tECE1\tdownstream_gene_variant\n", - "1:21224565:GAAGGCCTCAATAAATGACAGCTCTATGGATTTCTGCTCTTACTGCCGTGGTTGGGAGGAAGCCCTGT:-\tECE1\tintron_variant\n", - "1:21228727:TGCAGTGAGCTGAGATTGAGCCACTGCACTCCAGCCTGGGTGACAGAGCAAGGCTATCTCAAAAAAAAAAGAAAAAAGAAAAGAAAAAGATTTTGAAAAGTCACCACTGAAGAGTATCTTTTTTTTTTTTTTTGAGACGGAGCTCACTCTGTCACCCAGGCTGGAG:-\tECE1\tintron_variant\n", - "1:21231069:CCACCCGCCTTGGCCTCCCAAAGTGCTGGGATTACAGACGTGAGCCACCGCGCC:-\tECE1\tintron_variant\n", - "1:21266166:ATGCTGCTGGGATAGGGGTGTCTGGGAATCCCCCACGCGCTGCTGGGATAGGGGTGTCTGGGAATCCCCCAC:-\t,AL031005.1,ECE1\tintron_variant\n" + "12:133197450:GCCTGGGACTGACCCGGGCTCTCGAGGGGCCTCTCGTGTGCCCTTGTGACCCCCTTCCCTG:-\t,P2RX2,POLE\tintron_variant\n", + "\n", + "\n" ] } ], @@ -348,7 +349,8 @@ "\n", "# Filter by ...\n", "variants = oc.variants.query(study=study, type='DELETION', exclude='studies', limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by DELETION')" + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by DELETION')\n", + "print(RESULT_SEPARATOR)" ] }, { @@ -366,7 +368,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 85, "metadata": {}, "outputs": [ { @@ -375,34 +377,36 @@ "text": [ "Filter by Transcripts: ['ENST00000530893']\n", "-----------------------------------------------\n", - "#Time: 154\n", - "#Num matches: 3422\n", + "#Time: 293\n", + "#Num matches: 10\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "13:32330945:T:C\tBRCA2\tsynonymous_variant\n", - "13:32330947:A:C\tBRCA2\tmissense_variant\n", - "13:32330951:-:AAG\tBRCA2\tinframe_insertion\n", - "13:32330968:A:G\tBRCA2\tmissense_variant\n", - "13:32330977:T:C\tBRCA2\tmissense_variant\n", + "13:32884653:G:T\t,ZAR1L,BRCA2\tintron_variant\n", + "13:32889968:G:A\t,ZAR1L,BRCA2\tintron_variant\n", + "13:32890572:G:A\t,ZAR1L,BRCA2\t5_prime_UTR_variant\n", + "13:32900933:T:A\t,BRCA2\tintron_variant\n", + "13:32903685:C:T\t,BRCA2\tintron_variant\n", "\n", "\n", "Filter by Genes: BRCA2\n", "---------------------------\n", - "#Time: 96\n", - "#Num matches: 12082\n", + "#Time: 298\n", + "#Num matches: 26\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "13:32330945:T:C\tBRCA2\tsynonymous_variant\n", - "13:32330947:A:C\tBRCA2\tmissense_variant\n", - "13:32330951:-:AAG\tBRCA2\tinframe_insertion\n", - "13:32330968:A:G\tBRCA2\tmissense_variant\n", - "13:32330977:T:C\tBRCA2\tmissense_variant\n" + "13:32884653:G:T\t,ZAR1L,BRCA2\tintron_variant\n", + "13:32889968:G:A\t,ZAR1L,BRCA2\tintron_variant\n", + "13:32890572:G:A\t,ZAR1L,BRCA2\t5_prime_UTR_variant\n", + "13:32900933:T:A\t,BRCA2\tintron_variant\n", + "13:32903685:C:T\t,BRCA2\tintron_variant\n", + "\n", + "\n" ] } ], @@ -415,9 +419,10 @@ "## Filter by gene\n", "variants = oc.variants.query(study=study, gene=genes, exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Genes: {}'.format(genes))\n", + "print(RESULT_SEPARATOR)\n", "\n", "## Uncomment next line to display an interactive JSON viewer\n", - "# JSON(variants.get_results())\n" + "# JSON(variants.get_results())" ] }, { @@ -431,7 +436,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 84, "metadata": {}, "outputs": [ { @@ -440,50 +445,52 @@ "text": [ "Filter by missense_variant:\n", "--------------------------------\n", - "#Time: 154\n", - "#Num matches: 2673732\n", + "#Time: 261\n", + "#Num matches: 15401\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:21219966:C:T\tECE1\tmissense_variant\n", - "1:21219981:G:C\tECE1\tmissense_variant\n", - "1:21220008:G:A\tECE1\tmissense_variant\n", - "1:21220040:A:C\tECE1\tmissense_variant\n", - "1:21220055:C:T\tECE1\tmissense_variant\n", + "1:69511:A:G\t,OR4F5\tmissense_variant\n", + "1:909238:G:C\tC1orf170,,PLEKHN1\tmissense_variant\n", + "1:909309:T:C\tC1orf170,,PLEKHN1\tmissense_variant\n", + "1:914876:T:C\tC1orf170,,PLEKHN1\tmissense_variant\n", + "1:916549:A:G\tC1orf170,\tmissense_variant\n", "\n", "\n", "Filter by missense_variant,stop_gained:\n", "--------------------------------------------\n", - "#Time: 261\n", - "#Num matches: 2755509\n", + "#Time: 254\n", + "#Num matches: 15578\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:21219966:C:T\tECE1\tmissense_variant\n", - "1:21219981:G:C\tECE1\tmissense_variant\n", - "1:21220008:G:A\tECE1\tmissense_variant\n", - "1:21220040:A:C\tECE1\tmissense_variant\n", - "1:21220055:C:T\tECE1\tmissense_variant\n", + "1:69511:A:G\t,OR4F5\tmissense_variant\n", + "1:909238:G:C\tC1orf170,,PLEKHN1\tmissense_variant\n", + "1:909309:T:C\tC1orf170,,PLEKHN1\tmissense_variant\n", + "1:914876:T:C\tC1orf170,,PLEKHN1\tmissense_variant\n", + "1:916549:A:G\tC1orf170,\tmissense_variant\n", "\n", "\n", "Filter by lof:\n", "-------------------\n", - "#Time: 1150\n", - "#Num matches: 1027943\n", + "#Time: 306\n", + "#Num matches: 5075\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:21220129:G:C\tECE1\tsplice_region_variant\n", - "1:21221742:C:T\tECE1\tsplice_region_variant\n", - "1:21227154:C:T\tECE1\tsplice_region_variant\n", - "1:21227230:G:T\tECE1\tsplice_region_variant\n", - "1:21233550:G:A\tECE1\tsplice_region_variant\n" + "1:897730:C:T\t,PLEKHN1,KLHL17,NOC2L\tsplice_region_variant\n", + "1:977330:T:C\t,AGRN\tsplice_region_variant\n", + "1:987200:C:T\t,AGRN,RP11-54O7.14\tsplice_region_variant\n", + "1:1233941:T:C\t,ACAP3\tsplice_region_variant\n", + "1:1558792:T:C\tMIB2\tstart_lost\n", + "\n", + "\n" ] } ], @@ -501,9 +508,10 @@ "## Filter by misense variants and stop_gained\n", "variants = oc.variants.query(study=study, ct='lof', exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by lof:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", "\n", "## Uncomment next line to display an interactive JSON viewer\n", - "#JSON(variants.get_results())\n" + "#JSON(variants.get_results())" ] }, { @@ -525,7 +533,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 75, "metadata": {}, "outputs": [ { @@ -534,50 +542,52 @@ "text": [ "Filter by population freq MAF:\n", "-----------------------------------\n", - "#Time: 326\n", + "#Time: 283\n", "#Num matches: 47138\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:546952:T:C\tRP5-857K21.4\tintron_variant\n", - "1:745347:T:C\tRP11-206L10.8,RP11-206L10.9,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", - "1:745371:A:-\tRP11-206L10.8,RP11-206L10.9,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", - "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", - "1:14948:G:A\tWASH7P,DDX11L1\tintron_variant\n", + "1:546952:T:C\t,RP5-857K21.4\tintron_variant\n", + "1:745347:T:C\t,RP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", + "1:745371:A:-\t,RP11-206L10.9,RP11-206L10.10,RP11-206L10.8\tnon_coding_transcript_exon_variant\n", + "1:14907:A:G\t,WASH7P,DDX11L1\tintron_variant\n", + "1:14948:G:A\t,WASH7P,DDX11L1\tintron_variant\n", "\n", "\n", "Filter by population freq MAF:\n", "-----------------------------------\n", - "#Time: 319\n", + "#Time: 283\n", "#Num matches: 33057\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n", - "1:936848:G:C\tHES4,RP11-54O7.17\t2KB_upstream_variant\n", - "1:1001178:T:G\tRP11-54O7.18,RP11-465B22.3\tintron_variant\n", - "1:1162673:G:C\tB3GALT6,SDF4\tnon_coding_transcript_exon_variant\n", - "1:1194356:T:C\tUBE2J2\tintron_variant\n", + "1:63336:C:T\t,OR4G11P\tnon_coding_transcript_exon_variant\n", + "1:936848:G:C\tHES4,,RP11-54O7.17\t2KB_upstream_variant\n", + "1:1001178:T:G\t,RP11-54O7.18,RP11-465B22.3\tintron_variant\n", + "1:1162673:G:C\tB3GALT6,,SDF4\tnon_coding_transcript_exon_variant\n", + "1:1194356:T:C\t,UBE2J2\tintron_variant\n", "\n", "\n", "Filter by population freq ALT:\n", "-----------------------------------\n", - "#Time: 346\n", + "#Time: 275\n", "#Num matches: 6835\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n", - "1:936848:G:C\tHES4,RP11-54O7.17\t2KB_upstream_variant\n", - "1:1179800:G:A\tFAM132A\tsynonymous_variant\n", - "1:1226690:C:T\tSCNN1D,ACAP3\tsynonymous_variant\n", - "1:1294411:C:T\tMXRA8\tintron_variant\n" + "1:63336:C:T\t,OR4G11P\tnon_coding_transcript_exon_variant\n", + "1:936848:G:C\tHES4,,RP11-54O7.17\t2KB_upstream_variant\n", + "1:1179800:G:A\tFAM132A,\tsynonymous_variant\n", + "1:1226690:C:T\t,ACAP3,SCNN1D\tsynonymous_variant\n", + "1:1294411:C:T\t,MXRA8\tintron_variant\n", + "\n", + "\n" ] } ], @@ -589,7 +599,7 @@ "print(RESULT_SEPARATOR)\n", "\n", "## Filter by two population frequency maf\n", - "## Remember to use commas for OR and semi-colon for AND \n", + "## Remember to use commas for OR and semi-colon for AND\n", "populationFrequencyAlt='1kG_phase3:ALL<0.01;GNOMAD_GENOMES:ALL<0.01'\n", "variants = oc.variants.query(study=study, populationFrequencyMaf=populationFrequencyAlt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq MAF:') # metadata=False\n", @@ -599,6 +609,7 @@ "populationFrequencyAlt='1kG_phase3:ALL>0;1kG_phase3:ALL<0.01'\n", "variants = oc.variants.query(study=study, populationFrequencyAlt=populationFrequencyAlt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq ALT:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", "\n", "## Uncomment next line to display an interactive JSON viewer\n", "# JSON(variants.get_results())" @@ -610,12 +621,13 @@ "source": [ "## 6. Filter by Cohort Stats\n", "\n", - "..." + "OpenCGA allows users to define cohorts of samples and calculate and index the allele and genotype frequencies among other stats. By default, a cohosrt called **ALL** containing all samples is defined and the variant stats are calculated.\n", + "You can filter by the internal cohort stats using the parameter `cohortStatsAlt`, e.g. `{study}:ALL<0.0001`" ] }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 83, "metadata": {}, "outputs": [ { @@ -624,18 +636,14 @@ "text": [ "Filter by Cohort Stats:\n", "----------------------------\n", - "#Time: 7353\n", - "#Num matches: 318143620\n", - "#Num results: 5\n", + "#Time: 272\n", + "#Num matches: 0\n", + "#Num results: 0\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", - "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:21211954:T:C\t\tintergenic_variant\n", - "1:21211959:C:T\t\tintergenic_variant\n", - "1:21211966:A:G\t\tintergenic_variant\n", - "1:21211967:T:C\t\tintergenic_variant\n", - "1:21211969:C:T\t\tintergenic_variant\n" + "\n", + "\n" ] } ], @@ -643,7 +651,8 @@ "## Filter by Cohort Stats\n", "cohort_stats = study + ':ALL<0.0001'\n", "variants = oc.variants.query(study=study, cohortStatsAlt=cohort_stats, exclude='studies', limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Cohort Stats:') # metadata=False\n" + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Cohort Stats:') # metadata=False\n", + "print(RESULT_SEPARATOR)" ] }, { @@ -660,7 +669,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 82, "metadata": {}, "outputs": [ { @@ -669,34 +678,36 @@ "text": [ "Filter by Clinical Significances:\n", "--------------------------------------\n", - "#Time: 245\n", - "#Num matches: 13578\n", + "#Time: 279\n", + "#Num matches: 55\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:21220008:G:A\tECE1\tmissense_variant\n", - "1:21225411:G:A\tECE1\tmissense_variant\n", - "1:21563158:G:A\tALPL\tmissense_variant\n", - "1:21563212:A:C\tALPL\tmissense_variant\n", - "1:21563213:C:A\tALPL\tmissense_variant\n", + "2:227892720:C:T\tCOL4A4\tmissense_variant\n", + "22:18905964:C:T\tDGCR6,,PRODH\tmissense_variant\n", + "3:39307162:G:A\t,CX3CR1\tmissense_variant\n", + "3:39307256:C:T\t,CX3CR1\tmissense_variant\n", + "4:187158034:G:A\tKLKB1\tmissense_variant\n", "\n", "\n", "Filter by population gene traits\n", "-------------------------------------\n", - "#Time: 1886\n", - "#Num matches: 150591\n", + "#Time: 303\n", + "#Num matches: 154\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:27350195:C:A\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n", - "1:27350206:C:A\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n", - "1:27350240:T:C\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n", - "1:27350243:GGA:-\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n", - "1:27350246:G:A\tMAP3K6,SYTL1\tnon_coding_transcript_exon_variant\n" + "1:45795084:G:A\t,HPDL,MUTYH\tmissense_variant\n", + "1:45796269:G:C\t,HPDL,MUTYH\tintron_variant\n", + "1:45797505:C:G\t,HPDL,MUTYH\tmissense_variant\n", + "1:45798555:T:C\t,HPDL,MUTYH\tnon_coding_transcript_exon_variant\n", + "1:45805566:G:C\tTOE1,,MUTYH,TESK2\tsplice_region_variant\n", + "\n", + "\n" ] } ], @@ -710,7 +721,8 @@ "## Filter by population gene trait \n", "gene_trait_id = 'OMIM:137215,OMIM:613659' #GASTRIC CANCER terms\n", "variants = oc.variants.query(study=study, geneTraitId=gene_trait_id, exclude='studies', limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population gene traits') # metadata=False\n" + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population gene traits') # metadata=False\n", + "print(RESULT_SEPARATOR)" ] }, { @@ -724,7 +736,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 74, "metadata": {}, "outputs": [ { @@ -733,67 +745,122 @@ "text": [ "Filter by Disease Panel:\n", "-----------------------------\n", - "#Time: 702\n", - "#Num matches: 41776\n", + "#Time: 303\n", + "#Num matches: 78\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:161217294:A:G\tNDUFS2,FCER1G,APOA2\tintron_variant\n", - "1:161217297:G:A\tNDUFS2,FCER1G,APOA2\tintron_variant\n", - "1:161217327:C:A\tNDUFS2,FCER1G,APOA2\tintron_variant\n", - "1:161217331:C:T\tNDUFS2,FCER1G,APOA2\tintron_variant\n", - "1:161217332:A:G\tNDUFS2,FCER1G,APOA2\tintron_variant\n" + "20:23607874:T:G\tCST3,RP11-218C14.8,\t2KB_downstream_variant\n", + "20:23610375:G:C\tCST3,RP11-218C14.8,\tintron_variant\n", + "20:23615820:-:CA\tCST3,RP11-218C14.8,\tintron_variant\n", + "20:23616996:A:T\tCST3,RP11-218C14.8,\tintron_variant\n", + "20:23618395:T:C\tCST3,\tsynonymous_variant\n", + "\n", + "\n" ] } ], "source": [ "## Filter by Clinical Significance\n", "variants = oc.variants.query(study=study, panel='Amyloidosis-PanelAppId-502', exclude='studies', limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Disease Panel:') # metadata=False\n" + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Disease Panel:') # metadata=False\n", + "print(RESULT_SEPARATOR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 9. Bulding Complex Queries" + "## 9. Bulding Complex Queries\n", + "\n", + "OpenCGA implements a very advanced variant query engine that allows to combine many filters to build very complex and useful queries. In this section you will find some examples." ] }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 77, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by Disease Panel:\n", - "-----------------------------\n", - "#Time: 610\n", - "#Num matches: 41776\n", + "Filter by Consequence Type and Disease Panel:\n", + "--------------------------------------------------\n", + "#Time: 281\n", + "#Num matches: 1\n", + "#Num results: 1\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "12:69744014:C:A\tLYZ,,RP11-1143G9.4\tmissense_variant\n", + "\n", + "\n", + "Filter by Consequence Type and Clinical Significance:\n", + "----------------------------------------------------------\n", + "#Time: 275\n", + "#Num matches: 34\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:161217294:A:G\tNDUFS2,FCER1G,APOA2\tintron_variant\n", - "1:161217297:G:A\tNDUFS2,FCER1G,APOA2\tintron_variant\n", - "1:161217327:C:A\tNDUFS2,FCER1G,APOA2\tintron_variant\n", - "1:161217331:C:T\tNDUFS2,FCER1G,APOA2\tintron_variant\n", - "1:161217332:A:G\tNDUFS2,FCER1G,APOA2\tintron_variant\n", + "22:18905964:C:T\tDGCR6,,PRODH\tmissense_variant\n", + "3:39307162:G:A\t,CX3CR1\tmissense_variant\n", + "3:39307256:C:T\t,CX3CR1\tmissense_variant\n", + "4:187158034:G:A\tKLKB1\tmissense_variant\n", + "3:38645420:T:C\t,SCN5A\tmissense_variant\n", + "\n", + "\n", + "Filter by Consequence Type, Clinical Significance and Cohort Satats:\n", + "-------------------------------------------------------------------------\n", + "#Time: 276\n", + "#Num matches: 0\n", + "#Num results: 0\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "\n", + "\n", + "Filter by Consequence Type, Clinical Significance and Cohort Satats:\n", + "-------------------------------------------------------------------------\n", + "#Time: 254\n", + "#Num matches: 0\n", + "#Num results: 0\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", "\n", "\n" ] } ], "source": [ - "## Filter by Clinical Significance\n", - "variants = oc.variants.query(study=study, panel='Amyloidosis-PanelAppId-502', exclude='studies', limit=5) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Disease Panel:') # metadata=False\n", - "print(RESULT_SEPARATOR)\n" + "## Filter by Consequence Type and Disease Panel\n", + "variants = oc.variants.query(study=study, ct='lof,missense_variant', panel='Amyloidosis-PanelAppId-502', exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Consequence Type and Disease Panel:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by Consequence Type and Clinical Significance\n", + "variants = oc.variants.query(study=study, ct='lof,missense_variant', clinicalSignificance='pathogenic', exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Consequence Type and Clinical Significance:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by Consequence Type, Clinical Significance and Cohort Satats\n", + "cohort_stats = study + ':ALL<0.005'\n", + "variants = oc.variants.query(study=study, ct='lof,missense_variant', clinicalSignificance='likely_pathogenic,pathogenic', cohortStatsAlt=cohort_stats, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Consequence Type, Clinical Significance and Cohort Satats:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by Consequence Type, Clinical Significance and Cohort Satats\n", + "populationFrequencyAlt='1kG_phase3:ALL<0.01;GNOMAD_GENOMES:ALL<0.01'\n", + "variants = oc.variants.query(study=study, ct='lof,missense_variant', clinicalSignificance='likely_pathogenic,pathogenic', cohortStatsAlt=cohort_stats, populationFrequencyMaf=populationFrequencyAlt\n", + ", exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Consequence Type, Clinical Significance and Cohort Satats:') # metadata=False\n", + "print(RESULT_SEPARATOR)" ] }, { @@ -808,234 +875,338 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Filter By Sample" + "## 1. Filter By Sample\n", + "\n", + "OpenCGA implements different parameters to allow users to filter variants for a given sample or set of samples, you just need to use the parameter `sample`" ] }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Sample ID for the next examples is: SAM24284359\n" + "Sample IDs for the next examples are: ISDBM322016 and ISDBM322017\n", + "\n" ] } ], "source": [ - "resp = oc.samples.search(study=study, limit=1)\n", - "sample_id = resp.get_result(0)['id']\n", - "print('Sample ID for the next examples is: {}'.format(sample_id))\n", - "# JSON(resp.get_results())" + "resp = oc.samples.search(study=study, limit=2)\n", + "sample_id1 = resp.get_result(0)['id']\n", + "sample_id2 = resp.get_result(1)['id']\n", + "# JSON(resp.get_results())\n", + "print('Sample IDs for the next examples are: {} and {}\\n'.format(sample_id1, sample_id2))" ] }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by sample SAM24284359:\n", + "Filter by sample ISDBM322016:\n", "----------------------------------\n", - "#Time: 3669\n", - "#Num matches: 5350951\n", + "#Time: 406\n", + "#Num matches: 164776\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:13550:G:A\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:13613:T:A\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:13684:C:T\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:13813:T:G\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:13838:C:T\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n" + "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:14930:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:15211:T:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:17538:C:A\tWASH7P,DDX11L1\tintron_variant\n", + "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "\n", + "\n" ] } ], "source": [ - "variants = oc.variants.query(study=study, sample=sample_id, limit=5, count=True) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(sample_id)) # metadata=False\n" + "## Fetch all variants for one sample\n", + "variants = oc.variants.query(study=study, sample=sample_id1, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(sample_id1)) # metadata=False\n", + "print(RESULT_SEPARATOR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Filter by Genotype" + "## 2. Filter by Genotype\n", + "\n", + "One of the most useful functionality is filter by genotype, you just need to add the genoype to the `sample` parameter.\n" ] }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by sample SAM24284359:0/1:\n", + "Filter by sample ISDBM322016:0/1:\n", "--------------------------------------\n", - "#Time: 1203\n", - "#Num matches: 3363660\n", + "#Time: 359\n", + "#Num matches: 68280\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:13550:G:A\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:13613:T:A\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:13684:C:T\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:13813:T:G\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:13838:C:T\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", + "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:14930:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:15211:T:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:17538:C:A\tWASH7P,DDX11L1\tintron_variant\n", + "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n", "\n", "\n", - "Filter by sample SAM24284359:1/1:\n", + "Filter by sample ISDBM322016:1/1:\n", "--------------------------------------\n", - "#Time: 3652\n", - "#Num matches: 1770536\n", + "#Time: 298\n", + "#Num matches: 96044\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:15904:-:C\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:19004:A:G\tWASH7P,DDX11L1,MIR6859-1\tintron_variant\n", - "1:21769:C:T\tWASH7P,MIR6859-1\tintron_variant\n", - "1:28563:A:G\tMIR1302-2,WASH7P,MIR1302-2HG\tintron_variant\n", - "1:39261:T:C\tFAM138A\tupstream_gene_variant\n" + "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:69511:A:G\tOR4F5\tmissense_variant\n", + "1:752566:G:A\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:752721:A:G\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:753405:C:A\tFAM87B,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "\n", + "\n" ] } ], "source": [ - "genotype = sample_id + ':0/1'\n", + "## Filter HET variants\n", + "genotype = sample_id1 + ':0/1'\n", "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", - "genotype = sample_id + ':1/1'\n", + "## Filter HOM variants\n", + "genotype = sample_id1 + ':1/1'\n", "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n" + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", + "print(RESULT_SEPARATOR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Filter by Mode of Inheritance\n", + "You can also filter using **more than sample** and query using OR or AND." + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by samples ISDBM322016:1/1,ISDBM322017:0/1,1/1:\n", + "-----------------------------------------------------------\n", + "#Time: 734\n", + "#Num matches: 184240\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:14907:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:14930:A:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:14948:G:A\tWASH7P,DDX11L1\tintron_variant\n", + "1:15211:T:G\tWASH7P,DDX11L1\tintron_variant\n", + "1:63336:C:T\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "\n", + "\n", + "Filter by samples ISDBM322016:1/1;ISDBM322017:0/1,1/1:\n", + "-----------------------------------------------------------\n", + "#Time: 535\n", + "#Num matches: 55734\n", + "#Num results: 5\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:69511:A:G\tOR4F5\tmissense_variant\n", + "1:752566:G:A\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:752721:A:G\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:753405:C:A\tFAM87B,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", + "\n", + "\n" + ] + } + ], + "source": [ + "## Filter all HOM variants for two samples\n", + "genotype = sample_id1 + ':1/1,' + sample_id2 + ':0/1,1/1'\n", + "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by samples {}:'.format(genotype)) # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter common HOM variants for two samples\n", + "genotype = sample_id1 + ':1/1;' + sample_id2 + ':0/1,1/1'\n", + "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by samples {}:'.format(genotype)) # metadata=False\n", + "print(RESULT_SEPARATOR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Filter by Mode of Inheritance\n", "\n", + "OpenCGA also implemets queris by different seggregation modes such as recessive, compound heterozygous or de Novo.\n", "\n", - "**IMPORTANT NOTE** Only for families!" + "**IMPORTANT NOTE** This only works for families!" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 64, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "## Filter by autosomalRecessive\n", + "genotype = sample_id1 + ':autosomalRecessive'\n", + "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by autosomalRecessive {}:'.format(genotype)) # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by compoundHeterozygous\n", + "genotype = sample_id1 + ':compoundHeterozygous'\n", + "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by compoundHeterozygous {}:'.format(genotype)) # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by deNovo\n", + "genotype = sample_id1 + ':deNovo'\n", + "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by deNovo {}:'.format(genotype)) # metadata=False\n", + "print(RESULT_SEPARATOR)" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Filter by VCF data" + "## 4. Filter by VCF data\n", + "\n", + "You can also filter by any field in the VCF file, one of the most interesting is filtering by PASS variants" ] }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "All 1/1 variants for sample SAM24284359:1/1:\n", + "All 1/1 variants for sample ISDBM322016:1/1:\n", "-------------------------------------------------\n", - "#Time: 1292\n", - "#Num matches: 1770536\n", + "#Time: 324\n", + "#Num matches: 96044\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:15904:-:C\tWASH7P,DDX11L1,MIR6859-1\tnon_coding_transcript_exon_variant\n", - "1:19004:A:G\tWASH7P,DDX11L1,MIR6859-1\tintron_variant\n", - "1:21769:C:T\tWASH7P,MIR6859-1\tintron_variant\n", - "1:28563:A:G\tMIR1302-2,WASH7P,MIR1302-2HG\tintron_variant\n", - "1:39261:T:C\tFAM138A\tupstream_gene_variant\n", + "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:69511:A:G\tOR4F5\tmissense_variant\n", + "1:752566:G:A\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:752721:A:G\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:753405:C:A\tFAM87B,RP11-206L10.10\tnon_coding_transcript_exon_variant\n", "\n", "\n", - "PASS 1/1 variants for sample SAM24284359:1/1:\n", + "PASS 1/1 variants for sample ISDBM322016:1/1:\n", "--------------------------------------------------\n", - "#Time: 5741\n", - "#Num matches: 1571118\n", + "#Time: 489\n", + "#Num matches: 89302\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:779968:T:G\tAL669831.5,AL669831.3,AL669831.1\tintron_variant\n", - "1:788419:AG:-\tAL669831.5,AL669831.3\tintron_variant\n", - "1:789569:ATGGA:-\tAL669831.5,AL669831.3\tintron_variant\n", - "1:817186:G:A\tAL669831.4,AL669831.3,FAM87B\tintron_variant\n", - "1:817341:A:G\tAL669831.4,AL669831.3,FAM87B\tintron_variant\n" + "1:63736:CTA:-\tOR4G11P\tnon_coding_transcript_exon_variant\n", + "1:752566:G:A\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:752721:A:G\tFAM87B,RP11-206L10.10\tintron_variant\n", + "1:808631:G:A\tTUBB8P11,FAM41C\tintron_variant\n", + "1:812267:A:G\tTUBB8P11,FAM41C\tnon_coding_transcript_exon_variant\n", + "\n", + "\n" ] } ], "source": [ - "genotype = sample_id + ':1/1'\n", - "\n", + "## Filter HOM variants\n", + "genotype = sample_id1 + ':1/1'\n", "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='All 1/1 variants for sample {}:'.format(genotype)) # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", + "## Filter PASS HOM variants\n", "variants = oc.variants.query(study=study, sample=genotype, filter='PASS', limit=5, count=True) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='PASS 1/1 variants for sample {}:'.format(genotype)) # metadata=False\n" + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='PASS 1/1 variants for sample {}:'.format(genotype)) # metadata=False\n", + "print(RESULT_SEPARATOR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Building Complex queries" + "## 5. Building Complex queries\n", + "\n", + "You can combine any filter to build more complex queries." ] }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by sample SAM24284359:1/1:\n", - "--------------------------------------\n", - "#Time: 2909\n", - "#Num matches: 26\n", - "#Num results: 5\n", + "Filter by sample ISDBM322016:0/1,1/1:\n", + "------------------------------------------\n", + "#Time: 337\n", + "#Num matches: 0\n", + "#Num results: 0\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", - "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "13:32315831:G:A\tBRCA2,ZAR1L\tintron_variant\n", - "13:32318080:C:T\tBRCA2,ZAR1L\tintron_variant\n", - "13:32321240:G:C\tBRCA2\tintron_variant\n", - "13:32325549:-:T\tBRCA2\tintron_variant\n", - "13:32325741:C:T\tBRCA2\tintron_variant\n" + "\n", + "\n" ] } ], "source": [ - "genotype = sample_id + ':1/1'\n", - "variants = oc.variants.query(study=study, sample=genotype, gene='BRCA2', limit=5, count=True) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n" + "genotype = sample_id1 + ':0/1,1/1'\n", + "variants = oc.variants.query(study=study, sample=genotype, gene='BRCA2,TP53', clinicalSignificance='likely_pathogenic,pathogenic', limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", + "print(RESULT_SEPARATOR)" ] }, { @@ -1050,21 +1221,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 1. Aggrgagatinh by Variant Annotation" + "## 1. Variant Aggregation Stats using Variant Annotation" ] }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 88, "metadata": {}, "outputs": [], "source": [ "variants = oc.variants.aggregation_stats(study=study, gene='BRCA2', fields=\"type\", limit=5) # Other params: exclude='annotation'\n", - "# variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", "# JSON(variants.get_results())\n", "\n", "variants = oc.variants.aggregation_stats(study=study, fields=\"chromosome>>type\", limit=5) # Other params: exclude='annotation'\n", - "# variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", "# JSON(variants.get_results())" ] }, @@ -1072,7 +1241,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2. ...by sample" + "## 2. Variant Aggregation Stats by Sample" ] }, { @@ -1094,7 +1263,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Fetch all samples per Variant\n", + "## 1. Fetch all samples per Variant\n", "\n", "1. Apply different filters to obtain the desired variants\n", "2. Get the samples containing those variants\n", @@ -1206,7 +1375,7 @@ } }, "source": [ - "## Sample Variant Stats\n", + "## 2. Sample Variant Stats\n", "\n", "1. Choose one random sample from catalog\n", "2. sample stats query" From af47e79925e6a320e2bef1ffafd7c6c0f3b8afd7 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 15 Apr 2021 07:53:44 +0100 Subject: [PATCH 178/412] client: changes in catalog notebook --- .../notebooks/user-training/pyopencga_catalog.ipynb | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 63936a30b40..389cec35e4a 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -5,12 +5,8 @@ "id": "modern-charge", "metadata": {}, "source": [ - "# *pyopencga* Catalog: Clinical Data and other Metadata. \n", - "\n", + "# Overview\n", "------\n", - "\n", - "## Overview\n", - "\n", "This notebook is intended to provide guidance for querying an OpenCGA server through *pyopencga* to explore studies which the user has access to, Clinical data provided in the study (Samples, Individuals Genotypes etc.) and other types of metadata, like permissions.\n", "\n", "A good first step when start working with OpenCGA is to retrieve information about our user, which projects and studies are we allowed to see.
\n", @@ -27,7 +23,7 @@ "id": "proved-cassette", "metadata": {}, "source": [ - "## 1. Setup the Client and Login into *pyopencga* \n", + "## Setup the Client and Login into *pyopencga* \n", "\n", "**Configuration and Credentials** \n", "\n", @@ -124,11 +120,10 @@ "id": "european-gabriel", "metadata": {}, "source": [ - "# 2. Use Cases \n", + "## Use Cases \n", "\n", "In this seciton we are going to show how to work with some of the most common scenarios.
\n", - "The user-cases addresed here constute a high-level introduction aimed to provide a basis for the user to make their own explorations. This example can be adapted to each individual user-case.\n", - "\n" + "The user-cases addresed here constute a high-level introduction aimed to provide a basis for the user to make their own explorations. This example can be adapted to each individual user-case.\n" ] }, { From fb8d3a1fd01ac00e503762ff3d3e73b8341d703a Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 15 Apr 2021 09:16:50 +0100 Subject: [PATCH 179/412] client: more improvements to notebooks --- .../user-training/pyopencga_catalog.ipynb | 264 +++++++++++------- .../pyopencga_variant_query.ipynb | 15 +- 2 files changed, 166 insertions(+), 113 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 28fdcaf1697..48e7f51200d 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "conventional-sculpture", "metadata": {}, "source": [ "# Overview\n", @@ -19,6 +20,7 @@ }, { "cell_type": "markdown", + "id": "random-civilization", "metadata": {}, "source": [ "## Setup the Client and Login into *pyopencga* \n", @@ -32,62 +34,66 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 2, + "id": "indoor-webster", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Config information:\n", - " {'rest': {'host': 'https://ws.opencb.org/opencga-prod'}}\n" + "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTg0Njk3OTIsImV4cCI6MTYxODQ3MzM5Mn0.F_ivsxLcOS4K-k0a9v_QRI4lGXFeIUL4mS8Xd2ucgSw well done!\n" ] } ], "source": [ + "## Step 1. Import pyopencga dependecies\n", "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", "from pyopencga.opencga_client import OpencgaClient # import client module\n", "from pprint import pprint\n", - "import json\n", + "from IPython.display import JSON\n", + "# import json\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import datetime\n", "\n", - "####################################\n", - "## Configuration parameters #######\n", - "####################################\n", - "# OpenCGA host\n", + "## Step 2. OpenCGA host\n", "host = 'https://ws.opencb.org/opencga-prod'\n", + "# host = 'http://localhost:1234/opencga'\n", "\n", - "# User credentials\n", + "## Step 3. User credentials\n", "user = 'demouser'\n", "passwd = 'demouser' ## you can skip this, see below.\n", - "study = 'demo@family:platinum'\n", "####################################\n", "\n", - "# Creating ClientConfiguration dict\n", + "## Step 4. Create the ClientConfiguration dict\n", "config_dict = {'rest': {\n", " 'host': host \n", " }\n", " }\n", - "print('Config information:\\n',config_dict)\n", "\n", - "# Pass the config_dict dictionary to the ClientConfiguration method\n", + "## Step 5. Create the ClientConfiguration and OpenCGA client\n", "config = ClientConfiguration(config_dict)\n", - "\n", - "# Create the client\n", "oc = OpencgaClient(config)\n", "\n", + "## Step 6. Login to OpenCGA using the OpenCGA client \n", "# Pass the credentials to the client\n", "# (here we put only the user in order to be asked for the password interactively)\n", "# oc.login(user)\n", "\n", "# or you can pass the user and passwd\n", "oc.login(user, passwd)\n", - "\n" + "\n", + "print('Logged succesfuly to {}, your token is: {} well done!'.format(host, oc.token))\n" ] }, { "cell_type": "markdown", + "id": "assisted-dakota", "metadata": {}, "source": [ + "## Setup OpenCGA Variables\n", + "\n", "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. \n", "\n", "Over the user case addressed in this notebook we will be performing queries to the **users, projects, studies, samples, individuals and cohorts**
*OpenCGA* data models." @@ -96,11 +102,11 @@ { "cell_type": "code", "execution_count": 6, + "id": "ecological-warning", "metadata": {}, "outputs": [], "source": [ - "## Define variables to query different data models through the web services\n", - "\n", + "## Define variables to query data models \n", "user_client = oc.users\n", "project_client = oc.projects\n", "study_client = oc.studies\n", @@ -112,9 +118,11 @@ }, { "cell_type": "markdown", + "id": "prostate-cancellation", "metadata": {}, "source": [ - "## Use Cases \n", + "# Use Cases \n", + "------\n", "\n", "In this seciton we are going to show how to work with some of the most common scenarios.
\n", "The user-cases addresed here constute a high-level introduction aimed to provide a basis for the user to make their own explorations. This example can be adapted to each individual user-case.\n" @@ -122,9 +130,10 @@ }, { "cell_type": "markdown", + "id": "becoming-perception", "metadata": {}, "source": [ - "## 2.1 Exploring User Account: Permissios, Projects and Studies\n", + "## Exploring User Account: Permissios, Projects and Studies\n", "\n", "In this use case we cover retrieving information for our user.\n", "\n", @@ -141,29 +150,34 @@ }, { "cell_type": "markdown", + "id": "collective-dylan", "metadata": {}, "source": [ - "### 2.1.1 Exploring Projects and Studies" + "### 1. Exploring Projects and Studies" ] }, { "cell_type": "markdown", + "id": "passing-grenada", "metadata": {}, "source": [ + "#### Users:\n", "Depending on the permissions granted, a user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our user and its permissions by:" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 27, + "id": "environmental-storage", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Using printe_results function:\n", - "#Time: 13\n", + "Using print_results() function:\n", + "------------------------------------\n", + "#Time: 15\n", "#Num matches: -1\n", "#Num results: 1\n", "#Num inserted: 0\n", @@ -172,34 +186,41 @@ "#id\taccount.type\tprojects\n", "demouser\tGUEST\t.\n", "\n", - "Using REST response API:\n", - "User info:\n", - "id:demouser\taccount_type: GUEST\t projects_owned: 0\n" + "User info using REST response API:\n", + "id:demouser\taccount_type: GUEST\t projects_owned: 0\n", + "\n", + "We can appreciate that our user demouser has 0 projects from its own: []\n" ] } ], "source": [ "## Getting user information\n", "## [NOTE] User needs the quey_id string directly --> (user)\n", - "print(\"Using printe_results function:\")\n", - "user_info_resp = user_client.info(user)\n", - "user_info_resp.print_results(\"id,account.type,projects\") #, metadata=False\n", + "#Print using the print_results() function:\n", + "user_info_resp = oc.users.info(user)\n", + "user_info_resp.print_results(\"id,account.type,projects\", title='Using print_results() function:') #, metadata=False\n", "\n", - "print(\"\\nUsing REST response API:\")\n", - "user_info = user_client.info(user).get_result(0)\n", - "print('User info:')\n", - "print('id:{}\\taccount_type: {}\\t projects_owned: {}'.format(user_info['id'], user_info['account']['type'], len(user_info['projects'])))\n" + "# Using REST response API:\n", + "print(\"\\nUser info using REST response API:\")\n", + "user_info = oc.users.info(user).get_result(0)\n", + "user_id = user_info['id'] # Define our user_id\n", + "user_projects = user_info['projects'] # Define projects owned by our user\n", + "print('id:{}\\taccount_type: {}\\t projects_owned: {}'.format(user_id, user_info['account']['type'], len(user_projects)))\n", + "\n", + "print('\\nWe can appreciate that our user: {} has {} projects from its own: {}'.format(user_id, len(user_projects), user_projects))" ] }, { "cell_type": "markdown", + "id": "personal-chosen", "metadata": {}, "source": [ - "We can appreciate that our user (demouser) has **not** projects from its own.
However, the user might has been granted access to some projects from other users. Let's see how to find this out:" + "
However, the user might has been granted access to some projects from other users. Let's see how to find this out:" ] }, { "cell_type": "markdown", + "id": "essential-learning", "metadata": {}, "source": [ "#### Projects:\n", @@ -208,13 +229,16 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 30, + "id": "biblical-visibility", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Projects our user (demouser) has access to:\n", + "------------------------------------------------\n", "#id\tname\torganism.scientificName\torganism.assembly\tfqn\n", "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\tdemo@family\n", "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\tdemo@population\n" @@ -225,79 +249,98 @@ "## Getting user projects\n", "## [NOTE] Client specific methods have the query_id as a key:value (i.e (user=user_id)) \n", "\n", - "projects_info = project_client.search()\n", - "projects_info.print_results(fields='id,name,organism.scientificName,organism.assembly,fqn', metadata=False)\n" + "projects_info = oc.projects.search()\n", + "projects_info.print_results(fields='id,name,organism.scientificName,organism.assembly,fqn', title='Projects our user ({}) has access to:'.format(user_id), metadata=False)" ] }, { "cell_type": "markdown", + "id": "restricted-shelter", "metadata": {}, "source": [ - "As we can see, our user (*demouser*) has access been granted access to 2 different projects:\n", - "- Project: **family**\n", - "- Project: **population**\n", - "\n", - "The **fqn** `demo@population` and `demo@family` show that those projects are owned by the user *demo*, who have shared the permission to see them with us.\n" + "The **fqn** `owner@project` shows the owner of the project/s; this owner has granted permission to our user to the projects above.\n" ] }, { "cell_type": "markdown", + "id": "single-float", "metadata": {}, "source": [ - "#### Studies\n", - "Now, let's see which studies do we have access within the **family** project." + "#### Studies:\n", + "Now, let's see which studies do we have access within the a project." ] }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 38, + "id": "significant-powell", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "project:family\t study_id:platinum\t study_fqn:demo@family:platinum \n", - "project:family\t study_id:corpasome\t study_fqn:demo@family:corpasome \n" + "For this user-case, we can use project:family\n" ] } ], "source": [ - "project_id = 'family' # The project we want to retrieve info\n", - "studies = study_client.search(project_id)\n", + "# First we define one projectId\n", + "project_info = oc.projects.search().get_result(0)\n", + "project_id = project_info['id']\n", "\n", - "## Print the studies using the result_iterator() method\n", - "for study in studies.result_iterator():\n", - " print(\"project:{}\\t study_id:{}\\t study_fqn:{} \".format(project_id, study['id'], study['fqn']))" + "print('For this user-case, we can use project:{}'.format(project_id))" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 42, + "id": "gentle-gothic", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Our user (user_id) has access to 2 different studies within the family project\n", + "\n", + "project:family\t study_id:corpasome\t study_fqn:demo@family:corpasome \n", + "project:family\t study_id:corpasome\t study_fqn:demo@family:corpasome \n" + ] + } + ], "source": [ - "Our user (*demouser*) has access to 2 different studies within the **family** project:\n", - "- study: **platinum**\n", - "- study: **corpasome**" + "studies = oc.studies.search(project_id)\n", + "study_id = study['id'] # Define a study_id\n", + "study_fqn = study['fqn']\n", + "\n", + "## Print the studies using the result_iterator() method\n", + "print('Our user (user_id) has access to 2 different studies within the {} project\\n'.format(project_id))\n", + "for study in studies.result_iterator():\n", + " print(\"project:{}\\t study_id:{}\\t study_fqn:{} \".format(project_id, study_id, study_fqn))" ] }, { "cell_type": "markdown", + "id": "funded-policy", "metadata": {}, "source": [ - "### 2.1.2 Checking Groups and Permissions" + "### 2. Checking Groups and Permissions" ] }, { "cell_type": "markdown", + "id": "prime-christian", "metadata": {}, "source": [ "Now we can assume that we want to check to which groups our user belongs to and which permisions pur user has been granted for the study (remember that all the permissions are established at the study level).
\n", - "The first step might be check which groups exist within the study **platinum**:" + "- The first step might be check which groups exist within the **study**:" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 43, + "id": "changing-friendship", "metadata": {}, "outputs": [ { @@ -308,16 +351,13 @@ "group_id: @admins\n", "group_id: @opencb-team\n", "\n", - "There are 3 groups in the study demo@family:platinum: ['@members', '@admins', '@opencb-team']\n" + "There are 3 groups in the study demo@family:corpasome: ['@members', '@admins', '@opencb-team']\n" ] } ], "source": [ - "# Check study definition: the fqn of the study\n", - "# study = 'demo@family:platinum'\n", - "\n", "# Query to the study web service\n", - "groups = study_client.groups(study)\n", + "groups = oc.studies.groups(study_fqn)\n", "study_groups = [] # Define an empty list for the groups\n", "\n", "## This will give us the whole list of groups existing in the study\n", @@ -325,26 +365,21 @@ " study_groups.append(group['id'])\n", " print(\"group_id: {}\".format(group['id']))\n", " \n", - "print('\\nThere are 3 groups in the study {}: {}'.format(study, study_groups))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The study **platinum** has 3 different groups of users defined: **members, admins and opencb-team**\n" + "print('\\nThere are 3 groups in the study {}: {}'.format(study_fqn, study_groups))\n" ] }, { "cell_type": "markdown", + "id": "satisfied-florida", "metadata": {}, "source": [ - "Now we want to check in which groups is our user *demouser* included:" + "- Now we want to check in which groups is our user *demouser* included:" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 44, + "id": "mobile-report", "metadata": {}, "outputs": [ { @@ -362,30 +397,33 @@ "\n", "## This will give us only the groups our user belongs to\n", "for group in groups.result_iterator():\n", - " if 'demouser' in group['userIds']:\n", + " if user_id in group['userIds']:\n", " user_groups.append(group['id'])\n", " print(\"group_id: {}\".format(group['id']))\n", " \n", - "print('\\nOur user {} belongs to group/s: {}'.format(user, user_groups))\n" + "print('\\nOur user {} belongs to group/s: {}'.format(user_id, user_groups))\n" ] }, { "cell_type": "markdown", + "id": "dental-specialist", "metadata": {}, "source": [ - "Although there are 3 groups defined for the study, our user (*demouser*) only belongs to group **members**, which is one of the default groups in *OpenCGA*." + "Independently of the groups defined for a study, our user always belongs to the group **members**, which is one of the default groups in *OpenCGA*." ] }, { "cell_type": "markdown", + "id": "optional-girlfriend", "metadata": {}, "source": [ - "Now must be wondering which specific permissions our user has. We can check this using the `client.acl()` method in the next call (**acl** = access control list):" + "- Now must be wondering which specific permissions our user has. We can check this using the `client.acl()` method in the next call (**acl** = access control list):" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 63, + "id": "according-spare", "metadata": { "pycharm": { "name": "#%%\n" @@ -393,35 +431,36 @@ }, "outputs": [ { - "ename": "NameError", - "evalue": "name 'acl' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0macls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstudy_client\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstudy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmember\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'demouser'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'The user demouser has the following permissions:\\n'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0macl\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'demouser'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'acl' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "The user demouser has the following permissions:\n", + "\n", + " ['VIEW_PANELS', 'VIEW_FAMILIES', 'VIEW_JOBS', 'VIEW_FILES', 'VIEW_FILE_ANNOTATIONS', 'VIEW_COHORTS', 'VIEW_SAMPLE_VARIANTS', 'VIEW_FAMILY_ANNOTATIONS', 'VIEW_FILE_HEADER', 'VIEW_FILE_CONTENT', 'VIEW_AGGREGATED_VARIANTS', 'VIEW_INDIVIDUALS', 'VIEW_COHORT_ANNOTATIONS', 'VIEW_SAMPLES', 'VIEW_SAMPLE_ANNOTATIONS', 'VIEW_CLINICAL_ANALYSIS', 'EXECUTE_JOBS', 'VIEW_INDIVIDUAL_ANNOTATIONS']\n" ] } ], "source": [ "# Permissions granted directly to user:\n", "\n", - "acls = study_client.acl(study, member='demouser')\n", - "print('The user demouser has the following permissions:\\n', acl['demouser'])\n", + "acls = oc.studies.acl(study_id, member=user_id).get_result(0)\n", + "print('The user',user_id,' has the following permissions:\\n\\n', acls[user_id])\n", " " ] }, { "cell_type": "markdown", + "id": "piano-adobe", "metadata": {}, "source": [ - "We've stated before that the group **members** is one of the default groups in *OpenCGA* (along with the group **admins**). We can also check the permissions granted to this group directly:" + "The default groups in *OpenCGA* are: **members** and **admins**. \n", + "- We can also check the permissions granted to **members** directly:" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 66, + "id": "classical-understanding", "metadata": {}, "outputs": [ { @@ -435,7 +474,7 @@ "source": [ "# perm granted to the groups our user belongs to\n", "for group in user_groups:\n", - " acls = study_client.acl(study, member=group)\n", + " acls = oc.studies.acl(study_id, member=group)\n", " if acls.get_num_results() == 0:\n", " print('group_id: {}\\t group_acls: []'.format(group))\n", " else:\n", @@ -446,6 +485,7 @@ }, { "cell_type": "markdown", + "id": "dramatic-sixth", "metadata": {}, "source": [ "Intuitively, the group **members** is the basic group and has any default permissions. On the other hand, users in the group **admins** have permission to see and edit the study information.\n", @@ -455,26 +495,22 @@ }, { "cell_type": "markdown", + "id": "soviet-steal", "metadata": {}, "source": [ - "## 2.2 Exploring Catalog Clinical Metadata" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "## Exploring Catalog Clinical Metadata\n", + "-----------------------\n", "A genomic data analysis platform need to keep track of different resources such as:\n", "\n", "- Clinical Data: information about individuals, samples from those individuals etc.\n", "- Files Metadata: information about files contained in the platform, such as VCFs and BAMs.\n", "\n", - "*OpenCGA Catalog* is the component that assumes this role by storing this kind of information\n", - "\n" + "*OpenCGA Catalog* is the component that assumes this role by storing this kind of information" ] }, { "cell_type": "markdown", + "id": "soviet-logan", "metadata": {}, "source": [ "### 2.2.1 Exploring Samples and Individuals\n", @@ -483,6 +519,7 @@ }, { "cell_type": "markdown", + "id": "conditional-basis", "metadata": {}, "source": [ "\n", @@ -494,6 +531,7 @@ { "cell_type": "code", "execution_count": 34, + "id": "nuclear-climate", "metadata": {}, "outputs": [ { @@ -582,6 +620,7 @@ }, { "cell_type": "markdown", + "id": "descending-shipping", "metadata": {}, "source": [ "We can see that project *platinium* has **17 samples** (given by #Num matches). The count is returned because we have set the parameter `count=True`.\n", @@ -592,6 +631,7 @@ { "cell_type": "code", "execution_count": 36, + "id": "fundamental-suggestion", "metadata": {}, "outputs": [ { @@ -618,6 +658,7 @@ }, { "cell_type": "markdown", + "id": "muslim-compiler", "metadata": {}, "source": [ "Now, we can repite the same process for check the number of individuals in the **family** study. The difference is that now we will be making a call to the **individual** web service:" @@ -626,6 +667,7 @@ { "cell_type": "code", "execution_count": 45, + "id": "interstate-helena", "metadata": {}, "outputs": [ { @@ -706,6 +748,7 @@ }, { "cell_type": "markdown", + "id": "invalid-chase", "metadata": {}, "source": [ "In the study **family** there are the same number of individuals and samples (17 matches). It is likely that there is a sample per individual.\n", @@ -716,6 +759,7 @@ { "cell_type": "code", "execution_count": 60, + "id": "floppy-building", "metadata": {}, "outputs": [ { @@ -765,6 +809,7 @@ }, { "cell_type": "markdown", + "id": "liquid-decimal", "metadata": {}, "source": [ "### 2.2.2 Custom Annotations" @@ -772,6 +817,7 @@ }, { "cell_type": "markdown", + "id": "critical-george", "metadata": {}, "source": [ "### 2.2.2 Exploring Files" @@ -779,6 +825,7 @@ }, { "cell_type": "markdown", + "id": "fundamental-penalty", "metadata": {}, "source": [ "We can start by exploring the number of files in the study, and retrieveing information about one file as an example of which kind of data is stored in the **file** data model of *OpenCGA*." @@ -787,6 +834,7 @@ { "cell_type": "code", "execution_count": 50, + "id": "retired-mounting", "metadata": {}, "outputs": [ { @@ -923,6 +971,7 @@ }, { "cell_type": "markdown", + "id": "dressed-emission", "metadata": {}, "source": [ "As we can see, there are 3.766 files in the study.
There is plenty of useful information contained in the file data model like the file format, the stats, size of the file. If we want to look for more concrete information about one specific file:" @@ -931,6 +980,7 @@ { "cell_type": "code", "execution_count": 53, + "id": "historical-tourism", "metadata": {}, "outputs": [ { @@ -952,6 +1002,7 @@ }, { "cell_type": "markdown", + "id": "numerous-nirvana", "metadata": {}, "source": [ "Now, we might be interested in know the number of files for a specific sample:" @@ -960,6 +1011,7 @@ { "cell_type": "code", "execution_count": 54, + "id": "infinite-venue", "metadata": {}, "outputs": [ { @@ -983,6 +1035,7 @@ }, { "cell_type": "markdown", + "id": "juvenile-newman", "metadata": {}, "source": [ "### 2.2.3 Exploring Cohorts" @@ -990,6 +1043,7 @@ }, { "cell_type": "markdown", + "id": "former-counter", "metadata": {}, "source": [ "One powerful feature of *OpenCGA* is the possibility of define **cohorts** that include individuals with common traits of interest, like a phenotype, nationality etc.
\n", @@ -1001,6 +1055,7 @@ { "cell_type": "code", "execution_count": 57, + "id": "small-biodiversity", "metadata": {}, "outputs": [ { @@ -1043,6 +1098,7 @@ }, { "cell_type": "markdown", + "id": "impressive-crisis", "metadata": {}, "source": [ "For the study **family** there is only 1 cohort: the default cohort *ALL*.\n", @@ -1052,6 +1108,7 @@ }, { "cell_type": "markdown", + "id": "artificial-given", "metadata": {}, "source": [ "## 2.3 Aggregations\n", @@ -1061,6 +1118,7 @@ { "cell_type": "code", "execution_count": null, + "id": "automatic-knight", "metadata": {}, "outputs": [], "source": [] @@ -1082,7 +1140,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 13ae68b09bf..9e509239602 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -83,20 +83,15 @@ "# or you can pass the user and passwd\n", "oc.login(user, passwd)\n", "\n", - "print('Logged succesfuly to {}, {} well done!'.format(host, oc.token))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup OpenCGA Variables" + "print('Logged succesfuly to {}, your token is: {} well done!'.format(host, oc.token))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "## Setup OpenCGA Variables\n", + "\n", "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. \n" ] }, @@ -1407,9 +1402,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file From 9a1c4794fc10352352e1fabb0985b15c89be50b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 15 Apr 2021 09:42:22 +0100 Subject: [PATCH 180/412] client: Split template creation by internal batches --- .../client/template/TemplateManager.java | 111 ++++++++++++++---- 1 file changed, 89 insertions(+), 22 deletions(-) diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java index 4f8d0de13d0..d3a0ea590b2 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java @@ -34,10 +34,7 @@ import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.family.FamilyCreateParams; -import org.opencb.opencga.core.models.file.File; -import org.opencb.opencga.core.models.file.FileCreateParams; -import org.opencb.opencga.core.models.file.FileFetch; -import org.opencb.opencga.core.models.file.FileLinkParams; +import org.opencb.opencga.core.models.file.*; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.individual.IndividualCreateParams; import org.opencb.opencga.core.models.individual.IndividualUpdateParams; @@ -63,6 +60,7 @@ import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.IntStream; public class TemplateManager { @@ -188,6 +186,18 @@ public void validate(TemplateConfiguration template) throws ClientException { } } } + for (Project project : template.getProjects()) { + for (Study study : project.getStudies()) { + URI baseUrl = getBaseUrl(template, study); + if (baseUrl == null) { + for (File file : study.getFiles()) { + if (file.getUri() == null) { + throw new IllegalArgumentException("File uri missing. Either file.uri or baseUrl should be defined."); + } + } + } + } + } } public boolean projectExists(String projectId) throws ClientException { @@ -244,16 +254,24 @@ private void createVariableSets(Study study) throws ClientException { } private void createIndividuals(Study study) throws ClientException { - if (CollectionUtils.isEmpty(study.getIndividuals())) { + List individuals = study.getIndividuals(); + if (CollectionUtils.isEmpty(individuals)) { return; } - logger.info("Creating {} individuals from study {}", study.getIndividuals().size(), study.getId()); - ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn()); + logger.info("Creating {} individuals from study {}", individuals.size(), study.getId()); + String studyFqn = study.getFqn(); + for (List batch : batches(individuals)) { + createIndividuals(studyFqn, batch); + } + } + + private void createIndividuals(String studyFqn, List individuals) throws ClientException { + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, studyFqn); Map existing = Collections.emptyMap(); if (resume) { openCGAClient.setThrowExceptionOnError(false); existing = openCGAClient.getIndividualClient() - .info(study.getIndividuals().stream().map(Individual::getId).collect(Collectors.joining(",")), + .info(individuals.stream().map(Individual::getId).collect(Collectors.joining(",")), new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id,father.id,mother.id")) .allResults() .stream() @@ -263,7 +281,7 @@ private void createIndividuals(Study study) throws ClientException { // Create individuals without parents and siblings - for (Individual individual : study.getIndividuals()) { + for (Individual individual : individuals) { if (!existing.containsKey(individual.getId())) { IndividualCreateParams createParams = IndividualCreateParams.of(individual); createParams.setFather(null); @@ -273,7 +291,7 @@ private void createIndividuals(Study study) throws ClientException { } // Update parents and siblings for each individual - for (Individual individual : study.getIndividuals()) { + for (Individual individual : individuals) { IndividualUpdateParams updateParams = new IndividualUpdateParams(); boolean empty = true; Individual existingIndividual = existing.get(individual.getId()); @@ -301,12 +319,18 @@ private void createIndividuals(Study study) throws ClientException { private void createSamples(Study study) throws ClientException { logger.info("Creating {} samples from study {}", study.getSamples().size(), study.getId()); - ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn()); + for (List batch : batches(study.getSamples())) { + createSamples(study.getFqn(), batch); + } + } + + private void createSamples(String fqn, List samples) throws ClientException { + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, fqn); Set existing = Collections.emptySet(); if (resume) { openCGAClient.setThrowExceptionOnError(false); existing = openCGAClient.getSampleClient() - .info(study.getSamples().stream().map(Sample::getId).collect(Collectors.joining(",")), + .info(samples.stream().map(Sample::getId).collect(Collectors.joining(",")), new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id")) .allResults() .stream() @@ -314,7 +338,7 @@ private void createSamples(Study study) throws ClientException { .collect(Collectors.toSet()); openCGAClient.setThrowExceptionOnError(true); } - for (Sample sample : study.getSamples()) { + for (Sample sample : samples) { if (!existing.contains(sample.getId())) { openCGAClient.getSampleClient().create(SampleCreateParams.of(sample), params); } @@ -344,13 +368,23 @@ private void createCohorts(Study study) throws ClientException { } private void createFamilies(Study study) throws ClientException { - logger.info("Creating {} families from study {}", study.getFamilies().size(), study.getId()); - ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn()); + List families = study.getFamilies(); + if (CollectionUtils.isEmpty(families)) { + return; + } + logger.info("Creating {} families from study {}", families.size(), study.getId()); + for (List batch : batches(families)) { + createFamilies(study.getFqn(), batch); + } + } + + private void createFamilies(String fqn, List families) throws ClientException { + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, fqn); Set existing = Collections.emptySet(); if (resume) { openCGAClient.setThrowExceptionOnError(false); existing = openCGAClient.getFamilyClient() - .info(study.getFamilies().stream().map(Family::getId).collect(Collectors.joining(",")), + .info(families.stream().map(Family::getId).collect(Collectors.joining(",")), new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id")) .allResults() .stream() @@ -358,7 +392,7 @@ private void createFamilies(Study study) throws ClientException { .collect(Collectors.toSet()); openCGAClient.setThrowExceptionOnError(true); } - for (Family family : study.getFamilies()) { + for (Family family : families) { params.put("members", family.getMembers().stream().map(Individual::getId).collect(Collectors.toList())); family.setMembers(null); if (!existing.contains(family.getId())) { @@ -368,15 +402,27 @@ private void createFamilies(Study study) throws ClientException { } private List fetchFiles(TemplateConfiguration template, Study study) throws ClientException { - URI baseUrl = getBaseUrl(template, study); + List files = study.getFiles(); + if (CollectionUtils.isEmpty(files)) { + return Collections.emptyList(); + } + List indexVcfJobIds = new ArrayList<>(files.size()); + for (List batch : batches(files)) { + indexVcfJobIds.addAll(fetchFiles(template, study, batch)); + } + return indexVcfJobIds; + } + private List fetchFiles(TemplateConfiguration template, Study study, List files) + throws ClientException { + URI baseUrl = getBaseUrl(template, study); ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn()); Set existing = new HashSet<>(); Set existingAndIndexed = new HashSet<>(); if (resume) { openCGAClient.setThrowExceptionOnError(false); openCGAClient.getFileClient() - .info(study.getFiles().stream().map(file -> getFilePath(file).replace('/', ':')).collect(Collectors.joining(",")), + .info(files.stream().map(file -> getFilePath(file).replace('/', ':')).collect(Collectors.joining(",")), new ObjectMap(params).append(QueryOptions.INCLUDE, "path,name,id,internal")) .allResults() .forEach(file -> { @@ -394,7 +440,7 @@ private List fetchFiles(TemplateConfiguration template, Study study) thr openCGAClient.setThrowExceptionOnError(true); } List indexVcfJobIds = new ArrayList<>(); - for (File file : study.getFiles()) { + for (File file : files) { file.setPath(getFilePath(file)); file.setName(Paths.get(file.getPath()).getFileName().toString()); file.setId(file.getPath().replace("/", ":")); @@ -456,8 +502,10 @@ private List fetchFile(URI baseUrl, ObjectMap params, File file) throws FileCreateParams createFolder = new FileCreateParams(parentPath, null, null, true, true); openCGAClient.getFileClient().create(createFolder, params); } - FileLinkParams data = new FileLinkParams(fileUri.toString(), parentPath, null, Collections.emptyList(), null, null); - openCGAClient.getFileClient().link(data, params); + FileLinkParams data = new FileLinkParams(fileUri.toString(), parentPath, + file.getDescription(), Collections.emptyList(), null, null); +// String fileId = openCGAClient.getFileClient().link(data, params).firstResult().getId(); +// openCGAClient.getFileClient().update(fileId, FileUpdateParams.of(file), params); jobDependsOn = Collections.emptyList(); } return jobDependsOn; @@ -465,6 +513,9 @@ private List fetchFile(URI baseUrl, ObjectMap params, File file) throws private URI getBaseUrl(TemplateConfiguration template, Study study) { String baseUrl = template.getBaseUrl(); + if (StringUtils.isEmpty(baseUrl)) { + return null; + } baseUrl = baseUrl.replaceAll("STUDY_ID", study.getId()); if (!baseUrl.endsWith("/")) { baseUrl = baseUrl + "/"; @@ -583,4 +634,20 @@ private String checkJob(RestResponse jobRestResponse) throws ClientExceptio return job.getUuid(); } + private Iterable> batches(List elements) { + return batches(elements, 50); + } + + private Iterable> batches(List elements, int size) { + if (elements == null || elements.isEmpty()) { + return Collections.emptyList(); + } + return () -> { + int numBatches = (int) Math.ceil(elements.size() / ((float) size)); + return IntStream.range(0, numBatches) + .mapToObj(i -> elements.subList(i * size, Math.min((i + 1) * size, elements.size()))) + .iterator(); + }; + } + } From 072d4bcc1c2ddd42f76edddc20a6fe35a9441a22 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 15 Apr 2021 10:31:58 +0100 Subject: [PATCH 181/412] client: adapt catalog notebook format to variants notebook --- .../user-training/pyopencga_catalog.ipynb | 567 +++++------------- 1 file changed, 155 insertions(+), 412 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb index 48e7f51200d..161067d78d8 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_catalog.ipynb @@ -5,7 +5,7 @@ "id": "conventional-sculpture", "metadata": {}, "source": [ - "# Overview\n", + "# Catalog Notebook: Overview\n", "------\n", "This notebook is intended to provide guidance for querying an OpenCGA server through *pyopencga* to explore studies which the user has access to, Clinical data provided in the study (Samples, Individuals Genotypes etc.) and other types of metadata, like permissions.\n", "\n", @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 133, "id": "indoor-webster", "metadata": {}, "outputs": [ @@ -42,7 +42,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTg0Njk3OTIsImV4cCI6MTYxODQ3MzM5Mn0.F_ivsxLcOS4K-k0a9v_QRI4lGXFeIUL4mS8Xd2ucgSw well done!\n" + "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTg0Nzg4MDMsImV4cCI6MTYxODQ4MjQwM30.fohz3sZXwIB--s8Bd84vFWxM_RIW6d4mTTGCQjOfazg well done!\n" ] } ], @@ -99,23 +99,6 @@ "Over the user case addressed in this notebook we will be performing queries to the **users, projects, studies, samples, individuals and cohorts**
*OpenCGA* data models." ] }, - { - "cell_type": "code", - "execution_count": 6, - "id": "ecological-warning", - "metadata": {}, - "outputs": [], - "source": [ - "## Define variables to query data models \n", - "user_client = oc.users\n", - "project_client = oc.projects\n", - "study_client = oc.studies\n", - "sample_client = oc.samples\n", - "individual_client = oc.individuals\n", - "file_client = oc.files\n", - "cohort_client = oc.cohorts\n" - ] - }, { "cell_type": "markdown", "id": "prostate-cancellation", @@ -125,7 +108,8 @@ "------\n", "\n", "In this seciton we are going to show how to work with some of the most common scenarios.
\n", - "The user-cases addresed here constute a high-level introduction aimed to provide a basis for the user to make their own explorations. This example can be adapted to each individual user-case.\n" + "- The user-cases addresed here constute a high-level introduction aimed to provide a basis for the user to make their own explorations. \n", + "- The examples can be adapted to each individual user-case.\n" ] }, { @@ -133,7 +117,8 @@ "id": "becoming-perception", "metadata": {}, "source": [ - "## Exploring User Account: Permissios, Projects and Studies\n", + "# Exploring User Account: Permissios, Projects and Studies\n", + "------------\n", "\n", "In this use case we cover retrieving information for our user.\n", "\n", @@ -153,7 +138,7 @@ "id": "collective-dylan", "metadata": {}, "source": [ - "### 1. Exploring Projects and Studies" + "## 1. Exploring Projects and Studies with our user" ] }, { @@ -161,13 +146,13 @@ "id": "passing-grenada", "metadata": {}, "source": [ - "#### Users:\n", + "### Users: owner and members \n", "Depending on the permissions granted, a user can be the owner of a study or just have access to some studies owned by other users.
We can retrieve information about our user and its permissions by:" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 134, "id": "environmental-storage", "metadata": {}, "outputs": [ @@ -177,7 +162,7 @@ "text": [ "Using print_results() function:\n", "------------------------------------\n", - "#Time: 15\n", + "#Time: 14\n", "#Num matches: -1\n", "#Num results: 1\n", "#Num inserted: 0\n", @@ -189,7 +174,7 @@ "User info using REST response API:\n", "id:demouser\taccount_type: GUEST\t projects_owned: 0\n", "\n", - "We can appreciate that our user demouser has 0 projects from its own: []\n" + "We can appreciate that our user: demouser has 0 projects from its own: []\n" ] } ], @@ -215,7 +200,7 @@ "id": "personal-chosen", "metadata": {}, "source": [ - "
However, the user might has been granted access to some projects from other users. Let's see how to find this out:" + "However, the user might has been granted access to some projects from other users. Let's see how to find this out:" ] }, { @@ -223,13 +208,13 @@ "id": "essential-learning", "metadata": {}, "source": [ - "#### Projects:\n", - "Now, we can list our user's projects using **project client** `search()` function." + "### Projects:\n", + "We can list our user's projects using **project client** `search()` function." ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 135, "id": "biblical-visibility", "metadata": {}, "outputs": [ @@ -266,14 +251,14 @@ "id": "single-float", "metadata": {}, "source": [ - "#### Studies:\n", - "Now, let's see which studies do we have access within the a project." + "### Studies:\n", + "Let's see which studies do we have access within the project." ] }, { "cell_type": "code", - "execution_count": 38, - "id": "significant-powell", + "execution_count": 136, + "id": "every-township", "metadata": {}, "outputs": [ { @@ -294,7 +279,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 137, "id": "gentle-gothic", "metadata": {}, "outputs": [ @@ -304,20 +289,41 @@ "text": [ "Our user (user_id) has access to 2 different studies within the family project\n", "\n", - "project:family\t study_id:corpasome\t study_fqn:demo@family:corpasome \n", + "project:family\t study_id:platinum\t study_fqn:demo@family:platinum \n", "project:family\t study_id:corpasome\t study_fqn:demo@family:corpasome \n" ] } ], "source": [ "studies = oc.studies.search(project_id)\n", - "study_id = study['id'] # Define a study_id\n", - "study_fqn = study['fqn']\n", "\n", "## Print the studies using the result_iterator() method\n", "print('Our user (user_id) has access to 2 different studies within the {} project\\n'.format(project_id))\n", "for study in studies.result_iterator():\n", - " print(\"project:{}\\t study_id:{}\\t study_fqn:{} \".format(project_id, study_id, study_fqn))" + " print(\"project:{}\\t study_id:{}\\t study_fqn:{} \".format(project_id, study['id'], study['fqn']))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "interesting-terrorist", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Let's use the study: platinum with fqn: demo@family:platinum\n" + ] + } + ], + "source": [ + "# Define the study we are going to work with\n", + "study_info = oc.studies.search(project_id).get_result(0)\n", + "study_id = study_info['id']\n", + "study_fqn = study_info['fqn']\n", + "print(\"Let's use the study: {} with fqn: {}\".format(study_id, study_fqn))" ] }, { @@ -325,7 +331,7 @@ "id": "funded-policy", "metadata": {}, "source": [ - "### 2. Checking Groups and Permissions" + "## 2. Checking Groups and Permissions" ] }, { @@ -339,7 +345,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 139, "id": "changing-friendship", "metadata": {}, "outputs": [ @@ -351,7 +357,7 @@ "group_id: @admins\n", "group_id: @opencb-team\n", "\n", - "There are 3 groups in the study demo@family:corpasome: ['@members', '@admins', '@opencb-team']\n" + "There are 3 groups in the study demo@family:platinum: ['@members', '@admins', '@opencb-team']\n" ] } ], @@ -373,12 +379,12 @@ "id": "satisfied-florida", "metadata": {}, "source": [ - "- Now we want to check in which groups is our user *demouser* included:" + "- If we want to check in which groups is our user included:" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 140, "id": "mobile-report", "metadata": {}, "outputs": [ @@ -417,12 +423,12 @@ "id": "optional-girlfriend", "metadata": {}, "source": [ - "- Now must be wondering which specific permissions our user has. We can check this using the `client.acl()` method in the next call (**acl** = access control list):" + "- We might be wondering which specific permissions our user has. We can check this using the `client.acl()` method (**acl** = access control list):" ] }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 141, "id": "according-spare", "metadata": { "pycharm": { @@ -442,7 +448,6 @@ ], "source": [ "# Permissions granted directly to user:\n", - "\n", "acls = oc.studies.acl(study_id, member=user_id).get_result(0)\n", "print('The user',user_id,' has the following permissions:\\n\\n', acls[user_id])\n", " " @@ -453,13 +458,12 @@ "id": "piano-adobe", "metadata": {}, "source": [ - "The default groups in *OpenCGA* are: **members** and **admins**. \n", - "- We can also check the permissions granted to **members** directly:" + "The default groups in *OpenCGA* are: **members** and **admins**. We can also check the permissions granted to **members** directly:" ] }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 142, "id": "classical-understanding", "metadata": {}, "outputs": [ @@ -472,7 +476,7 @@ } ], "source": [ - "# perm granted to the groups our user belongs to\n", + "# Permissions granted to the groups our user belongs to\n", "for group in user_groups:\n", " acls = oc.studies.acl(study_id, member=group)\n", " if acls.get_num_results() == 0:\n", @@ -498,7 +502,7 @@ "id": "soviet-steal", "metadata": {}, "source": [ - "## Exploring Catalog Clinical Metadata\n", + "# Exploring Catalog Clinical Metadata\n", "-----------------------\n", "A genomic data analysis platform need to keep track of different resources such as:\n", "\n", @@ -513,24 +517,18 @@ "id": "soviet-logan", "metadata": {}, "source": [ - "### 2.2.1 Exploring Samples and Individuals\n", - "Ideas: contar smaples, contar indovdiasl, mirar cuantos individuals tienen samples " - ] - }, - { - "cell_type": "markdown", - "id": "conditional-basis", - "metadata": {}, - "source": [ + "## 1. Exploring Samples and Individuals\n", + "\n", + "Once we know the studies our user has access to, we can explore the samples within the study.
\n", + "To fetch samples you need to use the sample client built in **pyopencga**. Remember that it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies.
\n", "\n", - "Once we know the studies our user 'demo' has access to, we can explore the samples that a project contains.
\n", - "To fetch samples you need to use the sample client built in pyopencga.Remember that it is recomended to use the **[fqn](#Full-Qualified-Name-(fqn)-of-Studies )** when referencing studies.
\n", - "Let's imagine we want to know how many samples are in the study **platinum**, and list information about the first two samples: " + "### Samples:\n", + "Let's imagine we want to know how many samples are in the **study** stored in the `study_fqn` variable, and list information about the first two samples: " ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 143, "id": "nuclear-climate", "metadata": {}, "outputs": [ @@ -538,84 +536,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "#Time: 67\n", + "Info from 5 samples from study demo@family:platinum\n", + "--------------------------------------------------------\n", + "#Time: 68\n", "#Num matches: 17\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", - "#id\tannotationSets\tuuid\tqualityControl\trelease\tversion\tcreationDate\tmodificationDate\tdescription\tsomatic\tphenotypes\tindividualId\tfileIds\tstatus\tinternal\tattributes\n", - "NA12877\t.\teba106b2-0172-0004-0001-0090f938ae01\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131818\t20201117012312\t\tFalse\t.\tNA12877\tdata:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131818', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12877', 'name': 'NA12877', 'uuid': 'eba0f035-0172-0006-0001-f2aeb4168df1', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131812', 'modificationDate': '20201002113644', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131812', 'description': ''}}, 'attributes': {}}}\n", - "NA12878\t.\teba10c89-0172-0004-0001-8c90462fc396\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131819\t20201117015700\t\tFalse\t.\tNA12878\tdata:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131819', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12878', 'name': 'NA12878', 'uuid': 'eba0f2b4-0172-0006-0001-6af0ded43009', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131813', 'modificationDate': '20201002113649', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131813', 'description': ''}}, 'attributes': {}}}\n", - "NA12879\t.\teba11008-0172-0004-0001-fcea4ff5e986\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131820\t20201117015709\t\tFalse\t.\tNA12879\tdata:platinum-genomes-vcf-NA12879_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131820', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12879', 'name': 'NA12879', 'uuid': 'eba0f467-0172-0006-0001-d1e44969fcc3', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131813', 'modificationDate': '20201002113653', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131813', 'description': ''}}, 'attributes': {}}}\n", - "NA12880\t.\teba1134a-0172-0004-0001-5993743bc415\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131821\t20201117022819\t\tFalse\t.\tNA12880\tdata:platinum-genomes-vcf-NA12880_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131821', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12880', 'name': 'NA12880', 'uuid': 'eba0f56e-0172-0006-0001-95f703aba3e6', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131813', 'modificationDate': '20201002113657', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131813', 'description': ''}}, 'attributes': {}}}\n", - "NA12881\t.\teba1160e-0172-0004-0001-dd08a9d03e4e\t{'fileIds': [], 'comments': [], 'alignmentMetrics': [], 'variantMetrics': {'variantStats': [], 'signatures': [], 'vcfFileIds': []}}\t1\t1\t20200625131822\t20201117022827\t\tFalse\t.\tNA12881\tdata:platinum-genomes-vcf-NA12881_S1.genome.vcf.gz\t{'name': '', 'description': '', 'date': ''}\t{'status': {'name': 'READY', 'date': '20200625131822', 'description': ''}}\t{'OPENCGA_INDIVIDUAL': {'id': 'NA12881', 'name': 'NA12881', 'uuid': 'eba0f66c-0172-0006-0001-d023fa4e791a', 'father': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'mother': {'release': 0, 'version': 0, 'parentalConsanguinity': False}, 'location': {}, 'sex': 'UNKNOWN', 'karyotypicSex': 'UNKNOWN', 'ethnicity': '', 'population': {}, 'release': 1, 'version': 1, 'creationDate': '20200625131814', 'modificationDate': '20201002113702', 'lifeStatus': 'UNKNOWN', 'phenotypes': [], 'disorders': [], 'parentalConsanguinity': False, 'status': {'name': '', 'description': '', 'date': ''}, 'internal': {'status': {'name': 'READY', 'date': '20200625131814', 'description': ''}}, 'attributes': {}}}\n", - "\n", - "JSON output:\n", - "{'annotationSets': [],\n", - " 'attributes': {'OPENCGA_INDIVIDUAL': {'attributes': {},\n", - " 'creationDate': '20200625131812',\n", - " 'disorders': [],\n", - " 'ethnicity': '',\n", - " 'father': {'parentalConsanguinity': False,\n", - " 'release': 0,\n", - " 'version': 0},\n", - " 'id': 'NA12877',\n", - " 'internal': {'status': {'date': '20200625131812',\n", - " 'description': '',\n", - " 'name': 'READY'}},\n", - " 'karyotypicSex': 'UNKNOWN',\n", - " 'lifeStatus': 'UNKNOWN',\n", - " 'location': {},\n", - " 'modificationDate': '20201002113644',\n", - " 'mother': {'parentalConsanguinity': False,\n", - " 'release': 0,\n", - " 'version': 0},\n", - " 'name': 'NA12877',\n", - " 'parentalConsanguinity': False,\n", - " 'phenotypes': [],\n", - " 'population': {},\n", - " 'release': 1,\n", - " 'sex': 'UNKNOWN',\n", - " 'status': {'date': '',\n", - " 'description': '',\n", - " 'name': ''},\n", - " 'uuid': 'eba0f035-0172-0006-0001-f2aeb4168df1',\n", - " 'version': 1}},\n", - " 'creationDate': '20200625131818',\n", - " 'description': '',\n", - " 'fileIds': ['data:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz'],\n", - " 'id': 'NA12877',\n", - " 'individualId': 'NA12877',\n", - " 'internal': {'status': {'date': '20200625131818',\n", - " 'description': '',\n", - " 'name': 'READY'}},\n", - " 'modificationDate': '20201117012312',\n", - " 'phenotypes': [],\n", - " 'qualityControl': {'alignmentMetrics': [],\n", - " 'comments': [],\n", - " 'fileIds': [],\n", - " 'variantMetrics': {'signatures': [],\n", - " 'variantStats': [],\n", - " 'vcfFileIds': []}},\n", - " 'release': 1,\n", - " 'somatic': False,\n", - " 'status': {'date': '', 'description': '', 'name': ''},\n", - " 'uuid': 'eba106b2-0172-0004-0001-0090f938ae01',\n", - " 'version': 1}\n" + "#id\tcreationDate\tsomatic\tphenotypes.id\tphenotypes.name\tindividualId\n", + "NA12877\t20200625131818\tFalse\t.\t.\tNA12877\n", + "NA12878\t20200625131819\tFalse\t.\t.\tNA12878\n", + "NA12879\t20200625131820\tFalse\t.\t.\tNA12879\n", + "NA12880\t20200625131821\tFalse\t.\t.\tNA12880\n", + "NA12881\t20200625131822\tFalse\t.\t.\tNA12881\n" ] } ], "source": [ - "# Define the fqn of the study we want to query\n", - "# study = 'demo@family:platinum' \n", - "\n", "## Call to the sample web endpoint\n", - "samples = sample_client.search(study=study, includeIndividual=True, count=True, limit = 5) ## other possible params, count=False, id='NA12880,NA12881'\n", - "samples.print_results()\n", + "samples = oc.samples.search(study=study_fqn, includeIndividual=True, count=True, limit = 5) ## other possible params, count=False, id='NA12880,NA12881'\n", + "samples.print_results(fields='id,creationDate,somatic,phenotypes.id,phenotypes.name,individualId', title='Info from 5 samples from study {}'.format(study_fqn))\n", "\n", - "print(\"\\nJSON output:\")\n", - "pprint(samples.get_result(0))\n" + "## Uncomment next line to display an interactive JSON viewer\n", + "#JSON(samples.get_results())" ] }, { @@ -623,14 +567,14 @@ "id": "descending-shipping", "metadata": {}, "source": [ - "We can see that project *platinium* has **17 samples** (given by #Num matches). The count is returned because we have set the parameter `count=True`.\n", + "We can see that the number of samples in the study is given by **#Num matches**. The count is returned because we have set the parameter `count=True`.\n", "\n", - "However, only information about **2 samples** is returned, because we have set the parameter `limit=2`. We can get all the samples ids by:" + "However, we have used the parameter `limit` to restrict the number of samples the query returns. We can get all the samples ids by:" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 144, "id": "fundamental-suggestion", "metadata": {}, "outputs": [ @@ -648,7 +592,7 @@ "sample_ids = [] # Define an empty list\n", "\n", "# Define a new sample query without limit\n", - "samples = sample_client.search(study=study, count=True) \n", + "samples = oc.samples.search(study=study_fqn, count=True) \n", "\n", "for sample in samples.result_iterator():\n", " sample_ids.append(sample['id'])\n", @@ -661,12 +605,13 @@ "id": "muslim-compiler", "metadata": {}, "source": [ - "Now, we can repite the same process for check the number of individuals in the **family** study. The difference is that now we will be making a call to the **individual** web service:" + "### Individuals:\n", + "Now, we can repite the same process for check the number of individuals in the **study** . The difference is that now we will be making a call to the **individuals** web service:" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 145, "id": "interstate-helena", "metadata": {}, "outputs": [ @@ -674,76 +619,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "Min table columns:\n", - "#Time: 55\n", + "Information about 5 individuals in the studydemo@family:platinum\n", + "---------------------------------------------------------------------\n", + "#Time: 72\n", "#Num matches: 17\n", - "#Num results: 2\n", + "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tsex\n", "NA12877\tUNKNOWN\n", "NA12878\tUNKNOWN\n", - "\n", - " Full JSON output;\n", - "{'annotationSets': [],\n", - " 'attributes': {},\n", - " 'creationDate': '20200625131812',\n", - " 'disorders': [],\n", - " 'ethnicity': '',\n", - " 'father': {'parentalConsanguinity': False, 'release': 0, 'version': 0},\n", - " 'id': 'NA12877',\n", - " 'internal': {'status': {'date': '20200625131812',\n", - " 'description': '',\n", - " 'name': 'READY'}},\n", - " 'karyotypicSex': 'UNKNOWN',\n", - " 'lifeStatus': 'UNKNOWN',\n", - " 'location': {},\n", - " 'modificationDate': '20201002113644',\n", - " 'mother': {'parentalConsanguinity': False, 'release': 0, 'version': 0},\n", - " 'name': 'NA12877',\n", - " 'parentalConsanguinity': False,\n", - " 'phenotypes': [],\n", - " 'population': {},\n", - " 'release': 1,\n", - " 'samples': [{'attributes': {},\n", - " 'creationDate': '20200625131818',\n", - " 'description': '',\n", - " 'fileIds': ['data:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz'],\n", - " 'id': 'NA12877',\n", - " 'individualId': 'NA12877',\n", - " 'internal': {'status': {'date': '20200625131818',\n", - " 'description': '',\n", - " 'name': 'READY'}},\n", - " 'modificationDate': '20201117012312',\n", - " 'phenotypes': [],\n", - " 'qualityControl': {'alignmentMetrics': [],\n", - " 'comments': [],\n", - " 'fileIds': [],\n", - " 'variantMetrics': {'signatures': [],\n", - " 'variantStats': [],\n", - " 'vcfFileIds': []}},\n", - " 'release': 1,\n", - " 'somatic': False,\n", - " 'status': {'date': '', 'description': '', 'name': ''},\n", - " 'uuid': 'eba106b2-0172-0004-0001-0090f938ae01',\n", - " 'version': 1}],\n", - " 'sex': 'UNKNOWN',\n", - " 'status': {'date': '', 'description': '', 'name': ''},\n", - " 'uuid': 'eba0f035-0172-0006-0001-f2aeb4168df1',\n", - " 'version': 1}\n" + "NA12879\tUNKNOWN\n", + "NA12880\tUNKNOWN\n", + "NA12881\tUNKNOWN\n" ] } ], "source": [ - "## Call to the individual web service\n", - "\n", - "print('Min table columns:')\n", - "individuals = individual_client.search(study=study, count=True, limit=2) ## other possible params, count=False, id='NA12880,NA12881'\n", - "individuals.print_results('id,sex')\n", + "## Using the individuals search web service\n", + "individuals = oc.individuals.search(study=study_fqn, count=True, limit=5) ## other possible params, count=False, id='NA12880,NA12881'\n", + "individuals.print_results(fields='id,sex', title='Information about 5 individuals in the study{}'.format(study_fqn))\n", "\n", - "print(\"\\n Full JSON output;\")\n", - "pprint(individuals.get_result(0))" + "## Uncomment next line to display an interactive JSON viewer\n", + "#JSON(individuals.get_results())" ] }, { @@ -751,60 +650,34 @@ "id": "invalid-chase", "metadata": {}, "source": [ - "In the study **family** there are the same number of individuals and samples (17 matches). It is likely that there is a sample per individual.\n", - "\n", - "We might be interested in knowing when the individuals were added to *OpenCGA*:" + "- We might be interested in knowing when the individuals were added to *OpenCGA*, or the individuals sex. Since **pyopencga 2.0.1.1** it is possible to export the results to a *pandas dataframe* object with the function `to_data_frame()`:" ] }, { "cell_type": "code", - "execution_count": 60, - "id": "floppy-building", + "execution_count": 116, + "id": "rapid-librarian", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "There are 17 individuals with ids:\n", - " ['NA12877', 'NA12878', 'NA12879', 'NA12880', 'NA12881', 'NA12882', 'NA12883', 'NA12884', 'NA12885', 'NA12886', 'NA12887', 'NA12888', 'NA12889', 'NA12890', 'NA12891', 'NA12892', 'NA12893']\n", - "\n", - "The individual NA12877 was created on 20200625131812\n", - "The individual NA12878 was created on 20200625131813\n", - "The individual NA12879 was created on 20200625131813\n", - "The individual NA12880 was created on 20200625131813\n", - "The individual NA12881 was created on 20200625131814\n", - "The individual NA12882 was created on 20200625131814\n", - "The individual NA12883 was created on 20200625131814\n", - "The individual NA12884 was created on 20200625131814\n", - "The individual NA12885 was created on 20200625131815\n", - "The individual NA12886 was created on 20200625131815\n", - "The individual NA12887 was created on 20200625131815\n", - "The individual NA12888 was created on 20200625131815\n", - "The individual NA12889 was created on 20200625131815\n", - "The individual NA12890 was created on 20200625131816\n", - "The individual NA12891 was created on 20200625131816\n", - "The individual NA12892 was created on 20200625131816\n", - "The individual NA12893 was created on 20200625131816\n" + " id sex creationDate\n", + "0 NA12877 UNKNOWN 20200625131812\n", + "1 NA12878 UNKNOWN 20200625131813\n", + "2 NA12879 UNKNOWN 20200625131813\n", + "3 NA12880 UNKNOWN 20200625131813\n", + "4 NA12881 UNKNOWN 20200625131814\n" ] } ], "source": [ - "## New call to the individual web service\n", - "individuals = individual_client.search(study=study) ## other possible params, count=False, id='NA12880,NA12881'\n", - "\n", - "## Print the date each individual was created \n", - "date_individuals = {} # Define an empty dictionary\n", - "\n", - "for individual in individuals.result_iterator():\n", - " date_individuals[individual['id']] = individual['creationDate']\n", - "\n", - "individual_ids = list(date_individuals.keys())\n", - "print('There are {} individuals with ids:\\n {}\\n'.format(len(individual_ids), individual_ids))\n", - "\n", - "for ind in date_individuals:\n", - " print('The individual {} was created on {}'.format(ind, date_individuals[ind]))\n", - " " + "## Using the individuals search web service without limit param\n", + "individuals = oc.individuals.search(study=study_fqn) \n", + "## Using the new function to_data_frame()\n", + "individuals_df = individuals.to_data_frame()\n", + "print(individuals_df[['id','sex','creationDate']].head())" ] }, { @@ -812,7 +685,7 @@ "id": "liquid-decimal", "metadata": {}, "source": [ - "### 2.2.2 Custom Annotations" + "### Custom Annotations" ] }, { @@ -820,20 +693,13 @@ "id": "critical-george", "metadata": {}, "source": [ - "### 2.2.2 Exploring Files" - ] - }, - { - "cell_type": "markdown", - "id": "fundamental-penalty", - "metadata": {}, - "source": [ + "## 2. Exploring Files\n", "We can start by exploring the number of files in the study, and retrieveing information about one file as an example of which kind of data is stored in the **file** data model of *OpenCGA*." ] }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 121, "id": "retired-mounting", "metadata": {}, "outputs": [ @@ -841,132 +707,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "#Time: 82\n", - "#Num matches: 3834\n", - "#Num results: 3\n", + "Information about files in study demo@family:platinum\n", + "----------------------------------------------------------\n", + "#Time: 94\n", + "#Num matches: 3874\n", + "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", - "#id\n", - "data:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz\n", - "data:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz\n", - "data:platinum-genomes-vcf-NA12879_S1.genome.vcf.gz\n", - "{'annotationSets': [],\n", - " 'bioformat': 'VARIANT',\n", - " 'creationDate': '20200625131819',\n", - " 'experiment': {},\n", - " 'external': True,\n", - " 'format': 'VCF',\n", - " 'id': 'data:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz',\n", - " 'internal': {'index': {'attributes': {},\n", - " 'creationDate': '',\n", - " 'jobId': -1,\n", - " 'release': 1,\n", - " 'status': {'date': '20200625135127',\n", - " 'description': 'Job finished. File index '\n", - " 'ready',\n", - " 'name': 'READY'},\n", - " 'userId': ''},\n", - " 'sampleMap': {},\n", - " 'status': {'date': '20200625131819',\n", - " 'description': '',\n", - " 'name': 'READY'}},\n", - " 'jobId': '',\n", - " 'modificationDate': '20200625135127',\n", - " 'name': 'platinum-genomes-vcf-NA12878_S1.genome.vcf.gz',\n", - " 'path': 'data/platinum-genomes-vcf-NA12878_S1.genome.vcf.gz',\n", - " 'relatedFiles': [],\n", - " 'release': 1,\n", - " 'sampleIds': ['NA12878'],\n", - " 'size': 883195909,\n", - " 'software': {},\n", - " 'stats': {'variantFileStats': {'biotypeCount': {},\n", - " 'chromosomeCount': {'1': 4098314,\n", - " '10': 2420434,\n", - " '11': 2334555,\n", - " '12': 2300709,\n", - " '13': 1661346,\n", - " '14': 1581664,\n", - " '15': 1549610,\n", - " '16': 1670624,\n", - " '17': 1564492,\n", - " '18': 1311874,\n", - " '19': 1290977,\n", - " '2': 4177240,\n", - " '20': 1106113,\n", - " '21': 725803,\n", - " '22': 798852,\n", - " '3': 3260109,\n", - " '4': 3277571,\n", - " '5': 3012814,\n", - " '6': 2892863,\n", - " '7': 2918797,\n", - " '8': 2481839,\n", - " '9': 2369550,\n", - " 'MT': 196,\n", - " 'X': 2415004,\n", - " 'Y': 209562},\n", - " 'chromosomeDensity': {'1': 0.016442543,\n", - " '10': 0.017858401,\n", - " '11': 0.017292166,\n", - " '12': 0.017188467,\n", - " '13': 0.014425178,\n", - " '14': 0.0147337755,\n", - " '15': 0.015113518,\n", - " '16': 0.018489609,\n", - " '17': 0.01926828,\n", - " '18': 0.016802257,\n", - " '19': 0.021833235,\n", - " '2': 0.017176196,\n", - " '20': 0.01755024,\n", - " '21': 0.015080087,\n", - " '22': 0.0155707775,\n", - " '3': 0.016463332,\n", - " '4': 0.01714621,\n", - " '5': 0.016653178,\n", - " '6': 0.01690595,\n", - " '7': 0.018341219,\n", - " '8': 0.01695662,\n", - " '9': 0.01677992,\n", - " 'MT': 0.011827892,\n", - " 'X': 0.015553522,\n", - " 'Y': 0.0035295503},\n", - " 'consequenceTypeCount': {},\n", - " 'filesCount': 1,\n", - " 'filterCount': {'.': 405,\n", - " 'IndelConflict': 14618,\n", - " 'LowGQX': 3838672,\n", - " 'LowMQ': 2841913,\n", - " 'LowQD': 738644,\n", - " 'MaxDepth': 396883,\n", - " 'PASS': 44825259,\n", - " 'SiteConflict': 34044,\n", - " 'TruthSensitivityTranche99.00to99.90': 759316,\n", - " 'TruthSensitivityTranche99.90to100.00': 1014080},\n", - " 'qualityAvg': 825.26953,\n", - " 'qualityStdDev': 827.1807,\n", - " 'sampleCount': 1,\n", - " 'tiTvRatio': 1.6145304,\n", - " 'typeCount': {'DELETION': 2,\n", - " 'INDEL': 699379,\n", - " 'NO_VARIATION': 45575269,\n", - " 'SNV': 5156262},\n", - " 'variantCount': 51430912}},\n", - " 'status': {'date': '', 'description': '', 'name': ''},\n", - " 'tags': [],\n", - " 'type': 'FILE',\n", - " 'uri': 'file:///mnt/resources/datasets/platinum/data/platinum-genomes-vcf-NA12878_S1.genome.vcf.gz',\n", - " 'uuid': 'eba10b27-0172-0003-0001-cf81e3a6b4fa'}\n" + "#id\tformat\tsize\tsoftware\n", + "data:platinum-genomes-vcf-NA12877_S1.genome.vcf.gz\tVCF\t887890738\t{}\n", + "data:platinum-genomes-vcf-NA12878_S1.genome.vcf.gz\tVCF\t883195909\t{}\n", + "data:platinum-genomes-vcf-NA12879_S1.genome.vcf.gz\tVCF\t889974818\t{}\n", + "data:platinum-genomes-vcf-NA12880_S1.genome.vcf.gz\tVCF\t899309868\t{}\n", + "data:platinum-genomes-vcf-NA12881_S1.genome.vcf.gz\tVCF\t918334187\t{}\n" ] } ], "source": [ - "## Call to the file web service\n", + "## Using the files web service\n", + "files = oc.files.search(study=study_fqn, count=True, type='FILE', limit=5, exclude='attributes') ## other possible params, count=False, id='NA12880,NA12881'\n", + "files.print_results(fields='id,format,size,software', title='Information about files in study {}'.format(study_fqn))\n", "\n", - "files = file_client.search(study=study, count=True, type='FILE', limit=3, exclude='attributes') ## other possible params, count=False, id='NA12880,NA12881'\n", - "files.print_results('id')\n", - "\n", - "pprint(files.get_result(1)) # Print information for the first file\n" + "## Uncomment next line to display an interactive JSON viewer\n", + "#JSON(files.get_results())" ] }, { @@ -974,12 +738,12 @@ "id": "dressed-emission", "metadata": {}, "source": [ - "As we can see, there are 3.766 files in the study.
There is plenty of useful information contained in the file data model like the file format, the stats, size of the file. If we want to look for more concrete information about one specific file:" + "There is plenty of useful information contained in the file data model like the file format, the stats, size of the file. If we want to look for more concrete information about one specific file:" ] }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 146, "id": "historical-tourism", "metadata": {}, "outputs": [ @@ -994,10 +758,8 @@ ], "source": [ "my_vcf = files.get_result(1)\n", - "\n", - "print('The study {} contains a {} file with id: {},\\ncreated on: {}'.format(study, my_vcf['format'], \n", - " my_vcf['id'], my_vcf['creationDate']))\n", - "\n" + "print('The study {} contains a {} file with id: {},\\ncreated on: {}'.format(study_fqn, my_vcf['format'], \n", + " my_vcf['id'], my_vcf['creationDate']))" ] }, { @@ -1005,12 +767,12 @@ "id": "numerous-nirvana", "metadata": {}, "source": [ - "Now, we might be interested in know the number of files for a specific sample:" + "- We can also be interested in knowing the number of files for a specific sample:" ] }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 147, "id": "infinite-venue", "metadata": {}, "outputs": [ @@ -1023,14 +785,14 @@ } ], "source": [ - "# Select a sample id\n", + "## Using the samples info web service\n", "sample_of_interest = sample_ids[0]\n", "\n", "## List the files for a concrete sample\n", - "sample = sample_client.info(study=study, samples= sample_of_interest) ## other possible params, count=False, id='NA12880,NA12881'\n", + "sample = oc.samples.info(study=study_fqn, samples= sample_of_interest) ## other possible params, count=False, id='NA12880,NA12881'\n", "sample_files = sample.get_result(0)['fileIds']\n", "\n", - "print('The sample {} has file/s: {}'.format(sample_of_interest, sample_files))\n" + "print('The sample {} has file/s: {}'.format(sample_of_interest, sample_files))" ] }, { @@ -1038,23 +800,17 @@ "id": "juvenile-newman", "metadata": {}, "source": [ - "### 2.2.3 Exploring Cohorts" - ] - }, - { - "cell_type": "markdown", - "id": "former-counter", - "metadata": {}, - "source": [ - "One powerful feature of *OpenCGA* is the possibility of define **cohorts** that include individuals with common traits of interest, like a phenotype, nationality etc.
\n", + "## 3. Exploring Cohorts\n", + "\n", + "One powerful feature of *OpenCGA* is the possibility of define **cohorts** that include individuals with common traits of interest, like a phenotype, nationality etc.\n", "The **cohorts** are defined at the study level. *OpenCGA* creates a default cohort *ALL*, which includes all the individuals of the study.\n", "\n", - " We can explore which cohorts are defined in the study **family** by:" + " We can explore which cohorts are defined in the **study** by:" ] }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 148, "id": "small-biodiversity", "metadata": {}, "outputs": [ @@ -1062,38 +818,26 @@ "name": "stdout", "output_type": "stream", "text": [ + "Information about cohorts in study demo@family:platinum\n", + "------------------------------------------------------------\n", "#Time: 42\n", "#Num matches: 1\n", "#Num results: 1\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", - "#id\n", - "ALL\n", - "{'annotationSets': [],\n", - " 'attributes': {},\n", - " 'creationDate': '20200625131829',\n", - " 'description': 'Default cohort with almost all indexed samples',\n", - " 'id': 'ALL',\n", - " 'internal': {'status': {'date': '20200702090536',\n", - " 'description': '',\n", - " 'name': 'READY'}},\n", - " 'modificationDate': '20200702090536',\n", - " 'numSamples': 17,\n", - " 'release': 1,\n", - " 'status': {'date': '', 'description': '', 'name': ''},\n", - " 'type': 'COLLECTION',\n", - " 'uuid': 'eba13322-0172-0005-0001-1de37fca9efe'}\n" + "#id\ttype\tdescription\tnumSamples\n", + "ALL\tCOLLECTION\tDefault cohort with almost all indexed samples\t17\n" ] } ], "source": [ - "## Call to the file web service\n", - "\n", - "cohorts = cohort_client.search(study=study, count=True, exclude='samples') ## other possible params, count=False, id='NA12880,NA12881'\n", - "cohorts.print_results('id')\n", + "## Using the cohorts search web service\n", + "cohorts = oc.cohorts.search(study=study_fqn, count=True, exclude='samples') ## other possible params, count=False, id='NA12880,NA12881'\n", + "cohorts.print_results(fields='id,type,description,numSamples', title='Information about cohorts in study {}'.format(study_fqn))\n", "\n", - "pprint(cohorts.get_result(0)) # Print information for the first file\n" + "## Uncomment next line to display an interactive JSON viewer\n", + "#JSON(cohorts.get_results())" ] }, { @@ -1101,9 +845,7 @@ "id": "impressive-crisis", "metadata": {}, "source": [ - "For the study **family** there is only 1 cohort: the default cohort *ALL*.\n", - "\n", - "As we can see in the description file of the cohort data model, *ALL* is the default cohort with almost all indexed samples." + "**[NOTE]**: For any **study** in *OpenCGA* the default cohort **ALL** is always present. As we can see in the description of the cohort data model, \"**ALL** is the default cohort with almost all indexed samples\"." ] }, { @@ -1111,7 +853,8 @@ "id": "artificial-given", "metadata": {}, "source": [ - "## 2.3 Aggregations\n", + "# Aggregations\n", + "-------\n", "You can easily filter samples, individuals, ... using your custom annotation ..." ] }, From 8565edb1a222654791c95e6fbc99ecfeb85152ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 15 Apr 2021 14:10:18 +0100 Subject: [PATCH 182/412] client: Use a strict data model for the TemplateConfiguration --- .../opencga/catalog/managers/FileManager.java | 14 +- .../client/template/TemplateManager.java | 305 ++++++++++++------ .../config/TemplateConfiguration.java | 19 +- .../client/template/config/TemplateFile.java | 27 ++ .../template/config/TemplateProject.java | 19 ++ .../client/template/config/TemplateStudy.java | 99 ++++++ .../core/models/file/FileLinkParams.java | 24 +- 7 files changed, 379 insertions(+), 128 deletions(-) create mode 100644 opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateFile.java create mode 100644 opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateProject.java create mode 100644 opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateStudy.java diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java index 66c657ade91..85f98c41c60 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java @@ -3220,12 +3220,16 @@ private OpenCGAResult privateLink(Study study, FileLinkParams params, bool // boolean resync = params.getBoolean("resync", false); // String checksum = params.getString(FileDBAdaptor.QueryParams.CHECKSUM.key(), ""); - final List relatedFiles = params.getRelatedFiles(); - if (relatedFiles != null) { - for (FileRelatedFile relatedFile : relatedFiles) { - File tmpFile = internalGet(study.getUid(), relatedFile.getFile().getId(), INCLUDE_FILE_URI_PATH, userId).first(); - relatedFile.setFile(tmpFile); + final List relatedFiles; + final List relatedFilesParams = params.getRelatedFiles(); + if (relatedFilesParams != null) { + relatedFiles = new ArrayList<>(relatedFilesParams.size()); + for (SmallRelatedFileParams relatedFileParams : relatedFilesParams) { + File tmpFile = internalGet(study.getUid(), relatedFileParams.getFile(), INCLUDE_FILE_URI_PATH, userId).first(); + relatedFiles.add(new FileRelatedFile(tmpFile, relatedFileParams.getRelation())); } + } else { + relatedFiles = null; } // Because pathDestiny can be null, we will use catalogPath as the virtual destiny where the files will be located in catalog. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java index d3a0ea590b2..529b96343b5 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java @@ -27,6 +27,9 @@ import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.OpenCGAClient; import org.opencb.opencga.client.template.config.TemplateConfiguration; +import org.opencb.opencga.client.template.config.TemplateFile; +import org.opencb.opencga.client.template.config.TemplateProject; +import org.opencb.opencga.client.template.config.TemplateStudy; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.cohort.CohortCreateParams; @@ -41,11 +44,11 @@ import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.VariantAnnotationIndexParams; import org.opencb.opencga.core.models.operations.variant.VariantSecondaryIndexParams; -import org.opencb.opencga.core.models.project.Project; +import org.opencb.opencga.core.models.panel.Panel; +import org.opencb.opencga.core.models.panel.PanelCreateParams; import org.opencb.opencga.core.models.project.ProjectCreateParams; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleCreateParams; -import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.study.StudyCreateParams; import org.opencb.opencga.core.models.study.VariableSet; import org.opencb.opencga.core.models.study.VariableSetCreateParams; @@ -87,48 +90,50 @@ public void execute(TemplateConfiguration template) throws ClientException { validate(template); // Create and load data - for (Project project : template.getProjects()) { + for (TemplateProject project : template.getProjects()) { if (projectExists(project.getId())) { logger.warn("Project '{}' already exists.", project.getId()); } else { logger.info("Creating project '{}'", project.getId()); - openCGAClient.getProjectClient().create(ProjectCreateParams.of(project)); + openCGAClient.getProjectClient().create(new ProjectCreateParams( + project.getId(), + project.getName(), + project.getDescription(), + project.getOrganism())); } List projectIndexVcfJobIds = new ArrayList<>(); List statsJobIds = new ArrayList<>(); - for (Study study : project.getStudies()) { + for (TemplateStudy study : project.getStudies()) { // NOTE: Do not change the order of the following resource creation. - createStudy(project, study); + String studyFqn = createStudy(project, study); if (CollectionUtils.isNotEmpty(study.getVariableSets())) { - createVariableSets(study); + createVariableSets(studyFqn, study); } if (CollectionUtils.isNotEmpty(study.getIndividuals())) { - createIndividuals(study); + createIndividuals(studyFqn, study); } if (CollectionUtils.isNotEmpty(study.getSamples())) { - createSamples(study); + createSamples(studyFqn, study); } if (CollectionUtils.isNotEmpty(study.getCohorts())) { - createCohorts(study); + createCohorts(studyFqn, study); } if (CollectionUtils.isNotEmpty(study.getFamilies())) { - createFamilies(study); + createFamilies(studyFqn, study); } if (CollectionUtils.isNotEmpty(study.getPanels())) { - // TODO - // createPanels(study); - logger.warn("Panels sets not created!"); + createPanels(studyFqn, study); } // TODO // if (CollectionUtils.isNotEmpty(study.getClinicalAnalysis())) { // createClinicalAnalysis(study); // } if (CollectionUtils.isNotEmpty(study.getFiles())) { - List studyIndexVcfJobIds = fetchFiles(template, study); + List studyIndexVcfJobIds = fetchFiles(template, studyFqn, study); projectIndexVcfJobIds.addAll(studyIndexVcfJobIds); if (isVariantStudy(study)) { - String statsJob = variantStats(study, studyIndexVcfJobIds); + String statsJob = variantStats(studyFqn, study, studyIndexVcfJobIds); if (statsJob != null) { statsJobIds.add(statsJob); } @@ -142,7 +147,7 @@ public void execute(TemplateConfiguration template) throws ClientException { private void filterOutTemplate(TemplateConfiguration template, Set studiesSubSet) { if (studiesSubSet != null && !studiesSubSet.isEmpty()) { int studies = 0; - for (Project project : template.getProjects()) { + for (TemplateProject project : template.getProjects()) { project.getStudies().removeIf(s -> !studiesSubSet.contains(s.getId())); studies += project.getStudies().size(); } @@ -175,10 +180,10 @@ public void validate(TemplateConfiguration template) throws ClientException { // Check if any study exists before we start, if a study exists we should fail. Projects are allowed to exist. if (!resume) { - for (Project project : template.getProjects()) { + for (TemplateProject project : template.getProjects()) { if (projectExists(project.getId())) { // If project exists, check that studies does not exist - for (Study study : project.getStudies()) { + for (TemplateStudy study : project.getStudies()) { if (studyExists(project.getId(), study.getId())) { throw new ClientException("Study '" + study.getId() + "' already exists"); } @@ -186,11 +191,11 @@ public void validate(TemplateConfiguration template) throws ClientException { } } } - for (Project project : template.getProjects()) { - for (Study study : project.getStudies()) { + for (TemplateProject project : template.getProjects()) { + for (TemplateStudy study : project.getStudies()) { URI baseUrl = getBaseUrl(template, study); if (baseUrl == null) { - for (File file : study.getFiles()) { + for (TemplateFile file : study.getFiles()) { if (file.getUri() == null) { throw new IllegalArgumentException("File uri missing. Either file.uri or baseUrl should be defined."); } @@ -215,28 +220,41 @@ public boolean studyExists(String projectId, String studyId) throws ClientExcept .append(QueryOptions.INCLUDE, "id")).first().getNumResults() > 0; } - public void createStudy(Project project, Study study) throws ClientException { + public String createStudy(TemplateProject project, TemplateStudy study) throws ClientException { ObjectMap params = new ObjectMap(ParamConstants.PROJECT_PARAM, project.getId()); - study.setFqn(openCGAClient.getUserId() + "@" + project.getId() + ":" + study.getId()); + String fqn = buildFqn(project, study); if (StringUtils.isEmpty(study.getName())) { study.setName(study.getId()); } if (study.getFiles() == null) { study.setFiles(Collections.emptyList()); } - logger.info("Creating Study '{}'", study.getFqn()); + logger.info("Creating Study '{}'", fqn); if (resume && studyExists(project.getId(), study.getId())) { - logger.info("Study {} already exists", study.getFqn()); + logger.info("Study {} already exists", fqn); } else { - openCGAClient.getStudyClient().create(StudyCreateParams.of(study), params); + openCGAClient.getStudyClient().create(new StudyCreateParams( + study.getId(), + study.getName(), + study.getAlias(), + study.getDescription(), + study.getNotification(), + study.getAttributes(), + study.getStatus()), params); } + return fqn; } - private void createVariableSets(Study study) throws ClientException { + + protected String buildFqn(TemplateProject project, TemplateStudy study) { + return openCGAClient.getUserId() + "@" + project.getId() + ":" + study.getId(); + } + + private void createVariableSets(String studyFqn, TemplateStudy study) throws ClientException { logger.info("Creating {} variable sets from study {}", study.getVariableSets().size(), study.getId()); Set existing = Collections.emptySet(); if (resume) { existing = openCGAClient.getStudyClient() - .variableSets(study.getFqn(), new ObjectMap() + .variableSets(studyFqn, new ObjectMap() .append(QueryOptions.INCLUDE, "name,id") .append(QueryOptions.LIMIT, study.getVariableSets().size())) .allResults() @@ -244,35 +262,39 @@ private void createVariableSets(Study study) throws ClientException { .map(VariableSet::getId) .collect(Collectors.toSet()); } - ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn()); - for (VariableSet variableSet : study.getVariableSets()) { + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, studyFqn); + for (VariableSetCreateParams variableSet : study.getVariableSets()) { if (!existing.contains(variableSet.getId())) { - VariableSetCreateParams data = VariableSetCreateParams.of(variableSet); - openCGAClient.getStudyClient().updateVariableSets(study.getId(), data, params); + openCGAClient.getStudyClient().updateVariableSets(study.getId(), variableSet, params); } } } - private void createIndividuals(Study study) throws ClientException { - List individuals = study.getIndividuals(); + private void createIndividuals(String studyFqn, TemplateStudy study) throws ClientException { + List individuals = study.getIndividuals(); if (CollectionUtils.isEmpty(individuals)) { return; } logger.info("Creating {} individuals from study {}", individuals.size(), study.getId()); - String studyFqn = study.getFqn(); - for (List batch : batches(individuals)) { - createIndividuals(studyFqn, batch); + for (List batch : batches(individuals)) { + createIndividualsWithoutParents(studyFqn, batch); + } + List individualsWithParents = individuals.stream() + .filter(i -> StringUtils.isNotEmpty(i.getFather()) || StringUtils.isNotEmpty(i.getMother())) + .collect(Collectors.toList()); + for (List batch : batches(individualsWithParents)) { + updateIndividualsParents(studyFqn, batch); } } - private void createIndividuals(String studyFqn, List individuals) throws ClientException { + private void createIndividualsWithoutParents(String studyFqn, List individuals) throws ClientException { ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, studyFqn); Map existing = Collections.emptyMap(); if (resume) { openCGAClient.setThrowExceptionOnError(false); existing = openCGAClient.getIndividualClient() - .info(individuals.stream().map(Individual::getId).collect(Collectors.joining(",")), - new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id,father.id,mother.id")) + .info(individuals.stream().map(IndividualCreateParams::getId).collect(Collectors.joining(",")), + new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id")) .allResults() .stream() .collect(Collectors.toMap(Individual::getId, i -> i)); @@ -281,33 +303,55 @@ private void createIndividuals(String studyFqn, List individuals) th // Create individuals without parents and siblings - for (Individual individual : individuals) { + for (IndividualCreateParams individual : individuals) { if (!existing.containsKey(individual.getId())) { - IndividualCreateParams createParams = IndividualCreateParams.of(individual); - createParams.setFather(null); - createParams.setMother(null); - openCGAClient.getIndividualClient().create(createParams, params); + // Take parents + String father = individual.getFather(); + String mother = individual.getMother(); + individual.setFather(null); + individual.setMother(null); + + openCGAClient.getIndividualClient().create(individual, params); + + // Restore parents + individual.setFather(father); + individual.setMother(mother); } } + } + + private void updateIndividualsParents(String studyFqn, List individuals) throws ClientException { + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, studyFqn); + Map existing = Collections.emptyMap(); + if (resume) { + openCGAClient.setThrowExceptionOnError(false); + existing = openCGAClient.getIndividualClient() + .info(individuals.stream().map(IndividualCreateParams::getId).collect(Collectors.joining(",")), + new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id,father.id,mother.id")) + .allResults() + .stream() + .collect(Collectors.toMap(Individual::getId, i -> i)); + openCGAClient.setThrowExceptionOnError(true); + } // Update parents and siblings for each individual - for (Individual individual : individuals) { + for (IndividualCreateParams individual : individuals) { IndividualUpdateParams updateParams = new IndividualUpdateParams(); boolean empty = true; Individual existingIndividual = existing.get(individual.getId()); - Individual father = individual.getFather(); + String father = individual.getFather(); if (father != null) { if (existingIndividual == null || existingIndividual.getFather() == null) { // Only if father does not exist already for this individual - updateParams.setFather(father.getId()); + updateParams.setFather(father); empty = false; } } - Individual mother = individual.getMother(); + String mother = individual.getMother(); if (mother != null) { if (existingIndividual == null || existingIndividual.getMother() == null) { // Only if mother does not exist already for this individual - updateParams.setMother(mother.getId()); + updateParams.setMother(mother); empty = false; } } @@ -317,20 +361,20 @@ private void createIndividuals(String studyFqn, List individuals) th } } - private void createSamples(Study study) throws ClientException { + private void createSamples(String fqn, TemplateStudy study) throws ClientException { logger.info("Creating {} samples from study {}", study.getSamples().size(), study.getId()); - for (List batch : batches(study.getSamples())) { - createSamples(study.getFqn(), batch); + for (List batch : batches(study.getSamples())) { + createSamples(fqn, batch); } } - private void createSamples(String fqn, List samples) throws ClientException { + private void createSamples(String fqn, List samples) throws ClientException { ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, fqn); Set existing = Collections.emptySet(); if (resume) { openCGAClient.setThrowExceptionOnError(false); existing = openCGAClient.getSampleClient() - .info(samples.stream().map(Sample::getId).collect(Collectors.joining(",")), + .info(samples.stream().map(SampleCreateParams::getId).collect(Collectors.joining(",")), new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id")) .allResults() .stream() @@ -338,21 +382,21 @@ private void createSamples(String fqn, List samples) throws ClientExcept .collect(Collectors.toSet()); openCGAClient.setThrowExceptionOnError(true); } - for (Sample sample : samples) { + for (SampleCreateParams sample : samples) { if (!existing.contains(sample.getId())) { - openCGAClient.getSampleClient().create(SampleCreateParams.of(sample), params); + openCGAClient.getSampleClient().create(sample, params); } } } - private void createCohorts(Study study) throws ClientException { + private void createCohorts(String fqn, TemplateStudy study) throws ClientException { logger.info("Creating {} cohorts from study {}", study.getCohorts().size(), study.getId()); - ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn()); + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, fqn); Set existing = Collections.emptySet(); if (resume) { openCGAClient.setThrowExceptionOnError(false); existing = openCGAClient.getCohortClient() - .info(study.getCohorts().stream().map(Cohort::getId).collect(Collectors.joining(",")), + .info(study.getCohorts().stream().map(CohortCreateParams::getId).collect(Collectors.joining(",")), new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id")) .allResults() .stream() @@ -360,31 +404,31 @@ private void createCohorts(Study study) throws ClientException { .collect(Collectors.toSet()); openCGAClient.setThrowExceptionOnError(true); } - for (Cohort cohort : study.getCohorts()) { + for (CohortCreateParams cohort : study.getCohorts()) { if (!existing.contains(cohort.getId())) { - openCGAClient.getCohortClient().create(CohortCreateParams.of(cohort), params); + openCGAClient.getCohortClient().create(cohort, params); } } } - private void createFamilies(Study study) throws ClientException { - List families = study.getFamilies(); + private void createFamilies(String fqn, TemplateStudy study) throws ClientException { + List families = study.getFamilies(); if (CollectionUtils.isEmpty(families)) { return; } logger.info("Creating {} families from study {}", families.size(), study.getId()); - for (List batch : batches(families)) { - createFamilies(study.getFqn(), batch); + for (List batch : batches(families)) { + createFamilies(fqn, batch); } } - private void createFamilies(String fqn, List families) throws ClientException { + private void createFamilies(String fqn, List families) throws ClientException { ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, fqn); Set existing = Collections.emptySet(); if (resume) { openCGAClient.setThrowExceptionOnError(false); existing = openCGAClient.getFamilyClient() - .info(families.stream().map(Family::getId).collect(Collectors.joining(",")), + .info(families.stream().map(FamilyCreateParams::getId).collect(Collectors.joining(",")), new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id")) .allResults() .stream() @@ -392,31 +436,57 @@ private void createFamilies(String fqn, List families) throws ClientExce .collect(Collectors.toSet()); openCGAClient.setThrowExceptionOnError(true); } - for (Family family : families) { - params.put("members", family.getMembers().stream().map(Individual::getId).collect(Collectors.toList())); - family.setMembers(null); + for (FamilyCreateParams family : families) { +// params.put("members", family.getMembers().stream().map(i->i.getId()).collect(Collectors.toList())); +// family.setMembers(null); if (!existing.contains(family.getId())) { - openCGAClient.getFamilyClient().create(FamilyCreateParams.of(family), params); + openCGAClient.getFamilyClient().create(family, params); + } + } + } + + private void createPanels(String fqn, TemplateStudy study) throws ClientException { + List panels = study.getPanels(); + if (CollectionUtils.isEmpty(panels)) { + return; + } + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, fqn); + Set existing = Collections.emptySet(); + if (resume) { + openCGAClient.setThrowExceptionOnError(false); + existing = openCGAClient.getDiseasePanelClient() + .info(panels.stream().map(PanelCreateParams::getId).collect(Collectors.joining(",")), + new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id")) + .allResults() + .stream() + .map(Panel::getId) + .collect(Collectors.toSet()); + openCGAClient.setThrowExceptionOnError(true); + } + for (PanelCreateParams panel : panels) { + if (!existing.contains(panel.getId())) { + openCGAClient.getDiseasePanelClient().create(panel, params); } } } - private List fetchFiles(TemplateConfiguration template, Study study) throws ClientException { - List files = study.getFiles(); + private List fetchFiles(TemplateConfiguration template, String studyFqn, TemplateStudy study) + throws ClientException { + List files = study.getFiles(); if (CollectionUtils.isEmpty(files)) { return Collections.emptyList(); } List indexVcfJobIds = new ArrayList<>(files.size()); - for (List batch : batches(files)) { - indexVcfJobIds.addAll(fetchFiles(template, study, batch)); + for (List batch : batches(files)) { + indexVcfJobIds.addAll(fetchFiles(template, studyFqn, study, batch)); } return indexVcfJobIds; } - private List fetchFiles(TemplateConfiguration template, Study study, List files) + private List fetchFiles(TemplateConfiguration template, String studyFqn, TemplateStudy study, List files) throws ClientException { URI baseUrl = getBaseUrl(template, study); - ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn()); + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, studyFqn); Set existing = new HashSet<>(); Set existingAndIndexed = new HashSet<>(); if (resume) { @@ -440,25 +510,27 @@ private List fetchFiles(TemplateConfiguration template, Study study, Lis openCGAClient.setThrowExceptionOnError(true); } List indexVcfJobIds = new ArrayList<>(); - for (File file : files) { + for (TemplateFile file : files) { file.setPath(getFilePath(file)); file.setName(Paths.get(file.getPath()).getFileName().toString()); - file.setId(file.getPath().replace("/", ":")); + String fileId = file.getPath().replace("/", ":"); List jobs = Collections.emptyList(); if (!existing.contains(getFilePath(file))) { jobs = fetchFile(baseUrl, params, file); + } else { + updateFileIfChanged(fileId, file, params); } if (template.isIndex()) { if (isVcf(file) && !existingAndIndexed.contains(getFilePath(file))) { - indexVcfJobIds.add(indexVcf(study, getFilePath(file), jobs)); + indexVcfJobIds.add(indexVcf(studyFqn, study, getFilePath(file), jobs)); } } } return indexVcfJobIds; } - private String getFilePath(File file) { + private String getFilePath(TemplateFile file) { String path = file.getPath() == null ? "" : file.getPath(); String name = file.getName() == null ? "" : file.getName(); if (StringUtils.isEmpty(name) || path.endsWith(name)) { @@ -467,7 +539,7 @@ private String getFilePath(File file) { return path + (path.endsWith("/") ? "" : "/") + name; } - private List fetchFile(URI baseUrl, ObjectMap params, File file) throws ClientException { + private List fetchFile(URI baseUrl, ObjectMap params, TemplateFile file) throws ClientException { List jobDependsOn; String parentPath; @@ -482,7 +554,7 @@ private List fetchFile(URI baseUrl, ObjectMap params, File file) throws if (file.getUri() == null) { fileUri = baseUrl.resolve(file.getName()); } else { - fileUri = file.getUri(); + fileUri = URI.create(file.getUri()); } if (!fileUri.getScheme().equals("file")) { @@ -491,11 +563,12 @@ private List fetchFile(URI baseUrl, ObjectMap params, File file) throws if (file.getUri() == null) { fetchUrl = baseUrl + file.getName(); } else { - fetchUrl = file.getUri().toString(); + fetchUrl = file.getUri(); } FileFetch fileFetch = new FileFetch(fetchUrl, parentPath); String fetchJobId = checkJob(openCGAClient.getFileClient().fetch(fileFetch, params)); jobDependsOn = Collections.singletonList(fetchJobId); + // TODO: Other fields are not being updated! } else { // Link file if (StringUtils.isNotEmpty(parentPath)) { @@ -503,15 +576,41 @@ private List fetchFile(URI baseUrl, ObjectMap params, File file) throws openCGAClient.getFileClient().create(createFolder, params); } FileLinkParams data = new FileLinkParams(fileUri.toString(), parentPath, - file.getDescription(), Collections.emptyList(), null, null); -// String fileId = openCGAClient.getFileClient().link(data, params).firstResult().getId(); -// openCGAClient.getFileClient().update(fileId, FileUpdateParams.of(file), params); + file.getDescription(), file.getRelatedFiles(), file.getStatus(), null); + String fileId = openCGAClient.getFileClient().link(data, params).firstResult().getId(); + updateFile(fileId, file, params); jobDependsOn = Collections.emptyList(); } return jobDependsOn; } - private URI getBaseUrl(TemplateConfiguration template, Study study) { + private void updateFileIfChanged(String fileId, TemplateFile file, ObjectMap params) throws ClientException { + // TODO: Check if update is needed! + updateFile(fileId, file, params); + } + + private void updateFile(String fileId, TemplateFile file, ObjectMap params) throws ClientException { + openCGAClient.getFileClient().update(fileId, new FileUpdateParams( + file.getName(), + file.getDescription(), + file.getSampleIds(), + file.getChecksum(), + file.getFormat(), + file.getBioformat(), + file.getSoftware(), + file.getExperiment(), + file.getTags(), + file.getInternal(), + file.getSize(), + file.getRelatedFiles(), + file.getStatus(), + file.getAnnotationSets(), + file.getStats(), + file.getAttributes() + ), params); + } + + private URI getBaseUrl(TemplateConfiguration template, TemplateStudy study) { String baseUrl = template.getBaseUrl(); if (StringUtils.isEmpty(baseUrl)) { return null; @@ -523,14 +622,14 @@ private URI getBaseUrl(TemplateConfiguration template, Study study) { return URI.create(baseUrl); } - private boolean isVcf(File file) { + private boolean isVcf(TemplateFile file) { String path = getFilePath(file); return path.endsWith(".vcf.gz") || path.endsWith(".vcf") || path.endsWith(".gvcf.gz") || path.endsWith(".gvcf"); } - private String indexVcf(Study study, String file, List jobDependsOn) throws ClientException { - ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn()); + private String indexVcf(String fqn, TemplateStudy study, String file, List jobDependsOn) throws ClientException { + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, fqn); params.put(ParamConstants.JOB_DEPENDS_ON, jobDependsOn); VariantIndexParams variantIndexParams = new VariantIndexParams().setFile(file); if (study.getAttributes() != null) { @@ -543,7 +642,7 @@ private String indexVcf(Study study, String file, List jobDependsOn) thr .runIndex(variantIndexParams, params)); } - private void postIndex(Project project, List indexVcfJobIds, List statsJobIds) throws ClientException { + private void postIndex(TemplateProject project, List indexVcfJobIds, List statsJobIds) throws ClientException { List studies = getVariantStudies(project); if (!studies.isEmpty()) { List jobs = new ArrayList<>(statsJobIds); @@ -552,10 +651,10 @@ private void postIndex(Project project, List indexVcfJobIds, List indexVcfJobIds) throws ClientException { + private String variantStats(String fqn, TemplateStudy study, List indexVcfJobIds) throws ClientException { if (resume) { Cohort cohort = openCGAClient.getCohortClient() - .info(StudyEntry.DEFAULT_COHORT, new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn())) + .info(StudyEntry.DEFAULT_COHORT, new ObjectMap(ParamConstants.STUDY_PARAM, fqn)) .firstResult(); if (cohort != null) { if (cohort.getInternal() != null && cohort.getInternal().getStatus() != null) { @@ -567,12 +666,12 @@ private String variantStats(Study study, List indexVcfJobIds) throws Cli } } - ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, study.getFqn()) + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, fqn) .append(ParamConstants.JOB_DEPENDS_ON, indexVcfJobIds); VariantStatsAnalysisParams data = new VariantStatsAnalysisParams(); data.setIndex(true); data.setAggregated(Aggregation.NONE); - for (File file : study.getFiles()) { + for (TemplateFile file : study.getFiles()) { if (file.getName().endsWith(".properties") && file.getAttributes() != null && Boolean.parseBoolean(String.valueOf(file.getAttributes().get("aggregationMappingFile")))) { @@ -596,7 +695,7 @@ private String variantStats(Study study, List indexVcfJobIds) throws Cli .runStats(data, params)); } - private String variantAnnot(Project project, List indexVcfJobIds) throws ClientException { + private String variantAnnot(TemplateProject project, List indexVcfJobIds) throws ClientException { ObjectMap params = new ObjectMap() .append(ParamConstants.PROJECT_PARAM, project.getId()) .append(ParamConstants.JOB_DEPENDS_ON, indexVcfJobIds); @@ -604,7 +703,7 @@ private String variantAnnot(Project project, List indexVcfJobIds) throws .indexVariantAnnotation(new VariantAnnotationIndexParams(), params)); } - private void variantSecondaryIndex(Project project, List jobs) throws ClientException { + private void variantSecondaryIndex(TemplateProject project, List jobs) throws ClientException { ObjectMap params = new ObjectMap() .append(ParamConstants.PROJECT_PARAM, project.getId()) .append(ParamConstants.JOB_DEPENDS_ON, jobs); @@ -612,15 +711,15 @@ private void variantSecondaryIndex(Project project, List jobs) throws Cl .secondaryIndexVariant(new VariantSecondaryIndexParams().setOverwrite(true), params)); } - private List getVariantStudies(Project project) { + private List getVariantStudies(TemplateProject project) { return project.getStudies() .stream() .filter(this::isVariantStudy) - .map(Study::getFqn) + .map(s -> buildFqn(project, s)) .collect(Collectors.toList()); } - private boolean isVariantStudy(Study study) { + private boolean isVariantStudy(TemplateStudy study) { return study.getFiles() != null && study.getFiles().stream().anyMatch(this::isVcf); } diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateConfiguration.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateConfiguration.java index 514cfe9741f..77c8812585d 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateConfiguration.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateConfiguration.java @@ -18,8 +18,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import org.opencb.opencga.core.models.project.Project; -import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.study.StudyAclEntry; import java.io.File; @@ -36,7 +34,7 @@ public class TemplateConfiguration { private String baseUrl; private boolean index; private List acl; - private List projects; + private List projects; public static TemplateConfiguration load(Path mainConfigurationPath) throws IOException { @@ -49,17 +47,18 @@ public static TemplateConfiguration load(Path mainConfigurationPath) throws IOEx // Enrich IOException with fileName throw new IOException("Error parsing main template configuration file '" + mainConfigurationPath + "'", e); } - Map> studies = new HashMap<>(); - for (Project project : templateConfiguration.getProjects()) { + Map> studies = new HashMap<>(); + for (TemplateProject project : templateConfiguration.getProjects()) { studies.put(project.getId(), new ArrayList<>()); if (project.getStudies() != null) { - for (Study study : project.getStudies()) { + for (TemplateStudy study : project.getStudies()) { + // TODO: Support extension .yaml and .json File file = mainConfigurationPath.getParent().resolve(study.getId() + ".yml").toFile(); // If file exists we load it and overwrite Study object. // If a file with the study does not exist then Study must be defined in the main.yml file. if (file.exists()) { try { - study = objectMapper.readValue(file, Study.class); + study = objectMapper.readValue(file, TemplateStudy.class); } catch (IOException e) { // Enrich IOException with fileName throw new IOException("Error parsing study '" + study.getId() + "' template configuration file " @@ -72,7 +71,7 @@ public static TemplateConfiguration load(Path mainConfigurationPath) throws IOEx } // Set studies read from files - for (Project project : templateConfiguration.getProjects()) { + for (TemplateProject project : templateConfiguration.getProjects()) { project.setStudies(studies.get(project.getId())); } return templateConfiguration; @@ -126,11 +125,11 @@ public void setAcl(List acl) { this.acl = acl; } - public List getProjects() { + public List getProjects() { return projects; } - public void setProjects(List projects) { + public void setProjects(List projects) { this.projects = projects; } } diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateFile.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateFile.java new file mode 100644 index 00000000000..ccf9e0d58b1 --- /dev/null +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateFile.java @@ -0,0 +1,27 @@ +package org.opencb.opencga.client.template.config; + +import org.opencb.opencga.core.models.file.FileUpdateParams; + +public class TemplateFile extends FileUpdateParams { + + private String path; + private String uri; + + public String getPath() { + return path; + } + + public TemplateFile setPath(String path) { + this.path = path; + return this; + } + + public String getUri() { + return uri; + } + + public TemplateFile setUri(String uri) { + this.uri = uri; + return this; + } +} diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateProject.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateProject.java new file mode 100644 index 00000000000..70483d489d6 --- /dev/null +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateProject.java @@ -0,0 +1,19 @@ +package org.opencb.opencga.client.template.config; + +import org.opencb.opencga.core.models.project.ProjectCreateParams; + +import java.util.List; + +public class TemplateProject extends ProjectCreateParams { + + private List studies; + + public List getStudies() { + return studies; + } + + public TemplateProject setStudies(List studies) { + this.studies = studies; + return this; + } +} diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateStudy.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateStudy.java new file mode 100644 index 00000000000..25a4f384e4b --- /dev/null +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateStudy.java @@ -0,0 +1,99 @@ +package org.opencb.opencga.client.template.config; + +import org.opencb.opencga.core.models.clinical.ClinicalAnalysisCreateParams; +import org.opencb.opencga.core.models.cohort.CohortCreateParams; +import org.opencb.opencga.core.models.family.FamilyCreateParams; +import org.opencb.opencga.core.models.individual.IndividualCreateParams; +import org.opencb.opencga.core.models.panel.PanelCreateParams; +import org.opencb.opencga.core.models.sample.SampleCreateParams; +import org.opencb.opencga.core.models.study.StudyCreateParams; +import org.opencb.opencga.core.models.study.StudyVariantEngineConfiguration; +import org.opencb.opencga.core.models.study.VariableSetCreateParams; + +import java.util.List; + +public class TemplateStudy extends StudyCreateParams { + + private List samples; + private List individuals; + private List families; + private List cohorts; + private List panels; + private List clinicalAnalyses; + private List variableSets; + private List files; + +// private StudyVariantEngineConfiguration variantEngineConfiguration; + + public List getSamples() { + return samples; + } + + public TemplateStudy setSamples(List samples) { + this.samples = samples; + return this; + } + + public List getIndividuals() { + return individuals; + } + + public TemplateStudy setIndividuals(List individuals) { + this.individuals = individuals; + return this; + } + + public List getFamilies() { + return families; + } + + public TemplateStudy setFamilies(List families) { + this.families = families; + return this; + } + + public List getCohorts() { + return cohorts; + } + + public TemplateStudy setCohorts(List cohorts) { + this.cohorts = cohorts; + return this; + } + + public List getPanels() { + return panels; + } + + public TemplateStudy setPanels(List panels) { + this.panels = panels; + return this; + } + + public List getClinicalAnalyses() { + return clinicalAnalyses; + } + + public TemplateStudy setClinicalAnalyses(List clinicalAnalyses) { + this.clinicalAnalyses = clinicalAnalyses; + return this; + } + + public List getVariableSets() { + return variableSets; + } + + public TemplateStudy setVariableSets(List variableSets) { + this.variableSets = variableSets; + return this; + } + + public List getFiles() { + return files; + } + + public TemplateStudy setFiles(List files) { + this.files = files; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileLinkParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileLinkParams.java index 41684408da7..7050aaf36c7 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileLinkParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileLinkParams.java @@ -66,16 +66,20 @@ public String toString() { return sb.toString(); } - public List getRelatedFiles() { - if (ListUtils.isEmpty(relatedFiles)) { - return null; - } - List relatedFileList = new ArrayList<>(relatedFiles.size()); - for (SmallRelatedFileParams relatedFile : relatedFiles) { - relatedFileList.add(new FileRelatedFile(new File().setId(relatedFile.getFile()), relatedFile.getRelation())); - } - return relatedFileList; - } + public List getRelatedFiles() { + return relatedFiles; + } + +// public List getRelatedFiles() { +// if (ListUtils.isEmpty(relatedFiles)) { +// return null; +// } +// List relatedFileList = new ArrayList<>(relatedFiles.size()); +// for (SmallRelatedFileParams relatedFile : relatedFiles) { +// relatedFileList.add(new FileRelatedFile(new File().setId(relatedFile.getFile()), relatedFile.getRelation())); +// } +// return relatedFileList; +// } public String getUri() { return uri; From f7845dc45d4bb2a5ed7e6e396004c43ce70cbf3c Mon Sep 17 00:00:00 2001 From: imedina Date: Thu, 15 Apr 2021 15:06:09 +0100 Subject: [PATCH 183/412] clients: complete variant query notebook --- .../pyopencga_variant_query.ipynb | 7060 ++++++++++++++++- 1 file changed, 6931 insertions(+), 129 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 9e509239602..32b3f064ce0 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -13,10 +13,21 @@ "A good first step when start working with OpenCGA is to explore **Catalog**, which holds: information about our user, the projects and studies our user has permission to access and the clinical data from the studies. For guidance you can refer to : [pyopencga_catalog.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", "\n", "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", - "- https://ws.opencb.org/opencga-prod/webservices/\n", + "- https://ws.opencb.org/opencga-prod/webservices/\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Table of Contents:\n", "\n", "This Notebook is organised in the following sections:\n", - "[**PENDING**]" + "\n", + "* [Querying Variants: Filter by Variant Annotation](#Querying-Variants:-Filter-by-Variant-Annotation)\n", + "* [Querying Variants: Filter by Sample Data](#Querying-Variants:-Filter-by-Sample-Data)\n", + "* [Aggregation Stats](#Aggregation-Stats)\n", + "* [Use Cases](#Use-Cases)" ] }, { @@ -34,14 +45,14 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Logged succesfuly to https://ws.opencb.org/opencga-prod, eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTg0NTA5ODQsImV4cCI6MTYxODQ1NDU4NH0.0-mZQ4e5opmBBaf7gwArYQL_RLTf2GWZELmCs_IueeM well done!\n" + "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTg0OTM3MDQsImV4cCI6MTYxODQ5NzMwNH0.KtfSt8jD8liZIxlsSAJ7hXBopHMy3_tZ3mAbl9AeUS8 well done!\n" ] } ], @@ -97,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 46, "metadata": {}, "outputs": [], "source": [ @@ -431,7 +442,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -440,53 +451,6738 @@ "text": [ "Filter by missense_variant:\n", "--------------------------------\n", - "#Time: 261\n", + "#Time: 279\n", "#Num matches: 15401\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:69511:A:G\t,OR4F5\tmissense_variant\n", - "1:909238:G:C\tC1orf170,,PLEKHN1\tmissense_variant\n", - "1:909309:T:C\tC1orf170,,PLEKHN1\tmissense_variant\n", - "1:914876:T:C\tC1orf170,,PLEKHN1\tmissense_variant\n", - "1:916549:A:G\tC1orf170,\tmissense_variant\n", + "1:69511:A:G\tOR4F5,\tmissense_variant\n", + "1:909238:G:C\t,PLEKHN1,C1orf170\tmissense_variant\n", + "1:909309:T:C\t,PLEKHN1,C1orf170\tmissense_variant\n", + "1:914876:T:C\t,PLEKHN1,C1orf170\tmissense_variant\n", + "1:916549:A:G\t,C1orf170\tmissense_variant\n", "\n", "\n", "Filter by missense_variant,stop_gained:\n", "--------------------------------------------\n", - "#Time: 254\n", + "#Time: 265\n", "#Num matches: 15578\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:69511:A:G\t,OR4F5\tmissense_variant\n", - "1:909238:G:C\tC1orf170,,PLEKHN1\tmissense_variant\n", - "1:909309:T:C\tC1orf170,,PLEKHN1\tmissense_variant\n", - "1:914876:T:C\tC1orf170,,PLEKHN1\tmissense_variant\n", - "1:916549:A:G\tC1orf170,\tmissense_variant\n", + "1:69511:A:G\tOR4F5,\tmissense_variant\n", + "1:909238:G:C\t,PLEKHN1,C1orf170\tmissense_variant\n", + "1:909309:T:C\t,PLEKHN1,C1orf170\tmissense_variant\n", + "1:914876:T:C\t,PLEKHN1,C1orf170\tmissense_variant\n", + "1:916549:A:G\t,C1orf170\tmissense_variant\n", "\n", "\n", "Filter by lof:\n", "-------------------\n", - "#Time: 306\n", + "#Time: 297\n", "#Num matches: 5075\n", "#Num results: 5\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "1:897730:C:T\t,PLEKHN1,KLHL17,NOC2L\tsplice_region_variant\n", + "1:897730:C:T\tNOC2L,,PLEKHN1,KLHL17\tsplice_region_variant\n", "1:977330:T:C\t,AGRN\tsplice_region_variant\n", - "1:987200:C:T\t,AGRN,RP11-54O7.14\tsplice_region_variant\n", + "1:987200:C:T\t,RP11-54O7.14,AGRN\tsplice_region_variant\n", "1:1233941:T:C\t,ACAP3\tsplice_region_variant\n", "1:1558792:T:C\tMIB2\tstart_lost\n", "\n", "\n" ] + }, + { + "data": { + "application/json": [ + { + "alternate": "T", + "annotation": { + "alternate": "T", + "chromosome": "1", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000187961", + "ensemblTranscriptId": "ENST00000338591", + "geneName": "KLHL17", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "cdnaPosition": 827, + "cdsPosition": 0, + "codon": "", + "ensemblGeneId": "ENSG00000187961", + "ensemblTranscriptId": "ENST00000463212", + "geneName": "KLHL17", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000187583", + "ensemblTranscriptId": "ENST00000379410", + "geneName": "PLEKHN1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000188976", + "ensemblTranscriptId": "ENST00000327044", + "geneName": "NOC2L", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000188976", + "ensemblTranscriptId": "ENST00000477976", + "geneName": "NOC2L", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000187583", + "ensemblTranscriptId": "ENST00000379407", + "geneName": "PLEKHN1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000187961", + "ensemblTranscriptId": "ENST00000481067", + "geneName": "KLHL17", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000188976", + "ensemblTranscriptId": "ENST00000469563", + "geneName": "NOC2L", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000187583", + "ensemblTranscriptId": "ENST00000379409", + "geneName": "PLEKHN1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000187961", + "ensemblTranscriptId": "ENST00000466300", + "geneName": "KLHL17", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000188976", + "ensemblTranscriptId": "ENST00000487214", + "geneName": "NOC2L", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ] + }, + { + "ensemblGeneId": "", + "ensemblTranscriptId": "", + "geneName": "", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "description": "", + "score": -0.4480000138282776, + "source": "phylop" + }, + { + "description": "", + "score": 0.05299999937415123, + "source": "phastCons" + }, + { + "description": "", + "score": 3.6700000762939453, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "1", + "end": 2300000, + "name": "p36.33", + "stain": "gneg", + "start": 1 + } + ], + "displayConsequenceType": "splice_region_variant", + "end": 897730, + "functionalScore": [ + { + "description": "", + "score": 0.4499998092651367, + "source": "cadd_raw" + }, + { + "description": "", + "score": 7.079999923706055, + "source": "cadd_scaled" + } + ], + "hgvs": [ + "ENST00000338591(ENSG00000187961):c.712-5C>T", + "ENST00000463212(ENSG00000187961):n.827C>T" + ], + "populationFrequencies": [ + { + "altAlleleFreq": 0.009202454, + "population": "SAS", + "refAlleleFreq": 0.9907975, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.16256611, + "population": "AFR", + "refAlleleFreq": 0.8374339, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.17473525, + "population": "AFR", + "refAlleleFreq": 0.82526475, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.08173077, + "population": "JPT", + "refAlleleFreq": 0.9182692, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.12037037, + "population": "YRI", + "refAlleleFreq": 0.8796296, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.0301343, + "population": "ALL", + "refAlleleFreq": 0.9698657, + "study": "DISCOVEHR" + }, + { + "altAlleleFreq": 0.005050505, + "population": "CEU", + "refAlleleFreq": 0.9949495, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.027221963, + "population": "EA", + "refAlleleFreq": 0.972778, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.044293586, + "population": "ALL", + "refAlleleFreq": 0.9557064, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.056774642, + "population": "EAS", + "refAlleleFreq": 0.9432254, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.057539683, + "population": "EAS", + "refAlleleFreq": 0.9424603, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.045558088, + "population": "OTH", + "refAlleleFreq": 0.9544419, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.024464427, + "population": "ALL", + "refAlleleFreq": 0.9755356, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.047046587, + "population": "FEMALE", + "refAlleleFreq": 0.9529534, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.029785337, + "population": "NFE", + "refAlleleFreq": 0.97021466, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.16197184, + "population": "AA", + "refAlleleFreq": 0.8380282, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.025461668, + "population": "TWINSUK_NODUP", + "refAlleleFreq": 0.9745383, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.056242276, + "population": "EAS", + "refAlleleFreq": 0.9437577, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.02335236, + "population": "ALSPAC", + "refAlleleFreq": 0.9766476, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.12295082, + "population": "ASW", + "refAlleleFreq": 0.8770492, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.1764706, + "population": "MSL", + "refAlleleFreq": 0.8235294, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.05536683, + "population": "AMR", + "refAlleleFreq": 0.9446332, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.060606062, + "population": "FIN", + "refAlleleFreq": 0.93939394, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.058755226, + "population": "EAS", + "refAlleleFreq": 0.9412448, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.03846154, + "population": "PUR", + "refAlleleFreq": 0.96153843, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.051312648, + "population": "AMR", + "refAlleleFreq": 0.9486874, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.0070140283, + "population": "ALL", + "refAlleleFreq": 0.99298596, + "study": "GONL" + }, + { + "altAlleleFreq": 0.19026549, + "population": "GWD", + "refAlleleFreq": 0.8097345, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.04945055, + "population": "GBR", + "refAlleleFreq": 0.9505494, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.023364486, + "population": "IBS", + "refAlleleFreq": 0.9766355, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.05703356, + "population": "AMR", + "refAlleleFreq": 0.94296646, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.0058139535, + "population": "BEB", + "refAlleleFreq": 0.99418604, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.16145833, + "population": "ACB", + "refAlleleFreq": 0.8385417, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.1919192, + "population": "ESN", + "refAlleleFreq": 0.8080808, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.029601702, + "population": "NFE", + "refAlleleFreq": 0.9703983, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.12765957, + "population": "CLM", + "refAlleleFreq": 0.87234044, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.040899795, + "population": "OTH", + "refAlleleFreq": 0.9591002, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.07110493, + "population": "ALL", + "refAlleleFreq": 0.92889506, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.009803922, + "population": "ITU", + "refAlleleFreq": 0.99019605, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.04418775, + "population": "OTH", + "refAlleleFreq": 0.9558123, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.031588085, + "population": "NFE", + "refAlleleFreq": 0.9684119, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.042244904, + "population": "ALL", + "refAlleleFreq": 0.9577551, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.03809524, + "population": "CHS", + "refAlleleFreq": 0.96190476, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.041198503, + "population": "ALL", + "refAlleleFreq": 0.9588015, + "study": "MGP" + }, + { + "altAlleleFreq": 0.014732965, + "population": "SAS", + "refAlleleFreq": 0.98526704, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.0882353, + "population": "PEL", + "refAlleleFreq": 0.9117647, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.058252428, + "population": "CHB", + "refAlleleFreq": 0.94174755, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.16483408, + "population": "AFR", + "refAlleleFreq": 0.8351659, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.07747604, + "population": "ALL", + "refAlleleFreq": 0.922524, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.03125, + "population": "MXL", + "refAlleleFreq": 0.96875, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.034617458, + "population": "FIN", + "refAlleleFreq": 0.9653825, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.07348703, + "population": "AMR", + "refAlleleFreq": 0.92651296, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.004854369, + "population": "GIH", + "refAlleleFreq": 0.9951456, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.056074765, + "population": "TSI", + "refAlleleFreq": 0.94392526, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.072857365, + "population": "ALL", + "refAlleleFreq": 0.9271426, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.02562028, + "population": "TWINSUK", + "refAlleleFreq": 0.9743797, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.03696275, + "population": "FIN", + "refAlleleFreq": 0.96303725, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.024509804, + "population": "STU", + "refAlleleFreq": 0.9754902, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.06989247, + "population": "CDX", + "refAlleleFreq": 0.93010753, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.028924774, + "population": "ASJ", + "refAlleleFreq": 0.97107524, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.03830094, + "population": "MALE", + "refAlleleFreq": 0.96169907, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.06638704, + "population": "FEMALE", + "refAlleleFreq": 0.93361294, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.04040404, + "population": "KHV", + "refAlleleFreq": 0.959596, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.07492677, + "population": "MALE", + "refAlleleFreq": 0.9250732, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.023178808, + "population": "ASJ", + "refAlleleFreq": 0.9768212, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.24242425, + "population": "LWK", + "refAlleleFreq": 0.75757575, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.16425565, + "population": "AFR", + "refAlleleFreq": 0.8357444, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.032801963, + "population": "FIN", + "refAlleleFreq": 0.967198, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.038767397, + "population": "EUR", + "refAlleleFreq": 0.9612326, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [], + "start": 897730, + "traitAssociation": [], + "variantTraitAssociation": {}, + "xrefs": [ + { + "id": "ENST00000463212", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000379410", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000327044", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000379407", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000481067", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000469563", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000379409", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000466300", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000463212(ENSG00000187961):n.827C>T", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000487214", + "source": "ensemblTranscript" + }, + { + "id": "rs7549631", + "source": "dbSNP" + }, + { + "id": "ENST00000338591", + "source": "ensemblTranscript" + }, + { + "id": "ENSG00000187583", + "source": "ensemblGene" + }, + { + "id": "ENST00000477976", + "source": "ensemblTranscript" + }, + { + "id": "ENSG00000187961", + "source": "ensemblGene" + }, + { + "id": "ENSG00000188976", + "source": "ensemblGene" + }, + { + "id": "ENST00000338591(ENSG00000187961):c.712-5C>T", + "source": "ensemblTranscript" + } + ] + }, + "chromosome": "1", + "end": 897730, + "id": "1:897730:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 897730, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "alternate": "C", + "chromosome": "1", + "consequenceTypes": [ + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000479707", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000379370", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000477585", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000469403", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ] + }, + { + "ensemblGeneId": "", + "ensemblTranscriptId": "", + "geneName": "", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "description": "", + "score": -0.8539999723434448, + "source": "phylop" + }, + { + "description": "", + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "description": "", + "score": -2.7699999809265137, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "1", + "end": 2300000, + "name": "p36.33", + "stain": "gneg", + "start": 1 + } + ], + "displayConsequenceType": "splice_region_variant", + "end": 977330, + "functionalScore": [ + { + "description": "", + "score": -0.6400003433227539, + "source": "cadd_raw" + }, + { + "description": "", + "score": 0.10000000149011612, + "source": "cadd_scaled" + } + ], + "geneTraitAssociation": [ + { + "hpo": "HP:0003388", + "id": "OMIM:614198", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616321", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:254300", + "name": "Gowers sign" + }, + { + "hpo": "HP:0003402", + "id": "OMIM:608930", + "name": "Decreased miniature endplate potentials" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:254210", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:601462", + "name": "High palate" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:608930", + "name": "Ptosis" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:254300", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0003443", + "id": "OMIM:608931", + "name": "Decreased size of nerve terminals" + }, + { + "hpo": "HP:0000276", + "id": "OMIM:608931", + "name": "Long face" + }, + { + "hpo": "HP:0002872", + "id": "OMIM:254210", + "name": "Apneic episodes precipitated by illness, fatigue, stress" + }, + { + "hpo": "HP:0001260", + "id": "OMIM:601462", + "name": "Dysarthria" + }, + { + "hpo": "HP:0001263", + "id": "OMIM:616330", + "name": "Global developmental delay" + }, + { + "hpo": "HP:0002033", + "id": "OMIM:254210", + "name": "Poor suck" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:608931", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0001270", + "id": "OMIM:608931", + "name": "Motor delay" + }, + { + "hpo": "HP:0008180", + "id": "OMIM:254300", + "name": "Mildly elevated creatine phosphokinase" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:608931", + "name": "High palate" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:608930", + "name": "Dysphagia" + }, + { + "hpo": "HP:0001260", + "id": "OMIM:608930", + "name": "Dysarthria" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:605809", + "name": "Dysphagia" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:608931", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0002804", + "id": "OMIM:254210", + "name": "Arthrogryposis multiplex congenita" + }, + { + "hpo": "HP:0001283", + "id": "OMIM:605809", + "name": "Bulbar palsy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:605809", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0000276", + "id": "OMIM:616313", + "name": "Long face" + }, + { + "hpo": "HP:0002515", + "id": "OMIM:254300", + "name": "Waddling gait" + }, + { + "hpo": "HP:0001612", + "id": "OMIM:254210", + "name": "Weak cry" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:616323", + "name": "Dysphagia" + }, + { + "hpo": "HP:0001270", + "id": "OMIM:614198", + "name": "Motor delay" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:616324", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616323", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000544", + "id": "OMIM:614198", + "name": "External ophthalmoplegia" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:605809", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:601462", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0003403", + "id": "OMIM:608931", + "name": "EMG: decremental response of compound muscle action potential to repetitive nerve stimulation" + }, + { + "hpo": "HP:0000486", + "id": "OMIM:608931", + "name": "Strabismus" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:605809", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:608931", + "name": "Gowers sign" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:608931", + "name": "Variable expressivity" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:616322", + "name": "High palate" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:608931", + "name": "Facial palsy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616326", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:616326", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0001283", + "id": "OMIM:254210", + "name": "Bulbar palsy" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616323", + "name": "Facial palsy" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:601462", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0003593", + "id": "OMIM:608930", + "name": "Infantile onset" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:608930", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0001288", + "id": "OMIM:616040", + "name": "Gait disturbance" + }, + { + "hpo": "HP:0001260", + "id": "OMIM:608931", + "name": "Dysarthria" + }, + { + "hpo": "HP:0001270", + "id": "OMIM:608930", + "name": "Motor delay" + }, + { + "hpo": "HP:0003324", + "id": "OMIM:601462", + "name": "Generalized muscle weakness" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:605809", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616325", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616323", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:614198", + "name": "Ptosis" + }, + { + "hpo": "HP:0002098", + "id": "OMIM:605809", + "name": "Respiratory distress" + }, + { + "hpo": "HP:0001612", + "id": "OMIM:605809", + "name": "Weak cry" + }, + { + "hpo": "HP:0002715", + "id": "OMIM:608931", + "name": "Abnormality of the immune system" + }, + { + "hpo": "HP:0003693", + "id": "OMIM:254300", + "name": "Distal amyotrophy" + }, + { + "hpo": "HP:0000467", + "id": "OMIM:616325", + "name": "Neck muscle weakness" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616304", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:614198", + "name": "High palate" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:608931", + "name": "Ptosis" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:608931", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0007126", + "id": "OMIM:254300", + "name": "Proximal amyotrophy" + }, + { + "hpo": "HP:0000467", + "id": "OMIM:608930", + "name": "Neck muscle weakness" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:254210", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:605809", + "name": "Ptosis" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616314", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:254210", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616326", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0000303", + "id": "OMIM:608931", + "name": "Mandibular prognathia" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616326", + "name": "Ptosis" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:616326", + "name": "High palate" + }, + { + "hpo": "HP:0003202", + "id": "OMIM:616040", + "name": "Skeletal muscle atrophy" + }, + { + "hpo": "HP:0001324", + "id": "OMIM:616314", + "name": "Muscle weakness" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:616323", + "name": "High palate" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:608930", + "name": "Facial palsy" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:616040", + "name": "Pes cavus" + }, + { + "hpo": "HP:0003394", + "id": "OMIM:608931", + "name": "Muscle cramps" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616325", + "name": "Facial palsy" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:254300", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616322", + "name": "Facial palsy" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616325", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616330", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616304", + "name": "Ptosis" + }, + { + "hpo": "HP:0002882", + "id": "OMIM:254210", + "name": "Sudden episodic apnea" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616313", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:608931", + "name": "Dysphagia" + }, + { + "hpo": "HP:0002650", + "id": "OMIM:608930", + "name": "Scoliosis" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:608931", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0003202", + "id": "OMIM:616313", + "name": "Skeletal muscle atrophy" + }, + { + "hpo": "HP:0001324", + "id": "OMIM:616330", + "name": "Muscle weakness" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:616326", + "name": "Gowers sign" + }, + { + "hpo": "HP:0000347", + "id": "OMIM:608930", + "name": "Micrognathia" + }, + { + "hpo": "HP:0003593", + "id": "OMIM:608931", + "name": "Infantile onset" + }, + { + "hpo": "HP:0003621", + "id": "OMIM:254300", + "name": "Juvenile onset" + }, + { + "hpo": "HP:0001371", + "id": "OMIM:616313", + "name": "Flexion contracture" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:614198", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:615120", + "name": "Ptosis" + }, + { + "hpo": "HP:0001251", + "id": "OMIM:616330", + "name": "Ataxia" + }, + { + "hpo": "HP:0002804", + "id": "OMIM:608930", + "name": "Arthrogryposis multiplex congenita" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616324", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:601462", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0001283", + "id": "OMIM:254300", + "name": "Bulbar palsy" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:254210", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:608930", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0002098", + "id": "OMIM:254210", + "name": "Respiratory distress" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616313", + "name": "Facial palsy" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616322", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0000486", + "id": "OMIM:605809", + "name": "Strabismus" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616325", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:601462", + "name": "Dysphagia" + }, + { + "hpo": "HP:0003403", + "id": "OMIM:254210", + "name": "EMG: decremental response of compound muscle action potential to repetitive nerve stimulation" + }, + { + "hpo": "HP:0003674", + "id": "OMIM:601462", + "name": "Onset" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616324", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0003397", + "id": "OMIM:605809", + "name": "Generalized hypotonia due to defect at the neuromuscular junction" + }, + { + "hpo": "HP:0002355", + "id": "OMIM:616304", + "name": "Difficulty walking" + }, + { + "hpo": "HP:0003397", + "id": "OMIM:254210", + "name": "Generalized hypotonia due to defect at the neuromuscular junction" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616322", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616322", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616325", + "name": "Ptosis" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:601462", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0001371", + "id": "OMIM:616330", + "name": "Flexion contracture" + }, + { + "hpo": "HP:0002804", + "id": "OMIM:608931", + "name": "Arthrogryposis multiplex congenita" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:254300", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0003199", + "id": "OMIM:608931", + "name": "Decreased muscle mass" + }, + { + "hpo": "HP:0000365", + "id": "OMIM:616040", + "name": "Hearing impairment" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616322", + "name": "Ptosis" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:608930", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:254210", + "name": "Dysphagia" + }, + { + "hpo": "HP:0000467", + "id": "OMIM:616324", + "name": "Neck muscle weakness" + }, + { + "hpo": "HP:0003577", + "id": "OMIM:254210", + "name": "Congenital onset" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:608930", + "name": "Variable expressivity" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:254300", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:614198", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:616325", + "name": "Gowers sign" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:616322", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616330", + "name": "Ptosis" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616323", + "name": "Ptosis" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:608931", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616324", + "name": "Facial palsy" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:616325", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:615120", + "name": "Facial palsy" + }, + { + "hpo": "HP:0001260", + "id": "OMIM:616330", + "name": "Dysarthria" + }, + { + "hpo": "HP:0002033", + "id": "OMIM:608930", + "name": "Poor suck" + }, + { + "hpo": "HP:0003690", + "id": "OMIM:605809", + "name": "Limb muscle weakness" + }, + { + "hpo": "HP:0001612", + "id": "OMIM:608930", + "name": "Weak cry" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616322", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0003436", + "id": "OMIM:601462", + "name": "Prolonged miniature endplate currents" + }, + { + "hpo": "HP:0001612", + "id": "OMIM:608931", + "name": "Weak cry" + }, + { + "hpo": "HP:0000006", + "id": "OMIM:601462", + "name": "Autosomal dominant inheritance" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616324", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616324", + "name": "Ptosis" + }, + { + "hpo": "HP:0003701", + "id": "OMIM:616040", + "name": "Proximal muscle weakness" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616321", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:254300", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0004889", + "id": "OMIM:601462", + "name": "Intermittent episodes of respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0003577", + "id": "OMIM:605809", + "name": "Congenital onset" + }, + { + "hpo": "HP:0001290", + "id": "OMIM:605809", + "name": "Generalized hypotonia" + }, + { + "hpo": "HP:0003680", + "id": "OMIM:608931", + "name": "Nonprogressive" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616313", + "name": "Ptosis" + }, + { + "hpo": "HP:0002033", + "id": "OMIM:605809", + "name": "Poor suck" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:254300", + "name": "Ptosis" + }, + { + "hpo": "HP:0003324", + "id": "OMIM:616321", + "name": "Generalized muscle weakness" + }, + { + "hpo": "HP:0000689", + "id": "OMIM:608931", + "name": "Dental malocclusion" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:615120", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0003202", + "id": "OMIM:608931", + "name": "Skeletal muscle atrophy" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616321", + "name": "Ptosis" + }, + { + "hpo": "HP:0002104", + "id": "OMIM:614198", + "name": "Apnea" + }, + { + "hpo": "HP:0001288", + "id": "OMIM:614198", + "name": "Gait disturbance" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:608931", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:608931", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0002804", + "id": "OMIM:616326", + "name": "Arthrogryposis multiplex congenita" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616323", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616326", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0002872", + "id": "OMIM:605809", + "name": "Apneic episodes precipitated by illness, fatigue, stress" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:608930", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:254210", + "name": "Ptosis" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616314", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0002355", + "id": "OMIM:616330", + "name": "Difficulty walking" + }, + { + "hpo": "HP:0003307", + "id": "OMIM:614198", + "name": "Hyperlordosis" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:616330", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616314", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:616313", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:608930", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0002882", + "id": "OMIM:605809", + "name": "Sudden episodic apnea" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:601462", + "name": "Ptosis" + }, + { + "hpo": "HP:0002540", + "id": "OMIM:616321", + "name": "Inability to walk" + }, + { + "hpo": "HP:0000774", + "id": "OMIM:615120", + "name": "Narrow chest" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616313", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0000276", + "id": "OMIM:616326", + "name": "Long face" + }, + { + "hpo": "HP:0000006", + "id": "OMIM:608930", + "name": "Autosomal dominant inheritance" + }, + { + "hpo": "HP:0008872", + "id": "OMIM:605809", + "name": "Feeding difficulties in infancy" + }, + { + "hpo": "HP:0001765", + "id": "OMIM:616040", + "name": "Hammertoe" + }, + { + "hpo": "HP:0003443", + "id": "OMIM:601462", + "name": "Decreased size of nerve terminals" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616326", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:605809", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:608930", + "name": "Gowers sign" + }, + { + "hpo": "HP:0003402", + "id": "OMIM:254210", + "name": "Decreased miniature endplate potentials" + }, + { + "hpo": "HP:0001284", + "id": "OMIM:616040", + "name": "Areflexia" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:615120", + "name": "High palate" + }, + { + "hpo": "HP:0002715", + "id": "OMIM:254210", + "name": "Abnormality of the immune system" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:254300", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:601462", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:616322", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:615120", + "name": "Variable expressivity" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:615120", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0003324", + "id": "OMIM:608930", + "name": "Generalized muscle weakness" + }, + { + "hpo": "HP:0001265", + "id": "OMIM:616304", + "name": "Hyporeflexia" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:615120", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:254210", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:608931", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0001283", + "id": "OMIM:608930", + "name": "Bulbar palsy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616321", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0003403", + "id": "OMIM:605809", + "name": "EMG: decremental response of compound muscle action potential to repetitive nerve stimulation" + }, + { + "hpo": "HP:0002465", + "id": "OMIM:616330", + "name": "Poor speech" + }, + { + "hpo": "HP:0000400", + "id": "OMIM:608930", + "name": "Macrotia" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:616313", + "name": "High palate" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:616321", + "name": "Dysphagia" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:608930", + "name": "High palate" + }, + { + "hpo": "HP:0000275", + "id": "OMIM:616313", + "name": "Narrow face" + }, + { + "hpo": "HP:0000486", + "id": "OMIM:254210", + "name": "Strabismus" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:608930", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616330", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:605809", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0002715", + "id": "OMIM:254300", + "name": "Abnormality of the immune system" + }, + { + "hpo": "HP:0001265", + "id": "OMIM:616040", + "name": "Hyporeflexia" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616324", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:608931", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0000467", + "id": "OMIM:616322", + "name": "Neck muscle weakness" + }, + { + "hpo": "HP:0003402", + "id": "OMIM:605809", + "name": "Decreased miniature endplate potentials" + }, + { + "hpo": "HP:0001284", + "id": "OMIM:616330", + "name": "Areflexia" + }, + { + "hpo": "HP:0003394", + "id": "OMIM:254300", + "name": "Muscle cramps" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:254300", + "name": "Facial palsy" + } + ], + "hgvs": [ + "ENST00000379370(ENSG00000188157):c.1178-6T>C" + ], + "populationFrequencies": [ + { + "altAlleleFreq": 0.9662577, + "population": "SAS", + "refAlleleFreq": 0.03374231, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.71686745, + "population": "AFR", + "refAlleleFreq": 0.28313255, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.68986386, + "population": "AFR", + "refAlleleFreq": 0.31013614, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 1, + "population": "JPT", + "refAlleleFreq": 0, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.6944444, + "population": "YRI", + "refAlleleFreq": 0.30555558, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.921317, + "population": "ALL", + "refAlleleFreq": 0.07868302, + "study": "DISCOVEHR" + }, + { + "altAlleleFreq": 0.93434346, + "population": "CEU", + "refAlleleFreq": 0.06565654, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9207771, + "population": "EA", + "refAlleleFreq": 0.07922292, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.9165589, + "population": "ALL", + "refAlleleFreq": 0.08344108, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.99976623, + "population": "EAS", + "refAlleleFreq": 0.00023376942, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.99900794, + "population": "EAS", + "refAlleleFreq": 0.0009920597, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9325581, + "population": "OTH", + "refAlleleFreq": 0.06744188, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.92052364, + "population": "ALL", + "refAlleleFreq": 0.07947636, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.9198803, + "population": "FEMALE", + "refAlleleFreq": 0.08011973, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.9160947, + "population": "NFE", + "refAlleleFreq": 0.08390528, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.7194457, + "population": "AA", + "refAlleleFreq": 0.2805543, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.922216, + "population": "TWINSUK_NODUP", + "refAlleleFreq": 0.077784, + "study": "UK10K" + }, + { + "altAlleleFreq": 1, + "population": "EAS", + "refAlleleFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.91904515, + "population": "ALSPAC", + "refAlleleFreq": 0.08095485, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.74590164, + "population": "ASW", + "refAlleleFreq": 0.25409836, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.7352941, + "population": "MSL", + "refAlleleFreq": 0.2647059, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.95126826, + "population": "AMR", + "refAlleleFreq": 0.048731744, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.9444444, + "population": "FIN", + "refAlleleFreq": 0.055555582, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9997642, + "population": "EAS", + "refAlleleFreq": 0.00023579597, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.88461536, + "population": "PUR", + "refAlleleFreq": 0.11538464, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.93301433, + "population": "AMR", + "refAlleleFreq": 0.06698567, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.9519038, + "population": "ALL", + "refAlleleFreq": 0.04809618, + "study": "GONL" + }, + { + "altAlleleFreq": 0.7079646, + "population": "GWD", + "refAlleleFreq": 0.2920354, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.93406594, + "population": "GBR", + "refAlleleFreq": 0.06593406, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.91588783, + "population": "IBS", + "refAlleleFreq": 0.08411217, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.95406914, + "population": "AMR", + "refAlleleFreq": 0.045930862, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.98255813, + "population": "BEB", + "refAlleleFreq": 0.017441869, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.6510417, + "population": "ACB", + "refAlleleFreq": 0.3489583, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.7171717, + "population": "ESN", + "refAlleleFreq": 0.28282827, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.91767037, + "population": "NFE", + "refAlleleFreq": 0.08232963, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.90957445, + "population": "CLM", + "refAlleleFreq": 0.09042555, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9347826, + "population": "OTH", + "refAlleleFreq": 0.065217376, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.879539, + "population": "ALL", + "refAlleleFreq": 0.12046099, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.95098037, + "population": "ITU", + "refAlleleFreq": 0.049019635, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.92316216, + "population": "OTH", + "refAlleleFreq": 0.07683784, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.93297297, + "population": "NFE", + "refAlleleFreq": 0.06702703, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.9234955, + "population": "ALL", + "refAlleleFreq": 0.07650453, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 1, + "population": "CHS", + "refAlleleFreq": 0, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9479167, + "population": "PJL", + "refAlleleFreq": 0.052083313, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.6142322, + "population": "ALL", + "refAlleleFreq": 0.38576782, + "study": "MGP" + }, + { + "altAlleleFreq": 0.95436895, + "population": "SAS", + "refAlleleFreq": 0.04563105, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.9647059, + "population": "PEL", + "refAlleleFreq": 0.035294116, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 1, + "population": "CHB", + "refAlleleFreq": 0, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.71750665, + "population": "AFR", + "refAlleleFreq": 0.28249335, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.8851837, + "population": "ALL", + "refAlleleFreq": 0.11481631, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9375, + "population": "MXL", + "refAlleleFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9542195, + "population": "FIN", + "refAlleleFreq": 0.04578048, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.9207493, + "population": "AMR", + "refAlleleFreq": 0.07925069, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9611651, + "population": "GIH", + "refAlleleFreq": 0.03883493, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.89719623, + "population": "TSI", + "refAlleleFreq": 0.10280377, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8525927, + "population": "ALL", + "refAlleleFreq": 0.1474073, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.92206043, + "population": "TWINSUK", + "refAlleleFreq": 0.07793957, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.95972383, + "population": "FIN", + "refAlleleFreq": 0.04027617, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.99019605, + "population": "STU", + "refAlleleFreq": 0.009803951, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 1, + "population": "CDX", + "refAlleleFreq": 0, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.92441624, + "population": "ASJ", + "refAlleleFreq": 0.075583756, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.9264251, + "population": "MALE", + "refAlleleFreq": 0.0735749, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.8816329, + "population": "FEMALE", + "refAlleleFreq": 0.118367076, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.9949495, + "population": "KHV", + "refAlleleFreq": 0.0050504804, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8778399, + "population": "MALE", + "refAlleleFreq": 0.12216008, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.93, + "population": "ASJ", + "refAlleleFreq": 0.06999999, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.6010101, + "population": "LWK", + "refAlleleFreq": 0.39898992, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.70930856, + "population": "AFR", + "refAlleleFreq": 0.29069144, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.94924814, + "population": "FIN", + "refAlleleFreq": 0.050751865, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.92445326, + "population": "EUR", + "refAlleleFreq": 0.07554674, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [], + "start": 977330, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "ClinicalSignificance_in_source_file", + "value": "benign" + } + ], + "bibliography": [], + "ethnicity": "Z", + "heritableTraits": [ + { + "inheritanceMode": "biallelic", + "trait": "not specified" + } + ], + "id": "RCV000116254", + "source": { + "name": "clinvar" + }, + "submissions": [], + "url": "https://www.ncbi.nlm.nih.gov/clinvar/RCV000116254", + "variantClassification": { + "clinicalSignificance": "benign" + } + }, + { + "additionalProperties": [ + { + "name": "ClinicalSignificance_in_source_file", + "value": "benign" + } + ], + "bibliography": [], + "ethnicity": "Z", + "heritableTraits": [ + { + "inheritanceMode": "unknown", + "trait": "not specified" + } + ], + "id": "128292", + "source": { + "name": "clinvar" + }, + "submissions": [], + "variantClassification": { + "clinicalSignificance": "benign" + } + } + ], + "variantTraitAssociation": { + "clinvar": [ + { + "accession": "RCV000116254", + "clinicalSignificance": "benign", + "geneNames": [], + "reviewStatus": "", + "traits": [ + "{\"trait\": \"not specified\", \"inheritanceMode\": \"biallelic\"}" + ] + }, + { + "accession": "128292", + "clinicalSignificance": "benign", + "geneNames": [], + "reviewStatus": "", + "traits": [ + "{\"trait\": \"not specified\", \"inheritanceMode\": \"unknown\"}" + ] + } + ] + }, + "xrefs": [ + { + "id": "ENSG00000188157", + "source": "ensemblGene" + }, + { + "id": "ENST00000479707", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000379370", + "source": "ensemblTranscript" + }, + { + "id": "rs2799066", + "source": "dbSNP" + }, + { + "id": "ENST00000477585", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000469403", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000379370(ENSG00000188157):c.1178-6T>C", + "source": "ensemblTranscript" + } + ] + }, + "chromosome": "1", + "end": 977330, + "id": "1:977330:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 977330, + "strand": "+", + "studies": [], + "type": "SNV" + }, + { + "alternate": "T", + "annotation": { + "alternate": "T", + "chromosome": "1", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000419249", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000492947", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000379370", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "sense_intronic", + "ensemblGeneId": "ENSG00000242590", + "ensemblTranscriptId": "ENST00000418300", + "geneName": "RP11-54O7.14", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000466223", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000478677", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000188157", + "ensemblTranscriptId": "ENST00000461111", + "geneName": "AGRN", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ] + }, + { + "ensemblGeneId": "", + "ensemblTranscriptId": "", + "geneName": "", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "description": "", + "score": -1.225000023841858, + "source": "phylop" + }, + { + "description": "", + "score": 0.020999999716877937, + "source": "phastCons" + }, + { + "description": "", + "score": -6.110000133514404, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "1", + "end": 2300000, + "name": "p36.33", + "stain": "gneg", + "start": 1 + } + ], + "displayConsequenceType": "splice_region_variant", + "end": 987200, + "functionalScore": [ + { + "description": "", + "score": 0.26000022888183594, + "source": "cadd_raw" + }, + { + "description": "", + "score": 5.349999904632568, + "source": "cadd_scaled" + } + ], + "geneTraitAssociation": [ + { + "hpo": "HP:0003388", + "id": "OMIM:614198", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616321", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:254300", + "name": "Gowers sign" + }, + { + "hpo": "HP:0003402", + "id": "OMIM:608930", + "name": "Decreased miniature endplate potentials" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:254210", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:601462", + "name": "High palate" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:608930", + "name": "Ptosis" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:254300", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0003443", + "id": "OMIM:608931", + "name": "Decreased size of nerve terminals" + }, + { + "hpo": "HP:0000276", + "id": "OMIM:608931", + "name": "Long face" + }, + { + "hpo": "HP:0002872", + "id": "OMIM:254210", + "name": "Apneic episodes precipitated by illness, fatigue, stress" + }, + { + "hpo": "HP:0001260", + "id": "OMIM:601462", + "name": "Dysarthria" + }, + { + "hpo": "HP:0001263", + "id": "OMIM:616330", + "name": "Global developmental delay" + }, + { + "hpo": "HP:0002033", + "id": "OMIM:254210", + "name": "Poor suck" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:608931", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0001270", + "id": "OMIM:608931", + "name": "Motor delay" + }, + { + "hpo": "HP:0008180", + "id": "OMIM:254300", + "name": "Mildly elevated creatine phosphokinase" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:608931", + "name": "High palate" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:608930", + "name": "Dysphagia" + }, + { + "hpo": "HP:0001260", + "id": "OMIM:608930", + "name": "Dysarthria" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:605809", + "name": "Dysphagia" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:608931", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0002804", + "id": "OMIM:254210", + "name": "Arthrogryposis multiplex congenita" + }, + { + "hpo": "HP:0001283", + "id": "OMIM:605809", + "name": "Bulbar palsy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:605809", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0000276", + "id": "OMIM:616313", + "name": "Long face" + }, + { + "hpo": "HP:0002515", + "id": "OMIM:254300", + "name": "Waddling gait" + }, + { + "hpo": "HP:0001612", + "id": "OMIM:254210", + "name": "Weak cry" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:616323", + "name": "Dysphagia" + }, + { + "hpo": "HP:0001270", + "id": "OMIM:614198", + "name": "Motor delay" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:616324", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616323", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000544", + "id": "OMIM:614198", + "name": "External ophthalmoplegia" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:605809", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:601462", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0003403", + "id": "OMIM:608931", + "name": "EMG: decremental response of compound muscle action potential to repetitive nerve stimulation" + }, + { + "hpo": "HP:0000486", + "id": "OMIM:608931", + "name": "Strabismus" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:605809", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:608931", + "name": "Gowers sign" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:608931", + "name": "Variable expressivity" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:616322", + "name": "High palate" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:608931", + "name": "Facial palsy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616326", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:616326", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0001283", + "id": "OMIM:254210", + "name": "Bulbar palsy" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616323", + "name": "Facial palsy" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:601462", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0003593", + "id": "OMIM:608930", + "name": "Infantile onset" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:608930", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0001288", + "id": "OMIM:616040", + "name": "Gait disturbance" + }, + { + "hpo": "HP:0001260", + "id": "OMIM:608931", + "name": "Dysarthria" + }, + { + "hpo": "HP:0001270", + "id": "OMIM:608930", + "name": "Motor delay" + }, + { + "hpo": "HP:0003324", + "id": "OMIM:601462", + "name": "Generalized muscle weakness" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:605809", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616325", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616323", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:614198", + "name": "Ptosis" + }, + { + "hpo": "HP:0002098", + "id": "OMIM:605809", + "name": "Respiratory distress" + }, + { + "hpo": "HP:0001612", + "id": "OMIM:605809", + "name": "Weak cry" + }, + { + "hpo": "HP:0002715", + "id": "OMIM:608931", + "name": "Abnormality of the immune system" + }, + { + "hpo": "HP:0003693", + "id": "OMIM:254300", + "name": "Distal amyotrophy" + }, + { + "hpo": "HP:0000467", + "id": "OMIM:616325", + "name": "Neck muscle weakness" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616304", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:614198", + "name": "High palate" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:608931", + "name": "Ptosis" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:608931", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0007126", + "id": "OMIM:254300", + "name": "Proximal amyotrophy" + }, + { + "hpo": "HP:0000467", + "id": "OMIM:608930", + "name": "Neck muscle weakness" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:254210", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:605809", + "name": "Ptosis" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616314", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:254210", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616326", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0000303", + "id": "OMIM:608931", + "name": "Mandibular prognathia" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616326", + "name": "Ptosis" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:616326", + "name": "High palate" + }, + { + "hpo": "HP:0003202", + "id": "OMIM:616040", + "name": "Skeletal muscle atrophy" + }, + { + "hpo": "HP:0001324", + "id": "OMIM:616314", + "name": "Muscle weakness" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:616323", + "name": "High palate" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:608930", + "name": "Facial palsy" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:616040", + "name": "Pes cavus" + }, + { + "hpo": "HP:0003394", + "id": "OMIM:608931", + "name": "Muscle cramps" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616325", + "name": "Facial palsy" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:254300", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616322", + "name": "Facial palsy" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616325", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616330", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616304", + "name": "Ptosis" + }, + { + "hpo": "HP:0002882", + "id": "OMIM:254210", + "name": "Sudden episodic apnea" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616313", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:608931", + "name": "Dysphagia" + }, + { + "hpo": "HP:0002650", + "id": "OMIM:608930", + "name": "Scoliosis" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:608931", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0003202", + "id": "OMIM:616313", + "name": "Skeletal muscle atrophy" + }, + { + "hpo": "HP:0001324", + "id": "OMIM:616330", + "name": "Muscle weakness" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:616326", + "name": "Gowers sign" + }, + { + "hpo": "HP:0000347", + "id": "OMIM:608930", + "name": "Micrognathia" + }, + { + "hpo": "HP:0003593", + "id": "OMIM:608931", + "name": "Infantile onset" + }, + { + "hpo": "HP:0003621", + "id": "OMIM:254300", + "name": "Juvenile onset" + }, + { + "hpo": "HP:0001371", + "id": "OMIM:616313", + "name": "Flexion contracture" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:614198", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:615120", + "name": "Ptosis" + }, + { + "hpo": "HP:0001251", + "id": "OMIM:616330", + "name": "Ataxia" + }, + { + "hpo": "HP:0002804", + "id": "OMIM:608930", + "name": "Arthrogryposis multiplex congenita" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616324", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:601462", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0001283", + "id": "OMIM:254300", + "name": "Bulbar palsy" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:254210", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:608930", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0002098", + "id": "OMIM:254210", + "name": "Respiratory distress" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616313", + "name": "Facial palsy" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616322", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0000486", + "id": "OMIM:605809", + "name": "Strabismus" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616325", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:601462", + "name": "Dysphagia" + }, + { + "hpo": "HP:0003403", + "id": "OMIM:254210", + "name": "EMG: decremental response of compound muscle action potential to repetitive nerve stimulation" + }, + { + "hpo": "HP:0003674", + "id": "OMIM:601462", + "name": "Onset" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616324", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0003397", + "id": "OMIM:605809", + "name": "Generalized hypotonia due to defect at the neuromuscular junction" + }, + { + "hpo": "HP:0002355", + "id": "OMIM:616304", + "name": "Difficulty walking" + }, + { + "hpo": "HP:0003397", + "id": "OMIM:254210", + "name": "Generalized hypotonia due to defect at the neuromuscular junction" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616322", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616322", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616325", + "name": "Ptosis" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:601462", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0001371", + "id": "OMIM:616330", + "name": "Flexion contracture" + }, + { + "hpo": "HP:0002804", + "id": "OMIM:608931", + "name": "Arthrogryposis multiplex congenita" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:254300", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0003199", + "id": "OMIM:608931", + "name": "Decreased muscle mass" + }, + { + "hpo": "HP:0000365", + "id": "OMIM:616040", + "name": "Hearing impairment" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616322", + "name": "Ptosis" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:608930", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:254210", + "name": "Dysphagia" + }, + { + "hpo": "HP:0000467", + "id": "OMIM:616324", + "name": "Neck muscle weakness" + }, + { + "hpo": "HP:0003577", + "id": "OMIM:254210", + "name": "Congenital onset" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:608930", + "name": "Variable expressivity" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:254300", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:614198", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:616325", + "name": "Gowers sign" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:616322", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616330", + "name": "Ptosis" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616323", + "name": "Ptosis" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:608931", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:616324", + "name": "Facial palsy" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:616325", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:615120", + "name": "Facial palsy" + }, + { + "hpo": "HP:0001260", + "id": "OMIM:616330", + "name": "Dysarthria" + }, + { + "hpo": "HP:0002033", + "id": "OMIM:608930", + "name": "Poor suck" + }, + { + "hpo": "HP:0003690", + "id": "OMIM:605809", + "name": "Limb muscle weakness" + }, + { + "hpo": "HP:0001612", + "id": "OMIM:608930", + "name": "Weak cry" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616322", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0003436", + "id": "OMIM:601462", + "name": "Prolonged miniature endplate currents" + }, + { + "hpo": "HP:0001612", + "id": "OMIM:608931", + "name": "Weak cry" + }, + { + "hpo": "HP:0000006", + "id": "OMIM:601462", + "name": "Autosomal dominant inheritance" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616324", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616324", + "name": "Ptosis" + }, + { + "hpo": "HP:0003701", + "id": "OMIM:616040", + "name": "Proximal muscle weakness" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616321", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:254300", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0004889", + "id": "OMIM:601462", + "name": "Intermittent episodes of respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0003577", + "id": "OMIM:605809", + "name": "Congenital onset" + }, + { + "hpo": "HP:0001290", + "id": "OMIM:605809", + "name": "Generalized hypotonia" + }, + { + "hpo": "HP:0003680", + "id": "OMIM:608931", + "name": "Nonprogressive" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616313", + "name": "Ptosis" + }, + { + "hpo": "HP:0002033", + "id": "OMIM:605809", + "name": "Poor suck" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:254300", + "name": "Ptosis" + }, + { + "hpo": "HP:0003324", + "id": "OMIM:616321", + "name": "Generalized muscle weakness" + }, + { + "hpo": "HP:0000689", + "id": "OMIM:608931", + "name": "Dental malocclusion" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:615120", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0003202", + "id": "OMIM:608931", + "name": "Skeletal muscle atrophy" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:616321", + "name": "Ptosis" + }, + { + "hpo": "HP:0002104", + "id": "OMIM:614198", + "name": "Apnea" + }, + { + "hpo": "HP:0001288", + "id": "OMIM:614198", + "name": "Gait disturbance" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:608931", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:608931", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0002804", + "id": "OMIM:616326", + "name": "Arthrogryposis multiplex congenita" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616323", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616326", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0002872", + "id": "OMIM:605809", + "name": "Apneic episodes precipitated by illness, fatigue, stress" + }, + { + "hpo": "HP:0003554", + "id": "OMIM:608930", + "name": "Type 2 muscle fiber atrophy" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:254210", + "name": "Ptosis" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:616314", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0002355", + "id": "OMIM:616330", + "name": "Difficulty walking" + }, + { + "hpo": "HP:0003307", + "id": "OMIM:614198", + "name": "Hyperlordosis" + }, + { + "hpo": "HP:0001558", + "id": "OMIM:616330", + "name": "Decreased fetal movement" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616314", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:616313", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0000007", + "id": "OMIM:608930", + "name": "Autosomal recessive inheritance" + }, + { + "hpo": "HP:0002882", + "id": "OMIM:605809", + "name": "Sudden episodic apnea" + }, + { + "hpo": "HP:0000508", + "id": "OMIM:601462", + "name": "Ptosis" + }, + { + "hpo": "HP:0002540", + "id": "OMIM:616321", + "name": "Inability to walk" + }, + { + "hpo": "HP:0000774", + "id": "OMIM:615120", + "name": "Narrow chest" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616313", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0000276", + "id": "OMIM:616326", + "name": "Long face" + }, + { + "hpo": "HP:0000006", + "id": "OMIM:608930", + "name": "Autosomal dominant inheritance" + }, + { + "hpo": "HP:0008872", + "id": "OMIM:605809", + "name": "Feeding difficulties in infancy" + }, + { + "hpo": "HP:0001765", + "id": "OMIM:616040", + "name": "Hammertoe" + }, + { + "hpo": "HP:0003443", + "id": "OMIM:601462", + "name": "Decreased size of nerve terminals" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:616326", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0002747", + "id": "OMIM:605809", + "name": "Respiratory insufficiency due to muscle weakness" + }, + { + "hpo": "HP:0003391", + "id": "OMIM:608930", + "name": "Gowers sign" + }, + { + "hpo": "HP:0003402", + "id": "OMIM:254210", + "name": "Decreased miniature endplate potentials" + }, + { + "hpo": "HP:0001284", + "id": "OMIM:616040", + "name": "Areflexia" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:615120", + "name": "High palate" + }, + { + "hpo": "HP:0002715", + "id": "OMIM:254210", + "name": "Abnormality of the immune system" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:254300", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0011968", + "id": "OMIM:601462", + "name": "Feeding difficulties" + }, + { + "hpo": "HP:0000602", + "id": "OMIM:616322", + "name": "Ophthalmoplegia" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:615120", + "name": "Variable expressivity" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:615120", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0003324", + "id": "OMIM:608930", + "name": "Generalized muscle weakness" + }, + { + "hpo": "HP:0001265", + "id": "OMIM:616304", + "name": "Hyporeflexia" + }, + { + "hpo": "HP:0002093", + "id": "OMIM:615120", + "name": "Respiratory insufficiency" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:254210", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:608931", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0001283", + "id": "OMIM:608930", + "name": "Bulbar palsy" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616321", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0003403", + "id": "OMIM:605809", + "name": "EMG: decremental response of compound muscle action potential to repetitive nerve stimulation" + }, + { + "hpo": "HP:0002465", + "id": "OMIM:616330", + "name": "Poor speech" + }, + { + "hpo": "HP:0000400", + "id": "OMIM:608930", + "name": "Macrotia" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:616313", + "name": "High palate" + }, + { + "hpo": "HP:0002015", + "id": "OMIM:616321", + "name": "Dysphagia" + }, + { + "hpo": "HP:0000218", + "id": "OMIM:608930", + "name": "High palate" + }, + { + "hpo": "HP:0000275", + "id": "OMIM:616313", + "name": "Narrow face" + }, + { + "hpo": "HP:0000486", + "id": "OMIM:254210", + "name": "Strabismus" + }, + { + "hpo": "HP:0000597", + "id": "OMIM:608930", + "name": "Ophthalmoparesis" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:616330", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0003473", + "id": "OMIM:605809", + "name": "Fatigable weakness" + }, + { + "hpo": "HP:0002715", + "id": "OMIM:254300", + "name": "Abnormality of the immune system" + }, + { + "hpo": "HP:0001265", + "id": "OMIM:616040", + "name": "Hyporeflexia" + }, + { + "hpo": "HP:0001252", + "id": "OMIM:616324", + "name": "Muscular hypotonia" + }, + { + "hpo": "HP:0003388", + "id": "OMIM:608931", + "name": "Easy fatigability" + }, + { + "hpo": "HP:0000467", + "id": "OMIM:616322", + "name": "Neck muscle weakness" + }, + { + "hpo": "HP:0003402", + "id": "OMIM:605809", + "name": "Decreased miniature endplate potentials" + }, + { + "hpo": "HP:0001284", + "id": "OMIM:616330", + "name": "Areflexia" + }, + { + "hpo": "HP:0003394", + "id": "OMIM:254300", + "name": "Muscle cramps" + }, + { + "hpo": "HP:0010628", + "id": "OMIM:254300", + "name": "Facial palsy" + } + ], + "hgvs": [ + "ENST00000379370(ENSG00000188157):c.5651+5C>T", + "ENST00000419249(ENSG00000188157):c.558+5C>T" + ], + "populationFrequencies": [ + { + "altAlleleFreq": 0.9018405, + "population": "SAS", + "refAlleleFreq": 0.09815949, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.45132336, + "population": "AFR", + "refAlleleFreq": 0.5486766, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.40166414, + "population": "AFR", + "refAlleleFreq": 0.59833586, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 1, + "population": "JPT", + "refAlleleFreq": 0, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.36574075, + "population": "YRI", + "refAlleleFreq": 0.6342592, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.906793, + "population": "ALL", + "refAlleleFreq": 0.093207, + "study": "DISCOVEHR" + }, + { + "altAlleleFreq": 0.9292929, + "population": "CEU", + "refAlleleFreq": 0.07070708, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.90997905, + "population": "EA", + "refAlleleFreq": 0.090020955, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.8756909, + "population": "ALL", + "refAlleleFreq": 0.12430912, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.99570715, + "population": "EAS", + "refAlleleFreq": 0.0042928457, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.9930556, + "population": "EAS", + "refAlleleFreq": 0.006944418, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9101124, + "population": "OTH", + "refAlleleFreq": 0.08988762, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.9100767, + "population": "ALL", + "refAlleleFreq": 0.08992332, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.88273424, + "population": "FEMALE", + "refAlleleFreq": 0.11726576, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.905529, + "population": "NFE", + "refAlleleFreq": 0.09447098, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.45797366, + "population": "AA", + "refAlleleFreq": 0.54202634, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.9135423, + "population": "TWINSUK_NODUP", + "refAlleleFreq": 0.08645773, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.99691355, + "population": "EAS", + "refAlleleFreq": 0.0030864477, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.9076284, + "population": "ALSPAC", + "refAlleleFreq": 0.09237158, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.5081967, + "population": "ASW", + "refAlleleFreq": 0.4918033, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.42941177, + "population": "MSL", + "refAlleleFreq": 0.57058823, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9322327, + "population": "AMR", + "refAlleleFreq": 0.06776732, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.93434346, + "population": "FIN", + "refAlleleFreq": 0.06565654, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9967585, + "population": "EAS", + "refAlleleFreq": 0.0032414794, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.83653843, + "population": "PUR", + "refAlleleFreq": 0.16346157, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.92124104, + "population": "AMR", + "refAlleleFreq": 0.078758955, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.94388777, + "population": "ALL", + "refAlleleFreq": 0.05611223, + "study": "GONL" + }, + { + "altAlleleFreq": 0.45132744, + "population": "GWD", + "refAlleleFreq": 0.54867256, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9230769, + "population": "GBR", + "refAlleleFreq": 0.07692307, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9205608, + "population": "IBS", + "refAlleleFreq": 0.07943922, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.93660015, + "population": "AMR", + "refAlleleFreq": 0.06339985, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.8895349, + "population": "BEB", + "refAlleleFreq": 0.11046511, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.40104166, + "population": "ACB", + "refAlleleFreq": 0.5989584, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.3939394, + "population": "ESN", + "refAlleleFreq": 0.6060606, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.90784025, + "population": "NFE", + "refAlleleFreq": 0.09215975, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.86702126, + "population": "CLM", + "refAlleleFreq": 0.13297874, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.905102, + "population": "OTH", + "refAlleleFreq": 0.094897985, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.7970198, + "population": "ALL", + "refAlleleFreq": 0.20298022, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.88235295, + "population": "ITU", + "refAlleleFreq": 0.11764705, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.89622986, + "population": "OTH", + "refAlleleFreq": 0.10377014, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.9236891, + "population": "NFE", + "refAlleleFreq": 0.07631087, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.8880143, + "population": "ALL", + "refAlleleFreq": 0.11198568, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.9904762, + "population": "CHS", + "refAlleleFreq": 0.009523809, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8802083, + "population": "PJL", + "refAlleleFreq": 0.11979169, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8951311, + "population": "ALL", + "refAlleleFreq": 0.10486889, + "study": "MGP" + }, + { + "altAlleleFreq": 0.8844428, + "population": "SAS", + "refAlleleFreq": 0.115557194, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.9411765, + "population": "PEL", + "refAlleleFreq": 0.058823526, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 1, + "population": "CHB", + "refAlleleFreq": 0, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.45202267, + "population": "AFR", + "refAlleleFreq": 0.5479773, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.788738, + "population": "ALL", + "refAlleleFreq": 0.21126199, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9296875, + "population": "MXL", + "refAlleleFreq": 0.0703125, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9504585, + "population": "FIN", + "refAlleleFreq": 0.049541473, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.88760805, + "population": "AMR", + "refAlleleFreq": 0.11239195, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9368932, + "population": "GIH", + "refAlleleFreq": 0.063106775, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.86915886, + "population": "TSI", + "refAlleleFreq": 0.13084114, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.7569231, + "population": "ALL", + "refAlleleFreq": 0.24307692, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.9126214, + "population": "TWINSUK", + "refAlleleFreq": 0.08737862, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.95412844, + "population": "FIN", + "refAlleleFreq": 0.045871556, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.9166667, + "population": "STU", + "refAlleleFreq": 0.08333331, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.97849464, + "population": "CDX", + "refAlleleFreq": 0.021505356, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8919194, + "population": "ASJ", + "refAlleleFreq": 0.108080626, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.89235705, + "population": "MALE", + "refAlleleFreq": 0.10764295, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.805302, + "population": "FEMALE", + "refAlleleFreq": 0.19469798, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.9949495, + "population": "KHV", + "refAlleleFreq": 0.0050504804, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.7903188, + "population": "MALE", + "refAlleleFreq": 0.20968121, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.8907285, + "population": "ASJ", + "refAlleleFreq": 0.10927153, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.3030303, + "population": "LWK", + "refAlleleFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.43764782, + "population": "AFR", + "refAlleleFreq": 0.5623522, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.94429183, + "population": "FIN", + "refAlleleFreq": 0.05570817, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.91451293, + "population": "EUR", + "refAlleleFreq": 0.08548707, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [], + "start": 987200, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "ClinicalSignificance_in_source_file", + "value": "benign" + } + ], + "bibliography": [], + "ethnicity": "Z", + "heritableTraits": [ + { + "inheritanceMode": "biallelic", + "trait": "not specified" + } + ], + "id": "RCV000116279", + "source": { + "name": "clinvar" + }, + "submissions": [], + "url": "https://www.ncbi.nlm.nih.gov/clinvar/RCV000116279", + "variantClassification": { + "clinicalSignificance": "benign" + } + }, + { + "additionalProperties": [ + { + "name": "ClinicalSignificance_in_source_file", + "value": "benign" + } + ], + "bibliography": [], + "ethnicity": "Z", + "heritableTraits": [ + { + "inheritanceMode": "unknown", + "trait": "not specified" + } + ], + "id": "128317", + "source": { + "name": "clinvar" + }, + "submissions": [], + "variantClassification": { + "clinicalSignificance": "benign" + } + } + ], + "variantTraitAssociation": { + "clinvar": [ + { + "accession": "RCV000116279", + "clinicalSignificance": "benign", + "geneNames": [], + "reviewStatus": "", + "traits": [ + "{\"trait\": \"not specified\", \"inheritanceMode\": \"biallelic\"}" + ] + }, + { + "accession": "128317", + "clinicalSignificance": "benign", + "geneNames": [], + "reviewStatus": "", + "traits": [ + "{\"trait\": \"not specified\", \"inheritanceMode\": \"unknown\"}" + ] + } + ] + }, + "xrefs": [ + { + "id": "rs9803031", + "source": "dbSNP" + }, + { + "id": "ENST00000419249", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000492947", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000419249(ENSG00000188157):c.558+5C>T", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000466223", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000461111", + "source": "ensemblTranscript" + }, + { + "id": "ENSG00000242590", + "source": "ensemblGene" + }, + { + "id": "ENSG00000188157", + "source": "ensemblGene" + }, + { + "id": "ENST00000379370", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000418300", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000379370(ENSG00000188157):c.5651+5C>T", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000478677", + "source": "ensemblTranscript" + } + ] + }, + "chromosome": "1", + "end": 987200, + "id": "1:987200:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 987200, + "strand": "+", + "studies": [], + "type": "SNV" + }, + { + "alternate": "C", + "annotation": { + "alternate": "C", + "chromosome": "1", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000379037", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000353662", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000354980", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000470659", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000438966", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000492936", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000354700", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000467278", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000479108", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000476572", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000493992", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000478065", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000131584", + "ensemblTranscriptId": "ENST00000472541", + "geneName": "ACAP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ] + }, + { + "ensemblGeneId": "", + "ensemblTranscriptId": "", + "geneName": "", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "description": "", + "score": -0.40400001406669617, + "source": "phylop" + }, + { + "description": "", + "score": 0.12399999797344208, + "source": "phastCons" + }, + { + "description": "", + "score": 0.9129999876022339, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "1", + "end": 2300000, + "name": "p36.33", + "stain": "gneg", + "start": 1 + } + ], + "displayConsequenceType": "splice_region_variant", + "end": 1233941, + "functionalScore": [ + { + "description": "", + "score": -0.22999954223632812, + "source": "cadd_raw" + }, + { + "description": "", + "score": 0.949999988079071, + "source": "cadd_scaled" + } + ], + "hgvs": [ + "ENST00000354700(ENSG00000131584):c.863+6A>G", + "ENST00000353662(ENSG00000131584):c.737+6A>G", + "ENST00000492936(ENSG00000131584):n.2602+6A>G", + "ENST00000467278(ENSG00000131584):n.389+6A>G", + "ENST00000476572(ENSG00000131584):n.386+6A>G" + ], + "populationFrequencies": [ + { + "altAlleleFreq": 0.38036808, + "population": "SAS", + "refAlleleFreq": 0.6196319, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.7274893, + "population": "AFR", + "refAlleleFreq": 0.2725107, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.816944, + "population": "AFR", + "refAlleleFreq": 0.183056, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.71153843, + "population": "JPT", + "refAlleleFreq": 0.28846157, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8657407, + "population": "YRI", + "refAlleleFreq": 0.13425928, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.080514, + "population": "ALL", + "refAlleleFreq": 0.919486, + "study": "DISCOVEHR" + }, + { + "altAlleleFreq": 0.065656565, + "population": "CEU", + "refAlleleFreq": 0.93434346, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.07403958, + "population": "EA", + "refAlleleFreq": 0.9259604, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.25270948, + "population": "ALL", + "refAlleleFreq": 0.7472905, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.7700375, + "population": "EAS", + "refAlleleFreq": 0.22996253, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.765873, + "population": "EAS", + "refAlleleFreq": 0.23412699, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.21347032, + "population": "OTH", + "refAlleleFreq": 0.78652966, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.073525526, + "population": "ALL", + "refAlleleFreq": 0.92647445, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.26340505, + "population": "FEMALE", + "refAlleleFreq": 0.7365949, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.08124671, + "population": "NFE", + "refAlleleFreq": 0.91875327, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.71236926, + "population": "AA", + "refAlleleFreq": 0.28763074, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.07078903, + "population": "TWINSUK_NODUP", + "refAlleleFreq": 0.92921096, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.7655039, + "population": "EAS", + "refAlleleFreq": 0.23449612, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.075505964, + "population": "ALSPAC", + "refAlleleFreq": 0.924494, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.76229507, + "population": "ASW", + "refAlleleFreq": 0.23770493, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.7705882, + "population": "MSL", + "refAlleleFreq": 0.22941178, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.3465511, + "population": "AMR", + "refAlleleFreq": 0.65344894, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.121212125, + "population": "FIN", + "refAlleleFreq": 0.8787879, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.75719637, + "population": "EAS", + "refAlleleFreq": 0.24280363, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.22596154, + "population": "PUR", + "refAlleleFreq": 0.77403843, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.35872236, + "population": "AMR", + "refAlleleFreq": 0.6412777, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.06513026, + "population": "ALL", + "refAlleleFreq": 0.93486977, + "study": "GONL" + }, + { + "altAlleleFreq": 0.8362832, + "population": "GWD", + "refAlleleFreq": 0.1637168, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.104395606, + "population": "GBR", + "refAlleleFreq": 0.8956044, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.07009346, + "population": "IBS", + "refAlleleFreq": 0.92990655, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.35465014, + "population": "AMR", + "refAlleleFreq": 0.64534986, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.4883721, + "population": "BEB", + "refAlleleFreq": 0.5116279, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.7552083, + "population": "ACB", + "refAlleleFreq": 0.24479169, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8636364, + "population": "ESN", + "refAlleleFreq": 0.13636363, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.07620284, + "population": "NFE", + "refAlleleFreq": 0.92379713, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.2287234, + "population": "CLM", + "refAlleleFreq": 0.7712766, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.16666667, + "population": "OTH", + "refAlleleFreq": 0.8333333, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.32355744, + "population": "ALL", + "refAlleleFreq": 0.67644256, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.30882353, + "population": "ITU", + "refAlleleFreq": 0.6911765, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.18516463, + "population": "OTH", + "refAlleleFreq": 0.81483537, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.08499929, + "population": "NFE", + "refAlleleFreq": 0.9150007, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.24660826, + "population": "ALL", + "refAlleleFreq": 0.75339174, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.7952381, + "population": "CHS", + "refAlleleFreq": 0.20476192, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.28645834, + "population": "PJL", + "refAlleleFreq": 0.7135416, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.09550562, + "population": "ALL", + "refAlleleFreq": 0.9044944, + "study": "MGP" + }, + { + "altAlleleFreq": 0.34287626, + "population": "SAS", + "refAlleleFreq": 0.65712374, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.2882353, + "population": "PEL", + "refAlleleFreq": 0.7117647, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.69902915, + "population": "CHB", + "refAlleleFreq": 0.30097085, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.73203385, + "population": "AFR", + "refAlleleFreq": 0.26796615, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.4968051, + "population": "ALL", + "refAlleleFreq": 0.5031949, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.328125, + "population": "MXL", + "refAlleleFreq": 0.671875, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.15104775, + "population": "FIN", + "refAlleleFreq": 0.84895223, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.26080692, + "population": "AMR", + "refAlleleFreq": 0.7391931, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.41262135, + "population": "GIH", + "refAlleleFreq": 0.5873786, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.056074765, + "population": "TSI", + "refAlleleFreq": 0.94392526, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.29019094, + "population": "ALL", + "refAlleleFreq": 0.70980906, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.0714671, + "population": "TWINSUK", + "refAlleleFreq": 0.9285329, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.1628468, + "population": "FIN", + "refAlleleFreq": 0.8371532, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.41666666, + "population": "STU", + "refAlleleFreq": 0.5833334, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8548387, + "population": "CDX", + "refAlleleFreq": 0.14516127, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.08420836, + "population": "ASJ", + "refAlleleFreq": 0.91579163, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.23290326, + "population": "MALE", + "refAlleleFreq": 0.76709676, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.30839556, + "population": "FEMALE", + "refAlleleFreq": 0.69160444, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.7777778, + "population": "KHV", + "refAlleleFreq": 0.22222221, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.33579245, + "population": "MALE", + "refAlleleFreq": 0.6642076, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.1122449, + "population": "ASJ", + "refAlleleFreq": 0.8877551, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.82828283, + "population": "LWK", + "refAlleleFreq": 0.17171717, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.74387497, + "population": "AFR", + "refAlleleFreq": 0.25612503, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.14298809, + "population": "FIN", + "refAlleleFreq": 0.8570119, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.08250497, + "population": "EUR", + "refAlleleFreq": 0.917495, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [], + "start": 1233941, + "traitAssociation": [], + "variantTraitAssociation": {}, + "xrefs": [ + { + "id": "ENST00000379037", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000353662", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000354980", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000470659", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000438966", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000492936", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000492936(ENSG00000131584):n.2602+6A>G", + "source": "ensemblTranscript" + }, + { + "id": "ENSG00000131584", + "source": "ensemblGene" + }, + { + "id": "ENST00000354700(ENSG00000131584):c.863+6A>G", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000354700", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000467278", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000479108", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000353662(ENSG00000131584):c.737+6A>G", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000476572", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000476572(ENSG00000131584):n.386+6A>G", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000493992", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000478065", + "source": "ensemblTranscript" + }, + { + "id": "rs1739855", + "source": "dbSNP" + }, + { + "id": "ENST00000467278(ENSG00000131584):n.389+6A>G", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000472541", + "source": "ensemblTranscript" + } + ] + }, + "chromosome": "1", + "end": 1233941, + "id": "1:1233941:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 1233941, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "alternate": "C", + "chromosome": "1", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "cdnaPosition": 350, + "cdsPosition": 305, + "codon": "aTg/aCg", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000520777", + "geneName": "MIB2", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 102, + "reference": "MET", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.12, + "source": "sift" + }, + { + "description": "benign", + "score": 0.001, + "source": "polyphen" + } + ], + "uniprotAccession": "Q96AX9", + "uniprotName": "", + "uniprotVariantId": "" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000355826", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000467597", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000378708", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "cdnaPosition": 291, + "cdsPosition": 0, + "codon": "", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000512004", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000479659", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000502470", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000508455", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000477990", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000473511", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 328, + "cdsPosition": 305, + "codon": "aTg/aCg", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000518681", + "geneName": "MIB2", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 102, + "reference": "MET", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.09, + "source": "sift" + }, + { + "description": "benign", + "score": 0.001, + "source": "polyphen" + } + ], + "uniprotAccession": "Q96AX9", + "uniprotName": "", + "uniprotVariantId": "" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 350, + "cdsPosition": 134, + "codon": "aTg/aCg", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000357210", + "geneName": "MIB2", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 45, + "reference": "MET", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.17, + "source": "sift" + }, + { + "description": "benign", + "score": 0, + "source": "polyphen" + } + ], + "uniprotAccession": "", + "uniprotName": "", + "uniprotVariantId": "" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "cdnaPosition": 353, + "cdsPosition": 2, + "codon": "aTg/aCg", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000487053", + "geneName": "MIB2", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 1, + "reference": "MET", + "substitutionScores": [], + "uniprotAccession": "", + "uniprotName": "", + "uniprotVariantId": "" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0002012", + "name": "start_lost" + }, + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + } + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000514363", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000378712", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "cdnaPosition": 328, + "cdsPosition": 0, + "codon": "", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000507229", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000464570", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 350, + "cdsPosition": 134, + "codon": "aTg/aCg", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000378710", + "geneName": "MIB2", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 45, + "reference": "MET", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.18, + "source": "sift" + }, + { + "description": "benign", + "score": 0.004, + "source": "polyphen" + } + ], + "uniprotAccession": "", + "uniprotName": "", + "uniprotVariantId": "" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 322, + "cdsPosition": 305, + "codon": "aTg/aCg", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000505820", + "geneName": "MIB2", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 102, + "reference": "MET", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.12, + "source": "sift" + }, + { + "description": "benign", + "score": 0.007, + "source": "polyphen" + } + ], + "uniprotAccession": "Q96AX9", + "uniprotName": "", + "uniprotVariantId": "" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 329, + "cdsPosition": 2, + "codon": "aTg/aCg", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000504599", + "geneName": "MIB2", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 1, + "reference": "MET", + "substitutionScores": [ + { + "description": "deleterious", + "score": 0, + "source": "sift" + }, + { + "description": "benign", + "score": 0, + "source": "polyphen" + } + ], + "uniprotAccession": "", + "uniprotName": "", + "uniprotVariantId": "" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0002012", + "name": "start_lost" + } + ], + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "cdnaPosition": 269, + "cdsPosition": 134, + "codon": "aTg/aCg", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000489635", + "geneName": "MIB2", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 45, + "reference": "MET", + "substitutionScores": [], + "uniprotAccession": "", + "uniprotName": "", + "uniprotVariantId": "" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + }, + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000503789", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000505370", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000508148", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000506488", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000510793", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000514234", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000486072", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 350, + "cdsPosition": 134, + "codon": "aTg/aCg", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000360522", + "geneName": "MIB2", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 45, + "reference": "MET", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.17, + "source": "sift" + }, + { + "description": "benign", + "score": 0.004, + "source": "polyphen" + } + ], + "uniprotAccession": "", + "uniprotName": "", + "uniprotVariantId": "" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "retained_intron", + "cdnaPosition": 251, + "cdsPosition": 0, + "codon": "", + "ensemblGeneId": "ENSG00000197530", + "ensemblTranscriptId": "ENST00000511502", + "geneName": "MIB2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ] + } + ], + "conservation": [ + { + "description": "", + "score": 0.1469999998807907, + "source": "phylop" + }, + { + "description": "", + "score": 0.37400001287460327, + "source": "phastCons" + }, + { + "description": "", + "score": -2.4700000286102295, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "1", + "end": 2300000, + "name": "p36.33", + "stain": "gneg", + "start": 1 + } + ], + "displayConsequenceType": "start_lost", + "end": 1558792, + "functionalScore": [ + { + "description": "", + "score": -1.0699996948242188, + "source": "cadd_raw" + }, + { + "description": "", + "score": 0.009999999776482582, + "source": "cadd_scaled" + } + ], + "hgvs": [ + "ENST00000520777(ENSG00000197530):c.305T>C", + "ENST00000357210(ENSG00000197530):c.134T>C", + "ENST00000360522(ENSG00000197530):c.134T>C", + "ENST00000378710(ENSG00000197530):c.134T>C", + "ENST00000355826(ENSG00000197530):c.282-19T>C", + "ENST00000518681(ENSG00000197530):c.305T>C", + "ENST00000505820(ENSG00000197530):c.305T>C", + "ENST00000479659(ENSG00000197530):n.288-19T>C", + "ENST00000489635(ENSG00000197530):c.134T>C", + "ENST00000511502(ENSG00000197530):n.251T>C", + "ENST00000514363(ENSG00000197530):c.111-19T>C", + "ENST00000487053(ENSG00000197530):c.2T>C", + "ENST00000502470(ENSG00000197530):c.-22-19T>C", + "ENST00000378712(ENSG00000197530):c.-22-19T>C", + "ENST00000510793(ENSG00000197530):c.-22-19T>C", + "ENST00000504599(ENSG00000197530):c.2T>C", + "ENST00000507229(ENSG00000197530):n.328T>C", + "ENST00000503789(ENSG00000197530):c.-22-19T>C", + "ENST00000378708(ENSG00000197530):c.-22-19T>C", + "ENST00000506488(ENSG00000197530):c.-22-19T>C", + "ENST00000512004(ENSG00000197530):n.291T>C" + ], + "populationFrequencies": [ + { + "altAlleleFreq": 0.8599182, + "population": "SAS", + "refAlleleFreq": 0.14008182, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.750748, + "population": "AFR", + "refAlleleFreq": 0.24925202, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.70574886, + "population": "AFR", + "refAlleleFreq": 0.29425114, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.5480769, + "population": "JPT", + "refAlleleFreq": 0.45192307, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.6527778, + "population": "YRI", + "refAlleleFreq": 0.3472222, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.935193, + "population": "ALL", + "refAlleleFreq": 0.064807, + "study": "DISCOVEHR" + }, + { + "altAlleleFreq": 0.9444444, + "population": "CEU", + "refAlleleFreq": 0.055555582, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9400635, + "population": "EA", + "refAlleleFreq": 0.059936523, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.8796547, + "population": "ALL", + "refAlleleFreq": 0.120345294, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.57080764, + "population": "EAS", + "refAlleleFreq": 0.42919236, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.5515873, + "population": "EAS", + "refAlleleFreq": 0.44841272, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.91151685, + "population": "OTH", + "refAlleleFreq": 0.088483155, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.93136734, + "population": "ALL", + "refAlleleFreq": 0.06863266, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.8579323, + "population": "FEMALE", + "refAlleleFreq": 0.14206767, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.94106144, + "population": "NFE", + "refAlleleFreq": 0.058938563, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.76677316, + "population": "AA", + "refAlleleFreq": 0.23322684, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.9266928, + "population": "TWINSUK_NODUP", + "refAlleleFreq": 0.073307216, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.5645963, + "population": "EAS", + "refAlleleFreq": 0.4354037, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.9346134, + "population": "ALSPAC", + "refAlleleFreq": 0.06538659, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.7295082, + "population": "ASW", + "refAlleleFreq": 0.27049178, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.69411767, + "population": "MSL", + "refAlleleFreq": 0.30588233, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.80965275, + "population": "AMR", + "refAlleleFreq": 0.19034725, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.8787879, + "population": "FIN", + "refAlleleFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.6240929, + "population": "EAS", + "refAlleleFreq": 0.37590712, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.8942308, + "population": "PUR", + "refAlleleFreq": 0.10576922, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.80861247, + "population": "AMR", + "refAlleleFreq": 0.19138753, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.93286574, + "population": "ALL", + "refAlleleFreq": 0.06713426, + "study": "GONL" + }, + { + "altAlleleFreq": 0.70353985, + "population": "GWD", + "refAlleleFreq": 0.29646015, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9230769, + "population": "GBR", + "refAlleleFreq": 0.07692307, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9579439, + "population": "IBS", + "refAlleleFreq": 0.042056084, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8125373, + "population": "AMR", + "refAlleleFreq": 0.18746269, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.84302324, + "population": "BEB", + "refAlleleFreq": 0.15697676, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.703125, + "population": "ACB", + "refAlleleFreq": 0.296875, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.7070707, + "population": "ESN", + "refAlleleFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9381251, + "population": "NFE", + "refAlleleFreq": 0.061874926, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.89361703, + "population": "CLM", + "refAlleleFreq": 0.106382966, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8965164, + "population": "OTH", + "refAlleleFreq": 0.10348362, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.8552759, + "population": "ALL", + "refAlleleFreq": 0.14472407, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.8480392, + "population": "ITU", + "refAlleleFreq": 0.15196079, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.90386194, + "population": "OTH", + "refAlleleFreq": 0.09613806, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.93561774, + "population": "NFE", + "refAlleleFreq": 0.064382255, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.86788756, + "population": "ALL", + "refAlleleFreq": 0.13211244, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.51428574, + "population": "CHS", + "refAlleleFreq": 0.48571426, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9166667, + "population": "PJL", + "refAlleleFreq": 0.08333331, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8604965, + "population": "SAS", + "refAlleleFreq": 0.13950348, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.87058824, + "population": "PEL", + "refAlleleFreq": 0.12941176, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.5776699, + "population": "CHB", + "refAlleleFreq": 0.42233008, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.7672843, + "population": "AFR", + "refAlleleFreq": 0.23271573, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.7735623, + "population": "ALL", + "refAlleleFreq": 0.22643769, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.78125, + "population": "MXL", + "refAlleleFreq": 0.21875, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8976418, + "population": "FIN", + "refAlleleFreq": 0.10235822, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.86743516, + "population": "AMR", + "refAlleleFreq": 0.13256484, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.86893207, + "population": "GIH", + "refAlleleFreq": 0.13106793, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.97196263, + "population": "TSI", + "refAlleleFreq": 0.02803737, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8855876, + "population": "ALL", + "refAlleleFreq": 0.11441243, + "study": "ESP6500" + }, + { + "altAlleleFreq": 0.92799354, + "population": "TWINSUK", + "refAlleleFreq": 0.072006464, + "study": "UK10K" + }, + { + "altAlleleFreq": 0.8940264, + "population": "FIN", + "refAlleleFreq": 0.1059736, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.8235294, + "population": "STU", + "refAlleleFreq": 0.17647058, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.5860215, + "population": "CDX", + "refAlleleFreq": 0.41397852, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.9772678, + "population": "ASJ", + "refAlleleFreq": 0.022732198, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.87581134, + "population": "MALE", + "refAlleleFreq": 0.12418866, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.8623262, + "population": "FEMALE", + "refAlleleFreq": 0.1376738, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.53535354, + "population": "KHV", + "refAlleleFreq": 0.46464646, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.8495596, + "population": "MALE", + "refAlleleFreq": 0.1504404, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.98675495, + "population": "ASJ", + "refAlleleFreq": 0.013245046, + "study": "GNOMAD_GENOMES" + }, + { + "altAlleleFreq": 0.7626263, + "population": "LWK", + "refAlleleFreq": 0.23737371, + "study": "1kG_phase3" + }, + { + "altAlleleFreq": 0.74422014, + "population": "AFR", + "refAlleleFreq": 0.25577986, + "study": "GNOMAD_EXOMES" + }, + { + "altAlleleFreq": 0.9003822, + "population": "FIN", + "refAlleleFreq": 0.09961778, + "study": "EXAC" + }, + { + "altAlleleFreq": 0.9363817, + "population": "EUR", + "refAlleleFreq": 0.0636183, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "1", + "copyNumber": 2, + "end": 1558840, + "id": "null", + "percentageMatch": 0.95, + "source": "trf", + "start": 1558755 + } + ], + "start": 1558792, + "traitAssociation": [ + { + "bibliography": [], + "ethnicity": "Z", + "heritableTraits": [], + "id": "COSM7229018", + "somaticInformation": { + "histologySubtype": "null", + "primaryHistology": "null" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "bibliography": [], + "ethnicity": "Z", + "heritableTraits": [], + "id": "COSM7229017", + "somaticInformation": { + "histologySubtype": "null", + "primaryHistology": "null" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "cosmic": [ + { + "histologySubtype": "null", + "mutationId": "COSM7229018", + "primaryHistology": "null" + }, + { + "histologySubtype": "null", + "mutationId": "COSM7229017", + "primaryHistology": "null" + } + ] + }, + "xrefs": [ + { + "id": "ENST00000378708(ENSG00000197530):c.-22-19T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENSG00000197530", + "source": "ensemblGene" + }, + { + "id": "ENST00000360522(ENSG00000197530):c.134T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000467597", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000512004", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000479659", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000477990", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000510793(ENSG00000197530):c.-22-19T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000473511", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000518681", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000357210", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000511502(ENSG00000197530):n.251T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000487053", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000514363", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000507229", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000378710(ENSG00000197530):c.134T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000514363(ENSG00000197530):c.111-19T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000504599", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000378712(ENSG00000197530):c.-22-19T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000489635", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000503789", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000505370", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000520777(ENSG00000197530):c.305T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000510793", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000514234", + "source": "ensemblTranscript" + }, + { + "id": "rs12755088", + "source": "dbSNP" + }, + { + "id": "ENST00000489635(ENSG00000197530):c.134T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000505820(ENSG00000197530):c.305T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000504599(ENSG00000197530):c.2T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000487053(ENSG00000197530):c.2T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000503789(ENSG00000197530):c.-22-19T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000506488(ENSG00000197530):c.-22-19T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000479659(ENSG00000197530):n.288-19T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000520777", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000355826", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000507229(ENSG00000197530):n.328T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000378708", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000518681(ENSG00000197530):c.305T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000502470", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000357210(ENSG00000197530):c.134T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000508455", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000512004(ENSG00000197530):n.291T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000355826(ENSG00000197530):c.282-19T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000378712", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000502470(ENSG00000197530):c.-22-19T>C", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000464570", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000378710", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000505820", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000508148", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000506488", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000486072", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000360522", + "source": "ensemblTranscript" + }, + { + "id": "ENST00000511502", + "source": "ensemblTranscript" + } + ] + }, + "chromosome": "1", + "end": 1558792, + "id": "1:1558792:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 1558792, + "strand": "+", + "studies": [], + "type": "SNV" + } + ], + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": { + "application/json": { + "expanded": false, + "root": "root" + } + }, + "output_type": "execute_result" } ], "source": [ @@ -506,7 +7202,7 @@ "print(RESULT_SEPARATOR)\n", "\n", "## Uncomment next line to display an interactive JSON viewer\n", - "#JSON(variants.get_results())" + "# JSON(variants.get_results())" ] }, { @@ -588,21 +7284,21 @@ ], "source": [ "## Filter by population frequency maf\n", - "populationFrequencyAlt='1kG_phase3:ALL<0.01'\n", - "variants = oc.variants.query(study=study, populationFrequencyMaf=populationFrequencyAlt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "population_frequency_alt='1kG_phase3:ALL<0.01'\n", + "variants = oc.variants.query(study=study, populationFrequencyAlt=population_frequency_alt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq MAF:') # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", "## Filter by two population frequency maf\n", "## Remember to use commas for OR and semi-colon for AND\n", - "populationFrequencyAlt='1kG_phase3:ALL<0.01;GNOMAD_GENOMES:ALL<0.01'\n", - "variants = oc.variants.query(study=study, populationFrequencyMaf=populationFrequencyAlt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "population_frequency_alt='1kG_phase3:ALL<0.01;GNOMAD_GENOMES:ALL<0.01'\n", + "variants = oc.variants.query(study=study, populationFrequencyAlt=population_frequency_alt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq MAF:') # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", "## Filter by population frequency alternate\n", - "populationFrequencyAlt='1kG_phase3:ALL>0;1kG_phase3:ALL<0.01'\n", - "variants = oc.variants.query(study=study, populationFrequencyAlt=populationFrequencyAlt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", + "population_frequency_alt='1kG_phase3:ALL>0;1kG_phase3:ALL<0.01'\n", + "variants = oc.variants.query(study=study, populationFrequencyAlt=population_frequency_alt, exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population freq ALT:') # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", @@ -647,7 +7343,10 @@ "cohort_stats = study + ':ALL<0.0001'\n", "variants = oc.variants.query(study=study, cohortStatsAlt=cohort_stats, exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Cohort Stats:') # metadata=False\n", - "print(RESULT_SEPARATOR)" + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -717,7 +7416,10 @@ "gene_trait_id = 'OMIM:137215,OMIM:613659' #GASTRIC CANCER terms\n", "variants = oc.variants.query(study=study, geneTraitId=gene_trait_id, exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by population gene traits') # metadata=False\n", - "print(RESULT_SEPARATOR)" + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -761,7 +7463,10 @@ "## Filter by Clinical Significance\n", "variants = oc.variants.query(study=study, panel='Amyloidosis-PanelAppId-502', exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Disease Panel:') # metadata=False\n", - "print(RESULT_SEPARATOR)" + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -855,7 +7560,10 @@ "variants = oc.variants.query(study=study, ct='lof,missense_variant', clinicalSignificance='likely_pathogenic,pathogenic', cohortStatsAlt=cohort_stats, populationFrequencyMaf=populationFrequencyAlt\n", ", exclude='studies', limit=5) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Consequence Type, Clinical Significance and Cohort Satats:') # metadata=False\n", - "print(RESULT_SEPARATOR)" + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -877,7 +7585,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -929,7 +7637,10 @@ "## Fetch all variants for one sample\n", "variants = oc.variants.query(study=study, sample=sample_id1, limit=5, count=True) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(sample_id1)) # metadata=False\n", - "print(RESULT_SEPARATOR)" + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -996,7 +7707,10 @@ "genotype = sample_id1 + ':1/1'\n", "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", - "print(RESULT_SEPARATOR)" + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -1052,16 +7766,19 @@ ], "source": [ "## Filter all HOM variants for two samples\n", - "genotype = sample_id1 + ':1/1,' + sample_id2 + ':0/1,1/1'\n", + "genotype = sample_id1 + ':1/1' + ',' + sample_id2 + ':0/1,1/1'\n", "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by samples {}:'.format(genotype)) # metadata=False\n", "print(RESULT_SEPARATOR)\n", "\n", "## Filter common HOM variants for two samples\n", - "genotype = sample_id1 + ':1/1;' + sample_id2 + ':0/1,1/1'\n", + "genotype = sample_id1 + ':1/1' + ';' + sample_id2 + ':0/1,1/1'\n", "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by samples {}:'.format(genotype)) # metadata=False\n", - "print(RESULT_SEPARATOR)" + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -1097,7 +7814,10 @@ "genotype = sample_id1 + ':deNovo'\n", "variants = oc.variants.query(study=study, sample=genotype, limit=5, count=True) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by deNovo {}:'.format(genotype)) # metadata=False\n", - "print(RESULT_SEPARATOR)" + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -1163,7 +7883,10 @@ "## Filter PASS HOM variants\n", "variants = oc.variants.query(study=study, sample=genotype, filter='PASS', limit=5, count=True) # Other params: exclude='annotation'\n", "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='PASS 1/1 variants for sample {}:'.format(genotype)) # metadata=False\n", - "print(RESULT_SEPARATOR)" + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -1172,21 +7895,31 @@ "source": [ "## 5. Building Complex queries\n", "\n", - "You can combine any filter to build more complex queries." + "OpenGCA allows you to combine different filters to build more complex queries." ] }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Filter by sample ISDBM322016:0/1,1/1:\n", - "------------------------------------------\n", - "#Time: 337\n", + "Filter by genotype, genes and clinical significance\n", + "--------------------------------------------------------\n", + "#Time: 431\n", + "#Num matches: 0\n", + "#Num results: 0\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "\n", + "\n", + "Filter by genotype, genes, population frequencies and clinical significance:\n", + "---------------------------------------------------------------------------------\n", + "#Time: 996\n", "#Num matches: 0\n", "#Num results: 0\n", "#Num inserted: 0\n", @@ -1198,10 +7931,20 @@ } ], "source": [ - "genotype = sample_id1 + ':0/1,1/1'\n", + "## Filter by genotype, genes and clinical significance\n", + "genotype = sample_id1 + ':1/1'\n", "variants = oc.variants.query(study=study, sample=genotype, gene='BRCA2,TP53', clinicalSignificance='likely_pathogenic,pathogenic', limit=5, count=True) # Other params: exclude='annotation'\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n", - "print(RESULT_SEPARATOR)" + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by genotype, genes and clinical significance') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Filter by genotype, genes, population frequencies and clinical significance\n", + "population_frequency_alt='1kG_phase3:ALL<0.01;GNOMAD_GENOMES:ALL<0.01'\n", + "variants = oc.variants.query(study=study, sample=genotype, gene='BRCA2,TP53', populationFrequencyAlt=population_frequency_alt, clinicalSignificance='likely_pathogenic,pathogenic', limit=5, count=True) # Other params: exclude='annotation'\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by genotype, genes, population frequencies and clinical significance:') # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { @@ -1209,26 +7952,44 @@ "metadata": {}, "source": [ "# Aggregation Stats\n", - "-------" + "-------\n", + "\n", + "OpenCGA implements an advanced aggregation functionality that allows to get stats of the variants." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 1. Variant Aggregation Stats using Variant Annotation" + "## 1. Variant Aggregation Stats using Variant Annotation\n", + "\n", + "You can easily filter variants (_optional_) and select different fields to aggregate and count variants. You can get several aggregations in the same executin. This also allows to nest fields using the character `>>`.\n", + "\n", + "**Important Note**: to make the notebook more responsive we are filtering variants in the following examples." ] }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ + "## Aggregate by type all the BRCA2 variants\n", "variants = oc.variants.aggregation_stats(study=study, gene='BRCA2', fields=\"type\", limit=5) # Other params: exclude='annotation'\n", - "# JSON(variants.get_results())\n", + "# pprint(variants.get_responses())\n", + "# print(RESULT_SEPARATOR)\n", + "\n", + "## Aggregate by chromsome and type all the lof and missense variants\n", + "variants = oc.variants.aggregation_stats(study=study, ct='lof,missense_variant', fields=\"chromosome;type\", limit=5) # Other params: exclude='annotation'\n", + "# pprint(variants.get_responses())\n", + "# print(RESULT_SEPARATOR)\n", "\n", - "variants = oc.variants.aggregation_stats(study=study, fields=\"chromosome>>type\", limit=5) # Other params: exclude='annotation'\n", + "## Aggregate by type in each chromsome all the lof and missense variants\n", + "variants = oc.variants.aggregation_stats(study=study, ct='lof,missense_variant', fields=\"chromosome>>type\", limit=5) # Other params: exclude='annotation'\n", + "# pprint(variants.get_responses())\n", + "# print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", "# JSON(variants.get_results())" ] }, @@ -1236,15 +7997,30 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2. Variant Aggregation Stats by Sample" + "## 2. Variant Aggregation Stats by Sample\n", + "\n", + "OpenCGA index all sample data in a very efficient way, this allows OpenCGA to execute aggregations for a specific sample." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "## Aggregate by type all the BRCA2 variants\n", + "variants = oc.variants.aggregation_stats_sample(study=study, sample=sample_id1, fields='type', limit=5) # Other params: exclude='annotation'\n", + "# pprint(variants.get_responses())\n", + "# print(RESULT_SEPARATOR)\n", + "\n", + "## Aggregate by chromsome and type all the lof and missense variants\n", + "variants = oc.variants.aggregation_stats_sample(study=study, sample=sample_id1, ct='lof,missense_variant', fields=\"chromosome;type\", limit=5) # Other params: exclude='annotation'\n", + "# pprint(variants.get_responses())\n", + "# print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" + ] }, { "cell_type": "markdown", @@ -1258,22 +8034,56 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 1. Fetch all samples per Variant\n", + "## 1. Fetch all Samples for a given Variant\n", "\n", - "1. Apply different filters to obtain the desired variants\n", - "2. Get the samples containing those variants\n", - "3. Query **Catalog** to retrieve the phenotypes of the samples\n", + "A very common use case is to fetch all samples togteher with the clinical data for a given variant of interest.\n", "\n", - "**Situation:** I am interested in getting a list of all participants in the study, that have:\n", - "- SNVs in a list of genes (IL3, IL31, IL32, IL34, IL6, IL6R, IL10RA, IL10RB, IL7, IL7R) \n", - "- MAF of <0.01 in gnomad_NFE AND \n", - "- missense, start_lost, stop_gained, or stop_lost\n", - "- Split by hets and homs." + "In this section we are going to choose randomely one variant and then fecth samples and clinical data, these are the steps:\n", + "\n", + "1. Choose one random variant\n", + "2. Fetch the all the samples with a genotye 1/1\n", + "3. Query _Catalog_ to retrieve the clinical data of the samples" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filter by genotype, genes and clinical significance\n", + "--------------------------------------------------------\n", + "#Time: 407\n", + "#Num matches: 40\n", + "#Num results: 1\n", + "#Num inserted: 0\n", + "#Num updated: 0\n", + "#Num deleted: 0\n", + "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", + "22:18905964:C:T\tDGCR6,PRODH\tmissense_variant\n", + "\n", + "\n" + ] + } + ], + "source": [ + "## Step 1 - Select one random variant for this example\n", + "variants = oc.variants.query(study=study, clinicalSignificance='pathogenic', limit=1, count=True) # Other params: exclude='annotation'\n", + "\n", + "## Store selected variant ID\n", + "variant_id = variants.get_result(0)['id']\n", + "\n", + "## Print basic information\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by genotype, genes and clinical significance') # metadata=False\n", + "print(RESULT_SEPARATOR)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, "metadata": { "pycharm": { "is_executing": true @@ -1281,16 +8091,18 @@ }, "outputs": [], "source": [ - "# Define the parameters of the variants we want to query\n", - "genes = ['IL3,IL31,IL32,IL34,IL6,IL6R,IL10RA,IL10RB,IL7,IL7R']\n", - "type = ['SNV']\n", - "ct = ['missense_variant','start_lost','stop_gained','stop_lost'] #List of SO consequence types, e.g. missense_variant,stop_lost or SO:0001583,SO:0001578\n", - "populationFrequencyMaf='gnomAD:ALL<0.01'\n" + "## Step 2 - Fetch the first 10 samples with the genoype 0/1 or 1/1\n", + "genotype='0/1,1/1'\n", + "limit=10\n", + "variants = oc.variants.query_sample(study=study, variant=variant_id, genotype=genotype, limit=limit) # Other params: exclude='annotation'\n", + "\n", + "# Uncomment to dislay samples in JSON viewer\n", + "# JSON(variants.get_result(0)['studies'][0])" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 89, "metadata": { "pycharm": { "is_executing": true @@ -1301,79 +8113,71 @@ "name": "stdout", "output_type": "stream", "text": [ - "Complex Variant Filter:\n", - "----------------------------\n", - "#Time: 456\n", - "#Num matches: 12\n", - "#Num results: 12\n", - "#Num inserted: 0\n", - "#Num updated: 0\n", - "#Num deleted: 0\n", - "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "21:34640788:A:G\tIFNAR2,IL10RB,IL10RB-AS1,AP000295.9\tmissense_variant\n", - "5:35861068:T:C\tIL7R\tmissense_variant\n", - "5:35871190:G:A\tIL7R\tmissense_variant\n", - "5:35874575:C:T\tIL7R\tmissense_variant\n", - "16:3119304:A:G\tIL32,RNU1-125P\tmissense_variant\n", - "16:70690989:G:C\tFLJ00418,IL34,MTSS1L\tmissense_variant\n", - "1:154426970:A:C\tIL6R\tmissense_variant\n", - "11:117857338:G:C\tIL10RA\tmissense_variant\n", - "11:117860305:G:A\tIL10RA\tmissense_variant\n", - "11:117864047:A:G\tIL10RA\tmissense_variant\n", - "11:117864846:A:G\tIL10RA\tmissense_variant\n", - "11:117869670:A:G\tIL10RA\tmissense_variant\n" + "['ISDBM322015', 'ISDBM322018']\n", + "\n", + "\n" ] } ], "source": [ - "## Filter by various parameters\n", - "variants = oc.variants.query(study=study, gene=genes, type=type, ct=ct, \n", - " populationFrequencyMaf=populationFrequencyMaf) \n", + "## Step 3 - Fetch Clinical data\n", + "samples = variants.get_result(0)['studies'][0]['samples']\n", "\n", + "# Get all sampled IDs\n", + "sample_ids = []\n", + "for sample in samples:\n", + " sample_ids.append(sample['sampleId'])\n", + "print(sample_ids)\n", + "print(RESULT_SEPARATOR)\n", "\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Complex Variant Filter:') # metadata=False\n", - "df = variants.to_data_frame()\n", - "#pprint(variants.get_result(0))\n" + "# Featch data from Catalog\n", + "clinical_data = oc.samples.search(study=study, id=','.join(sample_ids), includeIndividual=True)\n", + "# JSON(clinical_data.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "source": [ + "## 2. Sample Variant Stats\n", + "\n", + "You can alse get rich variants stats for a given sample. In this section we will:\n", + "\n", + "1. Choose one random sample from _Catalog_\n", + "2. Calculate sample variant stats" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['21:34640788:A:G', '5:35861068:T:C', '5:35871190:G:A', '5:35874575:C:T', '16:3119304:A:G', '16:70690989:G:C', '1:154426970:A:C', '11:117857338:G:C', '11:117860305:G:A', '11:117864047:A:G', '11:117864846:A:G', '11:117869670:A:G']\n" + "ISDBM322016\n", + "\n", + "\n" ] } ], "source": [ - "## Obtain the variant ids from the last query\n", - "variant_ids = list(df['id'])\n", - "print(variant_ids)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "source": [ - "## 2. Sample Variant Stats\n", + "## Step 1 - Fetch a rondom sample\n", + "resp = oc.samples.search(study=study, limit=2)\n", + "sample_id = resp.get_result(0)['id']\n", + "print(sample_id)\n", + "print(RESULT_SEPARATOR)\n", "\n", - "1. Choose one random sample from catalog\n", - "2. sample stats query" + "## Step 2 - Calculate Variant Stats\n", + "variant_stats = oc.variants.query_sample_stats(study=study, sample=sample_id)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variant_stats.get_results())" ] }, { @@ -1381,9 +8185,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by sample {}:'.format(genotype)) # metadata=False\n" - ] + "source": [] } ], "metadata": { @@ -1402,9 +8204,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} From cea380f0b5241e45fe9ee93bdda4b16ea15df003 Mon Sep 17 00:00:00 2001 From: imedina Date: Thu, 15 Apr 2021 15:41:29 +0100 Subject: [PATCH 184/412] clients: more work on the notebooks --- .../user-training/pyopencga_first_steps.ipynb | 179 ++++++++++-------- .../pyopencga_variant_analysis.ipynb | 23 ++- 2 files changed, 113 insertions(+), 89 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb index 00b97670a6e..37dd936b933 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb @@ -6,75 +6,74 @@ "source": [ "# First Steps with *pyopencga*; the Python client of OpenCGA\n", "------\n", - "# 1. Overview\n", "\n", - "This notebook provides guidance for getting started with the *pyopencga* library, the Python client of OpenCGA.\n", + "This notebook provides guidance for getting started with the *pyopencga* library, which is the Python client of OpenCGA. _pyopencga_ is a **REST client** that fully implements OpenCGA REST API.\n", "\n", - "We assume that your workstation (Linux, Mac, Windows) is connected to the internet and has Python 3 and the *pip* package manager installed. We then show you how to:\n", + "These notebooks use a demo installation available at the Univeristy of Cambrdige, feel free to change OpenCGA host and credentials to use any other OpenCGA server.\n", + "\n", + "We assume that your workstation (Linux, Mac, Windows) is connected to the internet and you have Python 3 and the *pip* package manager installed. We then show you how to:\n", "\n", "- Install *pyopencga*.\n", "- Connect to an OpenCGA instance.\n", - "- Issue OpenCGA requests and work with responses.\n", + "- Execute OpenCGA calls and work with responses.\n", "- Launch asynchronous jobs and retrieve results.\n", "\n", - "\n", "Walk-through guides of some **common use cases** are provided in two further notebooks:
\n", - "- ADD LINK TO NOTEBOOK-02\n", - "- ADD LINK TO NOTEBOOK-03\n", - " \n", - "For reference, the methods implemented by *pyopencga* are are listed here:
\n", - " NOT HERE, need to update\n", - "- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc\n", - "\n", - "The OpenCGA web service endpoints used by *pyopencga* are listed here:\n", - "- https://ws.opencb.org/opencga-prod/webservices\n", - "\n" + "- pyopencga_catalog.ipynb\n", + "- pyopencga_variant_query.ipynb\n", + "- pyopencga_variant_analysis.ipynb\n", + " \n", + "You can check OpenCGA REST Web Service API with the following public OpenCGA installation:\n", + "- https://ws.opencb.org/opencga-prod/webservices\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Installing and importing the *pyopencga* library\n", + "# Installing and importing the *pyopencga* library\n", + "-------\n", + "\n", + "## 1. Install *pyopencga* with *pip*\n", "\n", - "You have two main options for get *pyopencga* installed in your python setup; from source code or using the Python *pip* package panager. We recommend the latter:\n", - "### 2.1. Install *pyopencga* with *pip*\n", + "_pyopencga_ is available at PyPI (https://pypi.org/project/pyopencga/) you can easily install it by exeuting:\n", "\n", - "[PROVIDE INSTRUCTIONS FOR THE FOLLOWING] you can import pyopencga directly if you have installed *pyopencga* with PyPI (The Python Package Index).
For further documentation reffer to https://pypi.org/project/pyopencga/.
The user just needs to access the console terminal (optionally within a python environment) and run:\n", + "`$ pip install pyopencga`\n", "\n", - "`$ pip install pyopencga`" + "_pyopencga_ uses some other dependencies , make sure you have installed Pandas, IPython or matplotlib." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.2. Importing the *pyopencga* library\n", + "## 2. Import *pyopencga* library\n", "\n", - "This is the recommended way of using *pyopencga* " + "You can find here the import section required to use _pyopencga_:" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", "from pyopencga.opencga_client import OpencgaClient # import client module\n", "from pprint import pprint\n", - "import json\n" + "from IPython.display import JSON\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import datetime" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.3. Setup the Client and Login in *pyopencga* \n", + "## 3. Setup OpenCGA Client \n", "\n", - "**Configuration and Credentials** \n", - "\n", - "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n", + "You need to provide **at least** a OpenCGA host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n", "\n", "Regarding credentials, you can set both user and password as two variables in the script. If you prefer not to show the password, it would be asked interactively without echo.\n" ] @@ -83,7 +82,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2.3.1 Set variables for server host, user credentials and project owner" + "### Set variables for server host, user credentials and project owner" ] }, { @@ -93,19 +92,18 @@ "outputs": [], "source": [ "# Server host\n", - "\n", "host = 'http://bioinfo.hpc.cam.ac.uk/opencga-prod'\n", "\n", "# User credentials\n", "user = 'demouser'\n", - "passwd = 'demouser' ## You can skip this, see section 1.3.4 below.\n" + "passwd = 'demouser' ## You can skip this, see section 1.3.4 below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 2.3.2 Creating ConfigClient dictionary for server connection configuration" + "### Creating ConfigClient dictionary for server connection configuration" ] }, { @@ -136,7 +134,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1.3.3 Initialize the Client \n", + "## 4. Initialize the Client \n", "\n", "Now we need to pass the *config_dict* dictionary to the **ClientConfiguration** method.
\n", "Once we have the configuration defined as *config* (see below), we can initiate the client. This is the **most important step**.\n", @@ -148,20 +146,27 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'config_dict' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m## Create the configuration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mconfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mClientConfiguration\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m## Define the client\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0moc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mOpencgaClient\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'config_dict' is not defined" + ] + } + ], "source": [ "## Create the configuration\n", - "\n", "config = ClientConfiguration(config_dict)\n", "\n", - "\n", - "##### Define the client #####\n", - " #\n", - "oc = OpencgaClient(config) #\n", - " #\n", - "#############################" + "## Define the client\n", + "oc = OpencgaClient(config)" ] }, { @@ -177,18 +182,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1.3.4 Import the credentials and Login into OpenCGA\n", + "## 5. Import the credentials and Login into OpenCGA\n", "\n", "We can decide to pass the password as a variable, or just pass the user and be asked for the password interactively" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "# Option 1: here we put only the user in order to be asked for the password interactively\n", + "## Option 1: here we put only the user in order to be asked for the password interactively\n", "\n", "# oc.login(user)" ] @@ -199,8 +204,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Option 2: you can pass the user and passwd\n", - "\n", + "## Option 2: you can pass the user and passwd\n", "oc.login(user, passwd)" ] }, @@ -215,7 +219,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 3. Understanding REST Response\n", + "# Understanding REST Response\n", + "--------\n", "\n", "*pyopencga* queries web services that return a RESTResponse object, which might be difficult to interpretate. The RESTResponse type provide the data in a manner that is not as intuitive as a python list or dictionary. Because of this, we have develop a useful functionality that retrieves the data in a simpler format. \n", "\n", @@ -291,7 +296,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Using the `get_results()` function \n", + "### 1. Using the `get_results()` function \n", "\n", "Using the functions that *pyopencga* implements for the RestResponse object makes things much easier!
Let's dig into an example using the same query as above:" ] @@ -321,7 +326,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Using the `result_iterator()` function to iterate over the Rest results\n", + "### 2. Using the `result_iterator()` function to iterate over the Rest results\n", "\n", "You can also iterate results, this is specially interesting when fetching many results from the server:" ] @@ -351,7 +356,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Using `print_results()` function to iterate over the Rest results\n", + "### 3. Using `print_results()` function to iterate over the Rest results\n", "\n", "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎" ] @@ -422,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -430,10 +435,18 @@ "output_type": "stream", "text": [ "Print the projects with a header and a different separator:\n", - "\n", - "#id,name,organism.scientificName,organism.assembly\n", - "family,Family Studies GRCh37,Homo sapiens,GRCh37\n", - "population,Population Studies GRCh38,Homo sapiens,GRCh38\n" + "\n" + ] + }, + { + "ename": "NameError", + "evalue": "name 'projects' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Print the projects with a header and a different separator:\\n'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mprojects\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprint_results\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfields\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'id,name,organism.scientificName,organism.assembly'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseparator\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m','\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmetadata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'projects' is not defined" ] } ], @@ -448,66 +461,70 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 4. Working with JOBS" + "### 4. Using Pandas DataFrame: `to_data_frame()` \n", + "\n", + "Pandas provides a very useful functionality for data science. You can convert RestResponse objects to Pandas DataFram using the following function:\n", + "\n", + "`res_response.to_data_frame()`\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "OpenCGA implemtns a number of analysis and operations that are executed as jobs\n", + "### 5. Wait for a job to finish `wait_for_job()`\n", "\n", - "Note: Describe briefly how Jobs work and point to docs" + "This will stop python execution until the jobs been completed." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Job Info\n", - "Decribe job information, ...\n" + "# Working with Jobs\n", + "------------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Executing Jobs\n", - "Lifecycle, status, ..." + "OpenCGA implemets both a powerful interactive API to query data but also allows users to execute more demanding analysis by executing jobs. There are a number of analysis and operations that are executed as jobs such as Variant Export or GWAS analysis.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Example" + "## 1. Job Info\n", + "\n", + "Job data model contain all the information about a single excution: date, id, tool, status, files, ... You can filter jobs by any of these parameters and even get some stats." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Executing Jobs\n", + "\n", + "Job execution invovle different lifecycle stages: pending, queued, running, done, rejected, ... OpenCGA takes care of executing and notifying job changes.\n", + "\n", + "Executing a job is as simpla s the following code" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'oc' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mrest_response\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvariant\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgwas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'oc' is not defined" - ] - } - ], + "outputs": [], "source": [ "## Eexecute GWAS analysis\n", - "rest_response = oc.variant().gwas()\n", + "#rest_response = oc.variant().gwas()\n", "\n", "## wait for the job to finish\n", - "oc.wait_for_job(rest_response)\n", + "#oc.wait_for_job(rest_response)\n", "\n", - "rest_response.print_results()" + "#rest_response.print_results()" ] }, { diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb index c380fbb45cd..a98ec0ba81c 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_analysis.ipynb @@ -2,7 +2,6 @@ "cells": [ { "cell_type": "markdown", - "id": "closing-coalition", "metadata": {}, "source": [ "# *pyopencga* Basic Variant Analysis\n", @@ -12,34 +11,42 @@ }, { "cell_type": "markdown", - "id": "simplified-encoding", "metadata": {}, "source": [ "# Overview\n", + "-------\n", "Note: Check Job info in the \"first steps\"" ] }, { "cell_type": "markdown", - "id": "quarterly-newfoundland", "metadata": {}, "source": [ - "# 1. VCF Export\n", + "# Working with OpenCGA Jobs\n", + "---------\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# VCF Export\n", + "-----------\n", + "\n", "Note: provide a full documented example" ] }, { "cell_type": "markdown", - "id": "square-planet", "metadata": {}, "source": [ - "# 2. GWAS Analysis" + "# GWAS Analysis\n", + "----------" ] }, { "cell_type": "code", "execution_count": null, - "id": "adjusted-assumption", "metadata": {}, "outputs": [], "source": [] @@ -61,7 +68,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.6.9" } }, "nbformat": 4, From 8a407407a80bba22b1308b3aadc45bee1e94572c Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 15 Apr 2021 16:52:05 +0200 Subject: [PATCH 185/412] analysis: add nested individual skip and limit for gene queries, #1693 - use solr iterators in gene queries --- .../analysis/rga/AbstractRgaConverter.java | 44 +++++- .../analysis/rga/GeneRgaConverter.java | 57 ++++---- .../analysis/rga/IndividualRgaConverter.java | 6 +- .../opencga/analysis/rga/RgaEngine.java | 21 +++ .../opencga/analysis/rga/RgaManager.java | 118 ++++++++-------- .../opencga/analysis/rga/RgaQueryParams.java | 7 + .../analysis/rga/VariantRgaConverter.java | 6 +- .../analysis/rga/iterators/RgaIterator.java | 14 ++ .../rga/iterators/SolrNativeIterator.java | 126 ++++++++++++++++++ .../opencga/analysis/rga/RgaManagerTest.java | 47 +++++++ .../analysis/knockout/KnockoutByVariant.java | 19 ++- .../analysis/knockout/RgaKnockoutByGene.java | 13 +- 12 files changed, 391 insertions(+), 87 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/iterators/RgaIterator.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/iterators/SolrNativeIterator.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java index e46b9b2333a..33d3424285e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java @@ -8,9 +8,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.slf4j.Logger; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; public abstract class AbstractRgaConverter { @@ -56,4 +54,44 @@ protected static KnockoutByIndividual fillIndividualInfo(RgaDataModel rgaDataMod return knockoutByIndividual; } + protected class ProcessedIndividuals { + + private int limit; + private int skip; + + private Set excludedIndividuals; + private Set includedIndividuals; + + public ProcessedIndividuals(int limit, int skip) { + this.limit = limit; + this.skip = skip; + + this.excludedIndividuals = new HashSet<>(); + this.includedIndividuals = new HashSet<>(); + } + + private void addIndividual(String individual) { + if (!excludedIndividuals.contains(individual) && !includedIndividuals.contains(individual)) { + if (limit > includedIndividuals.size()) { + if (skip > excludedIndividuals.size()) { + excludedIndividuals.add(individual); + } else { + includedIndividuals.add(individual); + } + } else { + excludedIndividuals.add(individual); + } + } + } + + public boolean processIndividual(String individual) { + addIndividual(individual); + return includedIndividuals.contains(individual); + } + + public int getNumIndividuals() { + return includedIndividuals.size() + excludedIndividuals.size(); + } + } + } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java index c04757118d4..ecaa258f1b1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java @@ -2,16 +2,17 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.Variant; -import org.opencb.commons.datastore.core.ComplexTypeConverter; +import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; +import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.slf4j.LoggerFactory; import java.util.*; -public class GeneRgaConverter extends AbstractRgaConverter implements ComplexTypeConverter, List> { +public class GeneRgaConverter extends AbstractRgaConverter { // This object contains the list of solr fields that are required in order to fully build each of the RgaKnockoutByGene fields private static final Map> CONVERTER_MAP; @@ -74,33 +75,43 @@ public class GeneRgaConverter extends AbstractRgaConverter implements ComplexTyp public GeneRgaConverter() { } - @Override - public List convertToDataModelType(List rgaDataModelList) { - throw new UnsupportedOperationException("Use other converter passing a list of variants"); + public List convertToDataModelType(RgaIterator rgaIterator, VariantDBIterator variantDBIterator) { + return convertToDataModelType(rgaIterator, variantDBIterator, 0, RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT); } - public List convertToDataModelType(List rgaDataModelList, List variantList) { + public List convertToDataModelType(RgaIterator rgaIterator, VariantDBIterator variantDBIterator, + int skipIndividuals, int limitIndividuals) { Map variantMap = new HashMap<>(); - for (Variant variant : variantList) { + while (variantDBIterator.hasNext()) { + Variant variant = variantDBIterator.next(); variantMap.put(variant.getId(), variant); } + Map geneIndividualMap = new HashMap<>(); + Map result = new HashMap<>(); - for (RgaDataModel rgaDataModel : rgaDataModelList) { + while (rgaIterator.hasNext()) { + RgaDataModel rgaDataModel = rgaIterator.next(); if (!result.containsKey(rgaDataModel.getGeneId())) { RgaKnockoutByGene knockoutByGene = new RgaKnockoutByGene(); knockoutByGene.setId(rgaDataModel.getGeneId()); knockoutByGene.setName(rgaDataModel.getGeneName()); -// knockoutByGene.setChromosome(xxxxx); -// knockoutByGene.setStart(xxxx); -// knockoutByGene.setEnd(xxxx); -// knockoutByGene.setStrand(xxxx); -// knockoutByGene.setBiotype(xxxx); -// knockoutByGene.setAnnotation(xxxx); - - knockoutByGene.setIndividuals(new LinkedList<>()); + knockoutByGene.setChromosome(rgaDataModel.getChromosome()); + knockoutByGene.setStart(rgaDataModel.getStart()); + knockoutByGene.setEnd(rgaDataModel.getEnd()); + knockoutByGene.setStrand(rgaDataModel.getStrand()); + knockoutByGene.setBiotype(rgaDataModel.getGeneBiotype()); + + knockoutByGene.setIndividuals(new ArrayList<>(limitIndividuals)); knockoutByGene.setNumIndividuals(0); result.put(rgaDataModel.getGeneId(), knockoutByGene); + geneIndividualMap.put(rgaDataModel.getGeneId(), new ProcessedIndividuals(limitIndividuals, skipIndividuals)); + } + + ProcessedIndividuals processedIndividuals = geneIndividualMap.get(rgaDataModel.getGeneId()); + if (!processedIndividuals.processIndividual(rgaDataModel.getIndividualId())) { + // Skip this individual + continue; } RgaKnockoutByGene knockoutByGene = result.get(rgaDataModel.getGeneId()); @@ -117,7 +128,6 @@ public List convertToDataModelType(List rgaData knockoutIndividual.setTranscripts(new LinkedList<>()); knockoutByGene.addIndividual(knockoutIndividual); - knockoutByGene.setNumIndividuals(knockoutByGene.getNumIndividuals() + 1); } if (StringUtils.isNotEmpty(rgaDataModel.getTranscriptId())) { @@ -132,15 +142,16 @@ public List convertToDataModelType(List rgaData } } - return new ArrayList<>(result.values()); - } + // Adjust numIndividuals + for (RgaKnockoutByGene knockoutByGene : result.values()) { + ProcessedIndividuals processedIndividuals = geneIndividualMap.get(knockoutByGene.getId()); + knockoutByGene.setNumIndividuals(processedIndividuals.getNumIndividuals()); + knockoutByGene.setHasNextIndividual(processedIndividuals.getNumIndividuals() > skipIndividuals + limitIndividuals); + } - @Override - public List convertToStorageType(List object) { - return null; + return new ArrayList<>(result.values()); } - public List getIncludeFields(List includeFields) { Set toInclude = new HashSet<>(); for (String includeField : includeFields) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 7bd75a08936..38d7e34d7d8 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -15,6 +15,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; +import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.slf4j.LoggerFactory; import java.util.*; @@ -80,13 +81,14 @@ public List convertToDataModelType(List rgaD throw new UnsupportedOperationException("Use other converter passing a list of variants"); } - public List convertToDataModelType(List rgaDataModelList, List variantList) { + public List convertToDataModelType(List rgaDataModelList, VariantDBIterator variantDBIterator) { // In this list, we will store the keys of result in the order they have been processed so order is kept List knockoutByIndividualOrder = new LinkedList<>(); Map result = new HashMap<>(); Map variantMap = new HashMap<>(); - for (Variant variant : variantList) { + while (variantDBIterator.hasNext()) { + Variant variant = variantDBIterator.next(); variantMap.put(variant.getId(), variant); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index 086352b7788..833930338c0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -13,6 +13,7 @@ import org.opencb.commons.datastore.solr.SolrCollection; import org.opencb.commons.datastore.solr.SolrManager; import org.opencb.opencga.analysis.rga.exceptions.RgaException; +import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.response.OpenCGAResult; @@ -168,6 +169,26 @@ public OpenCGAResult geneQuery(String collection, Query query, Que } } + /** + * Return the list of RgaDataModel objects from a Solr core/collection given a query. + * + * @param collection Collection name + * @param query Query + * @param queryOptions Query options + * @return List of RgaDataModel objects + * @throws RgaException RgaException + * @throws IOException IOException + */ + public RgaIterator geneQueryIterator(String collection, Query query, QueryOptions queryOptions) throws RgaException { + SolrQuery solrQuery = parser.parseQuery(query); + fixGeneOptions(queryOptions, solrQuery); + solrQuery.setRows(Integer.MAX_VALUE); + try { + return new RgaIterator(solrManager.getSolrClient(), collection, solrQuery); + } catch (SolrServerException e) { + throw new RgaException("Error executing RgaKnockoutByGene query", e); + } + } private void fixGeneOptions(QueryOptions queryOptions, SolrQuery solrQuery) { if (queryOptions.containsKey(QueryOptions.INCLUDE)) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 10d18b645af..e9fdeeca616 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -9,6 +9,7 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.analysis.rga.exceptions.RgaException; +import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -35,6 +36,7 @@ import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; +import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -235,7 +237,7 @@ public OpenCGAResult individualQuery(String studyStr, Quer auxQuery.put("sampleId", sampleIds); ExecutorService executor = Executors.newFixedThreadPool(2); - Future> variantFuture = executor.submit( + Future variantFuture = executor.submit( () -> variantStorageQuery(study.getFqn(), sampleIds, auxQuery, options, token) ); @@ -243,9 +245,9 @@ public OpenCGAResult individualQuery(String studyStr, Quer () -> rgaEngine.individualQuery(collection, auxQuery, queryOptions) ); - List variantList; + VariantDBIterator variantDBIterator; try { - variantList = variantFuture.get(); + variantDBIterator = variantFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } @@ -258,7 +260,7 @@ public OpenCGAResult individualQuery(String studyStr, Quer } List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(tmpResult.getResults(), - variantList); + variantDBIterator); OpenCGAResult result = new OpenCGAResult<>(tmpResult.getTime(), tmpResult.getEvents(), knockoutByIndividuals.size(), knockoutByIndividuals, -1); @@ -273,39 +275,6 @@ public OpenCGAResult individualQuery(String studyStr, Quer return result; } - private List variantStorageQuery(String study, List sampleIds, Query query, QueryOptions options, String token) - throws CatalogException, IOException, StorageEngineException, RgaException { - String collection = getCollectionName(study); - - DataResult result = rgaEngine.facetedQuery(collection, query, - new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS).append(QueryOptions.LIMIT, -1)); - if (result.getNumResults() == 0) { - return Collections.emptyList(); - } - List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - - if (variantIds.size() > 1000) { - // TODO: Batches - variantIds = variantIds.subList(0, 100); - } - - Query variantQuery = new Query(VariantQueryParam.ID.key(), variantIds) - .append(VariantQueryParam.STUDY.key(), study) - .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleIds) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); - - QueryOptions queryOptions = new QueryOptions() - .append(QueryOptions.EXCLUDE, Arrays.asList( -// VariantField.ANNOTATION_POPULATION_FREQUENCIES, - VariantField.ANNOTATION_CYTOBAND, - VariantField.ANNOTATION_CONSERVATION, - VariantField.ANNOTATION_DRUGS, - VariantField.ANNOTATION_GENE_EXPRESSION - )); - - return variantStorageManager.get(variantQuery, queryOptions, token).getResults(); - } - public OpenCGAResult geneQuery(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); @@ -325,9 +294,11 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); + ExecutorService executor = Executors.newFixedThreadPool(3); + + // Get numTotalResults in a future Future numTotalResults = null; if (queryOptions.getBoolean(QueryOptions.COUNT)) { - ExecutorService executor = Executors.newSingleThreadExecutor(); numTotalResults = executor.submit(() -> { QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.GENE_ID + ")"); try { @@ -356,6 +327,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, auxQuery.put(RgaDataModel.GENE_ID, geneIds); } + // Fetch all individuals matching the user query if (!auxQuery.containsKey("sampleId") && !auxQuery.containsKey("individualId") && includeIndividuals.isEmpty()) { // We perform a facet to get the different individual ids matching the user query DataResult result = rgaEngine.facetedQuery(collection, auxQuery, @@ -367,6 +339,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, includeIndividuals = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); } + // Get the set of sample ids the user will be able to see Set includeSampleIds; if (!isOwnerOrAdmin) { if (!includeIndividuals.isEmpty()) { @@ -395,9 +368,11 @@ public OpenCGAResult geneQuery(String studyStr, Query query, .append(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + // TODO: The number of samples to include could be really high includeSampleIds = new HashSet<>((List) authorisedSampleIdResult.getResults()); } } else { + // TODO: Check if samples or individuals are provided // Obtain samples Query sampleQuery = new Query(SampleDBAdaptor.QueryParams.INTERNAL_RGA_STATUS.key(), RgaIndex.Status.INDEXED); @@ -413,33 +388,37 @@ public OpenCGAResult geneQuery(String studyStr, Query query, includeSampleIds = new HashSet<>((List) sampleResult.getResults()); } - ExecutorService executor = Executors.newFixedThreadPool(2); - Future> variantFuture = executor.submit( + Future variantFuture = executor.submit( () -> variantStorageQuery(study.getFqn(), new ArrayList<>(includeSampleIds), auxQuery, options, token) ); - Future> tmpResultFuture = executor.submit( - () -> rgaEngine.geneQuery(collection, auxQuery, queryOptions) + Future tmpResultFuture = executor.submit( + () -> rgaEngine.geneQueryIterator(collection, auxQuery, queryOptions) ); - List variantList; + VariantDBIterator variantDBIterator; try { - variantList = variantFuture.get(); + variantDBIterator = variantFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } - OpenCGAResult tmpResult; + RgaIterator rgaIterator; try { - tmpResult = tmpResultFuture.get(); + rgaIterator = tmpResultFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } + int skipIndividuals = queryOptions.getInt(RgaQueryParams.SKIP_INDIVIDUAL); + int limitIndividuals = queryOptions.getInt(RgaQueryParams.LIMIT_INDIVIDUAL, RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT); + // 4. Solr gene query - List knockoutResultList = geneConverter.convertToDataModelType(tmpResult.getResults(), variantList); - OpenCGAResult knockoutResult = new OpenCGAResult<>(tmpResult.getTime(), tmpResult.getEvents(), - knockoutResultList.size(), knockoutResultList, -1); + List knockoutResultList = geneConverter.convertToDataModelType(rgaIterator, variantDBIterator, skipIndividuals, + limitIndividuals); + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + OpenCGAResult knockoutResult = new OpenCGAResult<>(time, Collections.emptyList(), knockoutResultList.size(), + knockoutResultList, -1); knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); try { @@ -564,7 +543,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer } ExecutorService executor = Executors.newFixedThreadPool(2); - Future> variantFuture = executor.submit( + Future variantFuture = executor.submit( () -> variantStorageQuery(study.getFqn(), new ArrayList<>(includeSampleIds), auxQuery, options, token) ); @@ -572,9 +551,9 @@ public OpenCGAResult variantQuery(String studyStr, Query quer () -> rgaEngine.geneQuery(collection, auxQuery, queryOptions) ); - List variantList; + VariantDBIterator variantDBIterator; try { - variantList = variantFuture.get(); + variantDBIterator = variantFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } @@ -587,7 +566,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer } // 4. Solr gene query - List knockoutResultList = variantConverter.convertToDataModelType(tmpResult.getResults(), variantList, + List knockoutResultList = variantConverter.convertToDataModelType(tmpResult.getResults(), variantDBIterator, query.getAsStringList(RgaQueryParams.VARIANTS.key())); OpenCGAResult knockoutResult = new OpenCGAResult<>(tmpResult.getTime(), tmpResult.getEvents(), knockoutResultList.size(), knockoutResultList, -1); @@ -616,6 +595,39 @@ public OpenCGAResult variantQuery(String studyStr, Query quer } } + private VariantDBIterator variantStorageQuery(String study, List sampleIds, Query query, QueryOptions options, String token) + throws CatalogException, IOException, StorageEngineException, RgaException { + String collection = getCollectionName(study); + + DataResult result = rgaEngine.facetedQuery(collection, query, + new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS).append(QueryOptions.LIMIT, -1)); + if (result.getNumResults() == 0) { + return VariantDBIterator.EMPTY_ITERATOR; + } + List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + +// if (variantIds.size() > 1000) { +// // TODO: Batches +// variantIds = variantIds.subList(0, 100); +// } + + Query variantQuery = new Query(VariantQueryParam.ID.key(), variantIds) + .append(VariantQueryParam.STUDY.key(), study) + .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleIds) + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); + + QueryOptions queryOptions = new QueryOptions() + .append(QueryOptions.EXCLUDE, Arrays.asList( +// VariantField.ANNOTATION_POPULATION_FREQUENCIES, + VariantField.ANNOTATION_CYTOBAND, + VariantField.ANNOTATION_CONSERVATION, + VariantField.ANNOTATION_DRUGS, + VariantField.ANNOTATION_GENE_EXPRESSION + )); + + return variantStorageManager.iterator(variantQuery, queryOptions, token); + } + public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java index 6ecc35f96ac..a4b3970842b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java @@ -82,6 +82,13 @@ public class RgaQueryParams implements QueryParam { public static final String INCLUDE_INDIVIDUAL_DESCR = "Include only the comma separated list of individuals to the response"; public static final String INCLUDE_INDIVIDUAL = "includeIndividual"; + public static final int DEFAULT_INDIVIDUAL_LIMIT = 1000; + public static final String LIMIT_INDIVIDUAL_DESCR = "Limit number of individuals returned (default: " + DEFAULT_INDIVIDUAL_LIMIT + ")"; + public static final String LIMIT_INDIVIDUAL = "limitIndividual"; + + public static final String SKIP_INDIVIDUAL_DESCR = "Number of individuals to skip"; + public static final String SKIP_INDIVIDUAL = "skipIndividual"; + public RgaQueryParams(String key, Type type, String description) { this.key = key; this.type = type; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java index 776ff95a233..e5ee9ec88b4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java @@ -8,6 +8,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; +import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.slf4j.LoggerFactory; import java.util.*; @@ -90,12 +91,13 @@ public List convertToDataModelType(List rgaData throw new UnsupportedOperationException("Use other converter passing the list of variants"); } - public List convertToDataModelType(List rgaDataModelList, List variantList, + public List convertToDataModelType(List rgaDataModelList, VariantDBIterator variantDBIterator, List includeVariants) { Set variantIds = new HashSet<>(includeVariants); Map variantMap = new HashMap<>(); - for (Variant variant : variantList) { + while (variantDBIterator.hasNext()) { + Variant variant = variantDBIterator.next(); variantMap.put(variant.getId(), variant); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/iterators/RgaIterator.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/iterators/RgaIterator.java new file mode 100644 index 00000000000..a70c6ac6a79 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/iterators/RgaIterator.java @@ -0,0 +1,14 @@ +package org.opencb.opencga.analysis.rga.iterators; + +import org.apache.solr.client.solrj.SolrClient; +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.client.solrj.SolrServerException; +import org.opencb.opencga.analysis.rga.RgaDataModel; + +public class RgaIterator extends SolrNativeIterator { + + public RgaIterator(SolrClient solrClient, String collection, SolrQuery solrQuery) throws SolrServerException { + super(solrClient, collection, solrQuery, RgaDataModel.class); + } + +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/iterators/SolrNativeIterator.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/iterators/SolrNativeIterator.java new file mode 100644 index 00000000000..31af74df50a --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/iterators/SolrNativeIterator.java @@ -0,0 +1,126 @@ +package org.opencb.opencga.analysis.rga.iterators; + +import org.apache.solr.client.solrj.SolrClient; +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.response.QueryResponse; +import org.apache.solr.common.params.CursorMarkParams; +import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; +import org.opencb.opencga.storage.core.variant.search.VariantSearchModel; + +import java.io.IOException; +import java.util.Collections; +import java.util.Iterator; +import java.util.NoSuchElementException; + +public abstract class SolrNativeIterator implements Iterator, AutoCloseable { + + private SolrClient solrClient; + private String collection; + private SolrQuery solrQuery; + private QueryResponse solrResponse; + private String cursorMark; + private String nextCursorMark; + + private Iterator solrIterator; + + private int remaining; + private static final int BATCH_SIZE = 100; + + private Class clazz; + + public SolrNativeIterator(SolrClient solrClient, String collection, SolrQuery solrQuery, Class clazz) throws SolrServerException { + this.solrClient = solrClient; + this.collection = collection; + this.solrQuery = solrQuery; + this.clazz = clazz; + + // Make sure that query is sorted + this.solrQuery.setSort(SolrQuery.SortClause.asc("id")); + + // This is the limit of the user, or the default limit if it is not passed + this.remaining = (solrQuery.getRows() == null || solrQuery.getRows() < 0) + ? Integer.MAX_VALUE + : solrQuery.getRows(); + + // We the set cursor at the beginning + this.cursorMark = CursorMarkParams.CURSOR_MARK_START; + + // We create an empty iterator, this will return false in the first hasNext call + this.solrIterator = Collections.emptyIterator(); + + // Current Solr iterator (aka cursorMarks) implementation does not support skip. + // A simple solution is to waste these records and remove the Start from the solrQuery + if (solrQuery.getStart() != null && solrQuery.getStart() >= 0) { + // Do not change the order or position of the next two lines of code + Integer skip = solrQuery.getStart(); + // We need to increment remaining with skip to allow the decrement in the hasNext method + this.remaining = (this.remaining < Integer.MAX_VALUE - skip) ? this.remaining + skip : Integer.MAX_VALUE; + solrQuery.setStart(null); + for (int i = 0; i < skip && hasNext(); i++) { + next(); + } + } + } + + @Override + public boolean hasNext() { + // This is always false the first time with the empty iterator + if (solrIterator.hasNext()) { + return true; + } else { + // This only happens when there are no more records in Solr + if (cursorMark.equals(nextCursorMark) || remaining == 0) { + return false; + } + + // We need to fetch another batch from Solr + try { + if (nextCursorMark != null) { + cursorMark = nextCursorMark; + } + solrQuery.setRows(remaining > BATCH_SIZE ? BATCH_SIZE : remaining); + solrQuery.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark); + + // Execute the query and fetch setRows records, we will iterate over this list + solrResponse = solrClient.query(collection, solrQuery); + + // When the number of returned elements is less than setRows it means there are no enough elements in the server + if (solrResponse.getResults().size() < BATCH_SIZE) { + remaining = 0; + } else { + // We decrement the number of elements found + remaining -= solrResponse.getResults().size(); + } + nextCursorMark = solrResponse.getNextCursorMark(); + solrIterator = solrResponse.getBeans(clazz).iterator(); + return solrIterator.hasNext(); + } catch (SolrServerException | IOException e) { + throw new VariantQueryException("Error searching more variants", e); + } + } + } + + @Override + public E next() { + // Sanity check + if (hasNext()) { + return solrIterator.next(); + } else { + throw new NoSuchElementException(); + } + } + + @Override + public void close() throws Exception { + // nothing to do + } + + public long getNumFound() { + // Sanity check + if (solrResponse == null) { + hasNext(); + } + return solrResponse == null ? 0 : solrResponse.getResults().getNumFound(); + } +} diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 98c75d5b61a..8cccae0729c 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -266,6 +266,53 @@ public void testGeneQueryPermissions() throws CatalogException, IOException, Rga } } + @Test + public void testGeneQueryLimitNestedIndividual() throws CatalogException, IOException, RgaException { + Map> geneIndividualMap = new HashMap<>(); + QueryOptions options = new QueryOptions(QueryOptions.LIMIT, 5) + .append(RgaQueryParams.LIMIT_INDIVIDUAL, 1); + + for (int skip = 0; skip < 4; skip++) { + options.put(RgaQueryParams.SKIP_INDIVIDUAL, skip); + OpenCGAResult result = rgaManager.geneQuery(STUDY, new Query(), options, ownerToken); + + assertEquals(5, result.getNumResults()); + for (RgaKnockoutByGene gene : result.getResults()) { + assertTrue(gene.getNumIndividuals() > 2); + assertTrue(gene.getIndividuals().size() <= 1); + + if (skip < 2) { + assertTrue(gene.isHasNextIndividual()); + } + + if (!gene.getIndividuals().isEmpty()) { + if (!geneIndividualMap.containsKey(gene.getId())) { + geneIndividualMap.put(gene.getId(), new HashSet<>()); + } + + Set individualSet = geneIndividualMap.get(gene.getId()); + assertFalse(individualSet.contains(gene.getIndividuals().get(0).getId())); + individualSet.add(gene.getIndividuals().get(0).getId()); + } + } + } + + assertEquals(5, geneIndividualMap.size()); + for (Set individualSet : geneIndividualMap.values()) { + assertTrue(individualSet.size() > 2); + } + + // Skip all nested individuals + options.put(RgaQueryParams.SKIP_INDIVIDUAL, 4); + OpenCGAResult result = rgaManager.geneQuery(STUDY, new Query(), options, ownerToken); + assertEquals(5, result.getNumResults()); + for (RgaKnockoutByGene gene : result.getResults()) { + assertTrue(gene.getNumIndividuals() > 2); + assertTrue(gene.getIndividuals().isEmpty()); + assertFalse(gene.isHasNextIndividual()); + } + } + @Test public void testGeneQueryLimit() throws CatalogException, IOException, RgaException { Set geneIds = new HashSet<>(); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java index 8efed254626..3b1e47231ba 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java @@ -22,23 +22,25 @@ public class KnockoutByVariant { private List clinicalSignificance; private int numIndividuals; + private boolean hasNextIndividual; private List individuals; public KnockoutByVariant() { } public KnockoutByVariant(String id, List individuals) { - this(id, "", null, -1, -1, 0, null, null, null, null, null, individuals); + this(id, "", null, -1, -1, 0, null, null, null, null, null, individuals, false); } public KnockoutByVariant(String id, String chromosome, int start, int end, int length, String reference, String alternate, List individuals) { - this(id, "", chromosome, start, end, length, reference, alternate, null, null, null, individuals); + this(id, "", chromosome, start, end, length, reference, alternate, null, null, null, individuals, false); } public KnockoutByVariant(String id, String dbSnp, String chromosome, int start, int end, int length, String reference, String alternate, VariantType type, List populationFrequencies, - List clinicalSignificance, List individuals) { + List clinicalSignificance, List individuals, + boolean hasNextIndividual) { this.id = id; this.dbSnp = dbSnp; this.chromosome = chromosome; @@ -52,6 +54,7 @@ public KnockoutByVariant(String id, String dbSnp, String chromosome, int start, this.clinicalSignificance = clinicalSignificance; this.numIndividuals = individuals != null ? individuals.size() : 0; this.individuals = individuals; + this.hasNextIndividual = hasNextIndividual; } @Override @@ -69,6 +72,7 @@ public String toString() { sb.append(", populationFrequencies=").append(populationFrequencies); sb.append(", clinicalSignificance=").append(clinicalSignificance); sb.append(", numIndividuals=").append(numIndividuals); + sb.append(", hasNextIndividual=").append(hasNextIndividual); sb.append(", individuals=").append(individuals); sb.append('}'); return sb.toString(); @@ -196,6 +200,15 @@ public KnockoutByVariant setNumIndividuals(int numIndividuals) { return this; } + public boolean isHasNextIndividual() { + return hasNextIndividual; + } + + public KnockoutByVariant setHasNextIndividual(boolean hasNextIndividual) { + this.hasNextIndividual = hasNextIndividual; + return this; + } + public List getIndividuals() { return individuals; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/RgaKnockoutByGene.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/RgaKnockoutByGene.java index b718a3a177d..078e32bf3e0 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/RgaKnockoutByGene.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/RgaKnockoutByGene.java @@ -3,12 +3,14 @@ public class RgaKnockoutByGene extends KnockoutByGene { private int numIndividuals; + private boolean hasNextIndividual; public RgaKnockoutByGene() { } - public RgaKnockoutByGene(int numIndividuals) { + public RgaKnockoutByGene(int numIndividuals, boolean hasNextIndividual) { this.numIndividuals = numIndividuals; + this.hasNextIndividual = hasNextIndividual; } public int getNumIndividuals() { @@ -19,4 +21,13 @@ public RgaKnockoutByGene setNumIndividuals(int numIndividuals) { this.numIndividuals = numIndividuals; return this; } + + public boolean isHasNextIndividual() { + return hasNextIndividual; + } + + public RgaKnockoutByGene setHasNextIndividual(boolean hasNextIndividual) { + this.hasNextIndividual = hasNextIndividual; + return this; + } } From 6a9182abdd3744a1da966feeb0d00d403099c78b Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 15 Apr 2021 18:22:17 +0200 Subject: [PATCH 186/412] analysis: add nested individual skip and limit for variant queries, #1693 - use solr iterators in variant queries --- .../opencga/analysis/rga/RgaEngine.java | 39 +++--------- .../opencga/analysis/rga/RgaManager.java | 25 ++++---- .../opencb/opencga/analysis/rga/RgaUtils.java | 27 +++++--- .../analysis/rga/VariantRgaConverter.java | 62 +++++++++++++------ .../opencga/analysis/rga/RgaManagerTest.java | 48 ++++++++++++++ 5 files changed, 128 insertions(+), 73 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index 833930338c0..e26bc11ef97 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -147,39 +147,16 @@ private void fixIndividualOptions(QueryOptions queryOptions, SolrQuery solrQuery } /** - * Return the list of RgaDataModel objects from a Solr core/collection given a query. - * - * @param collection Collection name - * @param query Query - * @param queryOptions Query options - * @return List of RgaDataModel objects - * @throws RgaException RgaException - * @throws IOException IOException - */ - public OpenCGAResult geneQuery(String collection, Query query, QueryOptions queryOptions) - throws RgaException, IOException { - SolrQuery solrQuery = parser.parseQuery(query); - fixGeneOptions(queryOptions, solrQuery); - solrQuery.setRows(Integer.MAX_VALUE); - SolrCollection solrCollection = solrManager.getCollection(collection); - try { - return new OpenCGAResult<>(solrCollection.query(solrQuery, RgaDataModel.class)); - } catch (SolrServerException e) { - throw new RgaException("Error executing RgaKnockoutByGene query", e); - } - } - - /** - * Return the list of RgaDataModel objects from a Solr core/collection given a query. + * Return an RgaDataModel iterator given a query. * * @param collection Collection name * @param query Query * @param queryOptions Query options - * @return List of RgaDataModel objects + * @return RgaIterator. * @throws RgaException RgaException * @throws IOException IOException */ - public RgaIterator geneQueryIterator(String collection, Query query, QueryOptions queryOptions) throws RgaException { + public RgaIterator geneQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException { SolrQuery solrQuery = parser.parseQuery(query); fixGeneOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); @@ -203,23 +180,21 @@ private void fixGeneOptions(QueryOptions queryOptions, SolrQuery solrQuery) { } /** - * Return the list of RgaDataModel objects from a Solr core/collection given a query. + * Return an RgaDataModel iterator given a query. * * @param collection Collection name * @param query Query * @param queryOptions Query options - * @return List of RgaDataModel objects + * @return RgaIterator object. * @throws RgaException RgaException * @throws IOException IOException */ - public OpenCGAResult variantQuery(String collection, Query query, QueryOptions queryOptions) - throws RgaException, IOException { + public RgaIterator variantQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException { SolrQuery solrQuery = parser.parseQuery(query); fixVariantOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); - SolrCollection solrCollection = solrManager.getCollection(collection); try { - return new OpenCGAResult<>(solrCollection.query(solrQuery, RgaDataModel.class)); + return new RgaIterator(solrManager.getSolrClient(), collection, solrQuery); } catch (SolrServerException e) { throw new RgaException("Error executing KnockoutByVariant query", e); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index e9fdeeca616..cf9acbe878d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -5,7 +5,6 @@ import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrException; -import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.analysis.rga.exceptions.RgaException; @@ -30,7 +29,6 @@ import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.core.response.VariantQueryResult; import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; @@ -393,7 +391,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, ); Future tmpResultFuture = executor.submit( - () -> rgaEngine.geneQueryIterator(collection, auxQuery, queryOptions) + () -> rgaEngine.geneQuery(collection, auxQuery, queryOptions) ); VariantDBIterator variantDBIterator; @@ -547,9 +545,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer () -> variantStorageQuery(study.getFqn(), new ArrayList<>(includeSampleIds), auxQuery, options, token) ); - Future> tmpResultFuture = executor.submit( - () -> rgaEngine.geneQuery(collection, auxQuery, queryOptions) - ); + Future rgaIteratorFuture = executor.submit(() -> rgaEngine.variantQuery(collection, auxQuery, queryOptions)); VariantDBIterator variantDBIterator; try { @@ -558,18 +554,23 @@ public OpenCGAResult variantQuery(String studyStr, Query quer throw new RgaException(e.getMessage(), e); } - OpenCGAResult tmpResult; + RgaIterator rgaIterator; try { - tmpResult = tmpResultFuture.get(); + rgaIterator = rgaIteratorFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } + int skipIndividuals = queryOptions.getInt(RgaQueryParams.SKIP_INDIVIDUAL); + int limitIndividuals = queryOptions.getInt(RgaQueryParams.LIMIT_INDIVIDUAL, RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT); + // 4. Solr gene query - List knockoutResultList = variantConverter.convertToDataModelType(tmpResult.getResults(), variantDBIterator, - query.getAsStringList(RgaQueryParams.VARIANTS.key())); - OpenCGAResult knockoutResult = new OpenCGAResult<>(tmpResult.getTime(), tmpResult.getEvents(), - knockoutResultList.size(), knockoutResultList, -1); + List knockoutResultList = variantConverter.convertToDataModelType(rgaIterator, variantDBIterator, + query.getAsStringList(RgaQueryParams.VARIANTS.key()), skipIndividuals, limitIndividuals); + + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + OpenCGAResult knockoutResult = new OpenCGAResult<>(time, Collections.emptyList(), knockoutResultList.size(), + knockoutResultList, -1); knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); try { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index 5e6be2a5685..f10a6e828f9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -273,23 +273,15 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, if (variantMap.containsKey(variantId) && (variantIds.isEmpty() || variantIds.contains(variantId))) { Variant variant = variantMap.get(variantId); - StudyEntry studyEntry = variant.getStudies().get(0); - // TODO: Check fileentry - FileEntry fileEntry = variant.getStudies().get(0).getFiles().get(0); - SampleEntry sampleEntry = variant.getStudies().get(0).getSample(rgaDataModel.getSampleId()); - VariantAnnotation variantAnnotation = variant.getAnnotation(); - // TODO: Check consequence type - ConsequenceType consequenceType = variantAnnotation.getConsequenceTypes().get(0); + SampleEntry sampleEntry = variant.getStudies().get(0).getSample(rgaDataModel.getSampleId()); KnockoutVariant.KnockoutType knockoutType = null; if (CollectionUtils.isNotEmpty(rgaDataModel.getKnockoutTypes())) { knockoutType = KnockoutVariant.KnockoutType.valueOf(rgaDataModel.getKnockoutTypes().get(i)); } // Convert just once - KnockoutVariant knockoutVariant = new KnockoutVariant(variant, studyEntry, fileEntry, sampleEntry, - variantAnnotation, consequenceType, knockoutType); - + KnockoutVariant knockoutVariant = convertToKnockoutVariant(variant, sampleEntry, knockoutType); knockoutVariantList.add(knockoutVariant); } @@ -299,5 +291,20 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, return knockoutVariantList; } + static KnockoutVariant convertToKnockoutVariant(Variant variant) { + return convertToKnockoutVariant(variant, null, null); + } + + // Default converter + static KnockoutVariant convertToKnockoutVariant(Variant variant, SampleEntry sampleEntry, KnockoutVariant.KnockoutType knockoutType) { + StudyEntry studyEntry = variant.getStudies().get(0); + // TODO: Check fileentry + FileEntry fileEntry = variant.getStudies().get(0).getFiles().get(0); + VariantAnnotation variantAnnotation = variant.getAnnotation(); + // TODO: Check consequence type + ConsequenceType consequenceType = variantAnnotation.getConsequenceTypes().get(0); + + return new KnockoutVariant(variant, studyEntry, fileEntry, sampleEntry, variantAnnotation, consequenceType, knockoutType); + } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java index e5ee9ec88b4..a2a0ec75539 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java @@ -4,6 +4,7 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.ComplexTypeConverter; +import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; @@ -13,7 +14,7 @@ import java.util.*; -public class VariantRgaConverter extends AbstractRgaConverter implements ComplexTypeConverter, List> { +public class VariantRgaConverter extends AbstractRgaConverter { // This object contains the list of solr fields that are required in order to fully build each of the KnockoutByIndividual fields private static final Map> CONVERTER_MAP; @@ -86,14 +87,15 @@ public class VariantRgaConverter extends AbstractRgaConverter implements Complex public VariantRgaConverter() { } - @Override - public List convertToDataModelType(List rgaDataModelList) { - throw new UnsupportedOperationException("Use other converter passing the list of variants"); - } - public List convertToDataModelType(List rgaDataModelList, VariantDBIterator variantDBIterator, + public List convertToDataModelType(RgaIterator rgaIterator, VariantDBIterator variantDBIterator, List includeVariants) { - Set variantIds = new HashSet<>(includeVariants); + return convertToDataModelType(rgaIterator, variantDBIterator, includeVariants, 0, RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT); + } + + public List convertToDataModelType(RgaIterator rgaIterator, VariantDBIterator variantDBIterator, + List includeVariants, int skipIndividuals, int limitIndividuals) { + Set includeVariantIds = new HashSet<>(includeVariants); Map variantMap = new HashMap<>(); while (variantDBIterator.hasNext()) { @@ -101,30 +103,48 @@ public List convertToDataModelType(List rgaData variantMap.put(variant.getId(), variant); } + Map variantIndividualMap = new HashMap<>(); + // In this list, we will store the keys of result in the order they have been processed so order is kept List variantOrder = new LinkedList<>(); Map> result = new HashMap<>(); Map individualMap = new HashMap<>(); - for (RgaDataModel rgaDataModel : rgaDataModelList) { + while (rgaIterator.hasNext()) { + RgaDataModel rgaDataModel = rgaIterator.next(); + List auxVariantIds = new LinkedList<>(); for (String variant : rgaDataModel.getVariants()) { - if (variantIds.isEmpty() || variantIds.contains(variant)) { + if (includeVariantIds.isEmpty() || includeVariantIds.contains(variant)) { auxVariantIds.add(variant); if (!result.containsKey(variant)) { result.put(variant, new HashSet<>()); // The variant will be processed, so we add it to the order list variantOrder.add(variant); + + // Add also to the map to control the nested individuals that should actually be processed + variantIndividualMap.put(variant, new ProcessedIndividuals(limitIndividuals, skipIndividuals)); } } } if (!auxVariantIds.isEmpty()) { - IndividualRgaConverter.extractKnockoutByIndividualMap(rgaDataModel, variantMap, individualMap); + boolean processNestedIndividual = false; + for (String variant : auxVariantIds) { + ProcessedIndividuals processedIndividuals = variantIndividualMap.get(variant); + if (processedIndividuals.processIndividual(rgaDataModel.getIndividualId())) { + processNestedIndividual = true; + break; + } + } + if (processNestedIndividual) { + IndividualRgaConverter.extractKnockoutByIndividualMap(rgaDataModel, variantMap, individualMap); - for (String auxVariantId : auxVariantIds) { - if (StringUtils.isNotEmpty(rgaDataModel.getIndividualId())) { - result.get(auxVariantId).add(rgaDataModel.getIndividualId()); + for (String auxVariantId : auxVariantIds) { + ProcessedIndividuals processedIndividuals = variantIndividualMap.get(auxVariantId); + if (processedIndividuals.processIndividual(rgaDataModel.getIndividualId())) { + result.get(auxVariantId).add(rgaDataModel.getIndividualId()); + } } } } @@ -187,18 +207,22 @@ public List convertToDataModelType(List rgaData } KnockoutByVariant knockoutByVariant = new KnockoutByVariant(variantId, filteredIndividualList); + if (knockoutVariant == null) { + // It hasn't been processed because the skipIndividuals is higher than the actual number of individuals having that variant + Variant variant = variantMap.get(variantId); + knockoutVariant = RgaUtils.convertToKnockoutVariant(variant); + } knockoutByVariant.setVariantFields(knockoutVariant); + + ProcessedIndividuals processedIndividuals = variantIndividualMap.get(variantId); + knockoutByVariant.setNumIndividuals(processedIndividuals.getNumIndividuals()); + knockoutByVariant.setHasNextIndividual(processedIndividuals.getNumIndividuals() > skipIndividuals + limitIndividuals); + knockoutVariantList.add(knockoutByVariant); } return knockoutVariantList; } - @Override - public List convertToStorageType(List knockoutByVariants) { - return null; - } - - public List getIncludeFields(List includeFields) { Set toInclude = new HashSet<>(); for (String includeField : includeFields) { diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 8cccae0729c..dcd9de14227 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -273,6 +273,7 @@ public void testGeneQueryLimitNestedIndividual() throws CatalogException, IOExce .append(RgaQueryParams.LIMIT_INDIVIDUAL, 1); for (int skip = 0; skip < 4; skip++) { + System.out.println("Skip " + skip); options.put(RgaQueryParams.SKIP_INDIVIDUAL, skip); OpenCGAResult result = rgaManager.geneQuery(STUDY, new Query(), options, ownerToken); @@ -379,7 +380,54 @@ public void testVariantQueryPermissions() throws CatalogException, IOException, fail("Unexpected variant id '" + variant.getId() + "'"); } } + } + + @Test + public void testVariantQueryLimitNestedIndividual() throws CatalogException, IOException, RgaException { + Map> variantIndividualMap = new HashMap<>(); + QueryOptions options = new QueryOptions(QueryOptions.LIMIT, 5) + .append(RgaQueryParams.LIMIT_INDIVIDUAL, 1); + + for (int skip = 0; skip < 4; skip++) { + System.out.println("Skip " + skip); + options.put(RgaQueryParams.SKIP_INDIVIDUAL, skip); + OpenCGAResult result = rgaManager.variantQuery(STUDY, new Query(), options, ownerToken); + + assertEquals(5, result.getNumResults()); + for (KnockoutByVariant variant : result.getResults()) { + assertTrue(variant.getNumIndividuals() > 2); + assertTrue(variant.getIndividuals().size() <= 1); + if (skip < 2) { + assertTrue(variant.isHasNextIndividual()); + } + + if (!variant.getIndividuals().isEmpty()) { + if (!variantIndividualMap.containsKey(variant.getId())) { + variantIndividualMap.put(variant.getId(), new HashSet<>()); + } + + Set individualSet = variantIndividualMap.get(variant.getId()); + assertFalse(individualSet.contains(variant.getIndividuals().get(0).getId())); + individualSet.add(variant.getIndividuals().get(0).getId()); + } + } + } + + assertEquals(5, variantIndividualMap.size()); + for (Set individualSet : variantIndividualMap.values()) { + assertTrue(individualSet.size() > 2); + } + + // Skip all nested individuals + options.put(RgaQueryParams.SKIP_INDIVIDUAL, 4); + OpenCGAResult result = rgaManager.variantQuery(STUDY, new Query(), options, ownerToken); + assertEquals(5, result.getNumResults()); + for (KnockoutByVariant variant : result.getResults()) { + assertTrue(variant.getNumIndividuals() > 2); + assertTrue(variant.getIndividuals().isEmpty()); + assertFalse(variant.isHasNextIndividual()); + } } @Test From dba703e171f6df37935ba9490a2e99b554b8bd12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 16 Apr 2021 10:18:20 +0100 Subject: [PATCH 187/412] analysis: Do not run Knockout.index (for RGA) in a new job. Run in step. --- .../variant/knockout/KnockoutAnalysis.java | 43 ++++++++----------- .../VariantInternalCommandExecutor.java | 3 +- .../options/VariantCommandOptions.java | 3 -- .../analysis/VariantCommandExecutor.java | 3 +- .../opencga/clinical/rga/RgaManager.java | 10 +++-- .../variant/KnockoutAnalysisParams.java | 12 +----- 6 files changed, 27 insertions(+), 47 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index fdf893ee28f..5b345b26951 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -26,16 +26,11 @@ import org.opencb.biodata.models.clinical.interpretation.DiseasePanel; import org.opencb.biodata.models.core.Gene; import org.opencb.biodata.models.core.Transcript; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; -import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; -import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.core.tools.annotations.ToolParams; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; import org.opencb.opencga.catalog.db.api.IndividualDBAdaptor; +import org.opencb.opencga.clinical.rga.RgaManager; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; @@ -46,8 +41,10 @@ import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.variant.KnockoutAnalysisParams; import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; import org.opencb.opencga.storage.core.metadata.models.Trio; import org.opencb.opencga.storage.core.utils.CellBaseUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import java.io.BufferedWriter; @@ -75,7 +72,7 @@ protected List getSteps() { steps.add(getId()); steps.add("add-metadata-to-output-files"); if (analysisParams.isIndex()) { - steps.add("launch-index"); + steps.add("index"); } return steps; } @@ -382,33 +379,27 @@ protected void run() throws Exception { }); if (analysisParams.isIndex()) { - step("launch-index", () -> { - String thisJobOutdir = getCatalogManager() - .getJobManager() - .get(getStudyFqn(), getJobId(), new QueryOptions(), getToken()).first().getOutDir() - .getPath(); - if (!thisJobOutdir.endsWith("/")) { - thisJobOutdir += "/"; - } - String individualsOutputFileName = getIndividualsOutputFile().getFileName().toString(); - RgaAnalysisParams rgaAnalysisParams = new RgaAnalysisParams(thisJobOutdir + individualsOutputFileName); - - Job rgaJob = getCatalogManager().getJobManager().submit(getStudyFqn(), RgaAnalysis.ID, Enums.Priority.MEDIUM, - rgaAnalysisParams.toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudyFqn())), null, null, - Collections.singletonList(getJobId()), analysisParams.getIndexJobTags(), getToken()).first(); - addAttribute("rga-index-job", rgaJob.getId()); - addAttribute("rga-index-job-uuid", rgaJob.getUuid()); - logger.info("Run index job : " + rgaJob.getId()); + step("index", () -> { + RgaManager rgaManager = new RgaManager(configuration, storageConfiguration); + rgaManager.index(study, getIndividualsOutputFile(), token); }); } } private Path getIndividualsOutputFile() { - return getOutDir().resolve(KNOCKOUT_INDIVIDUALS_JSON); + if (analysisParams.isIndex()) { + return getScratchDir().resolve(KNOCKOUT_INDIVIDUALS_JSON); + } else { + return getOutDir().resolve(KNOCKOUT_INDIVIDUALS_JSON); + } } private Path getGenesOutputFile() { - return getOutDir().resolve(KNOCKOUT_GENES_JSON); + if (analysisParams.isIndex()) { + return getScratchDir().resolve(KNOCKOUT_GENES_JSON); + } else { + return getOutDir().resolve(KNOCKOUT_GENES_JSON); + } } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index 31d82a3d47e..dbb5ffb0033 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -681,8 +681,7 @@ private void knockout() throws Exception { cliOptions.qual, cliOptions.skipGenesFile, cliOptions.outdir, - cliOptions.index, - cliOptions.indexJobTags + cliOptions.index ) .toObjectMap(cliOptions.commonOptions.params) .append(ParamConstants.STUDY_PARAM, cliOptions.study); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index ce76ebf91c1..f2e0710278c 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1174,9 +1174,6 @@ public class KnockoutCommandOptions { @Parameter(names = {"--index"}, description = "Index result for Recessive Gene Analysis") public boolean index; - - @Parameter(names = {"--index-job-tags"}, description = "Job tags for the RGA index job generated.") - public List indexJobTags; } @Parameters(commandNames = SampleEligibilityCommandOptions.SAMPLE_ELIGIBILITY_RUN_COMMAND, commandDescription = SampleEligibilityAnalysis.DESCRIPTION) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 1b426e3ef0c..456a3d9b741 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -316,8 +316,7 @@ private RestResponse knockout() throws ClientException { variantCommandOptions.knockoutCommandOptions.qual, variantCommandOptions.knockoutCommandOptions.skipGenesFile, variantCommandOptions.knockoutCommandOptions.outdir, - variantCommandOptions.knockoutCommandOptions.index, - variantCommandOptions.knockoutCommandOptions.indexJobTags + variantCommandOptions.knockoutCommandOptions.index ), getParams(variantCommandOptions.knockoutCommandOptions.study) ); diff --git a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java index 6767e79c5a9..f54a63265ab 100644 --- a/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java +++ b/opencga-clinical/src/main/java/org/opencb/opencga/clinical/rga/RgaManager.java @@ -555,6 +555,12 @@ private QueryOptions setDefaultLimit(QueryOptions options) { } public void index(String studyStr, String fileStr, String token) throws CatalogException, RgaException, IOException { + File file = catalogManager.getFileManager().get(studyStr, fileStr, FileManager.INCLUDE_FILE_URI_PATH, token).first(); + Path filePath = Paths.get(file.getUri()); + index(studyStr, filePath, token); + } + + public void index(String studyStr, Path file, String token) throws CatalogException, IOException, RgaException { String userId = catalogManager.getUserManager().getUserId(token); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); try { @@ -564,9 +570,7 @@ public void index(String studyStr, String fileStr, String token) throws CatalogE throw new CatalogException("Only owners or admins can index", e.getCause()); } - File file = catalogManager.getFileManager().get(studyStr, fileStr, FileManager.INCLUDE_FILE_URI_PATH, token).first(); - - load(study.getFqn(), Paths.get(file.getUri()), token); + load(study.getFqn(), file, token); } /** diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java index df181fa6026..4c08980022a 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/KnockoutAnalysisParams.java @@ -48,14 +48,13 @@ public class KnockoutAnalysisParams extends ToolParams { private String outdir; private boolean index; - private List indexJobTags; public KnockoutAnalysisParams() { } public KnockoutAnalysisParams(List sample, List gene, List panel, String biotype, String consequenceType, String filter, String qual, boolean skipGenesFile, String outdir, - boolean index, List indexJobTags) { + boolean index) { this.sample = sample; this.gene = gene; this.panel = panel; @@ -66,7 +65,6 @@ public KnockoutAnalysisParams(List sample, List gene, List getSample() { @@ -159,12 +157,4 @@ public KnockoutAnalysisParams setIndex(boolean index) { return this; } - public List getIndexJobTags() { - return indexJobTags; - } - - public KnockoutAnalysisParams setIndexJobTags(List indexJobTags) { - this.indexJobTags = indexJobTags; - return this; - } } From 948348d688ee13f37ea6bde8db9bf152d3ea08c1 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 16 Apr 2021 11:41:31 +0200 Subject: [PATCH 188/412] analysis: use rga iterator in individual query, #1693 --- .../analysis/rga/IndividualRgaConverter.java | 16 ++++++---------- .../opencb/opencga/analysis/rga/RgaEngine.java | 15 ++++----------- .../opencb/opencga/analysis/rga/RgaManager.java | 17 +++++++---------- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 38d7e34d7d8..646ef94b464 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -9,8 +9,8 @@ import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; -import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.analysis.rga.exceptions.RgaException; +import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; @@ -20,8 +20,7 @@ import java.util.*; -public class IndividualRgaConverter extends AbstractRgaConverter - implements ComplexTypeConverter, List> { +public class IndividualRgaConverter extends AbstractRgaConverter { // This object contains the list of solr fields that are required in order to fully build each of the KnockoutByIndividual fields private static final Map> CONVERTER_MAP; @@ -76,12 +75,7 @@ public class IndividualRgaConverter extends AbstractRgaConverter public IndividualRgaConverter() { } - @Override - public List convertToDataModelType(List rgaDataModelList) { - throw new UnsupportedOperationException("Use other converter passing a list of variants"); - } - - public List convertToDataModelType(List rgaDataModelList, VariantDBIterator variantDBIterator) { + public List convertToDataModelType(RgaIterator rgaIterator, VariantDBIterator variantDBIterator) { // In this list, we will store the keys of result in the order they have been processed so order is kept List knockoutByIndividualOrder = new LinkedList<>(); Map result = new HashMap<>(); @@ -92,7 +86,9 @@ public List convertToDataModelType(List rgaD variantMap.put(variant.getId(), variant); } - for (RgaDataModel rgaDataModel : rgaDataModelList) { + while (rgaIterator.hasNext()) { + RgaDataModel rgaDataModel = rgaIterator.next(); + if (!result.containsKey(rgaDataModel.getIndividualId())) { knockoutByIndividualOrder.add(rgaDataModel.getIndividualId()); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index e26bc11ef97..c209a26a452 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -15,8 +15,6 @@ import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; -import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -112,23 +110,20 @@ public void insert(String collection, List rgaDataModelList) throw } /** - * Return the list of RgaDataModel objects from a Solr core/collection given a query. + * Return an RgaDataModel iterator given a query. * * @param collection Collection name * @param query Query * @param queryOptions Query options - * @return List of RgaDataModel objects + * @return RgaIterator. * @throws RgaException RgaException - * @throws IOException IOException */ - public OpenCGAResult individualQuery(String collection, Query query, QueryOptions queryOptions) - throws RgaException, IOException { + public RgaIterator individualQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException{ SolrQuery solrQuery = parser.parseQuery(query); fixIndividualOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); - SolrCollection solrCollection = solrManager.getCollection(collection); try { - return new OpenCGAResult<>(solrCollection.query(solrQuery, RgaDataModel.class)); + return new RgaIterator(solrManager.getSolrClient(), collection, solrQuery); } catch (SolrServerException e) { throw new RgaException("Error executing KnockoutByIndividual query", e); } @@ -154,7 +149,6 @@ private void fixIndividualOptions(QueryOptions queryOptions, SolrQuery solrQuery * @param queryOptions Query options * @return RgaIterator. * @throws RgaException RgaException - * @throws IOException IOException */ public RgaIterator geneQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException { SolrQuery solrQuery = parser.parseQuery(query); @@ -187,7 +181,6 @@ private void fixGeneOptions(QueryOptions queryOptions, SolrQuery solrQuery) { * @param queryOptions Query options * @return RgaIterator object. * @throws RgaException RgaException - * @throws IOException IOException */ public RgaIterator variantQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException { SolrQuery solrQuery = parser.parseQuery(query); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index cf9acbe878d..6c876634d5d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -239,9 +239,7 @@ public OpenCGAResult individualQuery(String studyStr, Quer () -> variantStorageQuery(study.getFqn(), sampleIds, auxQuery, options, token) ); - Future> tmpResultFuture = executor.submit( - () -> rgaEngine.individualQuery(collection, auxQuery, queryOptions) - ); + Future rgaIteratorFuture = executor.submit(() -> rgaEngine.individualQuery(collection, auxQuery, queryOptions)); VariantDBIterator variantDBIterator; try { @@ -250,17 +248,17 @@ public OpenCGAResult individualQuery(String studyStr, Quer throw new RgaException(e.getMessage(), e); } - OpenCGAResult tmpResult; + RgaIterator rgaIterator; try { - tmpResult = tmpResultFuture.get(); + rgaIterator = rgaIteratorFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } - List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(tmpResult.getResults(), - variantDBIterator); - OpenCGAResult result = new OpenCGAResult<>(tmpResult.getTime(), tmpResult.getEvents(), - knockoutByIndividuals.size(), knockoutByIndividuals, -1); + List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(rgaIterator, variantDBIterator); + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), knockoutByIndividuals.size(), + knockoutByIndividuals, -1); if (count) { result.setNumMatches(numTotalResults); @@ -268,7 +266,6 @@ public OpenCGAResult individualQuery(String studyStr, Quer if (event != null) { result.setEvents(Collections.singletonList(event)); } - result.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); return result; } From 6e0c445a73b29bb17ec6fa9a5165a26cf9933130 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 16 Apr 2021 11:50:02 +0200 Subject: [PATCH 189/412] server: add individual limit and skip to variant and gene WS, #1693 --- .../opencga/server/rest/analysis/ClinicalWebService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 85cb4695aeb..f0e76365011 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -712,6 +712,8 @@ public Response rgaIndividualQuery( @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query"), @ApiImplicitParam(name = RgaQueryParams.INCLUDE_INDIVIDUAL, value = RgaQueryParams.INCLUDE_INDIVIDUAL_DESCR, example = "ind1,ind2,ind3", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = RgaQueryParams.SKIP_INDIVIDUAL, value = RgaQueryParams.SKIP_INDIVIDUAL_DESCR, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = RgaQueryParams.LIMIT_INDIVIDUAL, value = RgaQueryParams.LIMIT_INDIVIDUAL_DESCR, dataType = "integer", paramType = "query"), @ApiImplicitParam(name = "sampleId", value = RgaQueryParams.SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "individualId", value = RgaQueryParams.INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), @@ -758,6 +760,8 @@ public Response rgaGeneQuery( @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query"), @ApiImplicitParam(name = RgaQueryParams.INCLUDE_INDIVIDUAL, value = RgaQueryParams.INCLUDE_INDIVIDUAL_DESCR, example = "ind1,ind2,ind3", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = RgaQueryParams.SKIP_INDIVIDUAL, value = RgaQueryParams.SKIP_INDIVIDUAL_DESCR, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = RgaQueryParams.LIMIT_INDIVIDUAL, value = RgaQueryParams.LIMIT_INDIVIDUAL_DESCR, dataType = "integer", paramType = "query"), @ApiImplicitParam(name = "sampleId", value = RgaQueryParams.SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "individualId", value = RgaQueryParams.INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), From 83d1636bf6bf8d8e4a23598110650860d7c4af60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 16 Apr 2021 11:15:02 +0100 Subject: [PATCH 190/412] client: Allow variant-configure and create clinical analysis with templates --- .../client/template/TemplateManager.java | 58 +++++++++++++++++-- .../client/template/config/TemplateStudy.java | 11 +++- 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java index 529b96343b5..195d455ccab 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java @@ -31,13 +31,18 @@ import org.opencb.opencga.client.template.config.TemplateProject; import org.opencb.opencga.client.template.config.TemplateStudy; import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; +import org.opencb.opencga.core.models.clinical.ClinicalAnalysisCreateParams; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.family.FamilyCreateParams; -import org.opencb.opencga.core.models.file.*; +import org.opencb.opencga.core.models.file.FileCreateParams; +import org.opencb.opencga.core.models.file.FileFetch; +import org.opencb.opencga.core.models.file.FileLinkParams; +import org.opencb.opencga.core.models.file.FileUpdateParams; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.individual.IndividualCreateParams; import org.opencb.opencga.core.models.individual.IndividualUpdateParams; @@ -50,6 +55,7 @@ import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleCreateParams; import org.opencb.opencga.core.models.study.StudyCreateParams; +import org.opencb.opencga.core.models.study.StudyVariantEngineConfiguration; import org.opencb.opencga.core.models.study.VariableSet; import org.opencb.opencga.core.models.study.VariableSetCreateParams; import org.opencb.opencga.core.models.user.AuthenticationResponse; @@ -125,10 +131,12 @@ public void execute(TemplateConfiguration template) throws ClientException { if (CollectionUtils.isNotEmpty(study.getPanels())) { createPanels(studyFqn, study); } -// TODO -// if (CollectionUtils.isNotEmpty(study.getClinicalAnalysis())) { -// createClinicalAnalysis(study); -// } + if (CollectionUtils.isNotEmpty(study.getClinicalAnalyses())) { + createClinicalAnalyses(studyFqn, study); + } + if (study.getVariantEngineConfiguration() != null) { + configureVariantEngine(studyFqn, study); + } if (CollectionUtils.isNotEmpty(study.getFiles())) { List studyIndexVcfJobIds = fetchFiles(template, studyFqn, study); projectIndexVcfJobIds.addAll(studyIndexVcfJobIds); @@ -470,6 +478,46 @@ private void createPanels(String fqn, TemplateStudy study) throws ClientExceptio } } + private void createClinicalAnalyses(String studyFqn, TemplateStudy study) throws ClientException { + List clinicalAnalyses = study.getClinicalAnalyses(); + if (CollectionUtils.isEmpty(clinicalAnalyses)) { + return; + } + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, studyFqn); + Set existing = Collections.emptySet(); + if (resume) { + openCGAClient.setThrowExceptionOnError(false); + existing = openCGAClient.getClinicalAnalysisClient() + .info(clinicalAnalyses.stream().map(ClinicalAnalysisCreateParams::getId).collect(Collectors.joining(",")), + new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id")) + .allResults() + .stream() + .map(ClinicalAnalysis::getId) + .collect(Collectors.toSet()); + openCGAClient.setThrowExceptionOnError(true); + } + for (ClinicalAnalysisCreateParams createParams : clinicalAnalyses) { + if (!existing.contains(createParams.getId())) { + openCGAClient.getClinicalAnalysisClient().create(createParams, params); + } + } + } + + private void configureVariantEngine(String studyFqn, TemplateStudy study) throws ClientException { + StudyVariantEngineConfiguration configuration = study.getVariantEngineConfiguration(); + if (configuration == null) { + return; + } + ObjectMap params = new ObjectMap(ParamConstants.STUDY_PARAM, studyFqn); + if (configuration.getOptions() != null && !configuration.getOptions().isEmpty()) { + openCGAClient.getVariantOperationClient().configureVariant(configuration.getOptions(), params); + } + if (configuration.getSampleIndex() != null) { + openCGAClient.getVariantOperationClient().configureSampleIndex(configuration.getSampleIndex(), params); + } + + } + private List fetchFiles(TemplateConfiguration template, String studyFqn, TemplateStudy study) throws ClientException { List files = study.getFiles(); diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateStudy.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateStudy.java index 25a4f384e4b..eb7bc0da547 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateStudy.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/config/TemplateStudy.java @@ -23,7 +23,7 @@ public class TemplateStudy extends StudyCreateParams { private List variableSets; private List files; -// private StudyVariantEngineConfiguration variantEngineConfiguration; + private StudyVariantEngineConfiguration variantEngineConfiguration; public List getSamples() { return samples; @@ -96,4 +96,13 @@ public TemplateStudy setFiles(List files) { this.files = files; return this; } + + public StudyVariantEngineConfiguration getVariantEngineConfiguration() { + return variantEngineConfiguration; + } + + public TemplateStudy setVariantEngineConfiguration(StudyVariantEngineConfiguration variantEngineConfiguration) { + this.variantEngineConfiguration = variantEngineConfiguration; + return this; + } } From 05c1db8031c2957bc60d214e3b55ec6e93be1bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 16 Apr 2021 11:44:47 +0100 Subject: [PATCH 191/412] k8s: Enable deploy MongoDB and Solr in Kubernetes cluster #1747 --- .../azure/arm-kubernetes/aks/azuredeploy.json | 52 ++++++++- .../azure/arm-kubernetes/azuredeploy.json | 79 +++++++++++-- .../app/cloud/azure/arm-kubernetes/deploy.sh | 18 ++- .../cloud/azure/arm-kubernetes/setup-aks.sh | 39 +++++-- .../arm-kubernetes/vnet/azuredeploy.json | 64 ++++++----- .../docker/opencga-init/override_yaml.py | 3 + .../cloud/docker/opencga-init/setup-hadoop.sh | 44 ++++--- .../charts/mongodb-operator/Chart.yaml | 21 ++++ .../fetch-mongodb-operator-files.sh | 22 ++++ .../charts/mongodb-operator/values.yaml | 1 + .../cloud/kubernetes/charts/nginx/values.yaml | 5 +- .../charts/opencga/templates/NOTES.txt | 32 +++++- .../charts/opencga/templates/_helpers.tpl | 40 +++++++ .../opencga/templates/master-deployment.yaml | 26 ++--- .../mongodb/mongodb-password-secret.yaml | 9 ++ .../templates/mongodb/mongodb-replicaset.yaml | 66 +++++++++++ .../opencga/templates/solr/solr-cloud.yaml | 107 ++++++++++++++++++ .../solr/solr-load-configsets-job.yaml | 55 +++++++++ .../kubernetes/charts/opencga/values.yaml | 77 +++++++++++-- opencga-app/app/cloud/kubernetes/setup-k8s.sh | 80 +++++++++++-- 20 files changed, 731 insertions(+), 109 deletions(-) create mode 100644 opencga-app/app/cloud/kubernetes/charts/mongodb-operator/Chart.yaml create mode 100644 opencga-app/app/cloud/kubernetes/charts/mongodb-operator/fetch-mongodb-operator-files.sh create mode 100644 opencga-app/app/cloud/kubernetes/charts/mongodb-operator/values.yaml create mode 100644 opencga-app/app/cloud/kubernetes/charts/opencga/templates/mongodb/mongodb-password-secret.yaml create mode 100644 opencga-app/app/cloud/kubernetes/charts/opencga/templates/mongodb/mongodb-replicaset.yaml create mode 100644 opencga-app/app/cloud/kubernetes/charts/opencga/templates/solr/solr-cloud.yaml create mode 100644 opencga-app/app/cloud/kubernetes/charts/opencga/templates/solr/solr-load-configsets-job.yaml diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/aks/azuredeploy.json b/opencga-app/app/cloud/azure/arm-kubernetes/aks/azuredeploy.json index 4d3c822d453..6c0aa0b62ea 100644 --- a/opencga-app/app/cloud/azure/arm-kubernetes/aks/azuredeploy.json +++ b/opencga-app/app/cloud/azure/arm-kubernetes/aks/azuredeploy.json @@ -146,6 +146,14 @@ "description": "The size of the Virtual Machine." } }, + "mongodbAgentPool" : { + "type": "bool", + "defaultValue": false + }, + "solrAgentPool" : { + "type": "bool", + "defaultValue": false + }, "skipRoleAssignment" : { "type": "bool", "defaultValue": false @@ -213,7 +221,7 @@ { "type": "Microsoft.ContainerService/managedClusters", "name": "[parameters('aksClusterName')]", - "apiVersion": "2020-01-01", + "apiVersion": "2021-02-01", "location": "[resourceGroup().location]", "properties": { "kubernetesVersion": "[parameters('kubernetesVersion')]", @@ -243,6 +251,7 @@ }, "networkProfile": { "networkPlugin": "azure", + "loadBalancerSku": "Standard", "serviceCidr": "[parameters('aksServiceCIDR')]", "dnsServiceIP": "[parameters('aksDnsServiceIP')]", "dockerBridgeCidr": "[parameters('aksDockerBridgeCIDR')]" @@ -254,6 +263,7 @@ "count": "[parameters('aksAgentCount')]", "vmSize": "[parameters('aksAgentVMSize')]", "osType": "Linux", + "mode": "System", "storageProfile": "ManagedDisks", "vnetSubnetID": "[parameters('kubernetesSubnetId')]", "dnsPrefix": "agents", @@ -287,6 +297,46 @@ "dependsOn": [ "[resourceId('Microsoft.ContainerService/managedClusters',parameters('aksClusterName'))]" ] + }, + { + "condition" : "[parameters('mongodbAgentPool')]", + "name": "mongodb", + "type": "agentPools", + "apiVersion": "2020-01-01", + "properties": { + "osDiskSizeGB": "[parameters('aksAgentOsDiskSizeGB')]", + "count": 3, + "maxPods": 30, + "vmSize": "Standard_E4s_v3", + "osType": "Linux", + "storageProfile": "ManagedDisks", + "vnetSubnetID": "[parameters('kubernetesSubnetId')]", + "dnsPrefix": "mongodb", + "type": "VirtualMachineScaleSets" + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters',parameters('aksClusterName'))]" + ] + }, + { + "condition" : "[parameters('solrAgentPool')]", + "name": "solr", + "type": "agentPools", + "apiVersion": "2020-01-01", + "properties": { + "osDiskSizeGB": "[parameters('aksAgentOsDiskSizeGB')]", + "count": 2, + "maxPods": 30, + "vmSize": "Standard_E4s_v3", + "osType": "Linux", + "storageProfile": "ManagedDisks", + "vnetSubnetID": "[parameters('kubernetesSubnetId')]", + "dnsPrefix": "solr", + "type": "VirtualMachineScaleSets" + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters',parameters('aksClusterName'))]" + ] } ] } diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/azuredeploy.json b/opencga-app/app/cloud/azure/arm-kubernetes/azuredeploy.json index 3cafd68cd05..7bc5d5813ae 100644 --- a/opencga-app/app/cloud/azure/arm-kubernetes/azuredeploy.json +++ b/opencga-app/app/cloud/azure/arm-kubernetes/azuredeploy.json @@ -72,7 +72,7 @@ }, "logAnalyticsWorkspaceName": { "type": "string", - "defaultValue": "[concat(parameters('clusterName'), uniqueString(resourceGroup().id))]" + "defaultValue": "[concat(parameters('clusterName'), uniqueString(parameters('rgPrefix')))]" }, "privateDnsZonesName": { "type": "string", @@ -88,6 +88,13 @@ "description": "Azure Kubernetes Service name" } }, + "kubernetesVersion": { + "defaultValue": "1.16.13", + "type": "string", + "metadata": { + "description": "The version of Kubernetes." + } + }, "aksServicePrincipalAppId": { "type": "string" }, @@ -110,6 +117,34 @@ "description": "The RSA data for the SSH Public Key used to authenticate the following machines: WebServers, DaemonVM, Mongo, Solr and Zookeeper." } }, + "deploySolr" : { + "type": "bool", + "defaultValue": "true", + "metadata": { + "description": "Deploy a Solr database" + } + }, + "deploySolrAksPool": { + "type": "bool", + "defaultValue": "false", + "metadata": { + "description": "Deploy a K8s pool of VMs dedicated for Solr" + } + }, + "deployMongoDB" : { + "type": "bool", + "defaultValue": "true", + "metadata": { + "description": "Deploy a MongoDB database" + } + }, + "deployMongoDBAksPool": { + "type": "bool", + "defaultValue": "false", + "metadata": { + "description": "Deploy a K8s pool of VMs dedicated for MongoDB" + } + }, "mongoDBPassword": { "type": "securestring", "metadata": { @@ -377,7 +412,10 @@ } ], "selectedSize": "[variables('sizingOptions')[parameters('deploymentSize')]]", - "createAciSubnet": "[equals(parameters('jobsAgentPoolOrVirtualNode'), 'VirtualNode')]" + "createAciSubnet": "[equals(parameters('jobsAgentPoolOrVirtualNode'), 'VirtualNode')]", + "createMongoDBSubnet": "[parameters('deployMongoDB')]", + "createSolrSubnet": "[parameters('deploySolr')]", + "hdInsightResourceGroup": "[concat(parameters('rgPrefix'),'-hdinsight')]" }, "resources": [ { @@ -408,6 +446,12 @@ }, "createAciSubnet": { "value": "[variables('createAciSubnet')]" + }, + "createMongoDBSubnet": { + "value": "[variables('createMongoDBSubnet')]" + }, + "createSolrSubnet": { + "value": "[variables('createSolrSubnet')]" } } } @@ -499,7 +543,7 @@ "type": "Microsoft.Resources/resourceGroups", "apiVersion": "2018-05-01", "location": "[parameters('location')]", - "name": "[concat(parameters('rgPrefix'),'-hdinsight')]", + "name": "[variables('hdInsightResourceGroup')]", "properties": { } }, @@ -553,7 +597,7 @@ "yarnSiteMemoryInMb": { "value": "[variables('selectedSize').hdInsight.yarnSiteMemoryInMb]" }, - "enableHBaseAcceleratedWrites": { + "enableHBaseAcceleratedWrites": { "value": "[variables('selectedSize').hdInsight.enableHBaseAcceleratedWrites]" }, "sshPassword": { @@ -623,6 +667,9 @@ "aksServicePrincipalAppId": { "value": "[parameters('aksServicePrincipalAppId')]" }, + "kubernetesVersion": { + "value": "[parameters('kubernetesVersion')]" + }, "aksAgentCount": { "value": "[variables('selectedSize').aks.nodeCount]" }, @@ -650,6 +697,12 @@ "aksNodeResourceGroup": { "value": "[concat(parameters('rgPrefix'), '-agentpools')]" }, + "solrAgentPool": { + "value": "[and(parameters('deploySolrAksPool'), not(parameters('deploySolr')))]" + }, + "mongodbAgentPool": { + "value": "[and(parameters('deployMongoDBAksPool'), not(parameters('deployMongoDB')))]" + }, "vnetId": { "value": "[reference('vnet').outputs.vnetId.value]" }, @@ -726,6 +779,7 @@ } }, { + "condition" : "[parameters('deploySolr')]", "type": "Microsoft.Resources/resourceGroups", "apiVersion": "2018-05-01", "location": "[parameters('location')]", @@ -734,6 +788,7 @@ } }, { + "condition" : "[parameters('deploySolr')]", "type": "Microsoft.Resources/deployments", "resourceGroup": "[concat(parameters('rgPrefix'),'-solr')]", "apiVersion": "2018-05-01", @@ -798,6 +853,7 @@ } }, { + "condition" : "[parameters('deployMongoDB')]", "type": "Microsoft.Resources/resourceGroups", "apiVersion": "2018-05-01", "location": "[parameters('location')]", @@ -806,6 +862,7 @@ } }, { + "condition" : "[parameters('deployMongoDB')]", "type": "Microsoft.Resources/deployments", "resourceGroup": "[concat(parameters('rgPrefix'),'-mongodb')]", "apiVersion": "2018-05-01", @@ -922,29 +979,33 @@ "type": "string", "value": "[reference('hdinsight').outputs.clusterSshPassword.value]" }, + "hdInsightResourceGroup": { + "type": "string", + "value": "[variables('hdInsightResourceGroup')]" + }, "hdInsightEnableMonitor": { "type": "string", "value": "[reference('hdinsight').outputs.enableMonitor.value]" }, "mongoDbHostsCSV": { "type": "string", - "value": "[replace(replace(replace(replace(string(reference('mongodb').outputs.dnsNames.value), ' ', ''), '[{\"fqdn\":\"', ''), '\"},{\"fqdn\":\"', ','), '\"}]', '')]" + "value": "[if (parameters('deployMongoDB'), replace(replace(replace(replace(string(reference('mongodb').outputs.dnsNames.value), ' ', ''), '[{\"fqdn\":\"', ''), '\"},{\"fqdn\":\"', ','), '\"}]', ''), '')]" }, "mongoDbUser": { "type": "string", - "value": "[reference('mongodb').outputs.mongoDBUser.value]" + "value": "[parameters('adminUsername')]" }, "mongoDbPassword": { "type": "string", - "value": "[reference('mongodb').outputs.mongoDBPassword.value]" + "value": "[parameters('mongoDBPassword')]" }, "solrHostsCSV": { "type": "string", - "value": "[replace(replace(replace(replace(string(reference('solr').outputs.solrURLs.value), ' ', ''), '[{\"host\":\"', ''), '\"},{\"host\":\"', ','), '\"}]', '')]" + "value": "[if (parameters('deploySolr'), replace(replace(replace(replace(string(reference('solr').outputs.solrURLs.value), ' ', ''), '[{\"host\":\"', ''), '\"},{\"host\":\"', ','), '\"}]', ''), '')]" }, "solrConnectionDetails": { "type": "array", - "value": "[reference('solr').outputs.solrConnectionDetails.value]" + "value": "[if (parameters('deploySolr'), reference('solr').outputs.solrConnectionDetails.value, createArray())]" }, "privateDnsZonesName": { "type": "string", diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh b/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh index 3d18baee0b8..e8b8dc00669 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh @@ -17,6 +17,7 @@ function printUsage() { echo " --spf --service-principal-file Azure service principal deploy parameters file. Execute createsp.sh to obtain the service principal parameters" echo " --hf --helm-file Helm values file. Used when calling to 'setup-k8s.sh' " echo " -h --help Print this help" + echo " --verbose Verbose mode. Print debugging messages about the progress." echo "" } @@ -74,6 +75,10 @@ case $key in shift # past argument shift # past value ;; + --verbose) + set -x + shift # past argument + ;; *) # unknown option echo "Unknown option $key" printUsage @@ -109,7 +114,7 @@ az account set --subscription "${subscriptionName}" # Run validation to get final parameters. finalParameters=$(az deployment sub validate \ - --template-file <(jq '{parameters:.parameters, "$schema":."$schema" , resources:[], contentVersion:.contentVersion}' azuredeploy.json) \ + --template-file <(grep -v "^//" azuredeploy.json | jq '{parameters:.parameters, "$schema":."$schema" , resources:[], contentVersion:.contentVersion}') \ --location "${location}" \ --parameters @"${azudeDeployParameters}" \ --parameters @"${spAzudeDeployParameters}" \ @@ -185,7 +190,16 @@ function getOutput() { jq -r '.properties.outputs.'${1}'.value' ${deploymentOut} } +function getParameter() { + jq -r '.properties.parameters.'${1}'.value' ${deploymentOut} +} + # Enable HDInsight monitor -$(getOutput hdInsightEnableMonitor) +hdInsightClusterName=$(getParameter hdInsightClusterName) +hdInsightResourceGroup=$(getOutput hdInsightResourceGroup) +hdInsightMonitorEnabled=$(az hdinsight monitor show --name "$hdInsightClusterName" --resource-group "$hdInsightResourceGroup" --query clusterMonitoringEnabled) +if [ $hdInsightMonitorEnabled != "true" ]; then + $(getOutput hdInsightEnableMonitor) +fi ./setup-aks.sh --subscription "${subscriptionName}" --azure-output-file "${deploymentOut}" --helm-file "${helmDeployParameters}" \ No newline at end of file diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh index 47d68ecc5b2..ee147e38041 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh @@ -103,14 +103,41 @@ function configureContext() { } function generateHelmValuesFile() { - + if [ "$(getParameter "deploySolrAksPool")" == "true" ]; then + solrAgentPool=solr + else + solrAgentPool=default + fi + if [ "$(getParameter "deployMongoDBAksPool")" == "true" ]; then + mongodbAgentPool=mongodb + else + mongodbAgentPool=default + fi ## Generate helm values file cat >> "${helmValues}" << EOF # $(date "+%Y%m%d%H%M%S") # Auto generated file from deployment output ${deploymentOut} solr: - hosts: "$(getOutput "solrHostsCSV")" + external: + hosts: "$(getOutput "solrHostsCSV")" + deploy: + enabled: "$(getParameter "deploySolr")" + nodeSelector: + agentpool: "$solrAgentPool" + zookeeper: + nodeSelector: + agentpool: "$mongodbAgentPool" + +mongodb: + user: "$(getOutput "mongoDbUser")" + password: "$(getOutput "mongoDbPassword")" + external: + hosts: "$(getOutput "mongoDbHostsCSV")" + deploy: + enabled: "$(getParameter "deployMongoDB")" + nodeSelector: + agentpool: "$mongodbAgentPool" hadoop: sshDns: "$(getOutput "hdInsightSshDns")" @@ -126,12 +153,6 @@ opencga: admin: password: "$(getOutput "openCgaAdminPassword")" -catalog: - database: - hosts: "$(getOutput "mongoDbHostsCSV")" - user: "$(getOutput "mongoDbUser")" - password: "$(getOutput "mongoDbPassword")" - analysis: execution: options: @@ -204,7 +225,7 @@ echo "# Generate helm values file ${helmValues}" generateHelmValuesFile echo "setup-k8s.sh --context \"${K8S_CONTEXT}\" --values \"${allHelmValues}\"" -../../kubernetes/setup-k8s.sh --context "${K8S_CONTEXT}" --values "${allHelmValues}" +../../kubernetes/setup-k8s.sh --context "${K8S_CONTEXT}" --values "${allHelmValues}" --verbose echo "# Register Ingress domain name (if needed)" registerIngressDomainName \ No newline at end of file diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/vnet/azuredeploy.json b/opencga-app/app/cloud/azure/arm-kubernetes/vnet/azuredeploy.json index d29b850ec00..f15dcd5fde6 100644 --- a/opencga-app/app/cloud/azure/arm-kubernetes/vnet/azuredeploy.json +++ b/opencga-app/app/cloud/azure/arm-kubernetes/vnet/azuredeploy.json @@ -6,6 +6,14 @@ "type": "bool", "defaultValue": true }, + "createMongoDBSubnet": { + "type": "bool", + "defaultValue": true + }, + "createSolrSubnet": { + "type": "bool", + "defaultValue": true + }, "config": { "type": "object", "defaultValue": { @@ -162,32 +170,6 @@ } } }, - { - "type": "Microsoft.Network/virtualNetworks/subnets", - "name": "[parameters('config').subnets.mongodb.name]", - "properties": { - "addressPrefix": "[parameters('config').subnets.mongodb.addressPrefix]", - "ipConfigurations": [ - ], - "delegations": [ - ], - "serviceEndpoints": [ - ] - } - }, - { - "type": "Microsoft.Network/virtualNetworks/subnets", - "name": "[parameters('config').subnets.solr.name]", - "properties": { - "addressPrefix": "[parameters('config').subnets.solr.addressPrefix]", - "ipConfigurations": [ - ], - "delegations": [ - ], - "serviceEndpoints": [ - ] - } - }, { "type": "Microsoft.Network/virtualNetworks/subnets", "name": "[parameters('config').subnets.login.name]", @@ -238,6 +220,36 @@ } ] } + }, + { + "condition": "[parameters('createMongoDBSubnet')]", + "type": "Microsoft.Network/virtualNetworks/subnets", + "apiVersion": "2018-08-01", + "name": "[concat(parameters('config').name, '/', parameters('config').subnets.mongodb.name)]", + "properties": { + "addressPrefix": "[parameters('config').subnets.mongodb.addressPrefix]", + "ipConfigurations": [ + ], + "delegations": [ + ], + "serviceEndpoints": [ + ] + } + }, + { + "condition": "[parameters('createSolrSubnet')]", + "type": "Microsoft.Network/virtualNetworks/subnets", + "apiVersion": "2018-08-01", + "name": "[concat(parameters('config').name, '/', parameters('config').subnets.solr.name)]", + "properties": { + "addressPrefix": "[parameters('config').subnets.solr.addressPrefix]", + "ipConfigurations": [ + ], + "delegations": [ + ], + "serviceEndpoints": [ + ] + } } ], "outputs": { diff --git a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py index 60e9bb59b90..141d8deadbe 100644 --- a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py +++ b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py @@ -16,6 +16,7 @@ parser.add_argument("--catalog-database-ssl", required=False, default=True) parser.add_argument("--catalog-database-authentication-database", required=False, default="admin") parser.add_argument("--catalog-database-authentication-mechanism", required=False) +parser.add_argument("--catalog-database-replica-set", required=False) parser.add_argument("--catalog-search-hosts", required=True) parser.add_argument("--catalog-search-user", required=False) parser.add_argument("--catalog-search-password", required=False) @@ -126,6 +127,8 @@ config["catalog"]["database"]["password"] = args.catalog_database_password config["catalog"]["database"]["options"]["sslEnabled"] = args.catalog_database_ssl config["catalog"]["database"]["options"]["sslInvalidCertificatesAllowed"] = True +if args.catalog_database_replica_set is not None: + config["catalog"]["database"]["options"]["replicaSet"] = args.catalog_database_replica_set if args.catalog_database_authentication_database is not None: config["catalog"]["database"]["options"]["authenticationDatabase"] = args.catalog_database_authentication_database if args.catalog_database_authentication_mechanism is not None: diff --git a/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh b/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh index bcbf9e1f7b7..0751b0fe535 100644 --- a/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh +++ b/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh @@ -25,26 +25,24 @@ fi HADOOP_USER_HOST="$INIT_HADOOP_SSH_USER@$INIT_HADOOP_SSH_DNS" -FILE=/opt/volume/conf/hadoop -if [ -d "$FILE" ] && [ "${OVERWRITE_CONFIGURATION:-false}" == "false" ]; then - echo "$FILE already exists" - echo "Copy jar-with-dependencies to hadoop" - $SSHPASS_CMD scp ${SSH_OPTS} -r /opt/opencga/*.jar "$HADOOP_USER_HOST":"$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" -else - #$SSHPASS_CMD ssh ${SSH_OPTS} "$HADOOP_USER_HOST" "sudo sed -i '/hbase.client.keyvalue.maxsize<\/name>/!b;n;c0' /etc/hbase/conf/hbase-site.xml" - - # copy conf files from Hadoop cluster (from /etc/hadoop/conf & /etc/hbase/conf) to opencga VM - # place these files in /opt/opencga/conf/hadoop, by e.g.: - echo "Fetching Hadoop configuration" - $SSHPASS_CMD ssh ${SSH_OPTS} "$HADOOP_USER_HOST" hbase classpath | tr ":" "\n" | grep "/conf$" | grep "hadoop\|hbase" | sort | uniq | while read i ; do - $SSHPASS_CMD scp ${SSH_OPTS} -r "$HADOOP_USER_HOST:${i}"/* /opt/opencga/conf/hadoop - done - - # Copy the OpenCGA installation directory to the Hadoop cluster - $SSHPASS_CMD ssh ${SSH_OPTS} "$HADOOP_USER_HOST" mkdir -p "$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" - # TODO - Optimize this down to only required jars - $SSHPASS_CMD scp ${SSH_OPTS} -r /opt/opencga/* "$HADOOP_USER_HOST":"$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" - - mkdir -p "$FILE" - cp -r /opt/opencga/conf/hadoop/* "$FILE" -fi \ No newline at end of file +HADOOP_CONF_DIR=/opt/volume/conf/hadoop + +#$SSHPASS_CMD ssh ${SSH_OPTS} "$HADOOP_USER_HOST" "sudo sed -i '/hbase.client.keyvalue.maxsize<\/name>/!b;n;c0' /etc/hbase/conf/hbase-site.xml" + +# copy conf files from Hadoop cluster (from /etc/hadoop/conf & /etc/hbase/conf) to opencga VM +# place these files in /opt/opencga/conf/hadoop, by e.g.: +echo "Fetching Hadoop configuration" +$SSHPASS_CMD ssh ${SSH_OPTS} "$HADOOP_USER_HOST" hbase classpath | tr ":" "\n" | grep "/conf$" | grep "hadoop\|hbase" | sort | uniq | while read i ; do + $SSHPASS_CMD scp ${SSH_OPTS} -r "$HADOOP_USER_HOST:${i}"/* /opt/opencga/conf/hadoop +done + +# Copy the OpenCGA installation directory to the Hadoop cluster +$SSHPASS_CMD ssh ${SSH_OPTS} "$HADOOP_USER_HOST" mkdir -p "$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" +echo "Copy jar-with-dependencies to hadoop" +$SSHPASS_CMD scp ${SSH_OPTS} /opt/opencga/*.jar "$HADOOP_USER_HOST":"$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" +echo "Copy other libs" +# TODO - Optimize this down to only required jars +$SSHPASS_CMD scp ${SSH_OPTS} -r /opt/opencga/libs "$HADOOP_USER_HOST":"$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" + +mkdir -p "$HADOOP_CONF_DIR" +cp -r /opt/opencga/conf/hadoop/* "$HADOOP_CONF_DIR" diff --git a/opencga-app/app/cloud/kubernetes/charts/mongodb-operator/Chart.yaml b/opencga-app/app/cloud/kubernetes/charts/mongodb-operator/Chart.yaml new file mode 100644 index 00000000000..4923c48f964 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/mongodb-operator/Chart.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +name: mongodb-operator +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. +appVersion: v0.5.1 diff --git a/opencga-app/app/cloud/kubernetes/charts/mongodb-operator/fetch-mongodb-operator-files.sh b/opencga-app/app/cloud/kubernetes/charts/mongodb-operator/fetch-mongodb-operator-files.sh new file mode 100644 index 00000000000..5b7b9f12481 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/mongodb-operator/fetch-mongodb-operator-files.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +set -e -x + +# Don't move the PWD until we found out the realpath. It could be a relative path. +cd "$(dirname "$0")" + +git clone --branch v0.5.1 https://github.com/mongodb/mongodb-kubernetes-operator.git + + +mkdir -p templates/operator +cp -r mongodb-kubernetes-operator/config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml \ + mongodb-kubernetes-operator/config/rbac/ \ + mongodb-kubernetes-operator/config/manager/manager.yaml \ + templates/operator/ + +rm templates/operator/rbac/kustomization.yaml + +rm -rf mongodb-kubernetes-operator +#kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml +#kubectl apply -k config/rbac/ +#kubectl create -f config/manager/manager.yaml diff --git a/opencga-app/app/cloud/kubernetes/charts/mongodb-operator/values.yaml b/opencga-app/app/cloud/kubernetes/charts/mongodb-operator/values.yaml new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/mongodb-operator/values.yaml @@ -0,0 +1 @@ + diff --git a/opencga-app/app/cloud/kubernetes/charts/nginx/values.yaml b/opencga-app/app/cloud/kubernetes/charts/nginx/values.yaml index 471c217164e..5ee68d4e44e 100644 --- a/opencga-app/app/cloud/kubernetes/charts/nginx/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/nginx/values.yaml @@ -1,8 +1,9 @@ -# https://github.com/helm/charts/tree/master/stable/nginx-ingress +# https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx +# DEPRECATED https://github.com/helm/charts/tree/master/stable/nginx-ingress +# https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-helm/ # https://docs.microsoft.com/en-gb/azure/dev-spaces/how-to/ingress-https-nginx # https://docs.microsoft.com/en-gb/azure/aks/ingress-own-tls - controller: replicaCount: 2 nodeSelector: diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt index 8729496c9ce..b2fe4431261 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt @@ -1,12 +1,15 @@ -1. Get the application URL by running these commands: +## OpenCGA +Get the application URL by running these commands: {{- if .Values.rest.ingress.enabled }} {{- $paths := .Values.rest.ingress.paths -}} {{- range $host := .Values.rest.ingress.hosts }} {{- range $path := $paths }} - http{{ if $.Values.rest.ingress.tls }}s{{ end }}://{{ $host }}{{ $path }} + http{{ if $.Values.rest.ingress.tls }}s{{ end }}://{{ $host | default "EXTERNAL_CLUSTER_IP" }}{{ $path | replace "(/|$)" "" }} {{- end }} {{- end }} -{{- else if contains "NodePort" .Values.rest.service.type }} +{{- end }} + +{{- if contains "NodePort" .Values.rest.service.type }} export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "opencga.fullname" . }}) export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT @@ -17,6 +20,27 @@ echo http://$SERVICE_IP:{{ .Values.rest.service.port }} {{- else if contains "ClusterIP" .Values.rest.service.type }} export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "opencga.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80 + + Visit: http://localhost:8080/opencga + +{{- end }} +{{- if .Values.mongodb.deploy.enabled }} + +## MongoDB +Connect to MongoDB database running these commands: + + export SERVICE_NAME="service/{{ .Values.mongodb.deploy.name }}-svc" + kubectl --namespace {{ .Release.Namespace }} port-forward $SERVICE_NAME 27018:27017 + echo "mongo --host localhost --port 27018 --authenticationDatabase {{ .Values.mongodb.authenticationDatabase }} --authenticationMechanism {{ .Values.mongodb.authenticationMechanism }} --username {{ .Values.mongodb.user }} --password XXXXX" + +{{- end }} +{{- if .Values.solr.deploy.enabled }} + +## Solr +Connect to Solr database running these commands: + + export SERVICE_NAME="service/{{ .Values.solr.deploy.name }}-solrcloud-headless" + kubectl --namespace {{ .Release.Namespace }} port-forward $SERVICE_NAME 18983:8983 + echo "Visit http://127.0.0.1:18983 to access Solr GUI" {{- end }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/_helpers.tpl b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/_helpers.tpl index 89b7aec2f02..c3808a65dec 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/_helpers.tpl +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/_helpers.tpl @@ -113,3 +113,43 @@ pvc-{{ include "opencga.fullname" . }}-variants pvc-{{ include "opencga.fullname" . }}-analysisconf {{- end -}} + + + + +{{- define "mongodb.replicaSet" -}} +{{- if .Values.mongodb.deploy.enabled -}} + {{- .Values.mongodb.deploy.name }} +{{- end -}} +{{- end -}} + +{{- define "mongodb.hosts" -}} +{{- if .Values.mongodb.deploy.enabled -}} + {{- $name := .Values.mongodb.deploy.name -}} + {{- $namespace := .Release.Namespace -}} + {{- range $i := until ( int .Values.mongodb.deploy.replicas ) }} + {{- if ne $i 0 -}} + , + {{- end -}} + {{- cat $name "-" $i "." $name "-svc." $namespace ":27017" | replace " " "" -}} + {{- end -}} +{{- else -}} + {{- .Values.mongodb.external.hosts }} +{{- end -}} +{{- end -}} + + +{{- define "solrHosts" -}} +{{- if .Values.solr.deploy.enabled -}} + {{- $name := .Values.solr.deploy.name -}} + {{- $namespace := .Release.Namespace -}} + {{- range $i := until ( int .Values.solr.deploy.zookeeper.replicas ) }} + {{- if ne $i 0 -}} + , + {{- end -}} + {{- cat $name "-solrcloud-zookeeper-" $i "." $name "-solrcloud-zookeeper-headless." $namespace ":2181" | replace " " "" -}} + {{- end -}} +{{- else -}} + {{- .Values.solr.external.hosts }} +{{- end -}} +{{- end -}} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml index cea789de222..aa62eb97360 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml @@ -54,28 +54,14 @@ spec: key: hdInsightSshPassword - name: "INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" value: "/home/{{ .Values.hadoop.sshUsername }}/opencga/" - - name: "INIT_SEARCH_HOSTS" - {{- if .Values.deploySolr }} - value: http://opencga-solr-svc:8983 - {{- else }} - value: {{ .Values.solr.hosts | toString | quote }} - {{- end }} + value: {{ include "solrHosts" . | quote }} - name: "INIT_CATALOG_SEARCH_HOSTS" - {{- if .Values.deploySolr }} - value: http://opencga-solr-svc:8983 - {{- else }} - value: {{ .Values.solr.hosts | toString | quote }} - {{- end }} + value: {{ include "solrHosts" . | quote }} - name: "INIT_CLINICAL_HOSTS" - value: {{ .Values.solr.hosts | toString | quote}} - + value: {{ include "solrHosts" . | toString | quote }} - name: "INIT_CATALOG_DATABASE_HOSTS" - {{- if .Values.deployMongo }} - value: opencga-mongodb-replicaset - {{- else }} - value: {{ .Values.mongodb.hosts | toString | quote}} - {{- end }} + value: {{ include "mongodb.hosts" . | quote }} - name: "INIT_CATALOG_DATABASE_USER" value: {{ .Values.mongodb.user }} - name: "INIT_CATALOG_DATABASE_PASSWORD" @@ -84,7 +70,9 @@ spec: name: {{ include "opencga.secretName" . }} key: mongoDbPassword - name: "INIT_CATALOG_DATABASE_SSL" - value: {{ .Values.mongodb.ssl }} + value: {{ .Values.mongodb.ssl | toString | quote }} + - name: "INIT_CATALOG_DATABASE_REPLICA_SET" + value: {{ include "mongodb.replicaSet" . | toString | quote }} - name: "INIT_CATALOG_DATABASE_AUTHENTICATION_MECHANISM" value: {{ .Values.mongodb.authenticationMechanism }} - name: "INIT_CATALOG_DATABASE_AUTHENTICATION_DATABASE" diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/mongodb/mongodb-password-secret.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/mongodb/mongodb-password-secret.yaml new file mode 100644 index 00000000000..e0341c0bb54 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/mongodb/mongodb-password-secret.yaml @@ -0,0 +1,9 @@ +# the user credentials will be generated from this secret +# once the credentials are generated, this secret is no longer required +apiVersion: v1 +kind: Secret +metadata: + name: mongodb-user-password +type: Opaque +stringData: + password: {{ .Values.mongodb.password }} \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/mongodb/mongodb-replicaset.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/mongodb/mongodb-replicaset.yaml new file mode 100644 index 00000000000..74640f4e271 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/mongodb/mongodb-replicaset.yaml @@ -0,0 +1,66 @@ +{{- if .Values.mongodb.deploy.enabled -}} +apiVersion: mongodbcommunity.mongodb.com/v1 +kind: MongoDBCommunity +metadata: + name: {{ .Values.mongodb.deploy.name }} +spec: + members: {{ int .Values.mongodb.deploy.replicas }} + type: ReplicaSet + version: {{ .Values.mongodb.deploy.version }} + security: + authentication: + ignoreUnknownUsers: true # users can be added to the deployment through other sources. (not through the CRD) and will not be removed by the agent. + modes: ["SCRAM"] +# tls: +# enabled: true +# certificateKeySecretRef: +# name: tls-secret-name +# caConfigMapRef: +# name: tls-ca-configmap-name + statefulSet: + spec: + template: + spec: + # resources can be specified by applying an override + # per container name. + containers: + - name: mongod + resources: + {{- toYaml .Values.mongodb.deploy.resources | nindent 16 }} + - name: mongodb-agent + resources: + limits: + cpu: "0.2" + memory: 250M + requests: + cpu: "0.2" + memory: 200M + resources: + {{- toYaml .Values.mongodb.deploy.resources | nindent 12 }} + nodeSelector: + {{- toYaml .Values.mongodb.deploy.nodeSelector | nindent 12 }} + volumeClaimTemplates: + - metadata: + name: data-volume + spec: + resources: + requests: + storage: {{ .Values.mongodb.deploy.volume.size }} + + users: + - name: {{ .Values.mongodb.user }} + db: admin + passwordSecretRef: # a reference to the secret that will be used to generate the user's password + name: mongodb-user-password + roles: + - name: root + db: admin + - name: clusterAdmin + db: admin + - name: dbAdminAnyDatabase + db: admin + scramCredentialsSecretName: my-scram + additionalMongodConfig: +# replication.replSetName: rs0 + storage.wiredTiger.engineConfig.journalCompressor: zlib +{{- end -}} \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/solr/solr-cloud.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/solr/solr-cloud.yaml new file mode 100644 index 00000000000..7a79cfa5e1c --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/solr/solr-cloud.yaml @@ -0,0 +1,107 @@ +{{- if .Values.solr.deploy.enabled -}} +apiVersion: solr.bloomberg.com/v1beta1 +#apiVersion: solr.apache.org/v1beta1 +kind: SolrCloud +metadata: + name: {{ .Values.solr.deploy.name }} +spec: + dataStorage: + persistent: + reclaimPolicy: Delete + pvcTemplate: + spec: + resources: + requests: + storage: {{ .Values.solr.deploy.volume.size }} +# backupRestoreOptions: +# volume: +# persistentVolumeClaim: +# claimName: "pvc-test" + replicas: {{ .Values.solr.deploy.replicas }} + solrImage: +# repository: {{ .Values.solr.deploy.image.repository }} + tag: {{ .Values.solr.deploy.image.tag }} +# imagePullSecret: {{ .Values.solr.deploy.image.imagePullSecret }} + + solrJavaMem: {{ .Values.solr.deploy.javaMem }} + solrOpts: {{ .Values.solr.deploy.opts }} + solrGCTune: {{ .Values.solr.deploy.GCTune }} + +# solrAddressability: {} +# external: +# method: Ingress +# domainName: {{ .Values.solr.deploy.domainName }} + updateStrategy: + managed: + maxPodsUnavailable: 1 + + + customSolrKubeOptions: + podOptions: + resources: + {{- toYaml .Values.solr.deploy.resources | nindent 8 }} + nodeSelector: + {{- toYaml .Values.solr.deploy.nodeSelector | nindent 8 }} + initContainers: #Additional init containers to run in the pod. These will run along with the init container that sets up the "solr.xml" + - name: opencga-copy-configset + securityContext: + {{- toYaml .Values.init.securityContext | nindent 12 }} + image: {{ tpl .Values.init.image.repository . | quote }} + imagePullPolicy: {{ .Values.init.image.pullPolicy | quote }} + volumeMounts: + - name: opencgaconfigsets + mountPath: /opencga-solr-configsets + command: [ "/bin/sh", "-c" ] + args: + - "mkdir -p /opencga-solr-configsets/misc/ && cp -r /opt/opencga/misc/solr/ /opencga-solr-configsets/misc/ && touch /opencga-solr-configsets/READY" + +# sidecarContainers: #Sidecar containers to run in the pod. These are in addition to the Solr Container + - name: opencga-load-configset + securityContext: + {{- toYaml .Values.init.securityContext | nindent 12 }} + image: "{{ .Values.solr.deploy.image.repository }}:{{ .Values.solr.deploy.image.tag }}" + imagePullPolicy: {{ .Values.init.image.pullPolicy | quote }} + env: + - name: SOLR_HOME + value: /opt/solr + - name: ZK_HOST + value: {{ include "solrHosts" . | quote }} + volumeMounts: + - name: opencgaconfigsets + mountPath: /opencga-solr-configsets + command: [ "/bin/bash", "-c" ] + args: + - "while [ ! -f /opencga-solr-configsets/READY ] ; do echo 'Waiting for the configsets' ; sleep 1 ; done ; ls -lR /opencga-solr-configsets/; /opencga-solr-configsets/misc/solr/install.sh $ZK_HOST $SOLR_HOME /opencga-solr-configsets/" + + + #envVars: Additional environment variables to pass to the default container. + #podSecurityContext: PodSecurityContext is the security context for the pod. + #sidecarContainers: Sidecar containers to run in the pod. These are in addition to the Solr Container + volumes: # Additional non-data volumes to load into the default container + - name: opencgaconfigsets + defaultContainerMount: + # Default container mount is not actually needed, but the solr-operator will throw a "nil pointer exception" if missing + name: opencgaconfigsets + mountPath: /opencga-solr-configsets + source: + emptyDir: + sizeLimit: 1G + + # The information for the Zookeeper this SolrCloud should connect to Can be a zookeeper that is running, or one that is created by the solr operator + zookeeperRef: + provided: + chroot: "/" + persistence: + spec: +# storageClassName: "hostpath" + storageClassName: "default" + resources: + requests: + storage: {{ .Values.solr.deploy.zookeeper.volume.size }} + replicas: {{ .Values.solr.deploy.zookeeper.replicas }} + zookeeperPodPolicy: + resources: + {{- toYaml .Values.solr.deploy.zookeeper.resources | nindent 10 }} + nodeSelector: + {{- toYaml .Values.solr.deploy.zookeeper.nodeSelector | nindent 10 }} +{{- end -}} \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/solr/solr-load-configsets-job.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/solr/solr-load-configsets-job.yaml new file mode 100644 index 00000000000..5f7159b5614 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/solr/solr-load-configsets-job.yaml @@ -0,0 +1,55 @@ +{{/* +apiVersion: batch/v1 +kind: Job +metadata: + name: "{{.Release.Name}}-solr-install-configsets-job" + labels: + {{- include "opencga.selectorLabels" . | nindent 4 }} + annotations: + # This is what defines this resource as a hook. Without this line, the + # job is considered part of the release. + "helm.sh/hook": post-upgrade + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": hook-succeeded +spec: + template: + metadata: + name: "{{.Release.Name}}-solr-install-configsets-job" + labels: + {{- include "opencga.selectorLabels" . | nindent 8 }} + spec: + restartPolicy: Never + containers: #Additional init containers to run in the pod. These will run along with the init container that sets up the "solr.xml" + - name: opencga-extract-configset + securityContext: + {{- toYaml .Values.init.securityContext | nindent 12 }} + image: {{ tpl .Values.init.image.repository . | quote }} + imagePullPolicy: {{ .Values.init.image.pullPolicy | quote }} + volumeMounts: + - name: opencgaconfigsets + mountPath: /opencga-solr-configsets + command: [ "/bin/sh", "-c" ] + args: + - "mkdir -p /opencga-solr-configsets/misc/ && cp -r /opt/opencga/misc/solr/ /opencga-solr-configsets/misc/ && touch /opencga-solr-configsets/READY" + + # sidecarContainers: #Sidecar containers to run in the pod. These are in addition to the Solr Container + - name: opencga-load-configset + securityContext: + {{- toYaml .Values.init.securityContext | nindent 12 }} + image: "{{ .Values.solr.deploy.image.repository }}:{{ .Values.solr.deploy.image.tag }}" + imagePullPolicy: {{ .Values.init.image.pullPolicy | quote }} + env: + - name: SOLR_HOME + value: /opt/solr + - name: ZK_HOST + value: {{ include "solrHosts" . | quote }} + volumeMounts: + - name: opencgaconfigsets + mountPath: /opencga-solr-configsets + command: [ "/bin/bash", "-c" ] + args: + - "while [ ! -f /opencga-solr-configsets/READY ] ; do echo 'Waiting for the configsets' ; sleep 1 ; done ; ls -lR /opencga-solr-configsets/; /opencga-solr-configsets/misc/solr/install.sh $ZK_HOST $SOLR_HOME /opencga-solr-configsets/" + volumes: # Additional non-data volumes to load into the default container + - name: opencgaconfigsets + emptyDir: {} +*/}} \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index 5042e2468d1..578ffc0695f 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -2,17 +2,83 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. -deploySolr: false -deployMongo: false - mongodb: - hosts: "FILL_ME" user: "FILL_ME" password: "FILL_ME" ssl: true authenticationDatabase : "admin" authenticationMechanism : "SCRAM-SHA-1" + # MongoDB can either be deployed in the same Kubernetes instance, or be provided externally. + + external: + hosts: "FILL_ME" + + # https://docs.mongodb.com/kubernetes-operator/stable/tutorial/resize-pv-storage/ + deploy: + enabled: false + name: "rs0" + version: "4.2.6" + replicas: 3 + + volume: + size: "128Gi" + + resources: + limits: + cpu: "2" + memory: "10G" + requests: + cpu: "1" + memory: "8G" + + nodeSelector: + agentpool: mongodb + +solr: + external: + hosts: "FILL_ME" + deploy: + enabled: false + name: "solr" + replicas: 2 + + image: + repository: "library/solr" # TODO: Value not supported yet + tag: 8.7.0 + imagePullSecret: "" # TODO: Value not supported yet + + javaMem: "-Xms1g -Xmx3g" + opts: "-Dsolr.autoSoftCommit.maxTime=10000" + GCTune: "-XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=8" + + volume: + size: "512Gi" + + resources: + limits: + memory: "1G" + requests: + cpu: "65m" + memory: "156Mi" + + nodeSelector: + agentpool: solr + + zookeeper: + replicas: 2 + volume: + size: "5Gi" + resources: + limits: + memory: "1G" + requests: + cpu: "65m" + memory: "156Mi" + + nodeSelector: + agentpool: solr + cellbase: host: "http://ws.opencb.org/cellbase/" @@ -26,9 +92,6 @@ analysis: k8s: masterNode: "FILL_ME" -solr: - hosts: "FILL_ME" - hadoop: sshDns: "FILL_ME" sshUsername: "FILL_ME" diff --git a/opencga-app/app/cloud/kubernetes/setup-k8s.sh b/opencga-app/app/cloud/kubernetes/setup-k8s.sh index e051a6adec4..5eda09ee7d0 100755 --- a/opencga-app/app/cloud/kubernetes/setup-k8s.sh +++ b/opencga-app/app/cloud/kubernetes/setup-k8s.sh @@ -5,6 +5,9 @@ set -e function printUsage() { echo "" echo "Deploy required Helm charts for a fully working OpenCGA installation" + echo " - solr-operator" + echo " - zk-operator" + echo " - mongodb-operator" echo " - opencga-nginx" echo " - opencga" echo " - iva" @@ -162,8 +165,8 @@ function configureContext() { kubectl config use-context "$K8S_CONTEXT" # Create a namespace for opencga - if ! kubectl get namespace "${K8S_NAMESPACE}"; then - kubectl create namespace "${K8S_NAMESPACE}" + if ! kubectl get namespace "${K8S_NAMESPACE}" --context "$K8S_CONTEXT"; then + kubectl create namespace "${K8S_NAMESPACE}" --context "$K8S_CONTEXT" fi kubectl config set-context "${K8S_CONTEXT}" --namespace="${K8S_NAMESPACE}" @@ -172,24 +175,74 @@ function configureContext() { function deployNginx() { # Use Helm to deploy an NGINX ingress controller ## Deploy in the same namespace + ## https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-helm/ - helm repo add stable https://kubernetes-charts.storage.googleapis.com/ +# helm repo add stable https://kubernetes-charts.storage.googleapis.com/ +# helm repo add nginx-stable https://helm.nginx.com/stable + helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update NAME="opencga-nginx${NAME_SUFFIX}" echo "# Deploy NGINX ${NAME}" - helm upgrade ${NAME} stable/nginx-ingress \ - --kube-context "${K8S_CONTEXT}" --namespace "${K8S_NAMESPACE}" --version 1.27.0 \ + helm upgrade ${NAME} ingress-nginx/ingress-nginx \ + --kube-context "${K8S_CONTEXT}" --namespace "${K8S_NAMESPACE}" \ -f charts/nginx/values.yaml \ --values "${HELM_VALUES_FILE}" \ --install --wait --timeout 10m ${HELM_OPTS} } +function deployZkOperator() { + # https://github.com/pravega/zookeeper-operator/tree/master/charts/zookeeper#installing-the-chart + # Manual installation of ZK operator. Won't be needed when using solr-operator v0.3.0 + # See https://github.com/apache/solr-operator/pull/231 + + NAME="zk-operator" + helm repo add pravega https://charts.pravega.io + helm repo update + + helm upgrade ${NAME} pravega/zookeeper-operator \ + --kube-context "${K8S_CONTEXT}" --namespace "${K8S_NAMESPACE}" --version=v0.2.9 \ + --install --wait --timeout 10m ${HELM_OPTS} +} + +function deploySolrOperator() { + # Solr operator version 0.2.8 and below was developed by bloomberg. + # Since version 0.3.0 (TBA), the operator was moved to apache fundation. + # See https://github.com/apache/solr-operator/issues/183 + + # https://artifacthub.io/packages/helm/apache-solr/solr-operator + # https://github.com/apache/solr-operator/tree/master/helm/solr-operator + NAME="solr-operator" + #helm repo add solr-operator https://bloomberg.github.io/solr-operator/charts + helm repo add apache-solr https://solr.apache.org/charts + + SOLR_OPERATOR_VERSION="v0.2.8" + + helm upgrade ${NAME} apache-solr/solr-operator \ + --kube-context "${K8S_CONTEXT}" --namespace "${K8S_NAMESPACE}" --version "${SOLR_OPERATOR_VERSION}" \ + -f charts/solr/values.yaml \ + --values "${HELM_VALUES_FILE}" \ + --install --wait --timeout 10m ${HELM_OPTS} +} + +function deployMongodbOperator() { + NAME="mongodb-operator${NAME_SUFFIX}" + DATE=$(date "+%Y%m%d%H%M%S") + ./charts/mongodb-operator/fetch-mongodb-operator-files.sh + + helm upgrade "${NAME}" charts/mongodb-operator \ + --values "${HELM_VALUES_FILE}" \ + --install --wait --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" --timeout 10m ${HELM_OPTS} + if [ $DRY_RUN == "false" ]; then + helm get manifest "${NAME}" --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" >"${OUTPUT_DIR}/helm-${NAME}-manifest-${DATE}.yaml" + fi +} + function deployOpenCGA() { + DATE=$(date "+%Y%m%d%H%M%S") if [[ -n "$OPENCGA_CONF_DIR" ]]; then NAME="opencga${NAME_SUFFIX}" echo "# Deploy OpenCGA ${NAME}" - DATE=$(date "+%Y%m%d%H%M%S") OPENCGA_CHART="${OUTPUT_DIR:?}/${NAME}_${DATE}_tmp/" if [ $KEEP_TMP_FILES == "false" ]; then trap 'rm -rf "${OPENCGA_CHART:?}"' EXIT @@ -215,11 +268,12 @@ function deployOpenCGA() { function deployIVA() { NAME="iva${NAME_SUFFIX}" echo "# Deploy IVA ${NAME}" + DATE=$(date "+%Y%m%d%H%M%S") helm upgrade ${NAME} charts/iva \ --values "${HELM_VALUES_FILE}" \ --install --wait --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" --timeout 10m ${HELM_OPTS} if [ $DRY_RUN == "false" ]; then - helm get manifest "${NAME}" --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" > "${OUTPUT_DIR}/helm-${NAME}-manifest-$(date "+%Y%m%d%H%M%S").yaml" + helm get manifest "${NAME}" --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" >"${OUTPUT_DIR}/helm-${NAME}-manifest-${DATE}.yaml" fi } @@ -231,6 +285,18 @@ if [[ "$WHAT" == "NGINX" || "$WHAT" == "ALL" ]]; then deployNginx fi +if [[ "$WHAT" == "SOLROPERATOR" || "$WHAT" == "ALL" ]]; then + deploySolrOperator +fi + +if [[ "$WHAT" == "ZKOPERATOR" || "$WHAT" == "ALL" ]]; then + deployZkOperator +fi + +if [[ "$WHAT" == "MONGODBOPERATOR" || "$WHAT" == "ALL" ]]; then + deployMongodbOperator +fi + if [[ "$WHAT" == "OPENCGA" || "$WHAT" == "ALL" ]]; then deployOpenCGA fi From 15fe52c64302595dd7f8b294f350c5c26017303e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 16 Apr 2021 11:53:22 +0100 Subject: [PATCH 192/412] k8s: Remove configuration param INIT_MAX_CONCURRENT_JOBS --- opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh | 3 --- opencga-app/app/cloud/docker/opencga-init/override_yaml.py | 2 +- .../kubernetes/charts/opencga/templates/master-deployment.yaml | 2 -- opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml | 3 --- 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh index ee147e38041..17a51280ce0 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh @@ -158,9 +158,6 @@ analysis: options: k8s: masterNode: "https://$(getOutput "aksApiServerAddress"):443" - index: - variant: - maxConcurrentJobs: "100" rest: ingress: diff --git a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py index 141d8deadbe..1bbaabd7c69 100644 --- a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py +++ b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py @@ -127,7 +127,7 @@ config["catalog"]["database"]["password"] = args.catalog_database_password config["catalog"]["database"]["options"]["sslEnabled"] = args.catalog_database_ssl config["catalog"]["database"]["options"]["sslInvalidCertificatesAllowed"] = True -if args.catalog_database_replica_set is not None: +if args.catalog_database_replica_set is not None and args.catalog_database_replica_set != "": config["catalog"]["database"]["options"]["replicaSet"] = args.catalog_database_replica_set if args.catalog_database_authentication_database is not None: config["catalog"]["database"]["options"]["authenticationDatabase"] = args.catalog_database_authentication_database diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml index aa62eb97360..3f71f08ae02 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml @@ -97,8 +97,6 @@ spec: value: {{ include "pvcAnalysisconf" . | quote }} - name: "INIT_ANALYSIS_EXECUTION_MODE" value: {{ .Values.analysis.execution.id | quote }} - - name: "INIT_MAX_CONCURRENT_JOBS" - value: {{ .Values.analysis.index.variant.maxConcurrentJobs | quote }} volumeMounts: - name: default-conf mountPath: /opt/opencga/default-conf diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index 578ffc0695f..4647e139cef 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -83,9 +83,6 @@ cellbase: host: "http://ws.opencb.org/cellbase/" analysis: - index: - variant: - maxConcurrentJobs: 100 execution: id: "k8s" options: From f73e2061ebb437cba2f099f75f8e49a19d78a189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 16 Apr 2021 13:02:06 +0200 Subject: [PATCH 193/412] analysis: improve alignment stats analysis by including plot-bamstats images; create the Dockerfile for the samtools docker image that includes gnuplot necessary to run plot-bamstats, #1739 --- .../alignment/AlignmentStorageManager.java | 41 +- .../alignment/qc/AlignmentStatsAnalysis.java | 139 ++++ .../qc/SampleQcLocalAnalysisExecutor.java | 64 +- .../opencga/analysis/tools/OpenCgaTool.java | 3 + .../analysis/tools/ToolExecutorFactory.java | 7 +- .../analysis/wrappers/BwaWrapperAnalysis.java | 14 +- .../wrappers/DeeptoolsWrapperAnalysis.java | 18 +- .../DockerWrapperAnalysisExecutor.java | 78 +++ .../wrappers/FastqcWrapperAnalysis.java | 15 +- .../wrappers/GatkWrapperAnalysis.java | 14 +- .../wrappers/OpenCgaWrapperAnalysis.java | 48 +- .../wrappers/PicardWrapperAnalysis.java | 17 +- .../wrappers/PlinkWrapperAnalysis.java | 14 +- .../wrappers/RvtestsWrapperAnalysis.java | 12 +- .../wrappers/SamtoolsWrapperAnalysis.java | 596 ----------------- .../FastqcWrapperAnalysisExecutor.java | 65 +- .../OpenCgaWrapperAnalysisExecutor.java | 129 ++-- .../PicardWrapperAnalysisExecutor.java | 338 +++++----- .../SamtoolsWrapperAnalysisExecutor.java | 100 --- .../samtools/SamtoolsWrapperAnalysis.java | 601 ++++++++++++++++++ .../SamtoolsWrapperAnalysisExecutor.java | 493 ++++++++++++++ .../wrappers/WrapperAnalysisTest.java | 1 + opencga-app/app/cloud/docker/docker-build.py | 2 +- .../cloud/docker/opencga-samtools/Dockerfile | 58 ++ .../executors/AlignmentCommandExecutor.java | 34 +- .../options/AlignmentCommandOptions.java | 22 + .../analysis/AlignmentCommandExecutor.java | 16 +- ...ignment-samtools-flagstat-variableset.json | 210 ++++++ .../opencga/core/api/ParamConstants.java | 3 +- .../alignment/AlignmentQualityControl.java | 101 +++ .../alignment/AlignmentStatsParams.java | 18 +- .../monitor/daemons/ExecutionDaemon.java | 1 + .../rest/analysis/AlignmentWebService.java | 40 +- .../rest/analysis/VariantWebService.java | 1 + 34 files changed, 2208 insertions(+), 1105 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DockerWrapperAnalysisExecutor.java delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/SamtoolsWrapperAnalysis.java delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/SamtoolsWrapperAnalysisExecutor.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java create mode 100644 opencga-app/app/cloud/docker/opencga-samtools/Dockerfile create mode 100644 opencga-catalog/src/main/resources/variablesets/alignment-samtools-flagstat-variableset.json create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java index 461fefd6a55..4627a3d12fa 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java @@ -37,7 +37,7 @@ import org.opencb.opencga.analysis.models.FileInfo; import org.opencb.opencga.analysis.models.StudyInfo; import org.opencb.opencga.analysis.wrappers.DeeptoolsWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.SamtoolsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -153,22 +153,45 @@ public AlignmentIterator iterator(String studyIdStr, String fileIdStr, Qu //------------------------------------------------------------------------- public void statsRun(String study, String inputFile, String outdir, String token) throws ToolException { +// ObjectMap params = new ObjectMap(); +// +// AlignmentStatsAnalysis analysis = new AlignmentStatsAnalysis(); +// analysis.setUp(null, catalogManager, storageEngineFactory, params, Paths.get(outdir), jobId, token); +// +// analysis.setStudy(study) +// .setFile(inputFile) +// .start(); +// +// params.put(SamtoolsWrapperAnalysis.INDEX_STATS_PARAM, true); +// +// // Filter flag: +// // - not primary alignment (0x100) +// // - read fails platform/vendor quality checks (0x200) +// // - supplementary alignment (0x800) +// params.put("F", "0xB00"); +// +// SamtoolsWrapperAnalysis samtools = new SamtoolsWrapperAnalysis(); +// samtools.setUp(null, catalogManager, storageEngineFactory, params, Paths.get(outdir), jobId, token); +// +// samtools.setStudy(study); +// samtools.setCommand("stats") +// .setInputFile(inputFile) +// .setOutputFilename(Paths.get(inputFile).getFileName() + ".stats.txt"); +// +// samtools.start(); + } + + public void flagStatsRun(String study, String inputFile, String outdir, String token) throws ToolException { ObjectMap params = new ObjectMap(); params.put(SamtoolsWrapperAnalysis.INDEX_STATS_PARAM, true); - // Filter flag: - // - not primary alignment (0x100) - // - read fails platform/vendor quality checks (0x200) - // - supplementary alignment (0x800) - params.put("F", "0xB00"); - SamtoolsWrapperAnalysis samtools = new SamtoolsWrapperAnalysis(); samtools.setUp(null, catalogManager, storageEngineFactory, params, Paths.get(outdir), jobId, token); samtools.setStudy(study); - samtools.setCommand("stats") + samtools.setCommand("flagstats") .setInputFile(inputFile) - .setOutputFilename(Paths.get(inputFile).getFileName() + ".stats.txt"); + .setOutputFilename(Paths.get(inputFile).getFileName() + ".flagstats.txt"); samtools.start(); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java new file mode 100644 index 00000000000..b8ab5f0cfb1 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java @@ -0,0 +1,139 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.alignment.qc; + +import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysisExecutor; +import org.opencb.opencga.catalog.db.api.FileDBAdaptor; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; + +import java.io.FileInputStream; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; + +import static org.apache.commons.io.FileUtils.readLines; +import static org.opencb.opencga.core.api.ParamConstants.ALIGNMENT_STATS_DESCRIPTION; +import static org.opencb.opencga.core.tools.OpenCgaToolExecutor.EXECUTOR_ID; + +@Tool(id = AlignmentStatsAnalysis.ID, resource = Enums.Resource.ALIGNMENT) +public class AlignmentStatsAnalysis extends OpenCgaToolScopeStudy { + + public static final String ID = "alignment-stats"; + public static final String DESCRIPTION = ALIGNMENT_STATS_DESCRIPTION; + + private static final String SAMTOOLS_STATS_STEP = "samtools-stats"; + private static final String PLOT_BAMSTATS_STEP = "plot-bamstats"; + private static final String SAVE_ALIGNMENT_STATS_STEP = "save-alignment-stats"; + +// public final static String SUFFIX_FILENAME = ".genomePlot.png"; + + @ToolParams + protected final AlignmentStatsParams analysisParams = new AlignmentStatsParams(); + + private File catalogBamFile; + + @Override + protected void check() throws Exception { + super.check(); + + if (StringUtils.isEmpty(getStudy())) { + throw new ToolException("Missing study"); + } + + if (StringUtils.isEmpty(analysisParams.getFile())) { + throw new ToolException("Missing file"); + } + + Query query = new Query(FileDBAdaptor.QueryParams.ID.key(), analysisParams.getFile()); + query.put(FileDBAdaptor.QueryParams.FORMAT.key(), File.Format.BAM); + OpenCGAResult fileResult = catalogManager.getFileManager().search(getStudy(), query, QueryOptions.empty(), token); + if (fileResult.getNumResults() != 1) { + throw new ToolException("File " + analysisParams.getFile() + " must be a BAM file in study " + getStudy()); + } + + catalogBamFile = fileResult.getResults().get(0); + } + + @Override + protected List getSteps() { + List steps = new ArrayList<>(); + steps.add(SAMTOOLS_STATS_STEP); + steps.add(PLOT_BAMSTATS_STEP); + steps.add(SAVE_ALIGNMENT_STATS_STEP); + return steps; + } + + @Override + protected void run() throws ToolException { + + setUpStorageEngineExecutor(study); + + Path statsFile = getOutDir().resolve(new java.io.File(catalogBamFile.getUri().getPath()).getName() + ".stats.txt"); + + step(SAMTOOLS_STATS_STEP, () -> { + executorParams.put(EXECUTOR_ID, SamtoolsWrapperAnalysisExecutor.ID); + getToolExecutor(SamtoolsWrapperAnalysisExecutor.class) + .setCommand("stats") + .setInputFile(catalogBamFile.getUri().getPath()) + .execute(); + }); + + step(PLOT_BAMSTATS_STEP, () -> { + executorParams.put(EXECUTOR_ID, SamtoolsWrapperAnalysisExecutor.ID); + getToolExecutor(SamtoolsWrapperAnalysisExecutor.class) + .setCommand("plot-bamstats") + .setInputFile(getOutDir().resolve(statsFile.toFile().getName()).toString()) + .execute(); + }); + + step(SAVE_ALIGNMENT_STATS_STEP, () -> { + List lines = readLines(statsFile.toFile(), Charset.defaultCharset()); + if (lines.size() > 0 && lines.get(0).startsWith("# This file was produced by samtools stats")) { + SamtoolsStats alignmentStats = SamtoolsWrapperAnalysis.parseSamtoolsStats(statsFile.toFile(), catalogBamFile.getId()); + + for (java.io.File file : getOutDir().toFile().listFiles()) { + if (file.getName().endsWith("png")) { + FileInputStream fileInputStreamReader = new FileInputStream(file); + byte[] bytes = new byte[(int) file.length()]; + fileInputStreamReader.read(bytes); + + String img = new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); +// System.out.println(file.getName()); +// System.out.println(img); + } + } + + // TODO: save stats and images inside the File data model + } + }); + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java index 9cd6445efb2..1d1cfd99ce7 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java @@ -21,15 +21,11 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.formats.alignment.picard.HsMetrics; import org.opencb.biodata.formats.alignment.picard.io.HsMetricsParser; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; -import org.opencb.biodata.formats.sequence.fastqc.FastQc; import org.opencb.biodata.models.alignment.GeneCoverageStats; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.AnalysisUtils; import org.opencb.opencga.analysis.StorageToolExecutor; -import org.opencb.opencga.analysis.wrappers.executors.FastqcWrapperAnalysisExecutor; import org.opencb.opencga.analysis.wrappers.executors.PicardWrapperAnalysisExecutor; -import org.opencb.opencga.analysis.wrappers.executors.SamtoolsWrapperAnalysisExecutor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.exceptions.ToolException; @@ -84,36 +80,36 @@ public void run() throws ToolException { } private void runFlagStats() throws ToolException { - if (alignmentQcMetrics.getSamtoolsFlagstats() != null) { - // Samtools flag stats already exists! - addWarning("Skipping samtools/flagstat analysis: it was already computed"); - return; - } - - // Check BAM file - if (catalogBamFile == null) { - addWarning("Skipping samtools/flagstat analysis: no BAM file was provided"); - return; - } - - ObjectMap params = new ObjectMap(); - - Path outDir = getOutDir().resolve("flagstat"); - Path scratchDir = outDir.resolve("scratch"); - scratchDir.toFile().mkdirs(); - - SamtoolsWrapperAnalysisExecutor executor = new SamtoolsWrapperAnalysisExecutor(getStudyId(), params, outDir, scratchDir, - catalogManager, getToken()); - - executor.setCommand("flagstat"); - executor.setBamFile(catalogBamFile.getId()); - executor.run(); - - // Check for result - SamtoolsFlagstats flagtats = executor.getFlagstatsResult(); - if (flagtats != null) { - alignmentQcMetrics.setSamtoolsFlagstats(flagtats); - } +// if (alignmentQcMetrics.getSamtoolsFlagstats() != null) { +// // Samtools flag stats already exists! +// addWarning("Skipping samtools/flagstat analysis: it was already computed"); +// return; +// } +// +// // Check BAM file +// if (catalogBamFile == null) { +// addWarning("Skipping samtools/flagstat analysis: no BAM file was provided"); +// return; +// } +// +// ObjectMap params = new ObjectMap(); +// +// Path outDir = getOutDir().resolve("flagstat"); +// Path scratchDir = outDir.resolve("scratch"); +// scratchDir.toFile().mkdirs(); +// +// SamtoolsWrapperAnalysisExecutor executor = new SamtoolsWrapperAnalysisExecutor(getStudyId(), params, outDir, scratchDir, +// catalogManager, getToken()); +// +// executor.setCommand("flagstat"); +// executor.setBamFile(catalogBamFile.getId()); +// executor.run(); +// +// // Check for result +// SamtoolsFlagstats flagtats = executor.getFlagstatsResult(); +// if (flagtats != null) { +// alignmentQcMetrics.setSamtoolsFlagstats(flagtats); +// } } private void runHsMetrics() throws ToolException { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java index 7afe81b975d..e37af8ae837 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/OpenCgaTool.java @@ -492,6 +492,9 @@ protected final T getToolExecutor(Class clazz if (StringUtils.isEmpty(executorId) && params != null) { executorId = params.getString(EXECUTOR_ID); } + + System.out.println("getToolExecutor ::: " + clazz + ", " + executorId); + System.out.println(executorParams.toJson()); return getToolExecutor(clazz, executorId); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/ToolExecutorFactory.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/ToolExecutorFactory.java index 82df6aeed61..e5ef2e921f6 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/ToolExecutorFactory.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/ToolExecutorFactory.java @@ -128,9 +128,10 @@ private boolean isValidClass(String toolId, String toolExecutorId, Class if (annotation == null) { return false; } - if (!annotation.tool().equals(toolId)) { - return false; - } + // JT commented it to allow tools to call any executor (even executors from other tools) +// if (!annotation.tool().equals(toolId)) { +// return false; +// } if (StringUtils.isNotEmpty(toolExecutorId) && !toolExecutorId.equals(annotation.id())) { return false; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/BwaWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/BwaWrapperAnalysis.java index 74441250dac..8fea04aeb7e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/BwaWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/BwaWrapperAnalysis.java @@ -21,10 +21,10 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.exec.Command; import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.tools.annotations.Tool; import java.io.DataOutputStream; import java.io.File; @@ -147,12 +147,12 @@ protected void run() throws Exception { }); } - @Override - public String getDockerImageName() { - return BWA_DOCKER_IMAGE; - } +// @Override +// public String getDockerImageName() { +// return BWA_DOCKER_IMAGE; +// } - @Override +// @Override public String getCommandLine() throws ToolException { StringBuilder sb = new StringBuilder("docker run "); @@ -167,7 +167,7 @@ public String getCommandLine() throws ToolException { .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); // Docker image and version - sb.append(getDockerImageName()); + sb.append(BWA_DOCKER_IMAGE); if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DeeptoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DeeptoolsWrapperAnalysis.java index 36e4a4c4938..52495b988d0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DeeptoolsWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DeeptoolsWrapperAnalysis.java @@ -18,14 +18,10 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.exec.Command; -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.tools.annotations.Tool; import java.io.DataOutputStream; import java.io.File; @@ -125,12 +121,12 @@ protected void run() throws Exception { }); } - @Override - public String getDockerImageName() { - return DEEPTOOLS_DOCKER_IMAGE; - } +// @Override +// public String getDockerImageName() { +// return DEEPTOOLS_DOCKER_IMAGE; +// } - @Override +// @Override public String getCommandLine() throws ToolException { StringBuilder sb = new StringBuilder("docker run "); @@ -142,7 +138,7 @@ public String getCommandLine() throws ToolException { .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); // Docker image and version - sb.append(getDockerImageName()); + sb.append(DEEPTOOLS_DOCKER_IMAGE); if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DockerWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DockerWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..83ac9286b65 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DockerWrapperAnalysisExecutor.java @@ -0,0 +1,78 @@ +package org.opencb.opencga.analysis.wrappers; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.tools.OpenCgaToolExecutor; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import static org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis.INDEX_STATS_PARAM; + +public abstract class DockerWrapperAnalysisExecutor extends OpenCgaToolExecutor { + + public final static String DOCKER_INPUT_PATH = "/data/input"; + public final static String DOCKER_OUTPUT_PATH = "/data/output"; + + public static final String STDOUT_FILENAME = "stdout.txt"; + public static final String STDERR_FILENAME = "stderr.txt"; + + protected boolean isValidParameter(String param) { + switch (param) { + case "opencgaHome": + case "token": + case "storageEngineId": + case "dbName": + case "executorId": + return false; + } + return true; + } + + protected Map getDockerMountMap(List inputFilenames) { + Map dockerMountMap = new HashMap<>(); + + // Mount input dirs + if (CollectionUtils.isNotEmpty(inputFilenames)) { + // Pair: key = name of the parameter; value = full path to the file + for (String inputFilename : inputFilenames) { + if (StringUtils.isNotEmpty(inputFilename)) { + File file = new File(inputFilename); + String src = file.getParentFile().getAbsolutePath(); + if (!dockerMountMap.containsKey(src)) { + dockerMountMap.put(src, DOCKER_INPUT_PATH + dockerMountMap.size()); + } + } + } + } + + return dockerMountMap; + } + + protected StringBuilder initDockerCommandLine(Map dockerMountingMap, String dockerImageName, + String dockerImageVersion) { + StringBuilder sb = new StringBuilder("docker run --log-driver=none -a stdin -a stdout -a stderr "); + + // Mount input dir + for (Map.Entry entry : dockerMountingMap.entrySet()) { + sb.append("--mount type=bind,source=\"").append(entry.getKey()).append("\",target=\"").append(entry.getValue()).append("\" "); + } + + // Mount output dir + sb.append("--mount type=bind,source=\"").append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH) + .append("\" "); + + + sb.append(dockerImageName); + if (StringUtils.isNotEmpty(dockerImageVersion)) { + sb.append(":").append(dockerImageVersion); + } + + return sb; + } +} \ No newline at end of file diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/FastqcWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/FastqcWrapperAnalysis.java index 9ea65813506..67949b111c7 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/FastqcWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/FastqcWrapperAnalysis.java @@ -19,20 +19,15 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.commons.exec.Command; import org.opencb.opencga.analysis.wrappers.executors.FastqcWrapperAnalysisExecutor; -import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.tools.annotations.Tool; -import java.io.DataOutputStream; import java.io.File; -import java.io.FileOutputStream; import java.nio.charset.Charset; import java.nio.file.Files; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; @Tool(id = FastqcWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = FastqcWrapperAnalysis.DESCRIPTION) @@ -96,8 +91,8 @@ public FastqcWrapperAnalysis setFile(String file) { return this; } - @Override - public String getDockerImageName() { - return null; - } +// @Override +// public String getDockerImageName() { +// return null; +// } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/GatkWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/GatkWrapperAnalysis.java index 560190f796f..abd9929c328 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/GatkWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/GatkWrapperAnalysis.java @@ -19,9 +19,9 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.exec.Command; -import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.tools.annotations.Tool; import java.io.DataOutputStream; import java.io.File; @@ -107,12 +107,12 @@ protected void run() throws Exception { }); } - @Override - public String getDockerImageName() { - return GATK_DOCKER_IMAGE; - } +// @Override +// public String getDockerImageName() { +// return GATK_DOCKER_IMAGE; +// } - @Override +// @Override public String getCommandLine() throws ToolException { StringBuilder sb = new StringBuilder("docker run "); @@ -125,7 +125,7 @@ public String getCommandLine() throws ToolException { .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); // Docker image and version - sb.append(getDockerImageName()); + sb.append(GATK_DOCKER_IMAGE); if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java index 5a76488cce9..3bfed8ca9ea 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java @@ -42,30 +42,30 @@ public abstract class OpenCgaWrapperAnalysis extends OpenCgaTool { protected Map fileUriMap = new HashMap<>(); - @Deprecated - public abstract String getDockerImageName(); - - protected String getCommandLine() throws ToolException { - return getCommandLine("--"); - } - - protected String getCommandLine(String prefix) { - StringBuilder sb = new StringBuilder(); - sb.append("run docker ").append(getDockerImageName()); - for (String key : params.keySet()) { - String value = params.getString(key); - sb.append(" ").append(prefix).append(key); - if (StringUtils.isNotEmpty(value)) { - sb.append(" ").append(value); - } - } - return sb.toString(); - } - - protected String getCatalogPath(String inputFile) throws ToolException { -// return new File(getCatalogFile(inputFile).getPath()).getParent(); - return getCatalogFile(inputFile).getPath(); - } +// @Deprecated +// public abstract String getDockerImageName(); + +// protected String getCommandLine() throws ToolException { +// return getCommandLine("--"); +// } +// +// protected String getCommandLine(String prefix) { +// StringBuilder sb = new StringBuilder(); +// sb.append("run docker ").append(getDockerImageName()); +// for (String key : params.keySet()) { +// String value = params.getString(key); +// sb.append(" ").append(prefix).append(key); +// if (StringUtils.isNotEmpty(value)) { +// sb.append(" ").append(value); +// } +// } +// return sb.toString(); +// } +// +// protected String getCatalogPath(String inputFile) throws ToolException { +//// return new File(getCatalogFile(inputFile).getPath()).getParent(); +// return getCatalogFile(inputFile).getPath(); +// } protected org.opencb.opencga.core.models.file.File getCatalogFile(String inputFile) throws ToolException { // Get catalog path diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PicardWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PicardWrapperAnalysis.java index 73599a6fd47..cfdacd3ed10 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PicardWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PicardWrapperAnalysis.java @@ -17,20 +17,11 @@ package org.opencb.opencga.analysis.wrappers; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.opencb.commons.exec.Command; import org.opencb.opencga.analysis.wrappers.executors.PicardWrapperAnalysisExecutor; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.tools.annotations.Tool; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.util.*; - @Tool(id = PicardWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = "") public class PicardWrapperAnalysis extends OpenCgaWrapperAnalysis { @@ -74,10 +65,10 @@ protected void run() throws Exception { ); } - @Override - public String getDockerImageName() { - return PICARD_DOCKER_IMAGE; - } +// @Override +// public String getDockerImageName() { +// return PICARD_DOCKER_IMAGE; +// } public String getCommand() { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PlinkWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PlinkWrapperAnalysis.java index 0df8c7599ba..09659421676 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PlinkWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PlinkWrapperAnalysis.java @@ -19,9 +19,9 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.exec.Command; -import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.tools.annotations.Tool; import java.io.DataOutputStream; import java.io.File; @@ -74,12 +74,12 @@ protected void run() throws Exception { }); } - @Override - public String getDockerImageName() { - return PLINK_DOCKER_IMAGE; - } +// @Override +// public String getDockerImageName() { +// return PLINK_DOCKER_IMAGE; +// } - @Override +// @Override public String getCommandLine() { StringBuilder sb = new StringBuilder("docker run "); @@ -99,7 +99,7 @@ public String getCommandLine() { .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); // Docker image and version - sb.append(getDockerImageName()); + sb.append(PLINK_DOCKER_IMAGE); if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/RvtestsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/RvtestsWrapperAnalysis.java index 164c6e48d5e..97014aa9151 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/RvtestsWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/RvtestsWrapperAnalysis.java @@ -94,12 +94,12 @@ protected void run() throws Exception { }); } - @Override - public String getDockerImageName() { - return RVTESTS_DOCKER_IMAGE; - } +// @Override +// public String getDockerImageName() { +// return RVTESTS_DOCKER_IMAGE; +// } - @Override +// @Override public String getCommandLine() { StringBuilder sb = new StringBuilder("docker run "); @@ -119,7 +119,7 @@ public String getCommandLine() { .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); // Docker image and version - sb.append(getDockerImageName()); + sb.append(RVTESTS_DOCKER_IMAGE); if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/SamtoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/SamtoolsWrapperAnalysis.java deleted file mode 100644 index 2c5eea1e620..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/SamtoolsWrapperAnalysis.java +++ /dev/null @@ -1,596 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.analysis.wrappers; - -import com.google.common.base.CaseFormat; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.commons.exec.Command; -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.core.common.JacksonUtils; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.common.AnnotationSet; -import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.file.FileUpdateParams; -import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.core.tools.annotations.Tool; - -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.apache.commons.io.FileUtils.readLines; -import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMANDS; -import static org.opencb.opencga.storage.core.alignment.AlignmentStorageEngine.ALIGNMENT_STATS_VARIABLE_SET; - -@Tool(id = SamtoolsWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = SamtoolsWrapperAnalysis.DESCRIPTION) -public class SamtoolsWrapperAnalysis extends OpenCgaWrapperAnalysis { - - public final static String ID = "samtools"; - public final static String DESCRIPTION = "Samtools is a program for interacting with high-throughput sequencing data in SAM, BAM" - + " and CRAM formats."; - - public final static String SAMTOOLS_DOCKER_IMAGE = "zlskidmore/samtools"; - - public static final String INDEX_STATS_PARAM = "stats-index"; - - private String command; - private String inputFile; - private String outputFilename; - private String referenceFile; - private String readGroupFile; - private String bedFile; - private String refSeqFile; - private String referenceNamesFile; - private String targetRegionFile; - private String readsNotSelectedFilename; - - private File outputFile; - private org.opencb.opencga.core.models.file.File inputCatalogFile; - - protected void check() throws Exception { - super.check(); - - OpenCGAResult fileResult; - try { - fileResult = catalogManager.getFileManager().get(getStudy(), inputFile, QueryOptions.empty(), token); - } catch (CatalogException e) { - throw new ToolException("Error accessing file '" + inputFile + "' of the study " + getStudy() + "'", e); - } - if (fileResult.getNumResults() <= 0) { - throw new ToolException("File '" + inputFile + "' not found in study '" + getStudy() + "'"); - } - inputCatalogFile = fileResult.getResults().get(0); - - if (StringUtils.isEmpty(command)) { - throw new ToolException("Missing samtools command. Supported commands are 'sort', 'index' and 'view'"); - } - - switch (command) { - case "dict": - case "faidx": - case "view": - case "sort": - case "index": - case "stats": - case "depth": - break; - default: - // TODO: support the remaining samtools commands - throw new ToolException("Samtools command '" + command + "' is not available. Supported commands are " - + SAMTOOLS_COMMANDS); - } - - if (StringUtils.isEmpty(inputFile)) { - throw new ToolException("Missing input file when executing 'samtools " + command + "'."); - } - - if (StringUtils.isEmpty(outputFilename)) { - String prefix = Paths.get(inputCatalogFile.getUri().getPath()).toFile().getName(); - switch (command) { - case "index": { - if (prefix.endsWith("cram")) { - outputFilename = prefix + ".crai"; - } else { - outputFilename = prefix + ".bai"; - } - break; - } - case "faidx": { - outputFilename = prefix + ".fai"; - break; - } - case "dict": { - outputFilename = prefix + ".dict"; - break; - } - case "stats": { - outputFilename = prefix + ".stats.txt"; - break; - } - case "depth": { - outputFilename = prefix + ".depth.txt"; - break; - } - default: { - throw new ToolException("Missing output file name when executing 'samtools " + command + "'."); - } - } - } - - // Set output file to use further - outputFile = getOutDir().resolve(outputFilename).toFile(); - } - - @Override - protected void run() throws Exception { - step(() -> { - String commandLine = getCommandLine(); - logger.info("Samtools command line: " + commandLine); - try { - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - Command cmd = new Command(getCommandLine()) - .setOutputOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDOUT_FILENAME).toFile()))) - .setErrorOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDERR_FILENAME).toFile()))); - - cmd.run(); - - // Check samtools errors - boolean success = false; - switch (command) { - case "dict": - case "index": - case "sort": - case "view": { - if (outputFile.exists()) { - success = true; - - if (!"view".equals(command)) { - String catalogPath = getCatalogPath(inputFile); - File file = new File(fileUriMap.get(inputFile).getPath()); - - Path src = outputFile.toPath(); - Path dest = new File(file.getParent()).toPath(); - - moveFile(getStudy(), src, dest, catalogPath, token); - } - } - break; - } - case "faidx": { - File file = new File(fileUriMap.get(inputFile).getPath()); - File faidxFile = file.getParentFile().toPath().resolve(file.getName() + ".fai").toFile(); - success = isValidFile(faidxFile); - if (success) { - String catalogPath = getCatalogPath(inputFile); - catalogManager.getFileManager().link(getStudy(), faidxFile.toURI(), catalogPath, new ObjectMap("parents", true), - token); - } - break; - } - case "stats": { - File file = getScratchDir().resolve(STDOUT_FILENAME).toFile(); - List lines = readLines(file, Charset.defaultCharset()); - if (lines.size() > 0 && lines.get(0).startsWith("# This file was produced by samtools stats")) { - FileUtils.copyFile(file, outputFile); - if (params.containsKey(INDEX_STATS_PARAM) && params.getBoolean(INDEX_STATS_PARAM) && !isIndexed()) { - SamtoolsStats alignmentStats = parseSamtoolsStats(outputFile); - indexStats(alignmentStats); - } - success = true; - } - break; - } - case "depth": { - File file = new File(getScratchDir() + "/" + STDOUT_FILENAME); - if (file.exists() && file.length() > 0) { - FileUtils.copyFile(file, outputFile); - success = true; - } - break; - } - } - - if (!success) { - File file = getScratchDir().resolve(STDERR_FILENAME).toFile(); - String msg = "Something wrong happened when executing Samtools"; - if (file.exists()) { - msg = StringUtils.join(readLines(file, Charset.defaultCharset()), ". "); - } - throw new ToolException(msg); - } - } catch (Exception e) { - throw new ToolException(e); - } - }); - } - - @Override - public String getDockerImageName() { - return SAMTOOLS_DOCKER_IMAGE; - } - - @Override - public String getCommandLine() throws ToolException { - StringBuilder sb = new StringBuilder("docker run "); - - // Mount management - Map srcTargetMap = new HashMap<>(); - updateFileMaps(inputFile, sb, fileUriMap, srcTargetMap); - updateFileMaps(referenceFile, sb, fileUriMap, srcTargetMap); - updateFileMaps(readGroupFile, sb, fileUriMap, srcTargetMap); - updateFileMaps(bedFile, sb, fileUriMap, srcTargetMap); - updateFileMaps(referenceNamesFile, sb, fileUriMap, srcTargetMap); - updateFileMaps(targetRegionFile, sb, fileUriMap, srcTargetMap); - updateFileMaps(refSeqFile, sb, fileUriMap, srcTargetMap); - - sb.append("--mount type=bind,source=\"") - .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); - - // Docker image and version - sb.append(getDockerImageName()); - if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { - sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); - } - - // Samtools command - sb.append(" samtools ").append(command); - - // Samtools options - for (String param : params.keySet()) { - if (checkParam(param)) { - String sep = param.length() == 1 ? " -" : " --"; - String value = params.getString(param); - if (StringUtils.isEmpty(value)) { - sb.append(sep).append(param); - } else { - switch (value.toLowerCase()) { - case "false": - // Nothing to do - break; - case "null": - case "true": - // Only param must be appended - sb.append(sep).append(param); - break; - default: - // Otherwise, param + value must be appended - sb.append(sep).append(param).append(" ").append(value); - break; - } - } - } - } - - File file; - switch (command) { - case "depth": { - if (StringUtils.isNotEmpty(referenceFile)) { - file = new File(fileUriMap.get(referenceFile).getPath()); - sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - if (StringUtils.isNotEmpty(bedFile)) { - file = new File(fileUriMap.get(bedFile).getPath()); - sb.append(" -b ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - file = new File(fileUriMap.get(inputFile).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "faidx": { - file = new File(fileUriMap.get(inputFile).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "stats": { - if (StringUtils.isNotEmpty(referenceFile)) { - file = new File(fileUriMap.get(referenceFile).getPath()); - sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - if (StringUtils.isNotEmpty(targetRegionFile)) { - file = new File(fileUriMap.get(targetRegionFile).getPath()); - sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - if (StringUtils.isNotEmpty(refSeqFile)) { - file = new File(fileUriMap.get(refSeqFile).getPath()); - sb.append(" --ref-seq ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - file = new File(fileUriMap.get(inputFile).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "index": { - file = new File(fileUriMap.get(inputFile).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - sb.append(" ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); - break; - } - case "dict": { - sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); - - file = new File(fileUriMap.get(inputFile).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "sort": { - if (StringUtils.isNotEmpty(referenceFile)) { - file = new File(fileUriMap.get(referenceFile).getPath()); - sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); - - file = new File(fileUriMap.get(inputFile).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "view": { - if (StringUtils.isNotEmpty(referenceFile)) { - file = new File(fileUriMap.get(referenceFile).getPath()); - sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - if (StringUtils.isNotEmpty(bedFile)) { - file = new File(fileUriMap.get(bedFile).getPath()); - sb.append(" -L ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - if (StringUtils.isNotEmpty(readGroupFile)) { - file = new File(fileUriMap.get(readGroupFile).getPath()); - sb.append(" -R ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - if (StringUtils.isNotEmpty(readsNotSelectedFilename)) { - sb.append(" -U ").append(DOCKER_OUTPUT_PATH).append("/").append(readsNotSelectedFilename); - } - if (StringUtils.isNotEmpty(referenceNamesFile)) { - file = new File(fileUriMap.get(referenceNamesFile).getPath()); - sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); - - file = new File(fileUriMap.get(inputFile).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - } - - return sb.toString(); - } - - private boolean checkParam(String param) { - if (param.equals(DOCKER_IMAGE_VERSION_PARAM) || param.equals(INDEX_STATS_PARAM)) { - return false; - } else { - switch (command) { - case "dict": { - if ("o".equals(param)) { - return false; - } - break; - } - case "view": { - switch (param) { - case "t": - case "L": - case "U": - case "R": - case "T": - case "reference": - case "o": { - return false; - } - } - break; - } - case "stats": { - switch (param) { - case "reference": - case "r": - case "ref-seq": - case "t": { - return false; - } - } - break; - } - case "sort": { - switch (param) { - case "reference": - case "o": { - return false; - } - } - break; - } - case "depth": { - switch (param) { - case "b": - case "reference": { - return false; - } - } - break; - } - } - return true; - } - } - - private SamtoolsStats parseSamtoolsStats(File file) throws IOException, ToolException, CatalogException { - // Create a map with the summary numbers of the statistics (samtools stats) - Map map = new HashMap<>(); - - int count = 0; - for (String line : readLines(file, Charset.defaultCharset())) { - // Only take into account the "SN" section (summary numbers) - if (line.startsWith("SN")) { - count++; - String[] splits = line.split("\t"); - String key = splits[1].replace("(cigar)", "cigar").split("\\(")[0].trim().replace("1st", "first").replace(":", "") - .replace(" ", "_").replace("-", "_"); - key = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, key); - String value = splits[2].split(" ")[0]; - map.put(key, value); - } else if (count > 0) { - // SN (summary numbers) section has been processed - break; - } - } - - // Convert map to AlignmentStats - SamtoolsStats alignmentStats = JacksonUtils.getDefaultObjectMapper().convertValue(map, SamtoolsStats.class); - - // Set file ID - alignmentStats.setFileId(inputCatalogFile.getId()); - - return alignmentStats; - } - - private void indexStats(SamtoolsStats alignmentStats) throws CatalogException, IOException { - // Convert AlignmentStats to map in order to create an AnnotationSet - Map annotations = JacksonUtils.getDefaultObjectMapper().convertValue(alignmentStats, Map.class); - AnnotationSet annotationSet = new AnnotationSet(ALIGNMENT_STATS_VARIABLE_SET, ALIGNMENT_STATS_VARIABLE_SET, annotations); - - // Update catalog - FileUpdateParams updateParams = new FileUpdateParams().setAnnotationSets(Collections.singletonList(annotationSet)); - catalogManager.getFileManager().update(getStudy(), inputCatalogFile.getId(), updateParams, QueryOptions.empty(), token); - } - - private boolean isIndexed() { - OpenCGAResult fileResult; - try { - fileResult = catalogManager.getFileManager().get(getStudy(), inputCatalogFile.getId(), QueryOptions.empty(), token); - - if (fileResult.getNumResults() == 1) { - for (AnnotationSet annotationSet : fileResult.getResults().get(0).getAnnotationSets()) { - if (ALIGNMENT_STATS_VARIABLE_SET.equals(annotationSet.getId())) { - return true; - } - } - } - } catch (CatalogException e) { - return false; - } - - return false; - } - - public String getCommand() { - return command; - } - - public SamtoolsWrapperAnalysis setCommand(String command) { - this.command = command; - return this; - } - - public String getInputFile() { - return inputFile; - } - - public SamtoolsWrapperAnalysis setInputFile(String inputFile) { - this.inputFile = inputFile; - return this; - } - - public String getOutputFilename() { - return outputFilename; - } - - public SamtoolsWrapperAnalysis setOutputFilename(String outputFilename) { - this.outputFilename = outputFilename; - return this; - } - - public String getReferenceFile() { - return referenceFile; - } - - public SamtoolsWrapperAnalysis setReferenceFile(String referenceFile) { - this.referenceFile = referenceFile; - return this; - } - - public String getReadGroupFile() { - return readGroupFile; - } - - public SamtoolsWrapperAnalysis setReadGroupFile(String readGroupFile) { - this.readGroupFile = readGroupFile; - return this; - } - - public String getBedFile() { - return bedFile; - } - - public SamtoolsWrapperAnalysis setBedFile(String bedFile) { - this.bedFile = bedFile; - return this; - } - - public String getReferenceNamesFile() { - return referenceNamesFile; - } - - public SamtoolsWrapperAnalysis setReferenceNamesFile(String referenceNamesFile) { - this.referenceNamesFile = referenceNamesFile; - return this; - } - - public String getTargetRegionFile() { - return targetRegionFile; - } - - public SamtoolsWrapperAnalysis setTargetRegionFile(String targetRegionFile) { - this.targetRegionFile = targetRegionFile; - return this; - } - - public String getRefSeqFile() { - return refSeqFile; - } - - public SamtoolsWrapperAnalysis setRefSeqFile(String refSeqFile) { - this.refSeqFile = refSeqFile; - return this; - } - - public String getReadsNotSelectedFilename() { - return readsNotSelectedFilename; - } - - public SamtoolsWrapperAnalysis setReadsNotSelectedFilename(String readsNotSelectedFilename) { - this.readsNotSelectedFilename = readsNotSelectedFilename; - return this; - } -} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java index d080e63bff9..d5fbdee8271 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java @@ -1,18 +1,14 @@ package org.opencb.opencga.analysis.wrappers.executors; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.opencb.biodata.formats.sequence.fastqc.FastQc; -import org.opencb.biodata.formats.sequence.fastqc.io.FastQcParser; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.wrappers.FastqcWrapperAnalysis; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.exceptions.ToolException; -import java.io.File; -import java.io.IOException; +import java.net.URISyntaxException; import java.nio.file.Path; import java.util.*; @@ -22,7 +18,7 @@ public class FastqcWrapperAnalysisExecutor extends OpenCgaWrapperAnalysisExecuto public FastqcWrapperAnalysisExecutor(String studyId, ObjectMap params, Path outDir, Path scratchDir, CatalogManager catalogManager, String token) { - super(studyId, params, outDir, scratchDir, catalogManager, token); +// super(studyId, params, outDir, scratchDir, catalogManager, token); sep = " "; shortPrefix = "-"; @@ -36,7 +32,11 @@ public void run() throws ToolException { // Append mounts List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", file))); Map srcTargetMap = new HashMap<>(); - appendMounts(inputFilenames, srcTargetMap, sb); + try { + appendMounts(inputFilenames, srcTargetMap, sb); + } catch (URISyntaxException e) { + throw new ToolException(e); + } // Append docker image, version and command appendCommand("", sb); @@ -57,33 +57,34 @@ public void run() throws ToolException { } public FastQc getResult() throws ToolException { - File[] files = outDir.toFile().listFiles(); - if (files != null) { - for (File file : files) { - if (file.getName().endsWith("_fastqc") && file.isDirectory()) { - try { - Path dataPath = file.toPath().resolve("fastqc_data.txt"); - return FastQcParser.parse(dataPath.toFile()); - } catch (IOException e) { - throw new ToolException(e); - } - } - } - } - String msg = "Something wrong when reading FastQC result.\n"; - try { - msg += StringUtils.join(FileUtils.readLines(scratchDir.resolve(getId() + ".stderr.txt").toFile()), "\n"); - } catch (IOException e) { - throw new ToolException(e); - } - - throw new ToolException(msg); + return null; +// File[] files = outDir.toFile().listFiles(); +// if (files != null) { +// for (File file : files) { +// if (file.getName().endsWith("_fastqc") && file.isDirectory()) { +// try { +// Path dataPath = file.toPath().resolve("fastqc_data.txt"); +// return FastQcParser.parse(dataPath.toFile()); +// } catch (IOException e) { +// throw new ToolException(e); +// } +// } +// } +// } +// String msg = "Something wrong when reading FastQC result.\n"; +// try { +// msg += StringUtils.join(FileUtils.readLines(scratchDir.resolve(getId() + ".stderr.txt").toFile()), "\n"); +// } catch (IOException e) { +// throw new ToolException(e); +// } +// +// throw new ToolException(msg); } - @Override - protected String getId() { - return FastqcWrapperAnalysis.ID; - } +// @Override +// protected String getId() { +// return FastqcWrapperAnalysis.ID; +// } @Override protected String getDockerImageName() { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/OpenCgaWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/OpenCgaWrapperAnalysisExecutor.java index d472e9776b7..3c76b0f90e1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/OpenCgaWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/OpenCgaWrapperAnalysisExecutor.java @@ -2,26 +2,22 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.exec.Command; -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.tools.OpenCgaToolExecutor; import java.io.DataOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.net.URI; +import java.net.URISyntaxException; import java.nio.file.Path; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; -public abstract class OpenCgaWrapperAnalysisExecutor { +public abstract class OpenCgaWrapperAnalysisExecutor extends OpenCgaToolExecutor { public final String DOCKER_IMAGE_VERSION_PARAM = "DOCKER_IMAGE_VERSION"; public final String DOCKER_INPUT_PATH = "/data/input"; @@ -31,35 +27,35 @@ public abstract class OpenCgaWrapperAnalysisExecutor { public final String STDERR_FILENAME = "stderr.txt"; protected String studyId; - protected Path outDir; +// protected Path outDir; protected Path scratchDir; - protected String token; +// protected String token; protected String sep; protected String shortPrefix; protected String longPrefix; - protected final ObjectMap params; +// protected final ObjectMap params; protected Map fileUriMap; - private CatalogManager catalogManager; +// private CatalogManager catalogManager; - public OpenCgaWrapperAnalysisExecutor(String studyId, ObjectMap params, Path outDir, Path scratchDir, CatalogManager catalogManager, - String token) { - this.studyId = studyId; - this.params = params; - this.outDir = outDir; - this.scratchDir = scratchDir; - this.catalogManager = catalogManager; - this.token = token; - - fileUriMap = new HashMap<>(); - } +// public OpenCgaWrapperAnalysisExecutor(String studyId, ObjectMap params, Path outDir, Path scratchDir, CatalogManager catalogManager, +// String token) { +// this.studyId = studyId; +// this.params = params; +// this.outDir = outDir; +// this.scratchDir = scratchDir; +// this.catalogManager = catalogManager; +// this.token = token; +// +// fileUriMap = new HashMap<>(); +// } public abstract void run() throws ToolException; - protected abstract String getId(); +// protected abstract String getId(); protected abstract String getDockerImageName(); @@ -67,7 +63,8 @@ protected StringBuilder initCommandLine() { return new StringBuilder("docker run --log-driver=none -a stdin -a stdout -a stderr "); } - protected void appendMounts(List> inputFilenames, Map srcTargetMap, StringBuilder sb) throws ToolException { + protected void appendMounts(List> inputFilenames, Map srcTargetMap, StringBuilder sb) + throws ToolException, URISyntaxException { // Mount input dirs for (Pair pair : inputFilenames) { updateFileMaps(pair.getValue(), sb, fileUriMap, srcTargetMap); @@ -81,8 +78,8 @@ protected void appendMounts(List> inputFilenames, Map> outputFilenames, Str } protected void appendOtherParams(Set skipParams, StringBuilder sb) { - for (String paramName : params.keySet()) { + for (String paramName : getExecutorParams().keySet()) { if (skipParams.contains(paramName)) { continue; } @@ -140,9 +137,9 @@ protected void appendOtherParams(Set skipParams, StringBuilder sb) { } sb.append(paramName).append(sep); } - String value = params.getString(paramName); + String value = getExecutorParams().getString(paramName); if (StringUtils.isNotEmpty(value) && !"true".equals(value)) { - sb.append(params.getString(paramName)); + sb.append(getExecutorParams().getString(paramName)); } } } @@ -161,28 +158,36 @@ protected void runCommandLine(String cmdline) throws ToolException { } } - protected void updateFileMaps(String filename, StringBuilder sb, Map fileUriMap, Map srcTargetMap) - throws ToolException { - if (StringUtils.isEmpty(filename)) { + protected void updateFileMaps(String src, StringBuilder sb, Map fileUriMap, Map srcTargetMap) + throws ToolException, URISyntaxException { + if (StringUtils.isEmpty(src)) { // Skip return; } - OpenCGAResult fileResult; - try { - fileResult = catalogManager.getFileManager().get(studyId, filename, QueryOptions.empty(), token); - } catch (CatalogException e) { - throw new ToolException("Error accessing file '" + filename + "' of the study " + studyId + "'", e); - } - if (fileResult.getNumResults() <= 0) { - throw new ToolException("File '" + filename + "' not found in study '" + studyId + "'"); - } - URI uri = fileResult.getResults().get(0).getUri(); - - if (StringUtils.isNotEmpty(uri.toString())) { - fileUriMap.put(filename, uri); +// URI uri; + File inputfile = new File(src); + if (inputfile.isAbsolute() && inputfile.exists()) { +// uri = inputfile.toURI(); +// filename = inputfile.getName(); +// +// } else { +// OpenCGAResult fileResult; +// try { +// fileResult = catalogManager.getFileManager().get(studyId, filename, QueryOptions.empty(), token); +// } catch (CatalogException e) { +// throw new ToolException("Error accessing file '" + filename + "' of the study " + studyId + "'", e); +// } +// if (fileResult.getNumResults() <= 0) { +// throw new ToolException("File '" + filename + "' not found in study '" + studyId + "'"); +// } +// uri = fileResult.getResults().get(0).getUri(); +// } + +// if (StringUtils.isNotEmpty(uri.toString())) { + fileUriMap.put(inputfile.getName(), new URI(src)); if (srcTargetMap != null) { - String src = new File(uri.getPath()).getParentFile().getAbsolutePath(); + //String src = new File(uri.getPath()).getParentFile().getAbsolutePath(); if (!srcTargetMap.containsKey(src)) { srcTargetMap.put(src, DOCKER_INPUT_PATH + srcTargetMap.size()); sb.append("--mount type=bind,source=\"").append(src).append("\",target=\"").append(srcTargetMap.get(src)).append("\" "); @@ -200,9 +205,9 @@ public OpenCgaWrapperAnalysisExecutor setStudyId(String studyId) { return this; } - public Path getOutDir() { - return outDir; - } +// public Path getOutDir() { +// return outDir; +// } public Path getScratchDir() { return scratchDir; @@ -213,19 +218,19 @@ public OpenCgaWrapperAnalysisExecutor setScratchDir(Path scratchDir) { return this; } - public OpenCgaWrapperAnalysisExecutor setOutDir(Path outDir) { - this.outDir = outDir; - return this; - } - - public CatalogManager getCatalogManager() { - return catalogManager; - } - - public OpenCgaWrapperAnalysisExecutor setCatalogManager(CatalogManager catalogManager) { - this.catalogManager = catalogManager; - return this; - } +// public OpenCgaWrapperAnalysisExecutor setOutDir(Path outDir) { +// this.outDir = outDir; +// return this; +// } +// +// public CatalogManager getCatalogManager() { +// return catalogManager; +// } +// +// public OpenCgaWrapperAnalysisExecutor setCatalogManager(CatalogManager catalogManager) { +// this.catalogManager = catalogManager; +// return this; +// } public String getSep() { return sep; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/PicardWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/PicardWrapperAnalysisExecutor.java index b2196d66732..03fd30800fa 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/PicardWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/PicardWrapperAnalysisExecutor.java @@ -1,8 +1,5 @@ package org.opencb.opencga.analysis.wrappers.executors; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.wrappers.PicardWrapperAnalysis; import org.opencb.opencga.catalog.managers.CatalogManager; @@ -10,7 +7,6 @@ import java.io.FileNotFoundException; import java.nio.file.Path; -import java.util.*; public class PicardWrapperAnalysisExecutor extends OpenCgaWrapperAnalysisExecutor { @@ -18,7 +14,7 @@ public class PicardWrapperAnalysisExecutor extends OpenCgaWrapperAnalysisExecuto public PicardWrapperAnalysisExecutor(String studyId, ObjectMap params, Path outDir, Path scratchDir, CatalogManager catalogManager, String token) { - super(studyId, params, outDir, scratchDir, catalogManager, token); +// super(studyId, params, outDir, scratchDir, catalogManager, token); this.sep = "="; this.shortPrefix = ""; this.longPrefix = ""; @@ -46,10 +42,10 @@ public void run() throws ToolException { } } - @Override - protected String getId() { - return PicardWrapperAnalysis.ID; - } +// @Override +// protected String getId() { +// return PicardWrapperAnalysis.ID; +// } @Override protected String getDockerImageName() { @@ -57,174 +53,174 @@ protected String getDockerImageName() { } private void runBedToIntervalList() throws ToolException { - String bedFilename = ""; - if (StringUtils.isNotEmpty(params.getString("INPUT"))) { - bedFilename = params.getString("INPUT"); - } else if (StringUtils.isNotEmpty(params.getString("I"))) { - bedFilename = params.getString("I"); - } - - String outFilename = ""; - if (StringUtils.isNotEmpty(params.getString("OUTPUT"))) { - outFilename = params.getString("OUTPUT"); - } else if (StringUtils.isNotEmpty(params.getString("O"))) { - outFilename = params.getString("O"); - } - - String dictFilename = ""; - if (StringUtils.isNotEmpty(params.getString("SEQUENCE_DICTIONARY"))) { - dictFilename = params.getString("SEQUENCE_DICTIONARY"); - } else if (StringUtils.isNotEmpty(params.getString("SD"))) { - dictFilename = params.getString("SD"); - } - - StringBuilder sb = initCommandLine(); - - // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", bedFilename), - new ImmutablePair<>("SD", dictFilename))); - Map srcTargetMap = new HashMap<>(); - appendMounts(inputFilenames, srcTargetMap, sb); - - // Append docker image, version and command - appendCommand("java -jar /usr/picard/picard.jar " + command, sb); - - // Append input file params - appendInputFiles(inputFilenames, srcTargetMap, sb); - - // Append output file params - List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", outFilename))); - appendOutputFiles(outputFilenames, sb); - - // Append other params - Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "SEQUENCE_DICTIONARY","SD")); - appendOtherParams(skipParams, sb); - - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - runCommandLine(sb.toString()); +// String bedFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("INPUT"))) { +// bedFilename = params.getString("INPUT"); +// } else if (StringUtils.isNotEmpty(params.getString("I"))) { +// bedFilename = params.getString("I"); +// } +// +// String outFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("OUTPUT"))) { +// outFilename = params.getString("OUTPUT"); +// } else if (StringUtils.isNotEmpty(params.getString("O"))) { +// outFilename = params.getString("O"); +// } +// +// String dictFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("SEQUENCE_DICTIONARY"))) { +// dictFilename = params.getString("SEQUENCE_DICTIONARY"); +// } else if (StringUtils.isNotEmpty(params.getString("SD"))) { +// dictFilename = params.getString("SD"); +// } +// +// StringBuilder sb = initCommandLine(); +// +// // Append mounts +// List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", bedFilename), +// new ImmutablePair<>("SD", dictFilename))); +// Map srcTargetMap = new HashMap<>(); +// appendMounts(inputFilenames, srcTargetMap, sb); +// +// // Append docker image, version and command +// appendCommand("java -jar /usr/picard/picard.jar " + command, sb); +// +// // Append input file params +// appendInputFiles(inputFilenames, srcTargetMap, sb); +// +// // Append output file params +// List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", outFilename))); +// appendOutputFiles(outputFilenames, sb); +// +// // Append other params +// Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "SEQUENCE_DICTIONARY","SD")); +// appendOtherParams(skipParams, sb); +// +// // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt +// runCommandLine(sb.toString()); } private void runCollectWgsMetrics() throws ToolException, FileNotFoundException { - String bamFilename = ""; - if (StringUtils.isNotEmpty(params.getString("INPUT"))) { - bamFilename = params.getString("INPUT"); - } else if (StringUtils.isNotEmpty(params.getString("I"))) { - bamFilename = params.getString("I"); - } - - String outFilename = ""; - if (StringUtils.isNotEmpty(params.getString("OUTPUT"))) { - outFilename = params.getString("OUTPUT"); - } else if (StringUtils.isNotEmpty(params.getString("O"))) { - outFilename = params.getString("O"); - } - - String refFilename = ""; - if (StringUtils.isNotEmpty(params.getString("REFERENCE_SEQUENCE"))) { - refFilename = params.getString("REFERENCE_SEQUENCE"); - } else if (StringUtils.isNotEmpty(params.getString("R"))) { - refFilename = params.getString("R"); - } - - StringBuilder sb = initCommandLine(); - - // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", bamFilename), - new ImmutablePair<>("R", refFilename))); - Map srcTargetMap = new HashMap<>(); - appendMounts(inputFilenames, srcTargetMap, sb); - - // Append docker image, version and command - appendCommand("java -jar /usr/picard/picard.jar " + command, sb); - - // Append input file params - appendInputFiles(inputFilenames, srcTargetMap, sb); - - // Append output file params - List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", outFilename))); - appendOutputFiles(outputFilenames, sb); - - // Append other params - Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "REFERENCE_SEQUENCE","R")); - appendOtherParams(skipParams, sb); - - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - runCommandLine(sb.toString()); +// String bamFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("INPUT"))) { +// bamFilename = params.getString("INPUT"); +// } else if (StringUtils.isNotEmpty(params.getString("I"))) { +// bamFilename = params.getString("I"); +// } +// +// String outFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("OUTPUT"))) { +// outFilename = params.getString("OUTPUT"); +// } else if (StringUtils.isNotEmpty(params.getString("O"))) { +// outFilename = params.getString("O"); +// } +// +// String refFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("REFERENCE_SEQUENCE"))) { +// refFilename = params.getString("REFERENCE_SEQUENCE"); +// } else if (StringUtils.isNotEmpty(params.getString("R"))) { +// refFilename = params.getString("R"); +// } +// +// StringBuilder sb = initCommandLine(); +// +// // Append mounts +// List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", bamFilename), +// new ImmutablePair<>("R", refFilename))); +// Map srcTargetMap = new HashMap<>(); +// appendMounts(inputFilenames, srcTargetMap, sb); +// +// // Append docker image, version and command +// appendCommand("java -jar /usr/picard/picard.jar " + command, sb); +// +// // Append input file params +// appendInputFiles(inputFilenames, srcTargetMap, sb); +// +// // Append output file params +// List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", outFilename))); +// appendOutputFiles(outputFilenames, sb); +// +// // Append other params +// Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "REFERENCE_SEQUENCE","R")); +// appendOtherParams(skipParams, sb); +// +// // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt +// runCommandLine(sb.toString()); } private void runCollectHsMetrics() throws ToolException, FileNotFoundException { - List> inputFilenames = new ArrayList<>(); - - String bamFilename = ""; - if (StringUtils.isNotEmpty(params.getString("INPUT"))) { - bamFilename = params.getString("INPUT"); - } else if (StringUtils.isNotEmpty(params.getString("I"))) { - bamFilename = params.getString("I"); - } - if (StringUtils.isNotEmpty(bamFilename)) { - inputFilenames.add(new ImmutablePair<>("I", bamFilename)); - } - - String outFilename = ""; - if (StringUtils.isNotEmpty(params.getString("OUTPUT"))) { - outFilename = params.getString("OUTPUT"); - } else if (StringUtils.isNotEmpty(params.getString("O"))) { - outFilename = params.getString("O"); - } - - String refFilename = ""; - if (StringUtils.isNotEmpty(params.getString("REFERENCE_SEQUENCE"))) { - refFilename = params.getString("REFERENCE_SEQUENCE"); - } else if (StringUtils.isNotEmpty(params.getString("R"))) { - refFilename = params.getString("R"); - } - if (StringUtils.isNotEmpty(refFilename)) { - inputFilenames.add(new ImmutablePair<>("R", refFilename)); - } - - String baitFilename = ""; - if (StringUtils.isNotEmpty(params.getString("BAIT_INTERVALS"))) { - baitFilename = params.getString("BAIT_INTERVALS"); - } else if (StringUtils.isNotEmpty(params.getString("BI"))) { - baitFilename = params.getString("BI"); - } - if (StringUtils.isNotEmpty(baitFilename)) { - inputFilenames.add(new ImmutablePair<>("BI", baitFilename)); - } - - String targetFilename = ""; - if (StringUtils.isNotEmpty(params.getString("TARGET_INTERVALS"))) { - targetFilename = params.getString("TARGET_INTERVALS"); - } else if (StringUtils.isNotEmpty(params.getString("TI"))) { - targetFilename = params.getString("TI"); - } - if (StringUtils.isNotEmpty(targetFilename)) { - inputFilenames.add(new ImmutablePair<>("TI", targetFilename)); - } - - StringBuilder sb = initCommandLine(); - - // Append mounts - Map srcTargetMap = new HashMap<>(); - appendMounts(inputFilenames, srcTargetMap, sb); - - // Append docker image, version and command - appendCommand("java -jar /usr/picard/picard.jar " + command, sb); - - // Append input file params - appendInputFiles(inputFilenames, srcTargetMap, sb); - - // Append output file params - List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", outFilename))); - appendOutputFiles(outputFilenames, sb); - - // Append other params - Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "BAIT_INTERVALS", "BI", "TARGET_INTERVALS", "TI", - "REFERENCE_SEQUENCE","R")); - appendOtherParams(skipParams, sb); - - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - runCommandLine(sb.toString()); +// List> inputFilenames = new ArrayList<>(); +// +// String bamFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("INPUT"))) { +// bamFilename = params.getString("INPUT"); +// } else if (StringUtils.isNotEmpty(params.getString("I"))) { +// bamFilename = params.getString("I"); +// } +// if (StringUtils.isNotEmpty(bamFilename)) { +// inputFilenames.add(new ImmutablePair<>("I", bamFilename)); +// } +// +// String outFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("OUTPUT"))) { +// outFilename = params.getString("OUTPUT"); +// } else if (StringUtils.isNotEmpty(params.getString("O"))) { +// outFilename = params.getString("O"); +// } +// +// String refFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("REFERENCE_SEQUENCE"))) { +// refFilename = params.getString("REFERENCE_SEQUENCE"); +// } else if (StringUtils.isNotEmpty(params.getString("R"))) { +// refFilename = params.getString("R"); +// } +// if (StringUtils.isNotEmpty(refFilename)) { +// inputFilenames.add(new ImmutablePair<>("R", refFilename)); +// } +// +// String baitFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("BAIT_INTERVALS"))) { +// baitFilename = params.getString("BAIT_INTERVALS"); +// } else if (StringUtils.isNotEmpty(params.getString("BI"))) { +// baitFilename = params.getString("BI"); +// } +// if (StringUtils.isNotEmpty(baitFilename)) { +// inputFilenames.add(new ImmutablePair<>("BI", baitFilename)); +// } +// +// String targetFilename = ""; +// if (StringUtils.isNotEmpty(params.getString("TARGET_INTERVALS"))) { +// targetFilename = params.getString("TARGET_INTERVALS"); +// } else if (StringUtils.isNotEmpty(params.getString("TI"))) { +// targetFilename = params.getString("TI"); +// } +// if (StringUtils.isNotEmpty(targetFilename)) { +// inputFilenames.add(new ImmutablePair<>("TI", targetFilename)); +// } +// +// StringBuilder sb = initCommandLine(); +// +// // Append mounts +// Map srcTargetMap = new HashMap<>(); +// appendMounts(inputFilenames, srcTargetMap, sb); +// +// // Append docker image, version and command +// appendCommand("java -jar /usr/picard/picard.jar " + command, sb); +// +// // Append input file params +// appendInputFiles(inputFilenames, srcTargetMap, sb); +// +// // Append output file params +// List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", outFilename))); +// appendOutputFiles(outputFilenames, sb); +// +// // Append other params +// Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "BAIT_INTERVALS", "BI", "TARGET_INTERVALS", "TI", +// "REFERENCE_SEQUENCE","R")); +// appendOtherParams(skipParams, sb); +// +// // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt +// runCommandLine(sb.toString()); } public String getCommand() { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/SamtoolsWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/SamtoolsWrapperAnalysisExecutor.java deleted file mode 100644 index d1769ed37c1..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/SamtoolsWrapperAnalysisExecutor.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.opencb.opencga.analysis.wrappers.executors; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; -import org.opencb.biodata.formats.alignment.samtools.io.SamtoolsFlagstatsParser; -import org.opencb.biodata.formats.sequence.fastqc.FastQc; -import org.opencb.biodata.formats.sequence.fastqc.io.FastQcParser; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.analysis.wrappers.FastqcWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.SamtoolsWrapperAnalysis; -import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.tools.annotations.Tool; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.*; - -public class SamtoolsWrapperAnalysisExecutor extends OpenCgaWrapperAnalysisExecutor { - - private String command; - private String bamFile; - - public SamtoolsWrapperAnalysisExecutor(String studyId, ObjectMap params, Path outDir, Path scratchDir, CatalogManager catalogManager, - String token) { - super(studyId, params, outDir, scratchDir, catalogManager, token); - - sep = " "; - shortPrefix = "-"; - longPrefix = "--"; - } - - @Override - public void run() throws ToolException { - StringBuilder sb = initCommandLine(); - - // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", bamFile))); - Map srcTargetMap = new HashMap<>(); - appendMounts(inputFilenames, srcTargetMap, sb); - - // Append docker image, version and command - appendCommand("samtools " + command, sb); - - // Append input file params - appendInputFiles(inputFilenames, srcTargetMap, sb); - - // Append other params - Set skipParams = new HashSet<>(Arrays.asList("o", "output")); - appendOtherParams(skipParams, sb); - - // Append output file params - List> outputFilenames = new ArrayList<>(); - appendOutputFiles(outputFilenames, sb); - - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - runCommandLine(sb.toString()); - } - - public SamtoolsFlagstats getFlagstatsResult() throws ToolException { - try { - Path path = getScratchDir().resolve(getId() + "." + STDOUT_FILENAME); - return SamtoolsFlagstatsParser.parse(path); - } catch (IOException e) { - throw new ToolException(e); - } - } - - @Override - protected String getId() { - return FastqcWrapperAnalysis.ID; - } - - @Override - protected String getDockerImageName() { - return SamtoolsWrapperAnalysis.SAMTOOLS_DOCKER_IMAGE; - } - - public String getCommand() { - return command; - } - - public SamtoolsWrapperAnalysisExecutor setCommand(String command) { - this.command = command; - return this; - } - - public String getBamFile() { - return bamFile; - } - - public SamtoolsWrapperAnalysisExecutor setBamFile(String bamFile) { - this.bamFile = bamFile; - return this; - } -} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java new file mode 100644 index 00000000000..bc38d9510ff --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java @@ -0,0 +1,601 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.wrappers.samtools; + +import com.google.common.base.CaseFormat; +import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis; +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.core.common.GitRepositoryState; +import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.common.AnnotationSet; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.file.FileUpdateParams; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.tools.annotations.Tool; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import static org.apache.commons.io.FileUtils.readLines; +import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMANDS; +import static org.opencb.opencga.storage.core.alignment.AlignmentStorageEngine.ALIGNMENT_STATS_VARIABLE_SET; + +@Tool(id = SamtoolsWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = SamtoolsWrapperAnalysis.DESCRIPTION) +public class SamtoolsWrapperAnalysis extends OpenCgaWrapperAnalysis { + + public final static String ID = "samtools"; + public final static String DESCRIPTION = "Samtools is a program for interacting with high-throughput sequencing data in SAM, BAM" + + " and CRAM formats."; + + public static final String INDEX_STATS_PARAM = "stats-index"; + + private String command; + private String inputFile; + private String outputFilename; + private String referenceFile; + private String readGroupFile; + private String bedFile; + private String refSeqFile; + private String referenceNamesFile; + private String targetRegionFile; + private String readsNotSelectedFilename; + + private File outputFile; + private org.opencb.opencga.core.models.file.File inputCatalogFile; + + protected void check() throws Exception { + super.check(); + + OpenCGAResult fileResult; + try { + fileResult = catalogManager.getFileManager().get(getStudy(), inputFile, QueryOptions.empty(), token); + } catch (CatalogException e) { + throw new ToolException("Error accessing file '" + inputFile + "' of the study " + getStudy() + "'", e); + } + if (fileResult.getNumResults() <= 0) { + throw new ToolException("File '" + inputFile + "' not found in study '" + getStudy() + "'"); + } + inputCatalogFile = fileResult.getResults().get(0); + + if (StringUtils.isEmpty(command)) { + throw new ToolException("Missing samtools command. Supported commands are 'sort', 'index' and 'view'"); + } + + switch (command) { + case "dict": + case "faidx": + case "view": + case "sort": + case "index": + case "stats": + case "depth": + break; + default: + // TODO: support the remaining samtools commands + throw new ToolException("Samtools command '" + command + "' is not available. Supported commands are " + + SAMTOOLS_COMMANDS); + } + + if (StringUtils.isEmpty(inputFile)) { + throw new ToolException("Missing input file when executing 'samtools " + command + "'."); + } + + if (StringUtils.isEmpty(outputFilename)) { + String prefix = Paths.get(inputCatalogFile.getUri().getPath()).toFile().getName(); + switch (command) { + case "index": { + if (prefix.endsWith("cram")) { + outputFilename = prefix + ".crai"; + } else { + outputFilename = prefix + ".bai"; + } + break; + } + case "faidx": { + outputFilename = prefix + ".fai"; + break; + } + case "dict": { + outputFilename = prefix + ".dict"; + break; + } + case "stats": { + outputFilename = prefix + ".stats.txt"; + break; + } + case "depth": { + outputFilename = prefix + ".depth.txt"; + break; + } + default: { + throw new ToolException("Missing output file name when executing 'samtools " + command + "'."); + } + } + } + + // Set output file to use further + outputFile = getOutDir().resolve(outputFilename).toFile(); + } + + @Override + protected void run() throws Exception { + step(getId(), () -> { + getToolExecutor(SamtoolsWrapperAnalysisExecutor.class); +// .run(); +// executor +// .setStudy(study) +// .setSampleName(sampleName) +// .setRefGenomePath(refGenomePath) +// .setMutationalSignaturePath(mutationalSignaturePath) +// .setOpenCgaHome(getOpencgaHome()) +// .execute(); + }); + +// step(() -> { +// String commandLine = getCommandLine(); +// logger.info("Samtools command line: " + commandLine); +// try { +// // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt +// Command cmd = new Command(getCommandLine()) +// .setOutputOutputStream( +// new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDOUT_FILENAME).toFile()))) +// .setErrorOutputStream( +// new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDERR_FILENAME).toFile()))); +// +// cmd.run(); +// +// // Check samtools errors +// boolean success = false; +// switch (command) { +// case "dict": +// case "index": +// case "sort": +// case "view": { +// if (outputFile.exists()) { +// success = true; +// +// if (!"view".equals(command)) { +// String catalogPath = getCatalogPath(inputFile); +// File file = new File(fileUriMap.get(inputFile).getPath()); +// +// Path src = outputFile.toPath(); +// Path dest = new File(file.getParent()).toPath(); +// +// moveFile(getStudy(), src, dest, catalogPath, token); +// } +// } +// break; +// } +// case "faidx": { +// File file = new File(fileUriMap.get(inputFile).getPath()); +// File faidxFile = file.getParentFile().toPath().resolve(file.getName() + ".fai").toFile(); +// success = isValidFile(faidxFile); +// if (success) { +// String catalogPath = getCatalogPath(inputFile); +// catalogManager.getFileManager().link(getStudy(), faidxFile.toURI(), catalogPath, new ObjectMap("parents", true), +// token); +// } +// break; +// } +// case "stats": { +// File file = getScratchDir().resolve(STDOUT_FILENAME).toFile(); +// List lines = readLines(file, Charset.defaultCharset()); +// if (lines.size() > 0 && lines.get(0).startsWith("# This file was produced by samtools stats")) { +// FileUtils.copyFile(file, outputFile); +// if (params.containsKey(INDEX_STATS_PARAM) && params.getBoolean(INDEX_STATS_PARAM) && !isIndexed()) { +// SamtoolsStats alignmentStats = parseSamtoolsStats(outputFile, inputCatalogFile.getId()); +// indexStats(alignmentStats); +// } +// success = true; +// } +// break; +// } +// case "depth": { +// File file = new File(getScratchDir() + "/" + STDOUT_FILENAME); +// if (file.exists() && file.length() > 0) { +// FileUtils.copyFile(file, outputFile); +// success = true; +// } +// break; +// } +// } +// +// if (!success) { +// File file = getScratchDir().resolve(STDERR_FILENAME).toFile(); +// String msg = "Something wrong happened when executing Samtools"; +// if (file.exists()) { +// msg = StringUtils.join(readLines(file, Charset.defaultCharset()), ". "); +// } +// throw new ToolException(msg); +// } +// } catch (Exception e) { +// throw new ToolException(e); +// } +// }); + } + +// @Override +// public String getDockerImageName() { +// return SAMTOOLS_DOCKER_IMAGE; +// } +// +// @Override +// public String getCommandLine() throws ToolException { +// StringBuilder sb = new StringBuilder("docker run "); +// +// // Mount management +// Map srcTargetMap = new HashMap<>(); +// updateFileMaps(inputFile, sb, fileUriMap, srcTargetMap); +// updateFileMaps(referenceFile, sb, fileUriMap, srcTargetMap); +// updateFileMaps(readGroupFile, sb, fileUriMap, srcTargetMap); +// updateFileMaps(bedFile, sb, fileUriMap, srcTargetMap); +// updateFileMaps(referenceNamesFile, sb, fileUriMap, srcTargetMap); +// updateFileMaps(targetRegionFile, sb, fileUriMap, srcTargetMap); +// updateFileMaps(refSeqFile, sb, fileUriMap, srcTargetMap); +// +// sb.append("--mount type=bind,source=\"") +// .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); +// +// // Docker image and version +// sb.append(getDockerImageName()); +// if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { +// sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); +// } +// +// // Samtools command +// sb.append(" samtools ").append(command); +// +// // Samtools options +// for (String param : params.keySet()) { +// if (checkParam(param)) { +// String sep = param.length() == 1 ? " -" : " --"; +// String value = params.getString(param); +// if (StringUtils.isEmpty(value)) { +// sb.append(sep).append(param); +// } else { +// switch (value.toLowerCase()) { +// case "false": +// // Nothing to do +// break; +// case "null": +// case "true": +// // Only param must be appended +// sb.append(sep).append(param); +// break; +// default: +// // Otherwise, param + value must be appended +// sb.append(sep).append(param).append(" ").append(value); +// break; +// } +// } +// } +// } +// +// File file; +// switch (command) { +// case "depth": { +// if (StringUtils.isNotEmpty(referenceFile)) { +// file = new File(fileUriMap.get(referenceFile).getPath()); +// sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") +// .append(file.getName()); +// } +// if (StringUtils.isNotEmpty(bedFile)) { +// file = new File(fileUriMap.get(bedFile).getPath()); +// sb.append(" -b ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// } +// file = new File(fileUriMap.get(inputFile).getPath()); +// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// break; +// } +// case "faidx": { +// file = new File(fileUriMap.get(inputFile).getPath()); +// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// break; +// } +// case "stats": { +// if (StringUtils.isNotEmpty(referenceFile)) { +// file = new File(fileUriMap.get(referenceFile).getPath()); +// sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") +// .append(file.getName()); +// } +// if (StringUtils.isNotEmpty(targetRegionFile)) { +// file = new File(fileUriMap.get(targetRegionFile).getPath()); +// sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// } +// if (StringUtils.isNotEmpty(refSeqFile)) { +// file = new File(fileUriMap.get(refSeqFile).getPath()); +// sb.append(" --ref-seq ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") +// .append(file.getName()); +// } +// file = new File(fileUriMap.get(inputFile).getPath()); +// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// break; +// } +// case "index": { +// file = new File(fileUriMap.get(inputFile).getPath()); +// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// sb.append(" ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); +// break; +// } +// case "dict": { +// sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); +// +// file = new File(fileUriMap.get(inputFile).getPath()); +// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// break; +// } +// case "sort": { +// if (StringUtils.isNotEmpty(referenceFile)) { +// file = new File(fileUriMap.get(referenceFile).getPath()); +// sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") +// .append(file.getName()); +// } +// sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); +// +// file = new File(fileUriMap.get(inputFile).getPath()); +// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// break; +// } +// case "view": { +// if (StringUtils.isNotEmpty(referenceFile)) { +// file = new File(fileUriMap.get(referenceFile).getPath()); +// sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") +// .append(file.getName()); +// } +// if (StringUtils.isNotEmpty(bedFile)) { +// file = new File(fileUriMap.get(bedFile).getPath()); +// sb.append(" -L ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// } +// if (StringUtils.isNotEmpty(readGroupFile)) { +// file = new File(fileUriMap.get(readGroupFile).getPath()); +// sb.append(" -R ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// } +// if (StringUtils.isNotEmpty(readsNotSelectedFilename)) { +// sb.append(" -U ").append(DOCKER_OUTPUT_PATH).append("/").append(readsNotSelectedFilename); +// } +// if (StringUtils.isNotEmpty(referenceNamesFile)) { +// file = new File(fileUriMap.get(referenceNamesFile).getPath()); +// sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// } +// sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); +// +// file = new File(fileUriMap.get(inputFile).getPath()); +// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// break; +// } +// } +// +// return sb.toString(); +// } +// +// private boolean checkParam(String param) { +// if (param.equals(DOCKER_IMAGE_VERSION_PARAM) || param.equals(INDEX_STATS_PARAM)) { +// return false; +// } else { +// switch (command) { +// case "dict": { +// if ("o".equals(param)) { +// return false; +// } +// break; +// } +// case "view": { +// switch (param) { +// case "t": +// case "L": +// case "U": +// case "R": +// case "T": +// case "reference": +// case "o": { +// return false; +// } +// } +// break; +// } +// case "stats": { +// switch (param) { +// case "reference": +// case "r": +// case "ref-seq": +// case "t": { +// return false; +// } +// } +// break; +// } +// case "sort": { +// switch (param) { +// case "reference": +// case "o": { +// return false; +// } +// } +// break; +// } +// case "depth": { +// switch (param) { +// case "b": +// case "reference": { +// return false; +// } +// } +// break; +// } +// } +// return true; +// } +// } + + public static SamtoolsStats parseSamtoolsStats(File file, String fileId) throws IOException { + // Create a map with the summary numbers of the statistics (samtools stats) + Map map = new HashMap<>(); + + int count = 0; + for (String line : readLines(file, Charset.defaultCharset())) { + // Only take into account the "SN" section (summary numbers) + if (line.startsWith("SN")) { + count++; + String[] splits = line.split("\t"); + String key = splits[1].replace("(cigar)", "cigar").split("\\(")[0].trim().replace("1st", "first").replace(":", "") + .replace(" ", "_").replace("-", "_"); + key = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, key); + String value = splits[2].split(" ")[0]; + map.put(key, value); + } else if (count > 0) { + // SN (summary numbers) section has been processed + break; + } + } + + // Convert map to AlignmentStats + SamtoolsStats alignmentStats = JacksonUtils.getDefaultObjectMapper().convertValue(map, SamtoolsStats.class); + + // Set file ID + alignmentStats.setFileId(fileId); + + return alignmentStats; + } + + private void indexStats(SamtoolsStats alignmentStats) throws CatalogException, IOException { + // Convert AlignmentStats to map in order to create an AnnotationSet + Map annotations = JacksonUtils.getDefaultObjectMapper().convertValue(alignmentStats, Map.class); + AnnotationSet annotationSet = new AnnotationSet(ALIGNMENT_STATS_VARIABLE_SET, ALIGNMENT_STATS_VARIABLE_SET, annotations); + + // Update catalog + FileUpdateParams updateParams = new FileUpdateParams().setAnnotationSets(Collections.singletonList(annotationSet)); + catalogManager.getFileManager().update(getStudy(), inputCatalogFile.getId(), updateParams, QueryOptions.empty(), token); + } + +// private boolean isIndexed() { +// OpenCGAResult fileResult; +// try { +// fileResult = catalogManager.getFileManager().get(getStudy(), inputCatalogFile.getId(), QueryOptions.empty(), token); +// +// if (fileResult.getNumResults() == 1) { +// for (AnnotationSet annotationSet : fileResult.getResults().get(0).getAnnotationSets()) { +// if (ALIGNMENT_STATS_VARIABLE_SET.equals(annotationSet.getId())) { +// return true; +// } +// } +// } +// } catch (CatalogException e) { +// return false; +// } +// +// return false; +// } + + public String getCommand() { + return command; + } + + public SamtoolsWrapperAnalysis setCommand(String command) { + this.command = command; + return this; + } + + public String getInputFile() { + return inputFile; + } + + public SamtoolsWrapperAnalysis setInputFile(String inputFile) { + this.inputFile = inputFile; + return this; + } + + public String getOutputFilename() { + return outputFilename; + } + + public SamtoolsWrapperAnalysis setOutputFilename(String outputFilename) { + this.outputFilename = outputFilename; + return this; + } + + public String getReferenceFile() { + return referenceFile; + } + + public SamtoolsWrapperAnalysis setReferenceFile(String referenceFile) { + this.referenceFile = referenceFile; + return this; + } + + public String getReadGroupFile() { + return readGroupFile; + } + + public SamtoolsWrapperAnalysis setReadGroupFile(String readGroupFile) { + this.readGroupFile = readGroupFile; + return this; + } + + public String getBedFile() { + return bedFile; + } + + public SamtoolsWrapperAnalysis setBedFile(String bedFile) { + this.bedFile = bedFile; + return this; + } + + public String getReferenceNamesFile() { + return referenceNamesFile; + } + + public SamtoolsWrapperAnalysis setReferenceNamesFile(String referenceNamesFile) { + this.referenceNamesFile = referenceNamesFile; + return this; + } + + public String getTargetRegionFile() { + return targetRegionFile; + } + + public SamtoolsWrapperAnalysis setTargetRegionFile(String targetRegionFile) { + this.targetRegionFile = targetRegionFile; + return this; + } + + public String getRefSeqFile() { + return refSeqFile; + } + + public SamtoolsWrapperAnalysis setRefSeqFile(String refSeqFile) { + this.refSeqFile = refSeqFile; + return this; + } + + public String getReadsNotSelectedFilename() { + return readsNotSelectedFilename; + } + + public SamtoolsWrapperAnalysis setReadsNotSelectedFilename(String readsNotSelectedFilename) { + this.readsNotSelectedFilename = readsNotSelectedFilename; + return this; + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..0848b9ede9a --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java @@ -0,0 +1,493 @@ +package org.opencb.opencga.analysis.wrappers.samtools; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.opencb.commons.exec.Command; +import org.opencb.opencga.analysis.wrappers.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.core.common.GitRepositoryState; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.nio.charset.Charset; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import static org.apache.commons.io.FileUtils.readLines; + +@ToolExecutor(id = SamtoolsWrapperAnalysisExecutor.ID, + tool = SamtoolsWrapperAnalysis.ID, + source = ToolExecutor.Source.STORAGE, + framework = ToolExecutor.Framework.LOCAL) +public class SamtoolsWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor { + + public final static String ID = SamtoolsWrapperAnalysis.ID + "-local"; + + public final static String DOCKER_IMAGE_NAME = "opencb/opencga-samtools"; + public final static String DOCKER_IMAGE_VERSION = GitRepositoryState.get().getBuildVersion(); + + private String study; + private String command; + private String inputFile; + private String referenceFile; + private String readGroupFile; + private String bedFile; + private String refSeqFile; + private String referenceNamesFile; + private String targetRegionFile; + private String readsNotSelectedFilename; + + private String outputFilename; + private File outputFile; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + protected void run() throws Exception { + outputFilename = getOutputFilename(); + if (StringUtils.isNotEmpty(outputFilename)) { + // Set output file to use further + outputFile = getOutDir().resolve(outputFilename).toFile(); + } + + String commandLine = getCommandLine(); + + logger.info("Samtools command line: " + commandLine); + try { + // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + Command cmd = new Command(commandLine) + .setOutputOutputStream( + new DataOutputStream(new FileOutputStream(getOutDir().resolve(STDOUT_FILENAME).toFile()))) + .setErrorOutputStream( + new DataOutputStream(new FileOutputStream(getOutDir().resolve(STDERR_FILENAME).toFile()))); + + cmd.run(); + + // Check samtools errors + boolean success = false; + switch (getCommand()) { + case "dict": + case "index": + case "sort": + case "view": { + if (outputFile.exists()) { + success = true; + +// if (!"view".equals(command)) { +// String catalogPath = getCatalogPath(inputFile); +// File file = new File(fileUriMap.get(inputFile).getPath()); +// +// Path src = outputFile.toPath(); +// Path dest = new File(file.getParent()).toPath(); +// +// moveFile(getStudy(), src, dest, catalogPath, token); +// } + } + break; + } +// case "faidx": { +// File file = new File(fileUriMap.get(inputFile).getPath()); +// File faidxFile = file.getParentFile().toPath().resolve(file.getName() + ".fai").toFile(); +// success = isValidFile(faidxFile); +// if (success) { +// String catalogPath = getCatalogPath(inputFile); +// catalogManager.getFileManager().link(getStudy(), faidxFile.toURI(), catalogPath, new ObjectMap("parents", true), +// token); +// } +// break; +// } + case "stats": { + File file = getOutDir().resolve(STDOUT_FILENAME).toFile(); + List lines = readLines(file, Charset.defaultCharset()); + if (lines.size() > 0 && lines.get(0).startsWith("# This file was produced by samtools stats")) { + FileUtils.copyFile(file, outputFile); +// if (getExecutorParams().containsKey(INDEX_STATS_PARAM) && getExecutorParams().getBoolean(INDEX_STATS_PARAM) && !isIndexed()) { +// SamtoolsStats alignmentStats = parseSamtoolsStats(outputFile, new File(getInputFile()).getName()); +// System.out.println("samtools wrapper local analysis executor, stats: " + alignmentStats.toString()); +// indexStats(alignmentStats); +// } + success = true; + } + break; + } + case "depth": { + File file = new File(getOutDir() + "/" + STDOUT_FILENAME); + if (file.exists() && file.length() > 0) { + FileUtils.copyFile(file, outputFile); + success = true; + } + break; + } + case "plot-bamstats": { + int pngCounter = 0; + for (File file : getOutDir().toFile().listFiles()) { + if (file.getName().endsWith("png")) { + pngCounter++; + } + } + success = (pngCounter == 11); + break; + } + } + + if (!success) { + File file = getOutDir().resolve(STDERR_FILENAME).toFile(); + String msg = "Something wrong happened when executing Samtools"; + if (file.exists()) { + msg = StringUtils.join(readLines(file, Charset.defaultCharset()), ". "); + } + throw new ToolException(msg); + } + } catch (Exception e) { + throw new ToolException(e); + } + } + + private String getOutputFilename() throws ToolException { + String outputFilename = null; + String prefix = Paths.get(getInputFile()).toFile().getName(); + switch (getCommand()) { + case "index": { + if (prefix.endsWith("cram")) { + outputFilename = prefix + ".crai"; + } else { + outputFilename = prefix + ".bai"; + } + break; + } + case "faidx": { + outputFilename = prefix + ".fai"; + break; + } + case "dict": { + outputFilename = prefix + ".dict"; + break; + } + case "stats": { + outputFilename = prefix + ".stats.txt"; + break; + } + case "depth": { + outputFilename = prefix + ".depth.txt"; + break; + } + case "plot-bamstats": + break; + default: { + throw new ToolException("Missing output file name when executing 'samtools " + getCommand() + "'."); + } + } + + return outputFilename; + } + + public String getCommandLine() throws ToolException { + + List inputFiles = Arrays.asList(getInputFile(), getReferenceFile(), getReadGroupFile(), getBedFile(), getRefSeqFile(), + getReferenceNamesFile(), getTargetRegionFile(), getReadsNotSelectedFilename()); + + Map srcTargetMap = getDockerMountMap(inputFiles); + + StringBuilder sb = initDockerCommandLine(srcTargetMap, DOCKER_IMAGE_NAME, DOCKER_IMAGE_VERSION); + + // Samtools command + if ("plot-bamstats".equals(getCommand())) { + sb.append(" ").append(getCommand()); + } else { + sb.append(" samtools ").append(getCommand()); + } + + // Samtools options + for (String param : getExecutorParams().keySet()) { + if (isValidParameter(param)) { + String sep = param.length() == 1 ? " -" : " --"; + String value = getExecutorParams().getString(param); + if (StringUtils.isEmpty(value)) { + sb.append(sep).append(param); + } else { + switch (value.toLowerCase()) { + case "false": + // Nothing to do + break; + case "null": + case "true": + // Only param must be appended + sb.append(sep).append(param); + break; + default: + // Otherwise, param + value must be appended + sb.append(sep).append(param).append(" ").append(value); + break; + } + } + } + } + + // File parameters + File file; + switch (getCommand()) { + case "depth": { + if (StringUtils.isNotEmpty(getReferenceFile())) { + file = new File(getReferenceFile()); + sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") + .append(file.getName()); + } + if (StringUtils.isNotEmpty(getBedFile())) { + file = new File(getBedFile()); + sb.append(" -b ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + } + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + break; + } + case "faidx": { + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + break; + } + case "stats": { + if (StringUtils.isNotEmpty(getReferenceFile())) { + file = new File(getReferenceFile()); + sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") + .append(file.getName()); + } + if (StringUtils.isNotEmpty(getTargetRegionFile())) { + file = new File(getTargetRegionFile()); + sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + } + if (StringUtils.isNotEmpty(getRefSeqFile())) { + file = new File(getRefSeqFile()); + sb.append(" --ref-seq ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") + .append(file.getName()); + } + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + break; + } + case "index": { + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + sb.append(" ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); + break; + } + case "dict": { + sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); + + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + break; + } + case "sort": { + if (StringUtils.isNotEmpty(getReferenceFile())) { + file = new File(getReferenceFile()); + sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") + .append(file.getName()); + } + sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); + + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + break; + } + case "view": { + if (StringUtils.isNotEmpty(getReferenceFile())) { + file = new File(getReferenceFile()); + sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") + .append(file.getName()); + } + if (StringUtils.isNotEmpty(getBedFile())) { + file = new File(getBedFile()); + sb.append(" -L ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + } + if (StringUtils.isNotEmpty(getReadGroupFile())) { + file = new File(getReadGroupFile()); + sb.append(" -R ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + } + if (StringUtils.isNotEmpty(getReadsNotSelectedFilename())) { + sb.append(" -U ").append(DOCKER_OUTPUT_PATH).append("/").append(getReadsNotSelectedFilename()); + } + if (StringUtils.isNotEmpty(getReferenceNamesFile())) { + file = new File(getReferenceNamesFile()); + sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + } + sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); + + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + break; + } + case "plot-bamstats": { + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + sb.append(" -p ").append(DOCKER_OUTPUT_PATH).append("/"); + break; + } + } + + return sb.toString(); + } + + @Override + protected boolean isValidParameter(String param) { + if (!super.isValidParameter(param)) { + return false; + } + + switch (getCommand()) { + case "dict": { + if ("o".equals(param)) { + return false; + } + break; + } + case "view": { + switch (param) { + case "t": + case "L": + case "U": + case "R": + case "T": + case "reference": + case "o": { + return false; + } + } + break; + } + case "stats": { + switch (param) { + case "reference": + case "r": + case "ref-seq": + case "t": { + return false; + } + } + break; + } + case "sort": { + switch (param) { + case "reference": + case "o": { + return false; + } + } + break; + } + case "depth": { + switch (param) { + case "b": + case "reference": { + return false; + } + } + break; + } + case "plot-bamstats": { + switch (param) { + case "p": { + return false; + } + } + break; + } + } + return true; + } + + public String getStudy() { + return study; + } + + public SamtoolsWrapperAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } + + public String getCommand() { + return command; + } + + public SamtoolsWrapperAnalysisExecutor setCommand(String command) { + this.command = command; + return this; + } + + public String getInputFile() { + return inputFile; + } + + public SamtoolsWrapperAnalysisExecutor setInputFile(String inputFile) { + this.inputFile = inputFile; + return this; + } + + public String getReferenceFile() { + return referenceFile; + } + + public SamtoolsWrapperAnalysisExecutor setReferenceFile(String referenceFile) { + this.referenceFile = referenceFile; + return this; + } + + public String getReadGroupFile() { + return readGroupFile; + } + + public SamtoolsWrapperAnalysisExecutor setReadGroupFile(String readGroupFile) { + this.readGroupFile = readGroupFile; + return this; + } + + public String getBedFile() { + return bedFile; + } + + public SamtoolsWrapperAnalysisExecutor setBedFile(String bedFile) { + this.bedFile = bedFile; + return this; + } + + public String getRefSeqFile() { + return refSeqFile; + } + + public SamtoolsWrapperAnalysisExecutor setRefSeqFile(String refSeqFile) { + this.refSeqFile = refSeqFile; + return this; + } + + public String getReferenceNamesFile() { + return referenceNamesFile; + } + + public SamtoolsWrapperAnalysisExecutor setReferenceNamesFile(String referenceNamesFile) { + this.referenceNamesFile = referenceNamesFile; + return this; + } + + public String getTargetRegionFile() { + return targetRegionFile; + } + + public SamtoolsWrapperAnalysisExecutor setTargetRegionFile(String targetRegionFile) { + this.targetRegionFile = targetRegionFile; + return this; + } + + public String getReadsNotSelectedFilename() { + return readsNotSelectedFilename; + } + + public SamtoolsWrapperAnalysisExecutor setReadsNotSelectedFilename(String readsNotSelectedFilename) { + this.readsNotSelectedFilename = readsNotSelectedFilename; + return this; + } +} diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/WrapperAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/WrapperAnalysisTest.java index f5830e86d74..c229f3fa402 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/WrapperAnalysisTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/WrapperAnalysisTest.java @@ -25,6 +25,7 @@ import org.opencb.commons.exec.Command; import org.opencb.opencga.analysis.clinical.ClinicalAnalysisUtilsTest; import org.opencb.opencga.analysis.variant.OpenCGATestExternalResource; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.managers.AbstractClinicalManagerTest; import org.opencb.opencga.catalog.managers.CatalogManagerExternalResource; import org.opencb.opencga.core.tools.result.ExecutionResult; diff --git a/opencga-app/app/cloud/docker/docker-build.py b/opencga-app/app/cloud/docker/docker-build.py index 7170fef0e21..288f5ee4e6c 100755 --- a/opencga-app/app/cloud/docker/docker-build.py +++ b/opencga-app/app/cloud/docker/docker-build.py @@ -178,7 +178,7 @@ def delete(): # get a list with all images if not args.images: - images = ["base", "init", "demo", "r"] + images = ["base", "init", "demo", "r", "samtools"] else: imagesUnsorted = args.images.split(",") images = [] diff --git a/opencga-app/app/cloud/docker/opencga-samtools/Dockerfile b/opencga-app/app/cloud/docker/opencga-samtools/Dockerfile new file mode 100644 index 00000000000..2d1dce37ad8 --- /dev/null +++ b/opencga-app/app/cloud/docker/opencga-samtools/Dockerfile @@ -0,0 +1,58 @@ +# work from latest LTS ubuntu release +FROM ubuntu:18.04 + +LABEL org.label-schema.vendor="OpenCB" \ + org.label-schema.name="opencga-samtools" \ + org.label-schema.url="http://docs.opencb.org/display/opencga" \ + org.label-schema.description="An Open Computational Genomics Analysis platform for big data processing and analysis in genomics" \ + maintainer="Joaquin Tarraga " \ + org.label-schema.schema-version="1.0" + +# set the environment variables +ENV samtools_version 1.10 +ENV bcftools_version 1.10 +ENV htslib_version 1.10 + +# run update and install necessary packages +RUN apt-get update -y && apt-get install -y \ + bzip2 \ + build-essential \ + zlib1g-dev \ + libncurses5-dev \ + libncursesw5-dev \ + libnss-sss \ + libbz2-dev \ + liblzma-dev \ + vim \ + less \ + libcurl4-openssl-dev \ + wget \ + gnuplot + +# download the suite of tools +WORKDIR /usr/local/bin/ +RUN wget https://github.com/samtools/samtools/releases/download/${samtools_version}/samtools-${samtools_version}.tar.bz2 +RUN wget https://github.com/samtools/bcftools/releases/download/${bcftools_version}/bcftools-${bcftools_version}.tar.bz2 +RUN wget https://github.com/samtools/htslib/releases/download/${htslib_version}/htslib-${htslib_version}.tar.bz2 + +# extract files for the suite of tools +RUN tar -xjf /usr/local/bin/samtools-${samtools_version}.tar.bz2 -C /usr/local/bin/ +RUN tar -xjf /usr/local/bin/bcftools-${bcftools_version}.tar.bz2 -C /usr/local/bin/ +RUN tar -xjf /usr/local/bin/htslib-${htslib_version}.tar.bz2 -C /usr/local/bin/ + +# run make on the source +RUN cd /usr/local/bin/htslib-${htslib_version}/ && ./configure +RUN cd /usr/local/bin/htslib-${htslib_version}/ && make +RUN cd /usr/local/bin/htslib-${htslib_version}/ && make install + +RUN cd /usr/local/bin/samtools-${samtools_version}/ && ./configure +RUN cd /usr/local/bin/samtools-${samtools_version}/ && make +RUN cd /usr/local/bin/samtools-${samtools_version}/ && make install + +RUN cd /usr/local/bin/bcftools-${bcftools_version}/ && make +RUN cd /usr/local/bin/bcftools-${bcftools_version}/ && make install + +# set default command +CMD ["samtools"] + + diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 318934b101c..422d76bc097 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -18,9 +18,13 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; +import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions; +import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; import java.nio.file.Paths; import java.util.Map; @@ -38,7 +42,8 @@ */ public class AlignmentCommandExecutor extends InternalCommandExecutor { - private final AlignmentCommandOptions alignmentCommandOptions; + private AlignmentCommandOptions alignmentCommandOptions; + private String jobId; // private AlignmentStorageEngine alignmentStorageManager; public AlignmentCommandExecutor(AlignmentCommandOptions options) { @@ -52,6 +57,9 @@ public void execute() throws Exception { String subCommandString = getParsedSubCommand(alignmentCommandOptions.jCommander); configure(); + + jobId = alignmentCommandOptions.internalJobOptions.jobId; + switch (subCommandString) { case "index-run": indexRun(); @@ -59,6 +67,9 @@ public void execute() throws Exception { case "stats-run": statsRun(); break; + case "flagstats-run": + flagStatsRun(); + break; case "coverage-run": coverageRun(); break; @@ -125,9 +136,26 @@ private void indexRun() throws Exception { private void statsRun() throws ToolException { AlignmentCommandOptions.StatsAlignmentCommandOptions cliOptions = alignmentCommandOptions.statsAlignmentCommandOptions; - AlignmentStorageManager alignmentManager = new AlignmentStorageManager(catalogManager, storageEngineFactory, alignmentCommandOptions.internalJobOptions.jobId); + ObjectMap params = new AlignmentStatsParams( + cliOptions.file, + cliOptions.outdir + ).toObjectMap(cliOptions.commonOptions.params) + .append(ParamConstants.STUDY_PARAM, cliOptions.study); + + System.out.println("alignment command executor: params = " + params.toJson()); + System.out.println("----> cliOptions.study = " + cliOptions.study); + System.out.println("----> cliOptions.outdir = " + cliOptions.outdir); + + toolRunner.execute(AlignmentStatsAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); + } + + private void flagStatsRun() throws ToolException { + AlignmentCommandOptions.FlagStatsAlignmentCommandOptions cliOptions = alignmentCommandOptions.flagStatsAlignmentCommandOptions; + + AlignmentStorageManager alignmentManager = new AlignmentStorageManager(catalogManager, storageEngineFactory, + alignmentCommandOptions.internalJobOptions.jobId); - alignmentManager.statsRun(cliOptions.study, cliOptions.file, cliOptions.outdir, cliOptions.commonOptions.token); + alignmentManager.flagStatsRun(cliOptions.study, cliOptions.file, cliOptions.outdir, cliOptions.commonOptions.token); } private void coverageRun() throws ToolException { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index 6a897dfbf33..67e06614854 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -18,6 +18,7 @@ import com.beust.jcommander.*; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.internal.InternalCliOptionsParser; @@ -35,6 +36,7 @@ public class AlignmentCommandOptions { public IndexAlignmentCommandOptions indexAlignmentCommandOptions; public QueryAlignmentCommandOptions queryAlignmentCommandOptions; public StatsAlignmentCommandOptions statsAlignmentCommandOptions; + public FlagStatsAlignmentCommandOptions flagStatsAlignmentCommandOptions; public StatsInfoAlignmentCommandOptions statsInfoAlignmentCommandOptions; public CoverageAlignmentCommandOptions coverageAlignmentCommandOptions; public CoverageQueryAlignmentCommandOptions coverageQueryAlignmentCommandOptions; @@ -67,6 +69,7 @@ public AlignmentCommandOptions(GeneralCliOptions.CommonCommandOptions analysisCo this.indexAlignmentCommandOptions = new IndexAlignmentCommandOptions(); this.queryAlignmentCommandOptions = new QueryAlignmentCommandOptions(); this.statsAlignmentCommandOptions = new StatsAlignmentCommandOptions(); + this.flagStatsAlignmentCommandOptions = new FlagStatsAlignmentCommandOptions(); this.statsInfoAlignmentCommandOptions = new StatsInfoAlignmentCommandOptions(); this.coverageAlignmentCommandOptions = new CoverageAlignmentCommandOptions(); this.coverageQueryAlignmentCommandOptions = new CoverageQueryAlignmentCommandOptions(); @@ -194,6 +197,25 @@ public class StatsAlignmentCommandOptions extends GeneralCliOptions.StudyOption public String outdir; } + @Parameters(commandNames = {"flag-stats-run"}, commandDescription = ALIGNMENT_FLAG_STATS_DESCRIPTION) + public class FlagStatsAlignmentCommandOptions extends GeneralCliOptions.StudyOption { + + @ParametersDelegate + public GeneralCliOptions.CommonCommandOptions commonOptions = analysisCommonOptions; + + @ParametersDelegate + public Object jobOptions = commonJobOptionsObject; + + @ParametersDelegate + public Object internalJobOptions = internalJobOptionsObject; + + @Parameter(names = {"--file"}, description = FILE_ID_DESCRIPTION, required = true, arity = 1) + public String file; + + @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) + public String outdir; + } + @Parameters(commandNames = {"stats-info"}, commandDescription = ALIGNMENT_STATS_INFO_DESCRIPTION) public class StatsInfoAlignmentCommandOptions extends GeneralCliOptions.StudyOption { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index 63a4201f018..df080c27aa2 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -36,6 +36,7 @@ import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.core.models.alignment.*; import org.opencb.opencga.core.models.job.Job; +import org.opencb.opencga.core.models.variant.KnockoutAnalysisParams; import org.opencb.opencga.core.response.RestResponse; import org.opencb.opencga.server.grpc.AlignmentServiceGrpc; import org.opencb.opencga.server.grpc.GenericAlignmentServiceModel; @@ -83,6 +84,9 @@ public void execute() throws Exception { case "stats-run": queryResponse = statsRun(); break; + case "flag-stats-run": + queryResponse = flagStatsRun(); + break; case "stats-info": queryResponse = statsInfo(); break; @@ -336,7 +340,17 @@ private RestResponse statsRun() throws ClientException { ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); params.putAll(getJobParams()); - return openCGAClient.getAlignmentClient().runStats(new AlignmentStatsParams(cliOptions.file), params); + return openCGAClient.getAlignmentClient().runStats(new AlignmentStatsParams(cliOptions.file, cliOptions.outdir), params); + } + + private RestResponse flagStatsRun() throws ClientException { + AlignmentCommandOptions.FlagStatsAlignmentCommandOptions cliOptions = alignmentCommandOptions.flagStatsAlignmentCommandOptions; + + ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); + params.putAll(getJobParams()); + + return null; +// return openCGAClient.getAlignmentClient().runFlagStats(new AlignmentStatsParams(cliOptions.file), params); } private RestResponse statsInfo() throws ClientException { diff --git a/opencga-catalog/src/main/resources/variablesets/alignment-samtools-flagstat-variableset.json b/opencga-catalog/src/main/resources/variablesets/alignment-samtools-flagstat-variableset.json new file mode 100644 index 00000000000..b0c9e8e1a41 --- /dev/null +++ b/opencga-catalog/src/main/resources/variablesets/alignment-samtools-flagstat-variableset.json @@ -0,0 +1,210 @@ +{ + "unique": true, + "confidential": false, + "internal": false, + "id": "opencga_alignment_samtools_flagstat", + "name": "opencga_alignment_samtools_flagstat", + "description": "OpenCGA alignment samtools flagstat", + "entities": ["FILE"], + "variables": [ + { + "id": "fileId", + "name": "fileId", + "type": "STRING", + "required": true, + "multiValue": false, + "allowedValues": [], + "rank": 1, + "dependsOn": "", + "description": "File ID", + "attributes": {} + }, + { + "id": "totalReads", + "name": "totalReads", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 2, + "dependsOn": "", + "description": "Total number of reads", + "attributes": {} + }, + { + "id": "totalQcPassed", + "name": "totalQcPassed", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 3, + "dependsOn": "", + "description": "Total number of reads that are QC pass (according to flag bit 0x200)", + "attributes": {} + }, + { + "id": "mapped", + "name": "mapped", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 4, + "dependsOn": "", + "description": "Number of reads which are mapped, i.e., 0x4 bit not set", + "attributes": {} + }, + { + "id": "secondaryAlignments", + "name": "secondaryAlignments", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 5, + "dependsOn": "", + "description": "Number of reads which are secondary, i.e. 0x100 bit set", + "attributes": {} + }, + { + "id": "supplementary", + "name": "supplementary", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 6, + "dependsOn": "", + "description": "Number of reads which are supplementary, i.e., 0x800 bit set", + "attributes": {} + }, + { + "id": "duplicates", + "name": "duplicates", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 7, + "dependsOn": "", + "description": "Number of reads which are duplicates, i.e., 0x400 bit set", + "attributes": {} + }, + { + "id": "pairedInSequencing", + "name": "pairedInSequencing", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 8, + "dependsOn": "", + "description": "Number of reads which are paired in sequencing, i.e., 0x1 bit set", + "attributes": {} + }, + { + "id": "read1", + "name": "read1", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 9, + "dependsOn": "", + "description": "Number of reads which are read1, i.e., both 0x1 and 0x40 bits set", + "attributes": {} + }, + { + "id": "read2", + "name": "read2", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 10, + "dependsOn": "", + "description": "Number of reads which are read2, i.e., both 0x1 and 0x80 bits set", + "attributes": {} + }, + { + "id": "properlyPaired", + "name": "properlyPaired", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 11, + "dependsOn": "", + "description": "Number of reads which are properly paired, i.e., both 0x1 and 0x2 bits set and 0x4 bit not set", + "attributes": {} + }, + { + "id": "selfAndMateMapped", + "name": "selfAndMateMapped", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 12, + "dependsOn": "", + "description": "Number of reads with itself and mate mapped, i.e., 0x1 bit set and neither 0x4 nor 0x8 bits set", + "attributes": {} + }, + { + "id": "singletons", + "name": "singletons", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 13, + "dependsOn": "", + "description": "Number of reads which are singletons, i.e., both 0x1 and 0x8 bits set and bit 0x4 not set", + "attributes": {} + }, + { + "id": "mateMappedToDiffChr", + "name": "mateMappedToDiffChr", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 14, + "dependsOn": "", + "description": "Number of reads with mate mapped to a different chr, i.e., 0x1 bit set and neither 0x4 nor 0x8 bits set and MRNM not equal to RNAME ", + "attributes": {} + }, + { + "id": "diffChrMapQ5", + "name": "diffChrMapQ5", + "category": "number", + "type": "INTEGER", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 15, + "dependsOn": "", + "description": "Number of reads with mate mapped to a different chr (mapQ>=5), i.e., 0x1 bit set and neither 0x4 nor 0x8 bits set and MRNM not equal to RNAME and MAPQ >= 5Reads QC failed", + "attributes": {} + } + ] +} + + + + + diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index 58f3d26c5c5..c54db52d2c8 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -337,7 +337,8 @@ public class ParamConstants { public static final String ALIGNMENT_COVERAGE_DESCRIPTION = "Compute coverage for a given alignemnt file"; public static final String ALIGNMENT_COVERAGE_QUERY_DESCRIPTION = "Query the coverage of an alignment file for regions or genes"; public static final String ALIGNMENT_COVERAGE_RATIO_DESCRIPTION = "Compute coverage ratio from file #1 vs file #2, (e.g. somatic vs germline)"; - public static final String ALIGNMENT_STATS_DESCRIPTION = "Compute stats for a given alignment file"; + public static final String ALIGNMENT_STATS_DESCRIPTION = "Compute stats (based on samtools/stats command) for a given alignment file"; + public static final String ALIGNMENT_FLAG_STATS_DESCRIPTION = "Compute flag stats (based on samtools/flagstat command) for a given alignment file"; public static final String ALIGNMENT_STATS_INFO_DESCRIPTION = "Show the stats for a given alignment file"; public static final String ALIGNMENT_STATS_QUERY_DESCRIPTION = "Fetch alignment files according to their stats"; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java new file mode 100644 index 00000000000..b2fbae8b05f --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java @@ -0,0 +1,101 @@ +package org.opencb.opencga.core.models.alignment; + +import org.opencb.biodata.formats.alignment.picard.HsMetrics; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; +import org.opencb.biodata.formats.sequence.fastqc.FastQc; +import org.opencb.biodata.models.alignment.GeneCoverageStats; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class AlignmentQualityControl implements Serializable { + private String fileId; + private FastQc fastQc; + private SamtoolsStats samtoolsStats; + private SamtoolsFlagstats samtoolsFlagstats; + private HsMetrics hsMetrics; + private List geneCoverageStats; + + public AlignmentQualityControl() { + this(null, null, null, null, null, new ArrayList<>()); + } + + public AlignmentQualityControl(String fileId, FastQc fastQc, SamtoolsStats samtoolsStats, SamtoolsFlagstats samtoolsFlagstats, + HsMetrics hsMetrics, List geneCoverageStats) { + this.fileId = fileId; + this.fastQc = fastQc; + this.samtoolsStats = samtoolsStats; + this.samtoolsFlagstats = samtoolsFlagstats; + this.hsMetrics = hsMetrics; + this.geneCoverageStats = geneCoverageStats; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("AlignmentQualityControl{"); + sb.append("fileId='").append(fileId).append('\''); + sb.append(", fastQc=").append(fastQc); + sb.append(", samtoolsStats=").append(samtoolsStats); + sb.append(", samtoolsFlagstats=").append(samtoolsFlagstats); + sb.append(", hsMetrics=").append(hsMetrics); + sb.append(", geneCoverageStats=").append(geneCoverageStats); + sb.append('}'); + return sb.toString(); + } + + public String getFileId() { + return fileId; + } + + public AlignmentQualityControl setFileId(String fileId) { + this.fileId = fileId; + return this; + } + + public FastQc getFastQc() { + return fastQc; + } + + public AlignmentQualityControl setFastQc(FastQc fastQc) { + this.fastQc = fastQc; + return this; + } + + public SamtoolsStats getSamtoolsStats() { + return samtoolsStats; + } + + public AlignmentQualityControl setSamtoolsStats(SamtoolsStats samtoolsStats) { + this.samtoolsStats = samtoolsStats; + return this; + } + + public SamtoolsFlagstats getSamtoolsFlagstats() { + return samtoolsFlagstats; + } + + public AlignmentQualityControl setSamtoolsFlagstats(SamtoolsFlagstats samtoolsFlagstats) { + this.samtoolsFlagstats = samtoolsFlagstats; + return this; + } + + public HsMetrics getHsMetrics() { + return hsMetrics; + } + + public AlignmentQualityControl setHsMetrics(HsMetrics hsMetrics) { + this.hsMetrics = hsMetrics; + return this; + } + + public List getGeneCoverageStats() { + return geneCoverageStats; + } + + public AlignmentQualityControl setGeneCoverageStats(List geneCoverageStats) { + this.geneCoverageStats = geneCoverageStats; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentStatsParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentStatsParams.java index c01bb4290a2..785ca4c0a60 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentStatsParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentStatsParams.java @@ -1,21 +1,26 @@ package org.opencb.opencga.core.models.alignment; -public class AlignmentStatsParams { +import org.opencb.opencga.core.tools.ToolParams; + +public class AlignmentStatsParams extends ToolParams { public static final String DESCRIPTION = "Alignment stats params"; private String file; + private String outdir; public AlignmentStatsParams() { } - public AlignmentStatsParams(String file) { + public AlignmentStatsParams(String file, String outdir) { this.file = file; + this.outdir = outdir; } @Override public String toString() { final StringBuilder sb = new StringBuilder("AlignmentStatsParams{"); sb.append("file='").append(file).append('\''); + sb.append(", outdir='").append(outdir).append('\''); sb.append('}'); return sb.toString(); } @@ -28,4 +33,13 @@ public AlignmentStatsParams setFile(String file) { this.file = file; return this; } + + public String getOutdir() { + return outdir; + } + + public AlignmentStatsParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } } diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index d83e1288158..152b3aa59c1 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -60,6 +60,7 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.DBIterator; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.db.api.JobDBAdaptor; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index 2f533640641..f537148d611 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -31,7 +31,9 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.alignment.AlignmentIndexOperation; import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; +import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; @@ -48,7 +50,7 @@ import java.io.IOException; import java.util.*; -import static org.opencb.opencga.analysis.wrappers.SamtoolsWrapperAnalysis.INDEX_STATS_PARAM; +import static org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis.INDEX_STATS_PARAM; import static org.opencb.opencga.core.api.ParamConstants.*; /** @@ -379,9 +381,9 @@ public Response coverageQuery( //------------------------------------------------------------------------- @POST - @Path("/stats/run") - @ApiOperation(value = ALIGNMENT_STATS_DESCRIPTION, response = Job.class) - public Response statsRun( + @Path("/flagstats/run") + @ApiOperation(value = ALIGNMENT_FLAG_STATS_DESCRIPTION, response = Job.class) + public Response flagStatsRun( @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @@ -392,7 +394,7 @@ public Response statsRun( logger.debug("ObjectMap: {}", params); SamtoolsWrapperParams samtoolsParams = new SamtoolsWrapperParams(); - samtoolsParams.setCommand("stats"); + samtoolsParams.setCommand("flagstat"); samtoolsParams.setInputFile(params.getFile()); Map statsParams = new HashMap<>(); @@ -404,6 +406,34 @@ public Response statsRun( return submitJob(SamtoolsWrapperAnalysis.ID, study, samtoolsParams, jobName, jobDescription, dependsOn, jobTags); } + @POST + @Path("/stats/run") + @ApiOperation(value = ALIGNMENT_STATS_DESCRIPTION, response = Job.class) + public Response statsRun( + @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, + @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, + @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, + @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, + @ApiParam(value = AlignmentStatsParams.DESCRIPTION, required = true) AlignmentStatsParams params) { + + return submitJob(AlignmentStatsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + +// logger.debug("ObjectMap: {}", params); +// +// SamtoolsWrapperParams samtoolsParams = new SamtoolsWrapperParams(); +// samtoolsParams.setCommand("stats"); +// samtoolsParams.setInputFile(params.getFile()); +// +// Map statsParams = new HashMap<>(); +// statsParams.put(INDEX_STATS_PARAM, "true"); +// samtoolsParams.setSamtoolsParams(statsParams); +// +// logger.debug("ObjectMap (Samtools) : {}", samtoolsParams); +// +// return submitJob(SamtoolsWrapperAnalysis.ID, study, samtoolsParams, jobName, jobDescription, dependsOn, jobTags); + } + @GET @Path("/stats/info") @ApiOperation(value = ALIGNMENT_STATS_INFO_DESCRIPTION, response = SamtoolsStats.class) diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index ac0c06239e0..33b1463cc1f 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -56,6 +56,7 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.utils.AvroToAnnotationConverter; From 2a0616bebe16ea7d76d88ec5b77a59cee470c2f8 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 16 Apr 2021 14:00:04 +0200 Subject: [PATCH 194/412] analysis: add gene and transcript field, #1613 --- .../analysis/rga/IndividualRgaConverter.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 646ef94b464..77171da1cf8 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -121,14 +121,7 @@ public static void extractKnockoutByIndividualMap(RgaDataModel rgaDataModel, Map KnockoutByIndividual knockoutByIndividual = fillIndividualInfo(rgaDataModel); List geneList = new LinkedList<>(); - KnockoutByIndividual.KnockoutGene knockoutGene = new KnockoutByIndividual.KnockoutGene(); - knockoutGene.setId(rgaDataModel.getGeneId()); - knockoutGene.setName(rgaDataModel.getGeneName()); - knockoutGene.setTranscripts(new LinkedList<>()); - geneList.add(knockoutGene); - knockoutByIndividual.setGenes(geneList); - result.put(rgaDataModel.getIndividualId(), knockoutByIndividual); } @@ -143,19 +136,23 @@ public static void extractKnockoutByIndividualMap(RgaDataModel rgaDataModel, Map knockoutGene = new KnockoutByIndividual.KnockoutGene(); knockoutGene.setId(rgaDataModel.getGeneId()); knockoutGene.setName(rgaDataModel.getGeneName()); + knockoutGene.setStrand(rgaDataModel.getStrand()); + knockoutGene.setBiotype(rgaDataModel.getGeneBiotype()); + knockoutGene.setStart(rgaDataModel.getStart()); + knockoutGene.setEnd(rgaDataModel.getEnd()); knockoutGene.setTranscripts(new LinkedList<>()); knockoutByIndividual.addGene(knockoutGene); } if (StringUtils.isNotEmpty(rgaDataModel.getTranscriptId())) { + List knockoutVariantList = RgaUtils.extractKnockoutVariants(rgaDataModel, variantMap, variantIds); + // Add new transcript - KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId()); + KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId(), rgaDataModel.getChromosome(), + rgaDataModel.getStart(), rgaDataModel.getEnd(), rgaDataModel.getTranscriptBiotype(), rgaDataModel.getStrand(), + knockoutVariantList); knockoutGene.addTranscripts(Collections.singletonList(knockoutTranscript)); - - knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); - List knockoutVariantList = RgaUtils.extractKnockoutVariants(rgaDataModel, variantMap, variantIds); - knockoutTranscript.setVariants(knockoutVariantList); } } From f3983c8c77543f0485f676595a415a63021f34b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 16 Apr 2021 18:11:15 +0100 Subject: [PATCH 195/412] azure: Remove public IPs from Azure HDInsight deployment #1748 --- .../app/cloud/azure/arm-kubernetes/README.md | 3 +- .../azure/arm-kubernetes/azuredeploy.json | 3 +- .../arm-kubernetes/hdinsight/azuredeploy.json | 97 ++++++++++++++++++- .../cloud/azure/arm-kubernetes/setup-aks.sh | 6 +- .../arm-kubernetes/vnet/azuredeploy.json | 45 +-------- 5 files changed, 101 insertions(+), 53 deletions(-) diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/README.md b/opencga-app/app/cloud/azure/arm-kubernetes/README.md index a6a2c3d3e80..5dbf42939ab 100644 --- a/opencga-app/app/cloud/azure/arm-kubernetes/README.md +++ b/opencga-app/app/cloud/azure/arm-kubernetes/README.md @@ -183,8 +183,7 @@ You can deploy a custom network cidr by specifying the `networkCIDR` field in th "name" : "hdinsight", "addressPrefix": "10.0.8.0/24", "nsg": { - "name": "nsg-hdi", - "serviceTag" : "HDInsight" + "name": "nsg-hdi" } }, "mongodb" : { diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/azuredeploy.json b/opencga-app/app/cloud/azure/arm-kubernetes/azuredeploy.json index 7bc5d5813ae..a59609bcead 100644 --- a/opencga-app/app/cloud/azure/arm-kubernetes/azuredeploy.json +++ b/opencga-app/app/cloud/azure/arm-kubernetes/azuredeploy.json @@ -245,8 +245,7 @@ "name" : "hdinsight", "addressPrefix": "10.0.8.0/24", "nsg": { - "name": "[concat(parameters('nsgNamePrefix'), '-hdi')]", - "serviceTag" : "HDInsight" + "name": "[concat(parameters('nsgNamePrefix'), '-hdi')]" } }, "mongodb" : { diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/hdinsight/azuredeploy.json b/opencga-app/app/cloud/azure/arm-kubernetes/hdinsight/azuredeploy.json index c674ed2ab1b..358db2a1497 100644 --- a/opencga-app/app/cloud/azure/arm-kubernetes/hdinsight/azuredeploy.json +++ b/opencga-app/app/cloud/azure/arm-kubernetes/hdinsight/azuredeploy.json @@ -171,7 +171,8 @@ "subnet": "[parameters('subnetId')]" } }, - "workernode": "[if(parameters('enableHBaseAcceleratedWrites'), union(variables('workernodeBase'), variables('dataDisksGroups1')), variables('workernodeBase'))]" + "workernode": "[if(parameters('enableHBaseAcceleratedWrites'), union(variables('workernodeBase'), variables('dataDisksGroups1')), variables('workernodeBase'))]", + "privateDnsZonesName": "azurehdinsight.net" }, "resources": [ { @@ -252,6 +253,9 @@ }, "yarn-site": { "yarn.nodemanager.resource.memory-mb": "[parameters('yarnSiteMemoryInMb')]" + }, + "hbase-site": { + "hbase.client.keyvalue.maxsize": "0" } } }, @@ -310,8 +314,11 @@ ] } ] + }, + "networkProperties": { + "resourceProviderConnection": "Outbound", + "privateLink": "Disabled" } - }, "identity": { "type": "UserAssigned", @@ -343,9 +350,95 @@ } } ] + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2018-09-01", + "name": "[variables('privateDnsZonesName')]", + "location": "global", + "tags": {}, + "properties": {} + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2018-09-01", + "name": "[concat(variables('privateDnsZonesName'), '/', uniqueString(parameters('vnetId')))]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[parameters('vnetId')]" + }, + "registrationEnabled": false + }, + "dependsOn": [ + "[variables('privateDnsZonesName')]" + ] + }, + + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2018-05-01", + "name": "hdInsightRecords", + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZonesName'))]", + "[resourceId('Microsoft.HDInsight/clusters', parameters('clusterName'))]" + ], + "properties": { + "mode": "Incremental", + "expressionEvaluationOptions": { + "scope": "inner" + }, + "parameters": { + "connectivityEndpoints": { + "value": "[reference(resourceId('Microsoft.HDInsight/clusters', parameters('clusterName'))).connectivityEndpoints]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "connectivityEndpoints": { + "type": "array" + } + }, + "variables": { + "privateDnsZonesName": "azurehdinsight.net" + }, + "resources": [ + { + "copy": { + "name": "hdi-record", + "count": "[length(parameters('connectivityEndpoints'))]" + }, + "type": "Microsoft.Network/privateDnsZones/A", + "apiVersion": "2018-09-01", + "name": "[concat( + variables('privateDnsZonesName'), + '/', + replace( + parameters('connectivityEndpoints')[copyIndex()].location, + concat('.' , variables('privateDnsZonesName')), + '') + )]", + "properties": { + "ttl": 3600, + "aRecords": [ + { + "ipv4Address": "[parameters('connectivityEndpoints')[copyIndex()].privateIPAddress]" + } + ] + } + } + ] + } + } } ], "outputs": { + "ref": { + "type": "object", + "value": "[reference(resourceId('Microsoft.HDInsight/clusters', parameters('clusterName')))]" + }, "clusterSshDNSName": { "type": "string", "value": "[concat(parameters('clusterName'),'-ssh.azurehdinsight.net')]" diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh index 17a51280ce0..2e4eef1d065 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh @@ -186,7 +186,7 @@ function registerIngressDomainName() { EXTERNAL_IP=$(kubectl get services \ --context "${K8S_CONTEXT}" \ -o "jsonpath={.status.loadBalancer.ingress[0].ip}" \ - opencga-nginx-nginx-ingress-controller) + opencga-nginx-ingress-nginx-controller) ACTUAL_IP=$(az network private-dns record-set a show \ --subscription "${subscriptionName}" \ @@ -194,7 +194,7 @@ function registerIngressDomainName() { --zone-name $(getOutput "privateDnsZonesName") \ --name opencga 2> /dev/null | jq .aRecords[].ipv4Address -r) - if [ ! $ACTUAL_IP = "" ] && [ ! $ACTUAL_IP = $EXTERNAL_IP ] ; then + if [ "$ACTUAL_IP" != "" ] && [ "$ACTUAL_IP" != "$EXTERNAL_IP" ] ; then echo "Delete outdated A record: opencga.$(getOutput "privateDnsZonesName") : ${ACTUAL_IP}" az network private-dns record-set a delete \ --subscription "${subscriptionName}" \ @@ -203,7 +203,7 @@ function registerIngressDomainName() { --name opencga fi - if [ $ACTUAL_IP = "" ] || [ ! $ACTUAL_IP = $EXTERNAL_IP ] ; then + if [ "$ACTUAL_IP" == "" ] || [ "$ACTUAL_IP" != "$EXTERNAL_IP" ] ; then echo "Create A record: opencga.$(getOutput "privateDnsZonesName") : ${EXTERNAL_IP}" az network private-dns record-set a add-record \ --subscription "${subscriptionName}" \ diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/vnet/azuredeploy.json b/opencga-app/app/cloud/azure/arm-kubernetes/vnet/azuredeploy.json index f15dcd5fde6..74c36cd0401 100644 --- a/opencga-app/app/cloud/azure/arm-kubernetes/vnet/azuredeploy.json +++ b/opencga-app/app/cloud/azure/arm-kubernetes/vnet/azuredeploy.json @@ -32,8 +32,7 @@ "name" : "hdinsight", "addressPrefix": "10.0.8.0/24", "nsg": { - "name": "nsg-hdi", - "serviceTag" : "HDInsight" + "name": "nsg-hdi" } }, "mongodb" : { @@ -74,48 +73,6 @@ "location": "[resourceGroup().location]", "properties": { "securityRules": [ - { - "name": "Allow_HDInsight_Management_Traffic_Specific_IPs", - "properties": { - "description": "Allow traffic from the Azure health and management services to reach HDInsight - Specific IPs list", - "protocol": "*", - "sourcePortRange": "*", - "destinationPortRange": "443", - "sourceAddressPrefixes": ["168.61.49.99", "23.99.5.239", "168.61.48.131", "138.91.141.162"], - "destinationAddressPrefix": "VirtualNetwork", - "access": "Allow", - "priority": 300, - "direction": "Inbound" - } - }, - { - "name": "Allow_HDInsight_Management_Traffic", - "properties": { - "description": "Allow traffic from the Azure health and management services to reach HDInsight - Service Tag", - "protocol": "*", - "sourcePortRange": "*", - "destinationPortRange": "443", - "sourceAddressPrefix": "[parameters('config').subnets.hdinsight.nsg.serviceTag]", - "destinationAddressPrefix": "*", - "access": "Allow", - "priority": 301, - "direction": "Inbound" - } - }, - { - "name": "Allow_Azure_Resolver_Traffic", - "properties": { - "description": "Allow access from Azure's recursive resolver", - "protocol": "*", - "sourcePortRange": "*", - "destinationPortRange": "443", - "sourceAddressPrefix": "168.63.129.16", - "destinationAddressPrefix": "VirtualNetwork", - "access": "Allow", - "priority": 302, - "direction": "Inbound" - } - } ] } }, From 941913e91a78fb1e49b7a5e066861d50e2c090d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 16 Apr 2021 19:53:42 +0100 Subject: [PATCH 196/412] analysis: Fix RGAManager relocation --- .../opencga/analysis/variant/knockout/KnockoutAnalysis.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index 5b345b26951..ff1e4f70af0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -28,9 +28,9 @@ import org.opencb.biodata.models.core.Transcript; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.rga.RgaManager; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; import org.opencb.opencga.catalog.db.api.IndividualDBAdaptor; -import org.opencb.opencga.clinical.rga.RgaManager; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; From 0910cbceb71e674ecc6a52fc42dc6107d042a3e5 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 19 Apr 2021 15:02:34 +0200 Subject: [PATCH 197/412] catalog: fix tests --- .../catalog/managers/FamilyManager.java | 4 +-- .../db/mongodb/FileMongoDBAdaptorTest.java | 35 +++++++++---------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java index 512b2059262..525bc7f452a 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java @@ -930,7 +930,7 @@ private OpenCGAResult update(Study study, Family family, FamilyUpdatePar if (updateParams != null && ListUtils.isNotEmpty(updateParams.getPhenotypes())) { tmpFamily.setPhenotypes(updateParams.getPhenotypes()); - } else if (ListUtils.isNotEmpty(updateParams.getMembers())) { + } else if (updateParams != null && ListUtils.isNotEmpty(updateParams.getMembers())) { // Recalculate phenotypes if list of members has changed tmpFamily.setPhenotypes(Collections.emptyList()); parameters.put(FamilyDBAdaptor.QueryParams.PHENOTYPES.key(), tmpFamily.getPhenotypes()); @@ -939,7 +939,7 @@ private OpenCGAResult update(Study study, Family family, FamilyUpdatePar } if (updateParams != null && ListUtils.isNotEmpty(updateParams.getDisorders())) { tmpFamily.setDisorders(updateParams.getDisorders()); - } else if (ListUtils.isNotEmpty(updateParams.getMembers())) { + } else if (updateParams != null && ListUtils.isNotEmpty(updateParams.getMembers())) { // Recalculate disorders if list of members has changed tmpFamily.setDisorders(Collections.emptyList()); parameters.put(FamilyDBAdaptor.QueryParams.DISORDERS.key(), tmpFamily.getDisorders()); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptorTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptorTest.java index 918b14b9e61..740cf3fe2ee 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptorTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptorTest.java @@ -90,7 +90,9 @@ public void createFileToStudyTest() throws CatalogException { @Test public void getFileTest() throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { - File file = user3.getProjects().get(0).getStudies().get(0).getFiles().get(0); + File file = catalogFileDBAdaptor.get(new Query() + .append(FileDBAdaptor.QueryParams.STUDY_UID.key(), user3.getProjects().get(0).getStudies().get(0).getUid()) + .append(FileDBAdaptor.QueryParams.NAME.key(), "file.vcf"), QueryOptions.empty()).first(); DataResult fileDataResult = catalogFileDBAdaptor.get(file.getUid(), null); System.out.println(fileDataResult); try { @@ -117,21 +119,10 @@ public void getAllFilesStudyNotExistsTest() throws CatalogDBException, CatalogPa @Test public void getAllFilesTest() throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { - long studyId = user3.getProjects().get(0).getStudies().get(0).getUid(); - DataResult allFiles = catalogFileDBAdaptor.getAllInStudy(studyId, null); - List files = allFiles.getResults(); - List expectedFiles = user3.getProjects().get(0).getStudies().get(0).getFiles(); - assertEquals(expectedFiles.size(), files.size()); - for (File expectedFile : expectedFiles) { - boolean found = false; - for (File fileResult : allFiles.getResults()) { - if (fileResult.getUid() == expectedFile.getUid()) - found = true; - } - if (!found) { - throw new CatalogDBException("The file " + expectedFile.getName() + " could not be found."); - } - } + List files = catalogFileDBAdaptor.get( + new Query(FileDBAdaptor.QueryParams.STUDY_UID.key(), user3.getProjects().get(0).getStudies().get(0).getUid()), + QueryOptions.empty()).getResults(); + assertEquals(2, files.size()); } // // Test if the lookup operation works fine @@ -163,7 +154,9 @@ public void getAllFilesTest() throws CatalogDBException, CatalogParameterExcepti @Test public void modifyFileTest() throws CatalogDBException, IOException, CatalogParameterException, CatalogAuthorizationException { - File file = user3.getProjects().get(0).getStudies().get(0).getFiles().get(0); + File file = catalogFileDBAdaptor.get(new Query() + .append(FileDBAdaptor.QueryParams.STUDY_UID.key(), user3.getProjects().get(0).getStudies().get(0).getUid()) + .append(FileDBAdaptor.QueryParams.NAME.key(), "file.vcf"), QueryOptions.empty()).first(); long fileId = file.getUid(); Document stats = new Document("stat1", 1).append("stat2", true).append("stat3", "ok" + RandomStringUtils.randomAlphanumeric(20)); @@ -343,7 +336,9 @@ public void testAddSamples() throws Exception { ObjectMap action = new ObjectMap(FileDBAdaptor.QueryParams.SAMPLE_IDS.key(), ParamUtils.BasicUpdateAction.ADD); QueryOptions options = new QueryOptions(Constants.ACTIONS, action); - File file = user3.getProjects().get(0).getStudies().get(0).getFiles().get(0); + File file = catalogFileDBAdaptor.get(new Query() + .append(FileDBAdaptor.QueryParams.STUDY_UID.key(), user3.getProjects().get(0).getStudies().get(0).getUid()) + .append(FileDBAdaptor.QueryParams.NAME.key(), "file.vcf"), QueryOptions.empty()).first(); catalogFileDBAdaptor.update(file.getUid(), new ObjectMap(FileDBAdaptor.QueryParams.SAMPLE_IDS.key(), Arrays.asList(sample1.getId(), sample2.getId())), options); @@ -377,7 +372,9 @@ public void testRemoveSamples() throws Exception { catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample3").setInternal(SampleInternal.init()), Collections.emptyList(), QueryOptions.empty()); Sample sample3 = getSample(studyUid, "sample3"); - List files = user3.getProjects().get(0).getStudies().get(0).getFiles(); + List files = catalogFileDBAdaptor.get(new Query() + .append(FileDBAdaptor.QueryParams.STUDY_UID.key(), user3.getProjects().get(0).getStudies().get(0).getUid()), + QueryOptions.empty()).getResults(); File file = files.get(0); File file2 = files.get(1); ObjectMap action = new ObjectMap(FileDBAdaptor.QueryParams.SAMPLE_IDS.key(), ParamUtils.BasicUpdateAction.ADD); From c854a402453ad78d3646e797e68d75be0e23a323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Mon, 19 Apr 2021 14:39:12 +0100 Subject: [PATCH 198/412] azure: Add more parameters to deploy.sh. Create one folder with all generated files. --- .../app/cloud/azure/arm-kubernetes/deploy.sh | 166 +++++++++++------- .../cloud/azure/arm-kubernetes/setup-aks.sh | 97 +++++++--- .../kubernetes/charts/opencga/values.yaml | 2 +- 3 files changed, 178 insertions(+), 87 deletions(-) diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh b/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh index e8b8dc00669..1545b4982ff 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh @@ -1,7 +1,7 @@ #!/bin/bash # -# Please be aware this script uploads artifacts to public blob storage with no SAS token. -# +# Please be aware this script uploads artifacts to public blob storage with no SAS token. +# # If the script is modifed to use a SAS token, be aware if the SAS token later changes then operations that depend on the storage and solution redeployment will fail. # Given dependencies on the storage within OpenCGA a SAS token with a long lifetime needs to be created and used each time the solution is deployed. @@ -12,12 +12,16 @@ function printUsage() { echo "Usage: $(basename $0) --subscription [options]" echo "" echo "Options:" - echo " * -s --subscription Subscription name or subscription id" - echo " --af --azure-file Azure deploy parameters file [azuredeploy.parameters.private.json]" - echo " --spf --service-principal-file Azure service principal deploy parameters file. Execute createsp.sh to obtain the service principal parameters" - echo " --hf --helm-file Helm values file. Used when calling to 'setup-k8s.sh' " - echo " -h --help Print this help" - echo " --verbose Verbose mode. Print debugging messages about the progress." + echo " * -s --subscription STRING Subscription name or subscription id" + echo " * --af --azure-file FILE Azure deploy parameters file [azuredeploy.parameters.private.json]" + echo " * --spf --service-principal-file FILE Azure service principal deploy parameters file. Execute createsp.sh to obtain the service principal parameters" + echo " -c --k8s-context STRING Kubernetes context" + echo " --k8s-namespace STRING Kubernetes namespace" + echo " --hf --helm-file FILE Helm values file. Used when calling to 'setup-k8s.sh' " + echo " -o --outdir DIRECTORY Output directory where to write the generated manifests. Default: \$PWD" + echo " --opencga-conf-dir DIRECTORY OpenCGA configuration folder. Default: build/conf/ " + echo " --verbose FLAG Verbose mode. Print debugging messages about the progress." + echo " -h --help FLAG Print this help" echo "" } @@ -41,50 +45,86 @@ function requiredFile() { fi } +function requiredDirectory() { + key=$1 + dir=$2 + if [ ! -d "${dir}" ]; then + echo "Missing directory ${key} : '${dir}' : No such directory" + printUsage + exit 1 + fi +} #subscriptionName #azudeDeployParameters #spAzudeDeployParameters #helmDeployParameters - -while [[ $# -gt 0 ]] -do -key="$1" -value="$2" -case $key in - -h|--help) +#setupAksOpts +outputDir="$(pwd)" + +while [[ $# -gt 0 ]]; do + key="$1" + value="$2" + case $key in + -h | --help) printUsage exit 0 ;; - -s|--subscription) + -s | --subscription) subscriptionName="$value" shift # past argument shift # past value ;; - --af|--azure-file) + --af | --azure-file) azudeDeployParameters="$value" shift # past argument shift # past value ;; - --spf|--service-principal-file) + --spf | --service-principal-file) spAzudeDeployParameters="$value" shift # past argument shift # past value ;; - --hf|--helm-file) + --hf | --helm-file) helmDeployParameters="$value" shift # past argument shift # past value ;; - --verbose) + -c | --k8s-context) + setupAksOpts="${setupAksOpts} $key $value " + shift # past argument + shift # past value + ;; + --k8s-namespace) + setupAksOpts="${setupAksOpts} $key $value " + shift # past argument + shift # past value + ;; + -o | --outdir) + requiredDirectory "$key" "$value" + value=$(realpath "$value") + setupAksOpts="${setupAksOpts} --outdir $value " + outputDir=$value + shift # past argument + shift # past value + ;; + --opencga-conf-dir) + requiredDirectory "$key" "$value" + value=$(realpath "$value") + setupAksOpts="${setupAksOpts} --opencga-conf-dir $value " + shift # past argument + shift # past value + ;; + --verbose) + setupAksOpts="${setupAksOpts} --verbose " set -x shift # past argument ;; - *) # unknown option + *) # unknown option echo "Unknown option $key" printUsage exit 1 ;; -esac + esac done azudeDeployParameters=${azudeDeployParameters:-azuredeploy.parameters.private.json} @@ -102,10 +142,12 @@ if [ -n "$helmDeployParameters" ]; then helmDeployParameters=$(realpath "${helmDeployParameters}") fi - # Don't move the PWD until we found out the realpath. It could be a relative path. cd "$(dirname "$0")" +outputDir="${outputDir}/deploy-$(date "+%Y%m%d%H%M%S")" +mkdir -p "$outputDir" + # Location parameter is mandatory in the parameters file. location=$(jq -r '.parameters.location.value' "${azudeDeployParameters}") @@ -114,23 +156,23 @@ az account set --subscription "${subscriptionName}" # Run validation to get final parameters. finalParameters=$(az deployment sub validate \ - --template-file <(grep -v "^//" azuredeploy.json | jq '{parameters:.parameters, "$schema":."$schema" , resources:[], contentVersion:.contentVersion}') \ - --location "${location}" \ - --parameters @"${azudeDeployParameters}" \ - --parameters @"${spAzudeDeployParameters}" \ - --parameters _artifactsLocation="_artifactsLocation" \ - --parameters _artifactsLocationSasToken="?_artifactsLocationSasToken" < /dev/null | jq .properties.parameters) + --template-file <(grep -v "^//" azuredeploy.json | jq '{parameters:.parameters, "$schema":."$schema" , resources:[], contentVersion:.contentVersion}') \ + --location "${location}" \ + --parameters @"${azudeDeployParameters}" \ + --parameters @"${spAzudeDeployParameters}" \ + --parameters _artifactsLocation="_artifactsLocation" \ + --parameters _artifactsLocationSasToken="?_artifactsLocationSasToken" ${deploymentOut} " # deploy infra -az deployment sub create -n $deployId -l ${location} --template-uri $template_url \ - --parameters @"${azudeDeployParameters}" \ - --parameters @"${spAzudeDeployParameters}" \ - --parameters _artifactsLocation=$container_base_url \ - --parameters _artifactsLocationSasToken="?$token" > ${deploymentOut} +az deployment sub create -n $deployId -l ${location} --template-uri $template_url \ + --parameters @"${azudeDeployParameters}" \ + --parameters @"${spAzudeDeployParameters}" \ + --parameters _artifactsLocation=$container_base_url \ + --parameters _artifactsLocationSasToken="?$token" >${deploymentOut} function getOutput() { jq -r '.properties.outputs.'${1}'.value' ${deploymentOut} @@ -202,4 +245,5 @@ if [ $hdInsightMonitorEnabled != "true" ]; then $(getOutput hdInsightEnableMonitor) fi -./setup-aks.sh --subscription "${subscriptionName}" --azure-output-file "${deploymentOut}" --helm-file "${helmDeployParameters}" \ No newline at end of file +echo "./setup-aks.sh --subscription ${subscriptionName} --azure-output-file ${deploymentOut} --helm-file ${helmDeployParameters} --outdir $outputDir ${setupAksOpts}" | tee -a "$outputDir/setup-aks-$(date "+%Y%m%d%H%M%S").sh" +./setup-aks.sh --subscription "${subscriptionName}" --azure-output-file "${deploymentOut}" --helm-file "${helmDeployParameters}" --outdir "$outputDir" ${setupAksOpts} diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh index 2e4eef1d065..e45fd35476a 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh @@ -7,10 +7,15 @@ function printUsage() { echo "Usage: $(basename $0) --subscription [options]" echo "" echo "Options:" - echo " * -s --subscription Subscription name or subscription id" - echo " --aof --azure-output-file Azure deployment output file" - echo " --hf --helm-file Helm values file. Used when calling to 'setup-k8s.sh' " - echo " -h --help Print this help" + echo " * -s --subscription STRING Subscription name or subscription id" + echo " -c --k8s-context STRING Kubernetes context" + echo " --k8s-namespace STRING Kubernetes namespace" + echo " --aof --azure-output-file FILE Azure deployment output file" + echo " --hf --helm-file FILE Helm values file. Used when calling to 'setup-k8s.sh' " + echo " -o --outdir DIRECTORY Output directory where to write the generated manifests. Default: \$PWD" + echo " --opencga-conf-dir DIRECTORY OpenCGA configuration folder. Default: build/conf/ " + echo " --verbose FLAG Verbose mode. Print debugging messages about the progress." + echo " -h --help FLAG Print this help" echo "" } @@ -34,36 +39,81 @@ function requiredFile() { fi } +function requiredDirectory() { + key=$1 + dir=$2 + if [ ! -d "${dir}" ]; then + echo "Missing directory ${key} : '${dir}' : No such directory" + printUsage + exit 1 + fi +} #subscriptionName #deploymentOut #userHelmValues +#setupK8sOpts +#k8sContext +#k8sNamespace +#outputDir while [[ $# -gt 0 ]] do key="$1" value="$2" case $key in - -h|--help) + -h | --help) printUsage exit 0 ;; - -s|--subscription) + -s | --subscription) subscriptionName="$value" shift # past argument shift # past value ;; - --aof|--azure-output-file) + --aof | --azure-output-file) deploymentOut="$value" shift # past argument shift # past value ;; - --hf|--helm-file) + --hf | --helm-file) userHelmValues="$value" + requiredFile "--helm-file" "${userHelmValues}" + userHelmValues=$(realpath "${userHelmValues}") + shift # past argument + shift # past value + ;; + -c | --k8s-context) + k8sContext="$value" + shift # past argument + shift # past value + ;; + --k8s-namespace) + k8sNamespace="$value" + shift # past argument + shift # past value + ;; + -o | --outdir) + requiredDirectory "$key" "$value" + value=$(realpath "$value") + setupK8sOpts="${setupK8sOpts} --outdir $value " + outputDir=$value + shift # past argument + shift # past value + ;; + --opencga-conf-dir) + requiredDirectory "$key" "$value" + value=$(realpath "$value") + setupK8sOpts="${setupK8sOpts} --opencga-conf-dir $value " shift # past argument shift # past value ;; - *) # unknown option + --verbose) + set -x + setupK8sOpts="${setupK8sOpts} --verbose " + shift # past argument + ;; + *) # unknown option echo "Unknown option $key" printUsage exit 1 @@ -71,35 +121,31 @@ case $key in esac done - requiredParam "--subscription" "$subscriptionName" requiredFile "--azure-output-file" "$deploymentOut" -if [ -n "$userHelmValues" ]; then - requiredFile "--helm-file" "${userHelmValues}" - userHelmValues=$(realpath "${userHelmValues}") -fi - deploymentOut=$(realpath "${deploymentOut}") -helmValues="$(dirname "${deploymentOut}")/deployment-values-$(date "+%Y%m%d%H%M%S").yaml" +outputDir=${outputDir:-$(dirname "${deploymentOut}")} +helmValues="${outputDir}/deployment-values-$(date "+%Y%m%d%H%M%S").yaml" # Don't move the PWD until we found out the realpath. It could be a relative path. cd "$(dirname "$0")" - function getOutput() { - jq -r '.properties.outputs.'${1}'.value' ${deploymentOut} + jq -r '.properties.outputs.'${1}'.value' "${deploymentOut}" } function getParameter() { - jq -r '.properties.parameters.'${1}'.value' ${deploymentOut} + jq -r '.properties.parameters.'${1}'.value' "${deploymentOut}" } -function configureContext() { - K8S_CONTEXT="$(getParameter clusterName)" +clusterName="$(getParameter clusterName)" +k8sContext=${k8sContext:-$clusterName} +k8sNamespace=${k8sNamespace:-$k8sContext} +function configureContext() { az account set --subscription "${subscriptionName}" - az aks get-credentials -n "$(getOutput "aksClusterName")" -g "$(getOutput "aksResourceGroupName")" --overwrite-existing --context "$K8S_CONTEXT" + az aks get-credentials -n "$(getOutput "aksClusterName")" -g "$(getOutput "aksResourceGroupName")" --overwrite-existing --context "$k8sContext" } function generateHelmValuesFile() { @@ -184,7 +230,8 @@ EOF function registerIngressDomainName() { ## Register manually the nginx external IP for ingress EXTERNAL_IP=$(kubectl get services \ - --context "${K8S_CONTEXT}" \ + --context "${k8sContext}" \ + --namespace "${k8sNamespace}" \ -o "jsonpath={.status.loadBalancer.ingress[0].ip}" \ opencga-nginx-ingress-nginx-controller) @@ -221,8 +268,8 @@ configureContext echo "# Generate helm values file ${helmValues}" generateHelmValuesFile -echo "setup-k8s.sh --context \"${K8S_CONTEXT}\" --values \"${allHelmValues}\"" -../../kubernetes/setup-k8s.sh --context "${K8S_CONTEXT}" --values "${allHelmValues}" --verbose +echo "$(realpath "$(pwd)/../../kubernetes/setup-k8s.sh") --context \"${k8sContext}\" --namespace \"${k8sNamespace}\" --values \"${allHelmValues}\" $setupK8sOpts" | tee -a "$outputDir/setup-k8s-$(date "+%Y%m%d%H%M%S").sh" +../../kubernetes/setup-k8s.sh --context "${k8sContext}" --namespace "${k8sNamespace}" --values "${allHelmValues}" $setupK8sOpts echo "# Register Ingress domain name (if needed)" registerIngressDomainName \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index 4647e139cef..4342f824b5f 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -80,7 +80,7 @@ solr: agentpool: solr cellbase: - host: "http://ws.opencb.org/cellbase/" + host: "https://ws.opencb.org/cellbase/" analysis: execution: From 49c1b58da0f6dd3a2d1362ae4deb15468f216646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Tue, 20 Apr 2021 09:41:45 +0200 Subject: [PATCH 199/412] analysis: add FileQualityControl object, refactor alignment/stats analysis and include images from plot-bamstats, and updeta the file quality control for the give file after computing alignment stats , #1739 --- .../alignment/qc/AlignmentStatsAnalysis.java | 30 ++-- .../executors/MigrationCommandExecutor.java | 2 +- .../internal/InternalCliOptionsParser.java | 1 - .../options/AlignmentCommandOptions.java | 21 --- .../app/cli/main/OpencgaCliOptionsParser.java | 1 - .../analysis/AlignmentCommandExecutor.java | 13 +- .../opencga/catalog/db/api/FileDBAdaptor.java | 2 + .../db/mongodb/FileMongoDBAdaptor.java | 2 +- .../opencga/catalog/managers/FileManager.java | 16 +-- .../catalog/managers/FileManagerTest.java | 4 +- .../alignment/AlignmentQualityControl.java | 2 +- .../opencb/opencga/core/models/file/File.java | 131 +++++++++--------- .../core/models/file/FileQualityControl.java | 32 +++++ .../core/models/file/FileUpdateParams.java | 15 +- .../rest/analysis/AlignmentWebService.java | 86 ------------ 15 files changed, 150 insertions(+), 208 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java index b8ab5f0cfb1..bb8f48cf602 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java @@ -28,16 +28,15 @@ import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.file.FileQualityControl; +import org.opencb.opencga.core.models.file.FileUpdateParams; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.tools.annotations.ToolParams; -import java.io.FileInputStream; import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Base64; import java.util.List; import static org.apache.commons.io.FileUtils.readLines; @@ -120,19 +119,28 @@ protected void run() throws ToolException { if (lines.size() > 0 && lines.get(0).startsWith("# This file was produced by samtools stats")) { SamtoolsStats alignmentStats = SamtoolsWrapperAnalysis.parseSamtoolsStats(statsFile.toFile(), catalogBamFile.getId()); + List images = new ArrayList<>(); for (java.io.File file : getOutDir().toFile().listFiles()) { if (file.getName().endsWith("png")) { - FileInputStream fileInputStreamReader = new FileInputStream(file); - byte[] bytes = new byte[(int) file.length()]; - fileInputStreamReader.read(bytes); - - String img = new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); -// System.out.println(file.getName()); -// System.out.println(img); + // TODO: fix relative path (from jobs dir) in a fancier way +// String relativeFilePath = getOutDir().toUri().relativize(file.toURI()).getPath(); + int index = file.getAbsolutePath().indexOf("JOBS/"); + String relativeFilePath = (index == -1 ? file.getName() : file.getAbsolutePath().substring(index)); + images.add(relativeFilePath); } } + alignmentStats.setImages(images); + + // Update quality control for the catalog file + FileQualityControl qc = catalogBamFile.getQualityControl(); + // Sanity check + if (qc == null) { + qc = new FileQualityControl(); + } + qc.getAlignmentQualityControl().setSamtoolsStats(alignmentStats); - // TODO: save stats and images inside the File data model + catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), + QueryOptions.empty(), getToken()); } }); } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java index d5a9b2fde02..bcac92a89c3 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java @@ -296,7 +296,7 @@ private void v2_0_0() throws Exception { Paths.get(options.jobFolder).normalize().toAbsolutePath().resolve("JOBS").toUri(), "JOBS/", null, TimeUtils.getTime(), TimeUtils.getTime(), "Default jobs folder", false, 0, new Software(), new FileExperiment(), Collections.emptyList(), Collections.emptyList(), "", - study.getRelease(), Collections.emptyList(), Collections.emptyMap(), new CustomStatus(), + study.getRelease(), Collections.emptyList(), null, Collections.emptyMap(), new CustomStatus(), FileInternal.initialize(), Collections.emptyMap()); file.setUuid(UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.FILE)); file.setTags(Collections.emptyList()); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java index d50d74d147a..c4f4d564652 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java @@ -179,7 +179,6 @@ public InternalCliOptionsParser() { alignmentSubCommands.addCommand("index-run", alignmentCommandOptions.indexAlignmentCommandOptions); alignmentSubCommands.addCommand("query", alignmentCommandOptions.queryAlignmentCommandOptions); alignmentSubCommands.addCommand("stats-run", alignmentCommandOptions.statsAlignmentCommandOptions); - alignmentSubCommands.addCommand("stats-info", alignmentCommandOptions.statsInfoAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-run", alignmentCommandOptions.coverageAlignmentCommandOptions); // alignmentSubCommands.addCommand("annotate", alignmentCommandOptions.annotateVariantCommandOptions); alignmentSubCommands.addCommand(BWA_RUN_COMMAND, alignmentCommandOptions.bwaCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index 67e06614854..5098abe07d1 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -37,7 +37,6 @@ public class AlignmentCommandOptions { public QueryAlignmentCommandOptions queryAlignmentCommandOptions; public StatsAlignmentCommandOptions statsAlignmentCommandOptions; public FlagStatsAlignmentCommandOptions flagStatsAlignmentCommandOptions; - public StatsInfoAlignmentCommandOptions statsInfoAlignmentCommandOptions; public CoverageAlignmentCommandOptions coverageAlignmentCommandOptions; public CoverageQueryAlignmentCommandOptions coverageQueryAlignmentCommandOptions; public CoverageRatioAlignmentCommandOptions coverageRatioAlignmentCommandOptions; @@ -70,7 +69,6 @@ public AlignmentCommandOptions(GeneralCliOptions.CommonCommandOptions analysisCo this.queryAlignmentCommandOptions = new QueryAlignmentCommandOptions(); this.statsAlignmentCommandOptions = new StatsAlignmentCommandOptions(); this.flagStatsAlignmentCommandOptions = new FlagStatsAlignmentCommandOptions(); - this.statsInfoAlignmentCommandOptions = new StatsInfoAlignmentCommandOptions(); this.coverageAlignmentCommandOptions = new CoverageAlignmentCommandOptions(); this.coverageQueryAlignmentCommandOptions = new CoverageQueryAlignmentCommandOptions(); this.coverageRatioAlignmentCommandOptions = new CoverageRatioAlignmentCommandOptions(); @@ -216,25 +214,6 @@ public class FlagStatsAlignmentCommandOptions extends GeneralCliOptions.StudyOpt public String outdir; } - @Parameters(commandNames = {"stats-info"}, commandDescription = ALIGNMENT_STATS_INFO_DESCRIPTION) - public class StatsInfoAlignmentCommandOptions extends GeneralCliOptions.StudyOption { - - @ParametersDelegate - public GeneralCliOptions.CommonCommandOptions commonOptions = analysisCommonOptions; - - @ParametersDelegate - public Object jobOptions = commonJobOptionsObject; - - @ParametersDelegate - public Object internalJobOptions = internalJobOptionsObject; - - @Parameter(names = {"--file"}, description = FILE_ID_DESCRIPTION, required = true, arity = 1) - public String file; - - @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) - public String outdir; - } - @Parameters(commandNames = {"coverage-run"}, commandDescription = ALIGNMENT_COVERAGE_DESCRIPTION) public class CoverageAlignmentCommandOptions extends GeneralCliOptions.StudyOption { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index c586a09a142..c59f034e4c4 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -255,7 +255,6 @@ public OpencgaCliOptionsParser() { alignmentSubCommands.addCommand("index-run", alignmentCommandOptions.indexAlignmentCommandOptions); alignmentSubCommands.addCommand("query", alignmentCommandOptions.queryAlignmentCommandOptions); alignmentSubCommands.addCommand("stats-run", alignmentCommandOptions.statsAlignmentCommandOptions); - alignmentSubCommands.addCommand("stats-info", alignmentCommandOptions.statsInfoAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-index-run", alignmentCommandOptions.coverageAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-query", alignmentCommandOptions.coverageQueryAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-ratio", alignmentCommandOptions.coverageRatioAlignmentCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index df080c27aa2..eb472c86520 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -87,9 +87,6 @@ public void execute() throws Exception { case "flag-stats-run": queryResponse = flagStatsRun(); break; - case "stats-info": - queryResponse = statsInfo(); - break; case "coverage-index-run": queryResponse = coverageRun(); break; @@ -352,15 +349,7 @@ private RestResponse flagStatsRun() throws ClientException { return null; // return openCGAClient.getAlignmentClient().runFlagStats(new AlignmentStatsParams(cliOptions.file), params); } - - private RestResponse statsInfo() throws ClientException { - AlignmentCommandOptions.StatsInfoAlignmentCommandOptions cliOptions = alignmentCommandOptions.statsInfoAlignmentCommandOptions; - - ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); - - return openCGAClient.getAlignmentClient().infoStats(cliOptions.file, params); - } - + //------------------------------------------------------------------------- // COVERAGE: index/run, info, query and stats //------------------------------------------------------------------------- diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FileDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FileDBAdaptor.java index b58c145bc32..6ce6c3e7998 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FileDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FileDBAdaptor.java @@ -78,6 +78,8 @@ enum QueryParams implements QueryParam { SAMPLE_IDS("sampleIds", TEXT_ARRAY, ""), TAGS("tags", TEXT_ARRAY, ""), + QUALITY_CONTROL("qualityControl", OBJECT, ""), + JOB_ID("jobId", TEXT, ""), DELETED(ParamConstants.DELETED_PARAM, BOOLEAN, ""), diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptor.java index b5593b94dec..0fe73025c06 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptor.java @@ -669,7 +669,7 @@ private UpdateDocument getValidatedUpdateParams(ClientSession clientSession, lon filterMapParams(parameters, document.getSet(), acceptedMapParams); String[] acceptedObjectParams = {QueryParams.INTERNAL_INDEX.key(), QueryParams.SOFTWARE.key(), QueryParams.EXPERIMENT.key(), - QueryParams.STATUS.key(), QueryParams.INTERNAL_MISSING_SAMPLES.key()}; + QueryParams.STATUS.key(), QueryParams.INTERNAL_MISSING_SAMPLES.key(), QueryParams.QUALITY_CONTROL.key()}; filterObjectParams(parameters, document.getSet(), acceptedObjectParams); if (document.getSet().containsKey(QueryParams.STATUS.key())) { nestedPut(QueryParams.STATUS_DATE.key(), TimeUtils.getTime(), document.getSet()); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java index 66c657ade91..5d90a6f8b2d 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java @@ -499,7 +499,7 @@ public OpenCGAResult createFolder(String studyStr, String path, boolean pa switch (checkPathExists(path, study.getUid())) { case FREE_PATH: File file = new File(File.Type.DIRECTORY, File.Format.NONE, File.Bioformat.NONE, path, description, - FileInternal.initialize(), 0, null, null, jobId, null, null); + FileInternal.initialize(), 0, null, null, jobId, null, null, null); fileDataResult = create(studyStr, file, parents, null, options, token); break; case DIRECTORY_EXISTS: @@ -544,7 +544,7 @@ public OpenCGAResult create(String studyStr, File.Type type, File.Format f String description, long size, Map stats, Map attributes, boolean parents, String content, QueryOptions options, String token) throws CatalogException { File file = new File(type, format, bioformat, path, description, FileInternal.initialize(), size, Collections.emptyList(), null, "", - stats, attributes); + null, stats, attributes); return create(studyStr, file, parents, content, options, token); } @@ -676,7 +676,7 @@ private OpenCGAResult register(Study study, File file, List existi newParent = true; File parentFile = new File(File.Type.DIRECTORY, File.Format.NONE, File.Bioformat.NONE, parentPath, "", new FileInternal(new FileStatus(FileStatus.READY), new FileIndex(), Collections.emptyMap(), new MissingSamples()), - 0, Collections.emptyList(), null, "", Collections.emptyMap(), Collections.emptyMap()); + 0, Collections.emptyList(), null, "", null, Collections.emptyMap(), Collections.emptyMap()); validateNewFile(study, parentFile, sessionId, false); parentFileId = register(study, parentFile, existingSamples, nonExistingSamples, parents, options, sessionId) .first().getUid(); @@ -3104,7 +3104,7 @@ private void createParents(Study study, String userId, URI studyURI, Path path, File folder = new File(path.getFileName().toString(), File.Type.DIRECTORY, File.Format.PLAIN, File.Bioformat.NONE, completeURI, stringPath, null, TimeUtils.getTime(), TimeUtils.getTime(), "", false, 0, null, new FileExperiment(), Collections.emptyList(), Collections.emptyList(), "", studyManager.getCurrentRelease(study), Collections.emptyList(), null, - new CustomStatus(), FileInternal.initialize(), null); + null, new CustomStatus(), FileInternal.initialize(), null); folder.setUuid(UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.FILE)); checkHooks(folder, study.getFqn(), HookConfiguration.Stage.CREATE); fileDBAdaptor.insert(study.getUid(), folder, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), @@ -3303,7 +3303,7 @@ public FileVisitResult preVisitDirectory(URI dir, BasicFileAttributes attrs) thr File.Bioformat.NONE, dir, destinyPath, null, TimeUtils.getTime(), TimeUtils.getTime(), params.getDescription(), true, 0, new Software(), new FileExperiment(), Collections.emptyList(), relatedFiles, "", studyManager.getCurrentRelease(study), Collections.emptyList(), - Collections.emptyMap(), + null, Collections.emptyMap(), params.getStatus() != null ? params.getStatus().toCustomStatus() : new CustomStatus(), FileInternal.initialize(), Collections.emptyMap()); folder.setUuid(UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.FILE)); @@ -3362,7 +3362,7 @@ public FileVisitResult visitFile(URI fileUri, BasicFileAttributes attrs) throws File.Bioformat.NONE, fileUri, destinyPath, null, TimeUtils.getTime(), TimeUtils.getTime(), params.getDescription(), true, size, new Software(), new FileExperiment(), Collections.emptyList(), relatedFiles, "", studyManager.getCurrentRelease(study), Collections.emptyList(), - Collections.emptyMap(), + null, Collections.emptyMap(), params.getStatus() != null ? params.getStatus().toCustomStatus() : new CustomStatus(), internal, new HashMap<>()); subfile.setUuid(UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.FILE)); @@ -3453,8 +3453,8 @@ OpenCGAResult registerFile(Study study, String filePath, URI fileUri, Stri File subfile = new File(Paths.get(filePath).getFileName().toString(), File.Type.FILE, File.Format.UNKNOWN, File.Bioformat.NONE, fileUri, filePath, "", TimeUtils.getTime(), TimeUtils.getTime(), "", isExternal(study, filePath, fileUri), size, new Software(), new FileExperiment(), Collections.emptyList(), - Collections.emptyList(), jobId, studyManager.getCurrentRelease(study), Collections.emptyList(), Collections.emptyMap(), - new CustomStatus(), FileInternal.initialize(), Collections.emptyMap()); + Collections.emptyList(), jobId, studyManager.getCurrentRelease(study), Collections.emptyList(), null, + Collections.emptyMap(), new CustomStatus(), FileInternal.initialize(), Collections.emptyMap()); subfile.setUuid(UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.FILE)); checkHooks(subfile, study.getFqn(), HookConfiguration.Stage.CREATE); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FileManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FileManagerTest.java index 8378703e864..2aaaf01cee1 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FileManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FileManagerTest.java @@ -844,7 +844,7 @@ public void testCreateFileInLinkedFolder() throws Exception { link(uri, "", studyFqn, new ObjectMap(), token); File file = fileManager.create(studyFqn, new File(File.Type.FILE, File.Format.PLAIN, File.Bioformat.NONE, "folder_to_link/file.txt", - "", FileInternal.initialize(), 0, null, null, "", null, null), false, "bla bla", null, token).first(); + "", FileInternal.initialize(), 0, null, null, "", null, null, null), false, "bla bla", null, token).first(); assertEquals(uri.resolve("file.txt"), file.getUri()); } @@ -1541,7 +1541,7 @@ public void deleteFolderTest() throws CatalogException, IOException { fileManager.create(studyFqn, new File(File.Type.FILE, File.Format.PLAIN, File.Bioformat.NONE, "folder/subfolder/subsubfolder/my_staged.txt", null, FileInternal.initialize().setStatus(new FileStatus(FileStatus.STAGE)), - 0, null, null, "", null, null), true, "bla bla", null, token).first(); + 0, null, null, "", null, null, null), true, "bla bla", null, token).first(); Query query = new Query() .append(FileDBAdaptor.QueryParams.PATH.key(), "~^" + folder.getPath() + "*") diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java index b2fbae8b05f..9fce9188fed 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java @@ -19,7 +19,7 @@ public class AlignmentQualityControl implements Serializable { private List geneCoverageStats; public AlignmentQualityControl() { - this(null, null, null, null, null, new ArrayList<>()); + this(null, new FastQc(), new SamtoolsStats(), new SamtoolsFlagstats(), new HsMetrics(), new ArrayList<>()); } public AlignmentQualityControl(String fileId, FastQc fastQc, SamtoolsStats samtoolsStats, SamtoolsFlagstats samtoolsFlagstats, diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/File.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/File.java index 0171dbc5fd1..3604cf512c4 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/File.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/File.java @@ -71,6 +71,8 @@ public class File extends Annotable { private List tags; private List relatedFiles; + private FileQualityControl qualityControl; + @Deprecated private Map stats; private CustomStatus status; @@ -84,22 +86,22 @@ public File(String name, Type type, Format format, Bioformat bioformat, String p long size, int release) { this(name, type, format, bioformat, uri, path, null, TimeUtils.getTime(), TimeUtils.getTime(), description, false, size, new Software(), new FileExperiment(), Collections.emptyList(), Collections.emptyList(), "", release, - Collections.emptyList(), Collections.emptyMap(), new CustomStatus(), internal, Collections.emptyMap()); + Collections.emptyList(), null, Collections.emptyMap(), new CustomStatus(), internal, Collections.emptyMap()); } public File(Type type, Format format, Bioformat bioformat, String path, String description, FileInternal internal, long size, - List sampleIds, Software software, String jobId, Map stats, + List sampleIds, Software software, String jobId, FileQualityControl qualityControl, Map stats, Map attributes) { this("", type, format, bioformat, null, path, null, TimeUtils.getTime(), TimeUtils.getTime(), description, - false, size, software, new FileExperiment(), sampleIds, Collections.emptyList(), jobId, -1, Collections.emptyList(), stats, - new CustomStatus(), internal, attributes); + false, size, software, new FileExperiment(), sampleIds, Collections.emptyList(), jobId, -1, Collections.emptyList(), + qualityControl, stats, new CustomStatus(), internal, attributes); } public File(String name, Type type, Format format, Bioformat bioformat, URI uri, String path, String checksum, String creationDate, String modificationDate, String description, boolean external, long size, Software software, FileExperiment experiment, List sampleIds, List relatedFiles, String jobId, int release, - List annotationSets, Map stats, CustomStatus status, FileInternal internal, - Map attributes) { + List annotationSets, FileQualityControl qualityControl, Map stats, CustomStatus status, + FileInternal internal, Map attributes) { this.id = StringUtils.isNotEmpty(path) ? StringUtils.replace(path, "/", ":") : path; this.name = name; this.type = type; @@ -122,6 +124,7 @@ public File(String name, Type type, Format format, Bioformat bioformat, URI uri, this.relatedFiles = relatedFiles; this.annotationSets = annotationSets; this.jobId = jobId; + this.qualityControl = qualityControl; this.stats = stats; this.status = status; this.attributes = attributes; @@ -233,11 +236,11 @@ public String toString() { sb.append(", jobId='").append(jobId).append('\''); sb.append(", tags=").append(tags); sb.append(", relatedFiles=").append(relatedFiles); + sb.append(", qualityControl=").append(qualityControl); sb.append(", stats=").append(stats); sb.append(", status=").append(status); sb.append(", internal=").append(internal); sb.append(", attributes=").append(attributes); - sb.append(", annotationSets=").append(annotationSets); sb.append('}'); return sb.toString(); } @@ -254,19 +257,12 @@ public File setStudyUid(long studyUid) { return this; } - public String getUuid() { - return uuid; - } - - public File setUuid(String uuid) { - this.uuid = uuid; - return this; - } - + @Override public String getId() { return id; } + @Override public File setId(String id) { this.id = id; return this; @@ -281,6 +277,16 @@ public File setName(String name) { return this; } + @Override + public String getUuid() { + return uuid; + } + + public File setUuid(String uuid) { + this.uuid = uuid; + return this; + } + public Type getType() { return type; } @@ -308,6 +314,15 @@ public File setBioformat(Bioformat bioformat) { return this; } + public String getChecksum() { + return checksum; + } + + public File setChecksum(String checksum) { + this.checksum = checksum; + return this; + } + public URI getUri() { return uri; } @@ -323,16 +338,15 @@ public String getPath() { public File setPath(String path) { this.path = path; - this.id = StringUtils.isNotEmpty(this.path) ? StringUtils.replace(this.path, "/", ":") : this.path; return this; } - public String getChecksum() { - return checksum; + public int getRelease() { + return release; } - public File setChecksum(String checksum) { - this.checksum = checksum; + public File setRelease(int release) { + this.release = release; return this; } @@ -345,15 +359,6 @@ public File setCreationDate(String creationDate) { return this; } - public int getRelease() { - return release; - } - - public File setRelease(int release) { - this.release = release; - return this; - } - public String getModificationDate() { return modificationDate; } @@ -381,21 +386,30 @@ public File setExternal(boolean external) { return this; } - public FileInternal getInternal() { - return internal; + public long getSize() { + return size; } - public File setInternal(FileInternal internal) { - this.internal = internal; + public File setSize(long size) { + this.size = size; return this; } - public long getSize() { - return size; + public Software getSoftware() { + return software; } - public File setSize(long size) { - this.size = size; + public File setSoftware(Software software) { + this.software = software; + return this; + } + + public FileExperiment getExperiment() { + return experiment; + } + + public File setExperiment(FileExperiment experiment) { + this.experiment = experiment; return this; } @@ -408,12 +422,12 @@ public File setSampleIds(List sampleIds) { return this; } - public Software getSoftware() { - return software; + public String getJobId() { + return jobId; } - public File setSoftware(Software software) { - this.software = software; + public File setJobId(String jobId) { + this.jobId = jobId; return this; } @@ -426,15 +440,6 @@ public File setTags(List tags) { return this; } - public FileExperiment getExperiment() { - return experiment; - } - - public File setExperiment(FileExperiment experiment) { - this.experiment = experiment; - return this; - } - public List getRelatedFiles() { return relatedFiles; } @@ -444,26 +449,19 @@ public File setRelatedFiles(List relatedFiles) { return this; } - public String getJobId() { - return jobId; + public FileQualityControl getQualityControl() { + return qualityControl; } - public File setJobId(String jobId) { - this.jobId = jobId; + public File setQualityControl(FileQualityControl qualityControl) { + this.qualityControl = qualityControl; return this; } - public File setAnnotationSets(List annotationSets) { - super.setAnnotationSets(annotationSets); - return this; - } - - @Deprecated public Map getStats() { return stats; } - @Deprecated public File setStats(Map stats) { this.stats = stats; return this; @@ -478,6 +476,15 @@ public File setStatus(CustomStatus status) { return this; } + public FileInternal getInternal() { + return internal; + } + + public File setInternal(FileInternal internal) { + this.internal = internal; + return this; + } + public Map getAttributes() { return attributes; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java new file mode 100644 index 00000000000..cdd1608525a --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java @@ -0,0 +1,32 @@ +package org.opencb.opencga.core.models.file; + +import org.opencb.opencga.core.models.alignment.AlignmentQualityControl; + +public class FileQualityControl { + private AlignmentQualityControl alignmentQualityControl; + + public FileQualityControl() { + this(new AlignmentQualityControl()); + } + + public FileQualityControl(AlignmentQualityControl alignmentQualityControl) { + this.alignmentQualityControl = alignmentQualityControl; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("FileQualityControl{"); + sb.append("alignmentQualityControl=").append(alignmentQualityControl); + sb.append('}'); + return sb.toString(); + } + + public AlignmentQualityControl getAlignmentQualityControl() { + return alignmentQualityControl; + } + + public FileQualityControl setAlignmentQualityControl(AlignmentQualityControl alignmentQualityControl) { + this.alignmentQualityControl = alignmentQualityControl; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileUpdateParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileUpdateParams.java index 1f046781228..dcbd9748bf8 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileUpdateParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileUpdateParams.java @@ -49,6 +49,7 @@ public class FileUpdateParams { private CustomStatusParams status; private List annotationSets; + private FileQualityControl qualityControl; private Map stats; private Map attributes; @@ -58,7 +59,8 @@ public FileUpdateParams() { public FileUpdateParams(String name, String description, List sampleIds, String checksum, File.Format format, File.Bioformat bioformat, Software software, FileExperiment experiment, List tags, SmallFileInternal internal, Long size, List relatedFiles, CustomStatusParams status, - List annotationSets, Map stats, Map attributes) { + List annotationSets, FileQualityControl qualityControl, Map stats, + Map attributes) { this.name = name; this.description = description; this.sampleIds = sampleIds; @@ -73,6 +75,7 @@ public FileUpdateParams(String name, String description, List sampleIds, this.relatedFiles = relatedFiles; this.status = status; this.annotationSets = annotationSets; + this.qualityControl = qualityControl; this.stats = stats; this.attributes = attributes; } @@ -110,6 +113,7 @@ public String toString() { sb.append(", size=").append(size); sb.append(", status=").append(status); sb.append(", annotationSets=").append(annotationSets); + sb.append(", qualityControl=").append(qualityControl); sb.append(", stats=").append(stats); sb.append(", attributes=").append(attributes); sb.append('}'); @@ -242,6 +246,15 @@ public FileUpdateParams setAnnotationSets(List annotationSets) { return this; } + public FileQualityControl getQualityControl() { + return qualityControl; + } + + public FileUpdateParams setQualityControl(FileQualityControl qualityControl) { + this.qualityControl = qualityControl; + return this; + } + public Map getStats() { return stats; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index f537148d611..e39f63065a1 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -418,92 +418,6 @@ public Response statsRun( @ApiParam(value = AlignmentStatsParams.DESCRIPTION, required = true) AlignmentStatsParams params) { return submitJob(AlignmentStatsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); - -// logger.debug("ObjectMap: {}", params); -// -// SamtoolsWrapperParams samtoolsParams = new SamtoolsWrapperParams(); -// samtoolsParams.setCommand("stats"); -// samtoolsParams.setInputFile(params.getFile()); -// -// Map statsParams = new HashMap<>(); -// statsParams.put(INDEX_STATS_PARAM, "true"); -// samtoolsParams.setSamtoolsParams(statsParams); -// -// logger.debug("ObjectMap (Samtools) : {}", samtoolsParams); -// -// return submitJob(SamtoolsWrapperAnalysis.ID, study, samtoolsParams, jobName, jobDescription, dependsOn, jobTags); - } - - @GET - @Path("/stats/info") - @ApiOperation(value = ALIGNMENT_STATS_INFO_DESCRIPTION, response = SamtoolsStats.class) - public Response statsInfo(@ApiParam(value = FILE_ID_DESCRIPTION, required = true) @QueryParam(FILE_ID_PARAM) String inputFile, - @ApiParam(value = STUDY_DESCRIPTION) @QueryParam(STUDY_PARAM) String study) { - AlignmentStorageManager alignmentStorageManager = new AlignmentStorageManager(catalogManager, storageEngineFactory); - try { - return createOkResponse(alignmentStorageManager.statsInfo(study, inputFile, token)); - } catch (ToolException | CatalogException e) { - return createErrorResponse(e); - } - } - - @Deprecated - @GET - @Path("/stats/query") - @ApiOperation(value = ALIGNMENT_STATS_QUERY_DESCRIPTION, response = File.class, hidden = true) - public Response statsQuery(@ApiParam(value = STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, - @ApiParam(value = RAW_TOTAL_SEQUENCES_DESCRIPTION) @QueryParam(RAW_TOTAL_SEQUENCES) String rawTotalSequences, - @ApiParam(value = FILTERED_SEQUENCES_DESCRIPTION) @QueryParam(FILTERED_SEQUENCES) String filteredSequences, - @ApiParam(value = READS_MAPPED_DESCRIPTION) @QueryParam(READS_MAPPED) String readsMapped, - @ApiParam(value = READS_MAPPED_AND_PAIRED_DESCRIPTION) @QueryParam(READS_MAPPED_AND_PAIRED) String readsMappedAndPaired, - @ApiParam(value = READS_UNMAPPED_DESCRIPTION) @QueryParam(READS_UNMAPPED) String readsUnmapped, - @ApiParam(value = READS_PROPERLY_PAIRED_DESCRIPTION) @QueryParam(READS_PROPERLY_PAIRED) String readsProperlyPaired, - @ApiParam(value = READS_PAIRED_DESCRIPTION) @QueryParam(READS_PAIRED) String readsPaired, - @ApiParam(value = READS_DUPLICATED_DESCRIPTION) @QueryParam(READS_DUPLICATED) String readsDuplicated, - @ApiParam(value = READS_MQ0_DESCRIPTION) @QueryParam(READS_MQ0) String readsMQ0, - @ApiParam(value = READS_QC_FAILED_DESCRIPTION) @QueryParam(READS_QC_FAILED) String readsQCFailed, - @ApiParam(value = NON_PRIMARY_ALIGNMENTS_DESCRIPTION) @QueryParam(NON_PRIMARY_ALIGNMENTS) String nonPrimaryAlignments, - @ApiParam(value = MISMATCHES_DESCRIPTION) @QueryParam(MISMATCHES) String mismatches, - @ApiParam(value = ERROR_RATE_DESCRIPTION) @QueryParam(ERROR_RATE) String errorRate, - @ApiParam(value = AVERAGE_LENGTH_DESCRIPTION) @QueryParam(AVERAGE_LENGTH) String averageLength, - @ApiParam(value = AVERAGE_FIRST_FRAGMENT_LENGTH_DESCRIPTION) @QueryParam(AVERAGE_FIRST_FRAGMENT_LENGTH) String averageFirstFragmentLength, - @ApiParam(value = AVERAGE_LAST_FRAGMENT_LENGTH_DESCRIPTION) @QueryParam(AVERAGE_LAST_FRAGMENT_LENGTH) String averageLastFragmentLength, - @ApiParam(value = AVERAGE_QUALITY_DESCRIPTION) @QueryParam(AVERAGE_QUALITY) String averageQuality, - @ApiParam(value = INSERT_SIZE_AVERAGE_DESCRIPTION) @QueryParam(INSERT_SIZE_AVERAGE) String insertSizeAverage, - @ApiParam(value = INSERT_SIZE_STANDARD_DEVIATION_DESCRIPTION) @QueryParam(INSERT_SIZE_STANDARD_DEVIATION) String insertSizeStandardDeviation, - @ApiParam(value = PAIRS_WITH_OTHER_ORIENTATION_DESCRIPTION) @QueryParam(PAIRS_WITH_OTHER_ORIENTATION) String pairsWithOtherOrientation, - @ApiParam(value = PAIRS_ON_DIFFERENT_CHROMOSOMES_DESCRIPTION) @QueryParam(PAIRS_ON_DIFFERENT_CHROMOSOMES) String pairsOnDifferentChromosomes, - @ApiParam(value = PERCENTAGE_OF_PROPERLY_PAIRED_READS_DESCRIPTION) @QueryParam(PERCENTAGE_OF_PROPERLY_PAIRED_READS) String percentageOfProperlyPairedReads) { - Query query = new Query(); - query.putIfNotNull(RAW_TOTAL_SEQUENCES, rawTotalSequences); - query.putIfNotNull(FILTERED_SEQUENCES, filteredSequences); - query.putIfNotNull(READS_MAPPED, readsMapped); - query.putIfNotNull(READS_MAPPED_AND_PAIRED, readsMappedAndPaired); - query.putIfNotNull(READS_UNMAPPED, readsUnmapped); - query.putIfNotNull(READS_PROPERLY_PAIRED, readsProperlyPaired); - query.putIfNotNull(READS_PAIRED, readsPaired); - query.putIfNotNull(READS_DUPLICATED, readsDuplicated); - query.putIfNotNull(READS_MQ0, readsMQ0); - query.putIfNotNull(READS_QC_FAILED, readsQCFailed); - query.putIfNotNull(NON_PRIMARY_ALIGNMENTS, nonPrimaryAlignments); - query.putIfNotNull(MISMATCHES, mismatches); - query.putIfNotNull(ERROR_RATE, errorRate); - query.putIfNotNull(AVERAGE_LENGTH, averageLength); - query.putIfNotNull(AVERAGE_FIRST_FRAGMENT_LENGTH, averageFirstFragmentLength); - query.putIfNotNull(AVERAGE_LAST_FRAGMENT_LENGTH, averageLastFragmentLength); - query.putIfNotNull(AVERAGE_QUALITY, averageQuality); - query.putIfNotNull(INSERT_SIZE_AVERAGE, insertSizeAverage); - query.putIfNotNull(INSERT_SIZE_STANDARD_DEVIATION, insertSizeStandardDeviation); - query.putIfNotNull(PAIRS_WITH_OTHER_ORIENTATION, pairsWithOtherOrientation); - query.putIfNotNull(PAIRS_ON_DIFFERENT_CHROMOSOMES, pairsOnDifferentChromosomes); - query.putIfNotNull(PERCENTAGE_OF_PROPERLY_PAIRED_READS, percentageOfProperlyPairedReads); - - try { - AlignmentStorageManager alignmentStorageManager = new AlignmentStorageManager(catalogManager, storageEngineFactory); - return createOkResponse(alignmentStorageManager.statsQuery(study, query, QueryOptions.empty(), token)); - } catch (CatalogException e) { - return createErrorResponse(e); - } } //------------------------------------------------------------------------- From 2f0091add8497a59e2d956c9cdad17d234c9faa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 20 Apr 2021 12:08:20 +0100 Subject: [PATCH 200/412] k8s: Add all conf folder into configmap. #1731 --- .../app/cloud/kubernetes/charts/opencga/templates/NOTES.txt | 6 ++++-- .../kubernetes/charts/opencga/templates/configmap.yaml | 4 ++-- opencga-app/app/cloud/kubernetes/setup-k8s.sh | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt index b2fe4431261..31bf60f20ba 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt @@ -32,7 +32,8 @@ Connect to MongoDB database running these commands: export SERVICE_NAME="service/{{ .Values.mongodb.deploy.name }}-svc" kubectl --namespace {{ .Release.Namespace }} port-forward $SERVICE_NAME 27018:27017 - echo "mongo --host localhost --port 27018 --authenticationDatabase {{ .Values.mongodb.authenticationDatabase }} --authenticationMechanism {{ .Values.mongodb.authenticationMechanism }} --username {{ .Values.mongodb.user }} --password XXXXX" + + mongo --host localhost --port 27018 --authenticationDatabase {{ .Values.mongodb.authenticationDatabase }} --authenticationMechanism {{ .Values.mongodb.authenticationMechanism }} --username {{ .Values.mongodb.user }} --password XXXXX {{- end }} {{- if .Values.solr.deploy.enabled }} @@ -42,5 +43,6 @@ Connect to Solr database running these commands: export SERVICE_NAME="service/{{ .Values.solr.deploy.name }}-solrcloud-headless" kubectl --namespace {{ .Release.Namespace }} port-forward $SERVICE_NAME 18983:8983 - echo "Visit http://127.0.0.1:18983 to access Solr GUI" + + Visit http://127.0.0.1:18983 to access Solr GUI {{- end }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml index d1332646c25..5ce055cacdd 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/configmap.yaml @@ -5,6 +5,6 @@ metadata: data: k8s.yml: | {{ include "opencga.labels" . | nindent 4 }} - {{- if ( ne (len (.Files.Glob "conf/**.{xml,yml,yaml}")) 0) }} - {{- (.Files.Glob "conf/**.{xml,yml,yaml}").AsConfig | nindent 2 }} + {{- if ( ne (len (.Files.Glob "conf/**.{xml,yml,yaml,sh}")) 0) }} + {{- (.Files.Glob "conf/**{xml,yml,yaml,sh}").AsConfig | nindent 2 }} {{- end }} diff --git a/opencga-app/app/cloud/kubernetes/setup-k8s.sh b/opencga-app/app/cloud/kubernetes/setup-k8s.sh index 5eda09ee7d0..a3fdb07e628 100755 --- a/opencga-app/app/cloud/kubernetes/setup-k8s.sh +++ b/opencga-app/app/cloud/kubernetes/setup-k8s.sh @@ -228,6 +228,7 @@ function deploySolrOperator() { function deployMongodbOperator() { NAME="mongodb-operator${NAME_SUFFIX}" DATE=$(date "+%Y%m%d%H%M%S") + chmod +x ./charts/mongodb-operator/fetch-mongodb-operator-files.sh ./charts/mongodb-operator/fetch-mongodb-operator-files.sh helm upgrade "${NAME}" charts/mongodb-operator \ @@ -251,8 +252,7 @@ function deployOpenCGA() { mkdir "$OPENCGA_CHART" mkdir "$OPENCGA_CHART"/conf cp -r charts/opencga/* "${OPENCGA_CHART:?}" - cp -r "${OPENCGA_CONF_DIR:?}"/*.yml "$OPENCGA_CHART"/conf - cp -r "${OPENCGA_CONF_DIR:?}"/log4j2.*.xml "$OPENCGA_CHART"/conf + cp "${OPENCGA_CONF_DIR:?}"/* "$OPENCGA_CHART"/conf else OPENCGA_CHART=charts/opencga/ fi From 10ea92698455a64930c237e1d9469fd4541dc8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 21 Apr 2021 09:08:50 +0200 Subject: [PATCH 201/412] analysis: implement alignment/flagstats as a job, and update to biodata changes (FastQcMetrics), #1739 --- .../qc/AlignmentFlagStatsAnalysis.java | 124 +++++++++++++++ .../analysis/sample/qc/SampleQcAnalysis.java | 141 +++++++++--------- .../FastqcWrapperAnalysisExecutor.java | 4 +- .../SamtoolsWrapperAnalysisExecutor.java | 31 +++- .../internal/InternalCliOptionsParser.java | 1 + .../executors/AlignmentCommandExecutor.java | 15 +- .../app/cli/main/OpencgaCliOptionsParser.java | 1 + .../analysis/AlignmentCommandExecutor.java | 7 +- .../catalog/StudyCommandExecutor.java | 2 +- .../catalog/managers/SampleManagerTest.java | 4 +- opencga-client/pom.xml | 5 + .../client/rest/clients/AdminClient.java | 22 ++- .../client/rest/clients/AlignmentClient.java | 38 ++--- .../client/rest/clients/ClinicalClient.java | 2 +- .../client/rest/clients/CohortClient.java | 2 +- .../rest/clients/DiseasePanelClient.java | 5 +- .../client/rest/clients/FamilyClient.java | 2 +- .../client/rest/clients/FileClient.java | 3 +- .../client/rest/clients/GA4GHClient.java | 2 +- .../client/rest/clients/IndividualClient.java | 2 +- .../client/rest/clients/JobClient.java | 2 +- .../client/rest/clients/MetaClient.java | 5 +- .../client/rest/clients/ProjectClient.java | 2 +- .../client/rest/clients/SampleClient.java | 2 +- .../client/rest/clients/StudyClient.java | 47 ++++-- .../client/rest/clients/UserClient.java | 30 ++-- .../client/rest/clients/VariantClient.java | 2 +- .../rest/clients/VariantOperationClient.java | 2 +- .../client/template/TemplateManager.java | 1 + .../alignment/AlignmentFlagStatsParams.java | 45 ++++++ .../alignment/AlignmentQualityControl.java | 34 ++--- .../SampleAlignmentQualityControlMetrics.java | 18 +-- .../rest/analysis/AlignmentWebService.java | 18 +-- 33 files changed, 423 insertions(+), 198 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentFlagStatsParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java new file mode 100644 index 00000000000..1991bfa20ad --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java @@ -0,0 +1,124 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.alignment.qc; + +import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; +import org.opencb.biodata.formats.alignment.samtools.io.SamtoolsFlagstatsParser; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysisExecutor; +import org.opencb.opencga.catalog.db.api.FileDBAdaptor; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.file.FileQualityControl; +import org.opencb.opencga.core.models.file.FileUpdateParams; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import static org.apache.commons.io.FileUtils.readLines; +import static org.opencb.opencga.core.api.ParamConstants.ALIGNMENT_FLAG_STATS_DESCRIPTION; +import static org.opencb.opencga.core.tools.OpenCgaToolExecutor.EXECUTOR_ID; + +@Tool(id = AlignmentFlagStatsAnalysis.ID, resource = Enums.Resource.ALIGNMENT) +public class AlignmentFlagStatsAnalysis extends OpenCgaToolScopeStudy { + + public static final String ID = "alignment-flagstats"; + public static final String DESCRIPTION = ALIGNMENT_FLAG_STATS_DESCRIPTION; + + private static final String SAMTOOLS_FLAG_STATS_STEP = "samtools-flagstat"; + private static final String SAVE_ALIGNMENT_FLAG_STATS_STEP = "save-alignment-flagstats"; + + @ToolParams + protected final AlignmentFlagStatsParams analysisParams = new AlignmentFlagStatsParams(); + + private File catalogBamFile; + + @Override + protected void check() throws Exception { + super.check(); + + if (StringUtils.isEmpty(getStudy())) { + throw new ToolException("Missing study"); + } + + if (StringUtils.isEmpty(analysisParams.getFile())) { + throw new ToolException("Missing file"); + } + + Query query = new Query(FileDBAdaptor.QueryParams.ID.key(), analysisParams.getFile()); + query.put(FileDBAdaptor.QueryParams.FORMAT.key(), File.Format.BAM); + OpenCGAResult fileResult = catalogManager.getFileManager().search(getStudy(), query, QueryOptions.empty(), token); + if (fileResult.getNumResults() != 1) { + throw new ToolException("File " + analysisParams.getFile() + " must be a BAM file in study " + getStudy()); + } + + catalogBamFile = fileResult.getResults().get(0); + } + + @Override + protected List getSteps() { + List steps = new ArrayList<>(); + steps.add(SAMTOOLS_FLAG_STATS_STEP); + steps.add(SAVE_ALIGNMENT_FLAG_STATS_STEP); + return steps; + } + + @Override + protected void run() throws ToolException { + + setUpStorageEngineExecutor(study); + + Path flagStatsFile = getOutDir().resolve(new java.io.File(catalogBamFile.getUri().getPath()).getName() + ".flagstats.txt"); + + step(SAMTOOLS_FLAG_STATS_STEP, () -> { + executorParams.put(EXECUTOR_ID, SamtoolsWrapperAnalysisExecutor.ID); + getToolExecutor(SamtoolsWrapperAnalysisExecutor.class) + .setCommand("flagstat") + .setInputFile(catalogBamFile.getUri().getPath()) + .execute(); + }); + + step(SAVE_ALIGNMENT_FLAG_STATS_STEP, () -> { + + if (flagStatsFile.toFile().exists()) { + SamtoolsFlagstats flagStats = SamtoolsFlagstatsParser.parse(flagStatsFile); + + // Update quality control for the catalog file + FileQualityControl qc = catalogBamFile.getQualityControl(); + // Sanity check + if (qc == null) { + qc = new FileQualityControl(); + } + qc.getAlignmentQualityControl().setSamtoolsFlagStats(flagStats); + + catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), + QueryOptions.empty(), getToken()); + } else { + throw new ToolException("Something wrong happened: flag stats file " + flagStatsFile.getFileName() + " not found!"); + } + }); + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 24916d7f0d2..9832317d3b5 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -18,8 +18,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.formats.sequence.fastqc.FastQc; -import org.opencb.biodata.formats.sequence.fastqc.io.FastQcParser; import org.opencb.biodata.models.clinical.qc.MutationalSignature; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.biodata.models.clinical.qc.Signature; @@ -83,7 +81,7 @@ public class SampleQcAnalysis extends OpenCgaToolScopeStudy { private Sample sample; private File catalogBamFile; private SampleVariantQualityControlMetrics variantQcMetrics; - private SampleAlignmentQualityControlMetrics alignmentQcMetrics; + //private SampleAlignmentQualityControlMetrics alignmentQcMetrics; private Job variantStatsJob = null; private Job signatureJob = null; private Job fastQcJob = null; @@ -156,7 +154,7 @@ protected void run() throws ToolException { } // Get sample quality control metrics to update - alignmentQcMetrics = getSampleAlignmentQualityControlMetrics(); +// alignmentQcMetrics = getSampleAlignmentQualityControlMetrics(); variantQcMetrics = sample.getQualityControl().getVariantMetrics(); SampleQcAnalysisExecutor executor = getToolExecutor(SampleQcAnalysisExecutor.class); @@ -173,19 +171,20 @@ protected void run() throws ToolException { .setSignatureId(signatureId) .setSignatureQuery(signatureQuery) .setGenesForCoverageStats(genesForCoverageStats) - .setAlignmentQcMetrics(alignmentQcMetrics); +// .setAlignmentQcMetrics(alignmentQcMetrics) + ; // Step by step step(VARIANT_STATS_STEP, () -> runVariantStats()); - step(FASTQC_STEP, () -> runFastQc());//executor.setQcType(SampleQcAnalysisExecutor.QcType.FASTQC).execute()); +// step(FASTQC_STEP, () -> runFastQc());//executor.setQcType(SampleQcAnalysisExecutor.QcType.FASTQC).execute()); step(FLAG_STATS_STEP, () -> executor.setQcType(SampleQcAnalysisExecutor.QcType.FLAG_STATS).execute()); step(HS_METRICS_STEP, () -> executor.setQcType(SampleQcAnalysisExecutor.QcType.HS_METRICS).execute()); step(GENE_COVERAGE_STEP, () -> executor.setQcType(SampleQcAnalysisExecutor.QcType.GENE_COVERAGE_STATS).execute()); step(MUTATIONAL_SIGNATUR_STEP, () -> runSignature()); // Finally, update sample quality control metrics - alignmentQcMetrics = executor.getAlignmentQcMetrics(); - updateSampleQualityControlMetrics(alignmentQcMetrics); +// alignmentQcMetrics = executor.getAlignmentQcMetrics(); +// updateSampleQualityControlMetrics(alignmentQcMetrics); } private void runVariantStats() throws ToolException { @@ -275,69 +274,69 @@ private void runSignature() throws ToolException { } - private void runFastQc() throws ToolException { - if (fastQcJob == null) { - addWarning("Skipping FastQc analysis"); - return; - } - - if (CollectionUtils.isNotEmpty(fastQcJob.getOutput())) { - FastQc fastQc = null; - - // First, look for fastqc_data.txt to parse it - for (File file: fastQcJob.getOutput()) { - if (file.getName().equals("fastqc_data.txt")) { - try { - fastQc = FastQcParser.parse(Paths.get(file.getUri().getPath()).toFile()); - } catch (IOException e) { - throw new ToolException(e); - } - } - } - - // Second, add images to the FastQc object - if (fastQc != null) { - for (File file : fastQcJob.getOutput()) { - switch (file.getName()) { - case "adapter_content.png": { - fastQc.getAdapterContent().setFile(file.getId()); - break; - } - case "per_base_n_content.png": { - fastQc.getPerBaseNContent().setFile(file.getId()); - break; - } - case "per_base_sequence_content.png": { - fastQc.getPerBaseSeqContent().setFile(file.getId()); - break; - } - case "per_sequence_quality.png": { - fastQc.getPerSeqQualityScore().setFile(file.getId()); - break; - } - case "duplication_levels.png": { - fastQc.getSeqDuplicationLevel().setFile(file.getId()); - break; - } - case "per_base_quality.png": { - fastQc.getPerBaseSeqQuality().setFile(file.getId()); - break; - } - case "per_sequence_gc_content.png": { - fastQc.getPerSeqGcContent().setFile(file.getId()); - break; - } - case "sequence_length_distribution.png": { - fastQc.getSeqLengthDistribution().setFile(file.getId()); - break; - } - } - } - - alignmentQcMetrics.setFastQc(fastQc); - } - } - } +// private void runFastQc() throws ToolException { +// if (fastQcJob == null) { +// addWarning("Skipping FastQc analysis"); +// return; +// } +// +// if (CollectionUtils.isNotEmpty(fastQcJob.getOutput())) { +// FastQc fastQc = null; +// +// // First, look for fastqc_data.txt to parse it +// for (File file: fastQcJob.getOutput()) { +// if (file.getName().equals("fastqc_data.txt")) { +// try { +// fastQc = FastQcParser.parse(Paths.get(file.getUri().getPath()).toFile()); +// } catch (IOException e) { +// throw new ToolException(e); +// } +// } +// } +// +// // Second, add images to the FastQc object +// if (fastQc != null) { +// for (File file : fastQcJob.getOutput()) { +// switch (file.getName()) { +// case "adapter_content.png": { +// fastQc.getAdapterContent().setFile(file.getId()); +// break; +// } +// case "per_base_n_content.png": { +// fastQc.getPerBaseNContent().setFile(file.getId()); +// break; +// } +// case "per_base_sequence_content.png": { +// fastQc.getPerBaseSeqContent().setFile(file.getId()); +// break; +// } +// case "per_sequence_quality.png": { +// fastQc.getPerSeqQualityScore().setFile(file.getId()); +// break; +// } +// case "duplication_levels.png": { +// fastQc.getSeqDuplicationLevel().setFile(file.getId()); +// break; +// } +// case "per_base_quality.png": { +// fastQc.getPerBaseSeqQuality().setFile(file.getId()); +// break; +// } +// case "per_sequence_gc_content.png": { +// fastQc.getPerSeqGcContent().setFile(file.getId()); +// break; +// } +// case "sequence_length_distribution.png": { +// fastQc.getSeqLengthDistribution().setFile(file.getId()); +// break; +// } +// } +// } +// +// alignmentQcMetrics.setFastQc(fastQc); +// } +// } +// } private SampleAlignmentQualityControlMetrics getSampleAlignmentQualityControlMetrics() { String bamFileId = (catalogBamFile == null) ? "" : catalogBamFile.getId(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java index d5fbdee8271..61bf4620e1a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java @@ -2,7 +2,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import org.opencb.biodata.formats.sequence.fastqc.FastQc; +import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.wrappers.FastqcWrapperAnalysis; import org.opencb.opencga.catalog.managers.CatalogManager; @@ -56,7 +56,7 @@ public void run() throws ToolException { runCommandLine(sb.toString()); } - public FastQc getResult() throws ToolException { + public FastQcMetrics getResult() throws ToolException { return null; // File[] files = outDir.toFile().listFiles(); // if (files != null) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java index 0848b9ede9a..c978aa7bffb 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java @@ -102,16 +102,20 @@ protected void run() throws Exception { // } // break; // } + case "flagstat": { + File file = getOutDir().resolve(STDOUT_FILENAME).toFile(); + List lines = readLines(file, Charset.defaultCharset()); + if (lines.size() > 0 && lines.get(0).contains("QC-passed")) { + FileUtils.copyFile(file, outputFile); + success = true; + } + break; + } case "stats": { File file = getOutDir().resolve(STDOUT_FILENAME).toFile(); List lines = readLines(file, Charset.defaultCharset()); if (lines.size() > 0 && lines.get(0).startsWith("# This file was produced by samtools stats")) { FileUtils.copyFile(file, outputFile); -// if (getExecutorParams().containsKey(INDEX_STATS_PARAM) && getExecutorParams().getBoolean(INDEX_STATS_PARAM) && !isIndexed()) { -// SamtoolsStats alignmentStats = parseSamtoolsStats(outputFile, new File(getInputFile()).getName()); -// System.out.println("samtools wrapper local analysis executor, stats: " + alignmentStats.toString()); -// indexStats(alignmentStats); -// } success = true; } break; @@ -173,6 +177,10 @@ private String getOutputFilename() throws ToolException { outputFilename = prefix + ".stats.txt"; break; } + case "flagstat": { + outputFilename = prefix + ".flagstats.txt"; + break; + } case "depth": { outputFilename = prefix + ".depth.txt"; break; @@ -270,6 +278,11 @@ public String getCommandLine() throws ToolException { sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); break; } + case "flagstat": { + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + break; + } case "index": { file = new File(getInputFile()); sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); @@ -371,6 +384,14 @@ protected boolean isValidParameter(String param) { } break; } + case "flagstat": { + switch (param) { + case "input-fmt-option": { + return false; + } + } + break; + } case "sort": { switch (param) { case "reference": diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java index c4f4d564652..4acee7d4a96 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java @@ -179,6 +179,7 @@ public InternalCliOptionsParser() { alignmentSubCommands.addCommand("index-run", alignmentCommandOptions.indexAlignmentCommandOptions); alignmentSubCommands.addCommand("query", alignmentCommandOptions.queryAlignmentCommandOptions); alignmentSubCommands.addCommand("stats-run", alignmentCommandOptions.statsAlignmentCommandOptions); + alignmentSubCommands.addCommand("flagstats-run", alignmentCommandOptions.flagStatsAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-run", alignmentCommandOptions.coverageAlignmentCommandOptions); // alignmentSubCommands.addCommand("annotate", alignmentCommandOptions.annotateVariantCommandOptions); alignmentSubCommands.addCommand(BWA_RUN_COMMAND, alignmentCommandOptions.bwaCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 422d76bc097..826046a8804 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -18,12 +18,14 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; +import org.opencb.opencga.analysis.alignment.qc.AlignmentFlagStatsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; import java.nio.file.Paths; @@ -142,20 +144,19 @@ private void statsRun() throws ToolException { ).toObjectMap(cliOptions.commonOptions.params) .append(ParamConstants.STUDY_PARAM, cliOptions.study); - System.out.println("alignment command executor: params = " + params.toJson()); - System.out.println("----> cliOptions.study = " + cliOptions.study); - System.out.println("----> cliOptions.outdir = " + cliOptions.outdir); - toolRunner.execute(AlignmentStatsAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } private void flagStatsRun() throws ToolException { AlignmentCommandOptions.FlagStatsAlignmentCommandOptions cliOptions = alignmentCommandOptions.flagStatsAlignmentCommandOptions; - AlignmentStorageManager alignmentManager = new AlignmentStorageManager(catalogManager, storageEngineFactory, - alignmentCommandOptions.internalJobOptions.jobId); + ObjectMap params = new AlignmentFlagStatsParams( + cliOptions.file, + cliOptions.outdir + ).toObjectMap(cliOptions.commonOptions.params) + .append(ParamConstants.STUDY_PARAM, cliOptions.study); - alignmentManager.flagStatsRun(cliOptions.study, cliOptions.file, cliOptions.outdir, cliOptions.commonOptions.token); + toolRunner.execute(AlignmentFlagStatsAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } private void coverageRun() throws ToolException { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index c59f034e4c4..b48c341cd0b 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -255,6 +255,7 @@ public OpencgaCliOptionsParser() { alignmentSubCommands.addCommand("index-run", alignmentCommandOptions.indexAlignmentCommandOptions); alignmentSubCommands.addCommand("query", alignmentCommandOptions.queryAlignmentCommandOptions); alignmentSubCommands.addCommand("stats-run", alignmentCommandOptions.statsAlignmentCommandOptions); + alignmentSubCommands.addCommand("flagstats-run", alignmentCommandOptions.flagStatsAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-index-run", alignmentCommandOptions.coverageAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-query", alignmentCommandOptions.coverageQueryAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-ratio", alignmentCommandOptions.coverageRatioAlignmentCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index eb472c86520..f70b9361565 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -84,7 +84,7 @@ public void execute() throws Exception { case "stats-run": queryResponse = statsRun(); break; - case "flag-stats-run": + case "flagstats-run": queryResponse = flagStatsRun(); break; case "coverage-index-run": @@ -346,10 +346,9 @@ private RestResponse flagStatsRun() throws ClientException { ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); params.putAll(getJobParams()); - return null; -// return openCGAClient.getAlignmentClient().runFlagStats(new AlignmentStatsParams(cliOptions.file), params); + return openCGAClient.getAlignmentClient().runFlagstats(new AlignmentFlagStatsParams(cliOptions.file, cliOptions.outdir), params); } - + //------------------------------------------------------------------------- // COVERAGE: index/run, info, query and stats //------------------------------------------------------------------------- diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/StudyCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/StudyCommandExecutor.java index be076552314..3533bbac25f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/StudyCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/StudyCommandExecutor.java @@ -224,7 +224,7 @@ private RestResponse search() throws ClientException { } /************************************************* Groups commands *********************************************************/ - private RestResponse groups() throws CatalogException, ClientException { + private RestResponse groups() throws CatalogException, ClientException { logger.debug("Groups"); studiesCommandOptions.groupsCommandOptions.study = getSingleValidStudy(studiesCommandOptions.groupsCommandOptions.study); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java index bec81446b7f..57b3c6ee234 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.bson.Document; import org.junit.Test; -import org.opencb.biodata.formats.sequence.fastqc.FastQc; +import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; import org.opencb.biodata.formats.sequence.fastqc.Summary; import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; @@ -569,7 +569,7 @@ public void updateQualityControlField() throws CatalogException { SampleQualityControl qualityControl = new SampleQualityControl(); SampleAlignmentQualityControlMetrics metrics = new SampleAlignmentQualityControlMetrics(); - metrics.setFastQc(new FastQc().setSummary(new Summary("basicStatistics", "perBaseSeqQuality", "perTileSeqQuality", + metrics.setFastQc(new FastQcMetrics().setSummary(new Summary("basicStatistics", "perBaseSeqQuality", "perTileSeqQuality", "perSeqQualityScores", "perBaseSeqContent", "perSeqGcContent", "perBaseNContent", "seqLengthDistribution", "seqDuplicationLevels", "overrepresentedSeqs", "adapterContent", "kmerContent"))); diff --git a/opencga-client/pom.xml b/opencga-client/pom.xml index e084210ad06..ad40a10847b 100644 --- a/opencga-client/pom.xml +++ b/opencga-client/pom.xml @@ -72,6 +72,11 @@ test-jar ${opencga.version} + + org.opencb.opencga + opencga-catalog + ${opencga.version} + org.opencb.opencga opencga-server diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java index 52b3c529807..ff31a47e256 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java @@ -25,6 +25,7 @@ import org.opencb.opencga.core.models.admin.JWTParams; import org.opencb.opencga.core.models.admin.UserCreateParams; import org.opencb.opencga.core.models.admin.UserImportParams; +import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Group; import org.opencb.opencga.core.models.user.User; import org.opencb.opencga.core.response.RestResponse; @@ -34,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -134,6 +135,25 @@ public RestResponse importUsers(UserImportParams data) throws ClientExcept return execute("admin", null, "users", null, "import", params, POST, User.class); } + /** + * User search method. + * @param params Map containing any of the following optional parameters. + * include: Fields included in the response, whole JSON path must be provided. + * exclude: Fields excluded in the response, whole JSON path must be provided. + * limit: Number of results to be returned. + * skip: Number of results to skip. + * count: Get the total number of results matching the query. Deactivated by default. + * user: User ID. + * account: Account type [GUEST, FULL, ADMINISTRATOR]. + * authenticationId: Authentication origin ID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse searchUsers(ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + return execute("admin", null, "users", null, "search", params, GET, Sample.class); + } + /** * Synchronise a group of users from an authentication origin with a group in a study from catalog. * @param data JSON containing the parameters. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java index f3d4a765710..de91c889f23 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java @@ -17,13 +17,13 @@ package org.opencb.opencga.client.rest.clients; import org.ga4gh.models.ReadAlignment; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; import org.opencb.biodata.models.alignment.GeneCoverageStats; import org.opencb.biodata.models.alignment.RegionCoverage; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; +import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; import org.opencb.opencga.core.models.alignment.AlignmentIndexParams; import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; import org.opencb.opencga.core.models.alignment.BwaWrapperParams; @@ -40,7 +40,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -194,6 +194,24 @@ public RestResponse runFastqc(FastQcWrapperParams data, ObjectMap params) t return execute("analysis", null, "alignment/fastqc", null, "run", params, POST, Job.class); } + /** + * Compute flag stats (based on samtools/flagstat command) for a given alignment file. + * @param data Alignment flag stats params. + * @param params Map containing any of the following optional parameters. + * study: study. + * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. + * jobDependsOn: Comma separated list of existing job IDs the job will depend on. + * jobDescription: Job description. + * jobTags: Job tags. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse runFlagstats(AlignmentFlagStatsParams data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("analysis", null, "alignment/flagstats", null, "run", params, POST, Job.class); + } + /** * Index alignment file. * @param data Alignment index params. @@ -282,21 +300,7 @@ public RestResponse runSamtools(SamtoolsWrapperParams data, ObjectMap param } /** - * Show the stats for a given alignment file. - * @param file File ID. - * @param params Map containing any of the following optional parameters. - * study: Study [[user@]project:]study where study and project can be either the ID or UUID. - * @return a RestResponse object. - * @throws ClientException ClientException if there is any server error. - */ - public RestResponse infoStats(String file, ObjectMap params) throws ClientException { - params = params != null ? params : new ObjectMap(); - params.putIfNotNull("file", file); - return execute("analysis", null, "alignment/stats", null, "info", params, GET, SamtoolsStats.class); - } - - /** - * Compute stats for a given alignment file. + * Compute stats (based on samtools/stats command) for a given alignment file. * @param data Alignment stats params. * @param params Map containing any of the following optional parameters. * study: study. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java index 8bd28640122..87d4ca62e0b 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java @@ -46,7 +46,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java index 4e4b1321ae6..402d736568a 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java index 61e5ed5108c..ced4c79e1e9 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java @@ -31,7 +31,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -72,7 +72,8 @@ public RestResponse updateAcl(String members, String action, PanelAcl * @param data Panel parameters. * @param params Map containing any of the following optional parameters. * study: Study [[user@]project:]study where study and project can be either the ID or UUID. - * source: Comma separated list of sources to import panels from. Current supported sources are 'panelapp' and 'genecensus'. + * source: Comma separated list of sources to import panels from. Current supported sources are 'panelapp' and + * 'cancer-gene-census'. * id: Comma separated list of panel IDs to be imported from the defined source.If 'source' is provided and 'id' is empty, it * will import all the panels from the source. When 'id' is provided, only one 'source' will be allowed. * @return a RestResponse object. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java index cc2a01e9a4a..5a57bb6d747 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java index 5d74f04c099..a4ecb0d91e9 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -284,6 +284,7 @@ public RestResponse runPostlink(PostLinkToolParams data, ObjectMap params) * format: Comma separated Format values. For existing Formats see files/formats. * status: Filter by status. * internalStatus: Filter by internal status. + * internalIndexStatus: Filter by internal index status. * directory: Directory under which we want to look for files or folders. * creationDate: Creation date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805. * modificationDate: Modification date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java index 288e3998b7d..628894c21f4 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java @@ -27,7 +27,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java index 6e14e120315..5822ff9ab76 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java index 12d04f977cc..176f305f8ca 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java index 5bd3bea4459..855ca0dae03 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java @@ -16,20 +16,19 @@ package org.opencb.opencga.client.rest.clients; +import java.util.List; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; import org.opencb.opencga.core.response.RestResponse; -import java.util.List; - /* * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java index f9e20a8ff2b..c2f8b502a26 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java @@ -32,7 +32,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java index d17ed9a85c1..d03f476d9b9 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java index 57763ca0658..7dfcf48b824 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java @@ -18,20 +18,11 @@ import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; -import org.opencb.opencga.core.models.study.Group; -import org.opencb.opencga.core.models.study.GroupCreateParams; -import org.opencb.opencga.core.models.study.GroupUpdateParams; -import org.opencb.opencga.core.models.study.PermissionRule; -import org.opencb.opencga.core.models.study.Study; -import org.opencb.opencga.core.models.study.StudyAclUpdateParams; -import org.opencb.opencga.core.models.study.StudyCreateParams; -import org.opencb.opencga.core.models.study.StudyUpdateParams; -import org.opencb.opencga.core.models.study.Variable; -import org.opencb.opencga.core.models.study.VariableSet; -import org.opencb.opencga.core.models.study.VariableSetCreateParams; +import org.opencb.opencga.core.models.study.*; import org.opencb.opencga.core.response.RestResponse; @@ -39,7 +30,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -172,19 +163,43 @@ public RestResponse info(String studies, ObjectMap params) throws ClientE } /** - * Return the groups present in the study. + * Search audit collection. + * @param study Study ID. + * @param params Map containing any of the following optional parameters. + * include: Fields included in the response, whole JSON path must be provided. + * exclude: Fields excluded in the response, whole JSON path must be provided. + * limit: Number of results to be returned. + * skip: Number of results to skip. + * count: Get the total number of results matching the query. Deactivated by default. + * operationId: Audit operation UUID. + * userId: User ID. + * action: Action performed by the user. + * resource: Resource involved. + * resourceId: Resource ID. + * resourceUuid: resource UUID. + * status: Filter by status. + * date: Date. Format: yyyyMMddHHmmss. Examples: >2018, 2017-2018, <201805. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse searchAudit(String study, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + return execute("studies", study, "audit", null, "search", params, GET, AuditRecord.class); + } + + /** + * Return the groups present in the study. For owners and administrators only. * @param study Study [[user@]project:]study where study and project can be either the ID or UUID. * @param params Map containing any of the following optional parameters. * id: Group id. If provided, it will only fetch information for the provided group. - * name: [DEPRECATED] Replaced by id. * silent: Boolean to retrieve all possible entries that are queried for, false to raise an exception whenever one of the entries * looked for cannot be shown for whichever reason. * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse groups(String study, ObjectMap params) throws ClientException { + public RestResponse groups(String study, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); - return execute("studies", study, null, null, "groups", params, GET, Group.class); + return execute("studies", study, null, null, "groups", params, GET, CustomGroup.class); } /** diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java index 536e6e38f70..d52a482ba01 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java @@ -37,7 +37,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -92,6 +92,20 @@ public RestResponse password(PasswordChangeParams data) throws ClientExcep return execute("users", null, null, null, "password", params, POST, User.class); } + /** + * Return the user information including its projects and studies. + * @param users Comma separated list of user IDs. + * @param params Map containing any of the following optional parameters. + * include: Fields included in the response, whole JSON path must be provided. + * exclude: Fields excluded in the response, whole JSON path must be provided. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse info(String users, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + return execute("users", users, null, null, "info", params, GET, User.class); + } + /** * Fetch a user configuration. * @param user User ID. @@ -163,20 +177,6 @@ public RestResponse updateFilter(String user, String filterId, Filte return execute("users", user, "filters", filterId, "update", params, POST, UserFilter.class); } - /** - * Return the user information including its projects and studies. - * @param user User ID. - * @param params Map containing any of the following optional parameters. - * include: Fields included in the response, whole JSON path must be provided. - * exclude: Fields excluded in the response, whole JSON path must be provided. - * @return a RestResponse object. - * @throws ClientException ClientException if there is any server error. - */ - public RestResponse info(String user, ObjectMap params) throws ClientException { - params = params != null ? params : new ObjectMap(); - return execute("users", user, null, null, "info", params, GET, User.class); - } - /** * Retrieve the projects of the user. * @param user User ID. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 7b19a094b2e..89ce6468437 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -59,7 +59,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java index c57ec62cdf6..76e1ba45240 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-03-19 11:23:04 +* Autogenerated on: 2021-04-20 10:46:09 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java index 195d455ccab..1369f3b1ebf 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java @@ -653,6 +653,7 @@ private void updateFile(String fileId, TemplateFile file, ObjectMap params) thro file.getRelatedFiles(), file.getStatus(), file.getAnnotationSets(), + file.getQualityControl(), file.getStats(), file.getAttributes() ), params); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentFlagStatsParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentFlagStatsParams.java new file mode 100644 index 00000000000..bf8f06980ce --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentFlagStatsParams.java @@ -0,0 +1,45 @@ +package org.opencb.opencga.core.models.alignment; + +import org.opencb.opencga.core.tools.ToolParams; + +public class AlignmentFlagStatsParams extends ToolParams { + public static final String DESCRIPTION = "Alignment flag stats params"; + + private String file; + private String outdir; + + public AlignmentFlagStatsParams() { + } + + public AlignmentFlagStatsParams(String file, String outdir) { + this.file = file; + this.outdir = outdir; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("AlignmentFlagStatsParams{"); + sb.append("file='").append(file).append('\''); + sb.append(", outdir='").append(outdir).append('\''); + sb.append('}'); + return sb.toString(); + } + + public String getFile() { + return file; + } + + public AlignmentFlagStatsParams setFile(String file) { + this.file = file; + return this; + } + + public String getOutdir() { + return outdir; + } + + public AlignmentFlagStatsParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java index 9fce9188fed..063a65a9593 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java @@ -3,7 +3,7 @@ import org.opencb.biodata.formats.alignment.picard.HsMetrics; import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; -import org.opencb.biodata.formats.sequence.fastqc.FastQc; +import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; import org.opencb.biodata.models.alignment.GeneCoverageStats; import java.io.Serializable; @@ -12,22 +12,22 @@ public class AlignmentQualityControl implements Serializable { private String fileId; - private FastQc fastQc; + private FastQcMetrics fastQcMetrics; private SamtoolsStats samtoolsStats; - private SamtoolsFlagstats samtoolsFlagstats; + private SamtoolsFlagstats samtoolsFlagStats; private HsMetrics hsMetrics; private List geneCoverageStats; public AlignmentQualityControl() { - this(null, new FastQc(), new SamtoolsStats(), new SamtoolsFlagstats(), new HsMetrics(), new ArrayList<>()); + this(null, new FastQcMetrics(), new SamtoolsStats(), new SamtoolsFlagstats(), new HsMetrics(), new ArrayList<>()); } - public AlignmentQualityControl(String fileId, FastQc fastQc, SamtoolsStats samtoolsStats, SamtoolsFlagstats samtoolsFlagstats, + public AlignmentQualityControl(String fileId, FastQcMetrics fastQcMetrics, SamtoolsStats samtoolsStats, SamtoolsFlagstats samtoolsFlagStats, HsMetrics hsMetrics, List geneCoverageStats) { this.fileId = fileId; - this.fastQc = fastQc; + this.fastQcMetrics = fastQcMetrics; this.samtoolsStats = samtoolsStats; - this.samtoolsFlagstats = samtoolsFlagstats; + this.samtoolsFlagStats = samtoolsFlagStats; this.hsMetrics = hsMetrics; this.geneCoverageStats = geneCoverageStats; } @@ -36,9 +36,9 @@ public AlignmentQualityControl(String fileId, FastQc fastQc, SamtoolsStats samto public String toString() { final StringBuilder sb = new StringBuilder("AlignmentQualityControl{"); sb.append("fileId='").append(fileId).append('\''); - sb.append(", fastQc=").append(fastQc); + sb.append(", fastQcMetrics=").append(fastQcMetrics); sb.append(", samtoolsStats=").append(samtoolsStats); - sb.append(", samtoolsFlagstats=").append(samtoolsFlagstats); + sb.append(", samtoolsFlagstats=").append(samtoolsFlagStats); sb.append(", hsMetrics=").append(hsMetrics); sb.append(", geneCoverageStats=").append(geneCoverageStats); sb.append('}'); @@ -54,12 +54,12 @@ public AlignmentQualityControl setFileId(String fileId) { return this; } - public FastQc getFastQc() { - return fastQc; + public FastQcMetrics getFastQcMetrtics() { + return fastQcMetrics; } - public AlignmentQualityControl setFastQc(FastQc fastQc) { - this.fastQc = fastQc; + public AlignmentQualityControl setFastQcMetrics(FastQcMetrics fastQcMetrics) { + this.fastQcMetrics = fastQcMetrics; return this; } @@ -72,12 +72,12 @@ public AlignmentQualityControl setSamtoolsStats(SamtoolsStats samtoolsStats) { return this; } - public SamtoolsFlagstats getSamtoolsFlagstats() { - return samtoolsFlagstats; + public SamtoolsFlagstats getSamtoolsFlagStats() { + return samtoolsFlagStats; } - public AlignmentQualityControl setSamtoolsFlagstats(SamtoolsFlagstats samtoolsFlagstats) { - this.samtoolsFlagstats = samtoolsFlagstats; + public AlignmentQualityControl setSamtoolsFlagStats(SamtoolsFlagstats samtoolsFlagStats) { + this.samtoolsFlagStats = samtoolsFlagStats; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleAlignmentQualityControlMetrics.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleAlignmentQualityControlMetrics.java index 7b37b53745e..a3d613c8aed 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleAlignmentQualityControlMetrics.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleAlignmentQualityControlMetrics.java @@ -2,7 +2,7 @@ import org.opencb.biodata.formats.alignment.picard.HsMetrics; import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; -import org.opencb.biodata.formats.sequence.fastqc.FastQc; +import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; import org.opencb.biodata.models.alignment.GeneCoverageStats; import java.util.ArrayList; @@ -11,7 +11,7 @@ public class SampleAlignmentQualityControlMetrics { private String bamFileId; - private FastQc fastQc; + private FastQcMetrics fastQcMetrics; private SamtoolsFlagstats samtoolsFlagstats; private HsMetrics hsMetrics; private List geneCoverageStats; @@ -20,10 +20,10 @@ public SampleAlignmentQualityControlMetrics() { this(null, null, null, null, new ArrayList<>()); } - public SampleAlignmentQualityControlMetrics(String bamFileId, FastQc fastQc, SamtoolsFlagstats samtoolsFlagstats, HsMetrics hsMetrics, + public SampleAlignmentQualityControlMetrics(String bamFileId, FastQcMetrics fastQcMetrics, SamtoolsFlagstats samtoolsFlagstats, HsMetrics hsMetrics, List geneCoverageStats) { this.bamFileId = bamFileId; - this.fastQc = fastQc; + this.fastQcMetrics = fastQcMetrics; this.samtoolsFlagstats = samtoolsFlagstats; this.hsMetrics = hsMetrics; this.geneCoverageStats = geneCoverageStats; @@ -33,7 +33,7 @@ public SampleAlignmentQualityControlMetrics(String bamFileId, FastQc fastQc, Sam public String toString() { final StringBuilder sb = new StringBuilder("SampleAlignmentQualityControlMetrics{"); sb.append("bamFileId='").append(bamFileId).append('\''); - sb.append(", fastQc=").append(fastQc); + sb.append(", fastQcMetrics=").append(fastQcMetrics); sb.append(", samtoolsFlagstats=").append(samtoolsFlagstats); sb.append(", hsMetrics=").append(hsMetrics); sb.append(", geneCoverageStats=").append(geneCoverageStats); @@ -50,12 +50,12 @@ public SampleAlignmentQualityControlMetrics setBamFileId(String bamFileId) { return this; } - public FastQc getFastQc() { - return fastQc; + public FastQcMetrics getFastQc() { + return fastQcMetrics; } - public SampleAlignmentQualityControlMetrics setFastQc(FastQc fastQc) { - this.fastQc = fastQc; + public SampleAlignmentQualityControlMetrics setFastQc(FastQcMetrics fastQcMetrics) { + this.fastQcMetrics = fastQcMetrics; return this; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index e39f63065a1..bf233cb74d9 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -31,6 +31,7 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.alignment.AlignmentIndexOperation; import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; +import org.opencb.opencga.analysis.alignment.qc.AlignmentFlagStatsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; @@ -389,21 +390,8 @@ public Response flagStatsRun( @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, - @ApiParam(value = AlignmentStatsParams.DESCRIPTION, required = true) AlignmentStatsParams params) { - - logger.debug("ObjectMap: {}", params); - - SamtoolsWrapperParams samtoolsParams = new SamtoolsWrapperParams(); - samtoolsParams.setCommand("flagstat"); - samtoolsParams.setInputFile(params.getFile()); - - Map statsParams = new HashMap<>(); - statsParams.put(INDEX_STATS_PARAM, "true"); - samtoolsParams.setSamtoolsParams(statsParams); - - logger.debug("ObjectMap (Samtools) : {}", samtoolsParams); - - return submitJob(SamtoolsWrapperAnalysis.ID, study, samtoolsParams, jobName, jobDescription, dependsOn, jobTags); + @ApiParam(value = AlignmentFlagStatsParams.DESCRIPTION, required = true) AlignmentFlagStatsParams params) { + return submitJob(AlignmentFlagStatsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } @POST From 3c4cdcd34eb069a4a56e3f76522650c894bb5f90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 21 Apr 2021 11:44:46 +0200 Subject: [PATCH 202/412] analysis: implement alignment/fastqcmetrics as a job, #1739 --- .../qc/AlignmentFastQcMetricsAnalysis.java | 142 ++++++++++++++++++ .../analysis/sample/qc/SampleQcAnalysis.java | 2 +- .../FastqcWrapperAnalysisExecutor.java | 109 -------------- .../{ => fastqc}/FastqcWrapperAnalysis.java | 19 ++- .../fastqc/FastqcWrapperAnalysisExecutor.java | 135 +++++++++++++++++ .../internal/InternalCliOptionsParser.java | 1 + .../executors/AlignmentCommandExecutor.java | 19 +++ .../options/AlignmentCommandOptions.java | 24 ++- .../app/cli/main/OpencgaCliOptionsParser.java | 1 + .../analysis/AlignmentCommandExecutor.java | 14 ++ .../client/rest/clients/AdminClient.java | 2 +- .../client/rest/clients/AlignmentClient.java | 21 ++- .../client/rest/clients/ClinicalClient.java | 6 +- .../client/rest/clients/CohortClient.java | 2 +- .../rest/clients/DiseasePanelClient.java | 2 +- .../client/rest/clients/FamilyClient.java | 2 +- .../client/rest/clients/FileClient.java | 2 +- .../client/rest/clients/GA4GHClient.java | 2 +- .../client/rest/clients/IndividualClient.java | 2 +- .../client/rest/clients/JobClient.java | 2 +- .../client/rest/clients/MetaClient.java | 2 +- .../client/rest/clients/ProjectClient.java | 2 +- .../client/rest/clients/SampleClient.java | 2 +- .../client/rest/clients/StudyClient.java | 15 +- .../client/rest/clients/UserClient.java | 2 +- .../client/rest/clients/VariantClient.java | 2 +- .../rest/clients/VariantOperationClient.java | 2 +- .../opencga/core/api/ParamConstants.java | 3 +- .../AlignmentFastQcMetricsParams.java | 45 ++++++ .../alignment/AlignmentQualityControl.java | 2 +- .../monitor/daemons/ExecutionDaemon.java | 1 + .../rest/analysis/AlignmentWebService.java | 35 +++-- .../rest/analysis/VariantWebService.java | 1 + 33 files changed, 476 insertions(+), 147 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java rename opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/{ => fastqc}/FastqcWrapperAnalysis.java (82%) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentFastQcMetricsParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java new file mode 100644 index 00000000000..a2fa1ccce5c --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java @@ -0,0 +1,142 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.alignment.qc; + +import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; +import org.opencb.biodata.formats.alignment.samtools.io.SamtoolsFlagstatsParser; +import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; +import org.opencb.biodata.formats.sequence.fastqc.io.FastQcParser; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysisExecutor; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysisExecutor; +import org.opencb.opencga.catalog.db.api.FileDBAdaptor; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.AlignmentFastQcMetricsParams; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.file.FileQualityControl; +import org.opencb.opencga.core.models.file.FileUpdateParams; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import static org.opencb.opencga.core.api.ParamConstants.ALIGNMENT_FASTQC_METRICS_DESCRIPTION; +import static org.opencb.opencga.core.tools.OpenCgaToolExecutor.EXECUTOR_ID; + +@Tool(id = AlignmentFastQcMetricsAnalysis.ID, resource = Enums.Resource.ALIGNMENT) +public class AlignmentFastQcMetricsAnalysis extends OpenCgaToolScopeStudy { + + public static final String ID = "alignment-fastqcmetrics"; + public static final String DESCRIPTION = ALIGNMENT_FASTQC_METRICS_DESCRIPTION; + + private static final String FASTQC_STEP = "fastqc"; + private static final String SAVE_ALIGNMENT_FASTQC_METRICS_STEP = "save-alignment-fastqcmetrics"; + + @ToolParams + protected final AlignmentFastQcMetricsParams analysisParams = new AlignmentFastQcMetricsParams(); + + private File catalogBamFile; + + @Override + protected void check() throws Exception { + super.check(); + + if (StringUtils.isEmpty(getStudy())) { + throw new ToolException("Missing study"); + } + + if (StringUtils.isEmpty(analysisParams.getFile())) { + throw new ToolException("Missing file"); + } + + Query query = new Query(FileDBAdaptor.QueryParams.ID.key(), analysisParams.getFile()); + query.put(FileDBAdaptor.QueryParams.FORMAT.key(), File.Format.BAM); + OpenCGAResult fileResult = catalogManager.getFileManager().search(getStudy(), query, QueryOptions.empty(), token); + if (fileResult.getNumResults() != 1) { + throw new ToolException("File " + analysisParams.getFile() + " must be a BAM file in study " + getStudy()); + } + + catalogBamFile = fileResult.getResults().get(0); + } + + @Override + protected List getSteps() { + List steps = new ArrayList<>(); + steps.add(FASTQC_STEP); + steps.add(SAVE_ALIGNMENT_FASTQC_METRICS_STEP); + return steps; + } + + @Override + protected void run() throws ToolException { + + setUpStorageEngineExecutor(study); + + step(FASTQC_STEP, () -> { + executorParams.put(EXECUTOR_ID, FastqcWrapperAnalysisExecutor.ID); + executorParams.put("extract", "true"); + getToolExecutor(FastqcWrapperAnalysisExecutor.class) + .setInputFile(catalogBamFile.getUri().getPath()) + .execute(); + }); + + step(SAVE_ALIGNMENT_FASTQC_METRICS_STEP, () -> { + + Path fastQcPath = null; + Path imgPath = null; + for (java.io.File file : getOutDir().toFile().listFiles()) { + if (file.isDirectory() && file.getName().endsWith("_fastqc")) { + fastQcPath = file.toPath().resolve("fastqc_data.txt"); + imgPath = file.toPath().resolve("Images"); + } + } + + if (fastQcPath != null && fastQcPath.toFile().exists()) { + FastQcMetrics fastQcMetrics = FastQcParser.parse(fastQcPath.toFile()); + FastQcParser.addImages(imgPath, fastQcMetrics); + + // Replace absolute paths to relative paths + List relativePaths = new ArrayList<>(); + for (String path : fastQcMetrics.getImages()) { + int index = path.indexOf("JOBS/"); + relativePaths.add(index == -1 ? new java.io.File(path).getName() : path.substring(index)); + } + fastQcMetrics.setImages(relativePaths); + + // Update quality control for the catalog file + FileQualityControl qc = catalogBamFile.getQualityControl(); + // Sanity check + if (qc == null) { + qc = new FileQualityControl(); + } + qc.getAlignmentQualityControl().setFastQcMetrics(fastQcMetrics); + + catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), + QueryOptions.empty(), getToken()); + } else { + throw new ToolException("Something wrong happened: FastQC file " + fastQcPath.getFileName() + " not found!"); + } + }); + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 9832317d3b5..d782fb842be 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -31,7 +31,7 @@ import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis; import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureLocalAnalysisExecutor; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.FastqcWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java deleted file mode 100644 index 61bf4620e1a..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/FastqcWrapperAnalysisExecutor.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.opencb.opencga.analysis.wrappers.executors; - -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.analysis.wrappers.FastqcWrapperAnalysis; -import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.core.exceptions.ToolException; - -import java.net.URISyntaxException; -import java.nio.file.Path; -import java.util.*; - -public class FastqcWrapperAnalysisExecutor extends OpenCgaWrapperAnalysisExecutor { - - private String file; - - public FastqcWrapperAnalysisExecutor(String studyId, ObjectMap params, Path outDir, Path scratchDir, CatalogManager catalogManager, - String token) { -// super(studyId, params, outDir, scratchDir, catalogManager, token); - - sep = " "; - shortPrefix = "-"; - longPrefix = "--"; - } - - @Override - public void run() throws ToolException { - StringBuilder sb = initCommandLine(); - - // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", file))); - Map srcTargetMap = new HashMap<>(); - try { - appendMounts(inputFilenames, srcTargetMap, sb); - } catch (URISyntaxException e) { - throw new ToolException(e); - } - - // Append docker image, version and command - appendCommand("", sb); - - // Append input file params - appendInputFiles(inputFilenames, srcTargetMap, sb); - - // Append other params - Set skipParams = new HashSet<>(Arrays.asList("o", "output")); - appendOtherParams(skipParams, sb); - - // Append output file params - List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("o", ""))); - appendOutputFiles(outputFilenames, sb); - - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - runCommandLine(sb.toString()); - } - - public FastQcMetrics getResult() throws ToolException { - return null; -// File[] files = outDir.toFile().listFiles(); -// if (files != null) { -// for (File file : files) { -// if (file.getName().endsWith("_fastqc") && file.isDirectory()) { -// try { -// Path dataPath = file.toPath().resolve("fastqc_data.txt"); -// return FastQcParser.parse(dataPath.toFile()); -// } catch (IOException e) { -// throw new ToolException(e); -// } -// } -// } -// } -// String msg = "Something wrong when reading FastQC result.\n"; -// try { -// msg += StringUtils.join(FileUtils.readLines(scratchDir.resolve(getId() + ".stderr.txt").toFile()), "\n"); -// } catch (IOException e) { -// throw new ToolException(e); -// } -// -// throw new ToolException(msg); - } - -// @Override -// protected String getId() { -// return FastqcWrapperAnalysis.ID; -// } - - @Override - protected String getDockerImageName() { - return FastqcWrapperAnalysis.FASTQC_DOCKER_IMAGE; - } - - private boolean checkParam(String param) { - if ("o".equals(param) || param.equals(DOCKER_IMAGE_VERSION_PARAM)) { - return false; - } - return true; - } - - public String getFile() { - return file; - } - - public FastqcWrapperAnalysisExecutor setFile(String file) { - this.file = file; - return this; - } -} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/FastqcWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java similarity index 82% rename from opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/FastqcWrapperAnalysis.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java index 67949b111c7..8d396ddfbc4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/FastqcWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java @@ -14,12 +14,13 @@ * limitations under the License. */ -package org.opencb.opencga.analysis.wrappers; +package org.opencb.opencga.analysis.wrappers.fastqc; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.opencga.analysis.wrappers.executors.FastqcWrapperAnalysisExecutor; +import org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysisExecutor; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.tools.annotations.Tool; @@ -50,6 +51,19 @@ protected void check() throws Exception { @Override protected void run() throws Exception { + step(getId(), () -> { + getToolExecutor(FastqcWrapperAnalysisExecutor.class); +// .run(); +// executor +// .setStudy(study) +// .setSampleName(sampleName) +// .setRefGenomePath(refGenomePath) +// .setMutationalSignaturePath(mutationalSignaturePath) +// .setOpenCgaHome(getOpencgaHome()) +// .execute(); + }); + +/* step(() -> { try { @@ -80,6 +94,7 @@ protected void run() throws Exception { throw new ToolException(e); } }); + */ } public String getFile() { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..91eb66ca44e --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java @@ -0,0 +1,135 @@ +package org.opencb.opencga.analysis.wrappers.fastqc; + +import org.apache.commons.lang3.StringUtils; +import org.opencb.commons.exec.Command; +import org.opencb.opencga.analysis.wrappers.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@ToolExecutor(id = FastqcWrapperAnalysisExecutor.ID, + tool = FastqcWrapperAnalysis.ID, + source = ToolExecutor.Source.STORAGE, + framework = ToolExecutor.Framework.LOCAL) +public class FastqcWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor { + + public final static String ID = FastqcWrapperAnalysis.ID + "-local"; + + public final static String DOCKER_IMAGE_NAME = "dceoy/fastqc"; + + private String study; + private String inputFile; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + protected void run() throws Exception { + + String commandLine = getCommandLine(); + + logger.info("Fastqc command line: " + commandLine); + try { + // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + Command cmd = new Command(commandLine) + .setOutputOutputStream( + new DataOutputStream(new FileOutputStream(getOutDir().resolve(STDOUT_FILENAME).toFile()))) + .setErrorOutputStream( + new DataOutputStream(new FileOutputStream(getOutDir().resolve(STDERR_FILENAME).toFile()))); + + cmd.run(); + + } catch (Exception e) { + throw new ToolException(e); + } + } + + public String getCommandLine() throws ToolException { + + List inputFiles = Arrays.asList(getInputFile()); + + Map srcTargetMap = getDockerMountMap(inputFiles); + + StringBuilder sb = initDockerCommandLine(srcTargetMap, DOCKER_IMAGE_NAME, ""); + + // Input file parameter + File file; + file = new File(getInputFile()); + sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); + + // Fastqc options + for (String param : getExecutorParams().keySet()) { + if (isValidParameter(param)) { + String sep = param.length() == 1 ? " -" : " --"; + String value = getExecutorParams().getString(param); + if (StringUtils.isEmpty(value)) { + sb.append(sep).append(param); + } else { + switch (value.toLowerCase()) { + case "false": + // Nothing to do + break; + case "null": + case "true": + // Only param must be appended + sb.append(sep).append(param); + break; + default: + // Otherwise, param + value must be appended + sb.append(sep).append(param).append(" ").append(value); + break; + } + } + } + } + + // Output dir + sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/"); + + return sb.toString(); + } + + @Override + protected boolean isValidParameter(String param) { + if (!super.isValidParameter(param)) { + return false; + } + + switch (param) { + case "dir": + case "d": + case "outdir": + case "o": { + return false; + } + } + + return true; + } + + public String getStudy() { + return study; + } + + public FastqcWrapperAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } + + public String getInputFile() { + return inputFile; + } + + public FastqcWrapperAnalysisExecutor setInputFile(String inputFile) { + this.inputFile = inputFile; + return this; + } + +} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java index 4acee7d4a96..60f88666090 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java @@ -180,6 +180,7 @@ public InternalCliOptionsParser() { alignmentSubCommands.addCommand("query", alignmentCommandOptions.queryAlignmentCommandOptions); alignmentSubCommands.addCommand("stats-run", alignmentCommandOptions.statsAlignmentCommandOptions); alignmentSubCommands.addCommand("flagstats-run", alignmentCommandOptions.flagStatsAlignmentCommandOptions); + alignmentSubCommands.addCommand("fastqcmetrics-run", alignmentCommandOptions.fastQcMetricsAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-run", alignmentCommandOptions.coverageAlignmentCommandOptions); // alignmentSubCommands.addCommand("annotate", alignmentCommandOptions.annotateVariantCommandOptions); alignmentSubCommands.addCommand(BWA_RUN_COMMAND, alignmentCommandOptions.bwaCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 826046a8804..8983cd46ab0 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -18,13 +18,16 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; +import org.opencb.opencga.analysis.alignment.qc.AlignmentFastQcMetricsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentFlagStatsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.AlignmentFastQcMetricsParams; import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; @@ -72,6 +75,9 @@ public void execute() throws Exception { case "flagstats-run": flagStatsRun(); break; + case "fastqcmetrics-run": + fastQcMetricsRun(); + break; case "coverage-run": coverageRun(); break; @@ -159,6 +165,19 @@ private void flagStatsRun() throws ToolException { toolRunner.execute(AlignmentFlagStatsAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } + private void fastQcMetricsRun() throws ToolException { + AlignmentCommandOptions.FastQcMetricsAlignmentCommandOptions cliOptions = alignmentCommandOptions + .fastQcMetricsAlignmentCommandOptions; + + ObjectMap params = new AlignmentFastQcMetricsParams( + cliOptions.file, + cliOptions.outdir + ).toObjectMap(cliOptions.commonOptions.params) + .append(ParamConstants.STUDY_PARAM, cliOptions.study); + + toolRunner.execute(AlignmentFastQcMetricsAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); + } + private void coverageRun() throws ToolException { AlignmentCommandOptions.CoverageAlignmentCommandOptions cliOptions = alignmentCommandOptions.coverageAlignmentCommandOptions; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index 5098abe07d1..099be19138d 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -18,6 +18,7 @@ import com.beust.jcommander.*; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.internal.InternalCliOptionsParser; @@ -37,6 +38,7 @@ public class AlignmentCommandOptions { public QueryAlignmentCommandOptions queryAlignmentCommandOptions; public StatsAlignmentCommandOptions statsAlignmentCommandOptions; public FlagStatsAlignmentCommandOptions flagStatsAlignmentCommandOptions; + public FastQcMetricsAlignmentCommandOptions fastQcMetricsAlignmentCommandOptions; public CoverageAlignmentCommandOptions coverageAlignmentCommandOptions; public CoverageQueryAlignmentCommandOptions coverageQueryAlignmentCommandOptions; public CoverageRatioAlignmentCommandOptions coverageRatioAlignmentCommandOptions; @@ -69,6 +71,7 @@ public AlignmentCommandOptions(GeneralCliOptions.CommonCommandOptions analysisCo this.queryAlignmentCommandOptions = new QueryAlignmentCommandOptions(); this.statsAlignmentCommandOptions = new StatsAlignmentCommandOptions(); this.flagStatsAlignmentCommandOptions = new FlagStatsAlignmentCommandOptions(); + this.fastQcMetricsAlignmentCommandOptions = new FastQcMetricsAlignmentCommandOptions(); this.coverageAlignmentCommandOptions = new CoverageAlignmentCommandOptions(); this.coverageQueryAlignmentCommandOptions = new CoverageQueryAlignmentCommandOptions(); this.coverageRatioAlignmentCommandOptions = new CoverageRatioAlignmentCommandOptions(); @@ -195,7 +198,7 @@ public class StatsAlignmentCommandOptions extends GeneralCliOptions.StudyOption public String outdir; } - @Parameters(commandNames = {"flag-stats-run"}, commandDescription = ALIGNMENT_FLAG_STATS_DESCRIPTION) + @Parameters(commandNames = {"flagstats-run"}, commandDescription = ALIGNMENT_FLAG_STATS_DESCRIPTION) public class FlagStatsAlignmentCommandOptions extends GeneralCliOptions.StudyOption { @ParametersDelegate @@ -214,6 +217,25 @@ public class FlagStatsAlignmentCommandOptions extends GeneralCliOptions.StudyOpt public String outdir; } + @Parameters(commandNames = {"fastqcmetrics-run"}, commandDescription = ALIGNMENT_FASTQC_METRICS_DESCRIPTION) + public class FastQcMetricsAlignmentCommandOptions extends GeneralCliOptions.StudyOption { + + @ParametersDelegate + public GeneralCliOptions.CommonCommandOptions commonOptions = analysisCommonOptions; + + @ParametersDelegate + public Object jobOptions = commonJobOptionsObject; + + @ParametersDelegate + public Object internalJobOptions = internalJobOptionsObject; + + @Parameter(names = {"--file"}, description = FILE_ID_DESCRIPTION, required = true, arity = 1) + public String file; + + @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) + public String outdir; + } + @Parameters(commandNames = {"coverage-run"}, commandDescription = ALIGNMENT_COVERAGE_DESCRIPTION) public class CoverageAlignmentCommandOptions extends GeneralCliOptions.StudyOption { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index b48c341cd0b..d99f4cd52b0 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -256,6 +256,7 @@ public OpencgaCliOptionsParser() { alignmentSubCommands.addCommand("query", alignmentCommandOptions.queryAlignmentCommandOptions); alignmentSubCommands.addCommand("stats-run", alignmentCommandOptions.statsAlignmentCommandOptions); alignmentSubCommands.addCommand("flagstats-run", alignmentCommandOptions.flagStatsAlignmentCommandOptions); + alignmentSubCommands.addCommand("fastqcmetrics-run", alignmentCommandOptions.fastQcMetricsAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-index-run", alignmentCommandOptions.coverageAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-query", alignmentCommandOptions.coverageQueryAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-ratio", alignmentCommandOptions.coverageRatioAlignmentCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index f70b9361565..e6f4aab48f5 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -87,6 +87,9 @@ public void execute() throws Exception { case "flagstats-run": queryResponse = flagStatsRun(); break; + case "fastqcmetrics-run": + queryResponse = fastQcMetricsRun(); + break; case "coverage-index-run": queryResponse = coverageRun(); break; @@ -349,6 +352,17 @@ private RestResponse flagStatsRun() throws ClientException { return openCGAClient.getAlignmentClient().runFlagstats(new AlignmentFlagStatsParams(cliOptions.file, cliOptions.outdir), params); } + private RestResponse fastQcMetricsRun() throws ClientException { + AlignmentCommandOptions.FastQcMetricsAlignmentCommandOptions cliOptions = alignmentCommandOptions + .fastQcMetricsAlignmentCommandOptions; + + ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); + params.putAll(getJobParams()); + + return openCGAClient.getAlignmentClient().runFastqcmetrics(new AlignmentFastQcMetricsParams(cliOptions.file, cliOptions.outdir), + params); + } + //------------------------------------------------------------------------- // COVERAGE: index/run, info, query and stats //------------------------------------------------------------------------- diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java index ff31a47e256..04c33d540d4 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java index de91c889f23..a43a12d1cb4 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java @@ -23,6 +23,7 @@ import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; +import org.opencb.opencga.core.models.alignment.AlignmentFastQcMetricsParams; import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; import org.opencb.opencga.core.models.alignment.AlignmentIndexParams; import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; @@ -40,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -194,6 +195,24 @@ public RestResponse runFastqc(FastQcWrapperParams data, ObjectMap params) t return execute("analysis", null, "alignment/fastqc", null, "run", params, POST, Job.class); } + /** + * Compute sequence stats (based on FastQC tool) for a given alignment file. + * @param data Alignment FastQC metrics params. + * @param params Map containing any of the following optional parameters. + * study: study. + * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. + * jobDependsOn: Comma separated list of existing job IDs the job will depend on. + * jobDescription: Job description. + * jobTags: Job tags. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse runFastqcmetrics(AlignmentFastQcMetricsParams data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("analysis", null, "alignment/fastqcmetrics", null, "run", params, POST, Job.class); + } + /** * Compute flag stats (based on samtools/flagstat command) for a given alignment file. * @param data Alignment flag stats params. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java index 87d4ca62e0b..2d81ea12a63 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java @@ -46,7 +46,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -317,6 +317,8 @@ public RestResponse aggregationStatsRga(String field, ObjectMap para * skip: Number of results to skip. * count: Get the total number of results matching the query. Deactivated by default. * includeIndividual: Include only the comma separated list of individuals to the response. + * skipIndividual: Number of individuals to skip. + * limitIndividual: Limit number of individuals returned (default: 1000). * sampleId: Filter by sample id. * individualId: Filter by individual id. * sex: Filter by sex. @@ -408,6 +410,8 @@ public RestResponse queryRgaIndividual(ObjectMap params) t * skip: Number of results to skip. * count: Get the total number of results matching the query. Deactivated by default. * includeIndividual: Include only the comma separated list of individuals to the response. + * skipIndividual: Number of individuals to skip. + * limitIndividual: Limit number of individuals returned (default: 1000). * sampleId: Filter by sample id. * individualId: Filter by individual id. * sex: Filter by sex. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java index 402d736568a..1f2e89b5a3e 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java index ced4c79e1e9..9f74f211d89 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java @@ -31,7 +31,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java index 5a57bb6d747..ca9b812e278 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java index a4ecb0d91e9..1eb25385d89 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java index 628894c21f4..48592ee9d39 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java @@ -27,7 +27,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java index 5822ff9ab76..e03116e64fc 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java index 176f305f8ca..d76b5dd0cc0 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java index 855ca0dae03..0fe533698d9 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java @@ -28,7 +28,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java index c2f8b502a26..cceb323de95 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java @@ -32,7 +32,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java index d03f476d9b9..844c68e50d9 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java index 7dfcf48b824..3995c0e9069 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java @@ -22,7 +22,18 @@ import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; -import org.opencb.opencga.core.models.study.*; +import org.opencb.opencga.core.models.study.CustomGroup; +import org.opencb.opencga.core.models.study.Group; +import org.opencb.opencga.core.models.study.GroupCreateParams; +import org.opencb.opencga.core.models.study.GroupUpdateParams; +import org.opencb.opencga.core.models.study.PermissionRule; +import org.opencb.opencga.core.models.study.Study; +import org.opencb.opencga.core.models.study.StudyAclUpdateParams; +import org.opencb.opencga.core.models.study.StudyCreateParams; +import org.opencb.opencga.core.models.study.StudyUpdateParams; +import org.opencb.opencga.core.models.study.Variable; +import org.opencb.opencga.core.models.study.VariableSet; +import org.opencb.opencga.core.models.study.VariableSetCreateParams; import org.opencb.opencga.core.response.RestResponse; @@ -30,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java index d52a482ba01..0fc83927142 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java @@ -37,7 +37,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 89ce6468437..4ee0b73656a 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -59,7 +59,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java index 76e1ba45240..00893608688 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-20 10:46:09 +* Autogenerated on: 2021-04-21 10:39:05 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index c54db52d2c8..feaccff34c8 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -339,8 +339,7 @@ public class ParamConstants { public static final String ALIGNMENT_COVERAGE_RATIO_DESCRIPTION = "Compute coverage ratio from file #1 vs file #2, (e.g. somatic vs germline)"; public static final String ALIGNMENT_STATS_DESCRIPTION = "Compute stats (based on samtools/stats command) for a given alignment file"; public static final String ALIGNMENT_FLAG_STATS_DESCRIPTION = "Compute flag stats (based on samtools/flagstat command) for a given alignment file"; - public static final String ALIGNMENT_STATS_INFO_DESCRIPTION = "Show the stats for a given alignment file"; - public static final String ALIGNMENT_STATS_QUERY_DESCRIPTION = "Fetch alignment files according to their stats"; + public static final String ALIGNMENT_FASTQC_METRICS_DESCRIPTION = "Compute sequence stats (based on FastQC tool) for a given alignment file"; // --------------------------------------------- // alignment query diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentFastQcMetricsParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentFastQcMetricsParams.java new file mode 100644 index 00000000000..c8798821bc2 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentFastQcMetricsParams.java @@ -0,0 +1,45 @@ +package org.opencb.opencga.core.models.alignment; + +import org.opencb.opencga.core.tools.ToolParams; + +public class AlignmentFastQcMetricsParams extends ToolParams { + public static final String DESCRIPTION = "Alignment FastQC metrics params"; + + private String file; + private String outdir; + + public AlignmentFastQcMetricsParams() { + } + + public AlignmentFastQcMetricsParams(String file, String outdir) { + this.file = file; + this.outdir = outdir; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("AlignmentFlagStatsParams{"); + sb.append("file='").append(file).append('\''); + sb.append(", outdir='").append(outdir).append('\''); + sb.append('}'); + return sb.toString(); + } + + public String getFile() { + return file; + } + + public AlignmentFastQcMetricsParams setFile(String file) { + this.file = file; + return this; + } + + public String getOutdir() { + return outdir; + } + + public AlignmentFastQcMetricsParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java index 063a65a9593..e6dcea94bc5 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java @@ -54,7 +54,7 @@ public AlignmentQualityControl setFileId(String fileId) { return this; } - public FastQcMetrics getFastQcMetrtics() { + public FastQcMetrics getFastQcMetrics() { return fastQcMetrics; } diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index 152b3aa59c1..cd0bc76608e 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -60,6 +60,7 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.DBIterator; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index bf233cb74d9..23cdfe8d970 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -21,7 +21,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.ga4gh.models.ReadAlignment; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; import org.opencb.biodata.models.alignment.GeneCoverageStats; import org.opencb.biodata.models.alignment.RegionCoverage; import org.opencb.biodata.models.core.Region; @@ -31,17 +30,16 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.alignment.AlignmentIndexOperation; import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; +import org.opencb.opencga.analysis.alignment.qc.AlignmentFastQcMetricsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentFlagStatsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; -import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; -import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.exceptions.VersionException; import org.opencb.opencga.core.models.alignment.*; -import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.response.OpenCGAResult; @@ -51,7 +49,6 @@ import java.io.IOException; import java.util.*; -import static org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis.INDEX_STATS_PARAM; import static org.opencb.opencga.core.api.ParamConstants.*; /** @@ -378,9 +375,23 @@ public Response coverageQuery( } //------------------------------------------------------------------------- - // STATS: run, info and query + // Quality control: stats, flagstats, fastqcmetrics and hsmetrics //------------------------------------------------------------------------- + @POST + @Path("/stats/run") + @ApiOperation(value = ALIGNMENT_STATS_DESCRIPTION, response = Job.class) + public Response statsRun( + @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, + @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, + @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, + @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, + @ApiParam(value = AlignmentStatsParams.DESCRIPTION, required = true) AlignmentStatsParams params) { + + return submitJob(AlignmentStatsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + } + @POST @Path("/flagstats/run") @ApiOperation(value = ALIGNMENT_FLAG_STATS_DESCRIPTION, response = Job.class) @@ -395,19 +406,17 @@ public Response flagStatsRun( } @POST - @Path("/stats/run") - @ApiOperation(value = ALIGNMENT_STATS_DESCRIPTION, response = Job.class) - public Response statsRun( + @Path("/fastqcmetrics/run") + @ApiOperation(value = ALIGNMENT_FASTQC_METRICS_DESCRIPTION, response = Job.class) + public Response fastQcMetricsRun( @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, - @ApiParam(value = AlignmentStatsParams.DESCRIPTION, required = true) AlignmentStatsParams params) { - - return submitJob(AlignmentStatsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + @ApiParam(value = AlignmentFastQcMetricsParams.DESCRIPTION, required = true) AlignmentFastQcMetricsParams params) { + return submitJob(AlignmentFastQcMetricsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } - //------------------------------------------------------------------------- // W R A P P E R S //------------------------------------------------------------------------- diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 33b1463cc1f..20504087e96 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -56,6 +56,7 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; From 0ef04556099e0b7cb65b910fcf71f3276bff9f43 Mon Sep 17 00:00:00 2001 From: Laura Date: Wed, 21 Apr 2021 14:08:41 +0000 Subject: [PATCH 203/412] GitBook: [develop] 2 pages and 10 assets modified --- ...mage (6) (1).png => image (6) (5) (1).png} | Bin ...mage (6) (2).png => image (6) (5) (2).png} | Bin ...mage (6) (3).png => image (6) (5) (3).png} | Bin ...mage (6) (4).png => image (6) (5) (4).png} | Bin .../{image (6).png => image (6) (5) (5).png} | Bin .../variant-aggregation-stats.md | 39 ++++++++++++++++++ .../variant-analysis.md | 3 ++ 7 files changed, 42 insertions(+) rename docs/.gitbook/assets/{image (6) (1).png => image (6) (5) (1).png} (100%) rename docs/.gitbook/assets/{image (6) (2).png => image (6) (5) (2).png} (100%) rename docs/.gitbook/assets/{image (6) (3).png => image (6) (5) (3).png} (100%) rename docs/.gitbook/assets/{image (6) (4).png => image (6) (5) (4).png} (100%) rename docs/.gitbook/assets/{image (6).png => image (6) (5) (5).png} (100%) diff --git a/docs/.gitbook/assets/image (6) (1).png b/docs/.gitbook/assets/image (6) (5) (1).png similarity index 100% rename from docs/.gitbook/assets/image (6) (1).png rename to docs/.gitbook/assets/image (6) (5) (1).png diff --git a/docs/.gitbook/assets/image (6) (2).png b/docs/.gitbook/assets/image (6) (5) (2).png similarity index 100% rename from docs/.gitbook/assets/image (6) (2).png rename to docs/.gitbook/assets/image (6) (5) (2).png diff --git a/docs/.gitbook/assets/image (6) (3).png b/docs/.gitbook/assets/image (6) (5) (3).png similarity index 100% rename from docs/.gitbook/assets/image (6) (3).png rename to docs/.gitbook/assets/image (6) (5) (3).png diff --git a/docs/.gitbook/assets/image (6) (4).png b/docs/.gitbook/assets/image (6) (5) (4).png similarity index 100% rename from docs/.gitbook/assets/image (6) (4).png rename to docs/.gitbook/assets/image (6) (5) (4).png diff --git a/docs/.gitbook/assets/image (6).png b/docs/.gitbook/assets/image (6) (5) (5).png similarity index 100% rename from docs/.gitbook/assets/image (6).png rename to docs/.gitbook/assets/image (6) (5) (5).png diff --git a/docs/manual/variant-storage-engine/variant-aggregation-stats.md b/docs/manual/variant-storage-engine/variant-aggregation-stats.md index 64de387b4da..457b873c035 100644 --- a/docs/manual/variant-storage-engine/variant-aggregation-stats.md +++ b/docs/manual/variant-storage-engine/variant-aggregation-stats.md @@ -1,2 +1,41 @@ # Variant Aggregation Stats +## Sample Variant Stats + +Sample Variant Stats will contain a set of aggregated statistics values for each sample contained in a study, or for a set of samples defined by the user. + +```text +./opencga.sh variant sample-stats-run --study --sample all +``` + +These aggregated values can be computed across all variants from each sample, or using a subset of variants using a variant filter query. e.g: + +```text +./opencga.sh variant sample-stats-run --study + --sample all + --variant-query ct=missense_variant + --variant-query biotype=protein_coding +``` + +By default, this analysis will produce a file, and optionally, the result can be indexed in the Catalog metadata store, given an ID. + +```text +./opencga.sh variant sample-stats-run --study + --sample all + --index + --index-id missense_variants + --variant-query ct=missense_variant + --variant-query biotype=protein_coding +``` + +The ID ALL can only be used if without any variant query filter. + +```text +./opencga.sh variant sample-stats-run --study + --sample all + --index + --index-id ALL +``` + + + diff --git a/docs/manual/variant-storage-engine/variant-analysis.md b/docs/manual/variant-storage-engine/variant-analysis.md index 3bb4b438b71..b3ea6752c70 100644 --- a/docs/manual/variant-storage-engine/variant-analysis.md +++ b/docs/manual/variant-storage-engine/variant-analysis.md @@ -1,2 +1,5 @@ # Variant Analysis + + + From 7d4a17ac79096109704d3e2b601f546b3539bf64 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 21 Apr 2021 17:08:55 +0200 Subject: [PATCH 204/412] analysis: add new individual summary method, #1693 --- .../analysis/rga/IndividualRgaConverter.java | 57 +- .../opencga/analysis/rga/RgaDataModel.java | 14 + .../opencga/analysis/rga/RgaEngine.java | 3 +- .../opencga/analysis/rga/RgaManager.java | 560 ++++++++++++------ .../opencb/opencga/analysis/rga/RgaUtils.java | 68 +++ .../analysis/rga/exceptions/RgaException.java | 6 + .../src/main/resources/rga/managed-schema | 1 + .../knockout/KnockoutByIndividualSummary.java | 218 +++++++ 8 files changed, 747 insertions(+), 180 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 77171da1cf8..7b998992993 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -207,24 +207,32 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI List variantIds = new ArrayList<>(transcript.getVariants().size()); List knockoutTypes = new ArrayList<>(transcript.getVariants().size()); + List variantKnockoutList = new ArrayList<>(transcript.getVariants().size()); Set types = new HashSet<>(); Set consequenceTypes = new HashSet<>(); Set clinicalSignificances = new HashSet<>(); Set filters = new HashSet<>(); - for (KnockoutVariant variant : transcript.getVariants()) { + Map> popFreqs = getPopulationFrequencies(transcript); + List variants = transcript.getVariants(); + for (int i = 0; i < variants.size(); i++) { + KnockoutVariant variant = variants.get(i); variantIds.add(variant.getId()); - knockoutTypes.add(variant.getKnockoutType() != null ? variant.getKnockoutType().name() : ""); + String knockoutType = variant.getKnockoutType() != null ? variant.getKnockoutType().name() : ""; + knockoutTypes.add(knockoutType); if (variant.getType() != null) { types.add(variant.getType().name()); } + List variantConsequenceTypes = new ArrayList<>(); if (variant.getSequenceOntologyTerms() != null) { for (SequenceOntologyTerm sequenceOntologyTerm : variant.getSequenceOntologyTerms()) { if (sequenceOntologyTerm.getAccession() != null) { - consequenceTypes.add(sequenceOntologyTerm.getAccession()); + variantConsequenceTypes.add(sequenceOntologyTerm.getAccession()); } } } + consequenceTypes.addAll(variantConsequenceTypes); + if (variant.getClinicalSignificance() != null) { for (ClinicalSignificance clinicalSignificance : variant.getClinicalSignificance()) { if (clinicalSignificance != null) { @@ -235,8 +243,13 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI if (StringUtils.isNotEmpty(variant.getFilter())) { filters.add(variant.getFilter()); } + + float thousandPopFreq = getPopulationFrequency(i, RgaUtils.THOUSAND_GENOMES_STUDY, popFreqs); + float gnomadPopFreq = getPopulationFrequency(i, RgaUtils.GNOMAD_GENOMES_STUDY, popFreqs); + RgaUtils.CodedVariant codedVariant = new RgaUtils.CodedVariant(variant.getId(), variant.getType().name(), + variant.getKnockoutType().name(), variantConsequenceTypes, thousandPopFreq, gnomadPopFreq); + variantKnockoutList.add(codedVariant.getFullVariant()); } - Map> popFreqs = getPopulationFrequencies(transcript); String id = knockoutByIndividual.getSampleId() + "_" + gene.getId() + "_" + transcript.getId(); String individualId = knockoutByIndividual.getId(); @@ -277,6 +290,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI .setVariants(variantIds) .setTypes(new ArrayList<>(types)) .setKnockoutTypes(knockoutTypes) + .setFullVariantInfo(variantKnockoutList) .setFilters(new ArrayList<>(filters)) .setConsequenceTypes(new ArrayList<>(consequenceTypes)) .setClinicalSignificances(new ArrayList<>(clinicalSignificances)) @@ -292,6 +306,25 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI return result; } + private float getPopulationFrequency(int variantPosition, String population, Map> popFreqMap) throws RgaException { + if (!population.equals(RgaUtils.THOUSAND_GENOMES_STUDY) && !population.equals(RgaUtils.GNOMAD_GENOMES_STUDY)) { + throw new RgaException("Unexpected population '" + population + "'"); + } + + String pfKey = RgaDataModel.POPULATION_FREQUENCIES.replace("*", ""); + String mapKey = pfKey + population; + + if (!popFreqMap.containsKey(mapKey)) { + throw new RgaException("Unexpected map key '" + mapKey + "'"); + } + List popFreqList = popFreqMap.get(mapKey); + if (variantPosition < 0 || variantPosition >= popFreqList.size()) { + throw new RgaException("Variant position not found"); + } + + return popFreqList.get(variantPosition); + } + private Map> getPopulationFrequencies(KnockoutTranscript transcript) { Map> popFreqs = new HashMap<>(); @@ -306,9 +339,9 @@ private Map> getPopulationFrequencies(KnockoutTranscript tra } for (KnockoutVariant variant : transcript.getVariants()) { + boolean gnomad = false; + boolean thousandG = false; if (variant.getPopulationFrequencies() != null) { - boolean gnomad = false; - boolean thousandG = false; for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { if (populationFrequency.getPopulation().equals("ALL")) { if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { @@ -320,12 +353,12 @@ private Map> getPopulationFrequencies(KnockoutTranscript tra } } } - if (!thousandG) { - popFreqs.get(thousandGenomeKey).add(0f); - } - if (!gnomad) { - popFreqs.get(gnomadGenomeKey).add(0f); - } + } + if (!thousandG) { + popFreqs.get(thousandGenomeKey).add(0f); + } + if (!gnomad) { + popFreqs.get(gnomadGenomeKey).add(0f); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java index d483c7744a3..828ec0c024c 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java @@ -76,6 +76,9 @@ public class RgaDataModel { @Field private List knockoutTypes; + @Field + private List fullVariantInfo; + @Field private List filters; @@ -118,6 +121,7 @@ public class RgaDataModel { public static final String TRANSCRIPT_ID = "transcriptId"; public static final String TRANSCRIPT_BIOTYPE = "transcriptBiotype"; public static final String VARIANTS = "variants"; + public static final String FULL_VARIANT_INFO = "fullVariantInfo"; public static final String TYPES = "types"; public static final String KNOCKOUT_TYPES = "knockoutTypes"; public static final String FILTERS = "filters"; @@ -157,6 +161,7 @@ public String toString() { sb.append(", variants=").append(variants); sb.append(", types=").append(types); sb.append(", knockoutTypes=").append(knockoutTypes); + sb.append(", fullVariantInfo=").append(fullVariantInfo); sb.append(", filters=").append(filters); sb.append(", consequenceTypes=").append(consequenceTypes); sb.append(", clinicalSignificances=").append(clinicalSignificances); @@ -375,6 +380,15 @@ public RgaDataModel setKnockoutTypes(List knockoutTypes) { return this; } + public List getFullVariantInfo() { + return fullVariantInfo; + } + + public RgaDataModel setFullVariantInfo(List fullVariantInfo) { + this.fullVariantInfo = fullVariantInfo; + return this; + } + public List getFilters() { return filters; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index c209a26a452..fdd58989335 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -121,7 +121,8 @@ public void insert(String collection, List rgaDataModelList) throw public RgaIterator individualQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException{ SolrQuery solrQuery = parser.parseQuery(query); fixIndividualOptions(queryOptions, solrQuery); - solrQuery.setRows(Integer.MAX_VALUE); +// solrQuery.setRows(Integer.MAX_VALUE); + solrQuery.setRows(queryOptions.getInt(QueryOptions.LIMIT, Integer.MAX_VALUE)); try { return new RgaIterator(solrManager.getSolrClient(), collection, solrQuery); } catch (SolrServerException e) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index b526b857546..3c40d81e59a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -20,11 +20,10 @@ import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; -import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; +import org.opencb.opencga.core.models.analysis.knockout.*; import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.study.Study; @@ -109,7 +108,6 @@ public RgaManager(Configuration configuration, StorageConfiguration storageConfi public OpenCGAResult individualQuery(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); @@ -117,129 +115,27 @@ public OpenCGAResult individualQuery(String studyStr, Quer StopWatch stopWatch = new StopWatch(); stopWatch.start(); - - Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); - Query auxQuery = query != null ? new Query(query) : new Query(); - - QueryOptions queryOptions = setDefaultLimit(options); - - int limit = queryOptions.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); - int skip = queryOptions.getInt(QueryOptions.SKIP); - - long numTotalResults = 0; - List sampleIds; - Event event = null; - boolean count = queryOptions.getBoolean(QueryOptions.COUNT); - - if (auxQuery.isEmpty()) { - QueryOptions catalogOptions = new QueryOptions(SampleManager.INCLUDE_SAMPLE_IDS) - .append(QueryOptions.LIMIT, limit) - .append(QueryOptions.SKIP, skip) - .append(QueryOptions.COUNT, queryOptions.getBoolean(QueryOptions.COUNT)); - Query catalogQuery = new Query(SampleDBAdaptor.QueryParams.INTERNAL_RGA_STATUS.key(), RgaIndex.Status.INDEXED); - if (!isOwnerOrAdmin) { - catalogQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); - } - - OpenCGAResult search = catalogManager.getSampleManager().search(study.getFqn(), catalogQuery, catalogOptions, token); - if (search.getNumResults() == 0) { - stopWatch.stop(); - return OpenCGAResult.empty(KnockoutByIndividual.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); - } - - sampleIds = search.getResults().stream().map(Sample::getId).collect(Collectors.toList()); - numTotalResults = search.getNumMatches(); - } else { - if (!auxQuery.containsKey("sampleId") && !auxQuery.containsKey("individualId")) { - // 1st. we perform a facet to get the different sample ids matching the user query - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, - new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID).append(QueryOptions.LIMIT, -1)); - if (result.getNumResults() == 0) { - stopWatch.stop(); - return OpenCGAResult.empty(KnockoutByIndividual.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); - } - List samples = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - auxQuery.put("sampleId", samples); - } - - // From the list of sample ids the user wants to retrieve data from, we filter those for which the user has permissions - Query sampleQuery = new Query(); - if (!isOwnerOrAdmin) { - sampleQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," - + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); - } - - List authorisedSamples = new LinkedList<>(); - if (!isOwnerOrAdmin || !auxQuery.containsKey("sampleId")) { - int maxSkip = 10000; - if (skip > maxSkip) { - throw new RgaException("Cannot paginate further than " + maxSkip + " individuals. Please, narrow down your query."); - } - - int batchSize = 1000; - int currentBatch = 0; - boolean queryNextBatch = true; - - String sampleQueryField; - List values; - if (auxQuery.containsKey("individualId")) { - sampleQueryField = SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(); - values = auxQuery.getAsStringList("individualId"); - } else { - sampleQueryField = SampleDBAdaptor.QueryParams.ID.key(); - values = auxQuery.getAsStringList("sampleId"); - } - - if (count && values.size() > maxSkip) { - event = new Event(Event.Type.WARNING, "numMatches value is approximated considering the individuals that are " - + "accessible for the user from the first batch of 10000 individuals matching the solr query."); - } - - while (queryNextBatch) { - List tmpValues = values.subList(currentBatch, Math.min(values.size(), batchSize + currentBatch)); - - sampleQuery.put(sampleQueryField, tmpValues); - OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), - SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); - authorisedSamples.addAll((Collection) authorisedSampleIdResult.getResults()); - - if (values.size() < batchSize + currentBatch) { - queryNextBatch = false; - numTotalResults = authorisedSamples.size(); - } else if (count && currentBatch < maxSkip) { - currentBatch += batchSize; - } else if (authorisedSamples.size() > skip + limit) { - queryNextBatch = false; - // We will get an approximate number of total results - numTotalResults = Math.round(((float) authorisedSamples.size() * values.size()) / (currentBatch + batchSize)); - } else { - currentBatch += batchSize; - } - } - } else { - authorisedSamples = auxQuery.getAsStringList("sampleId"); - numTotalResults = authorisedSamples.size(); - } - - if (skip == 0 && limit > authorisedSamples.size()) { - sampleIds = authorisedSamples; - } else if (skip > authorisedSamples.size()) { + Preprocess preprocess; + try { + preprocess = individualQueryPreprocess(study, query, options, token); + } catch (RgaException e) { + if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { stopWatch.stop(); return OpenCGAResult.empty(KnockoutByIndividual.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); - } else { - int to = Math.min(authorisedSamples.size(), skip + limit); - sampleIds = authorisedSamples.subList(skip, to); } + throw e; + } catch (CatalogException | IOException e) { + throw e; } - auxQuery.put("sampleId", sampleIds); ExecutorService executor = Executors.newFixedThreadPool(2); Future variantFuture = executor.submit( - () -> variantStorageQuery(study.getFqn(), sampleIds, auxQuery, options, token) + () -> variantStorageQuery(study.getFqn(), preprocess.getQuery().getAsStringList("sampleId"), preprocess.getQuery(), + options, token) ); - Future rgaIteratorFuture = executor.submit(() -> rgaEngine.individualQuery(collection, auxQuery, queryOptions)); + Future rgaIteratorFuture = executor.submit(() -> rgaEngine.individualQuery(collection, preprocess.getQuery(), + preprocess.getQueryOptions())); VariantDBIterator variantDBIterator; try { @@ -260,11 +156,11 @@ public OpenCGAResult individualQuery(String studyStr, Quer OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), knockoutByIndividuals.size(), knockoutByIndividuals, -1); - if (count) { - result.setNumMatches(numTotalResults); + if (preprocess.getQueryOptions().getBoolean(QueryOptions.COUNT)) { + result.setNumMatches(preprocess.getNumTotalResults()); } - if (event != null) { - result.setEvents(Collections.singletonList(event)); + if (preprocess.getEvent() != null) { + result.setEvents(Collections.singletonList(preprocess.getEvent())); } return result; @@ -680,7 +576,7 @@ public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, String public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List sampleIds, RgaIndex.Status status, - String token) throws CatalogException, RgaException { + String token) throws CatalogException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); @@ -722,50 +618,369 @@ public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List((int) stopWatch.getTime(TimeUnit.MILLISECONDS), null, sampleIds.size(), 0, updatedSamples, 0); } -// public List PetterQuery(List variants, Set transcripts, String study, ArrayList samples, -// String token, KnockoutVariant.KnockoutType knockoutType) -// throws CatalogException, IOException, StorageEngineException { -// Query query = new Query(VariantQueryParam.ID.key(), variants) -// .append(VariantQueryParam.STUDY.key(), study) -// .append(VariantQueryParam.INCLUDE_SAMPLE.key(), samples) -// .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); -// List result = get(query, new QueryOptions(), token).getResults(); -// List knockoutVariants = new LinkedList<>(); -// for (Variant variant : result) { -// VariantAnnotation annotation = variant.getAnnotation(); -//// -//// for (PopulationFrequency populationFrequency : annotation.getPopulationFrequencies()) { -////// populationFrequency.getStudy() -////// populationFrequency.getPopulation() -//// } -//// -//// // Clinvar and Cosmic -//// for (EvidenceEntry evidenceEntry : annotation.getTraitAssociation()) { -//// ClinicalSignificance clinicalSignificance = evidenceEntry.getVariantClassification().getClinicalSignificance(); -//// } -// List myConsequenceTypes = new ArrayList<>(transcripts.size()); -// for (ConsequenceType consequenceType : annotation.getConsequenceTypes()) { -// String geneName = consequenceType.getGeneName(); -// String transcriptId = consequenceType.getEnsemblTranscriptId(); -// if (transcripts.contains(transcriptId)) { -//// for (SequenceOntologyTerm sequenceOntologyTerm : consequenceType.getSequenceOntologyTerms()) { -//// -//// } -// myConsequenceTypes.add(consequenceType); -// } -// } -// StudyEntry studyEntry = variant.getStudies().get(0); -// int samplePosition = 0; -// for (SampleEntry sample : studyEntry.getSamples()) { -// String sampleId = samples.get(samplePosition++); -// for (ConsequenceType ct : myConsequenceTypes) { -// knockoutVariants.add(new KnockoutVariant(variant, studyEntry, studyEntry.getFile(sample.getFileIndex()), sample, -// annotation, ct, knockoutType)); -// } -// } -// } -// return knockoutVariants; -// } + public OpenCGAResult individualSummary(String studyStr, Query query, QueryOptions options, String token) + throws RgaException, CatalogException, IOException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String collection = getCollectionName(study.getFqn()); + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + Preprocess preprocess; + try { + preprocess = individualQueryPreprocess(study, query, options, token); + } catch (RgaException e) { + if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { + stopWatch.stop(); + return OpenCGAResult.empty(KnockoutByIndividualSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + } + throw e; + } catch (CatalogException | IOException e) { + throw e; + } + + List sampleIds = preprocess.getQuery().getAsStringList(RgaQueryParams.SAMPLE_ID.key()); + preprocess.getQuery().remove(RgaQueryParams.SAMPLE_ID.key()); + List knockoutByIndividualSummaryList = new ArrayList<>(sampleIds.size()); + + ExecutorService executor = Executors.newFixedThreadPool(4); + List> futureList = new ArrayList<>(sampleIds.size()); + for (String sampleId : sampleIds) { + futureList.add(executor.submit(() -> calculateIndividualSummary(collection, preprocess.getQuery(), sampleId))); + } + + try { + for (Future summaryFuture : futureList) { + knockoutByIndividualSummaryList.add(summaryFuture.get()); + } + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), + knockoutByIndividualSummaryList.size(), knockoutByIndividualSummaryList, -1); + + if (preprocess.getQueryOptions().getBoolean(QueryOptions.COUNT)) { + result.setNumMatches(preprocess.getNumTotalResults()); + } + if (preprocess.getEvent() != null) { + result.setEvents(Collections.singletonList(preprocess.getEvent())); + } + + return result; + } + + private KnockoutByIndividualSummary calculateIndividualSummary(String collection, Query query, String sampleId) + throws RgaException, IOException { + Query auxQuery = new Query(query); + auxQuery.put(RgaQueryParams.SAMPLE_ID.key(), sampleId); + + // 1. Get KnockoutByIndividual information + Query individualQuery = new Query(RgaQueryParams.SAMPLE_ID.key(), sampleId); + QueryOptions options = new QueryOptions() + .append(QueryOptions.LIMIT, 1) + .append(QueryOptions.EXCLUDE, "genes"); + RgaIterator rgaIterator = rgaEngine.individualQuery(collection, individualQuery, options); + + if (!rgaIterator.hasNext()) { + throw new RgaException("Unexpected error. Sample '" + sampleId + "' not found"); + } + RgaDataModel rgaDataModel = rgaIterator.next(); + + KnockoutByIndividual knockoutByIndividual = AbstractRgaConverter.fillIndividualInfo(rgaDataModel); + KnockoutByIndividualSummary knockoutByIndividualSummary = new KnockoutByIndividualSummary(knockoutByIndividual); + + // 2. Get KnockoutType counts + QueryOptions knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.FULL_VARIANT_INFO); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); + KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); + for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { + knockoutTypeCount.processVariant(variantBucket.getValue()); + } + knockoutByIndividualSummary.setNumVariants(knockoutTypeCount.getNumVariants()); + knockoutByIndividualSummary.setNumCompHet(knockoutTypeCount.getNumCompHetVariants()); + knockoutByIndividualSummary.setNumHomAlt(knockoutTypeCount.getNumHomVariants()); + knockoutByIndividualSummary.setNumHetAlt(knockoutTypeCount.getNumHetVariants()); + knockoutByIndividualSummary.setNumDelOverlap(knockoutTypeCount.getNumDelOverlapVariants()); + + // 3. Get gene id list + QueryOptions geneFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.GENE_ID); + facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); + List geneIds = facetFieldDataResult.first().getBuckets() + .stream() + .map(FacetField.Bucket::getValue) + .collect(Collectors.toList()); + knockoutByIndividualSummary.setGenes(geneIds); + + return knockoutByIndividualSummary; + } + + private class KnockoutTypeCount { + + private Set knockoutTypeQuery; + private Set popFreqQuery; + private Set typeQuery; + private Set consequenceTypeQuery; + + private Set variantIds; + private Set compHetVariantIds; + private Set homVariantIds; + private Set hetVariantIds; + private Set delOverlapVariantIds; + + public KnockoutTypeCount(Query query) { + // TODO: Add manual filters (predicates) + knockoutTypeQuery = new HashSet<>(); + popFreqQuery = new HashSet<>(); + typeQuery = new HashSet<>(); + consequenceTypeQuery = new HashSet<>(); + variantIds = new HashSet<>(); + compHetVariantIds = new HashSet<>(); + homVariantIds = new HashSet<>(); + hetVariantIds = new HashSet<>(); + delOverlapVariantIds = new HashSet<>(); + } + + public void processVariant(String variant) throws RgaException { + RgaUtils.CodedVariant codedVariant = new RgaUtils.CodedVariant(variant); + + if (!knockoutTypeQuery.isEmpty() && !knockoutTypeQuery.contains(codedVariant.getKnockoutType())) { + return; + } + if (!popFreqQuery.isEmpty() + && codedVariant.getPopulationFrequencies().stream().noneMatch((popFreq) -> popFreqQuery.contains(popFreq))) { + return; + } + if (!typeQuery.isEmpty() && !typeQuery.contains(codedVariant.getType())) { + return; + } + if (!consequenceTypeQuery.isEmpty() + && codedVariant.getConsequenceType().stream().noneMatch((ct) -> consequenceTypeQuery.contains(ct))) { + return; + } + + variantIds.add(codedVariant.getVariantId()); + KnockoutVariant.KnockoutType knockoutType = KnockoutVariant.KnockoutType.valueOf(codedVariant.getKnockoutType()); + switch (knockoutType) { + case HOM_ALT: + homVariantIds.add(codedVariant.getVariantId()); + break; + case COMP_HET: + compHetVariantIds.add(codedVariant.getVariantId()); + break; + case HET_ALT: + hetVariantIds.add(codedVariant.getVariantId()); + break; + case DELETION_OVERLAP: + delOverlapVariantIds.add(codedVariant.getVariantId()); + break; + default: + throw new IllegalStateException("Unexpected value: " + codedVariant.getKnockoutType()); + } + } + + public int getNumVariants() { + return variantIds.size(); + } + + public int getNumCompHetVariants() { + return compHetVariantIds.size(); + } + + public int getNumHomVariants() { + return homVariantIds.size(); + } + + public int getNumHetVariants() { + return hetVariantIds.size(); + } + + public int getNumDelOverlapVariants() { + return delOverlapVariantIds.size(); + } + } + + private Preprocess individualQueryPreprocess(Study study, Query query, QueryOptions options, String token) + throws RgaException, CatalogException, IOException { + + String userId = catalogManager.getUserManager().getUserId(token); + String collection = getCollectionName(study.getFqn()); + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); + + Preprocess preprocessResult = new Preprocess(); + preprocessResult.setQuery(query != null ? new Query(query) : new Query()); + preprocessResult.setQueryOptions(setDefaultLimit(options)); + QueryOptions queryOptions = preprocessResult.getQueryOptions(); + + int limit = queryOptions.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); + int skip = queryOptions.getInt(QueryOptions.SKIP); + + List sampleIds; + boolean count = queryOptions.getBoolean(QueryOptions.COUNT); + + if (preprocessResult.getQuery().isEmpty()) { + QueryOptions catalogOptions = new QueryOptions(SampleManager.INCLUDE_SAMPLE_IDS) + .append(QueryOptions.LIMIT, limit) + .append(QueryOptions.SKIP, skip) + .append(QueryOptions.COUNT, queryOptions.getBoolean(QueryOptions.COUNT)); + Query catalogQuery = new Query(SampleDBAdaptor.QueryParams.INTERNAL_RGA_STATUS.key(), RgaIndex.Status.INDEXED); + if (!isOwnerOrAdmin) { + catalogQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); + } + + OpenCGAResult search = catalogManager.getSampleManager().search(study.getFqn(), catalogQuery, catalogOptions, token); + if (search.getNumResults() == 0) { + throw RgaException.noResultsMatching(); + } + + sampleIds = search.getResults().stream().map(Sample::getId).collect(Collectors.toList()); + preprocessResult.setNumTotalResults(search.getNumMatches()); + } else { + if (!preprocessResult.getQuery().containsKey("sampleId") + && !preprocessResult.getQuery().containsKey("individualId")) { + // 1st. we perform a facet to get the different sample ids matching the user query + DataResult result = rgaEngine.facetedQuery(collection, preprocessResult.getQuery(), + new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID).append(QueryOptions.LIMIT, -1)); + if (result.getNumResults() == 0) { + throw RgaException.noResultsMatching(); + } + List samples = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + preprocessResult.getQuery().put("sampleId", samples); + } + + // From the list of sample ids the user wants to retrieve data from, we filter those for which the user has permissions + Query sampleQuery = new Query(); + if (!isOwnerOrAdmin) { + sampleQuery.put(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," + + SampleAclEntry.SamplePermissions.VIEW_VARIANTS); + } + + List authorisedSamples = new LinkedList<>(); + if (!isOwnerOrAdmin || !preprocessResult.getQuery().containsKey("sampleId")) { + int maxSkip = 10000; + if (skip > maxSkip) { + throw new RgaException("Cannot paginate further than " + maxSkip + " individuals. Please, narrow down your query."); + } + + int batchSize = 1000; + int currentBatch = 0; + boolean queryNextBatch = true; + + String sampleQueryField; + List values; + if (preprocessResult.getQuery().containsKey("individualId")) { + sampleQueryField = SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(); + values = preprocessResult.getQuery().getAsStringList("individualId"); + } else { + sampleQueryField = SampleDBAdaptor.QueryParams.ID.key(); + values = preprocessResult.getQuery().getAsStringList("sampleId"); + } + + if (count && values.size() > maxSkip) { + preprocessResult.setEvent(new Event(Event.Type.WARNING, "numMatches value is approximated considering the " + + "individuals that are accessible for the user from the first batch of 10000 individuals matching the solr " + + "query.")); + } + + while (queryNextBatch) { + List tmpValues = values.subList(currentBatch, Math.min(values.size(), batchSize + currentBatch)); + + sampleQuery.put(sampleQueryField, tmpValues); + OpenCGAResult authorisedSampleIdResult = catalogManager.getSampleManager().distinct(study.getFqn(), + SampleDBAdaptor.QueryParams.ID.key(), sampleQuery, token); + authorisedSamples.addAll((Collection) authorisedSampleIdResult.getResults()); + + if (values.size() < batchSize + currentBatch) { + queryNextBatch = false; + preprocessResult.setNumTotalResults(authorisedSamples.size()); + } else if (count && currentBatch < maxSkip) { + currentBatch += batchSize; + } else if (authorisedSamples.size() > skip + limit) { + queryNextBatch = false; + // We will get an approximate number of total results + preprocessResult.setNumTotalResults(Math.round(((float) authorisedSamples.size() * values.size()) + / (currentBatch + batchSize))); + } else { + currentBatch += batchSize; + } + } + } else { + authorisedSamples = preprocessResult.getQuery().getAsStringList("sampleId"); + preprocessResult.setNumTotalResults(authorisedSamples.size()); + } + + if (skip == 0 && limit > authorisedSamples.size()) { + sampleIds = authorisedSamples; + } else if (skip > authorisedSamples.size()) { + throw RgaException.noResultsMatching(); + } else { + int to = Math.min(authorisedSamples.size(), skip + limit); + sampleIds = authorisedSamples.subList(skip, to); + } + } + preprocessResult.getQuery().put("sampleId", sampleIds); + + return preprocessResult; + } + + private class Preprocess { + + private Query query; + private QueryOptions queryOptions; + private long numTotalResults; + private Event event; + + public Preprocess() { + } + + public Query getQuery() { + return query; + } + + public Preprocess setQuery(Query query) { + this.query = query; + return this; + } + + public QueryOptions getQueryOptions() { + return queryOptions; + } + + public Preprocess setQueryOptions(QueryOptions queryOptions) { + this.queryOptions = queryOptions; + return this; + } + + public long getNumTotalResults() { + return numTotalResults; + } + + public Preprocess setNumTotalResults(long numTotalResults) { + this.numTotalResults = numTotalResults; + return this; + } + + public Event getEvent() { + return event; + } + + public Preprocess setEvent(Event event) { + this.event = event; + return this; + } + } public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) throws CatalogException, IOException, RgaException { @@ -872,6 +1087,17 @@ private void load(String study, Path path, String token) throws IOException, Rga // Insert the remaining entries if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { + for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividualList) { + try { + catalogManager.getIndividualManager().create(study, new Individual() + .setId(knockoutByIndividual.getId()) + .setSamples(Collections.singletonList(new Sample().setId(knockoutByIndividual.getSampleId()))), + QueryOptions.empty(), token); + } catch (CatalogException e) { + e.printStackTrace(); + } + } + List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); rgaEngine.insert(collection, rgaDataModelList); logger.debug("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index f10a6e828f9..a3e58a7573e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -1,6 +1,7 @@ package org.opencb.opencga.analysis.rga; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.ConsequenceType; @@ -15,6 +16,7 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static org.opencb.opencga.analysis.rga.RgaDataModel.*; @@ -23,6 +25,7 @@ class RgaUtils { private static final Pattern OPERATION_PATTERN = Pattern.compile("^([^=<>~!]*)(>?=?|!=?|!?=?~|==?)([^=<>~!]+.*)$"); static final String SEPARATOR = "__"; + static final String INNER_SEPARATOR = "-"; private static final Map ENCODE_MAP; private static final Map DECODE_MAP; @@ -307,4 +310,69 @@ static KnockoutVariant convertToKnockoutVariant(Variant variant, SampleEntry sam return new KnockoutVariant(variant, studyEntry, fileEntry, sampleEntry, variantAnnotation, consequenceType, knockoutType); } + public static class CodedVariant { + // 1:2233232:A:T __ SNV __ COMP_HET __ VR_R __ A_J + private String variantId; + private String type; + private String knockoutType; + private List populationFrequencies; + private Set consequenceType; + + public CodedVariant(String variantId, String type, String knockoutType, List consequenceTypeList, + float thousandGenomesPopFreq, float gnomadPopFreq) throws RgaException { + this.variantId = variantId; + this.type = type; + this.knockoutType = knockoutType; + this.consequenceType = new HashSet<>(); + for (String consequenceType : consequenceTypeList) { + this.consequenceType.add(String.valueOf(VariantQueryUtils.parseConsequenceType(consequenceType))); + } + this.populationFrequencies = new ArrayList<>(2); + this.populationFrequencies.add( + RgaUtils.encode(THOUSAND_GENOMES_STUDY.toUpperCase() + SEPARATOR + getPopulationFrequencyKey(thousandGenomesPopFreq))); + this.populationFrequencies.add( + RgaUtils.encode(GNOMAD_GENOMES_STUDY.toUpperCase() + SEPARATOR + getPopulationFrequencyKey(gnomadPopFreq))); + } + + public CodedVariant(String fullVariant) throws RgaException { + String[] split = fullVariant.split(SEPARATOR); + if (split.length != 5) { + throw new RgaException("Unexpected variant string received '" + fullVariant + + "'. Expected {id}__{type}__{knockoutType}__{conseqType}__{popFreqs}"); + } + + this.variantId = split[0]; + this.type = split[1]; + this.knockoutType = split[2]; + this.consequenceType = new HashSet<>(); + this.consequenceType.addAll(Arrays.asList(split[3].split(INNER_SEPARATOR))); + this.populationFrequencies = Arrays.asList(split[4].split(INNER_SEPARATOR)); + } + + public String getFullVariant() { + return variantId + SEPARATOR + type + SEPARATOR + knockoutType + SEPARATOR + StringUtils.join(consequenceType, INNER_SEPARATOR) + + SEPARATOR + StringUtils.join(populationFrequencies, INNER_SEPARATOR); + } + + public String getVariantId() { + return variantId; + } + + public String getType() { + return type; + } + + public String getKnockoutType() { + return knockoutType; + } + + public Set getConsequenceType() { + return consequenceType; + } + + public List getPopulationFrequencies() { + return populationFrequencies; + } + } + } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/exceptions/RgaException.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/exceptions/RgaException.java index df346a9e4d2..daecdaa2386 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/exceptions/RgaException.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/exceptions/RgaException.java @@ -2,6 +2,8 @@ public class RgaException extends Exception { + public final static String NO_RESULTS_FOUND = "No results found matching the query"; + public RgaException(String message) { super(message); } @@ -10,4 +12,8 @@ public RgaException(String message, Throwable cause) { super(message, cause); } + public static RgaException noResultsMatching() { + return new RgaException(NO_RESULTS_FOUND); + } + } diff --git a/opencga-clinical/src/main/resources/rga/managed-schema b/opencga-clinical/src/main/resources/rga/managed-schema index 7247d424ae8..8e73284a9e3 100644 --- a/opencga-clinical/src/main/resources/rga/managed-schema +++ b/opencga-clinical/src/main/resources/rga/managed-schema @@ -590,6 +590,7 @@ + diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java new file mode 100644 index 00000000000..c3cf68b707a --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java @@ -0,0 +1,218 @@ +package org.opencb.opencga.core.models.analysis.knockout; + +import org.opencb.biodata.models.clinical.Disorder; +import org.opencb.biodata.models.clinical.Phenotype; +import org.opencb.biodata.models.pedigree.IndividualProperty; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class KnockoutByIndividualSummary { + + private String id; + private String sampleId; + private String motherId; + private String motherSampleId; + private String fatherId; + private String fatherSampleId; + private IndividualProperty.Sex sex; + private List phenotypes; + private List disorders; + + private List genes; + private int numVariants; + private int numHomAlt; + private int numCompHet; + private int numHetAlt; + private int numDelOverlap; + + public KnockoutByIndividualSummary() { + } + + public KnockoutByIndividualSummary(KnockoutByIndividual knockoutByIndividual) { + this(knockoutByIndividual.getId(), knockoutByIndividual.getSampleId(), knockoutByIndividual.getMotherId(), + knockoutByIndividual.getMotherSampleId(), knockoutByIndividual.getFatherId(), knockoutByIndividual.getFatherSampleId(), + knockoutByIndividual.getSex(), knockoutByIndividual.getPhenotypes(), knockoutByIndividual.getDisorders(), + Collections.emptyList(), 0, 0, 0, 0, 0); + } + + public KnockoutByIndividualSummary(String id, String sampleId, String motherId, String motherSampleId, String fatherId, + String fatherSampleId, IndividualProperty.Sex sex, List phenotypes, + List disorders, List genes, int numVariants, int numHomAlt, int numCompHet, + int numHetAlt, int numDelOverlap) { + this.id = id; + this.sampleId = sampleId; + this.motherId = motherId; + this.motherSampleId = motherSampleId; + this.fatherId = fatherId; + this.fatherSampleId = fatherSampleId; + this.sex = sex; + this.phenotypes = phenotypes; + this.disorders = disorders; + this.genes = genes; + this.numVariants = numVariants; + this.numHomAlt = numHomAlt; + this.numCompHet = numCompHet; + this.numHetAlt = numHetAlt; + this.numDelOverlap = numDelOverlap; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("KnockoutByIndividualSummary{"); + sb.append("id='").append(id).append('\''); + sb.append(", sampleId='").append(sampleId).append('\''); + sb.append(", motherId='").append(motherId).append('\''); + sb.append(", motherSampleId='").append(motherSampleId).append('\''); + sb.append(", fatherId='").append(fatherId).append('\''); + sb.append(", fatherSampleId='").append(fatherSampleId).append('\''); + sb.append(", sex=").append(sex); + sb.append(", phenotypes=").append(phenotypes); + sb.append(", disorders=").append(disorders); + sb.append(", genes=").append(genes); + sb.append(", numVariants=").append(numVariants); + sb.append(", numHomAlt=").append(numHomAlt); + sb.append(", numCompHet=").append(numCompHet); + sb.append(", numHetAlt=").append(numHetAlt); + sb.append(", numDelOverlap=").append(numDelOverlap); + sb.append('}'); + return sb.toString(); + } + + public String getId() { + return id; + } + + public KnockoutByIndividualSummary setId(String id) { + this.id = id; + return this; + } + + public String getSampleId() { + return sampleId; + } + + public KnockoutByIndividualSummary setSampleId(String sampleId) { + this.sampleId = sampleId; + return this; + } + + public String getMotherId() { + return motherId; + } + + public KnockoutByIndividualSummary setMotherId(String motherId) { + this.motherId = motherId; + return this; + } + + public String getMotherSampleId() { + return motherSampleId; + } + + public KnockoutByIndividualSummary setMotherSampleId(String motherSampleId) { + this.motherSampleId = motherSampleId; + return this; + } + + public String getFatherId() { + return fatherId; + } + + public KnockoutByIndividualSummary setFatherId(String fatherId) { + this.fatherId = fatherId; + return this; + } + + public String getFatherSampleId() { + return fatherSampleId; + } + + public KnockoutByIndividualSummary setFatherSampleId(String fatherSampleId) { + this.fatherSampleId = fatherSampleId; + return this; + } + + public IndividualProperty.Sex getSex() { + return sex; + } + + public KnockoutByIndividualSummary setSex(IndividualProperty.Sex sex) { + this.sex = sex; + return this; + } + + public List getPhenotypes() { + return phenotypes; + } + + public KnockoutByIndividualSummary setPhenotypes(List phenotypes) { + this.phenotypes = phenotypes; + return this; + } + + public List getDisorders() { + return disorders; + } + + public KnockoutByIndividualSummary setDisorders(List disorders) { + this.disorders = disorders; + return this; + } + + public List getGenes() { + return genes; + } + + public KnockoutByIndividualSummary setGenes(List genes) { + this.genes = genes; + return this; + } + + public int getNumVariants() { + return numVariants; + } + + public KnockoutByIndividualSummary setNumVariants(int numVariants) { + this.numVariants = numVariants; + return this; + } + + public int getNumHomAlt() { + return numHomAlt; + } + + public KnockoutByIndividualSummary setNumHomAlt(int numHomAlt) { + this.numHomAlt = numHomAlt; + return this; + } + + public int getNumCompHet() { + return numCompHet; + } + + public KnockoutByIndividualSummary setNumCompHet(int numCompHet) { + this.numCompHet = numCompHet; + return this; + } + + public int getNumHetAlt() { + return numHetAlt; + } + + public KnockoutByIndividualSummary setNumHetAlt(int numHetAlt) { + this.numHetAlt = numHetAlt; + return this; + } + + public int getNumDelOverlap() { + return numDelOverlap; + } + + public KnockoutByIndividualSummary setNumDelOverlap(int numDelOverlap) { + this.numDelOverlap = numDelOverlap; + return this; + } +} From ba97846249eba3c1f2d438066b13b272144752cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 22 Apr 2021 11:15:17 +0200 Subject: [PATCH 205/412] analysis: implement alignment/hsmetrics as a job, #1739 --- .../qc/AlignmentFlagStatsAnalysis.java | 4 +- .../qc/AlignmentHsMetricsAnalysis.java | 162 ++++++++++++ .../analysis/sample/qc/SampleQcAnalysis.java | 41 +-- .../qc/SampleQcLocalAnalysisExecutor.java | 142 +--------- .../DockerWrapperAnalysisExecutor.java | 78 ------ .../DockerWrapperAnalysisExecutor.java | 211 +++++++++++++++ .../PicardWrapperAnalysisExecutor.java | 234 ----------------- .../fastqc/FastqcWrapperAnalysisExecutor.java | 22 +- .../{ => picard}/PicardWrapperAnalysis.java | 23 +- .../picard/PicardWrapperAnalysisExecutor.java | 246 ++++++++++++++++++ .../SamtoolsWrapperAnalysisExecutor.java | 23 +- .../internal/InternalCliOptionsParser.java | 1 + .../executors/AlignmentCommandExecutor.java | 20 ++ .../VariantInternalCommandExecutor.java | 2 - .../options/AlignmentCommandOptions.java | 28 ++ .../options/VariantCommandOptions.java | 6 - .../app/cli/main/OpencgaCliOptionsParser.java | 1 + .../analysis/AlignmentCommandExecutor.java | 16 +- .../analysis/VariantCommandExecutor.java | 2 - .../client/rest/clients/AdminClient.java | 2 +- .../client/rest/clients/AlignmentClient.java | 21 +- .../client/rest/clients/ClinicalClient.java | 2 +- .../client/rest/clients/CohortClient.java | 2 +- .../rest/clients/DiseasePanelClient.java | 2 +- .../client/rest/clients/FamilyClient.java | 2 +- .../client/rest/clients/FileClient.java | 2 +- .../client/rest/clients/GA4GHClient.java | 2 +- .../client/rest/clients/IndividualClient.java | 2 +- .../client/rest/clients/JobClient.java | 2 +- .../client/rest/clients/MetaClient.java | 2 +- .../client/rest/clients/ProjectClient.java | 2 +- .../client/rest/clients/SampleClient.java | 2 +- .../client/rest/clients/StudyClient.java | 2 +- .../client/rest/clients/UserClient.java | 2 +- .../client/rest/clients/VariantClient.java | 6 +- .../rest/clients/VariantOperationClient.java | 2 +- .../opencga/core/api/ParamConstants.java | 1 + .../alignment/AlignmentHsMetricsParams.java | 70 +++++ .../variant/SampleQcAnalysisParams.java | 26 +- .../monitor/daemons/ExecutionDaemon.java | 1 + .../rest/analysis/AlignmentWebService.java | 16 ++ 41 files changed, 857 insertions(+), 576 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DockerWrapperAnalysisExecutor.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/PicardWrapperAnalysisExecutor.java rename opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/{ => picard}/PicardWrapperAnalysis.java (80%) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentHsMetricsParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java index 1991bfa20ad..2e4c7f98bae 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java @@ -91,8 +91,6 @@ protected void run() throws ToolException { setUpStorageEngineExecutor(study); - Path flagStatsFile = getOutDir().resolve(new java.io.File(catalogBamFile.getUri().getPath()).getName() + ".flagstats.txt"); - step(SAMTOOLS_FLAG_STATS_STEP, () -> { executorParams.put(EXECUTOR_ID, SamtoolsWrapperAnalysisExecutor.ID); getToolExecutor(SamtoolsWrapperAnalysisExecutor.class) @@ -103,6 +101,8 @@ protected void run() throws ToolException { step(SAVE_ALIGNMENT_FLAG_STATS_STEP, () -> { + Path flagStatsFile = getOutDir().resolve(new java.io.File(catalogBamFile.getUri().getPath()).getName() + ".flagstats.txt"); + if (flagStatsFile.toFile().exists()) { SamtoolsFlagstats flagStats = SamtoolsFlagstatsParser.parse(flagStatsFile); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java new file mode 100644 index 00000000000..77f38c64aff --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java @@ -0,0 +1,162 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.alignment.qc; + +import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.formats.alignment.picard.HsMetrics; +import org.opencb.biodata.formats.alignment.picard.io.HsMetricsParser; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysisExecutor; +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.AlignmentHsMetricsParams; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.file.FileQualityControl; +import org.opencb.opencga.core.models.file.FileUpdateParams; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; + +import java.util.ArrayList; +import java.util.List; + +import static org.opencb.opencga.core.api.ParamConstants.ALIGNMENT_HS_METRICS_DESCRIPTION; +import static org.opencb.opencga.core.tools.OpenCgaToolExecutor.EXECUTOR_ID; + +@Tool(id = AlignmentHsMetricsAnalysis.ID, resource = Enums.Resource.ALIGNMENT) +public class AlignmentHsMetricsAnalysis extends OpenCgaToolScopeStudy { + + public static final String ID = "alignment-hsmetrics"; + public static final String DESCRIPTION = ALIGNMENT_HS_METRICS_DESCRIPTION; + + private static final String PICARD_BEDTOINTERVALLIST_STEP = "picard-bed-to-interval-list"; + private static final String PICARD_COLLECTHSMETRICS_STEP = "picard-collect-hs-metrics"; + private static final String SAVE_ALIGNMENT_HSMETRICS_STEP = "save-alignment-hsmetrics"; + + @ToolParams + protected final AlignmentHsMetricsParams analysisParams = new AlignmentHsMetricsParams(); + + private File catalogBamFile; + private File catalogBedFile; + private File catalogDictFile; +// private File catalogRefSeqFile; + + @Override + protected void check() throws Exception { + super.check(); + + if (StringUtils.isEmpty(getStudy())) { + throw new ToolException("Missing study"); + } + + try { + catalogBamFile = AnalysisUtils.getCatalogFile(analysisParams.getBamFile(), getStudy(), catalogManager.getFileManager(), token); + } catch (CatalogException e) { + throw new ToolException(e); + } + + try { + catalogBedFile = AnalysisUtils.getCatalogFile(analysisParams.getBedFile(), getStudy(), catalogManager.getFileManager(), + token); + } catch (CatalogException e) { + throw new ToolException(e); + } + + try { + catalogDictFile = AnalysisUtils.getCatalogFile(analysisParams.getDictFile(), getStudy(), catalogManager.getFileManager(), + token); + } catch (CatalogException e) { + throw new ToolException(e); + } + +// try { +// catalogRefSeqFile = AnalysisUtils.getCatalogFile(analysisParams.getRefSeqFile(), getStudy(), catalogManager.getFileManager(), +// token); +// } catch (CatalogException e) { +// throw new ToolException(e); +// } + } + + @Override + protected List getSteps() { + List steps = new ArrayList<>(); + steps.add(PICARD_BEDTOINTERVALLIST_STEP); + steps.add(PICARD_COLLECTHSMETRICS_STEP); + steps.add(SAVE_ALIGNMENT_HSMETRICS_STEP); + return steps; + } + + @Override + protected void run() throws ToolException { + + setUpStorageEngineExecutor(study); + + java.io.File baitFile = getOutDir().resolve("intervals.bait").toFile(); + java.io.File hsMetricsFile = getOutDir().resolve("hsmetrics.txt").toFile(); + + step(PICARD_BEDTOINTERVALLIST_STEP, () -> { + executorParams.put(EXECUTOR_ID, PicardWrapperAnalysisExecutor.ID); + + getToolExecutor(PicardWrapperAnalysisExecutor.class) + .setCommand("BedToIntervalList") + .setBedFile(catalogBedFile.getUri().getPath()) + .setDictFile(catalogDictFile.getUri().getPath()) + .setOutFile(baitFile.getName()) + .execute(); + + if (!baitFile.exists()) { + throw new ToolException("Something wrong happened when running picard/BedToIntervalList"); + } + }); + + step(PICARD_COLLECTHSMETRICS_STEP, () -> { + executorParams.put(EXECUTOR_ID, PicardWrapperAnalysisExecutor.ID); + + getToolExecutor(PicardWrapperAnalysisExecutor.class) + .setCommand("CollectHsMetrics") + .setBamFile(catalogBamFile.getUri().getPath()) +// .setRefSeqFile(catalogRefSeqFile.getUri().getPath()) + .setBaitIntervalsFile(baitFile.getAbsolutePath()) + .setTargetIntervalsFile(baitFile.getAbsolutePath()) + .setOutFile(hsMetricsFile.getName()) + .execute(); + + if (hsMetricsFile.exists()) { + throw new ToolException("Something wrong happened when running picard/CollectHsMetrics"); + } + }); + + step(SAVE_ALIGNMENT_HSMETRICS_STEP, () -> { + // Parse HS metrics + HsMetrics hsMetrics = HsMetricsParser.parse(hsMetricsFile); + + // Update quality control for the catalog file + FileQualityControl qc = catalogBamFile.getQualityControl(); + // Sanity check + if (qc == null) { + qc = new FileQualityControl(); + } + qc.getAlignmentQualityControl().setHsMetrics(hsMetrics); + + catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), + QueryOptions.empty(), getToken()); + + }); + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index d782fb842be..46b26e47013 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -31,7 +31,6 @@ import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis; import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureLocalAnalysisExecutor; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; @@ -57,20 +56,15 @@ public class SampleQcAnalysis extends OpenCgaToolScopeStudy { public static final String ID = "sample-qc"; - public static final String DESCRIPTION = "Run quality control (QC) for a given sample. It includes variant stats, FastQC," + - "samtools/flagstat, picard/CollectHsMetrics and gene coverage stats; and for somatic samples, mutational signature"; + public static final String DESCRIPTION = "Run quality control (QC) for a given sample. It includes variant stats and gene coverage" + + " stats; and for somatic samples, mutational signature"; public static final String VARIANT_STATS_STEP = "variant-stats"; - public static final String FASTQC_STEP = "fastqc"; - public static final String HS_METRICS_STEP = "hs-metrics"; - public static final String FLAG_STATS_STEP = "flag-stats"; public static final String GENE_COVERAGE_STEP = "gene-coverage-stats"; public static final String MUTATIONAL_SIGNATUR_STEP = "mutational-signature"; private String studyId; private String sampleId; - private String dictFile; - private String baitFile; private String variantStatsId; private String variantStatsDecription; private Query variantStatsQuery; @@ -81,10 +75,8 @@ public class SampleQcAnalysis extends OpenCgaToolScopeStudy { private Sample sample; private File catalogBamFile; private SampleVariantQualityControlMetrics variantQcMetrics; - //private SampleAlignmentQualityControlMetrics alignmentQcMetrics; private Job variantStatsJob = null; private Job signatureJob = null; - private Job fastQcJob = null; @Override protected void check() throws Exception { @@ -124,8 +116,7 @@ protected void check() throws Exception { @Override protected List getSteps() { - return Arrays.asList(VARIANT_STATS_STEP, FASTQC_STEP, FLAG_STATS_STEP, HS_METRICS_STEP, GENE_COVERAGE_STEP, - MUTATIONAL_SIGNATUR_STEP); + return Arrays.asList(VARIANT_STATS_STEP, GENE_COVERAGE_STEP, MUTATIONAL_SIGNATUR_STEP); } @Override @@ -143,9 +134,6 @@ protected void run() throws ToolException { } else if (dependsOnJob.getId().startsWith(MutationalSignatureAnalysis.ID)) { signatureJob = catalogManager.getJobManager().get(studyId, dependsOnJob.getId(), QueryOptions.empty(), token) .first(); - } else if (dependsOnJob.getId().startsWith(FastqcWrapperAnalysis.ID)) { - fastQcJob = catalogManager.getJobManager().get(studyId, dependsOnJob.getId(), QueryOptions.empty(), token) - .first(); } } } @@ -163,8 +151,6 @@ protected void run() throws ToolException { executor.setStudyId(studyId) .setSample(sample) .setCatalogBamFile(catalogBamFile) - .setDictFile(dictFile) - .setBaitFile(baitFile) .setVariantStatsId(variantStatsId) .setVariantStatsDecription(variantStatsDecription) .setVariantStatsQuery(variantStatsQuery) @@ -176,9 +162,6 @@ protected void run() throws ToolException { // Step by step step(VARIANT_STATS_STEP, () -> runVariantStats()); -// step(FASTQC_STEP, () -> runFastQc());//executor.setQcType(SampleQcAnalysisExecutor.QcType.FASTQC).execute()); - step(FLAG_STATS_STEP, () -> executor.setQcType(SampleQcAnalysisExecutor.QcType.FLAG_STATS).execute()); - step(HS_METRICS_STEP, () -> executor.setQcType(SampleQcAnalysisExecutor.QcType.HS_METRICS).execute()); step(GENE_COVERAGE_STEP, () -> executor.setQcType(SampleQcAnalysisExecutor.QcType.GENE_COVERAGE_STATS).execute()); step(MUTATIONAL_SIGNATUR_STEP, () -> runSignature()); @@ -390,24 +373,6 @@ public SampleQcAnalysis setSampleId(String sampleId) { return this; } - public String getDictFile() { - return dictFile; - } - - public SampleQcAnalysis setDictFile(String dictFile) { - this.dictFile = dictFile; - return this; - } - - public String getBaitFile() { - return baitFile; - } - - public SampleQcAnalysis setBaitFile(String baitFile) { - this.baitFile = baitFile; - return this; - } - public String getVariantStatsId() { return variantStatsId; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java index 1d1cfd99ce7..b4f6d241d93 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java @@ -25,7 +25,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.AnalysisUtils; import org.opencb.opencga.analysis.StorageToolExecutor; -import org.opencb.opencga.analysis.wrappers.executors.PicardWrapperAnalysisExecutor; +import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysisExecutor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.exceptions.ToolException; @@ -58,16 +58,6 @@ public void run() throws ToolException { switch (qcType) { - case FLAG_STATS: { - runFlagStats(); - break; - } - - case HS_METRICS: { - runHsMetrics(); - break; - } - case GENE_COVERAGE_STATS: { runGeneCoverageStats(); break; @@ -79,136 +69,6 @@ public void run() throws ToolException { } } - private void runFlagStats() throws ToolException { -// if (alignmentQcMetrics.getSamtoolsFlagstats() != null) { -// // Samtools flag stats already exists! -// addWarning("Skipping samtools/flagstat analysis: it was already computed"); -// return; -// } -// -// // Check BAM file -// if (catalogBamFile == null) { -// addWarning("Skipping samtools/flagstat analysis: no BAM file was provided"); -// return; -// } -// -// ObjectMap params = new ObjectMap(); -// -// Path outDir = getOutDir().resolve("flagstat"); -// Path scratchDir = outDir.resolve("scratch"); -// scratchDir.toFile().mkdirs(); -// -// SamtoolsWrapperAnalysisExecutor executor = new SamtoolsWrapperAnalysisExecutor(getStudyId(), params, outDir, scratchDir, -// catalogManager, getToken()); -// -// executor.setCommand("flagstat"); -// executor.setBamFile(catalogBamFile.getId()); -// executor.run(); -// -// // Check for result -// SamtoolsFlagstats flagtats = executor.getFlagstatsResult(); -// if (flagtats != null) { -// alignmentQcMetrics.setSamtoolsFlagstats(flagtats); -// } - } - - private void runHsMetrics() throws ToolException { - addWarning("Skipping picard/CollectHsMetrics analysis: not yet implemented"); - - if (alignmentQcMetrics.getHsMetrics() != null) { - // Hs metrics already exists! - addWarning("Skipping picard/CollectHsMetrics analysis: it was already computed"); - return; - } - - // Check BAM file - if (catalogBamFile == null) { - addWarning("Skipping picard/CollectHsMetrics analysis: no BAM file was provided and no BAM file found for sample " + sample.getId()); - return; - } - - // Check bait file - if (StringUtils.isEmpty(getBaitFile())) { - addWarning("Skipping picard/CollectHsMetrics analysis: no bait file was provided"); - return; - } - File bedBaitFile; - try { - bedBaitFile = AnalysisUtils.getCatalogFile(getBaitFile(), getStudyId(), catalogManager.getFileManager(), getToken()); - } catch (CatalogException e) { - throw new ToolException(e); - } - - // Check dictionary file - if (StringUtils.isEmpty(getDictFile())) { - addWarning("Skipping picard/CollectHsMetrics analysis: no dictionary file was provided"); - return; - } - File dictFile; - try { - dictFile = AnalysisUtils.getCatalogFile(getDictFile(), getStudyId(), catalogManager.getFileManager(), getToken()); - } catch (CatalogException e) { - throw new ToolException(e); - } - - // Run picard/BedToIntervalList, to convert BED file to INTERVAL - String intervalFilename = bedBaitFile.getName() + ".interval"; - ObjectMap params = new ObjectMap() - .append("I", bedBaitFile.getId()) - .append("SD", dictFile.getId()) - .append("O", intervalFilename); - - - Path picardDir = getOutDir().resolve("picard"); - Path picardScratchDir = picardDir.resolve("scratch"); - picardScratchDir.toFile().mkdirs(); - - PicardWrapperAnalysisExecutor picardExecutor = new PicardWrapperAnalysisExecutor(getStudyId(), params, picardDir, picardScratchDir, - catalogManager, getToken()); - - picardExecutor.setCommand("BedToIntervalList"); - picardExecutor.run(); - - if (!picardDir.resolve(intervalFilename).toFile().exists()) { - throw new ToolException("Error converting BED file '" + getBaitFile() + "' to interval format using Picard" - + " command: " + picardExecutor.getCommand()); - } - - // Link interval file to catalog, we need to do it to execute CollectHsMetrics - File intervalFile; - try { - intervalFile = catalogManager.getFileManager().link(getStudyId(), picardDir.resolve(intervalFilename).toUri(), - "BedToIntervalList." + RandomStringUtils.randomAlphabetic(6), new ObjectMap("parents", true), getToken()).first(); - - } catch (CatalogException e) { - throw new ToolException(e); - } - - // Run picard/CollectHsMetrics - String hsMetricsFilename = "hsmetrics.txt"; - params = new ObjectMap() - .append("I", catalogBamFile.getId()) - .append("BI", intervalFile.getId()) - .append("TI", intervalFile.getId()) - .append("O", hsMetricsFilename); - picardExecutor = new PicardWrapperAnalysisExecutor(getStudyId(), params, picardDir, picardScratchDir, catalogManager, getToken()); - - picardExecutor.setCommand("CollectHsMetrics"); - picardExecutor.run(); - - if (!picardDir.resolve(hsMetricsFilename).toFile().exists()) { - throw new ToolException("Error running Picard command: " + picardExecutor.getCommand()); - } - - try { - // Parse Hs metrics and update sample quality control - HsMetrics hsMetrics = HsMetricsParser.parse(picardDir.resolve(hsMetricsFilename).toFile()); - alignmentQcMetrics.setHsMetrics(hsMetrics); - } catch (IOException e) { - throw new ToolException(e); - } - } - private void runGeneCoverageStats() throws ToolException { // Check BAM file if (catalogBamFile == null) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DockerWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DockerWrapperAnalysisExecutor.java deleted file mode 100644 index 83ac9286b65..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DockerWrapperAnalysisExecutor.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.opencb.opencga.analysis.wrappers; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.tools.OpenCgaToolExecutor; - -import java.io.File; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - -import static org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis.INDEX_STATS_PARAM; - -public abstract class DockerWrapperAnalysisExecutor extends OpenCgaToolExecutor { - - public final static String DOCKER_INPUT_PATH = "/data/input"; - public final static String DOCKER_OUTPUT_PATH = "/data/output"; - - public static final String STDOUT_FILENAME = "stdout.txt"; - public static final String STDERR_FILENAME = "stderr.txt"; - - protected boolean isValidParameter(String param) { - switch (param) { - case "opencgaHome": - case "token": - case "storageEngineId": - case "dbName": - case "executorId": - return false; - } - return true; - } - - protected Map getDockerMountMap(List inputFilenames) { - Map dockerMountMap = new HashMap<>(); - - // Mount input dirs - if (CollectionUtils.isNotEmpty(inputFilenames)) { - // Pair: key = name of the parameter; value = full path to the file - for (String inputFilename : inputFilenames) { - if (StringUtils.isNotEmpty(inputFilename)) { - File file = new File(inputFilename); - String src = file.getParentFile().getAbsolutePath(); - if (!dockerMountMap.containsKey(src)) { - dockerMountMap.put(src, DOCKER_INPUT_PATH + dockerMountMap.size()); - } - } - } - } - - return dockerMountMap; - } - - protected StringBuilder initDockerCommandLine(Map dockerMountingMap, String dockerImageName, - String dockerImageVersion) { - StringBuilder sb = new StringBuilder("docker run --log-driver=none -a stdin -a stdout -a stderr "); - - // Mount input dir - for (Map.Entry entry : dockerMountingMap.entrySet()) { - sb.append("--mount type=bind,source=\"").append(entry.getKey()).append("\",target=\"").append(entry.getValue()).append("\" "); - } - - // Mount output dir - sb.append("--mount type=bind,source=\"").append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH) - .append("\" "); - - - sb.append(dockerImageName); - if (StringUtils.isNotEmpty(dockerImageVersion)) { - sb.append(":").append(dockerImageVersion); - } - - return sb; - } -} \ No newline at end of file diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..06101feb1d5 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java @@ -0,0 +1,211 @@ +package org.opencb.opencga.analysis.wrappers.executors; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.opencb.commons.exec.Command; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.tools.OpenCgaToolExecutor; + +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public abstract class DockerWrapperAnalysisExecutor extends OpenCgaToolExecutor { + + public final static String DOCKER_INPUT_PATH = "/data/input"; + public final static String DOCKER_OUTPUT_PATH = "/data/output"; + + public static final String STDOUT_FILENAME = "stdout.txt"; + public static final String STDERR_FILENAME = "stderr.txt"; + + public abstract String getDockerImageName(); + public abstract String getDockerImageVersion(); + + public String getShortPrefix() { + return "-"; + } + + public String getLongPrefix() { + return "--"; + } + + public String getKeyValueSeparator() { + return " "; + } + + + protected boolean skipParameter(String param) { + switch (param) { + case "opencgaHome": + case "token": + case "storageEngineId": + case "dbName": + case "executorId": + return true; + } + return false; + } + + @Deprecated + protected Map getDockerMountMap(List inputFilenames) { + Map dockerMountMap = new HashMap<>(); + + // Mount input dirs + if (CollectionUtils.isNotEmpty(inputFilenames)) { + // Pair: key = name of the parameter; value = full path to the file + for (String inputFilename : inputFilenames) { + if (StringUtils.isNotEmpty(inputFilename)) { + File file = new File(inputFilename); + String src = file.getParentFile().getAbsolutePath(); + if (!dockerMountMap.containsKey(src)) { + dockerMountMap.put(src, DOCKER_INPUT_PATH + dockerMountMap.size()); + } + } + } + } + + return dockerMountMap; + } + + @Deprecated + protected StringBuilder initDockerCommandLine(Map dockerMountingMap, String dockerImageName, + String dockerImageVersion) { + StringBuilder sb = new StringBuilder("docker run --log-driver=none -a stdin -a stdout -a stderr "); + + // Mount input dir + for (Map.Entry entry : dockerMountingMap.entrySet()) { + sb.append("--mount type=bind,source=\"").append(entry.getKey()).append("\",target=\"").append(entry.getValue()).append("\" "); + } + + // Mount output dir + sb.append("--mount type=bind,source=\"").append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH) + .append("\" "); + + + sb.append(dockerImageName); + if (StringUtils.isNotEmpty(dockerImageVersion)) { + sb.append(":").append(dockerImageVersion); + } + + return sb; + } + + protected StringBuilder initCommandLine() { + return new StringBuilder("docker run --log-driver=none -a stdin -a stdout -a stderr "); + } + + protected Map appendMounts(List> inputFilenames, StringBuilder sb) { + Map mountMap = new HashMap<>(); + + // Mount input dirs + for (Pair pair : inputFilenames) { + File file = new File(pair.getValue()); + if (!mountMap.containsKey(file.getParent())) { + // Update source target map + mountMap.put(file.getParent(), DOCKER_INPUT_PATH + mountMap.size()); + + // Update command line + sb.append("--mount type=bind,source=\"").append(file.getParent()).append("\",target=\"") + .append(mountMap.get(file.getParent())).append("\" "); + } + } + + // Mount output dir + sb.append("--mount type=bind,source=\"").append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH) + .append("\" "); + + return mountMap; + } + + protected void appendCommand(String command, StringBuilder sb) { + // Docker image and version + sb.append(getDockerImageName()); + if (StringUtils.isNotEmpty(getDockerImageVersion())) { + sb.append(":").append(getDockerImageVersion()); + } + + // Append command + sb.append(" ").append(command); +// sb.append(" java -jar /usr/picard/picard.jar ").append(command); + } + + protected void appendInputFiles(List> inputFilenames, Map srcTargetMap, StringBuilder sb) { + for (Pair pair : inputFilenames) { + sb.append(" "); + if (StringUtils.isNotEmpty(pair.getKey())) { + if (pair.getKey().length() <= 1) { + sb.append(getShortPrefix()); + } else { + sb.append(getLongPrefix()); + } + sb.append(pair.getKey()).append(getKeyValueSeparator()); + } + File file = new File(pair.getValue()); + sb.append(srcTargetMap.get(file.getParent())).append("/").append(file.getName()); + } + } + + protected void appendOutputFiles(List> outputFilenames, StringBuilder sb) { + for (Pair pair : outputFilenames) { + sb.append(" "); + if (StringUtils.isNotEmpty(pair.getKey())) { + if (pair.getKey().length() <= 1) { + sb.append(getShortPrefix()); + } else { + sb.append(getLongPrefix()); + } + sb.append(pair.getKey()).append(getKeyValueSeparator()); + } + sb.append(DOCKER_OUTPUT_PATH); + // Sometimes, no output filename is provided + if (StringUtils.isNotEmpty(pair.getValue())) { + sb.append("/").append(pair.getValue()); + } + } + } + + protected void appendOtherParams(Set skipParams, StringBuilder sb) { + for (String paramName : getExecutorParams().keySet()) { + if (skipParameter(paramName)) { + continue; + } + + if (skipParams.contains(paramName)) { + continue; + } + sb.append(" "); + if (StringUtils.isNotEmpty(paramName)) { + if (paramName.length() <= 1) { + sb.append(getShortPrefix()); + } else { + sb.append(getLongPrefix()); + } + sb.append(paramName).append(getKeyValueSeparator()); + } + String value = getExecutorParams().getString(paramName); + if (StringUtils.isNotEmpty(value) && !"true".equals(value)) { + sb.append(getExecutorParams().getString(paramName)); + } + } + } + + protected void runCommandLine(String cmdline) throws ToolException { + try { + System.out.println("Docker command line:\n" + cmdline); + new Command(cmdline) + .setOutputOutputStream( + new DataOutputStream(new FileOutputStream(getOutDir().resolve(getId() + "." + STDOUT_FILENAME).toFile()))) + .setErrorOutputStream( + new DataOutputStream(new FileOutputStream(getOutDir().resolve(getId() + "." + STDERR_FILENAME).toFile()))) + .run(); + } catch (FileNotFoundException e) { + throw new ToolException(e); + } + } +} \ No newline at end of file diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/PicardWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/PicardWrapperAnalysisExecutor.java deleted file mode 100644 index 03fd30800fa..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/PicardWrapperAnalysisExecutor.java +++ /dev/null @@ -1,234 +0,0 @@ -package org.opencb.opencga.analysis.wrappers.executors; - -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.analysis.wrappers.PicardWrapperAnalysis; -import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.core.exceptions.ToolException; - -import java.io.FileNotFoundException; -import java.nio.file.Path; - -public class PicardWrapperAnalysisExecutor extends OpenCgaWrapperAnalysisExecutor { - - private String command; - - public PicardWrapperAnalysisExecutor(String studyId, ObjectMap params, Path outDir, Path scratchDir, CatalogManager catalogManager, - String token) { -// super(studyId, params, outDir, scratchDir, catalogManager, token); - this.sep = "="; - this.shortPrefix = ""; - this.longPrefix = ""; - } - - @Override - public void run() throws ToolException { - try { - switch (command) { - case "CollectHsMetrics": - runCollectHsMetrics(); - break; - case "CollectWgsMetrics": - runCollectWgsMetrics(); - break; - case "BedToIntervalList": - runBedToIntervalList(); - break; - default: - throw new ToolException("Picard tool name '" + command + "' is not available. Supported tools: CollectHsMetrics," - + " CollectWgsMetrics, BedToIntervalList"); - } - } catch (FileNotFoundException e) { - throw new ToolException(e); - } - } - -// @Override -// protected String getId() { -// return PicardWrapperAnalysis.ID; -// } - - @Override - protected String getDockerImageName() { - return PicardWrapperAnalysis.PICARD_DOCKER_IMAGE; - } - - private void runBedToIntervalList() throws ToolException { -// String bedFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("INPUT"))) { -// bedFilename = params.getString("INPUT"); -// } else if (StringUtils.isNotEmpty(params.getString("I"))) { -// bedFilename = params.getString("I"); -// } -// -// String outFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("OUTPUT"))) { -// outFilename = params.getString("OUTPUT"); -// } else if (StringUtils.isNotEmpty(params.getString("O"))) { -// outFilename = params.getString("O"); -// } -// -// String dictFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("SEQUENCE_DICTIONARY"))) { -// dictFilename = params.getString("SEQUENCE_DICTIONARY"); -// } else if (StringUtils.isNotEmpty(params.getString("SD"))) { -// dictFilename = params.getString("SD"); -// } -// -// StringBuilder sb = initCommandLine(); -// -// // Append mounts -// List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", bedFilename), -// new ImmutablePair<>("SD", dictFilename))); -// Map srcTargetMap = new HashMap<>(); -// appendMounts(inputFilenames, srcTargetMap, sb); -// -// // Append docker image, version and command -// appendCommand("java -jar /usr/picard/picard.jar " + command, sb); -// -// // Append input file params -// appendInputFiles(inputFilenames, srcTargetMap, sb); -// -// // Append output file params -// List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", outFilename))); -// appendOutputFiles(outputFilenames, sb); -// -// // Append other params -// Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "SEQUENCE_DICTIONARY","SD")); -// appendOtherParams(skipParams, sb); -// -// // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt -// runCommandLine(sb.toString()); - } - - private void runCollectWgsMetrics() throws ToolException, FileNotFoundException { -// String bamFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("INPUT"))) { -// bamFilename = params.getString("INPUT"); -// } else if (StringUtils.isNotEmpty(params.getString("I"))) { -// bamFilename = params.getString("I"); -// } -// -// String outFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("OUTPUT"))) { -// outFilename = params.getString("OUTPUT"); -// } else if (StringUtils.isNotEmpty(params.getString("O"))) { -// outFilename = params.getString("O"); -// } -// -// String refFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("REFERENCE_SEQUENCE"))) { -// refFilename = params.getString("REFERENCE_SEQUENCE"); -// } else if (StringUtils.isNotEmpty(params.getString("R"))) { -// refFilename = params.getString("R"); -// } -// -// StringBuilder sb = initCommandLine(); -// -// // Append mounts -// List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", bamFilename), -// new ImmutablePair<>("R", refFilename))); -// Map srcTargetMap = new HashMap<>(); -// appendMounts(inputFilenames, srcTargetMap, sb); -// -// // Append docker image, version and command -// appendCommand("java -jar /usr/picard/picard.jar " + command, sb); -// -// // Append input file params -// appendInputFiles(inputFilenames, srcTargetMap, sb); -// -// // Append output file params -// List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", outFilename))); -// appendOutputFiles(outputFilenames, sb); -// -// // Append other params -// Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "REFERENCE_SEQUENCE","R")); -// appendOtherParams(skipParams, sb); -// -// // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt -// runCommandLine(sb.toString()); - } - - private void runCollectHsMetrics() throws ToolException, FileNotFoundException { -// List> inputFilenames = new ArrayList<>(); -// -// String bamFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("INPUT"))) { -// bamFilename = params.getString("INPUT"); -// } else if (StringUtils.isNotEmpty(params.getString("I"))) { -// bamFilename = params.getString("I"); -// } -// if (StringUtils.isNotEmpty(bamFilename)) { -// inputFilenames.add(new ImmutablePair<>("I", bamFilename)); -// } -// -// String outFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("OUTPUT"))) { -// outFilename = params.getString("OUTPUT"); -// } else if (StringUtils.isNotEmpty(params.getString("O"))) { -// outFilename = params.getString("O"); -// } -// -// String refFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("REFERENCE_SEQUENCE"))) { -// refFilename = params.getString("REFERENCE_SEQUENCE"); -// } else if (StringUtils.isNotEmpty(params.getString("R"))) { -// refFilename = params.getString("R"); -// } -// if (StringUtils.isNotEmpty(refFilename)) { -// inputFilenames.add(new ImmutablePair<>("R", refFilename)); -// } -// -// String baitFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("BAIT_INTERVALS"))) { -// baitFilename = params.getString("BAIT_INTERVALS"); -// } else if (StringUtils.isNotEmpty(params.getString("BI"))) { -// baitFilename = params.getString("BI"); -// } -// if (StringUtils.isNotEmpty(baitFilename)) { -// inputFilenames.add(new ImmutablePair<>("BI", baitFilename)); -// } -// -// String targetFilename = ""; -// if (StringUtils.isNotEmpty(params.getString("TARGET_INTERVALS"))) { -// targetFilename = params.getString("TARGET_INTERVALS"); -// } else if (StringUtils.isNotEmpty(params.getString("TI"))) { -// targetFilename = params.getString("TI"); -// } -// if (StringUtils.isNotEmpty(targetFilename)) { -// inputFilenames.add(new ImmutablePair<>("TI", targetFilename)); -// } -// -// StringBuilder sb = initCommandLine(); -// -// // Append mounts -// Map srcTargetMap = new HashMap<>(); -// appendMounts(inputFilenames, srcTargetMap, sb); -// -// // Append docker image, version and command -// appendCommand("java -jar /usr/picard/picard.jar " + command, sb); -// -// // Append input file params -// appendInputFiles(inputFilenames, srcTargetMap, sb); -// -// // Append output file params -// List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", outFilename))); -// appendOutputFiles(outputFilenames, sb); -// -// // Append other params -// Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "BAIT_INTERVALS", "BI", "TARGET_INTERVALS", "TI", -// "REFERENCE_SEQUENCE","R")); -// appendOtherParams(skipParams, sb); -// -// // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt -// runCommandLine(sb.toString()); - } - - public String getCommand() { - return command; - } - - public PicardWrapperAnalysisExecutor setCommand(String command) { - this.command = command; - return this; - } -} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java index 91eb66ca44e..5ad31b09175 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java @@ -2,7 +2,7 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.commons.exec.Command; -import org.opencb.opencga.analysis.wrappers.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.tools.annotations.ToolExecutor; import org.slf4j.Logger; @@ -23,13 +23,21 @@ public class FastqcWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor public final static String ID = FastqcWrapperAnalysis.ID + "-local"; - public final static String DOCKER_IMAGE_NAME = "dceoy/fastqc"; - private String study; private String inputFile; private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Override + public String getDockerImageName() { + return "dceoy/fastqc"; + } + + @Override + public String getDockerImageVersion() { + return ""; + } + @Override protected void run() throws Exception { @@ -57,7 +65,7 @@ public String getCommandLine() throws ToolException { Map srcTargetMap = getDockerMountMap(inputFiles); - StringBuilder sb = initDockerCommandLine(srcTargetMap, DOCKER_IMAGE_NAME, ""); + StringBuilder sb = initDockerCommandLine(srcTargetMap, getDockerImageName(), getDockerImageVersion()); // Input file parameter File file; @@ -66,7 +74,7 @@ public String getCommandLine() throws ToolException { // Fastqc options for (String param : getExecutorParams().keySet()) { - if (isValidParameter(param)) { + if (skipParameter(param)) { String sep = param.length() == 1 ? " -" : " --"; String value = getExecutorParams().getString(param); if (StringUtils.isEmpty(value)) { @@ -97,8 +105,8 @@ public String getCommandLine() throws ToolException { } @Override - protected boolean isValidParameter(String param) { - if (!super.isValidParameter(param)) { + protected boolean skipParameter(String param) { + if (!super.skipParameter(param)) { return false; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PicardWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java similarity index 80% rename from opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PicardWrapperAnalysis.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java index cfdacd3ed10..fbb5ae8f96a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PicardWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package org.opencb.opencga.analysis.wrappers; +package org.opencb.opencga.analysis.wrappers.picard; import org.apache.commons.lang3.StringUtils; -import org.opencb.opencga.analysis.wrappers.executors.PicardWrapperAnalysisExecutor; +import org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.tools.annotations.Tool; @@ -30,8 +30,6 @@ public class PicardWrapperAnalysis extends OpenCgaWrapperAnalysis { public final static String DESCRIPTION = "Picard is a set of command line tools (in Java) for manipulating high-throughput sequencing" + " (HTS) data and formats such as SAM/BAM/CRAM and VCF."; - public final static String PICARD_DOCKER_IMAGE = "broadinstitute/picard"; - private String command; protected void check() throws Exception { @@ -55,14 +53,15 @@ protected void check() throws Exception { @Override protected void run() throws Exception { - step(() -> { - PicardWrapperAnalysisExecutor executor = new PicardWrapperAnalysisExecutor(getStudy(), params, getOutDir(), - getScratchDir(), catalogManager, token); - - executor.setCommand(command); - executor.run(); - } - ); + throw new ToolException("Not yet implemented!!"); +// step(() -> { +// PicardWrapperAnalysisExecutor executor = new PicardWrapperAnalysisExecutor(getStudy(), params, getOutDir(), +// getScratchDir(), catalogManager, token); +// +// executor.setCommand(command); +// executor.run(); +// } +// ); } // @Override diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..9f741cfd242 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java @@ -0,0 +1,246 @@ +package org.opencb.opencga.analysis.wrappers.picard; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +@ToolExecutor(id = PicardWrapperAnalysisExecutor.ID, + tool = PicardWrapperAnalysis.ID, + source = ToolExecutor.Source.STORAGE, + framework = ToolExecutor.Framework.LOCAL) +public class PicardWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor { + + public final static String ID = PicardWrapperAnalysis.ID + "-local"; + + private String study; + private String command; + private String bamFile; + private String bedFile; + private String baitIntervalsFile; + private String targetIntervalsFile; + private String dictFile; + private String refSeqFile; + private String outFile; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public String getDockerImageName() { + return "broadinstitute/picard"; + } + + @Override + public String getDockerImageVersion() { + return ""; + } + + @Override + public String getShortPrefix() { + return ""; + } + + @Override + public String getLongPrefix() { + return ""; + } + + @Override + public String getKeyValueSeparator() { + return "="; + } + + @Override + public void run() throws ToolException { + switch (command) { + case "CollectHsMetrics": + runCollectHsMetrics(); + break; + case "CollectWgsMetrics": + runCollectWgsMetrics(); + break; + case "BedToIntervalList": + runBedToIntervalList(); + break; + default: + throw new ToolException("Picard tool name '" + command + "' is not supported yet."); + } + } + + private void runBedToIntervalList() throws ToolException { + StringBuilder sb = initCommandLine(); + + // Append mounts + List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", getBamFile()), + new ImmutablePair<>("SD", getDictFile()))); + + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand("java -jar /usr/picard/picard.jar " + command, sb); + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append output file params + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", getOutFile()))); + appendOutputFiles(outputFilenames, sb); + + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "SEQUENCE_DICTIONARY","SD")); + appendOtherParams(skipParams, sb); + + // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + runCommandLine(sb.toString()); + } + + private void runCollectWgsMetrics() throws ToolException { + StringBuilder sb = initCommandLine(); + + // Append mounts + List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", getBamFile()), + new ImmutablePair<>("R", getRefSeqFile()))); + + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand("java -jar /usr/picard/picard.jar " + command, sb); + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append output file params + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", getOutFile()))); + appendOutputFiles(outputFilenames, sb); + + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "REFERENCE_SEQUENCE","R")); + appendOtherParams(skipParams, sb); + + // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + runCommandLine(sb.toString()); + } + + private void runCollectHsMetrics() throws ToolException { + // Prepare input files + List> inputFilenames = new ArrayList<>(Arrays.asList( + new ImmutablePair<>("I", getBamFile()), + new ImmutablePair<>("R", getRefSeqFile()), + new ImmutablePair<>("BI", getBaitIntervalsFile()), + new ImmutablePair<>("TI", getTargetIntervalsFile()) + )); + + // Prepare output files + List> outputFilenames = new ArrayList<>(Arrays.asList( + new ImmutablePair<>("O", getOutFile()) + )); + + StringBuilder sb = initCommandLine(); + + // Append mounts + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand("java -jar /usr/picard/picard.jar " + command, sb); + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append output file params + appendOutputFiles(outputFilenames, sb); + + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "BAIT_INTERVALS", "BI", "TARGET_INTERVALS", "TI", + "REFERENCE_SEQUENCE","R")); + appendOtherParams(skipParams, sb); + + // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + runCommandLine(sb.toString()); + } + + public String getStudy() { + return study; + } + + public PicardWrapperAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } + + public String getCommand() { + return command; + } + + public PicardWrapperAnalysisExecutor setCommand(String command) { + this.command = command; + return this; + } + + public String getBamFile() { + return bamFile; + } + + public PicardWrapperAnalysisExecutor setBamFile(String bamFile) { + this.bamFile = bamFile; + return this; + } + + public String getBedFile() { + return bedFile; + } + + public PicardWrapperAnalysisExecutor setBedFile(String bedFile) { + this.bedFile = bedFile; + return this; + } + + public String getBaitIntervalsFile() { + return baitIntervalsFile; + } + + public PicardWrapperAnalysisExecutor setBaitIntervalsFile(String baitIntervalsFile) { + this.baitIntervalsFile = baitIntervalsFile; + return this; + } + + public String getTargetIntervalsFile() { + return targetIntervalsFile; + } + + public PicardWrapperAnalysisExecutor setTargetIntervalsFile(String targetIntervalsFile) { + this.targetIntervalsFile = targetIntervalsFile; + return this; + } + + public String getDictFile() { + return dictFile; + } + + public PicardWrapperAnalysisExecutor setDictFile(String dictFile) { + this.dictFile = dictFile; + return this; + } + + public String getRefSeqFile() { + return refSeqFile; + } + + public PicardWrapperAnalysisExecutor setRefSeqFile(String refSeqFile) { + this.refSeqFile = refSeqFile; + return this; + } + + public String getOutFile() { + return outFile; + } + + public PicardWrapperAnalysisExecutor setOutFile(String outFile) { + this.outFile = outFile; + return this; + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java index c978aa7bffb..5739a30b67c 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java @@ -3,7 +3,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.exec.Command; -import org.opencb.opencga.analysis.wrappers.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; import org.opencb.opencga.core.common.GitRepositoryState; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.tools.annotations.ToolExecutor; @@ -29,9 +29,6 @@ public class SamtoolsWrapperAnalysisExecutor extends DockerWrapperAnalysisExecut public final static String ID = SamtoolsWrapperAnalysis.ID + "-local"; - public final static String DOCKER_IMAGE_NAME = "opencb/opencga-samtools"; - public final static String DOCKER_IMAGE_VERSION = GitRepositoryState.get().getBuildVersion(); - private String study; private String command; private String inputFile; @@ -48,6 +45,16 @@ public class SamtoolsWrapperAnalysisExecutor extends DockerWrapperAnalysisExecut private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Override + public String getDockerImageName() { + return "opencb/opencga-samtools"; + } + + @Override + public String getDockerImageVersion() { + return GitRepositoryState.get().getBuildVersion(); + } + @Override protected void run() throws Exception { outputFilename = getOutputFilename(); @@ -202,7 +209,7 @@ public String getCommandLine() throws ToolException { Map srcTargetMap = getDockerMountMap(inputFiles); - StringBuilder sb = initDockerCommandLine(srcTargetMap, DOCKER_IMAGE_NAME, DOCKER_IMAGE_VERSION); + StringBuilder sb = initDockerCommandLine(srcTargetMap, getDockerImageName(), getDockerImageVersion()); // Samtools command if ("plot-bamstats".equals(getCommand())) { @@ -213,7 +220,7 @@ public String getCommandLine() throws ToolException { // Samtools options for (String param : getExecutorParams().keySet()) { - if (isValidParameter(param)) { + if (skipParameter(param)) { String sep = param.length() == 1 ? " -" : " --"; String value = getExecutorParams().getString(param); if (StringUtils.isEmpty(value)) { @@ -347,8 +354,8 @@ public String getCommandLine() throws ToolException { } @Override - protected boolean isValidParameter(String param) { - if (!super.isValidParameter(param)) { + protected boolean skipParameter(String param) { + if (!super.skipParameter(param)) { return false; } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java index 60f88666090..4dfb932e211 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java @@ -181,6 +181,7 @@ public InternalCliOptionsParser() { alignmentSubCommands.addCommand("stats-run", alignmentCommandOptions.statsAlignmentCommandOptions); alignmentSubCommands.addCommand("flagstats-run", alignmentCommandOptions.flagStatsAlignmentCommandOptions); alignmentSubCommands.addCommand("fastqcmetrics-run", alignmentCommandOptions.fastQcMetricsAlignmentCommandOptions); + alignmentSubCommands.addCommand("hsmetrics-run", alignmentCommandOptions.hsMetricsAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-run", alignmentCommandOptions.coverageAlignmentCommandOptions); // alignmentSubCommands.addCommand("annotate", alignmentCommandOptions.annotateVariantCommandOptions); alignmentSubCommands.addCommand(BWA_RUN_COMMAND, alignmentCommandOptions.bwaCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 8983cd46ab0..fde739d816e 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -20,15 +20,18 @@ import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; import org.opencb.opencga.analysis.alignment.qc.AlignmentFastQcMetricsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentFlagStatsAnalysis; +import org.opencb.opencga.analysis.alignment.qc.AlignmentHsMetricsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.alignment.AlignmentFastQcMetricsParams; import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; +import org.opencb.opencga.core.models.alignment.AlignmentHsMetricsParams; import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; import java.nio.file.Paths; @@ -78,6 +81,9 @@ public void execute() throws Exception { case "fastqcmetrics-run": fastQcMetricsRun(); break; + case "hsmetrics-run": + hsMetricsRun(); + break; case "coverage-run": coverageRun(); break; @@ -178,6 +184,20 @@ private void fastQcMetricsRun() throws ToolException { toolRunner.execute(AlignmentFastQcMetricsAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } + private void hsMetricsRun() throws ToolException { + AlignmentCommandOptions.HsMetricsAlignmentCommandOptions cliOptions = alignmentCommandOptions.hsMetricsAlignmentCommandOptions; + + ObjectMap params = new AlignmentHsMetricsParams( + cliOptions.bamFile, + cliOptions.bedFile, + cliOptions.dictFile, + cliOptions.outdir + ).toObjectMap(cliOptions.commonOptions.params) + .append(ParamConstants.STUDY_PARAM, cliOptions.study); + + toolRunner.execute(AlignmentHsMetricsAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); + } + private void coverageRun() throws ToolException { AlignmentCommandOptions.CoverageAlignmentCommandOptions cliOptions = alignmentCommandOptions.coverageAlignmentCommandOptions; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index dbb5ffb0033..932a861b305 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -873,8 +873,6 @@ private void sampleQc() throws Exception { variantCommandOptions.internalJobOptions.jobId, token); sampleQcAnalysis.setStudyId(cliOptions.study) .setSampleId(cliOptions.sample) - .setDictFile(cliOptions.dictFile) - .setBaitFile(cliOptions.baitFile) .setVariantStatsId(cliOptions.variantStatsId) .setVariantStatsDecription(cliOptions.variantStatsDecription) .setVariantStatsQuery(variantStatsQuery) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index 099be19138d..d412783f151 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -19,6 +19,7 @@ import com.beust.jcommander.*; import org.opencb.opencga.analysis.wrappers.*; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.internal.InternalCliOptionsParser; @@ -39,6 +40,7 @@ public class AlignmentCommandOptions { public StatsAlignmentCommandOptions statsAlignmentCommandOptions; public FlagStatsAlignmentCommandOptions flagStatsAlignmentCommandOptions; public FastQcMetricsAlignmentCommandOptions fastQcMetricsAlignmentCommandOptions; + public HsMetricsAlignmentCommandOptions hsMetricsAlignmentCommandOptions; public CoverageAlignmentCommandOptions coverageAlignmentCommandOptions; public CoverageQueryAlignmentCommandOptions coverageQueryAlignmentCommandOptions; public CoverageRatioAlignmentCommandOptions coverageRatioAlignmentCommandOptions; @@ -72,6 +74,7 @@ public AlignmentCommandOptions(GeneralCliOptions.CommonCommandOptions analysisCo this.statsAlignmentCommandOptions = new StatsAlignmentCommandOptions(); this.flagStatsAlignmentCommandOptions = new FlagStatsAlignmentCommandOptions(); this.fastQcMetricsAlignmentCommandOptions = new FastQcMetricsAlignmentCommandOptions(); + this.hsMetricsAlignmentCommandOptions = new HsMetricsAlignmentCommandOptions(); this.coverageAlignmentCommandOptions = new CoverageAlignmentCommandOptions(); this.coverageQueryAlignmentCommandOptions = new CoverageQueryAlignmentCommandOptions(); this.coverageRatioAlignmentCommandOptions = new CoverageRatioAlignmentCommandOptions(); @@ -236,6 +239,31 @@ public class FastQcMetricsAlignmentCommandOptions extends GeneralCliOptions.Stud public String outdir; } + @Parameters(commandNames = {"hsmetrics-run"}, commandDescription = ALIGNMENT_HS_METRICS_DESCRIPTION) + public class HsMetricsAlignmentCommandOptions extends GeneralCliOptions.StudyOption { + + @ParametersDelegate + public GeneralCliOptions.CommonCommandOptions commonOptions = analysisCommonOptions; + + @ParametersDelegate + public Object jobOptions = commonJobOptionsObject; + + @ParametersDelegate + public Object internalJobOptions = internalJobOptionsObject; + + @Parameter(names = {"--bam-file"}, description = FILE_ID_DESCRIPTION + " (BAM file)", required = true, arity = 1) + public String bamFile; + + @Parameter(names = {"--bed-file"}, description = FILE_ID_DESCRIPTION + " (BED file with the interest regions)", required = true, arity = 1) + public String bedFile; + + @Parameter(names = {"--dict-file"}, description = FILE_ID_DESCRIPTION + " (dictionary file)", required = true, arity = 1) + public String dictFile; + + @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) + public String outdir; + } + @Parameters(commandNames = {"coverage-run"}, commandDescription = ALIGNMENT_COVERAGE_DESCRIPTION) public class CoverageAlignmentCommandOptions extends GeneralCliOptions.StudyOption { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index f2e0710278c..bb361a9e610 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1371,12 +1371,6 @@ public class SampleQcCommandOptions { @Parameter(names = {"--sample"}, description = "Sample ID.", required = true) public String sample; - @Parameter(names = {"--dict-file"}, description = "Dictionary file of the reference genome (for computing HS metrics).") - public String dictFile; - - @Parameter(names = {"--bait-file"}, description = "Bait intervals file in BED format (for HS metrics).") - public String baitFile; - @Parameter(names = {"--variant-stats-id"}, description = "Variant stats ID.") public String variantStatsId; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index d99f4cd52b0..6b5ab15f300 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -257,6 +257,7 @@ public OpencgaCliOptionsParser() { alignmentSubCommands.addCommand("stats-run", alignmentCommandOptions.statsAlignmentCommandOptions); alignmentSubCommands.addCommand("flagstats-run", alignmentCommandOptions.flagStatsAlignmentCommandOptions); alignmentSubCommands.addCommand("fastqcmetrics-run", alignmentCommandOptions.fastQcMetricsAlignmentCommandOptions); + alignmentSubCommands.addCommand("hsmetrics-run", alignmentCommandOptions.hsMetricsAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-index-run", alignmentCommandOptions.coverageAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-query", alignmentCommandOptions.coverageQueryAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage-ratio", alignmentCommandOptions.coverageRatioAlignmentCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index e6f4aab48f5..446cf4d461c 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -24,7 +24,6 @@ import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import org.ga4gh.models.ReadAlignment; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; import org.opencb.biodata.models.alignment.GeneCoverageStats; import org.opencb.biodata.models.alignment.RegionCoverage; import org.opencb.biodata.tools.alignment.converters.SAMRecordToAvroReadAlignmentBiConverter; @@ -36,7 +35,6 @@ import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.core.models.alignment.*; import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.core.models.variant.KnockoutAnalysisParams; import org.opencb.opencga.core.response.RestResponse; import org.opencb.opencga.server.grpc.AlignmentServiceGrpc; import org.opencb.opencga.server.grpc.GenericAlignmentServiceModel; @@ -90,6 +88,9 @@ public void execute() throws Exception { case "fastqcmetrics-run": queryResponse = fastQcMetricsRun(); break; + case "hsmetrics-run": + queryResponse = hsMetricsRun(); + break; case "coverage-index-run": queryResponse = coverageRun(); break; @@ -363,6 +364,17 @@ private RestResponse fastQcMetricsRun() throws ClientException { params); } + private RestResponse hsMetricsRun() throws ClientException { + AlignmentCommandOptions.HsMetricsAlignmentCommandOptions cliOptions = alignmentCommandOptions + .hsMetricsAlignmentCommandOptions; + + ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); + params.putAll(getJobParams()); + + return openCGAClient.getAlignmentClient().runHsmetrics(new AlignmentHsMetricsParams(cliOptions.bamFile, cliOptions.bedFile, + cliOptions.dictFile, cliOptions.outdir), params); + } + //------------------------------------------------------------------------- // COVERAGE: index/run, info, query and stats //------------------------------------------------------------------------- diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 456a3d9b741..90781861d01 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -428,8 +428,6 @@ private RestResponse sampleQc() throws ClientException { return openCGAClient.getVariantClient().runSampleQc( new SampleQcAnalysisParams( variantCommandOptions.sampleQcCommandOptions.sample, - variantCommandOptions.sampleQcCommandOptions.dictFile, - variantCommandOptions.sampleQcCommandOptions.baitFile, variantCommandOptions.sampleQcCommandOptions.variantStatsId, variantCommandOptions.sampleQcCommandOptions.variantStatsDecription, variantStatsQuery, diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java index 04c33d540d4..f02cec98e95 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java index a43a12d1cb4..fe6d3d74aef 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java @@ -25,6 +25,7 @@ import org.opencb.opencga.client.rest.AbstractParentClient; import org.opencb.opencga.core.models.alignment.AlignmentFastQcMetricsParams; import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; +import org.opencb.opencga.core.models.alignment.AlignmentHsMetricsParams; import org.opencb.opencga.core.models.alignment.AlignmentIndexParams; import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; import org.opencb.opencga.core.models.alignment.BwaWrapperParams; @@ -41,7 +42,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -231,6 +232,24 @@ public RestResponse runFlagstats(AlignmentFlagStatsParams data, ObjectMap p return execute("analysis", null, "alignment/flagstats", null, "run", params, POST, Job.class); } + /** + * Compute hybrid-selection (HS) metrics (based on Picard tool) for a given alignment file. + * @param data Alignment hybrid-selection (HS) metrics params. + * @param params Map containing any of the following optional parameters. + * study: study. + * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. + * jobDependsOn: Comma separated list of existing job IDs the job will depend on. + * jobDescription: Job description. + * jobTags: Job tags. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse runHsmetrics(AlignmentHsMetricsParams data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("analysis", null, "alignment/hsmetrics", null, "run", params, POST, Job.class); + } + /** * Index alignment file. * @param data Alignment index params. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java index 2d81ea12a63..0452a560956 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java @@ -46,7 +46,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java index 1f2e89b5a3e..b40faf39dfe 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java index 9f74f211d89..1422a13c677 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java @@ -31,7 +31,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java index ca9b812e278..19cc7361435 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java index 1eb25385d89..6a45e7f97ef 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java index 48592ee9d39..e87bee3923a 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java @@ -27,7 +27,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java index e03116e64fc..c890e4b8e26 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java index d76b5dd0cc0..8cd03b25a4d 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java index 0fe533698d9..db06c519ec6 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java @@ -28,7 +28,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java index cceb323de95..1bf07a1a711 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java @@ -32,7 +32,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java index 844c68e50d9..de8d08b5375 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java index 3995c0e9069..7ea2ba4d0e7 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java index 0fc83927142..f098944f050 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java @@ -37,7 +37,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 4ee0b73656a..292adec7a5f 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -59,7 +59,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -767,8 +767,8 @@ public RestResponse runSampleEligibility(SampleEligibilityAnalysisParams da } /** - * Run quality control (QC) for a given sample. It includes variant stats, FastQC,samtools/flagstat, picard/CollectHsMetrics and gene - * coverage stats; and for somatic samples, mutational signature. + * Run quality control (QC) for a given sample. It includes variant stats and gene coverage stats; and for somatic samples, mutational + * signature. * @param data Sample QC analysis params. * @param params Map containing any of the following optional parameters. * study: Study [[user@]project:]study where study and project can be either the ID or UUID. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java index 00893608688..80217b362e5 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-21 10:39:05 +* Autogenerated on: 2021-04-22 11:08:50 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index feaccff34c8..d50a97723ab 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -340,6 +340,7 @@ public class ParamConstants { public static final String ALIGNMENT_STATS_DESCRIPTION = "Compute stats (based on samtools/stats command) for a given alignment file"; public static final String ALIGNMENT_FLAG_STATS_DESCRIPTION = "Compute flag stats (based on samtools/flagstat command) for a given alignment file"; public static final String ALIGNMENT_FASTQC_METRICS_DESCRIPTION = "Compute sequence stats (based on FastQC tool) for a given alignment file"; + public static final String ALIGNMENT_HS_METRICS_DESCRIPTION = "Compute hybrid-selection (HS) metrics (based on Picard tool) for a given alignment file"; // --------------------------------------------- // alignment query diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentHsMetricsParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentHsMetricsParams.java new file mode 100644 index 00000000000..9955ea81dd9 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentHsMetricsParams.java @@ -0,0 +1,70 @@ +package org.opencb.opencga.core.models.alignment; + +import org.opencb.opencga.core.tools.ToolParams; + +public class AlignmentHsMetricsParams extends ToolParams { + public static final String DESCRIPTION = "Alignment hybrid-selection (HS) metrics params"; + + private String bamFile; + private String bedFile; +// private String refSeqFile; + private String dictFile; + private String outdir; + + public AlignmentHsMetricsParams() { + } + + public AlignmentHsMetricsParams(String bamFile, String bedFile, String dictFile, String outdir) { + this.bamFile = bamFile; + this.bedFile = bedFile; + this.dictFile = dictFile; + this.outdir = outdir; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("AlignmentHsMetricsParams{"); + sb.append("bamFile='").append(bamFile).append('\''); + sb.append(", bedFile='").append(bedFile).append('\''); + sb.append(", dictFile='").append(dictFile).append('\''); + sb.append(", outdir='").append(outdir).append('\''); + sb.append('}'); + return sb.toString(); + } + + public String getBamFile() { + return bamFile; + } + + public AlignmentHsMetricsParams setBamFile(String bamFile) { + this.bamFile = bamFile; + return this; + } + + public String getBedFile() { + return bedFile; + } + + public AlignmentHsMetricsParams setBedFile(String bedFile) { + this.bedFile = bedFile; + return this; + } + + public String getDictFile() { + return dictFile; + } + + public AlignmentHsMetricsParams setDictFile(String dictFile) { + this.dictFile = dictFile; + return this; + } + + public String getOutdir() { + return outdir; + } + + public AlignmentHsMetricsParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java index a689f97e397..de8405af733 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java @@ -23,8 +23,6 @@ public class SampleQcAnalysisParams extends ToolParams { public static final String DESCRIPTION = "Sample QC analysis params"; private String sample; - private String dictFile; - private String baitFile; private String variantStatsId; private String variantStatsDescription; private AnnotationVariantQueryParams variantStatsQuery; @@ -37,12 +35,10 @@ public class SampleQcAnalysisParams extends ToolParams { public SampleQcAnalysisParams() { } - public SampleQcAnalysisParams(String sample, String dictFile, String baitFile, String variantStatsId, String variantStatsDescription, + public SampleQcAnalysisParams(String sample, String variantStatsId, String variantStatsDescription, AnnotationVariantQueryParams variantStatsQuery, String signatureId, SampleQcSignatureQueryParams signatureQuery, List genesForCoverageStats, String outdir) { this.sample = sample; - this.dictFile = dictFile; - this.baitFile = baitFile; this.variantStatsId = variantStatsId; this.variantStatsDescription = variantStatsDescription; this.variantStatsQuery = variantStatsQuery; @@ -56,8 +52,6 @@ public SampleQcAnalysisParams(String sample, String dictFile, String baitFile, S public String toString() { final StringBuilder sb = new StringBuilder("SampleQcAnalysisParams{"); sb.append("sample='").append(sample).append('\''); - sb.append(", dictFile='").append(dictFile).append('\''); - sb.append(", baitFile='").append(baitFile).append('\''); sb.append(", variantStatsId='").append(variantStatsId).append('\''); sb.append(", variantStatsDecription='").append(variantStatsDescription).append('\''); sb.append(", variantStatsQuery=").append(variantStatsQuery); @@ -78,24 +72,6 @@ public SampleQcAnalysisParams setSample(String sample) { return this; } - public String getDictFile() { - return dictFile; - } - - public SampleQcAnalysisParams setDictFile(String dictFile) { - this.dictFile = dictFile; - return this; - } - - public String getBaitFile() { - return baitFile; - } - - public SampleQcAnalysisParams setBaitFile(String baitFile) { - this.baitFile = baitFile; - return this; - } - public String getVariantStatsId() { return variantStatsId; } diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index cd0bc76608e..dacdcfe3c7b 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -61,6 +61,7 @@ import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.DBIterator; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index 23cdfe8d970..987fd6f4053 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -32,9 +32,11 @@ import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; import org.opencb.opencga.analysis.alignment.qc.AlignmentFastQcMetricsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentFlagStatsAnalysis; +import org.opencb.opencga.analysis.alignment.qc.AlignmentHsMetricsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; @@ -417,6 +419,20 @@ public Response fastQcMetricsRun( @ApiParam(value = AlignmentFastQcMetricsParams.DESCRIPTION, required = true) AlignmentFastQcMetricsParams params) { return submitJob(AlignmentFastQcMetricsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } + + @POST + @Path("/hsmetrics/run") + @ApiOperation(value = ALIGNMENT_HS_METRICS_DESCRIPTION, response = Job.class) + public Response hsMetricsRun( + @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, + @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, + @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, + @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, + @ApiParam(value = AlignmentHsMetricsParams.DESCRIPTION, required = true) AlignmentHsMetricsParams params) { + return submitJob(AlignmentHsMetricsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + } + //------------------------------------------------------------------------- // W R A P P E R S //------------------------------------------------------------------------- From 8806c5a740e6f32befeb44d346e9e21cbe34fff6 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 22 Apr 2021 11:42:00 +0200 Subject: [PATCH 206/412] analysis: implement new gene summary method, #1693 --- .../opencga/analysis/rga/RgaManager.java | 163 +++++++++++++++++- .../opencga/analysis/rga/RgaManagerTest.java | 36 +++- .../analysis/knockout/IndividualStats.java | 79 +++++++++ .../knockout/KnockoutByGeneSummary.java | 129 ++++++++++++++ .../knockout/KnockoutByIndividualSummary.java | 69 +------- .../analysis/knockout/VariantStats.java | 79 +++++++++ 6 files changed, 483 insertions(+), 72 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualStats.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGeneSummary.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantStats.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 3c40d81e59a..94af464a0f0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -135,7 +135,7 @@ public OpenCGAResult individualQuery(String studyStr, Quer ); Future rgaIteratorFuture = executor.submit(() -> rgaEngine.individualQuery(collection, preprocess.getQuery(), - preprocess.getQueryOptions())); + QueryOptions.empty())); VariantDBIterator variantDBIterator; try { @@ -673,6 +673,154 @@ public OpenCGAResult individualSummary(String study return result; } + public OpenCGAResult geneSummary(String studyStr, Query query, QueryOptions options, String token) + throws CatalogException, IOException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String userId = catalogManager.getUserManager().getUserId(token); + String collection = getCollectionName(study.getFqn()); + + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + catalogManager.getAuthorizationManager().checkCanViewStudy(study.getUid(), userId); + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + QueryOptions queryOptions = setDefaultLimit(options); + + Query auxQuery = query != null ? new Query(query) : new Query(); + + ExecutorService executor = Executors.newFixedThreadPool(4); + + // Get numTotalResults in a future + Future numTotalResults = null; + if (queryOptions.getBoolean(QueryOptions.COUNT)) { + numTotalResults = executor.submit(() -> { + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.GENE_ID + ")"); + try { + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + return ((Number) result.first().getAggregationValues().get(0)).intValue(); + } catch (Exception e) { + e.printStackTrace(); + } + return -1; + }); + } + + List geneIds = auxQuery.getAsStringList(RgaDataModel.GENE_ID); + auxQuery.remove(RgaDataModel.GENE_ID); + // If the user is querying by gene id, we don't need to do a facet first + if (geneIds.isEmpty()) { + // 1st. we perform a facet to get the different gene ids matching the user query and using the skip and limit values + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.GENE_ID); + facetOptions.putIfNotNull(QueryOptions.LIMIT, queryOptions.get(QueryOptions.LIMIT)); + facetOptions.putIfNotNull(QueryOptions.SKIP, queryOptions.get(QueryOptions.SKIP)); + + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + if (result.getNumResults() == 0) { + stopWatch.stop(); + return OpenCGAResult.empty(KnockoutByGeneSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + } + geneIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + } + + List> geneSummaryFutureList = new ArrayList<>(geneIds.size()); + for (String geneId : geneIds) { + geneSummaryFutureList.add(executor.submit(() -> calculateGeneSummary(collection, auxQuery, geneId))); + } + + List knockoutByGeneSummaryList = new ArrayList<>(geneIds.size()); + try { + for (Future summaryFuture : geneSummaryFutureList) { + knockoutByGeneSummaryList.add(summaryFuture.get()); + } + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), + knockoutByGeneSummaryList.size(), knockoutByGeneSummaryList, -1); + + if (queryOptions.getBoolean(QueryOptions.COUNT)) { + try { + assert numTotalResults != null; + result.setNumMatches(numTotalResults.get()); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + } + + return result; + } + + private KnockoutByGeneSummary calculateGeneSummary(String collection, Query query, String geneId) throws RgaException, IOException { + Query auxQuery = new Query(query); + auxQuery.put(RgaQueryParams.GENE_ID.key(), geneId); + + // 1. Get KnockoutByGene information + Query individualQuery = new Query(RgaQueryParams.GENE_ID.key(), geneId); + QueryOptions options = new QueryOptions() + .append(QueryOptions.LIMIT, 1) + .append(QueryOptions.EXCLUDE, "individuals"); + RgaIterator rgaIterator = rgaEngine.geneQuery(collection, individualQuery, options); + + if (!rgaIterator.hasNext()) { + throw new RgaException("Unexpected error. Gene '" + geneId + "' not found"); + } + RgaDataModel rgaDataModel = rgaIterator.next(); + KnockoutByGeneSummary geneSummary = new KnockoutByGeneSummary(rgaDataModel.getGeneId(), rgaDataModel.getGeneName(), + rgaDataModel.getChromosome(), rgaDataModel.getStart(), rgaDataModel.getEnd(), rgaDataModel.getStrand(), + rgaDataModel.getGeneBiotype(), null, null); + + // 2. Get KnockoutType counts + QueryOptions knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.FULL_VARIANT_INFO); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); + KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); + for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { + knockoutTypeCount.processVariant(variantBucket.getValue()); + } + VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumVariants(),knockoutTypeCount.getNumHomVariants(), + knockoutTypeCount.getNumCompHetVariants(), knockoutTypeCount.getNumHetVariants(), + knockoutTypeCount.getNumDelOverlapVariants()); + geneSummary.setVariantStats(variantStats); + + // 3. Get individual knockout type counts + QueryOptions geneFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_ID + ">>" + RgaDataModel.KNOCKOUT_TYPES); + facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); + IndividualStats individualStats = new IndividualStats(facetFieldDataResult.first().getBuckets().size(), 0, 0, 0, 0); + for (FacetField.Bucket individualBucket : facetFieldDataResult.first().getBuckets()) { + for (FacetField.Bucket knockoutTypeBucket : individualBucket.getFacetFields().get(0).getBuckets()) { + KnockoutVariant.KnockoutType knockoutType = KnockoutVariant.KnockoutType.valueOf(knockoutTypeBucket.getValue()); + switch (knockoutType) { + case HOM_ALT: + individualStats.setNumHomAlt(individualStats.getNumHomAlt() + 1); + break; + case COMP_HET: + individualStats.setNumCompHet(individualStats.getNumCompHet() + 1); + break; + case HET_ALT: + individualStats.setNumHetAlt(individualStats.getNumHetAlt() + 1); + break; + case DELETION_OVERLAP: + individualStats.setNumDelOverlap(individualStats.getNumDelOverlap() + 1); + break; + default: + throw new IllegalStateException("Unexpected value: " + knockoutType); + } + } + } + geneSummary.setIndividualStats(individualStats); + + return geneSummary; + } + private KnockoutByIndividualSummary calculateIndividualSummary(String collection, Query query, String sampleId) throws RgaException, IOException { Query auxQuery = new Query(query); @@ -702,11 +850,10 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { knockoutTypeCount.processVariant(variantBucket.getValue()); } - knockoutByIndividualSummary.setNumVariants(knockoutTypeCount.getNumVariants()); - knockoutByIndividualSummary.setNumCompHet(knockoutTypeCount.getNumCompHetVariants()); - knockoutByIndividualSummary.setNumHomAlt(knockoutTypeCount.getNumHomVariants()); - knockoutByIndividualSummary.setNumHetAlt(knockoutTypeCount.getNumHetVariants()); - knockoutByIndividualSummary.setNumDelOverlap(knockoutTypeCount.getNumDelOverlapVariants()); + VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumVariants(),knockoutTypeCount.getNumHomVariants(), + knockoutTypeCount.getNumCompHetVariants(), knockoutTypeCount.getNumHetVariants(), + knockoutTypeCount.getNumDelOverlapVariants()); + knockoutByIndividualSummary.setVariantStats(variantStats); // 3. Get gene id list QueryOptions geneFacet = new QueryOptions() @@ -722,7 +869,7 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection return knockoutByIndividualSummary; } - private class KnockoutTypeCount { + private static class KnockoutTypeCount { private Set knockoutTypeQuery; private Set popFreqQuery; @@ -736,7 +883,7 @@ private class KnockoutTypeCount { private Set delOverlapVariantIds; public KnockoutTypeCount(Query query) { - // TODO: Add manual filters (predicates) + // TODO: Process query object knockoutTypeQuery = new HashSet<>(); popFreqQuery = new HashSet<>(); typeQuery = new HashSet<>(); diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index dcd9de14227..65303c5aa5f 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -19,10 +19,7 @@ import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; -import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; -import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; +import org.opencb.opencga.core.models.analysis.knockout.*; import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.file.File; @@ -230,6 +227,20 @@ public void testIndividualQueryLimit() throws CatalogException, IOException, Rga assertEquals(4, sampleIds.size()); } + @Test + public void testIndividualSummary() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.individualSummary(STUDY, new Query(), QueryOptions.empty(), ownerToken); + assertEquals(4, result.getNumResults()); + for (KnockoutByIndividualSummary individual : result.getResults()) { + assertNotNull(individual.getId()); + assertNotNull(individual.getVariantStats()); + assertTrue(individual.getGenes().size() > 0); + assertTrue(individual.getVariantStats().getCount() > 0); + assertTrue(individual.getVariantStats().getNumCompHet() > 0 || individual.getVariantStats().getNumDelOverlap() > 0 + || individual.getVariantStats().getNumHetAlt() > 0 || individual.getVariantStats().getNumHomAlt() > 0); + } + } + @Test public void testGeneQueryPermissions() throws CatalogException, IOException, RgaException { OpenCGAResult result = rgaManager.geneQuery(STUDY, new Query(), QueryOptions.empty(), ownerToken); @@ -330,6 +341,23 @@ public void testGeneQueryLimit() throws CatalogException, IOException, RgaExcept assertEquals(60, geneIds.size()); } + @Test + public void testGeneSummary() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.geneSummary(STUDY, new Query(), QueryOptions.empty(), ownerToken); + assertEquals(10, result.getNumResults()); + for (KnockoutByGeneSummary gene : result.getResults()) { + assertNotNull(gene.getId()); + assertNotNull(gene.getVariantStats()); + assertTrue(gene.getVariantStats().getCount() > 0); + assertTrue(gene.getVariantStats().getNumCompHet() > 0 || gene.getVariantStats().getNumDelOverlap() > 0 + || gene.getVariantStats().getNumHetAlt() > 0 || gene.getVariantStats().getNumHomAlt() > 0); + assertNotNull(gene.getIndividualStats()); + assertTrue(gene.getIndividualStats().getCount() > 0); + assertTrue(gene.getIndividualStats().getNumCompHet() > 0 || gene.getIndividualStats().getNumDelOverlap() > 0 + || gene.getIndividualStats().getNumHetAlt() > 0 || gene.getIndividualStats().getNumHomAlt() > 0); + } + } + @Test public void testVariantQueryPermissions() throws CatalogException, IOException, RgaException { OpenCGAResult result = rgaManager.variantQuery(STUDY, new Query(), QueryOptions.empty(), ownerToken); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualStats.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualStats.java new file mode 100644 index 00000000000..2e651381943 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualStats.java @@ -0,0 +1,79 @@ +package org.opencb.opencga.core.models.analysis.knockout; + +public class IndividualStats { + + private int count; + private int numHomAlt; + private int numCompHet; + private int numHetAlt; + private int numDelOverlap; + + public IndividualStats() { + } + + public IndividualStats(int count, int numHomAlt, int numCompHet, int numHetAlt, int numDelOverlap) { + this.count = count; + this.numHomAlt = numHomAlt; + this.numCompHet = numCompHet; + this.numHetAlt = numHetAlt; + this.numDelOverlap = numDelOverlap; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("IndividualStats{"); + sb.append("count=").append(count); + sb.append(", numHomAlt=").append(numHomAlt); + sb.append(", numCompHet=").append(numCompHet); + sb.append(", numHetAlt=").append(numHetAlt); + sb.append(", numDelOverlap=").append(numDelOverlap); + sb.append('}'); + return sb.toString(); + } + + public int getCount() { + return count; + } + + public IndividualStats setCount(int count) { + this.count = count; + return this; + } + + public int getNumHomAlt() { + return numHomAlt; + } + + public IndividualStats setNumHomAlt(int numHomAlt) { + this.numHomAlt = numHomAlt; + return this; + } + + public int getNumCompHet() { + return numCompHet; + } + + public IndividualStats setNumCompHet(int numCompHet) { + this.numCompHet = numCompHet; + return this; + } + + public int getNumHetAlt() { + return numHetAlt; + } + + public IndividualStats setNumHetAlt(int numHetAlt) { + this.numHetAlt = numHetAlt; + return this; + } + + public int getNumDelOverlap() { + return numDelOverlap; + } + + public IndividualStats setNumDelOverlap(int numDelOverlap) { + this.numDelOverlap = numDelOverlap; + return this; + } + +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGeneSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGeneSummary.java new file mode 100644 index 00000000000..24ff321c390 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGeneSummary.java @@ -0,0 +1,129 @@ +package org.opencb.opencga.core.models.analysis.knockout; + +public class KnockoutByGeneSummary { + + private String id; + private String name; + private String chromosome; + private int start; + private int end; + private String strand; + private String biotype; + + private IndividualStats individualStats; + private VariantStats variantStats; + + public KnockoutByGeneSummary() { + } + + public KnockoutByGeneSummary(String id, String name, String chromosome, int start, int end, String strand, String biotype, + IndividualStats individualStats, VariantStats variantStats) { + this.id = id; + this.name = name; + this.chromosome = chromosome; + this.start = start; + this.end = end; + this.strand = strand; + this.biotype = biotype; + this.individualStats = individualStats; + this.variantStats = variantStats; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("KnockoutByGeneSummary{"); + sb.append("id='").append(id).append('\''); + sb.append(", name='").append(name).append('\''); + sb.append(", chromosome='").append(chromosome).append('\''); + sb.append(", start=").append(start); + sb.append(", end=").append(end); + sb.append(", strand='").append(strand).append('\''); + sb.append(", biotype='").append(biotype).append('\''); + sb.append(", individualStats=").append(individualStats); + sb.append(", variantStats=").append(variantStats); + sb.append('}'); + return sb.toString(); + } + + public String getId() { + return id; + } + + public KnockoutByGeneSummary setId(String id) { + this.id = id; + return this; + } + + public String getName() { + return name; + } + + public KnockoutByGeneSummary setName(String name) { + this.name = name; + return this; + } + + public String getChromosome() { + return chromosome; + } + + public KnockoutByGeneSummary setChromosome(String chromosome) { + this.chromosome = chromosome; + return this; + } + + public int getStart() { + return start; + } + + public KnockoutByGeneSummary setStart(int start) { + this.start = start; + return this; + } + + public int getEnd() { + return end; + } + + public KnockoutByGeneSummary setEnd(int end) { + this.end = end; + return this; + } + + public String getStrand() { + return strand; + } + + public KnockoutByGeneSummary setStrand(String strand) { + this.strand = strand; + return this; + } + + public String getBiotype() { + return biotype; + } + + public KnockoutByGeneSummary setBiotype(String biotype) { + this.biotype = biotype; + return this; + } + + public IndividualStats getIndividualStats() { + return individualStats; + } + + public KnockoutByGeneSummary setIndividualStats(IndividualStats individualStats) { + this.individualStats = individualStats; + return this; + } + + public VariantStats getVariantStats() { + return variantStats; + } + + public KnockoutByGeneSummary setVariantStats(VariantStats variantStats) { + this.variantStats = variantStats; + return this; + } + +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java index c3cf68b707a..64ba15936f6 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java @@ -5,9 +5,7 @@ import org.opencb.biodata.models.pedigree.IndividualProperty; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; public class KnockoutByIndividualSummary { @@ -22,11 +20,7 @@ public class KnockoutByIndividualSummary { private List disorders; private List genes; - private int numVariants; - private int numHomAlt; - private int numCompHet; - private int numHetAlt; - private int numDelOverlap; + private VariantStats variantStats; public KnockoutByIndividualSummary() { } @@ -35,13 +29,12 @@ public KnockoutByIndividualSummary(KnockoutByIndividual knockoutByIndividual) { this(knockoutByIndividual.getId(), knockoutByIndividual.getSampleId(), knockoutByIndividual.getMotherId(), knockoutByIndividual.getMotherSampleId(), knockoutByIndividual.getFatherId(), knockoutByIndividual.getFatherSampleId(), knockoutByIndividual.getSex(), knockoutByIndividual.getPhenotypes(), knockoutByIndividual.getDisorders(), - Collections.emptyList(), 0, 0, 0, 0, 0); + Collections.emptyList(), null); } public KnockoutByIndividualSummary(String id, String sampleId, String motherId, String motherSampleId, String fatherId, String fatherSampleId, IndividualProperty.Sex sex, List phenotypes, - List disorders, List genes, int numVariants, int numHomAlt, int numCompHet, - int numHetAlt, int numDelOverlap) { + List disorders, List genes, VariantStats variantStats) { this.id = id; this.sampleId = sampleId; this.motherId = motherId; @@ -52,11 +45,7 @@ public KnockoutByIndividualSummary(String id, String sampleId, String motherId, this.phenotypes = phenotypes; this.disorders = disorders; this.genes = genes; - this.numVariants = numVariants; - this.numHomAlt = numHomAlt; - this.numCompHet = numCompHet; - this.numHetAlt = numHetAlt; - this.numDelOverlap = numDelOverlap; + this.variantStats = variantStats; } @Override @@ -72,11 +61,7 @@ public String toString() { sb.append(", phenotypes=").append(phenotypes); sb.append(", disorders=").append(disorders); sb.append(", genes=").append(genes); - sb.append(", numVariants=").append(numVariants); - sb.append(", numHomAlt=").append(numHomAlt); - sb.append(", numCompHet=").append(numCompHet); - sb.append(", numHetAlt=").append(numHetAlt); - sb.append(", numDelOverlap=").append(numDelOverlap); + sb.append(", variantStats=").append(variantStats); sb.append('}'); return sb.toString(); } @@ -171,48 +156,12 @@ public KnockoutByIndividualSummary setGenes(List genes) { return this; } - public int getNumVariants() { - return numVariants; + public VariantStats getVariantStats() { + return variantStats; } - public KnockoutByIndividualSummary setNumVariants(int numVariants) { - this.numVariants = numVariants; - return this; - } - - public int getNumHomAlt() { - return numHomAlt; - } - - public KnockoutByIndividualSummary setNumHomAlt(int numHomAlt) { - this.numHomAlt = numHomAlt; - return this; - } - - public int getNumCompHet() { - return numCompHet; - } - - public KnockoutByIndividualSummary setNumCompHet(int numCompHet) { - this.numCompHet = numCompHet; - return this; - } - - public int getNumHetAlt() { - return numHetAlt; - } - - public KnockoutByIndividualSummary setNumHetAlt(int numHetAlt) { - this.numHetAlt = numHetAlt; - return this; - } - - public int getNumDelOverlap() { - return numDelOverlap; - } - - public KnockoutByIndividualSummary setNumDelOverlap(int numDelOverlap) { - this.numDelOverlap = numDelOverlap; + public KnockoutByIndividualSummary setVariantStats(VariantStats variantStats) { + this.variantStats = variantStats; return this; } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantStats.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantStats.java new file mode 100644 index 00000000000..4ceaaa1994f --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantStats.java @@ -0,0 +1,79 @@ +package org.opencb.opencga.core.models.analysis.knockout; + +public class VariantStats { + + private int count; + private int numHomAlt; + private int numCompHet; + private int numHetAlt; + private int numDelOverlap; + + public VariantStats() { + } + + public VariantStats(int count, int numHomAlt, int numCompHet, int numHetAlt, int numDelOverlap) { + this.count = count; + this.numHomAlt = numHomAlt; + this.numCompHet = numCompHet; + this.numHetAlt = numHetAlt; + this.numDelOverlap = numDelOverlap; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("VariantStats{"); + sb.append("count=").append(count); + sb.append(", numHomAlt=").append(numHomAlt); + sb.append(", numCompHet=").append(numCompHet); + sb.append(", numHetAlt=").append(numHetAlt); + sb.append(", numDelOverlap=").append(numDelOverlap); + sb.append('}'); + return sb.toString(); + } + + public int getCount() { + return count; + } + + public VariantStats setCount(int count) { + this.count = count; + return this; + } + + public int getNumHomAlt() { + return numHomAlt; + } + + public VariantStats setNumHomAlt(int numHomAlt) { + this.numHomAlt = numHomAlt; + return this; + } + + public int getNumCompHet() { + return numCompHet; + } + + public VariantStats setNumCompHet(int numCompHet) { + this.numCompHet = numCompHet; + return this; + } + + public int getNumHetAlt() { + return numHetAlt; + } + + public VariantStats setNumHetAlt(int numHetAlt) { + this.numHetAlt = numHetAlt; + return this; + } + + public int getNumDelOverlap() { + return numDelOverlap; + } + + public VariantStats setNumDelOverlap(int numDelOverlap) { + this.numDelOverlap = numDelOverlap; + return this; + } + +} From 3e22bc5f40d778ae958512fa3d71c782c3d090eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 22 Apr 2021 14:35:05 +0200 Subject: [PATCH 207/412] analysis: improve FastQC wrapper analysis executor, #1739 --- .../DockerWrapperAnalysisExecutor.java | 1 - .../fastqc/FastqcWrapperAnalysisExecutor.java | 105 ++++-------------- 2 files changed, 21 insertions(+), 85 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java index 06101feb1d5..b41d181ebf9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java @@ -197,7 +197,6 @@ protected void appendOtherParams(Set skipParams, StringBuilder sb) { protected void runCommandLine(String cmdline) throws ToolException { try { - System.out.println("Docker command line:\n" + cmdline); new Command(cmdline) .setOutputOutputStream( new DataOutputStream(new FileOutputStream(getOutDir().resolve(getId() + "." + STDOUT_FILENAME).toFile()))) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java index 5ad31b09175..573927f0b14 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java @@ -1,19 +1,13 @@ package org.opencb.opencga.analysis.wrappers.fastqc; -import org.apache.commons.lang3.StringUtils; -import org.opencb.commons.exec.Command; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; -import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.tools.annotations.ToolExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; @ToolExecutor(id = FastqcWrapperAnalysisExecutor.ID, tool = FastqcWrapperAnalysis.ID, @@ -40,86 +34,30 @@ public String getDockerImageVersion() { @Override protected void run() throws Exception { + StringBuilder sb = initCommandLine(); - String commandLine = getCommandLine(); + // Append mounts + List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", getInputFile()))); - logger.info("Fastqc command line: " + commandLine); - try { - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - Command cmd = new Command(commandLine) - .setOutputOutputStream( - new DataOutputStream(new FileOutputStream(getOutDir().resolve(STDOUT_FILENAME).toFile()))) - .setErrorOutputStream( - new DataOutputStream(new FileOutputStream(getOutDir().resolve(STDERR_FILENAME).toFile()))); + Map mountMap = appendMounts(inputFilenames, sb); - cmd.run(); + // Append docker image, version and command + appendCommand("", sb); - } catch (Exception e) { - throw new ToolException(e); - } - } + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); - public String getCommandLine() throws ToolException { - - List inputFiles = Arrays.asList(getInputFile()); - - Map srcTargetMap = getDockerMountMap(inputFiles); - - StringBuilder sb = initDockerCommandLine(srcTargetMap, getDockerImageName(), getDockerImageVersion()); - - // Input file parameter - File file; - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - - // Fastqc options - for (String param : getExecutorParams().keySet()) { - if (skipParameter(param)) { - String sep = param.length() == 1 ? " -" : " --"; - String value = getExecutorParams().getString(param); - if (StringUtils.isEmpty(value)) { - sb.append(sep).append(param); - } else { - switch (value.toLowerCase()) { - case "false": - // Nothing to do - break; - case "null": - case "true": - // Only param must be appended - sb.append(sep).append(param); - break; - default: - // Otherwise, param + value must be appended - sb.append(sep).append(param).append(" ").append(value); - break; - } - } - } - } - - // Output dir - sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/"); - - return sb.toString(); - } + // Append output file params + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("o", ""))); + appendOutputFiles(outputFilenames, sb); - @Override - protected boolean skipParameter(String param) { - if (!super.skipParameter(param)) { - return false; - } - - switch (param) { - case "dir": - case "d": - case "outdir": - case "o": { - return false; - } - } - - return true; + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("o", "outdir", "d", "dir")); + appendOtherParams(skipParams, sb); + + // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); } public String getStudy() { @@ -139,5 +77,4 @@ public FastqcWrapperAnalysisExecutor setInputFile(String inputFile) { this.inputFile = inputFile; return this; } - } From 1e1619bd2659e06364339d8f6ea92c9a42d7ecf7 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 22 Apr 2021 16:09:46 +0200 Subject: [PATCH 208/412] analysis: consider user queries when calculating summary stats, #1693 --- .../analysis/rga/IndividualRgaConverter.java | 73 +++++++++++++++++-- .../opencga/analysis/rga/RgaDataModel.java | 6 +- .../opencga/analysis/rga/RgaManager.java | 33 +++++++-- .../opencga/analysis/rga/RgaQueryParser.java | 19 ++--- .../opencb/opencga/analysis/rga/RgaUtils.java | 19 ++--- .../opencga/analysis/rga/RgaManagerTest.java | 61 ++++++++++++++++ .../src/main/resources/rga/managed-schema | 2 +- 7 files changed, 172 insertions(+), 41 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 7b998992993..6dd9218c48f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -213,10 +213,9 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI Set clinicalSignificances = new HashSet<>(); Set filters = new HashSet<>(); - Map> popFreqs = getPopulationFrequencies(transcript); + Map> popFreqs = getPopulationFrequencies(transcript); List variants = transcript.getVariants(); - for (int i = 0; i < variants.size(); i++) { - KnockoutVariant variant = variants.get(i); + for (KnockoutVariant variant : variants) { variantIds.add(variant.getId()); String knockoutType = variant.getKnockoutType() != null ? variant.getKnockoutType().name() : ""; knockoutTypes.add(knockoutType); @@ -240,14 +239,15 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI } } } + if (StringUtils.isNotEmpty(variant.getFilter())) { filters.add(variant.getFilter()); } - float thousandPopFreq = getPopulationFrequency(i, RgaUtils.THOUSAND_GENOMES_STUDY, popFreqs); - float gnomadPopFreq = getPopulationFrequency(i, RgaUtils.GNOMAD_GENOMES_STUDY, popFreqs); + Map variantPopFreq = getPopulationFrequencies(variant); RgaUtils.CodedVariant codedVariant = new RgaUtils.CodedVariant(variant.getId(), variant.getType().name(), - variant.getKnockoutType().name(), variantConsequenceTypes, thousandPopFreq, gnomadPopFreq); + variant.getKnockoutType().name(), variantConsequenceTypes, + variantPopFreq.get(RgaUtils.THOUSAND_GENOMES_STUDY), variantPopFreq.get(RgaUtils.GNOMAD_GENOMES_STUDY)); variantKnockoutList.add(codedVariant.getFullVariant()); } @@ -325,7 +325,7 @@ private float getPopulationFrequency(int variantPosition, String population, Map return popFreqList.get(variantPosition); } - private Map> getPopulationFrequencies(KnockoutTranscript transcript) { + private Map> getPopulationFrequenciesOld(KnockoutTranscript transcript) { Map> popFreqs = new HashMap<>(); String pfKey = RgaDataModel.POPULATION_FREQUENCIES.replace("*", ""); @@ -365,6 +365,65 @@ private Map> getPopulationFrequencies(KnockoutTranscript tra return popFreqs; } + private Map> getPopulationFrequencies(KnockoutTranscript transcript) throws RgaException { + String pfKey = RgaDataModel.POPULATION_FREQUENCIES.replace("*", ""); + + String thousandGenomeKey = pfKey + RgaUtils.THOUSAND_GENOMES_STUDY; + String gnomadGenomeKey = pfKey + RgaUtils.GNOMAD_GENOMES_STUDY; + + Set thousandPopFreqs = new HashSet<>(); + Set gnomadPopFreqs = new HashSet<>(); + + for (KnockoutVariant variant : transcript.getVariants()) { + Map variantFreqs = getPopulationFrequencies(variant); + thousandPopFreqs.add(variantFreqs.get(RgaUtils.THOUSAND_GENOMES_STUDY)); + gnomadPopFreqs.add(variantFreqs.get(RgaUtils.GNOMAD_GENOMES_STUDY)); + } + + Map> popFreqs = new HashMap<>(); + if (!transcript.getVariants().isEmpty()) { + popFreqs.put(thousandGenomeKey, new ArrayList<>(thousandPopFreqs)); + popFreqs.put(gnomadGenomeKey, new ArrayList<>(gnomadPopFreqs)); + } + + return popFreqs; + } + + private Map getPopulationFrequencies(KnockoutVariant variant) throws RgaException { + Map variantFreqMap = new HashMap<>(); + + if (variant.getPopulationFrequencies() != null) { + for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { + if (populationFrequency.getPopulation().equals("ALL")) { + if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + String encodedPopFrequency = getEncodedPopFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, + populationFrequency.getAltAlleleFreq()); + variantFreqMap.put(RgaUtils.THOUSAND_GENOMES_STUDY, encodedPopFrequency); + } else if (RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + String encodedPopFrequency = getEncodedPopFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, + populationFrequency.getAltAlleleFreq()); + variantFreqMap.put(RgaUtils.GNOMAD_GENOMES_STUDY, encodedPopFrequency); + } + } + } + } + if (!variantFreqMap.containsKey(RgaUtils.THOUSAND_GENOMES_STUDY)) { + String encodedPopFrequency = getEncodedPopFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, 0f); + variantFreqMap.put(RgaUtils.THOUSAND_GENOMES_STUDY, encodedPopFrequency); + } + if (!variantFreqMap.containsKey(RgaUtils.GNOMAD_GENOMES_STUDY)) { + String encodedPopFrequency = getEncodedPopFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, 0f); + variantFreqMap.put(RgaUtils.GNOMAD_GENOMES_STUDY, encodedPopFrequency); + } + + return variantFreqMap; + } + + private String getEncodedPopFrequency(String population, float value) throws RgaException { + String populationFrequencyKey = RgaUtils.getPopulationFrequencyKey(value); + return RgaUtils.encode(population.toUpperCase() + RgaUtils.SEPARATOR + populationFrequencyKey); + } + private List processFilters(KnockoutTranscript transcript) throws RgaException { Set results = new HashSet<>(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java index 828ec0c024c..bb1be2b0344 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java @@ -89,7 +89,7 @@ public class RgaDataModel { private List clinicalSignificances; @Field(POPULATION_FREQUENCIES) - private Map> populationFrequencies; + private Map> populationFrequencies; @Field private List compoundFilters; @@ -416,11 +416,11 @@ public RgaDataModel setClinicalSignificances(List clinicalSignificances) return this; } - public Map> getPopulationFrequencies() { + public Map> getPopulationFrequencies() { return populationFrequencies; } - public RgaDataModel setPopulationFrequencies(Map> populationFrequencies) { + public RgaDataModel setPopulationFrequencies(Map> populationFrequencies) { this.populationFrequencies = populationFrequencies; return this; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 94af464a0f0..36f42b074fa 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -34,6 +34,7 @@ import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; +import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -872,7 +873,7 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection private static class KnockoutTypeCount { private Set knockoutTypeQuery; - private Set popFreqQuery; + private List> popFreqQuery; private Set typeQuery; private Set consequenceTypeQuery; @@ -882,10 +883,9 @@ private static class KnockoutTypeCount { private Set hetVariantIds; private Set delOverlapVariantIds; - public KnockoutTypeCount(Query query) { - // TODO: Process query object + public KnockoutTypeCount(Query query) throws RgaException { knockoutTypeQuery = new HashSet<>(); - popFreqQuery = new HashSet<>(); + popFreqQuery = new LinkedList<>(); typeQuery = new HashSet<>(); consequenceTypeQuery = new HashSet<>(); variantIds = new HashSet<>(); @@ -893,6 +893,22 @@ public KnockoutTypeCount(Query query) { homVariantIds = new HashSet<>(); hetVariantIds = new HashSet<>(); delOverlapVariantIds = new HashSet<>(); + + query = ParamUtils.defaultObject(query, Query::new); + knockoutTypeQuery.addAll(query.getAsStringList(RgaQueryParams.KNOCKOUT.key())); + typeQuery.addAll(query.getAsStringList(RgaQueryParams.TYPE.key())); + consequenceTypeQuery.addAll(query.getAsStringList(RgaQueryParams.CONSEQUENCE_TYPE.key()) + .stream() + .map(VariantQueryUtils::parseConsequenceType) + .map(String::valueOf) + .collect(Collectors.toList())); + List popFreqs = query.getAsStringList(RgaQueryParams.POPULATION_FREQUENCY.key(), ";"); + if (!popFreqs.isEmpty()) { + Map> popFreqList = RgaUtils.parsePopulationFrequencyQuery(popFreqs); + for (List values : popFreqList.values()) { + popFreqQuery.add(new HashSet<>(values)); + } + } } public void processVariant(String variant) throws RgaException { @@ -901,9 +917,12 @@ public void processVariant(String variant) throws RgaException { if (!knockoutTypeQuery.isEmpty() && !knockoutTypeQuery.contains(codedVariant.getKnockoutType())) { return; } - if (!popFreqQuery.isEmpty() - && codedVariant.getPopulationFrequencies().stream().noneMatch((popFreq) -> popFreqQuery.contains(popFreq))) { - return; + if (!popFreqQuery.isEmpty()) { + for (Set popFreq : popFreqQuery) { + if (codedVariant.getPopulationFrequencies().stream().noneMatch(popFreq::contains)) { + return; + } + } } if (!typeQuery.isEmpty() && !typeQuery.contains(codedVariant.getType())) { return; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java index e1cbe90a8ad..616dbd585e1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java @@ -115,14 +115,11 @@ private void parseFilterValue(Query query, List filterList) throws RgaEx parseStringValue(query, CONSEQUENCE_TYPE, RgaDataModel.CONSEQUENCE_TYPES, filterList); if (!popFreqValues.isEmpty()) { - List> encodedPopFreqs = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); + Map> encodedPopFreqs = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); - List popFreqList = new ArrayList<>(encodedPopFreqs.size()); - for (List encodedPopFreq : encodedPopFreqs) { - parseStringValue(encodedPopFreq, "", popFreqList, "||"); + for (Map.Entry> entry : encodedPopFreqs.entrySet()) { + parseStringValue(entry.getValue(), RgaDataModel.POPULATION_FREQUENCIES.replace("*", entry.getKey()), filterList, "||"); } - // TODO: The pop freq key is dynamic - parseStringValue(popFreqList, RgaDataModel.POPULATION_FREQUENCIES, filterList, "&&"); } } else if (count > 1) { if (knockoutValues.size() == 1 && KnockoutVariant.KnockoutType.COMP_HET.name().equals(knockoutValues.get(0).toUpperCase())) { @@ -161,7 +158,7 @@ private void buildCompHetComplexQueryFilter(List filterList, String filt } // Pop. freq - List> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqList); + Map> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqList); buildComplexQuery(Collections.singletonList(koValue), generateSortedCombinations(filterValues), generateSortedCombinations(ctValues), popFreqQueryList, filterList); @@ -201,13 +198,13 @@ private void buildComplexQueryFilter(List filterList, List knock } // Pop. freq - List> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqList); + Map> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqList); buildComplexQuery(koValues, filterValues, ctValues, popFreqQueryList, filterList); } private void buildComplexQuery(List koValues, List filterValues, List ctValues, - List> popFreqQueryList, List filterList) { + Map> popFreqQueryList, List filterList) { if (ctValues.isEmpty() && popFreqQueryList.isEmpty()) { // KT + FILTER List orFilterList = new LinkedList<>(); @@ -220,7 +217,7 @@ private void buildComplexQuery(List koValues, List filterValues, } else if (!ctValues.isEmpty() && !popFreqQueryList.isEmpty()) { // KT + FILTER + CT + POP_FREQ List andQueryList = new ArrayList<>(popFreqQueryList.size()); - for (List tmpPopFreqList : popFreqQueryList) { + for (List tmpPopFreqList : popFreqQueryList.values()) { List orQueryList = new LinkedList<>(); for (String popFreq : tmpPopFreqList) { for (String koValue : koValues) { @@ -248,7 +245,7 @@ private void buildComplexQuery(List koValues, List filterValues, } else { // POP_FREQ not empty // KT + FILTER + POP_FREQ List andQueryList = new ArrayList<>(popFreqQueryList.size()); - for (List tmpPopFreqList : popFreqQueryList) { + for (List tmpPopFreqList : popFreqQueryList.values()) { List orQueryList = new LinkedList<>(); for (String popFreq : tmpPopFreqList) { for (String koValue : koValues) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index a3e58a7573e..83f4f3ae5ec 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -16,7 +16,6 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import static org.opencb.opencga.analysis.rga.RgaDataModel.*; @@ -25,7 +24,7 @@ class RgaUtils { private static final Pattern OPERATION_PATTERN = Pattern.compile("^([^=<>~!]*)(>?=?|!=?|!?=?~|==?)([^=<>~!]+.*)$"); static final String SEPARATOR = "__"; - static final String INNER_SEPARATOR = "-"; + static final String INNER_SEPARATOR = "--"; private static final Map ENCODE_MAP; private static final Map DECODE_MAP; @@ -177,11 +176,11 @@ static String decode(String value) throws RgaException { /** Calculate the list of population frequency values to look for in the db. * * @param filters A list containing {study}[<|>|<=|>=]{number}. e.g. 1kG_phase3<0.01"; - * @return the list of population frequency values to look for in the db. + * @return the list of population frequency values to look for in the db with their corresponding population key. * @throws RgaException RgaException. */ - static List> parsePopulationFrequencyQuery(List filters) throws RgaException { - List> result = new ArrayList<>(filters.size()); + static Map> parsePopulationFrequencyQuery(List filters) throws RgaException { + Map> result = new HashMap<>(); for (String filter : filters) { KeyOpValue keyOpValue = parseKeyOpValue(filter); if (keyOpValue.getKey() == null) { @@ -219,7 +218,7 @@ static List> parsePopulationFrequencyQuery(List filters) th throw new RgaException("Unknown operator '" + keyOpValue.getOp() + "'"); } - result.add(values); + result.put(keyOpValue.getKey(), values); } return result; @@ -319,7 +318,7 @@ public static class CodedVariant { private Set consequenceType; public CodedVariant(String variantId, String type, String knockoutType, List consequenceTypeList, - float thousandGenomesPopFreq, float gnomadPopFreq) throws RgaException { + String thousandGenomesPopFreq, String gnomadPopFreq) { this.variantId = variantId; this.type = type; this.knockoutType = knockoutType; @@ -327,11 +326,7 @@ public CodedVariant(String variantId, String type, String knockoutType, List(2); - this.populationFrequencies.add( - RgaUtils.encode(THOUSAND_GENOMES_STUDY.toUpperCase() + SEPARATOR + getPopulationFrequencyKey(thousandGenomesPopFreq))); - this.populationFrequencies.add( - RgaUtils.encode(GNOMAD_GENOMES_STUDY.toUpperCase() + SEPARATOR + getPopulationFrequencyKey(gnomadPopFreq))); + this.populationFrequencies = Arrays.asList(thousandGenomesPopFreq, gnomadPopFreq); } public CodedVariant(String fullVariant) throws RgaException { diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 65303c5aa5f..a584f732b17 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -239,6 +239,67 @@ public void testIndividualSummary() throws CatalogException, IOException, RgaExc assertTrue(individual.getVariantStats().getNumCompHet() > 0 || individual.getVariantStats().getNumDelOverlap() > 0 || individual.getVariantStats().getNumHetAlt() > 0 || individual.getVariantStats().getNumHomAlt() > 0); } + + result = rgaManager.individualSummary(STUDY, new Query(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET.name()), + QueryOptions.empty(), ownerToken); + assertEquals(2, result.getNumResults()); + for (KnockoutByIndividualSummary individual : result.getResults()) { + assertNotNull(individual.getId()); + assertNotNull(individual.getVariantStats()); + assertTrue(individual.getGenes().size() > 0); + assertTrue(individual.getVariantStats().getCount() > 0); + assertTrue(individual.getVariantStats().getNumCompHet() > 0); + assertEquals(0, individual.getVariantStats().getNumDelOverlap()); + assertEquals(0, individual.getVariantStats().getNumHetAlt()); + assertEquals(0, individual.getVariantStats().getNumHomAlt()); + } + + result = rgaManager.individualSummary(STUDY, new Query(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT.name()), + QueryOptions.empty(), ownerToken); + assertEquals(4, result.getNumResults()); + for (KnockoutByIndividualSummary individual : result.getResults()) { + assertNotNull(individual.getId()); + assertNotNull(individual.getVariantStats()); + assertTrue(individual.getGenes().size() > 0); + assertTrue(individual.getVariantStats().getCount() > 0); + assertTrue(individual.getVariantStats().getNumHomAlt() > 0); + assertEquals(0, individual.getVariantStats().getNumDelOverlap()); + assertEquals(0, individual.getVariantStats().getNumHetAlt()); + assertEquals(0, individual.getVariantStats().getNumCompHet()); + } + + result = rgaManager.individualSummary(STUDY, new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001630"), QueryOptions.empty(), ownerToken); + assertEquals(4, result.getNumResults()); + for (KnockoutByIndividualSummary individual : result.getResults()) { + assertNotNull(individual.getId()); + assertNotNull(individual.getVariantStats()); + assertTrue(individual.getGenes().size() > 0); + assertTrue(individual.getVariantStats().getCount() > 0); + assertTrue(individual.getVariantStats().getNumHomAlt() > 0); + assertEquals(0, individual.getVariantStats().getNumDelOverlap()); + assertEquals(0, individual.getVariantStats().getNumHetAlt()); + assertEquals(0, individual.getVariantStats().getNumCompHet()); + } + + result = rgaManager.individualSummary(STUDY, + new Query(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + + RgaUtils.GNOMAD_GENOMES_STUDY + ">0.01"), QueryOptions.empty(), + ownerToken); + assertEquals(4, result.getNumResults()); + boolean compHetFound = false; + for (KnockoutByIndividualSummary individual : result.getResults()) { + assertNotNull(individual.getId()); + assertNotNull(individual.getVariantStats()); + assertTrue(individual.getGenes().size() > 0); + assertTrue(individual.getVariantStats().getCount() > 0); + assertTrue(individual.getVariantStats().getNumHomAlt() > 0); + assertEquals(0, individual.getVariantStats().getNumDelOverlap()); + assertEquals(0, individual.getVariantStats().getNumHetAlt()); + if (individual.getVariantStats().getNumCompHet() > 0) { + compHetFound = true; + } + } + assertTrue(compHetFound); } @Test diff --git a/opencga-clinical/src/main/resources/rga/managed-schema b/opencga-clinical/src/main/resources/rga/managed-schema index 8e73284a9e3..3f814df7ddf 100644 --- a/opencga-clinical/src/main/resources/rga/managed-schema +++ b/opencga-clinical/src/main/resources/rga/managed-schema @@ -598,7 +598,7 @@ - + 2\u001b[0;31m \u001b[0mconfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mClientConfiguration\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m## Define the client\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0moc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mOpencgaClient\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'config_dict' is not defined" - ] - } - ], + "outputs": [], "source": [ "## Create the configuration\n", "config = ClientConfiguration(config_dict)\n", @@ -171,6 +170,7 @@ }, { "cell_type": "markdown", + "id": "binding-taiwan", "metadata": {}, "source": [ "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. \n", @@ -180,6 +180,7 @@ }, { "cell_type": "markdown", + "id": "wound-carol", "metadata": {}, "source": [ "## 5. Import the credentials and Login into OpenCGA\n", @@ -190,6 +191,7 @@ { "cell_type": "code", "execution_count": 6, + "id": "pediatric-sport", "metadata": {}, "outputs": [], "source": [ @@ -201,6 +203,7 @@ { "cell_type": "code", "execution_count": 5, + "id": "manufactured-current", "metadata": {}, "outputs": [], "source": [ @@ -210,6 +213,7 @@ }, { "cell_type": "markdown", + "id": "korean-resident", "metadata": {}, "source": [ "#### ✅ Congrats! You are now connected to OpenCGA" @@ -217,6 +221,7 @@ }, { "cell_type": "markdown", + "id": "universal-creek", "metadata": {}, "source": [ "# Understanding REST Response\n", @@ -224,17 +229,18 @@ "\n", "*pyopencga* queries web services that return a RESTResponse object, which might be difficult to interpretate. The RESTResponse type provide the data in a manner that is not as intuitive as a python list or dictionary. Because of this, we have develop a useful functionality that retrieves the data in a simpler format. \n", "\n", - "[OpenCGA Client Libraries](http://docs.opencb.org/display/opencga/Using+OpenCGA), including *pyopencga*, implement a **RESTReponse wrapper** to make even easier to work with REST web services responses.
REST responsess include metadata and OpenCGA 2.0.1 has been designed to work in a federation mode (more information about OpenCGA federations can be found **[here](http://docs.opencb.org/display/opencga/Roadmapg)**).\n", + "[OpenCGA Client Libraries](http://docs.opencb.org/display/opencga/Using+OpenCGA), including *pyopencga*, implement a **RESTReponse wrapper** to make even easier to work with REST web services responses.
REST responses include metadata and OpenCGA 2.0.1 has been designed to work in a federation mode (more information about OpenCGA federations can be found **[here](http://docs.opencb.org/display/opencga/Roadmapg)**).\n", "\n", "All these can make a first-time user to struggle when start working with the responses. Please read this brief documentation about **[OpenCGA RESTful Web Services](http://docs.opencb.org/display/opencga/RESTful+Web+Services#RESTfulWebServices-OpenCGA2.x)**.\n", "\n", "Let's see a quick example of how to use RESTResponse wrapper in *pyopencga*. \n", - "You can get some extra inforamtion [here](http://docs.opencb.org/display/opencga/Python#Python-WorkingwiththeRestResponse). Let's execute a first simple query to fetch all projects for the user **demouser** already logged in **[step 1.3](#1.3-Setup-the-client-and-login-in-pyopencga)**." + "You can get some extra inforamtion [here](http://docs.opencb.org/display/opencga/Python#Python-WorkingwiththeRestResponse). Let's execute a first simple query to fetch all projects for the user **demouser** already logged in **[Installing and importing the *pyopencga* library](#Installing-and-importing-the-*pyopencga*-library)**." ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 6, + "id": "several-england", "metadata": {}, "outputs": [], "source": [ @@ -244,22 +250,23 @@ "project_client = oc.projects\n", "projects = project_client.search()\n", "\n", - "## Uncomment this line to view the JSON response.\n", - "## NOTE: it incudes study information so this can be big\n", - "##pprint(projects.get_responses())" + "## Uncomment next line to display an interactive JSON viewer\n", + "#JSON(projects.get_results())" ] }, { "cell_type": "markdown", + "id": "ahead-turning", "metadata": {}, "source": [ "#### Although you can iterate through all the different projects provided by the response by executing the next chunk of code, this is a **not recommended** way.\n", - "We can explore this through an example; the next query iterates over all the projects retrieved from `projects.search()`" + "The next query iterates over all the projects retrieved from `projects.search()`" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 8, + "id": "secondary-kingston", "metadata": {}, "outputs": [ { @@ -280,6 +287,7 @@ }, { "cell_type": "markdown", + "id": "scheduled-stations", "metadata": {}, "source": [ "## RestResponse API" @@ -287,6 +295,7 @@ }, { "cell_type": "markdown", + "id": "grave-general", "metadata": {}, "source": [ "Note: Table with API funcitons and the description" @@ -294,6 +303,7 @@ }, { "cell_type": "markdown", + "id": "touched-tattoo", "metadata": {}, "source": [ "### 1. Using the `get_results()` function \n", @@ -303,7 +313,8 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 9, + "id": "collaborative-episode", "metadata": {}, "outputs": [ { @@ -324,6 +335,7 @@ }, { "cell_type": "markdown", + "id": "ignored-referral", "metadata": {}, "source": [ "### 2. Using the `result_iterator()` function to iterate over the Rest results\n", @@ -333,7 +345,8 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 10, + "id": "cordless-occasion", "metadata": {}, "outputs": [ { @@ -354,23 +367,29 @@ }, { "cell_type": "markdown", + "id": "continuing-trick", "metadata": {}, "source": [ "### 3. Using `print_results()` function to iterate over the Rest results\n", "\n", - "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎" + "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎\n", + "\n", + "**[NOTE]**: From *pyopencga 2.0.1.2* you can use the `title` parameter in the function to add a header to the results printed." ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 12, + "id": "varied-stamp", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "#Time: 81\n", + "These are the projects you can access with your user\n", + "---------------------------------------------------------\n", + "#Time: 75\n", "#Num matches: -1\n", "#Num results: 2\n", "#Num inserted: 0\n", @@ -384,12 +403,15 @@ ], "source": [ "## This function iterates over all the results, it can be configured to exclude metadata, change separator or even select the fields!\n", + "# Set a title to display the results\n", + "user_defined_title = 'These are the projects you can access with your user'\n", "\n", - "projects.print_results()" + "projects.print_results(title=user_defined_title)" ] }, { "cell_type": "markdown", + "id": "headed-occupation", "metadata": {}, "source": [ "##### Now, let's try to costumize the results so we can get printed only the portion of the data that we might be interested in" @@ -397,29 +419,34 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 16, + "id": "fluid-payroll", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Display selected fields from the projects data model\n", + "---------------------------------------------------------\n", "#id\tname\torganism.scientificName\torganism.assembly\n", "family\tFamily Studies GRCh37\tHomo sapiens\tGRCh37\n", - "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\n", - "\n" + "population\tPopulation Studies GRCh38\tHomo sapiens\tGRCh38\n" ] } ], "source": [ - "## Lets exclude metadata and print only few fields, use dot notation for ensted fields\n", + "## Lets exclude metadata and print only few fields, use dot notation for nested fields\n", + "user_defined_title = 'Display selected fields from the projects data model'\n", "\n", - "projects.print_results(fields='id,name,organism.scientificName,organism.assembly',metadata=False)\n", - "print()\n" + "\n", + "projects.print_results(fields='id,name,organism.scientificName,organism.assembly',metadata=False,title=user_defined_title)\n", + "\n" ] }, { "cell_type": "markdown", + "id": "liberal-microphone", "metadata": {}, "source": [ "##### A very useful parameter is the *separator*.
It allows the user to decide the format in which the data is printed. For example, it's possible to print a CSV-like style:" @@ -427,7 +454,8 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 17, + "id": "valuable-buffalo", "metadata": {}, "outputs": [ { @@ -435,18 +463,10 @@ "output_type": "stream", "text": [ "Print the projects with a header and a different separator:\n", - "\n" - ] - }, - { - "ename": "NameError", - "evalue": "name 'projects' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Print the projects with a header and a different separator:\\n'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mprojects\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprint_results\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfields\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'id,name,organism.scientificName,organism.assembly'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseparator\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m','\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmetadata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'projects' is not defined" + "\n", + "#id,name,organism.scientificName,organism.assembly\n", + "family,Family Studies GRCh37,Homo sapiens,GRCh37\n", + "population,Population Studies GRCh38,Homo sapiens,GRCh38\n" ] } ], @@ -459,6 +479,7 @@ }, { "cell_type": "markdown", + "id": "material-being", "metadata": {}, "source": [ "### 4. Using Pandas DataFrame: `to_data_frame()` \n", @@ -470,6 +491,7 @@ }, { "cell_type": "markdown", + "id": "quality-error", "metadata": {}, "source": [ "### 5. Wait for a job to finish `wait_for_job()`\n", @@ -479,6 +501,7 @@ }, { "cell_type": "markdown", + "id": "utility-violin", "metadata": {}, "source": [ "# Working with Jobs\n", @@ -487,6 +510,7 @@ }, { "cell_type": "markdown", + "id": "other-creature", "metadata": {}, "source": [ "OpenCGA implemets both a powerful interactive API to query data but also allows users to execute more demanding analysis by executing jobs. There are a number of analysis and operations that are executed as jobs such as Variant Export or GWAS analysis.\n" @@ -494,6 +518,7 @@ }, { "cell_type": "markdown", + "id": "considered-lying", "metadata": {}, "source": [ "## 1. Job Info\n", @@ -503,18 +528,22 @@ }, { "cell_type": "markdown", + "id": "dressed-dayton", "metadata": {}, "source": [ "## 2. Executing Jobs\n", "\n", - "Job execution invovle different lifecycle stages: pending, queued, running, done, rejected, ... OpenCGA takes care of executing and notifying job changes.\n", + "Job execution invovle different lifecycle stages: pending, queued, running, done, rejected.\n", + "\n", + "OpenCGA takes care of executing and notifying job changes.\n", "\n", - "Executing a job is as simpla s the following code" + "Executing a job is as simpla as the following code" ] }, { "cell_type": "code", "execution_count": 9, + "id": "wrong-panel", "metadata": {}, "outputs": [], "source": [ @@ -530,6 +559,7 @@ { "cell_type": "code", "execution_count": null, + "id": "royal-swiss", "metadata": {}, "outputs": [], "source": [] @@ -551,9 +581,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 32b3f064ce0..b538bdeb9b8 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -38,7 +38,7 @@ "\n", "**Configuration and Credentials** \n", "\n", - "Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [001-pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)).\n", + "Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)).\n", "\n", "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n" ] @@ -2591,13 +2591,13 @@ { "altAlleleFreq": 0.99976623, "population": "EAS", - "refAlleleFreq": 0.00023376942, + "refAlleleFreq": 2.3376942E-4, "study": "GNOMAD_EXOMES" }, { "altAlleleFreq": 0.99900794, "population": "EAS", - "refAlleleFreq": 0.0009920597, + "refAlleleFreq": 9.920597E-4, "study": "1kG_phase3" }, { @@ -2675,7 +2675,7 @@ { "altAlleleFreq": 0.9997642, "population": "EAS", - "refAlleleFreq": 0.00023579597, + "refAlleleFreq": 2.3579597E-4, "study": "EXAC" }, { @@ -8204,9 +8204,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file From e8ada3525661a2d611436853e02bb134e06850b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Mon, 26 Apr 2021 14:36:15 +0200 Subject: [PATCH 229/412] analysis: improve the gene coverage stats analysis, #1739 --- .../qc/AlignmentGeneCoverageStatsAnalysis.java | 16 ++++++++++++++-- ...ntGeneCoverageStatsLocalAnalysisExecutor.java | 7 +++---- .../executors/AlignmentCommandExecutor.java | 2 +- .../options/AlignmentCommandOptions.java | 4 ++-- .../analysis/AlignmentCommandExecutor.java | 2 +- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java index 4bb23875245..9b579b553f4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java @@ -46,6 +46,9 @@ public class AlignmentGeneCoverageStatsAnalysis extends OpenCgaToolScopeStudy { public static final String DESCRIPTION = ALIGNMENT_GENE_COVERAGE_STATS_DESCRIPTION; public static final int GENE_LIST_MAXIMUM_SIZE = 10; + private static final String COMPUTE_GENE_COVERAGE_STEP = "compute-gene-coverage-stats"; + private static final String UPDATE_QUAlITY_CONTROL_STEP = "update-quality-control"; + private File catalogBamFile; private List targetGenes; @@ -79,12 +82,21 @@ protected void check() throws Exception { targetGenes = new ArrayList<>(new HashSet<>(analysisParams.getGenes())); } - private static final String COMPUTE_GENE_COVERAGE_STEP = "gene-coverage-stats"; - private static final String UPDATE_QUAlITY_CONTROL_STEP = "update-quality-control"; + @Override + protected List getSteps() { + List steps = new ArrayList<>(); + steps.add(COMPUTE_GENE_COVERAGE_STEP); + steps.add(UPDATE_QUAlITY_CONTROL_STEP); + return steps; + } @Override protected void run() throws ToolException { + + setUpStorageEngineExecutor(study); + AlignmentGeneCoverageStatsAnalysisExecutor executor = getToolExecutor(AlignmentGeneCoverageStatsAnalysisExecutor.class) + .setStudyId(getStudy()) .setBamFileId(catalogBamFile.getId()) .setGenes(targetGenes); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsLocalAnalysisExecutor.java index 5ced9b68ad1..1b941911a4c 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsLocalAnalysisExecutor.java @@ -30,16 +30,15 @@ public class AlignmentGeneCoverageStatsLocalAnalysisExecutor extends AlignmentGeneCoverageStatsAnalysisExecutor implements StorageToolExecutor { + public final static String ID = AlignmentGeneCoverageStatsAnalysis.ID + "-local"; + @Override public void run() throws ToolException { try { OpenCGAResult geneCoverageStatsResult = getAlignmentStorageManager().coverageStats(getStudyId(), getBamFileId(), getGenes(), Integer.parseInt(LOW_COVERAGE_REGION_THRESHOLD_DEFAULT), getToken()); - if (geneCoverageStatsResult.getNumResults() != 1) { - throw new ToolException("Something wrong happened when computing gene coverage stats: no results returned"); - } - geneCoverageStats.add(geneCoverageStatsResult.first()); + geneCoverageStats = geneCoverageStatsResult.getResults(); } catch (Exception e) { throw new ToolException(e); } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 2a1fbc0808e..b6e2a8e71b6 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -174,7 +174,7 @@ private void geneCoverageStatsRun() throws ToolException { .geneCoverageStatsAlignmentCommandOptions; ObjectMap params = new AlignmentGeneCoverageStatsParams( - cliOptions.file, + cliOptions.bamFile, Arrays.asList(cliOptions.genes.split(",")), cliOptions.outdir ).toObjectMap(cliOptions.commonOptions.params) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index f0901e3ab0a..eddecee6e2b 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -318,8 +318,8 @@ public class GeneCoverageStatsAlignmentCommandOptions extends GeneralCliOptions. @ParametersDelegate public Object internalJobOptions = internalJobOptionsObject; - @Parameter(names = {"--file"}, description = FILE_ID_DESCRIPTION, required = true, arity = 1) - public String file; + @Parameter(names = {"--bam-file"}, description = FILE_ID_DESCRIPTION + " (BAM file)", required = true, arity = 1) + public String bamFile; @Parameter(names = {"--genes"}, description = GENE_DESCRIPTION, required = true, arity = 1) public String genes; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index 097772f2d0f..ef220cfae46 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -345,7 +345,7 @@ private RestResponse geneCoverageStatsRun() throws ClientException { ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); params.putAll(getJobParams()); - return openCGAClient.getAlignmentClient().genecoveragestatsQc(new AlignmentGeneCoverageStatsParams(cliOptions.file, + return openCGAClient.getAlignmentClient().genecoveragestatsQc(new AlignmentGeneCoverageStatsParams(cliOptions.bamFile, Arrays.asList(cliOptions.genes.split(",")), cliOptions.outdir), params); } From e8e4dae503a182cc3cd64d6ce113a3faa37a615a Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 26 Apr 2021 18:53:03 +0200 Subject: [PATCH 230/412] analysis: add new individualSummary field to RgaDataModel, #1693 --- .../analysis/rga/IndividualRgaConverter.java | 34 ++-- .../opencga/analysis/rga/RgaDataModel.java | 38 ++++- .../opencga/analysis/rga/RgaManager.java | 154 ++++++++---------- .../opencb/opencga/analysis/rga/RgaUtils.java | 68 ++++++-- .../src/main/resources/rga/managed-schema | 3 +- 5 files changed, 172 insertions(+), 125 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 6dd9218c48f..40fd71d917d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -205,6 +205,18 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI disorderJson = Collections.emptyList(); } + String id = knockoutByIndividual.getSampleId() + "_" + gene.getId() + "_" + transcript.getId(); + String individualId = knockoutByIndividual.getId(); + + int numParents = 0; + if (StringUtils.isNotEmpty(knockoutByIndividual.getFatherId())) { + numParents++; + } + if (StringUtils.isNotEmpty(knockoutByIndividual.getMotherId())) { + numParents++; + } + + Set individualKnockoutSet = new HashSet<>(); List variantIds = new ArrayList<>(transcript.getVariants().size()); List knockoutTypes = new ArrayList<>(transcript.getVariants().size()); List variantKnockoutList = new ArrayList<>(transcript.getVariants().size()); @@ -245,21 +257,16 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI } Map variantPopFreq = getPopulationFrequencies(variant); - RgaUtils.CodedVariant codedVariant = new RgaUtils.CodedVariant(variant.getId(), variant.getType().name(), + RgaUtils.CodedFeature codedFeature = new RgaUtils.CodedFeature(variant.getId(), variant.getType().name(), variant.getKnockoutType().name(), variantConsequenceTypes, variantPopFreq.get(RgaUtils.THOUSAND_GENOMES_STUDY), variantPopFreq.get(RgaUtils.GNOMAD_GENOMES_STUDY)); - variantKnockoutList.add(codedVariant.getFullVariant()); - } - - String id = knockoutByIndividual.getSampleId() + "_" + gene.getId() + "_" + transcript.getId(); - String individualId = knockoutByIndividual.getId(); + variantKnockoutList.add(codedFeature.getEncodedId()); - int numParents = 0; - if (StringUtils.isNotEmpty(knockoutByIndividual.getFatherId())) { - numParents++; - } - if (StringUtils.isNotEmpty(knockoutByIndividual.getMotherId())) { - numParents++; + RgaUtils.CodedIndividual codedIndividual = new RgaUtils.CodedIndividual(individualId, variant.getType().name(), + variant.getKnockoutType().name(), variantConsequenceTypes, + variantPopFreq.get(RgaUtils.THOUSAND_GENOMES_STUDY), variantPopFreq.get(RgaUtils.GNOMAD_GENOMES_STUDY), + numParents); + individualKnockoutSet.add(codedIndividual.getEncodedId()); } String sex = knockoutByIndividual.getSex() != null @@ -290,7 +297,8 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI .setVariants(variantIds) .setTypes(new ArrayList<>(types)) .setKnockoutTypes(knockoutTypes) - .setFullVariantInfo(variantKnockoutList) + .setIndividualSummary(new ArrayList<>(individualKnockoutSet)) + .setVariantSummary(variantKnockoutList) .setFilters(new ArrayList<>(filters)) .setConsequenceTypes(new ArrayList<>(consequenceTypes)) .setClinicalSignificances(new ArrayList<>(clinicalSignificances)) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java index bb1be2b0344..1942e5f9ce6 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java @@ -76,9 +76,6 @@ public class RgaDataModel { @Field private List knockoutTypes; - @Field - private List fullVariantInfo; - @Field private List filters; @@ -91,6 +88,18 @@ public class RgaDataModel { @Field(POPULATION_FREQUENCIES) private Map> populationFrequencies; + /** + * {variantId}__{type}__{knockoutType}__{conseqType}__{popFreqs} + */ + @Field + private List variantSummary; + + /** + * {individualId}__{type}__{knockoutType}__{conseqType}__{popFreqs}__{numParents} + */ + @Field + private List individualSummary; + @Field private List compoundFilters; @@ -121,13 +130,14 @@ public class RgaDataModel { public static final String TRANSCRIPT_ID = "transcriptId"; public static final String TRANSCRIPT_BIOTYPE = "transcriptBiotype"; public static final String VARIANTS = "variants"; - public static final String FULL_VARIANT_INFO = "fullVariantInfo"; public static final String TYPES = "types"; public static final String KNOCKOUT_TYPES = "knockoutTypes"; public static final String FILTERS = "filters"; public static final String CONSEQUENCE_TYPES = "consequenceTypes"; public static final String CLINICAL_SIGNIFICANCES = "clinicalSignificances"; public static final String POPULATION_FREQUENCIES = "populationFrequencies_*"; + public static final String VARIANT_SUMMARY = "variantSummary"; + public static final String INDIVIDUAL_SUMMARY = "individualSummary"; public static final String COMPOUND_FILTERS = "compoundFilters"; public static final String PHENOTYPE_JSON = "phenotypeJson"; public static final String DISORDER_JSON = "disorderJson"; @@ -161,11 +171,12 @@ public String toString() { sb.append(", variants=").append(variants); sb.append(", types=").append(types); sb.append(", knockoutTypes=").append(knockoutTypes); - sb.append(", fullVariantInfo=").append(fullVariantInfo); + sb.append(", variantSummary=").append(variantSummary); sb.append(", filters=").append(filters); sb.append(", consequenceTypes=").append(consequenceTypes); sb.append(", clinicalSignificances=").append(clinicalSignificances); sb.append(", populationFrequencies=").append(populationFrequencies); + sb.append(", individualSummary=").append(individualSummary); sb.append(", compoundFilters=").append(compoundFilters); sb.append(", phenotypeJson=").append(phenotypeJson); sb.append(", disorderJson=").append(disorderJson); @@ -380,12 +391,12 @@ public RgaDataModel setKnockoutTypes(List knockoutTypes) { return this; } - public List getFullVariantInfo() { - return fullVariantInfo; + public List getVariantSummary() { + return variantSummary; } - public RgaDataModel setFullVariantInfo(List fullVariantInfo) { - this.fullVariantInfo = fullVariantInfo; + public RgaDataModel setVariantSummary(List variantSummary) { + this.variantSummary = variantSummary; return this; } @@ -425,6 +436,15 @@ public RgaDataModel setPopulationFrequencies(Map> populatio return this; } + public List getIndividualSummary() { + return individualSummary; + } + + public RgaDataModel setIndividualSummary(List individualSummary) { + this.individualSummary = individualSummary; + return this; + } + public List getCompoundFilters() { return compoundFilters; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 55db40b4125..3bd59781747 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -814,68 +814,55 @@ private List calculateGeneSummary(String collection, Quer // 2. Get KnockoutType counts QueryOptions knockoutTypeFacet = new QueryOptions() .append(QueryOptions.LIMIT, -1) - .append(QueryOptions.FACET, RgaDataModel.FULL_VARIANT_INFO); + .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { - knockoutTypeCount.processVariant(variantBucket.getValue()); + RgaUtils.CodedFeature codedFeature = RgaUtils.CodedFeature.parseEncodedId(variantBucket.getValue()); + knockoutTypeCount.processFeature(codedFeature); } - VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumVariants(), knockoutTypeCount.getNumHomVariants(), - knockoutTypeCount.getNumCompHetVariants(), knockoutTypeCount.getNumHetVariants(), - knockoutTypeCount.getNumDelOverlapVariants()); + VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), + knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumHetIds(), + knockoutTypeCount.getNumDelOverlapIds()); geneSummary.setVariantStats(variantStats); // 3. Get individual knockout type counts QueryOptions geneFacet = new QueryOptions() .append(QueryOptions.LIMIT, -1) - .append(QueryOptions.FACET, RgaDataModel.NUM_PARENTS + ">>" + RgaDataModel.INDIVIDUAL_ID + ">>" - + RgaDataModel.KNOCKOUT_TYPES); + .append(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_SUMMARY); facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); - VariantStats noParents = new VariantStats(); - VariantStats singleParent = new VariantStats(); - VariantStats bothParents = new VariantStats(); - - for (FacetField.Bucket numParentsBucket : facetFieldDataResult.first().getBuckets()) { - VariantStats auxVariantStats; - switch (numParentsBucket.getValue()) { - case "0": - auxVariantStats = noParents; + KnockoutTypeCount noParentsCount = new KnockoutTypeCount(auxQuery); + KnockoutTypeCount singleParentCount = new KnockoutTypeCount(auxQuery); + KnockoutTypeCount bothParentsCount = new KnockoutTypeCount(auxQuery); + + for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { + RgaUtils.CodedIndividual codedIndividual = RgaUtils.CodedIndividual.parseEncodedId(bucket.getValue()); + KnockoutTypeCount auxKnockoutType; + switch (codedIndividual.getNumParents()) { + case 0: + auxKnockoutType = noParentsCount; break; - case "1": - auxVariantStats = singleParent; + case 1: + auxKnockoutType = singleParentCount; break; - case "2": - auxVariantStats = bothParents; + case 2: + auxKnockoutType = bothParentsCount; break; default: - throw new IllegalStateException("Unexpected value: " + numParentsBucket.getValue()); - } - for (FacetField.Bucket individualBucket : numParentsBucket.getFacetFields().get(0).getBuckets()) { - for (FacetField.Bucket knockoutTypeBucket : individualBucket.getFacetFields().get(0).getBuckets()) { - KnockoutVariant.KnockoutType knockoutType = KnockoutVariant.KnockoutType.valueOf(knockoutTypeBucket.getValue()); - switch (knockoutType) { - case HOM_ALT: - auxVariantStats.setNumHomAlt(auxVariantStats.getNumHomAlt() + 1); - break; - case COMP_HET: - auxVariantStats.setNumCompHet(auxVariantStats.getNumCompHet() + 1); - break; - case HET_ALT: - auxVariantStats.setNumHetAlt(auxVariantStats.getNumHetAlt() + 1); - break; - case DELETION_OVERLAP: - auxVariantStats.setNumDelOverlap(auxVariantStats.getNumDelOverlap() + 1); - break; - default: - throw new IllegalStateException("Unexpected value: " + knockoutType); - } - auxVariantStats.setCount(auxVariantStats.getNumCompHet() + auxVariantStats.getNumHomAlt() - + auxVariantStats.getNumHetAlt() + auxVariantStats.getNumDelOverlap()); - } + throw new IllegalStateException("Unexpected value: " + codedIndividual.getNumParents()); } + + auxKnockoutType.processFeature(codedIndividual); } + VariantStats noParentIndividualStats = new VariantStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), + noParentsCount.getNumCompHetIds(), noParentsCount.getNumHetIds(), noParentsCount.getNumDelOverlapIds()); + VariantStats singleParentIndividualStats = new VariantStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), + singleParentCount.getNumCompHetIds(), singleParentCount.getNumHetIds(), singleParentCount.getNumDelOverlapIds()); + VariantStats bothParentIndividualStats = new VariantStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), + bothParentsCount.getNumCompHetIds(), bothParentsCount.getNumHetIds(), bothParentsCount.getNumDelOverlapIds()); - geneSummary.setIndividualStats(new IndividualStats(noParents, singleParent, bothParents)); + geneSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, + bothParentIndividualStats)); knockoutByGeneSummaryList.add(geneSummary); } @@ -907,15 +894,16 @@ private List calculateIndividualSummary(String coll // 2. Get KnockoutType counts QueryOptions knockoutTypeFacet = new QueryOptions() .append(QueryOptions.LIMIT, -1) - .append(QueryOptions.FACET, RgaDataModel.FULL_VARIANT_INFO); + .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { - knockoutTypeCount.processVariant(variantBucket.getValue()); + RgaUtils.CodedFeature codedFeature = RgaUtils.CodedFeature.parseEncodedId(variantBucket.getValue()); + knockoutTypeCount.processFeature(codedFeature); } - VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumVariants(), knockoutTypeCount.getNumHomVariants(), - knockoutTypeCount.getNumCompHetVariants(), knockoutTypeCount.getNumHetVariants(), - knockoutTypeCount.getNumDelOverlapVariants()); + VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), + knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumHetIds(), + knockoutTypeCount.getNumDelOverlapIds()); knockoutByIndividualSummary.setVariantStats(variantStats); // 3. Get gene name list @@ -942,22 +930,22 @@ private static class KnockoutTypeCount { private Set typeQuery; private Set consequenceTypeQuery; - private Set variantIds; - private Set compHetVariantIds; - private Set homVariantIds; - private Set hetVariantIds; - private Set delOverlapVariantIds; + private Set ids; + private Set compHetIds; + private Set homIds; + private Set hetIds; + private Set delOverlapIds; public KnockoutTypeCount(Query query) throws RgaException { knockoutTypeQuery = new HashSet<>(); popFreqQuery = new LinkedList<>(); typeQuery = new HashSet<>(); consequenceTypeQuery = new HashSet<>(); - variantIds = new HashSet<>(); - compHetVariantIds = new HashSet<>(); - homVariantIds = new HashSet<>(); - hetVariantIds = new HashSet<>(); - delOverlapVariantIds = new HashSet<>(); + ids = new HashSet<>(); + compHetIds = new HashSet<>(); + homIds = new HashSet<>(); + hetIds = new HashSet<>(); + delOverlapIds = new HashSet<>(); query = ParamUtils.defaultObject(query, Query::new); knockoutTypeQuery.addAll(query.getAsStringList(RgaQueryParams.KNOCKOUT.key())); @@ -976,65 +964,63 @@ public KnockoutTypeCount(Query query) throws RgaException { } } - public void processVariant(String variant) throws RgaException { - RgaUtils.CodedVariant codedVariant = new RgaUtils.CodedVariant(variant); - - if (!knockoutTypeQuery.isEmpty() && !knockoutTypeQuery.contains(codedVariant.getKnockoutType())) { + public void processFeature(RgaUtils.CodedFeature codedFeature) { + if (!knockoutTypeQuery.isEmpty() && !knockoutTypeQuery.contains(codedFeature.getKnockoutType())) { return; } if (!popFreqQuery.isEmpty()) { for (Set popFreq : popFreqQuery) { - if (codedVariant.getPopulationFrequencies().stream().noneMatch(popFreq::contains)) { + if (codedFeature.getPopulationFrequencies().stream().noneMatch(popFreq::contains)) { return; } } } - if (!typeQuery.isEmpty() && !typeQuery.contains(codedVariant.getType())) { + if (!typeQuery.isEmpty() && !typeQuery.contains(codedFeature.getType())) { return; } if (!consequenceTypeQuery.isEmpty() - && codedVariant.getConsequenceType().stream().noneMatch((ct) -> consequenceTypeQuery.contains(ct))) { + && codedFeature.getConsequenceType().stream().noneMatch((ct) -> consequenceTypeQuery.contains(ct))) { return; } - variantIds.add(codedVariant.getVariantId()); - KnockoutVariant.KnockoutType knockoutType = KnockoutVariant.KnockoutType.valueOf(codedVariant.getKnockoutType()); + ids.add(codedFeature.getId()); + KnockoutVariant.KnockoutType knockoutType = KnockoutVariant.KnockoutType.valueOf(codedFeature.getKnockoutType()); switch (knockoutType) { case HOM_ALT: - homVariantIds.add(codedVariant.getVariantId()); + homIds.add(codedFeature.getId()); break; case COMP_HET: - compHetVariantIds.add(codedVariant.getVariantId()); + compHetIds.add(codedFeature.getId()); break; case HET_ALT: - hetVariantIds.add(codedVariant.getVariantId()); + hetIds.add(codedFeature.getId()); break; case DELETION_OVERLAP: - delOverlapVariantIds.add(codedVariant.getVariantId()); + delOverlapIds.add(codedFeature.getId()); break; default: - throw new IllegalStateException("Unexpected value: " + codedVariant.getKnockoutType()); + throw new IllegalStateException("Unexpected value: " + codedFeature.getKnockoutType()); } } - public int getNumVariants() { - return variantIds.size(); + public int getNumIds() { + return ids.size(); } - public int getNumCompHetVariants() { - return compHetVariantIds.size(); + public int getNumCompHetIds() { + return compHetIds.size(); } - public int getNumHomVariants() { - return homVariantIds.size(); + public int getNumHomIds() { + return homIds.size(); } - public int getNumHetVariants() { - return hetVariantIds.size(); + public int getNumHetIds() { + return hetIds.size(); } - public int getNumDelOverlapVariants() { - return delOverlapVariantIds.size(); + public int getNumDelOverlapIds() { + return delOverlapIds.size(); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index 83f4f3ae5ec..a2863905c83 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -309,17 +309,51 @@ static KnockoutVariant convertToKnockoutVariant(Variant variant, SampleEntry sam return new KnockoutVariant(variant, studyEntry, fileEntry, sampleEntry, variantAnnotation, consequenceType, knockoutType); } - public static class CodedVariant { - // 1:2233232:A:T __ SNV __ COMP_HET __ VR_R __ A_J - private String variantId; + public static class CodedIndividual extends CodedFeature { + private int numParents; + + public CodedIndividual(String id, String type, String knockoutType, List consequenceTypeList, + String thousandGenomesPopFreq, String gnomadPopFreq, int numParents) { + super(id, type, knockoutType, consequenceTypeList, thousandGenomesPopFreq, gnomadPopFreq); + this.numParents = numParents; + } + + public static CodedIndividual parseEncodedId(String encodedId) throws RgaException { + String[] split = encodedId.split(SEPARATOR); + if (split.length != 6) { + throw new RgaException("Unexpected variant string received '" + encodedId + + "'. Expected {id}__{type}__{knockoutType}__{conseqType}__{popFreqs}__{numParents}"); + } + + Set consequenceType = new HashSet<>(Arrays.asList(split[3].split(INNER_SEPARATOR))); + String[] popFreqs = split[4].split(INNER_SEPARATOR); + + return new CodedIndividual(split[0], split[1], split[2], new ArrayList<>(consequenceType), popFreqs[0], popFreqs[1], + Integer.parseInt(split[5])); + } + + public String getEncodedId() { + return getId() + SEPARATOR + getType() + SEPARATOR + getKnockoutType() + SEPARATOR + + StringUtils.join(getConsequenceType(), INNER_SEPARATOR) + SEPARATOR + + StringUtils.join(getPopulationFrequencies(), INNER_SEPARATOR) + SEPARATOR + numParents; + } + + public int getNumParents() { + return numParents; + } + } + + public static class CodedFeature { + // id __ SNV __ COMP_HET __ VR_R __ A_J + private String id; private String type; private String knockoutType; private List populationFrequencies; private Set consequenceType; - public CodedVariant(String variantId, String type, String knockoutType, List consequenceTypeList, + public CodedFeature(String id, String type, String knockoutType, List consequenceTypeList, String thousandGenomesPopFreq, String gnomadPopFreq) { - this.variantId = variantId; + this.id = id; this.type = type; this.knockoutType = knockoutType; this.consequenceType = new HashSet<>(); @@ -329,28 +363,26 @@ public CodedVariant(String variantId, String type, String knockoutType, List(); - this.consequenceType.addAll(Arrays.asList(split[3].split(INNER_SEPARATOR))); - this.populationFrequencies = Arrays.asList(split[4].split(INNER_SEPARATOR)); + Set consequenceType = new HashSet<>(Arrays.asList(split[3].split(INNER_SEPARATOR))); + String[] popFreqs = split[4].split(INNER_SEPARATOR); + + return new CodedFeature(split[0], split[1], split[2], new ArrayList<>(consequenceType), popFreqs[0], popFreqs[1]); } - public String getFullVariant() { - return variantId + SEPARATOR + type + SEPARATOR + knockoutType + SEPARATOR + StringUtils.join(consequenceType, INNER_SEPARATOR) + public String getEncodedId() { + return id + SEPARATOR + type + SEPARATOR + knockoutType + SEPARATOR + StringUtils.join(consequenceType, INNER_SEPARATOR) + SEPARATOR + StringUtils.join(populationFrequencies, INNER_SEPARATOR); } - public String getVariantId() { - return variantId; + public String getId() { + return id; } public String getType() { diff --git a/opencga-clinical/src/main/resources/rga/managed-schema b/opencga-clinical/src/main/resources/rga/managed-schema index 3f814df7ddf..53309706f7c 100644 --- a/opencga-clinical/src/main/resources/rga/managed-schema +++ b/opencga-clinical/src/main/resources/rga/managed-schema @@ -590,10 +590,11 @@ - + + From 1e4a1857b5c8859969218d02cf4c0cb3374c272c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Tue, 27 Apr 2021 10:44:42 +0200 Subject: [PATCH 231/412] analysis: fix HS metrics analysis, #1739 --- .../alignment/qc/AlignmentFastQcMetricsAnalysis.java | 3 --- .../analysis/alignment/qc/AlignmentHsMetricsAnalysis.java | 8 +++++--- .../wrappers/picard/PicardWrapperAnalysisExecutor.java | 5 ++++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java index a2fa1ccce5c..9ad97f84950 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java @@ -17,15 +17,12 @@ package org.opencb.opencga.analysis.alignment.qc; import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; -import org.opencb.biodata.formats.alignment.samtools.io.SamtoolsFlagstatsParser; import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; import org.opencb.biodata.formats.sequence.fastqc.io.FastQcParser; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysisExecutor; -import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysisExecutor; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.alignment.AlignmentFastQcMetricsParams; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java index 77f38c64aff..edcc8250367 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java @@ -121,7 +121,8 @@ protected void run() throws ToolException { .execute(); if (!baitFile.exists()) { - throw new ToolException("Something wrong happened when running picard/BedToIntervalList"); + throw new ToolException("Something wrong happened when running picard/BedToIntervalList. Please, check the stderr file for" + + " more details."); } }); @@ -137,8 +138,9 @@ protected void run() throws ToolException { .setOutFile(hsMetricsFile.getName()) .execute(); - if (hsMetricsFile.exists()) { - throw new ToolException("Something wrong happened when running picard/CollectHsMetrics"); + if (!hsMetricsFile.exists()) { + throw new ToolException("Something wrong happened when running picard/CollectHsMetrics. Please, check the stderr file for" + + " more details."); } }); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java index 9f741cfd242..e86d2207215 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java @@ -76,7 +76,7 @@ private void runBedToIntervalList() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", getBamFile()), + List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", getBedFile()), new ImmutablePair<>("SD", getDictFile()))); Map mountMap = appendMounts(inputFilenames, sb); @@ -96,6 +96,7 @@ private void runBedToIntervalList() throws ToolException { appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + logger.info("Docker command line: " + sb.toString()); runCommandLine(sb.toString()); } @@ -123,6 +124,7 @@ private void runCollectWgsMetrics() throws ToolException { appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + logger.info("Docker command line: " + sb.toString()); runCommandLine(sb.toString()); } @@ -160,6 +162,7 @@ private void runCollectHsMetrics() throws ToolException { appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + logger.info("Docker command line: " + sb.toString()); runCommandLine(sb.toString()); } From 8468b48ca5a413f2d7cd4b0efb83af002307f855 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 27 Apr 2021 11:42:56 +0200 Subject: [PATCH 232/412] analysis: add new tests, #1693 --- .../org/opencb/opencga/analysis/rga/RgaManagerTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index a584f732b17..4ff80eb4c87 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -447,6 +447,15 @@ public void testVariantQueryPermissions() throws CatalogException, IOException, } } + result = rgaManager.variantQuery(STUDY, new Query(), QueryOptions.empty(), userToken); + assertEquals(10, result.getNumResults()); + + result = rgaManager.variantQuery(STUDY, new Query(), new QueryOptions(QueryOptions.SKIP, 10), userToken); + assertEquals(10, result.getNumResults()); + + result = rgaManager.variantQuery(STUDY, new Query(), new QueryOptions(QueryOptions.SKIP, 20), userToken); + assertEquals(10, result.getNumResults()); + result = rgaManager.variantQuery(STUDY, new Query(RgaQueryParams.VARIANTS.key(), Arrays.asList("15:41991315:A:T", "1:2441358:T:C", "1:59125683:C:T")), QueryOptions.empty(), userToken); assertEquals(3, result.getNumResults()); From 3892ebe649eb3a1f80b07d65f1bd217538438548 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 27 Apr 2021 16:07:34 +0200 Subject: [PATCH 233/412] analysis: don't get variants from variant storage in individual query --- .../analysis/rga/AbstractRgaConverter.java | 4 + .../analysis/rga/GeneRgaConverter.java | 2 + .../analysis/rga/IndividualRgaConverter.java | 27 +++--- .../opencga/analysis/rga/RgaManager.java | 82 ++++++++++--------- .../opencb/opencga/analysis/rga/RgaUtils.java | 47 +++++++++-- .../analysis/rga/VariantRgaConverter.java | 2 + 6 files changed, 107 insertions(+), 57 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java index ce14f79d723..b4738c1ddb3 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AbstractRgaConverter.java @@ -96,4 +96,8 @@ public int getNumIndividuals() { } } + public abstract List getIncludeFields(List includeFields); + + public abstract List getIncludeFromExcludeFields(List excludeFields); + } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java index fefa8729489..99f28eb69f5 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java @@ -153,6 +153,7 @@ public List convertToDataModelType(RgaIterator rgaIterator, V return new ArrayList<>(result.values()); } + @Override public List getIncludeFields(List includeFields) { Set toInclude = new HashSet<>(); for (String includeField : includeFields) { @@ -165,6 +166,7 @@ public List getIncludeFields(List includeFields) { return new ArrayList<>(toInclude); } + @Override public List getIncludeFromExcludeFields(List excludeFields) { Set excludedFields = new HashSet<>(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 40fd71d917d..f6e01ee667e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -55,19 +55,22 @@ public class IndividualRgaConverter extends AbstractRgaConverter { CONVERTER_MAP.put("genes.transcripts.strand", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); CONVERTER_MAP.put("genes.transcripts.variants.id", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("genes.transcripts.variants.filter", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS, RgaDataModel.VARIANTS)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("genes.transcripts.variants.type", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TYPES, RgaDataModel.VARIANTS)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TYPES, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("genes.transcripts.variants.knockoutType", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.KNOCKOUT_TYPES, RgaDataModel.VARIANTS)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.KNOCKOUT_TYPES, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("genes.transcripts.variants.populationFrequencies", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.POPULATION_FREQUENCIES, RgaDataModel.VARIANTS)); + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.POPULATION_FREQUENCIES, RgaDataModel.VARIANTS, + RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("genes.transcripts.variants.clinicalSignificance", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CLINICAL_SIGNIFICANCES, RgaDataModel.VARIANTS)); + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CLINICAL_SIGNIFICANCES, RgaDataModel.VARIANTS, + RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("genes.transcripts.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CONSEQUENCE_TYPES, RgaDataModel.VARIANTS)); + RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CONSEQUENCE_TYPES, RgaDataModel.VARIANTS, + RgaDataModel.VARIANT_SUMMARY)); logger = LoggerFactory.getLogger(IndividualRgaConverter.class); } @@ -75,16 +78,12 @@ public class IndividualRgaConverter extends AbstractRgaConverter { public IndividualRgaConverter() { } - public List convertToDataModelType(RgaIterator rgaIterator, VariantDBIterator variantDBIterator) { + public List convertToDataModelType(RgaIterator rgaIterator) { // In this list, we will store the keys of result in the order they have been processed so order is kept List knockoutByIndividualOrder = new LinkedList<>(); Map result = new HashMap<>(); - Map variantMap = new HashMap<>(); - while (variantDBIterator.hasNext()) { - Variant variant = variantDBIterator.next(); - variantMap.put(variant.getId(), variant); - } + Map variantMap = Collections.emptyMap(); while (rgaIterator.hasNext()) { RgaDataModel rgaDataModel = rgaIterator.next(); @@ -710,6 +709,7 @@ private List populateDisorders(List disorders) { return new ArrayList(disorderIds); } + @Override public List getIncludeFields(List includeFields) { Set toInclude = new HashSet<>(); for (String includeField : includeFields) { @@ -722,6 +722,7 @@ public List getIncludeFields(List includeFields) { return new ArrayList<>(toInclude); } + @Override public List getIncludeFromExcludeFields(List excludeFields) { Set excludedFields = new HashSet<>(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 3bd59781747..542101cbf29 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -133,29 +133,9 @@ public OpenCGAResult individualQuery(String studyStr, Quer throw e; } - Future variantFuture = executor.submit( - () -> variantStorageQuery(study.getFqn(), preprocess.getQuery().getAsStringList("sampleId"), preprocess.getQuery(), - options, token) - ); - - Future rgaIteratorFuture = executor.submit(() -> rgaEngine.individualQuery(collection, preprocess.getQuery(), - QueryOptions.empty())); - - VariantDBIterator variantDBIterator; - try { - variantDBIterator = variantFuture.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RgaException(e.getMessage(), e); - } + RgaIterator rgaIterator = rgaEngine.individualQuery(collection, preprocess.getQuery(), QueryOptions.empty()); - RgaIterator rgaIterator; - try { - rgaIterator = rgaIteratorFuture.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RgaException(e.getMessage(), e); - } - - List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(rgaIterator, variantDBIterator); + List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(rgaIterator); int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), knockoutByIndividuals.size(), knockoutByIndividuals, -1); @@ -281,19 +261,26 @@ public OpenCGAResult geneQuery(String studyStr, Query query, includeSampleIds = new HashSet<>((List) sampleResult.getResults()); } - Future variantFuture = executor.submit( - () -> variantStorageQuery(study.getFqn(), new ArrayList<>(includeSampleIds), auxQuery, options, token) - ); + Future variantFuture = null; + if (includeVariants(geneConverter, options)) { + variantFuture = executor.submit( + () -> variantStorageQuery(study.getFqn(), new ArrayList<>(includeSampleIds), auxQuery, options, token) + ); + } Future tmpResultFuture = executor.submit( () -> rgaEngine.geneQuery(collection, auxQuery, queryOptions) ); VariantDBIterator variantDBIterator; - try { - variantDBIterator = variantFuture.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RgaException(e.getMessage(), e); + if (variantFuture != null) { + try { + variantDBIterator = variantFuture.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + } else { + variantDBIterator = VariantDBIterator.EMPTY_ITERATOR; } RgaIterator rgaIterator; @@ -493,16 +480,18 @@ private VariantDBIterator variantStorageQuery(String study, List sampleI throws CatalogException, IOException, StorageEngineException, RgaException { String collection = getCollectionName(study); - DataResult result = rgaEngine.facetedQuery(collection, query, - new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS).append(QueryOptions.LIMIT, -1)); - if (result.getNumResults() == 0) { - return VariantDBIterator.EMPTY_ITERATOR; + List variantIds = query.getAsStringList(RgaDataModel.VARIANTS); + if (variantIds.isEmpty()) { + DataResult result = rgaEngine.facetedQuery(collection, query, + new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS).append(QueryOptions.LIMIT, -1)); + if (result.getNumResults() == 0) { + return VariantDBIterator.EMPTY_ITERATOR; + } + variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); } - List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - if (variantIds.size() > 500) { - // TODO: Batches - variantIds = variantIds.subList(0, 500); + if (variantIds.size() > RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT) { + throw new RgaException("Too many variants requested"); } Query variantQuery = new Query(VariantQueryParam.ID.key(), variantIds) @@ -1341,4 +1330,23 @@ public void close() throws Exception { rgaEngine.close(); } + private boolean includeVariants(AbstractRgaConverter converter, QueryOptions queryOptions) { + if (queryOptions.containsKey(QueryOptions.INCLUDE)) { + for (String include : converter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { + if (include.contains("variant")) { + return true; + } + } + return false; + } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { + for (String include : converter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { + if (include.contains("variant")) { + return true; + } + } + return false; + } + return true; + } + } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index a2863905c83..ede874cfdd4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -4,14 +4,13 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; -import org.opencb.biodata.models.variant.avro.ConsequenceType; -import org.opencb.biodata.models.variant.avro.FileEntry; -import org.opencb.biodata.models.variant.avro.SampleEntry; -import org.opencb.biodata.models.variant.avro.VariantAnnotation; +import org.opencb.biodata.models.variant.avro.*; import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.storage.core.variant.query.KeyOpValue; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.*; import java.util.regex.Matcher; @@ -41,7 +40,11 @@ class RgaUtils { public static final Set ALL_PARAMS; public static final Map> PARAM_TYPES; + private static final Logger logger; + static { + logger = LoggerFactory.getLogger(RgaUtils.class); + ENCODE_MAP = new HashMap<>(); // KNOCKOUT TYPE @@ -273,7 +276,10 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, for (int i = 0; i < rgaDataModel.getVariants().size(); i++) { String variantId = rgaDataModel.getVariants().get(i); - if (variantMap.containsKey(variantId) && (variantIds.isEmpty() || variantIds.contains(variantId))) { + if (variantIds.isEmpty() || variantIds.contains(variantId)) { + KnockoutVariant knockoutVariant; + + if (variantMap.containsKey(variantId)) { Variant variant = variantMap.get(variantId); SampleEntry sampleEntry = variant.getStudies().get(0).getSample(rgaDataModel.getSampleId()); @@ -283,8 +289,35 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, } // Convert just once - KnockoutVariant knockoutVariant = convertToKnockoutVariant(variant, sampleEntry, knockoutType); - + knockoutVariant = convertToKnockoutVariant(variant, sampleEntry, knockoutType); + } else if (CollectionUtils.isNotEmpty(rgaDataModel.getVariantSummary())) { + String variantSummaryId = rgaDataModel.getVariantSummary().get(i); + // Get the basic information from variant summary object + try { + CodedFeature codedFeature = CodedFeature.parseEncodedId(variantSummaryId); + Variant variant = new Variant(variantId); + + knockoutVariant = new KnockoutVariant() + .setId(codedFeature.getId()) + .setKnockoutType(KnockoutVariant.KnockoutType.valueOf(codedFeature.getKnockoutType())) + .setType(VariantType.valueOf(codedFeature.getType())) + .setChromosome(variant.getChromosome()) + .setStart(variant.getStart()) + .setEnd(variant.getEnd()) + .setLength(variant.getLength()); + } catch (RgaException e) { + logger.warn("Could not parse coded variant {}", variantSummaryId, e); + knockoutVariant = new KnockoutVariant().setId(variantId); + } + } else { + Variant variant = new Variant(variantId); + knockoutVariant = new KnockoutVariant() + .setId(variantId) + .setChromosome(variant.getChromosome()) + .setStart(variant.getStart()) + .setEnd(variant.getEnd()) + .setLength(variant.getLength()); + } knockoutVariantList.add(knockoutVariant); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java index ad9a593e1c6..31da85726f8 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java @@ -225,6 +225,7 @@ public List convertToDataModelType(RgaIterator rgaIterator, V return knockoutVariantList; } + @Override public List getIncludeFields(List includeFields) { Set toInclude = new HashSet<>(); for (String includeField : includeFields) { @@ -237,6 +238,7 @@ public List getIncludeFields(List includeFields) { return new ArrayList<>(toInclude); } + @Override public List getIncludeFromExcludeFields(List excludeFields) { Set excludedFields = new HashSet<>(); From 0fdef56e5c79e797554fae0fe93b128c199a98fc Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 27 Apr 2021 16:12:22 +0200 Subject: [PATCH 234/412] analysis: don't retrieve variants from variant storage in gene query --- .../analysis/rga/GeneRgaConverter.java | 37 +++++++++---------- .../opencga/analysis/rga/RgaManager.java | 33 ++--------------- 2 files changed, 21 insertions(+), 49 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java index 99f28eb69f5..bfc61a2fab2 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/GeneRgaConverter.java @@ -7,7 +7,6 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; -import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.slf4j.LoggerFactory; import java.util.*; @@ -51,23 +50,27 @@ public class GeneRgaConverter extends AbstractRgaConverter { CONVERTER_MAP.put("individuals.transcripts.strand", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); CONVERTER_MAP.put("individuals.transcripts.variants.id", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("individuals.transcripts.variants.genotype", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("individuals.transcripts.variants.filter", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.FILTERS)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.FILTERS, RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("individuals.transcripts.variants.qual", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("individuals.transcripts.variants.type", Arrays.asList(RgaDataModel.GENE_ID, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.TYPES)); + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.TYPES, RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("individuals.transcripts.variants.knockoutType", Arrays.asList(RgaDataModel.GENE_ID, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.KNOCKOUT_TYPES)); + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.KNOCKOUT_TYPES, + RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("individuals.transcripts.variants.populationFrequencies", Arrays.asList(RgaDataModel.GENE_ID, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.POPULATION_FREQUENCIES)); + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.POPULATION_FREQUENCIES, + RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("individuals.transcripts.variants.clinicalSignificance", Arrays.asList(RgaDataModel.GENE_ID, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.CLINICAL_SIGNIFICANCES)); + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.CLINICAL_SIGNIFICANCES, + RgaDataModel.VARIANT_SUMMARY)); CONVERTER_MAP.put("individuals.transcripts.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.GENE_ID, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.CONSEQUENCE_TYPES)); + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS, RgaDataModel.CONSEQUENCE_TYPES, + RgaDataModel.VARIANT_SUMMARY)); logger = LoggerFactory.getLogger(GeneRgaConverter.class); } @@ -75,17 +78,13 @@ public class GeneRgaConverter extends AbstractRgaConverter { public GeneRgaConverter() { } - public List convertToDataModelType(RgaIterator rgaIterator, VariantDBIterator variantDBIterator) { - return convertToDataModelType(rgaIterator, variantDBIterator, Collections.emptyList(), 0, RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT); + public List convertToDataModelType(RgaIterator rgaIterator) { + return convertToDataModelType(rgaIterator, Collections.emptyList(), 0, RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT); } - public List convertToDataModelType(RgaIterator rgaIterator, VariantDBIterator variantDBIterator, - List includeIndividuals, int skipIndividuals, int limitIndividuals) { - Map variantMap = new HashMap<>(); - while (variantDBIterator.hasNext()) { - Variant variant = variantDBIterator.next(); - variantMap.put(variant.getId(), variant); - } + public List convertToDataModelType(RgaIterator rgaIterator, List includeIndividuals, int skipIndividuals, + int limitIndividuals) { + Map variantMap = Collections.emptyMap(); Map geneIndividualMap = new HashMap<>(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 542101cbf29..fd2bb92c2f9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -261,41 +261,14 @@ public OpenCGAResult geneQuery(String studyStr, Query query, includeSampleIds = new HashSet<>((List) sampleResult.getResults()); } - Future variantFuture = null; - if (includeVariants(geneConverter, options)) { - variantFuture = executor.submit( - () -> variantStorageQuery(study.getFqn(), new ArrayList<>(includeSampleIds), auxQuery, options, token) - ); - } - - Future tmpResultFuture = executor.submit( - () -> rgaEngine.geneQuery(collection, auxQuery, queryOptions) - ); - - VariantDBIterator variantDBIterator; - if (variantFuture != null) { - try { - variantDBIterator = variantFuture.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RgaException(e.getMessage(), e); - } - } else { - variantDBIterator = VariantDBIterator.EMPTY_ITERATOR; - } - - RgaIterator rgaIterator; - try { - rgaIterator = tmpResultFuture.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RgaException(e.getMessage(), e); - } + RgaIterator rgaIterator = rgaEngine.geneQuery(collection, auxQuery, queryOptions); int skipIndividuals = queryOptions.getInt(RgaQueryParams.SKIP_INDIVIDUAL); int limitIndividuals = queryOptions.getInt(RgaQueryParams.LIMIT_INDIVIDUAL, RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT); // 4. Solr gene query - List knockoutResultList = geneConverter.convertToDataModelType(rgaIterator, variantDBIterator, - includeIndividuals, skipIndividuals, limitIndividuals); + List knockoutResultList = geneConverter.convertToDataModelType(rgaIterator, includeIndividuals, skipIndividuals, + limitIndividuals); int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); OpenCGAResult knockoutResult = new OpenCGAResult<>(time, Collections.emptyList(), knockoutResultList.size(), knockoutResultList, -1); From d9dd6e5a7869d0cb9d478c560e551debe0591437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 27 Apr 2021 16:55:31 +0100 Subject: [PATCH 235/412] client: Remove catalog dependency --- .../analysis/variant/manager/VariantStorageManager.java | 2 +- .../org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java | 2 +- .../opencga/catalog/db/mongodb/AuditMongoDBAdaptor.java | 2 +- .../org/opencb/opencga/catalog/managers/AdminManager.java | 2 +- .../org/opencb/opencga/catalog/managers/AuditManager.java | 2 +- .../opencga/catalog/managers/ClinicalAnalysisManager.java | 2 +- .../org/opencb/opencga/catalog/managers/CohortManager.java | 2 +- .../org/opencb/opencga/catalog/managers/FamilyManager.java | 2 +- .../org/opencb/opencga/catalog/managers/FileManager.java | 2 +- .../opencb/opencga/catalog/managers/IndividualManager.java | 2 +- .../opencga/catalog/managers/InterpretationManager.java | 2 +- .../java/org/opencb/opencga/catalog/managers/JobManager.java | 2 +- .../org/opencb/opencga/catalog/managers/PanelManager.java | 2 +- .../org/opencb/opencga/catalog/managers/ProjectManager.java | 2 +- .../org/opencb/opencga/catalog/managers/ResourceManager.java | 2 +- .../org/opencb/opencga/catalog/managers/SampleManager.java | 2 +- .../org/opencb/opencga/catalog/managers/StudyManager.java | 2 +- .../org/opencb/opencga/catalog/managers/UserManager.java | 2 +- .../opencga/catalog/db/mongodb/AuditMongoDBAdaptorTest.java | 4 +--- opencga-client/pom.xml | 5 ----- .../org/opencb/opencga/client/rest/clients/StudyClient.java | 2 +- .../org/opencb/opencga/core/models}/audit/AuditRecord.java | 2 +- .../java/org/opencb/opencga/server/rest/StudyWSServer.java | 2 +- 23 files changed, 22 insertions(+), 29 deletions(-) rename {opencga-catalog/src/main/java/org/opencb/opencga/catalog => opencga-core/src/main/java/org/opencb/opencga/core/models}/audit/AuditRecord.java (99%) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java index ef7ebd90667..98b2ec96bd2 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java @@ -42,7 +42,7 @@ import org.opencb.opencga.analysis.variant.metadata.CatalogVariantMetadataFactory; import org.opencb.opencga.analysis.variant.operations.*; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.db.api.*; import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogException; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java index dd208b95520..75f687b6a72 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java @@ -20,7 +20,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.core.response.OpenCGAResult; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptor.java index 2a0e356732c..619dadf3c1c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptor.java @@ -23,7 +23,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.mongodb.MongoDBCollection; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.db.api.AuditDBAdaptor; import org.opencb.opencga.catalog.db.mongodb.converters.OpenCgaMongoConverter; import org.opencb.opencga.catalog.exceptions.CatalogDBException; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java index c1c7ce27887..3bffa773511 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java @@ -3,7 +3,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.UserDBAdaptor; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AuditManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AuditManager.java index a123dc7a91e..1f0a9ae40c6 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AuditManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AuditManager.java @@ -20,7 +20,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.AuditDBAdaptor; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java index ce35dc9afdb..9362882d2ee 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java @@ -29,7 +29,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java index a600d3293df..e9a47d0df68 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java @@ -24,7 +24,7 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java index 525bc7f452a..5fa7ca4c4fe 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java @@ -30,7 +30,7 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java index 52ea8ee7ea1..abf83aa2ed4 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java @@ -27,7 +27,7 @@ import org.opencb.commons.utils.CollectionUtils; import org.opencb.commons.utils.FileUtils; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.DBIterator; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java index b4b1b48e692..550d86c2edb 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java @@ -22,7 +22,7 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java index e3c0a01a5d2..56c6c49073b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java @@ -30,7 +30,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.ClinicalAnalysisDBAdaptor; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java index 518a2e63aae..5bb5b56ab14 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java @@ -23,7 +23,7 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java index 7ca4f43a3c1..70ff22f13cf 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java @@ -24,7 +24,7 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java index f8d8cd3a5b9..fff3cc80173 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java @@ -24,7 +24,7 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ResourceManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ResourceManager.java index f845a98b940..eb2bae8c009 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ResourceManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ResourceManager.java @@ -22,7 +22,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.DBIterator; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java index 4edf4b3527f..65ab325c54b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java @@ -25,7 +25,7 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java index c58beb0d067..b973bcf7301 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java @@ -25,7 +25,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java index e6ef7156a00..3525b37c361 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java @@ -23,7 +23,7 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authentication.AuthenticationManager; import org.opencb.opencga.catalog.auth.authentication.AzureADAuthenticationManager; import org.opencb.opencga.catalog.auth.authentication.CatalogAuthenticationManager; diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptorTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptorTest.java index d644b056555..f5fc22611a0 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptorTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/AuditMongoDBAdaptorTest.java @@ -24,15 +24,13 @@ import org.opencb.commons.datastore.mongodb.MongoDBConfiguration; import org.opencb.commons.datastore.mongodb.MongoDataStore; import org.opencb.commons.datastore.mongodb.MongoDataStoreManager; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.db.api.AuditDBAdaptor; import org.opencb.opencga.catalog.utils.UuidUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.common.Enums; -import java.util.Collections; - /** * Created on 18/08/15 * diff --git a/opencga-client/pom.xml b/opencga-client/pom.xml index ad40a10847b..e084210ad06 100644 --- a/opencga-client/pom.xml +++ b/opencga-client/pom.xml @@ -72,11 +72,6 @@ test-jar ${opencga.version}
- - org.opencb.opencga - opencga-catalog - ${opencga.version} - org.opencb.opencga opencga-server diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java index 412f21aace6..d23cb6fbb8f 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java @@ -18,10 +18,10 @@ import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.catalog.audit.AuditRecord; import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.study.CustomGroup; import org.opencb.opencga.core.models.study.Group; import org.opencb.opencga.core.models.study.GroupCreateParams; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditRecord.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/audit/AuditRecord.java similarity index 99% rename from opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditRecord.java rename to opencga-core/src/main/java/org/opencb/opencga/core/models/audit/AuditRecord.java index 8d5088f2e8d..312e1f32e87 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/audit/AuditRecord.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/audit/AuditRecord.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.opencb.opencga.catalog.audit; +package org.opencb.opencga.core.models.audit; import org.opencb.commons.datastore.core.ObjectMap; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java index 669b764fe2e..ce2d0ad68ea 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java @@ -22,7 +22,7 @@ import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.catalog.audit.AuditRecord; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.db.api.StudyDBAdaptor; import org.opencb.opencga.catalog.managers.StudyManager; import org.opencb.opencga.catalog.utils.Constants; From 35905fa302e475d51779a10121d38fcc5e564434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 27 Apr 2021 17:29:36 +0100 Subject: [PATCH 236/412] storage: Remove redundant method at SampleIndexConfiguration #1699 --- .../opencga/core/config/storage/SampleIndexConfiguration.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java index 4bf10855f54..54d2aed0198 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java @@ -207,10 +207,6 @@ public SampleIndexConfiguration addPopulationRange(SampleIndexConfiguration.Popu return this; } - public List getFileIndexFieldsConfiguration() { - return fileIndexConfiguration.getCustomFields(); - } - public FileIndexConfiguration getFileIndexConfiguration() { return fileIndexConfiguration; } From 63f048417b23973bba2c10e7920ab1a2a802b0a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 28 Apr 2021 10:04:17 +0200 Subject: [PATCH 237/412] analysis: improve samtools and picard wrappers --- .../opencga/analysis/AnalysisUtils.java | 14 + .../alignment/AlignmentStorageManager.java | 103 +-- .../qc/AlignmentHsMetricsAnalysis.java | 4 +- .../alignment/qc/AlignmentStatsAnalysis.java | 6 + .../wrappers/OpenCgaWrapperAnalysis.java | 1 + .../DockerWrapperAnalysisExecutor.java | 11 +- .../OpenCgaWrapperAnalysisExecutor.java | 1 + .../picard/PicardWrapperAnalysis.java | 104 ++- .../picard/PicardWrapperAnalysisExecutor.java | 16 +- .../samtools/SamtoolsWrapperAnalysis.java | 697 +++++------------- .../wrappers/WrapperAnalysisTest.java | 360 --------- .../SamtoolsWrapperAnalysisExecutorTest.java | 83 --- .../executors/AlignmentCommandExecutor.java | 60 +- .../options/AlignmentCommandOptions.java | 28 +- .../analysis/AlignmentCommandExecutor.java | 9 +- .../app/cli/analysis/InternalMainTest.java | 38 +- .../opencga/core/api/ParamConstants.java | 9 +- .../models/alignment/PicardWrapperParams.java | 89 ++- 18 files changed, 488 insertions(+), 1145 deletions(-) delete mode 100644 opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/WrapperAnalysisTest.java delete mode 100644 opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/executors/SamtoolsWrapperAnalysisExecutorTest.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/AnalysisUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/AnalysisUtils.java index ce20ed8de78..e31e40c7f45 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/AnalysisUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/AnalysisUtils.java @@ -9,8 +9,22 @@ import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.response.OpenCGAResult; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMANDS_SUPPORTED; + public class AnalysisUtils { + public static boolean isSupportedCommand(String commands) { + Set commandSet = new HashSet<>(Arrays.asList(commands.replace(" ", "").split(","))); + if (!commandSet.contains(commands)) { + return true; + } + return false; + } + public static File getBamFileBySampleId(String sampleId, String studyId, FileManager fileManager, String token) throws ToolException { // Look for the bam file for each sample OpenCGAResult fileQueryResult; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java index 4627a3d12fa..8717b7f97d9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java @@ -17,10 +17,8 @@ package org.opencb.opencga.analysis.alignment; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.ga4gh.models.ReadAlignment; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; import org.opencb.biodata.models.alignment.*; import org.opencb.biodata.models.core.Exon; import org.opencb.biodata.models.core.Gene; @@ -34,19 +32,21 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.FileUtils; import org.opencb.opencga.analysis.StorageManager; +import org.opencb.opencga.analysis.alignment.qc.AlignmentFlagStatsAnalysis; +import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.models.FileInfo; import org.opencb.opencga.analysis.models.StudyInfo; import org.opencb.opencga.analysis.wrappers.DeeptoolsWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.catalog.utils.ParamUtils; -import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.common.AnnotationSet; +import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; +import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; +import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.study.Study; @@ -64,7 +64,6 @@ import java.util.*; import static org.opencb.opencga.core.api.ParamConstants.*; -import static org.opencb.opencga.storage.core.alignment.AlignmentStorageEngine.ALIGNMENT_STATS_VARIABLE_SET; /** * Created by pfurio on 31/10/16. @@ -153,84 +152,26 @@ public AlignmentIterator iterator(String studyIdStr, String fileIdStr, Qu //------------------------------------------------------------------------- public void statsRun(String study, String inputFile, String outdir, String token) throws ToolException { -// ObjectMap params = new ObjectMap(); -// -// AlignmentStatsAnalysis analysis = new AlignmentStatsAnalysis(); -// analysis.setUp(null, catalogManager, storageEngineFactory, params, Paths.get(outdir), jobId, token); -// -// analysis.setStudy(study) -// .setFile(inputFile) -// .start(); -// -// params.put(SamtoolsWrapperAnalysis.INDEX_STATS_PARAM, true); -// -// // Filter flag: -// // - not primary alignment (0x100) -// // - read fails platform/vendor quality checks (0x200) -// // - supplementary alignment (0x800) -// params.put("F", "0xB00"); -// -// SamtoolsWrapperAnalysis samtools = new SamtoolsWrapperAnalysis(); -// samtools.setUp(null, catalogManager, storageEngineFactory, params, Paths.get(outdir), jobId, token); -// -// samtools.setStudy(study); -// samtools.setCommand("stats") -// .setInputFile(inputFile) -// .setOutputFilename(Paths.get(inputFile).getFileName() + ".stats.txt"); -// -// samtools.start(); - } - - public void flagStatsRun(String study, String inputFile, String outdir, String token) throws ToolException { - ObjectMap params = new ObjectMap(); - params.put(SamtoolsWrapperAnalysis.INDEX_STATS_PARAM, true); - - SamtoolsWrapperAnalysis samtools = new SamtoolsWrapperAnalysis(); - samtools.setUp(null, catalogManager, storageEngineFactory, params, Paths.get(outdir), jobId, token); - - samtools.setStudy(study); - samtools.setCommand("flagstats") - .setInputFile(inputFile) - .setOutputFilename(Paths.get(inputFile).getFileName() + ".flagstats.txt"); - - samtools.start(); - } - - //------------------------------------------------------------------------- + Map params = new AlignmentStatsParams(inputFile, null).toParams(new ObjectMap(ParamConstants.STUDY_PARAM, study)); - public OpenCGAResult statsInfo(String study, String inputFile, String token) throws ToolException, CatalogException { - OpenCGAResult fileResult; - fileResult = catalogManager.getFileManager().get(study, inputFile, QueryOptions.empty(), token); - - if (fileResult.getNumResults() == 1) { - for (AnnotationSet annotationSet : fileResult.getResults().get(0).getAnnotationSets()) { - if ("opencga_alignment_stats".equals(annotationSet.getId())) { - StopWatch watch = StopWatch.createStarted(); - SamtoolsStats stats = JacksonUtils.getDefaultObjectMapper().convertValue(annotationSet.getAnnotations(), - SamtoolsStats.class); - watch.stop(); - return new OpenCGAResult<>(((int) watch.getTime()), Collections.emptyList(), 1, Collections.singletonList(stats), 1); - } - } - throw new ToolException("Alignment stats not computed for " + inputFile); - } else { - throw new ToolException("Error accessing to the file: " + inputFile); + try { + catalogManager.getJobManager().submit(study, AlignmentStatsAnalysis.ID, Enums.Priority.MEDIUM, params, null, "Job generated by " + + " AlignmentStorageManager/statsRun", Collections.emptyList(), Collections.emptyList(), token); + } catch (CatalogException e) { + throw new ToolException(e); } } - //------------------------------------------------------------------------- - - public OpenCGAResult statsQuery(String study, Query query, QueryOptions queryOptions, String token) throws CatalogException { - Query searchQuery = new Query(); - List filters = new ArrayList<>(); - query.keySet().forEach(k -> { - if (statsMap.containsKey(k)) { - filters.add(ALIGNMENT_STATS_VARIABLE_SET + ":" + statsMap.get(k) + query.get(k)); - } - }); - searchQuery.put(Constants.ANNOTATION, StringUtils.join(filters, ";")); - - return catalogManager.getFileManager().search(study, searchQuery, queryOptions, token); + public void flagStatsRun(String study, String inputFile, String outdir, String token) throws ToolException { + Map params = new AlignmentFlagStatsParams(inputFile, null).toParams(new ObjectMap(ParamConstants.STUDY_PARAM, + study)); + + try { + catalogManager.getJobManager().submit(study, AlignmentFlagStatsAnalysis.ID, Enums.Priority.MEDIUM, params, null, + "Job generated by AlignmentStorageManager/flagStatsRun", Collections.emptyList(), Collections.emptyList(), token); + } catch (CatalogException e) { + throw new ToolException(e); + } } //------------------------------------------------------------------------- diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java index edcc8250367..df17e107867 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java @@ -117,7 +117,7 @@ protected void run() throws ToolException { .setCommand("BedToIntervalList") .setBedFile(catalogBedFile.getUri().getPath()) .setDictFile(catalogDictFile.getUri().getPath()) - .setOutFile(baitFile.getName()) + .setOutFilename(baitFile.getName()) .execute(); if (!baitFile.exists()) { @@ -135,7 +135,7 @@ protected void run() throws ToolException { // .setRefSeqFile(catalogRefSeqFile.getUri().getPath()) .setBaitIntervalsFile(baitFile.getAbsolutePath()) .setTargetIntervalsFile(baitFile.getAbsolutePath()) - .setOutFile(hsMetricsFile.getName()) + .setOutFilename(hsMetricsFile.getName()) .execute(); if (!hsMetricsFile.exists()) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java index da28e9d7733..c5051904f0d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java @@ -102,6 +102,12 @@ protected void run() throws ToolException { step(SAMTOOLS_STATS_STEP, () -> { executorParams.put(EXECUTOR_ID, SamtoolsWrapperAnalysisExecutor.ID); + // Filter flag: + // - not primary alignment (0x100) + // - read fails platform/vendor quality checks (0x200) + // - supplementary alignment (0x800) + executorParams.put("F", "0xB00"); + getToolExecutor(SamtoolsWrapperAnalysisExecutor.class) .setCommand("stats") .setInputFile(catalogBamFile.getUri().getPath()) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java index 3bfed8ca9ea..670670f6ce1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java @@ -29,6 +29,7 @@ import java.util.HashMap; import java.util.Map; +@Deprecated public abstract class OpenCgaWrapperAnalysis extends OpenCgaTool { public final String DOCKER_IMAGE_VERSION_PARAM = "DOCKER_IMAGE_VERSION"; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java index ea723fa95d0..8cc9da3636c 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java @@ -10,18 +10,17 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; + +import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMANDS_SUPPORTED; public abstract class DockerWrapperAnalysisExecutor extends OpenCgaToolExecutor { public final static String DOCKER_INPUT_PATH = "/data/input"; public final static String DOCKER_OUTPUT_PATH = "/data/output"; - public static final String STDOUT_FILENAME = "executor.stdout.txt"; - public static final String STDERR_FILENAME = "executor.stderr.txt"; + public static final String STDOUT_FILENAME = "stdout.txt"; + public static final String STDERR_FILENAME = "stderr.txt"; public abstract String getDockerImageName(); public abstract String getDockerImageVersion(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/OpenCgaWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/OpenCgaWrapperAnalysisExecutor.java index 3c76b0f90e1..7a4df5901e4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/OpenCgaWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/OpenCgaWrapperAnalysisExecutor.java @@ -17,6 +17,7 @@ import java.util.Map; import java.util.Set; +@Deprecated public abstract class OpenCgaWrapperAnalysisExecutor extends OpenCgaToolExecutor { public final String DOCKER_IMAGE_VERSION_PARAM = "DOCKER_IMAGE_VERSION"; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java index fbb5ae8f96a..3275ec3697e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java @@ -16,66 +16,94 @@ package org.opencb.opencga.analysis.wrappers.picard; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.catalog.managers.FileManager; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.PicardWrapperParams; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; -@Tool(id = PicardWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, - description = "") -public class PicardWrapperAnalysis extends OpenCgaWrapperAnalysis { +import static org.opencb.opencga.core.api.ParamConstants.PICARD_COMMANDS_SUPPORTED; +import static org.opencb.opencga.core.api.ParamConstants.PICARD_COMMAND_DESCRIPTION; + +@Tool(id = PicardWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = PicardWrapperAnalysis.DESCRIPTION) +public class PicardWrapperAnalysis extends OpenCgaToolScopeStudy { public final static String ID = "picard"; public final static String DESCRIPTION = "Picard is a set of command line tools (in Java) for manipulating high-throughput sequencing" - + " (HTS) data and formats such as SAM/BAM/CRAM and VCF."; + + " (HTS) data and formats such as SAM/BAM/CRAM and VCF. " + PICARD_COMMAND_DESCRIPTION; + + @ToolParams + protected final PicardWrapperParams analysisParams = new PicardWrapperParams(); - private String command; + private String bamFilePath = null; + private String bedFilePath = null; + private String baitIntervalsFilePath = null; + private String targetIntervalsFilePath = null; + private String dictFilePath = null; + private String refSeqFilePath = null; protected void check() throws Exception { super.check(); - if (StringUtils.isEmpty(command)) { + if (StringUtils.isEmpty(analysisParams.getCommand())) { throw new ToolException("Missig Picard command."); } - switch (command) { - case "CollectHsMetrics": - case "CollectWgsMetrics": - case "BedToIntervalList": - break; - default: - throw new ToolException("Picard tool name '" + command + "' is not available. Supported tools: CollectHsMetrics," - + " CollectWgsMetrics, BedToIntervalList"); + if (!AnalysisUtils.isSupportedCommand(PICARD_COMMANDS_SUPPORTED)) { + throw new ToolException("Picard command '" + analysisParams.getCommand() + "' is not available. Supported commands are " + + PICARD_COMMANDS_SUPPORTED); + } + + // Get files from catalog + FileManager fileManager = catalogManager.getFileManager(); + if (StringUtils.isNotEmpty(analysisParams.getBamFile())) { + bamFilePath = AnalysisUtils.getCatalogFile(analysisParams.getBamFile(), study, fileManager, token).getUri().getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getBedFile())) { + bedFilePath = AnalysisUtils.getCatalogFile(analysisParams.getBedFile(), study, fileManager, token).getUri().getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getBaitIntervalsFile())) { + baitIntervalsFilePath = AnalysisUtils.getCatalogFile(analysisParams.getBaitIntervalsFile(), study, fileManager, token).getUri() + .getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getTargetIntervalsFile())) { + targetIntervalsFilePath = AnalysisUtils.getCatalogFile(analysisParams.getTargetIntervalsFile(), study, fileManager, + token).getUri().getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getDictFile())) { + dictFilePath = AnalysisUtils.getCatalogFile(analysisParams.getDictFile(), study, fileManager, token) + .getUri().getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getRefSeqFile())) { + refSeqFilePath = AnalysisUtils.getCatalogFile(analysisParams.getRefSeqFile(), study, fileManager, token) + .getUri().getPath(); } } @Override protected void run() throws Exception { + setUpStorageEngineExecutor(study); - throw new ToolException("Not yet implemented!!"); -// step(() -> { -// PicardWrapperAnalysisExecutor executor = new PicardWrapperAnalysisExecutor(getStudy(), params, getOutDir(), -// getScratchDir(), catalogManager, token); -// -// executor.setCommand(command); -// executor.run(); -// } -// ); - } - -// @Override -// public String getDockerImageName() { -// return PICARD_DOCKER_IMAGE; -// } - - - public String getCommand() { - return command; - } + step(() -> { + if (MapUtils.isNotEmpty(analysisParams.getPicardParams())) { + executorParams.appendAll(analysisParams.getPicardParams()); + } - public PicardWrapperAnalysis setCommand(String command) { - this.command = command; - return this; + getToolExecutor(PicardWrapperAnalysisExecutor.class) + .setCommand(analysisParams.getCommand()) + .setBamFile(bamFilePath) + .setBedFile(bedFilePath) + .setBaitIntervalsFile(baitIntervalsFilePath) + .setTargetIntervalsFile(targetIntervalsFilePath) + .setDictFile(dictFilePath) + .setRefSeqFile(refSeqFilePath) + .setOutFilename(analysisParams.getOutFilename()) + .execute(); + }); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java index e86d2207215..3febd427e8f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java @@ -26,7 +26,7 @@ public class PicardWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor private String targetIntervalsFile; private String dictFile; private String refSeqFile; - private String outFile; + private String outFilename; private Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -88,7 +88,7 @@ private void runBedToIntervalList() throws ToolException { appendInputFiles(inputFilenames, mountMap, sb); // Append output file params - List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", getOutFile()))); + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", getOutFilename()))); appendOutputFiles(outputFilenames, sb); // Append other params @@ -116,7 +116,7 @@ private void runCollectWgsMetrics() throws ToolException { appendInputFiles(inputFilenames, mountMap, sb); // Append output file params - List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", getOutFile()))); + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", getOutFilename()))); appendOutputFiles(outputFilenames, sb); // Append other params @@ -139,7 +139,7 @@ private void runCollectHsMetrics() throws ToolException { // Prepare output files List> outputFilenames = new ArrayList<>(Arrays.asList( - new ImmutablePair<>("O", getOutFile()) + new ImmutablePair<>("O", getOutFilename()) )); StringBuilder sb = initCommandLine(); @@ -238,12 +238,12 @@ public PicardWrapperAnalysisExecutor setRefSeqFile(String refSeqFile) { return this; } - public String getOutFile() { - return outFile; + public String getOutFilename() { + return outFilename; } - public PicardWrapperAnalysisExecutor setOutFile(String outFile) { - this.outFile = outFile; + public PicardWrapperAnalysisExecutor setOutFilename(String outFilename) { + this.outFilename = outFilename; return this; } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java index bc38d9510ff..bb7fd335a79 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java @@ -17,445 +17,116 @@ package org.opencb.opencga.analysis.wrappers.samtools; import com.google.common.base.CaseFormat; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; -import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis; -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.core.common.GitRepositoryState; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.catalog.managers.FileManager; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.common.AnnotationSet; +import org.opencb.opencga.core.models.alignment.SamtoolsWrapperParams; import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.file.FileUpdateParams; -import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; -import java.io.File; import java.io.IOException; import java.nio.charset.Charset; -import java.nio.file.Paths; -import java.util.Collections; import java.util.HashMap; import java.util.Map; -import static org.apache.commons.io.FileUtils.readLines; -import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMANDS; -import static org.opencb.opencga.storage.core.alignment.AlignmentStorageEngine.ALIGNMENT_STATS_VARIABLE_SET; +import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMANDS_SUPPORTED; +import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMAND_DESCRIPTION; @Tool(id = SamtoolsWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = SamtoolsWrapperAnalysis.DESCRIPTION) -public class SamtoolsWrapperAnalysis extends OpenCgaWrapperAnalysis { +public class SamtoolsWrapperAnalysis extends OpenCgaToolScopeStudy { public final static String ID = "samtools"; public final static String DESCRIPTION = "Samtools is a program for interacting with high-throughput sequencing data in SAM, BAM" - + " and CRAM formats."; + + " and CRAM formats. " + SAMTOOLS_COMMAND_DESCRIPTION; - public static final String INDEX_STATS_PARAM = "stats-index"; + @ToolParams + protected final SamtoolsWrapperParams analysisParams = new SamtoolsWrapperParams(); - private String command; - private String inputFile; - private String outputFilename; - private String referenceFile; - private String readGroupFile; - private String bedFile; - private String refSeqFile; - private String referenceNamesFile; - private String targetRegionFile; - private String readsNotSelectedFilename; - - private File outputFile; - private org.opencb.opencga.core.models.file.File inputCatalogFile; + private String bamFilePath = null; + private String bedFilePath = null; + private String readGroupFilePath = null; + private String readsNotSelectedFilenamePath = null; + private String referenceFilePath = null; + private String referenceNamesFilePath = null; + private String refSeqFilePath = null; protected void check() throws Exception { super.check(); - OpenCGAResult fileResult; - try { - fileResult = catalogManager.getFileManager().get(getStudy(), inputFile, QueryOptions.empty(), token); - } catch (CatalogException e) { - throw new ToolException("Error accessing file '" + inputFile + "' of the study " + getStudy() + "'", e); - } - if (fileResult.getNumResults() <= 0) { - throw new ToolException("File '" + inputFile + "' not found in study '" + getStudy() + "'"); + if (StringUtils.isEmpty(analysisParams.getCommand())) { + throw new ToolException("Missing samtools command."); } - inputCatalogFile = fileResult.getResults().get(0); - if (StringUtils.isEmpty(command)) { - throw new ToolException("Missing samtools command. Supported commands are 'sort', 'index' and 'view'"); + if (!AnalysisUtils.isSupportedCommand(SAMTOOLS_COMMANDS_SUPPORTED)) { + throw new ToolException("Samtools command '" + analysisParams.getCommand() + "' is not available. Supported commands are " + + SAMTOOLS_COMMANDS_SUPPORTED); } - switch (command) { - case "dict": - case "faidx": - case "view": - case "sort": - case "index": - case "stats": - case "depth": - break; - default: - // TODO: support the remaining samtools commands - throw new ToolException("Samtools command '" + command + "' is not available. Supported commands are " - + SAMTOOLS_COMMANDS); + // Get files from catalog + FileManager fileManager = catalogManager.getFileManager(); + if (StringUtils.isNotEmpty(analysisParams.getInputFile())) { + bamFilePath = AnalysisUtils.getCatalogFile(analysisParams.getInputFile(), study, fileManager, token).getUri().getPath(); } - - if (StringUtils.isEmpty(inputFile)) { - throw new ToolException("Missing input file when executing 'samtools " + command + "'."); + if (StringUtils.isNotEmpty(analysisParams.getBedFile())) { + bedFilePath = AnalysisUtils.getCatalogFile(analysisParams.getBedFile(), study, fileManager, token).getUri().getPath(); } - - if (StringUtils.isEmpty(outputFilename)) { - String prefix = Paths.get(inputCatalogFile.getUri().getPath()).toFile().getName(); - switch (command) { - case "index": { - if (prefix.endsWith("cram")) { - outputFilename = prefix + ".crai"; - } else { - outputFilename = prefix + ".bai"; - } - break; - } - case "faidx": { - outputFilename = prefix + ".fai"; - break; - } - case "dict": { - outputFilename = prefix + ".dict"; - break; - } - case "stats": { - outputFilename = prefix + ".stats.txt"; - break; - } - case "depth": { - outputFilename = prefix + ".depth.txt"; - break; - } - default: { - throw new ToolException("Missing output file name when executing 'samtools " + command + "'."); - } - } + if (StringUtils.isNotEmpty(analysisParams.getReadGroupFile())) { + readGroupFilePath = AnalysisUtils.getCatalogFile(analysisParams.getReadGroupFile(), study, fileManager, token).getUri() + .getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getReadsNotSelectedFilename())) { + readsNotSelectedFilenamePath = AnalysisUtils.getCatalogFile(analysisParams.getReadsNotSelectedFilename(), study, fileManager, + token).getUri().getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getReferenceFile())) { + referenceFilePath = AnalysisUtils.getCatalogFile(analysisParams.getReferenceFile(), study, fileManager, token) + .getUri().getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getReferenceNamesFile())) { + referenceNamesFilePath = AnalysisUtils.getCatalogFile(analysisParams.getReferenceNamesFile(), study, fileManager, token) + .getUri().getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getRefSeqFile())) { + refSeqFilePath = AnalysisUtils.getCatalogFile(analysisParams.getRefSeqFile(), study, fileManager, token).getUri().getPath(); } - - // Set output file to use further - outputFile = getOutDir().resolve(outputFilename).toFile(); } @Override protected void run() throws Exception { - step(getId(), () -> { - getToolExecutor(SamtoolsWrapperAnalysisExecutor.class); -// .run(); -// executor -// .setStudy(study) -// .setSampleName(sampleName) -// .setRefGenomePath(refGenomePath) -// .setMutationalSignaturePath(mutationalSignaturePath) -// .setOpenCgaHome(getOpencgaHome()) -// .execute(); - }); + setUpStorageEngineExecutor(study); -// step(() -> { -// String commandLine = getCommandLine(); -// logger.info("Samtools command line: " + commandLine); -// try { -// // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt -// Command cmd = new Command(getCommandLine()) -// .setOutputOutputStream( -// new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDOUT_FILENAME).toFile()))) -// .setErrorOutputStream( -// new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDERR_FILENAME).toFile()))); -// -// cmd.run(); -// -// // Check samtools errors -// boolean success = false; -// switch (command) { -// case "dict": -// case "index": -// case "sort": -// case "view": { -// if (outputFile.exists()) { -// success = true; -// -// if (!"view".equals(command)) { -// String catalogPath = getCatalogPath(inputFile); -// File file = new File(fileUriMap.get(inputFile).getPath()); -// -// Path src = outputFile.toPath(); -// Path dest = new File(file.getParent()).toPath(); -// -// moveFile(getStudy(), src, dest, catalogPath, token); -// } -// } -// break; -// } -// case "faidx": { -// File file = new File(fileUriMap.get(inputFile).getPath()); -// File faidxFile = file.getParentFile().toPath().resolve(file.getName() + ".fai").toFile(); -// success = isValidFile(faidxFile); -// if (success) { -// String catalogPath = getCatalogPath(inputFile); -// catalogManager.getFileManager().link(getStudy(), faidxFile.toURI(), catalogPath, new ObjectMap("parents", true), -// token); -// } -// break; -// } -// case "stats": { -// File file = getScratchDir().resolve(STDOUT_FILENAME).toFile(); -// List lines = readLines(file, Charset.defaultCharset()); -// if (lines.size() > 0 && lines.get(0).startsWith("# This file was produced by samtools stats")) { -// FileUtils.copyFile(file, outputFile); -// if (params.containsKey(INDEX_STATS_PARAM) && params.getBoolean(INDEX_STATS_PARAM) && !isIndexed()) { -// SamtoolsStats alignmentStats = parseSamtoolsStats(outputFile, inputCatalogFile.getId()); -// indexStats(alignmentStats); -// } -// success = true; -// } -// break; -// } -// case "depth": { -// File file = new File(getScratchDir() + "/" + STDOUT_FILENAME); -// if (file.exists() && file.length() > 0) { -// FileUtils.copyFile(file, outputFile); -// success = true; -// } -// break; -// } -// } -// -// if (!success) { -// File file = getScratchDir().resolve(STDERR_FILENAME).toFile(); -// String msg = "Something wrong happened when executing Samtools"; -// if (file.exists()) { -// msg = StringUtils.join(readLines(file, Charset.defaultCharset()), ". "); -// } -// throw new ToolException(msg); -// } -// } catch (Exception e) { -// throw new ToolException(e); -// } -// }); + step(() -> { + if (MapUtils.isNotEmpty(analysisParams.getSamtoolsParams())) { + executorParams.appendAll(analysisParams.getSamtoolsParams()); + } + + getToolExecutor(SamtoolsWrapperAnalysisExecutor.class) + .setCommand(analysisParams.getCommand()) + .setInputFile(bamFilePath) + .setBedFile(bedFilePath) + .setReadGroupFile(readGroupFilePath) + .setReadsNotSelectedFilename(readsNotSelectedFilenamePath) + .setReferenceFile(referenceFilePath) + .setReferenceNamesFile(referenceNamesFilePath) + .setRefSeqFile(refSeqFilePath) + .execute(); + }); } -// @Override -// public String getDockerImageName() { -// return SAMTOOLS_DOCKER_IMAGE; -// } -// -// @Override -// public String getCommandLine() throws ToolException { -// StringBuilder sb = new StringBuilder("docker run "); -// -// // Mount management -// Map srcTargetMap = new HashMap<>(); -// updateFileMaps(inputFile, sb, fileUriMap, srcTargetMap); -// updateFileMaps(referenceFile, sb, fileUriMap, srcTargetMap); -// updateFileMaps(readGroupFile, sb, fileUriMap, srcTargetMap); -// updateFileMaps(bedFile, sb, fileUriMap, srcTargetMap); -// updateFileMaps(referenceNamesFile, sb, fileUriMap, srcTargetMap); -// updateFileMaps(targetRegionFile, sb, fileUriMap, srcTargetMap); -// updateFileMaps(refSeqFile, sb, fileUriMap, srcTargetMap); -// -// sb.append("--mount type=bind,source=\"") -// .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); -// -// // Docker image and version -// sb.append(getDockerImageName()); -// if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { -// sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); -// } -// -// // Samtools command -// sb.append(" samtools ").append(command); -// -// // Samtools options -// for (String param : params.keySet()) { -// if (checkParam(param)) { -// String sep = param.length() == 1 ? " -" : " --"; -// String value = params.getString(param); -// if (StringUtils.isEmpty(value)) { -// sb.append(sep).append(param); -// } else { -// switch (value.toLowerCase()) { -// case "false": -// // Nothing to do -// break; -// case "null": -// case "true": -// // Only param must be appended -// sb.append(sep).append(param); -// break; -// default: -// // Otherwise, param + value must be appended -// sb.append(sep).append(param).append(" ").append(value); -// break; -// } -// } -// } -// } -// -// File file; -// switch (command) { -// case "depth": { -// if (StringUtils.isNotEmpty(referenceFile)) { -// file = new File(fileUriMap.get(referenceFile).getPath()); -// sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") -// .append(file.getName()); -// } -// if (StringUtils.isNotEmpty(bedFile)) { -// file = new File(fileUriMap.get(bedFile).getPath()); -// sb.append(" -b ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// } -// file = new File(fileUriMap.get(inputFile).getPath()); -// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// break; -// } -// case "faidx": { -// file = new File(fileUriMap.get(inputFile).getPath()); -// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// break; -// } -// case "stats": { -// if (StringUtils.isNotEmpty(referenceFile)) { -// file = new File(fileUriMap.get(referenceFile).getPath()); -// sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") -// .append(file.getName()); -// } -// if (StringUtils.isNotEmpty(targetRegionFile)) { -// file = new File(fileUriMap.get(targetRegionFile).getPath()); -// sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// } -// if (StringUtils.isNotEmpty(refSeqFile)) { -// file = new File(fileUriMap.get(refSeqFile).getPath()); -// sb.append(" --ref-seq ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") -// .append(file.getName()); -// } -// file = new File(fileUriMap.get(inputFile).getPath()); -// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// break; -// } -// case "index": { -// file = new File(fileUriMap.get(inputFile).getPath()); -// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// sb.append(" ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); -// break; -// } -// case "dict": { -// sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); -// -// file = new File(fileUriMap.get(inputFile).getPath()); -// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// break; -// } -// case "sort": { -// if (StringUtils.isNotEmpty(referenceFile)) { -// file = new File(fileUriMap.get(referenceFile).getPath()); -// sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") -// .append(file.getName()); -// } -// sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); -// -// file = new File(fileUriMap.get(inputFile).getPath()); -// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// break; -// } -// case "view": { -// if (StringUtils.isNotEmpty(referenceFile)) { -// file = new File(fileUriMap.get(referenceFile).getPath()); -// sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") -// .append(file.getName()); -// } -// if (StringUtils.isNotEmpty(bedFile)) { -// file = new File(fileUriMap.get(bedFile).getPath()); -// sb.append(" -L ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// } -// if (StringUtils.isNotEmpty(readGroupFile)) { -// file = new File(fileUriMap.get(readGroupFile).getPath()); -// sb.append(" -R ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// } -// if (StringUtils.isNotEmpty(readsNotSelectedFilename)) { -// sb.append(" -U ").append(DOCKER_OUTPUT_PATH).append("/").append(readsNotSelectedFilename); -// } -// if (StringUtils.isNotEmpty(referenceNamesFile)) { -// file = new File(fileUriMap.get(referenceNamesFile).getPath()); -// sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// } -// sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); -// -// file = new File(fileUriMap.get(inputFile).getPath()); -// sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); -// break; -// } -// } -// -// return sb.toString(); -// } -// -// private boolean checkParam(String param) { -// if (param.equals(DOCKER_IMAGE_VERSION_PARAM) || param.equals(INDEX_STATS_PARAM)) { -// return false; -// } else { -// switch (command) { -// case "dict": { -// if ("o".equals(param)) { -// return false; -// } -// break; -// } -// case "view": { -// switch (param) { -// case "t": -// case "L": -// case "U": -// case "R": -// case "T": -// case "reference": -// case "o": { -// return false; -// } -// } -// break; -// } -// case "stats": { -// switch (param) { -// case "reference": -// case "r": -// case "ref-seq": -// case "t": { -// return false; -// } -// } -// break; -// } -// case "sort": { -// switch (param) { -// case "reference": -// case "o": { -// return false; -// } -// } -// break; -// } -// case "depth": { -// switch (param) { -// case "b": -// case "reference": { -// return false; -// } -// } -// break; -// } -// } -// return true; -// } -// } - public static SamtoolsStats parseSamtoolsStats(File file, String fileId) throws IOException { + public static SamtoolsStats parseSamtoolsStats(java.io.File file, String fileId) throws IOException { // Create a map with the summary numbers of the statistics (samtools stats) Map map = new HashMap<>(); int count = 0; - for (String line : readLines(file, Charset.defaultCharset())) { + for (String line : FileUtils.readLines(file, Charset.defaultCharset())) { // Only take into account the "SN" section (summary numbers) if (line.startsWith("SN")) { count++; @@ -479,123 +150,123 @@ public static SamtoolsStats parseSamtoolsStats(File file, String fileId) throws return alignmentStats; } - - private void indexStats(SamtoolsStats alignmentStats) throws CatalogException, IOException { - // Convert AlignmentStats to map in order to create an AnnotationSet - Map annotations = JacksonUtils.getDefaultObjectMapper().convertValue(alignmentStats, Map.class); - AnnotationSet annotationSet = new AnnotationSet(ALIGNMENT_STATS_VARIABLE_SET, ALIGNMENT_STATS_VARIABLE_SET, annotations); - - // Update catalog - FileUpdateParams updateParams = new FileUpdateParams().setAnnotationSets(Collections.singletonList(annotationSet)); - catalogManager.getFileManager().update(getStudy(), inputCatalogFile.getId(), updateParams, QueryOptions.empty(), token); - } - -// private boolean isIndexed() { -// OpenCGAResult fileResult; -// try { -// fileResult = catalogManager.getFileManager().get(getStudy(), inputCatalogFile.getId(), QueryOptions.empty(), token); // -// if (fileResult.getNumResults() == 1) { -// for (AnnotationSet annotationSet : fileResult.getResults().get(0).getAnnotationSets()) { -// if (ALIGNMENT_STATS_VARIABLE_SET.equals(annotationSet.getId())) { -// return true; -// } -// } -// } -// } catch (CatalogException e) { -// return false; -// } +// private void indexStats(SamtoolsStats alignmentStats) throws CatalogException, IOException { +// // Convert AlignmentStats to map in order to create an AnnotationSet +// Map annotations = JacksonUtils.getDefaultObjectMapper().convertValue(alignmentStats, Map.class); +// AnnotationSet annotationSet = new AnnotationSet(ALIGNMENT_STATS_VARIABLE_SET, ALIGNMENT_STATS_VARIABLE_SET, annotations); // -// return false; +// // Update catalog +// FileUpdateParams updateParams = new FileUpdateParams().setAnnotationSets(Collections.singletonList(annotationSet)); +// catalogManager.getFileManager().update(getStudy(), inputCatalogFile.getId(), updateParams, QueryOptions.empty(), token); +// } +// +//// private boolean isIndexed() { +//// OpenCGAResult fileResult; +//// try { +//// fileResult = catalogManager.getFileManager().get(getStudy(), inputCatalogFile.getId(), QueryOptions.empty(), token); +//// +//// if (fileResult.getNumResults() == 1) { +//// for (AnnotationSet annotationSet : fileResult.getResults().get(0).getAnnotationSets()) { +//// if (ALIGNMENT_STATS_VARIABLE_SET.equals(annotationSet.getId())) { +//// return true; +//// } +//// } +//// } +//// } catch (CatalogException e) { +//// return false; +//// } +//// +//// return false; +//// } +// +// public String getCommand() { +// return command; +// } +// +// public SamtoolsWrapperAnalysis setCommand(String command) { +// this.command = command; +// return this; +// } +// +// public String getInputFile() { +// return inputFile; +// } +// +// public SamtoolsWrapperAnalysis setInputFile(String inputFile) { +// this.inputFile = inputFile; +// return this; +// } +// +// public String getOutputFilename() { +// return outputFilename; +// } +// +// public SamtoolsWrapperAnalysis setOutputFilename(String outputFilename) { +// this.outputFilename = outputFilename; +// return this; +// } +// +// public String getReferenceFile() { +// return referenceFile; +// } +// +// public SamtoolsWrapperAnalysis setReferenceFile(String referenceFile) { +// this.referenceFile = referenceFile; +// return this; +// } +// +// public String getReadGroupFile() { +// return readGroupFile; +// } +// +// public SamtoolsWrapperAnalysis setReadGroupFile(String readGroupFile) { +// this.readGroupFile = readGroupFile; +// return this; +// } +// +// public String getBedFile() { +// return bedFile; +// } +// +// public SamtoolsWrapperAnalysis setBedFile(String bedFile) { +// this.bedFile = bedFile; +// return this; +// } +// +// public String getReferenceNamesFile() { +// return referenceNamesFile; +// } +// +// public SamtoolsWrapperAnalysis setReferenceNamesFile(String referenceNamesFile) { +// this.referenceNamesFile = referenceNamesFile; +// return this; +// } +// +// public String getTargetRegionFile() { +// return targetRegionFile; +// } +// +// public SamtoolsWrapperAnalysis setTargetRegionFile(String targetRegionFile) { +// this.targetRegionFile = targetRegionFile; +// return this; +// } +// +// public String getRefSeqFile() { +// return refSeqFile; +// } +// +// public SamtoolsWrapperAnalysis setRefSeqFile(String refSeqFile) { +// this.refSeqFile = refSeqFile; +// return this; +// } +// +// public String getReadsNotSelectedFilename() { +// return readsNotSelectedFilename; +// } +// +// public SamtoolsWrapperAnalysis setReadsNotSelectedFilename(String readsNotSelectedFilename) { +// this.readsNotSelectedFilename = readsNotSelectedFilename; +// return this; // } - - public String getCommand() { - return command; - } - - public SamtoolsWrapperAnalysis setCommand(String command) { - this.command = command; - return this; - } - - public String getInputFile() { - return inputFile; - } - - public SamtoolsWrapperAnalysis setInputFile(String inputFile) { - this.inputFile = inputFile; - return this; - } - - public String getOutputFilename() { - return outputFilename; - } - - public SamtoolsWrapperAnalysis setOutputFilename(String outputFilename) { - this.outputFilename = outputFilename; - return this; - } - - public String getReferenceFile() { - return referenceFile; - } - - public SamtoolsWrapperAnalysis setReferenceFile(String referenceFile) { - this.referenceFile = referenceFile; - return this; - } - - public String getReadGroupFile() { - return readGroupFile; - } - - public SamtoolsWrapperAnalysis setReadGroupFile(String readGroupFile) { - this.readGroupFile = readGroupFile; - return this; - } - - public String getBedFile() { - return bedFile; - } - - public SamtoolsWrapperAnalysis setBedFile(String bedFile) { - this.bedFile = bedFile; - return this; - } - - public String getReferenceNamesFile() { - return referenceNamesFile; - } - - public SamtoolsWrapperAnalysis setReferenceNamesFile(String referenceNamesFile) { - this.referenceNamesFile = referenceNamesFile; - return this; - } - - public String getTargetRegionFile() { - return targetRegionFile; - } - - public SamtoolsWrapperAnalysis setTargetRegionFile(String targetRegionFile) { - this.targetRegionFile = targetRegionFile; - return this; - } - - public String getRefSeqFile() { - return refSeqFile; - } - - public SamtoolsWrapperAnalysis setRefSeqFile(String refSeqFile) { - this.refSeqFile = refSeqFile; - return this; - } - - public String getReadsNotSelectedFilename() { - return readsNotSelectedFilename; - } - - public SamtoolsWrapperAnalysis setReadsNotSelectedFilename(String readsNotSelectedFilename) { - this.readsNotSelectedFilename = readsNotSelectedFilename; - return this; - } } diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/WrapperAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/WrapperAnalysisTest.java deleted file mode 100644 index c229f3fa402..00000000000 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/WrapperAnalysisTest.java +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.analysis.wrappers; - -import org.apache.commons.io.FileUtils; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.exec.Command; -import org.opencb.opencga.analysis.clinical.ClinicalAnalysisUtilsTest; -import org.opencb.opencga.analysis.variant.OpenCGATestExternalResource; -import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; -import org.opencb.opencga.catalog.managers.AbstractClinicalManagerTest; -import org.opencb.opencga.catalog.managers.CatalogManagerExternalResource; -import org.opencb.opencga.core.tools.result.ExecutionResult; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.storage.core.variant.VariantStorageBaseTest; -import org.opencb.opencga.storage.mongodb.variant.MongoDBVariantStorageTest; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.stream.Collectors; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -public class WrapperAnalysisTest extends VariantStorageBaseTest implements MongoDBVariantStorageTest { - - private AbstractClinicalManagerTest clinicalTest; - - Path outDir; - - @ClassRule - public static OpenCGATestExternalResource opencga = new OpenCGATestExternalResource(); - - @Rule - public CatalogManagerExternalResource catalogManagerResource = new CatalogManagerExternalResource(); - - @Before - public void setUp() throws Exception { - clearDB("opencga_test_user_1000G"); - clinicalTest = ClinicalAnalysisUtilsTest.getClinicalTest(catalogManagerResource, getVariantStorageEngine()); - } - - @Test - public void plinkFisher() throws ToolException, IOException { - Path inDir1 = Paths.get(opencga.createTmpOutdir("_plink1")); - - outDir = Paths.get(opencga.createTmpOutdir("_plink2")); - - InputStream testTped = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream("test.tped"); - Files.copy(testTped, inDir1.resolve("test.tped"), StandardCopyOption.REPLACE_EXISTING); - InputStream testTfam = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream("test.tfam"); - Files.copy(testTfam, inDir1.resolve("test.tfam"), StandardCopyOption.REPLACE_EXISTING); - - System.out.println("======> in dir 1 = " + inDir1.toAbsolutePath()); - System.out.println("======> out dir = " + outDir.toAbsolutePath()); - - ObjectMap plinkParams = new ObjectMap(); - plinkParams.put(PlinkWrapperAnalysis.TPED_FILE_PARAM, inDir1.resolve("test.tped")); - plinkParams.put(PlinkWrapperAnalysis.TFAM_FILE_PARAM, inDir1.resolve("test.tfam")); - plinkParams.put("fisher", ""); - plinkParams.put("out", "plink-output"); - - PlinkWrapperAnalysis plink = new PlinkWrapperAnalysis(); - plink.setUp(opencga.getOpencgaHome().toString(), plinkParams, outDir, clinicalTest.token); - - ExecutionResult result = plink.start(); - System.out.println(result); - - String outputFilename = plinkParams.get("out") + ".assoc.fisher"; - if (!outDir.resolve(outputFilename).toFile().exists()) { - fail("Output file does not exits: " + outputFilename); - } - } - - @Test - public void plinkFisherCov() throws ToolException, IOException { - Path inDir1 = Paths.get(opencga.createTmpOutdir("_plink1")); - Path inDir2 = Paths.get(opencga.createTmpOutdir("_plink2")); - - outDir = Paths.get(opencga.createTmpOutdir("_plink3")); - - InputStream testTped = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream("test.tped"); - Files.copy(testTped, inDir1.resolve("test.tped"), StandardCopyOption.REPLACE_EXISTING); - InputStream testTfam = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream("test.tfam"); - Files.copy(testTfam, inDir1.resolve("test.tfam"), StandardCopyOption.REPLACE_EXISTING); - InputStream testCovar = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream("test.cov"); - Files.copy(testCovar, inDir2.resolve("test.cov"), StandardCopyOption.REPLACE_EXISTING); - - System.out.println("======> in dir 1 = " + inDir1.toAbsolutePath()); - System.out.println("======> in dir 2 = " + inDir2.toAbsolutePath()); - System.out.println("======> out dir = " + outDir.toAbsolutePath()); - - ObjectMap plinkParams = new ObjectMap(); - plinkParams.put(PlinkWrapperAnalysis.TPED_FILE_PARAM, inDir1.resolve("test.tped")); - plinkParams.put(PlinkWrapperAnalysis.TFAM_FILE_PARAM, inDir1.resolve("test.tfam")); - plinkParams.put(PlinkWrapperAnalysis.COVAR_FILE_PARAM, inDir2.resolve("test.cov")); - plinkParams.put("fisher", ""); - plinkParams.put("covar-number", "3"); - plinkParams.put("out", "plink-output"); - - PlinkWrapperAnalysis plink = new PlinkWrapperAnalysis(); - plink.setUp(opencga.getOpencgaHome().toString(), plinkParams, outDir, clinicalTest.token); - - ExecutionResult result = plink.start(); - System.out.println(result); - - String outputFilename = plinkParams.get("out") + ".assoc.fisher"; - if (!outDir.resolve(outputFilename).toFile().exists()) { - fail("Output file does not exits: " + outputFilename); - } - } - - @Test - public void rvtestsWaldAndScore() throws ToolException, IOException { - Path inDir1 = Paths.get(opencga.createTmpOutdir("_rvtests1")); - Path inDir2 = Paths.get(opencga.createTmpOutdir("_rvtests2")); - - outDir = Paths.get(opencga.createTmpOutdir("_rvtests3")); - - InputStream vcfIs = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream("example.vcf"); - Files.copy(vcfIs, inDir1.resolve("example.vcf"), StandardCopyOption.REPLACE_EXISTING); - InputStream phenoIs = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream("pheno"); - Files.copy(phenoIs, inDir2.resolve("pheno"), StandardCopyOption.REPLACE_EXISTING); - - System.out.println("======> in dir 1 = " + inDir1.toAbsolutePath()); - System.out.println("======> out dir = " + outDir.toAbsolutePath()); - - ObjectMap rvtestsParams = new ObjectMap(); - rvtestsParams.put(RvtestsWrapperAnalysis.EXECUTABLE_PARAM, "rvtest"); - rvtestsParams.put(RvtestsWrapperAnalysis.VCF_FILE_PARAM, inDir1.resolve("example.vcf")); - rvtestsParams.put(RvtestsWrapperAnalysis.PHENOTYPE_FILE_PARAM, inDir2.resolve("pheno")); - rvtestsParams.put("single", "wald,score"); - rvtestsParams.put("out", "rvtests-output"); - - RvtestsWrapperAnalysis rvtests = new RvtestsWrapperAnalysis(); - rvtests.setUp(opencga.getOpencgaHome().toString(), rvtestsParams, outDir, clinicalTest.token); - - ExecutionResult result = rvtests.start(); - System.out.println(result); - -// String outputFilename = rvtestsParams.get("out") + ".assoc.fisher"; -// if (!outDir.resolve(outputFilename).toFile().exists()) { -// fail("Output file does not exits: " + outputFilename); -// } - } - - @Test - public void rvtestsKinship() throws ToolException, IOException { - Path inDir1 = Paths.get(opencga.createTmpOutdir("_rvtests")); - - outDir = Paths.get(opencga.createTmpOutdir("_rvtests")); - - InputStream vcfIs = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream("example.vcf"); - Files.copy(vcfIs, inDir1.resolve("example.vcf"), StandardCopyOption.REPLACE_EXISTING); - - System.out.println("======> in dir 1 = " + inDir1.toAbsolutePath()); - System.out.println("======> out dir = " + outDir.toAbsolutePath()); - - ObjectMap rvtestsParams = new ObjectMap(); - rvtestsParams.put(RvtestsWrapperAnalysis.EXECUTABLE_PARAM, "vcf2kinship"); - rvtestsParams.put(RvtestsWrapperAnalysis.VCF_FILE_PARAM, inDir1.resolve("example.vcf")); - rvtestsParams.put("bn", ""); - rvtestsParams.put("out", "rvtests-output"); - - RvtestsWrapperAnalysis rvtests = new RvtestsWrapperAnalysis(); - rvtests.setUp(opencga.getOpencgaHome().toString(), rvtestsParams, outDir, clinicalTest.token); - - ExecutionResult result = rvtests.start(); - System.out.println(result); - - String outputFilename = rvtestsParams.get("out") + ".kinship"; - if (!outDir.resolve(outputFilename).toFile().exists()) { - fail("Output file does not exits: " + outputFilename); - } - } - - @Test - public void alignmentPipeline() throws ToolException, IOException { - ObjectMap params; - - Path inDir1 = Paths.get(opencga.createTmpOutdir("_bwa")); - - // bwa index - System.out.println("------- bwa index ------"); - Path outDir1 = Paths.get(opencga.createTmpOutdir("_alignment1")); - - String fastaFilename = "Homo_sapiens.GRCh38.dna.chromosome.MT.fa.gz"; - InputStream refGenomeIs = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream(fastaFilename); - Files.copy(refGenomeIs, inDir1.resolve(fastaFilename), StandardCopyOption.REPLACE_EXISTING); - - params = new ObjectMap(); - - BwaWrapperAnalysis bwa = new BwaWrapperAnalysis(); - bwa.setUp(opencga.getOpencgaHome().toString(), params, outDir1, clinicalTest.token); - bwa.setCommand("index") - .setFastaFile(inDir1.resolve(fastaFilename).toString()); - - ExecutionResult bwaIndexResult = bwa.start(); - System.out.println(bwaIndexResult); - - assertTrue(Files.exists(outDir1.resolve(fastaFilename + ".bwt"))); - - // bwa mem - System.out.println("------- bwa mem ------"); - Path outDir2 = Paths.get(opencga.createTmpOutdir("_alignment2")); - - String fastqFilename = "ERR251000.1K.fastq.gz"; - InputStream fastqIs = WrapperAnalysisTest.class.getClassLoader().getResourceAsStream(fastqFilename); - Files.copy(fastqIs, inDir1.resolve(fastqFilename), StandardCopyOption.REPLACE_EXISTING); - - params = new ObjectMap(); - - bwa = new BwaWrapperAnalysis(); - bwa.setUp(opencga.getOpencgaHome().toString(), params, outDir2, clinicalTest.token); - bwa.setCommand("mem") - .setIndexBaseFile(outDir1.resolve(fastaFilename).toString()) - .setFastq1File(inDir1.resolve(fastqFilename).toString()) - .setSamFilename("output.sam"); - - ExecutionResult bwaMemResult = bwa.start(); - System.out.println(bwaMemResult); - - assertTrue(Files.exists(new File(outDir2 + "/" + bwa.getSamFilename()).toPath())); - - // samtools view (convert .sam to .bam) - System.out.println("------- samtools view ------"); - Path outDir3 = Paths.get(opencga.createTmpOutdir("_alignment3")); - - params = new ObjectMap(); - params.put("b", ""); - params.put("S", ""); - - File bamFile = outDir3.resolve(bwa.getSamFilename() + ".bam").toFile(); - - SamtoolsWrapperAnalysis samtools = new SamtoolsWrapperAnalysis(); - samtools.setUp(opencga.getOpencgaHome().toString(), params, outDir3, clinicalTest.token); - samtools.setCommand("view") - .setInputFile(outDir2 + "/" + bwa.getSamFilename()) - .setOutputFilename(bamFile.getName()); - - ExecutionResult samtoolsViewResult = samtools.start(); - System.out.println(samtoolsViewResult); - - assertTrue(bamFile.exists()); - - // samtools sort (.bam) - System.out.println("------- samtools sort ------"); - Path outDir4 = Paths.get(opencga.createTmpOutdir("_alignment4")); - - params = new ObjectMap(); - - File sortedBamFile = outDir4.resolve(bwa.getSamFilename() + ".sorted.bam").toFile(); - - samtools = new SamtoolsWrapperAnalysis(); - samtools.setUp(opencga.getOpencgaHome().toString(), params, outDir4, clinicalTest.token); - samtools.setCommand("sort") - .setInputFile(bamFile.getAbsolutePath()) - .setOutputFilename(sortedBamFile.getName()); - - ExecutionResult samtoolsSortResult = samtools.start(); - System.out.println(samtoolsSortResult); - - assertTrue(sortedBamFile.exists()); - - // samtools index (generate .bai) - System.out.println("------- samtools index ------"); - Path outDir5 = Paths.get(opencga.createTmpOutdir("_alignment5")); - - params = new ObjectMap(); - - File baiFile = outDir5.resolve(sortedBamFile.getName() + ".bai").toFile(); - - samtools = new SamtoolsWrapperAnalysis(); - samtools.setUp(opencga.getOpencgaHome().toString(), params, outDir5, clinicalTest.token); - samtools.setCommand("index") - .setInputFile(sortedBamFile.getAbsolutePath()) - .setOutputFilename(baiFile.getName()); - - ExecutionResult samtoolsIndexResult = samtools.start(); - System.out.println(samtoolsIndexResult); - - assertTrue(baiFile.exists()); - - // deeptools bamCoverage - System.out.println("------- deeptools bamCoverage ------"); - Path outDir6 = Paths.get(opencga.createTmpOutdir("_alignment6")); - - params = new ObjectMap(); - params.put("of", "bigwig"); - - FileUtils.copyFile(baiFile, new java.io.File(outDir4 + "/" + baiFile.getName())); - String coverageFile = outDir6.resolve(sortedBamFile.getName() + ".bw").toString(); - - DeeptoolsWrapperAnalysis deeptools = new DeeptoolsWrapperAnalysis(); - deeptools.setUp(opencga.getOpencgaHome().toString(), params, outDir6, clinicalTest.token); - deeptools.setCommand("bamCoverage") - .setBamFile(sortedBamFile.getAbsolutePath()); - - ExecutionResult deepToolsBamCoverageResult = deeptools.start(); - System.out.println(deepToolsBamCoverageResult); - - assertTrue(Files.exists(new File(coverageFile).toPath())); - - // samtools stats (generate stats) - System.out.println("------- samtools stats ------"); - Path outDir7 = Paths.get(opencga.createTmpOutdir("_alignment7")); - - params = new ObjectMap(); - - File statsFile = outDir7.resolve(sortedBamFile.getName() + ".stats.txt").toFile(); - - samtools = new SamtoolsWrapperAnalysis(); - samtools.setUp(opencga.getOpencgaHome().toString(), params, outDir7, clinicalTest.token); - samtools.setCommand("stats") - .setInputFile(sortedBamFile.getAbsolutePath()) - .setOutputFilename(statsFile.getName()); - - ExecutionResult samtoolsStatsResult = samtools.start(); - System.out.println(samtoolsStatsResult); - - assertTrue(statsFile.exists()); - } - - // @Test - public void commandTest() throws IOException { - outDir = Paths.get(opencga.createTmpOutdir("_docker")); - - System.out.println(System.getenv().entrySet().stream().map(e -> e.getKey() + " : " + e.getValue()).collect(Collectors.joining("\n"))); - - String cmdLine = "docker run docker/whalesay cowsay Mi-Mama-Me-Mima"; - - System.out.println("out dir = " + outDir.toAbsolutePath()); - Command cmd = new Command(cmdLine) - .setOutputOutputStream(new DataOutputStream(new FileOutputStream(outDir.toAbsolutePath().resolve("stdout.txt").toFile()))) - .setErrorOutputStream(new DataOutputStream(new FileOutputStream(outDir.toAbsolutePath().resolve("stderr.txt").toFile()))); - - cmd.run(); - } -} \ No newline at end of file diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/executors/SamtoolsWrapperAnalysisExecutorTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/executors/SamtoolsWrapperAnalysisExecutorTest.java deleted file mode 100644 index a72b9839e97..00000000000 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/wrappers/executors/SamtoolsWrapperAnalysisExecutorTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.opencb.opencga.analysis.wrappers.executors; - -import org.junit.Test; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; - -import static org.junit.Assert.*; - -public class SamtoolsWrapperAnalysisExecutorTest { - - @Test - public void test() throws IOException { - Path path = Paths.get("/opt/opencga/sessions/jobs/JOBS/titi/20200626/sample-qc.20200626082736.WOtcTM/flagstat/scratch/fastqc.stdout.txt"); - SamtoolsFlagstats flagstats = parse(path); - System.out.println(flagstats); - } - - public SamtoolsFlagstats parse(Path path) throws IOException { - - SamtoolsFlagstats flagstats = new SamtoolsFlagstats(); - - FileReader fr = new FileReader(path.toFile()); - BufferedReader br = new BufferedReader(fr); - - String line; - - while ((line = br.readLine()) != null) { - String[] splits = line.split(" "); - int passed = Integer.parseInt(splits[0]); - int failed = Integer.parseInt(splits[2]); - if (line.contains("QC-passed")) { - flagstats.setTotalQcPassed(passed); - flagstats.setTotalReads(passed + failed); - } else if (line.contains("secondary")) { - flagstats.setSecondaryAlignments(passed); - } else if (line.contains("supplementary")) { - flagstats.setSupplementary(passed); - } else if (line.contains("duplicates")) { - flagstats.setDuplicates(passed); - } else if (line.contains("mapped")) { - flagstats.setMapped(passed); - } else if (line.contains("paired in sequencing")) { - flagstats.setPairedInSequencing(passed); - } else if (line.contains("read1")) { - flagstats.setRead1(passed); - } else if (line.contains("read2")) { - flagstats.setRead2(passed); - } else if (line.contains("properly paired")) { - flagstats.setProperlyPaired(passed); - } else if (line.contains("with itself and mate mapped")) { - flagstats.setSelfAndMateMapped(passed); - } else if (line.contains("singletons")) { - flagstats.setSingletons(passed); - } else if (line.contains("mapQ>=5")) { - flagstats.setDiffChrMapQ5(passed); - } else if (line.contains("with mate mapped")) { - flagstats.setMateMappedToDiffChr(passed); - } - } - - return flagstats; - } - -// 108 + 0 in total (QC-passed reads + QC-failed reads) -// 0 + 0 secondary -// 0 + 0 supplementary -// 0 + 0 duplicates -// 108 + 0 mapped (100.00% : N/A) -// 108 + 0 paired in sequencing -// 53 + 0 read1 -// 55 + 0 read2 -// 104 + 0 properly paired (96.30% : N/A) -// 108 + 0 with itself and mate mapped -// 0 + 0 singletons (0.00% : N/A) -// 0 + 0 with mate mapped to a different chr -// 0 + 0 with mate mapped to a different chr (mapQ>=5) -} \ No newline at end of file diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index b6e2a8e71b6..0918156a802 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -16,10 +16,10 @@ package org.opencb.opencga.app.cli.internal.executors; -import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; -import org.opencb.opencga.analysis.alignment.qc.*; +import org.opencb.opencga.analysis.alignment.qc.AlignmentGeneCoverageStatsAnalysis; +import org.opencb.opencga.analysis.alignment.qc.AlignmentQcAnalysis; import org.opencb.opencga.analysis.wrappers.BwaWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; @@ -28,10 +28,12 @@ import org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.alignment.*; +import org.opencb.opencga.core.models.alignment.AlignmentGeneCoverageStatsParams; +import org.opencb.opencga.core.models.alignment.AlignmentQcParams; +import org.opencb.opencga.core.models.alignment.PicardWrapperParams; +import org.opencb.opencga.core.models.alignment.SamtoolsWrapperParams; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.Arrays; import java.util.Map; @@ -277,20 +279,23 @@ private void bwa() throws Exception { private void samtools() throws Exception { AlignmentCommandOptions.SamtoolsCommandOptions cliOptions = alignmentCommandOptions.samtoolsCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.samtoolsParams); - - SamtoolsWrapperAnalysis samtools = new SamtoolsWrapperAnalysis(); - samtools.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), - alignmentCommandOptions.internalJobOptions.jobId, cliOptions.commonOptions.token); - samtools.setStudy(cliOptions.study); - - samtools.setCommand(cliOptions.command) - .setInputFile(cliOptions.inputFile) - .setOutputFilename(cliOptions.outputFilename); - - samtools.start(); + ObjectMap params = new SamtoolsWrapperParams( + cliOptions.command, + cliOptions.inputFile, + cliOptions.outputFilename, + cliOptions.referenceFile, + cliOptions.readGroupFile, + cliOptions.bedFile, + cliOptions.refSeqFile, + cliOptions.referenceNamesFile, + cliOptions.targetRegionFile, + cliOptions.readsNotSelectedFilename, + cliOptions.outdir, + cliOptions.samtoolsParams) + .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); + + toolRunner.execute(SamtoolsWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } // Deeptools @@ -335,16 +340,21 @@ private void fastqc() throws Exception { private void picard() throws Exception { AlignmentCommandOptions.PicardCommandOptions cliOptions = alignmentCommandOptions.picardCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.commonOptions.params); - - PicardWrapperAnalysis picard = new PicardWrapperAnalysis(); - picard.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), alignmentCommandOptions.internalJobOptions.jobId, cliOptions.commonOptions.token); - picard.setStudy(cliOptions.study); - picard.setCommand(cliOptions.command); + ObjectMap params = new PicardWrapperParams( + cliOptions.command, + cliOptions.bamFile, + cliOptions.bedFile, + cliOptions.baitIntervalsFile, + cliOptions.targetIntervalsFile, + cliOptions.dictFile, + cliOptions.refSeqFile, + cliOptions.outFilename, + cliOptions.outdir, + cliOptions.picardParams) + .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); - picard.start(); + toolRunner.execute(PicardWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } //------------------------------------------------------------------------- diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index eddecee6e2b..a522ad12b0a 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -551,7 +551,7 @@ public class SamtoolsCommandOptions { @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) public String outdir; - @DynamicParameter(names = {"--samtools-params"}, description = "Samtools parameters e.g.:. --samtools-params stats-index=true") + @DynamicParameter(names = {"--samtools-params"}, description = "Samtools parameters e.g.:. --samtools-params F=0x800 --samtools-params remove-dups=true") public Map samtoolsParams = new HashMap<>(); } @@ -632,10 +632,34 @@ public class PicardCommandOptions { @Parameter(names = {"-s", "--study"}, description = STUDY_DESCRIPTION, arity = 1) public String study; - @Parameter(names = {"--" + PICARD_TOOL_NAME_PARAMETER}, description = PICARD_TOOL_NAME_DESCRIPTION, required = true) + @Parameter(names = {"--command"}, description = PICARD_COMMAND_DESCRIPTION, required = true) public String command; + @Parameter(names = {"--bam-file"}, description = FILE_ID_DESCRIPTION + " (BAM file)") + public String bamFile; + + @Parameter(names = {"--bed-file"}, description = FILE_ID_DESCRIPTION + " (BEB file)") + public String bedFile; + + @Parameter(names = {"--bait-intervals-file"}, description = FILE_ID_DESCRIPTION + " (BAIT file for intervals)") + public String baitIntervalsFile; + + @Parameter(names = {"--target-intervals-file"}, description = FILE_ID_DESCRIPTION + " (BAIT file for target intervals)") + public String targetIntervalsFile; + + @Parameter(names = {"--dict-file"}, description = FILE_ID_DESCRIPTION + " (dictionary file)") + public String dictFile; + + @Parameter(names = {"--ref-seq-file"}, description = FILE_ID_DESCRIPTION + " (reference sequence file)") + public String refSeqFile; + + @Parameter(names = {"--out-filename"}, description = "Output filename") + public String outFilename; + @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) public String outdir; + + @DynamicParameter(names = {"--pircard-params"}, description = "Picard parameters.") + public Map picardParams = new HashMap<>(); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index ef220cfae46..3648f909058 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -479,8 +479,15 @@ private RestResponse fastqc() throws ClientException { private RestResponse picard() throws ClientException { PicardWrapperParams picardWrapperParams = new PicardWrapperParams( alignmentCommandOptions.picardCommandOptions.command, + alignmentCommandOptions.picardCommandOptions.bamFile, + alignmentCommandOptions.picardCommandOptions.bedFile, + alignmentCommandOptions.picardCommandOptions.baitIntervalsFile, + alignmentCommandOptions.picardCommandOptions.targetIntervalsFile, + alignmentCommandOptions.picardCommandOptions.dictFile, + alignmentCommandOptions.picardCommandOptions.refSeqFile, + alignmentCommandOptions.picardCommandOptions.outFilename, alignmentCommandOptions.picardCommandOptions.outdir, - alignmentCommandOptions.picardCommandOptions.commonOptions.params + alignmentCommandOptions.picardCommandOptions.picardParams ); ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), alignmentCommandOptions.picardCommandOptions.study); return openCGAClient.getAlignmentClient().runPicard(picardWrapperParams, params); diff --git a/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java b/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java index 7ec000f1465..d9c0a1597a3 100644 --- a/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java +++ b/opencga-app/src/test/java/org/opencb/opencga/app/cli/analysis/InternalMainTest.java @@ -21,7 +21,6 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; import org.opencb.biodata.models.alignment.RegionCoverage; import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.metadata.Aggregation; @@ -61,7 +60,6 @@ import java.util.stream.Collectors; import static org.junit.Assert.*; -import static org.opencb.opencga.core.api.ParamConstants.AVERAGE_QUALITY; import static org.opencb.opencga.core.api.ParamConstants.REGION_PARAM; /** @@ -400,24 +398,24 @@ public void testStats() throws CatalogException, IOException, ToolException { assertTrue(Files.exists(Paths.get(temporalDir).resolve(filename + ".stats.txt"))); - // stats info - AlignmentStorageManager alignmentStorageManager = new AlignmentStorageManager(catalogManager, opencga.getStorageEngineFactory()); - DataResult statsInfo = alignmentStorageManager.statsInfo(studyId, bamFile.getId(), sessionId); - assertEquals(1, statsInfo.getNumMatches()); -// assert(statsInfo.getResults().get(0).length() > 0); - System.out.println(statsInfo); - - // stats query - Query query = new Query(); - query.put(AVERAGE_QUALITY, ">55"); - QueryOptions queryOptions = QueryOptions.empty(); - DataResult resultFiles = alignmentStorageManager.statsQuery(studyId, query, queryOptions, sessionId); - assertEquals(0, resultFiles.getNumResults()); - - query.put(AVERAGE_QUALITY, ">30"); - resultFiles = alignmentStorageManager.statsQuery(studyId, query, queryOptions, sessionId); - assertEquals(1, resultFiles.getNumResults()); - System.out.println(resultFiles.getResults().get(0).getAnnotationSets().get(0)); +// // stats info +// AlignmentStorageManager alignmentStorageManager = new AlignmentStorageManager(catalogManager, opencga.getStorageEngineFactory()); +// DataResult statsInfo = alignmentStorageManager.statsInfo(studyId, bamFile.getId(), sessionId); +// assertEquals(1, statsInfo.getNumMatches()); +//// assert(statsInfo.getResults().get(0).length() > 0); +// System.out.println(statsInfo); +// +// // stats query +// Query query = new Query(); +// query.put(AVERAGE_QUALITY, ">55"); +// QueryOptions queryOptions = QueryOptions.empty(); +// DataResult resultFiles = alignmentStorageManager.statsQuery(studyId, query, queryOptions, sessionId); +// assertEquals(0, resultFiles.getNumResults()); +// +// query.put(AVERAGE_QUALITY, ">30"); +// resultFiles = alignmentStorageManager.statsQuery(studyId, query, queryOptions, sessionId); +// assertEquals(1, resultFiles.getNumResults()); +// System.out.println(resultFiles.getResults().get(0).getAnnotationSets().get(0)); } @Test diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index 0872dcc7bed..a730d83f577 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -452,8 +452,8 @@ public class ParamConstants { // --------------------------------------------- - public static final String SAMTOOLS_COMMANDS = "'sort', 'index' , 'view', 'stats', 'dict', 'faidx', 'depth'"; - public static final String SAMTOOLS_COMMAND_DESCRIPTION = "Samtools command: " + SAMTOOLS_COMMANDS; + public static final String SAMTOOLS_COMMANDS_SUPPORTED = "sort, index, view, stats, flagstat, dict, faidx, depth, plot-bamstats"; + public static final String SAMTOOLS_COMMAND_DESCRIPTION = "Supported Samtools commands: " + SAMTOOLS_COMMANDS_SUPPORTED; public static final String INPUT_FILE_DESCRIPTION = "Input file (full path)."; public static final String INPUT_FILE_PARAM = "inputFile"; @@ -476,8 +476,9 @@ public class ParamConstants { // --------------------------------------------- - public static final String PICARD_TOOL_NAME_PARAMETER = "command"; - public static final String PICARD_TOOL_NAME_DESCRIPTION = "Picard tool name to execute. Supported tools: CollectHsMetrics, CollectWgsMetrics, BedToInvervalList"; + public static final String PICARD_COMMANDS_SUPPORTED = "CollectHsMetrics, CollectWgsMetrics, BedToIntervalList"; + public static final String PICARD_COMMAND_DESCRIPTION = "Supported Picard commands: " + PICARD_COMMANDS_SUPPORTED; + // --------------------------------------------- public static final String RPC_METHOD_DESCRIPTION = "RPC method used: {auto, gRPC, REST}. When auto, it will first try with gRPC and " diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/PicardWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/PicardWrapperParams.java index 3bb05c1e6c9..67c1537c798 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/PicardWrapperParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/PicardWrapperParams.java @@ -5,17 +5,32 @@ import java.util.Map; public class PicardWrapperParams extends ToolParams { - public static final String DESCRIPTION = "Picard parameters"; + public static final String DESCRIPTION = "Picard parameters."; private String command; + private String bamFile; + private String bedFile; + private String baitIntervalsFile; + private String targetIntervalsFile; + private String dictFile; + private String refSeqFile; + private String outFilename; private String outdir; private Map picardParams; public PicardWrapperParams() { } - public PicardWrapperParams(String command, String outdir, Map picardParams) { + public PicardWrapperParams(String command, String bamFile, String bedFile, String baitIntervalsFile, String targetIntervalsFile, + String dictFile, String refSeqFile, String outFilename, String outdir, Map picardParams) { this.command = command; + this.bamFile = bamFile; + this.bedFile = bedFile; + this.baitIntervalsFile = baitIntervalsFile; + this.targetIntervalsFile = targetIntervalsFile; + this.dictFile = dictFile; + this.refSeqFile = refSeqFile; + this.outFilename = outFilename; this.outdir = outdir; this.picardParams = picardParams; } @@ -24,6 +39,13 @@ public PicardWrapperParams(String command, String outdir, Map pi public String toString() { final StringBuilder sb = new StringBuilder("PicardWrapperParams{"); sb.append("command='").append(command).append('\''); + sb.append(", bamFile='").append(bamFile).append('\''); + sb.append(", bedFile='").append(bedFile).append('\''); + sb.append(", baitIntervalsFile='").append(baitIntervalsFile).append('\''); + sb.append(", targetIntervalsFile='").append(targetIntervalsFile).append('\''); + sb.append(", dictFile='").append(dictFile).append('\''); + sb.append(", refSeqFile='").append(refSeqFile).append('\''); + sb.append(", outFilename='").append(outFilename).append('\''); sb.append(", outdir='").append(outdir).append('\''); sb.append(", picardParams=").append(picardParams); sb.append('}'); @@ -39,6 +61,69 @@ public PicardWrapperParams setCommand(String command) { return this; } + public String getBamFile() { + return bamFile; + } + + public PicardWrapperParams setBamFile(String bamFile) { + this.bamFile = bamFile; + return this; + } + + public String getBedFile() { + return bedFile; + } + + public PicardWrapperParams setBedFile(String bedFile) { + this.bedFile = bedFile; + return this; + } + + public String getBaitIntervalsFile() { + return baitIntervalsFile; + } + + public PicardWrapperParams setBaitIntervalsFile(String baitIntervalsFile) { + this.baitIntervalsFile = baitIntervalsFile; + return this; + } + + public String getTargetIntervalsFile() { + return targetIntervalsFile; + } + + public PicardWrapperParams setTargetIntervalsFile(String targetIntervalsFile) { + this.targetIntervalsFile = targetIntervalsFile; + return this; + } + + public String getDictFile() { + return dictFile; + } + + public PicardWrapperParams setDictFile(String dictFile) { + this.dictFile = dictFile; + return this; + } + + public String getRefSeqFile() { + return refSeqFile; + } + + public PicardWrapperParams setRefSeqFile(String refSeqFile) { + this.refSeqFile = refSeqFile; + return this; + } + + public String getOutFilename() { + return outFilename; + } + + public PicardWrapperParams setOutFilename(String outFilename) { + this.outFilename = outFilename; + return this; + } + public String getOutdir() { return outdir; } From e8836084e77341d54fd44eb4088c6211355047aa Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 28 Apr 2021 11:05:27 +0200 Subject: [PATCH 238/412] analysis: fix minor variant issue, #1693 --- .../main/java/org/opencb/opencga/analysis/rga/RgaManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index fd2bb92c2f9..269f5be91e8 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -419,7 +419,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer // 4. Solr gene query List knockoutResultList = variantConverter.convertToDataModelType(rgaIterator, variantDBIterator, - query.getAsStringList(RgaQueryParams.VARIANTS.key()), includeIndividuals, skipIndividuals, limitIndividuals); + auxQuery.getAsStringList(RgaQueryParams.VARIANTS.key()), includeIndividuals, skipIndividuals, limitIndividuals); int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); OpenCGAResult knockoutResult = new OpenCGAResult<>(time, Collections.emptyList(), knockoutResultList.size(), From 379549dd836bc53e0d42d525a9313ba21ca255f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 28 Apr 2021 11:32:37 +0200 Subject: [PATCH 239/412] analysis: improve Fastqc wrapper --- .../fastqc/FastqcWrapperAnalysis.java | 108 ++++++------------ .../fastqc/FastqcWrapperAnalysisExecutor.java | 37 +++++- .../executors/AlignmentCommandExecutor.java | 24 ++-- .../options/AlignmentCommandOptions.java | 15 ++- .../analysis/AlignmentCommandExecutor.java | 12 +- .../client/rest/clients/AlignmentClient.java | 4 +- .../models/alignment/FastQcWrapperParams.java | 59 ---------- .../models/alignment/FastqcWrapperParams.java | 96 ++++++++++++++++ .../rest/analysis/AlignmentWebService.java | 2 +- .../rest/analysis/VariantWebService.java | 38 +----- 10 files changed, 209 insertions(+), 186 deletions(-) delete mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastQcWrapperParams.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastqcWrapperParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java index 8d396ddfbc4..028b17ae70e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java @@ -17,97 +17,65 @@ package org.opencb.opencga.analysis.wrappers.fastqc; -import org.apache.commons.io.FileUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysisExecutor; -import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.core.models.alignment.FastqcWrapperParams; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.tools.annotations.Tool; - -import java.io.File; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.util.List; -import java.util.stream.Collectors; +import org.opencb.opencga.core.tools.annotations.ToolParams; @Tool(id = FastqcWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = FastqcWrapperAnalysis.DESCRIPTION) -public class FastqcWrapperAnalysis extends OpenCgaWrapperAnalysis { +public class FastqcWrapperAnalysis extends OpenCgaToolScopeStudy { public final static String ID = "fastqc"; - public final static String DESCRIPTION = "A quality control tool for high throughput sequence data."; + public final static String DESCRIPTION = "A high throughput sequence QC analysis tool"; - public final static String FASTQC_DOCKER_IMAGE = "dceoy/fastqc"; + @ToolParams + protected final FastqcWrapperParams analysisParams = new FastqcWrapperParams(); - private String file; + private String inputFilePath = null; + private String contaminantsFilePath = null; + private String adaptersFilePath = null; + private String limitsFilePath = null; protected void check() throws Exception { super.check(); - if (StringUtils.isEmpty(file)) { - throw new ToolException("Missing input file when executing 'fastqc'."); + // Get files from catalog + FileManager fileManager = catalogManager.getFileManager(); + if (StringUtils.isNotEmpty(analysisParams.getInputFile())) { + inputFilePath = AnalysisUtils.getCatalogFile(analysisParams.getInputFile(), study, fileManager, token).getUri().getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getContaminantsFile())) { + contaminantsFilePath = AnalysisUtils.getCatalogFile(analysisParams.getContaminantsFile(), study, fileManager, token).getUri() + .getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getAdaptersFile())) { + adaptersFilePath = AnalysisUtils.getCatalogFile(analysisParams.getAdaptersFile(), study, fileManager, token).getUri().getPath(); + } + if (StringUtils.isNotEmpty(analysisParams.getLimitsFile())) { + limitsFilePath = AnalysisUtils.getCatalogFile(analysisParams.getLimitsFile(), study, fileManager, token).getUri().getPath(); } } @Override protected void run() throws Exception { - step(getId(), () -> { - getToolExecutor(FastqcWrapperAnalysisExecutor.class); -// .run(); -// executor -// .setStudy(study) -// .setSampleName(sampleName) -// .setRefGenomePath(refGenomePath) -// .setMutationalSignaturePath(mutationalSignaturePath) -// .setOpenCgaHome(getOpencgaHome()) -// .execute(); - }); + setUpStorageEngineExecutor(study); -/* step(() -> { - - try { - FastqcWrapperAnalysisExecutor executor = new FastqcWrapperAnalysisExecutor(getStudy(), params, getOutDir(), - getScratchDir(), catalogManager, token); - - executor.setFile(file); - executor.run(); - - // Check fastqc errors - boolean success = false; - List filenames = Files.walk(getOutDir()).map(f -> f.getFileName().toString()).collect(Collectors.toList()); - for (String filename : filenames) { - if (filename.endsWith("html")) { - success = true; - break; - } - } - if (!success) { - File file = getScratchDir().resolve(STDERR_FILENAME).toFile(); - String msg = "Something wrong happened when executing FastQC"; - if (file.exists()) { - msg = StringUtils.join(FileUtils.readLines(file, Charset.defaultCharset()), "\n"); - } - throw new ToolException(msg); - } - } catch (Exception e) { - throw new ToolException(e); + if (MapUtils.isNotEmpty(analysisParams.getFastqcParams())) { + executorParams.appendAll(analysisParams.getFastqcParams()); } - }); - */ - } - public String getFile() { - return file; - } - - public FastqcWrapperAnalysis setFile(String file) { - this.file = file; - return this; + getToolExecutor(FastqcWrapperAnalysisExecutor.class) + .setInputFile(inputFilePath) + .setContaminantsFile(contaminantsFilePath) + .setAdaptersFile(adaptersFilePath) + .setLimitsFile(limitsFilePath) + .execute(); + }); } - -// @Override -// public String getDockerImageName() { -// return null; -// } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java index 573927f0b14..c41a2534c1e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java @@ -19,6 +19,9 @@ public class FastqcWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor private String study; private String inputFile; + private String contaminantsFile; + private String adaptersFile; + private String limitsFile; private Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -37,7 +40,9 @@ protected void run() throws Exception { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", getInputFile()))); + List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", getInputFile()), + new ImmutablePair<>("contaminants", getContaminantsFile()), new ImmutablePair<>("adapters", getAdaptersFile()), + new ImmutablePair<>("limits", getLimitsFile()))); Map mountMap = appendMounts(inputFilenames, sb); @@ -52,7 +57,8 @@ protected void run() throws Exception { appendOutputFiles(outputFilenames, sb); // Append other params - Set skipParams = new HashSet<>(Arrays.asList("o", "outdir", "d", "dir")); + Set skipParams = new HashSet<>(Arrays.asList("o", "outdir", "d", "dir", "j", "java", "c", "contaminants", "a", "adapters", + "l", "limits")); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt @@ -77,4 +83,31 @@ public FastqcWrapperAnalysisExecutor setInputFile(String inputFile) { this.inputFile = inputFile; return this; } + + public String getContaminantsFile() { + return contaminantsFile; + } + + public FastqcWrapperAnalysisExecutor setContaminantsFile(String contaminantsFile) { + this.contaminantsFile = contaminantsFile; + return this; + } + + public String getAdaptersFile() { + return adaptersFile; + } + + public FastqcWrapperAnalysisExecutor setAdaptersFile(String adaptersFile) { + this.adaptersFile = adaptersFile; + return this; + } + + public String getLimitsFile() { + return limitsFile; + } + + public FastqcWrapperAnalysisExecutor setLimitsFile(String limitsFile) { + this.limitsFile = limitsFile; + return this; + } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 0918156a802..1d1419f401c 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -28,10 +28,7 @@ import org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.alignment.AlignmentGeneCoverageStatsParams; -import org.opencb.opencga.core.models.alignment.AlignmentQcParams; -import org.opencb.opencga.core.models.alignment.PicardWrapperParams; -import org.opencb.opencga.core.models.alignment.SamtoolsWrapperParams; +import org.opencb.opencga.core.models.alignment.*; import java.nio.file.Paths; import java.util.Arrays; @@ -322,18 +319,17 @@ private void deeptools() throws Exception { private void fastqc() throws Exception { AlignmentCommandOptions.FastqcCommandOptions cliOptions = alignmentCommandOptions.fastqcCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.commonOptions.params); - params.putAll(cliOptions.fastqcParams); - - FastqcWrapperAnalysis fastqc = new FastqcWrapperAnalysis(); - fastqc.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), alignmentCommandOptions.internalJobOptions.jobId, cliOptions.commonOptions.token); - - fastqc.setStudy(cliOptions.study); - fastqc.setFile(cliOptions.file); + ObjectMap params = new FastqcWrapperParams( + cliOptions.inputFile, + cliOptions.contaminantsFile, + cliOptions.adaptersFile, + cliOptions.limitsFile, + cliOptions.outdir, + cliOptions.fastqcParams) + .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); - fastqc.start(); + toolRunner.execute(FastqcWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } // Picard diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index a522ad12b0a..601e9b3062a 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -604,8 +604,19 @@ public class FastqcCommandOptions { @Parameter(names = {"-s", "--study"}, description = STUDY_DESCRIPTION, arity = 1) public String study; - @Parameter(names = {"--file"}, description = INPUT_FILE_DESCRIPTION) - public String file; + @Parameter(names = {"--input-file"}, description = FILE_ID_DESCRIPTION + " (FastQ, SAM or BAM file)", required = true) + public String inputFile; + + @Parameter(names = {"--contaminants-file"}, description = FILE_ID_DESCRIPTION + " (file which contains the list of" + + " contaminants to screen overrepresented sequences against)") + public String contaminantsFile; + + @Parameter(names = {"--adapters-file"}, description = FILE_ID_DESCRIPTION + " (adapter sequences file)") + public String adaptersFile; + + @Parameter(names = {"--limits-file"}, description = FILE_ID_DESCRIPTION + " (file which contains a set of criteria" + + " which will be used to determine the warn/error limits for the various modules)") + public String limitsFile; @DynamicParameter(names = {"--fastqc-params"}, description = "FastQc parameters e.g.:. --fastqc-params kmers=10") public Map fastqcParams = new HashMap<>(); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index 3648f909058..82293939f5d 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -41,7 +41,10 @@ import org.opencb.opencga.server.grpc.ServiceTypesModel; import java.io.IOException; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; import java.util.concurrent.TimeUnit; import static org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions.BwaCommandOptions.BWA_RUN_COMMAND; @@ -465,8 +468,11 @@ private RestResponse deeptools() throws ClientException { // FastQC private RestResponse fastqc() throws ClientException { - FastQcWrapperParams fastQcWrapperParams = new FastQcWrapperParams( - alignmentCommandOptions.fastqcCommandOptions.file, + FastqcWrapperParams fastQcWrapperParams = new FastqcWrapperParams( + alignmentCommandOptions.fastqcCommandOptions.inputFile, + alignmentCommandOptions.fastqcCommandOptions.contaminantsFile, + alignmentCommandOptions.fastqcCommandOptions.adaptersFile, + alignmentCommandOptions.fastqcCommandOptions.limitsFile, alignmentCommandOptions.fastqcCommandOptions.outdir, alignmentCommandOptions.fastqcCommandOptions.fastqcParams ); diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java index aeccb74a9d4..513b96918de 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java @@ -29,7 +29,7 @@ import org.opencb.opencga.core.models.alignment.BwaWrapperParams; import org.opencb.opencga.core.models.alignment.CoverageIndexParams; import org.opencb.opencga.core.models.alignment.DeeptoolsWrapperParams; -import org.opencb.opencga.core.models.alignment.FastQcWrapperParams; +import org.opencb.opencga.core.models.alignment.FastqcWrapperParams; import org.opencb.opencga.core.models.alignment.PicardWrapperParams; import org.opencb.opencga.core.models.alignment.SamtoolsWrapperParams; import org.opencb.opencga.core.models.job.Job; @@ -188,7 +188,7 @@ public RestResponse runDeeptools(DeeptoolsWrapperParams data, ObjectMap par * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse runFastqc(FastQcWrapperParams data, ObjectMap params) throws ClientException { + public RestResponse runFastqc(FastqcWrapperParams data, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); params.put("body", data); return execute("analysis", null, "alignment/fastqc", null, "run", params, POST, Job.class); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastQcWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastQcWrapperParams.java deleted file mode 100644 index fb55933cdeb..00000000000 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastQcWrapperParams.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.opencb.opencga.core.models.alignment; - -import org.opencb.opencga.core.tools.ToolParams; - -import java.util.Map; - -public class FastQcWrapperParams extends ToolParams { - public static final String DESCRIPTION = "FastQC parameters"; - - private String file; // Input file - private String outdir; - private Map fastqcParams; - - public FastQcWrapperParams() { - } - - public FastQcWrapperParams(String file, String outdir, Map fastqcParams) { - this.file = file; - this.outdir = outdir; - this.fastqcParams = fastqcParams; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("FastQcWrapperParams{"); - sb.append("file='").append(file).append('\''); - sb.append(", outdir='").append(outdir).append('\''); - sb.append(", fastqcParams=").append(fastqcParams); - sb.append('}'); - return sb.toString(); - } - - public String getFile() { - return file; - } - - public FastQcWrapperParams setFile(String file) { - this.file = file; - return this; - } - - public String getOutdir() { - return outdir; - } - - public FastQcWrapperParams setOutdir(String outdir) { - this.outdir = outdir; - return this; - } - - public Map getFastqcParams() { - return fastqcParams; - } - - public FastQcWrapperParams setFastqcParams(Map fastqcParams) { - this.fastqcParams = fastqcParams; - return this; - } -} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastqcWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastqcWrapperParams.java new file mode 100644 index 00000000000..fedc2637325 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastqcWrapperParams.java @@ -0,0 +1,96 @@ +package org.opencb.opencga.core.models.alignment; + +import org.opencb.opencga.core.tools.ToolParams; + +import java.util.Map; + +public class FastqcWrapperParams extends ToolParams { + public static final String DESCRIPTION = "FastQC parameters"; + + private String inputFile; + private String contaminantsFile; + private String adaptersFile; + private String limitsFile; + private String outdir; + private Map fastqcParams; + + public FastqcWrapperParams() { + } + + public FastqcWrapperParams(String inputFile, String contaminantsFile, String adaptersFile, String limitsFile, String outdir, + Map fastqcParams) { + this.inputFile = inputFile; + this.contaminantsFile = contaminantsFile; + this.adaptersFile = adaptersFile; + this.limitsFile = limitsFile; + this.outdir = outdir; + this.fastqcParams = fastqcParams; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("FastqcWrapperParams{"); + sb.append("inputFile='").append(inputFile).append('\''); + sb.append(", contaminantsFile='").append(contaminantsFile).append('\''); + sb.append(", adaptersFile='").append(adaptersFile).append('\''); + sb.append(", limitsFile='").append(limitsFile).append('\''); + sb.append(", outdir='").append(outdir).append('\''); + sb.append(", fastqcParams=").append(fastqcParams); + sb.append('}'); + return sb.toString(); + } + + public String getInputFile() { + return inputFile; + } + + public FastqcWrapperParams setInputFile(String inputFile) { + this.inputFile = inputFile; + return this; + } + + public String getContaminantsFile() { + return contaminantsFile; + } + + public FastqcWrapperParams setContaminantsFile(String contaminantsFile) { + this.contaminantsFile = contaminantsFile; + return this; + } + + public String getAdaptersFile() { + return adaptersFile; + } + + public FastqcWrapperParams setAdaptersFile(String adaptersFile) { + this.adaptersFile = adaptersFile; + return this; + } + + public String getLimitsFile() { + return limitsFile; + } + + public FastqcWrapperParams setLimitsFile(String limitsFile) { + this.limitsFile = limitsFile; + return this; + } + + public String getOutdir() { + return outdir; + } + + public FastqcWrapperParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } + + public Map getFastqcParams() { + return fastqcParams; + } + + public FastqcWrapperParams setFastqcParams(Map fastqcParams) { + this.fastqcParams = fastqcParams; + return this; + } +} diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index 86e4a1c356f..4e4790a1539 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -457,7 +457,7 @@ public Response fastqcRun( @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, - @ApiParam(value = FastQcWrapperParams.DESCRIPTION, required = true) FastQcWrapperParams params) { + @ApiParam(value = FastqcWrapperParams.DESCRIPTION, required = true) FastqcWrapperParams params) { return submitJob(FastqcWrapperAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 61058c8d74f..b5cc6273473 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -55,8 +55,10 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.*; -import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.DeeptoolsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.GatkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -66,7 +68,6 @@ import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.exceptions.VersionException; import org.opencb.opencga.core.models.alignment.DeeptoolsWrapperParams; -import org.opencb.opencga.core.models.alignment.FastQcWrapperParams; import org.opencb.opencga.core.models.alignment.SamtoolsWrapperParams; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; @@ -76,7 +77,6 @@ import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.VariantStatsExportParams; import org.opencb.opencga.core.models.sample.Sample; -import org.opencb.opencga.core.models.sample.SampleAlignmentQualityControlMetrics; import org.opencb.opencga.core.models.variant.*; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.response.RestResponse; @@ -87,8 +87,8 @@ import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.QueryParam; import javax.ws.rs.*; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.*; import java.io.File; import java.io.FileInputStream; @@ -1202,21 +1202,6 @@ public Response sampleQcRun( } } - boolean runFastQc = false; - if (catalogBamFile != null) { - if (sample.getQualityControl() == null || CollectionUtils.isEmpty(sample.getQualityControl().getAlignmentMetrics())) { - runFastQc = true; - } else { - runFastQc = true; - for (SampleAlignmentQualityControlMetrics metrics : sample.getQualityControl().getAlignmentMetrics()) { - if (catalogBamFile.getId().equals(metrics.getBamFileId()) && metrics.getFastQc() != null) { - runFastQc = false; - break; - } - } - } - } - // Run variant stats if necessary if (runVariantStats) { SampleVariantStatsAnalysisParams sampleVariantStatsParams = new SampleVariantStatsAnalysisParams( @@ -1242,19 +1227,6 @@ public Response sampleQcRun( dependsOnList.add(signatureJob.getId()); } - // Run FastQC, if bam file exists - if (runFastQc) { - Map dynamicParams = new HashMap<>(); - dynamicParams.put("extract", "true"); - FastQcWrapperParams fastQcParams = new FastQcWrapperParams(catalogBamFile.getId(), null, dynamicParams); - logger.info("fastQcParams = " + fastQcParams); - - DataResult jobResult = submitJobRaw(FastqcWrapperAnalysis.ID, null, study, fastQcParams, - null, null, null, null); - Job fastqcJob = jobResult.first(); - dependsOnList.add(fastqcJob.getId()); - } - return submitJobRaw(SampleQcAnalysis.ID, null, study, params, jobName, jobDescription, StringUtils.join(dependsOnList, ","), jobTags); }); } From 635adce5979150b902dcebd5e49dad7d9e271dd6 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 28 Apr 2021 17:11:37 +0200 Subject: [PATCH 240/412] analysis: add new RGA variant summary, #1693 --- .../opencga/analysis/rga/RgaManager.java | 215 +++++++++++++++++- .../opencga/analysis/rga/RgaManagerTest.java | 12 + .../knockout/KnockoutByVariantSummary.java | 198 ++++++++++++++++ .../rest/analysis/ClinicalWebService.java | 46 +++- 4 files changed, 465 insertions(+), 6 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 269f5be91e8..caf753bc311 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -5,6 +5,9 @@ import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrException; +import org.opencb.biodata.models.variant.StudyEntry; +import org.opencb.biodata.models.variant.Variant; +import org.opencb.biodata.models.variant.avro.*; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.analysis.rga.exceptions.RgaException; @@ -21,6 +24,7 @@ import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.analysis.knockout.*; +import org.opencb.opencga.core.models.analysis.knockout.VariantStats; import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.sample.Sample; @@ -468,9 +472,11 @@ private VariantDBIterator variantStorageQuery(String study, List sampleI } Query variantQuery = new Query(VariantQueryParam.ID.key(), variantIds) - .append(VariantQueryParam.STUDY.key(), study) - .append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleIds) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); + .append(VariantQueryParam.STUDY.key(), study); + if (!sampleIds.isEmpty()) { + variantQuery.append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleIds) + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); + } QueryOptions queryOptions = new QueryOptions() .append(QueryOptions.EXCLUDE, Arrays.asList( @@ -751,6 +757,209 @@ public OpenCGAResult geneSummary(String studyStr, Query q return result; } + + public OpenCGAResult variantSummary(String studyStr, Query query, QueryOptions options, String token) + throws CatalogException, IOException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String userId = catalogManager.getUserManager().getUserId(token); + String collection = getCollectionName(study.getFqn()); + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + catalogManager.getAuthorizationManager().checkCanViewStudy(study.getUid(), userId); + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + QueryOptions queryOptions = setDefaultLimit(options); + + Query auxQuery = query != null ? new Query(query) : new Query(); + + Future numTotalResults = null; + if (queryOptions.getBoolean(QueryOptions.COUNT)) { + numTotalResults = executor.submit(() -> { + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.VARIANTS + ")"); + try { + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + return ((Number) result.first().getAggregationValues().get(0)).intValue(); + } catch (Exception e) { + logger.error("Could not obtain the count: {}", e.getMessage(), e); + } + return -1; + }); + } + + List variantIds = auxQuery.getAsStringList(RgaDataModel.VARIANTS); + // If the user is querying by variant id, we don't need to do a facet first + if (variantIds.isEmpty()) { + // 1st. we perform a facet to get the different variant ids matching the user query and using the skip and limit values + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS); + facetOptions.putIfNotNull(QueryOptions.LIMIT, queryOptions.get(QueryOptions.LIMIT)); + facetOptions.putIfNotNull(QueryOptions.SKIP, queryOptions.get(QueryOptions.SKIP)); + + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + if (result.getNumResults() == 0) { + stopWatch.stop(); + return OpenCGAResult.empty(KnockoutByVariantSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + } + variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + auxQuery.put(RgaDataModel.VARIANTS, variantIds); + } + + Future variantFuture = executor.submit( + () -> variantStorageQuery(study.getFqn(), Collections.emptyList(), auxQuery, QueryOptions.empty(), token) + ); + + // Generate 4 batches to create 4 threads + int batchSize = 4; + List> batchList = new ArrayList<>(batchSize); + int size = (int) Math.ceil(variantIds.size() / (double) batchSize); + + List batch = null; + for (int i = 0; i < variantIds.size(); i++) { + if (i % size == 0) { + if (batch != null) { + batchList.add(batch); + } + batch = new ArrayList<>(size); + } + batch.add(variantIds.get(i)); + } + batchList.add(batch); + + List>> variantSummaryList = new ArrayList<>(batchSize); + + for (List variantIdList : batchList) { + variantSummaryList.add(executor.submit(() -> calculatePartialSolrVariantSummary(collection, auxQuery, variantIdList))); + } + + Map variantSummaryMap = new HashMap<>(); + try { + for (Future> summaryFuture : variantSummaryList) { + for (KnockoutByVariantSummary knockoutByVariantSummary : summaryFuture.get()) { + variantSummaryMap.put(knockoutByVariantSummary.getId(), knockoutByVariantSummary); + } + } + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + + VariantDBIterator variantDBIterator; + try { + variantDBIterator = variantFuture.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + + while (variantDBIterator.hasNext()) { + Variant variant = variantDBIterator.next(); + + VariantAnnotation variantAnnotation = variant.getAnnotation(); + ConsequenceType consequenceType = variantAnnotation.getConsequenceTypes().get(0); + + KnockoutByVariantSummary knockoutByVariantSummary = variantSummaryMap.get(variant.getId()); + knockoutByVariantSummary.setDbSnp(variantAnnotation.getId()); + knockoutByVariantSummary.setChromosome(variant.getChromosome()); + knockoutByVariantSummary.setStart(variant.getStart()); + knockoutByVariantSummary.setEnd(variant.getEnd()); + knockoutByVariantSummary.setLength(variant.getLength()); + knockoutByVariantSummary.setReference(variant.getReference()); + knockoutByVariantSummary.setAlternate(variant.getAlternate()); + knockoutByVariantSummary.setType(variant.getType()); + knockoutByVariantSummary.setPopulationFrequencies(variantAnnotation.getPopulationFrequencies()); + knockoutByVariantSummary.setSequenceOntologyTerms(consequenceType.getSequenceOntologyTerms()); + knockoutByVariantSummary.setGenes(variantAnnotation.getXrefs() + .stream() + .filter(xref -> "HGNC".equals(xref.getSource())) + .map(Xref::getId) + .collect(Collectors.toList()) + ); + } + + List knockoutByVariantSummaryList = new ArrayList<>(variantSummaryMap.values()); + + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), + knockoutByVariantSummaryList.size(), knockoutByVariantSummaryList, -1); + + if (queryOptions.getBoolean(QueryOptions.COUNT)) { + try { + assert numTotalResults != null; + result.setNumMatches(numTotalResults.get()); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + } + + return result; + } + + private List calculatePartialSolrVariantSummary(String collection, Query query, List variantIdList) + throws IOException, RgaException { + List knockoutByVariantSummaryList = new ArrayList<>(variantIdList.size()); + for (String variantId : variantIdList) { + KnockoutByVariantSummary knockoutByVariantSummary = new KnockoutByVariantSummary().setId(variantId); + + Query auxQuery = new Query(query); + auxQuery.put(RgaDataModel.VARIANTS, variantId); + + // 1. Get clinical significances + QueryOptions knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.CLINICAL_SIGNIFICANCES); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); + knockoutByVariantSummary.setClinicalSignificances(facetFieldDataResult.first() + .getBuckets() + .stream() + .map(FacetField.Bucket::getValue) + .map(ClinicalSignificance::valueOf) + .collect(Collectors.toList()) + ); + + // 2. Get individual knockout type counts + QueryOptions geneFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_SUMMARY); + facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); + KnockoutTypeCount noParentsCount = new KnockoutTypeCount(auxQuery); + KnockoutTypeCount singleParentCount = new KnockoutTypeCount(auxQuery); + KnockoutTypeCount bothParentsCount = new KnockoutTypeCount(auxQuery); + + for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { + RgaUtils.CodedIndividual codedIndividual = RgaUtils.CodedIndividual.parseEncodedId(bucket.getValue()); + KnockoutTypeCount auxKnockoutType; + switch (codedIndividual.getNumParents()) { + case 0: + auxKnockoutType = noParentsCount; + break; + case 1: + auxKnockoutType = singleParentCount; + break; + case 2: + auxKnockoutType = bothParentsCount; + break; + default: + throw new IllegalStateException("Unexpected value: " + codedIndividual.getNumParents()); + } + + auxKnockoutType.processFeature(codedIndividual); + } + VariantStats noParentIndividualStats = new VariantStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), + noParentsCount.getNumCompHetIds(), noParentsCount.getNumHetIds(), noParentsCount.getNumDelOverlapIds()); + VariantStats singleParentIndividualStats = new VariantStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), + singleParentCount.getNumCompHetIds(), singleParentCount.getNumHetIds(), singleParentCount.getNumDelOverlapIds()); + VariantStats bothParentIndividualStats = new VariantStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), + bothParentsCount.getNumCompHetIds(), bothParentsCount.getNumHetIds(), bothParentsCount.getNumDelOverlapIds()); + + knockoutByVariantSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, + bothParentIndividualStats)); + + knockoutByVariantSummaryList.add(knockoutByVariantSummary); + } + return knockoutByVariantSummaryList; + } + private List calculateGeneSummary(String collection, Query query, List geneIdList) throws RgaException, IOException { List knockoutByGeneSummaryList = new ArrayList<>(geneIdList.size()); diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 4ff80eb4c87..fa2bc9ccd85 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -544,4 +544,16 @@ public void testVariantQueryLimit() throws CatalogException, IOException, RgaExc assertEquals(60, variantIds.size()); } + + @Test + public void testVariantSummary() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.variantSummary(STUDY, new Query(), QueryOptions.empty(), ownerToken); + assertEquals(10, result.getNumResults()); + for (KnockoutByVariantSummary variant : result.getResults()) { + assertNotNull(variant.getId()); + assertNotNull(variant.getDbSnp()); + assertFalse(variant.getGenes().isEmpty()); + } + } + } \ No newline at end of file diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java new file mode 100644 index 00000000000..2c5c87527de --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java @@ -0,0 +1,198 @@ +package org.opencb.opencga.core.models.analysis.knockout; + +import org.opencb.biodata.models.variant.avro.ClinicalSignificance; +import org.opencb.biodata.models.variant.avro.PopulationFrequency; +import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; +import org.opencb.biodata.models.variant.avro.VariantType; + +import java.util.List; + +public class KnockoutByVariantSummary { + + private String id; + private String dbSnp; + private String chromosome; + private int start; + private int end; + private int length; + private String reference; + private String alternate; + private VariantType type; + private List genes; + + private List populationFrequencies; + private List sequenceOntologyTerms; + private List clinicalSignificances; + + private IndividualStats individualStats; + + public KnockoutByVariantSummary() { + } + + public KnockoutByVariantSummary(String id, String dbSnp, String chromosome, int start, int end, int length, String reference, + String alternate, VariantType type, List genes, List populationFrequencies, + List sequenceOntologyTerms, List clinicalSignificances, + IndividualStats individualStats) { + this.id = id; + this.dbSnp = dbSnp; + this.chromosome = chromosome; + this.start = start; + this.end = end; + this.length = length; + this.reference = reference; + this.alternate = alternate; + this.type = type; + this.genes = genes; + this.populationFrequencies = populationFrequencies; + this.sequenceOntologyTerms = sequenceOntologyTerms; + this.clinicalSignificances = clinicalSignificances; + this.individualStats = individualStats; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("KnockoutByVariantSummary{"); + sb.append("id='").append(id).append('\''); + sb.append(", dbSnp='").append(dbSnp).append('\''); + sb.append(", chromosome='").append(chromosome).append('\''); + sb.append(", start=").append(start); + sb.append(", end=").append(end); + sb.append(", length=").append(length); + sb.append(", reference='").append(reference).append('\''); + sb.append(", alternate='").append(alternate).append('\''); + sb.append(", type=").append(type); + sb.append(", genes=").append(genes); + sb.append(", populationFrequencies=").append(populationFrequencies); + sb.append(", sequenceOntologyTerms=").append(sequenceOntologyTerms); + sb.append(", clinicalSignificances=").append(clinicalSignificances); + sb.append(", individualStats=").append(individualStats); + sb.append('}'); + return sb.toString(); + } + + public String getId() { + return id; + } + + public KnockoutByVariantSummary setId(String id) { + this.id = id; + return this; + } + + public String getDbSnp() { + return dbSnp; + } + + public KnockoutByVariantSummary setDbSnp(String dbSnp) { + this.dbSnp = dbSnp; + return this; + } + + public String getChromosome() { + return chromosome; + } + + public KnockoutByVariantSummary setChromosome(String chromosome) { + this.chromosome = chromosome; + return this; + } + + public int getStart() { + return start; + } + + public KnockoutByVariantSummary setStart(int start) { + this.start = start; + return this; + } + + public int getEnd() { + return end; + } + + public KnockoutByVariantSummary setEnd(int end) { + this.end = end; + return this; + } + + public int getLength() { + return length; + } + + public KnockoutByVariantSummary setLength(int length) { + this.length = length; + return this; + } + + public String getReference() { + return reference; + } + + public KnockoutByVariantSummary setReference(String reference) { + this.reference = reference; + return this; + } + + public String getAlternate() { + return alternate; + } + + public KnockoutByVariantSummary setAlternate(String alternate) { + this.alternate = alternate; + return this; + } + + public VariantType getType() { + return type; + } + + public KnockoutByVariantSummary setType(VariantType type) { + this.type = type; + return this; + } + + public List getGenes() { + return genes; + } + + public KnockoutByVariantSummary setGenes(List genes) { + this.genes = genes; + return this; + } + + public List getPopulationFrequencies() { + return populationFrequencies; + } + + public KnockoutByVariantSummary setPopulationFrequencies(List populationFrequencies) { + this.populationFrequencies = populationFrequencies; + return this; + } + + public List getSequenceOntologyTerms() { + return sequenceOntologyTerms; + } + + public KnockoutByVariantSummary setSequenceOntologyTerms(List sequenceOntologyTerms) { + this.sequenceOntologyTerms = sequenceOntologyTerms; + return this; + } + + public List getClinicalSignificances() { + return clinicalSignificances; + } + + public KnockoutByVariantSummary setClinicalSignificances(List clinicalSignificances) { + this.clinicalSignificances = clinicalSignificances; + return this; + } + + public IndividualStats getIndividualStats() { + return individualStats; + } + + public KnockoutByVariantSummary setIndividualStats(IndividualStats individualStats) { + this.individualStats = individualStats; + return this; + } +} diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 32c7828c0ca..e0f0bc7cc6a 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -798,9 +798,6 @@ public Response rgaGeneQuery( @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query"), - @ApiImplicitParam(name = RgaQueryParams.INCLUDE_INDIVIDUAL, value = RgaQueryParams.INCLUDE_INDIVIDUAL_DESCR, example = "ind1,ind2,ind3", dataType = "string", paramType = "query"), - @ApiImplicitParam(name = RgaQueryParams.SKIP_INDIVIDUAL, value = RgaQueryParams.SKIP_INDIVIDUAL_DESCR, dataType = "integer", paramType = "query"), - @ApiImplicitParam(name = RgaQueryParams.LIMIT_INDIVIDUAL, value = RgaQueryParams.LIMIT_INDIVIDUAL_DESCR, dataType = "integer", paramType = "query"), @ApiImplicitParam(name = "sampleId", value = RgaQueryParams.SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "individualId", value = RgaQueryParams.INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), @@ -884,6 +881,49 @@ public Response rgaVariantQuery( }); } + @GET + @Path("/rga/variant/summary") + @ApiOperation(value = "RGA variant summary stats", response = KnockoutByVariantSummary.class) + @ApiImplicitParams({ + // Query options + @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query"), + + @ApiImplicitParam(name = "sampleId", value = RgaQueryParams.SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "individualId", value = RgaQueryParams.INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "sex", value = RgaQueryParams.SEX_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "phenotypes", value = RgaQueryParams.PHENOTYPES_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "disorders", value = RgaQueryParams.DISORDERS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "numParents", value = RgaQueryParams.NUM_PARENTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneId", value = RgaQueryParams.GENE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneName", value = RgaQueryParams.GENE_NAME_DESCR, dataType = "string", paramType = "query"), +// @ApiImplicitParam(name = "geneBiotype", value = RgaQueryParams.GENE_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "chromosome", value = RgaQueryParams.CHROMOSOME_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "start", value = RgaQueryParams.START_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "end", value = RgaQueryParams.END_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), +// @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "clinicalSignificance", value = RgaQueryParams.CLINICAL_SIGNIFICANCE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "populationFrequency", value = RgaQueryParams.POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "consequenceType", value = RgaQueryParams.CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query") + }) + public Response rgaVariantSummary( + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String studyStr + ) { + // Get all query options + return run(() -> { + QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); + Query query = RgaQueryParams.getQueryParams(queryOptions); + + return getRgaManager().variantSummary(studyStr, query, queryOptions, token); + }); + } + @GET @Path("/rga/aggregationStats") @ApiOperation(value = "RGA aggregation stats", response = FacetField.class) From 9aa03191677a10a8ff805a9d343bbebe71c53b68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 28 Apr 2021 18:03:05 +0100 Subject: [PATCH 241/412] storage: Fix Range#buildRanges for IndexFieldConfiguration --- .../query/executors/accumulators/Range.java | 40 ++++++++++++++++++- .../executors/accumulators/RangeTest.java | 27 +++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java index 25d5bf48af6..3e6898f24b4 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/Range.java @@ -93,7 +93,7 @@ public static List> buildRanges(IndexFieldConfiguration index, Dou for (int i = 1; i < thresholds.length; i++) { ranges.add(new Range<>(thresholds[i - 1], startInclusive, thresholds[i], endInclusive)); } - ranges.add(new Range<>(thresholds[thresholds.length - 1], false, max, false)); + ranges.add(new Range<>(thresholds[thresholds.length - 1], startInclusive, max, false)); // Check duplicated values for (int i = index.getNullable() ? 2 : 1; i < ranges.size() - 1; i++) { @@ -186,6 +186,27 @@ public boolean isNA() { return false; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Range range = (Range) o; + return startInclusive == range.startInclusive + && endInclusive == range.endInclusive + && Objects.equals(start, range.start) + && Objects.equals(end, range.end) + && Objects.equals(s, range.s); + } + + @Override + public int hashCode() { + return Objects.hash(start, startInclusive, end, endInclusive, s); + } + public static class NA> extends Range { public NA() { @@ -215,5 +236,22 @@ public int compareTo(Range o) { return -1; } } + + @Override + public int hashCode() { + return Objects.hash(toString()); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null) { + return false; + } else { + return getClass() == o.getClass(); + } + } } } diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java index bc34d179607..7ad10c6e2ed 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/query/executors/accumulators/RangeTest.java @@ -1,6 +1,10 @@ package org.opencb.opencga.storage.core.variant.query.executors.accumulators; import org.junit.Test; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; + +import java.util.Arrays; +import java.util.List; import static org.junit.Assert.*; public class RangeTest { @@ -17,6 +21,29 @@ public void testParse() { checkParse("NA"); } + @Test + public void buildFromIndex() { + IndexFieldConfiguration configuration = new IndexFieldConfiguration(IndexFieldConfiguration.Source.FILE, "QUAL", new double[]{20d, 30d, 250d}, IndexFieldConfiguration.Type.RANGE_LT); + List> ranges = Range.buildRanges(configuration); + assertEquals(Arrays.asList( + Range.parse("NA"), + Range.parse("(-inf, 20.0)"), + Range.parse("[20.0, 30.0)"), + Range.parse("[30.0, 250.0)"), + Range.parse("[250.0, inf)") + ), ranges); + + configuration = new IndexFieldConfiguration(IndexFieldConfiguration.Source.FILE, "QUAL", new double[]{20d, 30d, 250d}, IndexFieldConfiguration.Type.RANGE_GT); + ranges = Range.buildRanges(configuration); + assertEquals(Arrays.asList( + Range.parse("NA"), + Range.parse("(-inf, 20.0]"), + Range.parse("(20.0, 30.0]"), + Range.parse("(30.0, 250.0]"), + Range.parse("(250.0, inf)") + ), ranges); + } + protected void checkParse(String s) { assertEquals(s, Range.parse(s).toString()); } From 200a7f1af16a949aac12d914c115c82af66b37e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 29 Apr 2021 08:31:09 +0200 Subject: [PATCH 242/412] analysis: implement alignments/coverage/qc/geneCoverageStats/run, #1739 --- .../qc/AlignmentFastQcMetricsAnalysis.java | 2 +- .../qc/AlignmentFlagStatsAnalysis.java | 9 +- .../AlignmentGeneCoverageStatsAnalysis.java | 2 +- .../qc/AlignmentHsMetricsAnalysis.java | 2 +- .../alignment/qc/AlignmentStatsAnalysis.java | 3 +- .../analysis/AlignmentCommandExecutor.java | 2 +- .../client/rest/clients/AdminClient.java | 2 +- .../client/rest/clients/AlignmentClient.java | 45 ++++---- .../client/rest/clients/ClinicalClient.java | 75 ++++++++++++- .../client/rest/clients/CohortClient.java | 2 +- .../rest/clients/DiseasePanelClient.java | 2 +- .../client/rest/clients/FamilyClient.java | 2 +- .../client/rest/clients/FileClient.java | 2 +- .../client/rest/clients/GA4GHClient.java | 2 +- .../client/rest/clients/IndividualClient.java | 2 +- .../client/rest/clients/JobClient.java | 2 +- .../client/rest/clients/MetaClient.java | 2 +- .../client/rest/clients/ProjectClient.java | 2 +- .../client/rest/clients/SampleClient.java | 2 +- .../client/rest/clients/StudyClient.java | 2 +- .../client/rest/clients/UserClient.java | 2 +- .../client/rest/clients/VariantClient.java | 12 +-- .../rest/clients/VariantOperationClient.java | 2 +- .../core/models/alignment/Alignment.java | 76 +++++++++++++ .../alignment/AlignmentQualityControl.java | 101 ------------------ .../core/models/alignment/Coverage.java | 40 +++++++ .../core/models/file/FileQualityControl.java | 33 ++++-- .../rest/analysis/AlignmentWebService.java | 28 ++--- 28 files changed, 277 insertions(+), 181 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Alignment.java delete mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Coverage.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java index 9ad97f84950..d5b04515b35 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java @@ -127,7 +127,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignmentQualityControl().setFastQcMetrics(fastQcMetrics); + qc.getAlignment().setFastQcMetrics(fastQcMetrics); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java index 97192744fc2..07c3accda35 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java @@ -20,23 +20,18 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; import org.opencb.biodata.formats.alignment.samtools.io.SamtoolsFlagstatsParser; -import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysisExecutor; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; -import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.file.FileQualityControl; import org.opencb.opencga.core.models.file.FileUpdateParams; -import org.opencb.opencga.core.models.file.PostLinkToolParams; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.tools.annotations.ToolParams; @@ -44,9 +39,7 @@ import java.nio.charset.Charset; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Map; import static org.apache.commons.io.FileUtils.readLines; import static org.opencb.opencga.core.api.ParamConstants.ALIGNMENT_FLAG_STATS_DESCRIPTION; @@ -130,7 +123,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignmentQualityControl().setSamtoolsFlagStats(flagStats); + qc.getAlignment().setSamtoolsFlagStats(flagStats); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java index 9b579b553f4..68f594c08c8 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java @@ -115,7 +115,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignmentQualityControl().setGeneCoverageStats(geneCoverageStats); + qc.getCoverage().setGeneCoverageStats(geneCoverageStats); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java index df17e107867..08e8b5afcee 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java @@ -154,7 +154,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignmentQualityControl().setHsMetrics(hsMetrics); + qc.getAlignment().setHsMetrics(hsMetrics); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java index c5051904f0d..26bc67cd75a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java @@ -125,6 +125,7 @@ protected void run() throws ToolException { step(PLOT_BAMSTATS_STEP, () -> { executorParams.put(EXECUTOR_ID, SamtoolsWrapperAnalysisExecutor.ID); + executorParams.remove("F"); getToolExecutor(SamtoolsWrapperAnalysisExecutor.class) .setCommand("plot-bamstats") .setInputFile(statsFile.toString()) @@ -152,7 +153,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignmentQualityControl().setSamtoolsStats(alignmentStats); + qc.getAlignment().setSamtoolsStats(alignmentStats); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index 82293939f5d..62f3162bcf0 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -348,7 +348,7 @@ private RestResponse geneCoverageStatsRun() throws ClientException { ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); params.putAll(getJobParams()); - return openCGAClient.getAlignmentClient().genecoveragestatsQc(new AlignmentGeneCoverageStatsParams(cliOptions.bamFile, + return openCGAClient.getAlignmentClient().runQcGeneCoverageStats(new AlignmentGeneCoverageStatsParams(cliOptions.bamFile, Arrays.asList(cliOptions.genes.split(",")), cliOptions.outdir), params); } diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java index 691c5d56124..980589f900b 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java index 513b96918de..9b310d7d96e 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java @@ -40,7 +40,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -94,6 +94,24 @@ public RestResponse runCoverageIndex(CoverageIndexParams data, ObjectMap pa return execute("analysis", null, "alignment/coverage/index", null, "run", params, POST, Job.class); } + /** + * Compute gene coverage stats for a given alignment file and a list of genes. + * @param data Gene coverage stats parameters for a given BAM file and a list of genes. + * @param params Map containing any of the following optional parameters. + * study: study. + * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. + * jobDependsOn: Comma separated list of existing job IDs the job will depend on. + * jobDescription: Job description. + * jobTags: Job tags. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse runQcGeneCoverageStats(AlignmentGeneCoverageStatsParams data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("analysis", null, "alignment/coverage/qc/geneCoverageStats", null, "run", params, POST, Job.class); + } + /** * Query the coverage of an alignment file for regions or genes. * @param file File ID. @@ -177,7 +195,7 @@ public RestResponse runDeeptools(DeeptoolsWrapperParams data, ObjectMap par } /** - * A quality control tool for high throughput sequence data. + * A high throughput sequence QC analysis tool. * @param data FastQC parameters. * @param params Map containing any of the following optional parameters. * study: study. @@ -214,7 +232,7 @@ public RestResponse runIndex(AlignmentIndexParams data, ObjectMap params) t /** * Picard is a set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) data and formats such as - * SAM/BAM/CRAM and VCF. + * SAM/BAM/CRAM and VCF. Supported Picard commands: CollectHsMetrics, CollectWgsMetrics, BedToIntervalList. * @param data Picard parameters. * @param params Map containing any of the following optional parameters. * study: study. @@ -231,24 +249,6 @@ public RestResponse runPicard(PicardWrapperParams data, ObjectMap params) t return execute("analysis", null, "alignment/picard", null, "run", params, POST, Job.class); } - /** - * Compute gene coverage stats for a given alignment file and a list of genes. - * @param data Gene coverage stats parameters for a given BAM file and a list of genes. - * @param params Map containing any of the following optional parameters. - * study: study. - * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. - * jobDependsOn: Comma separated list of existing job IDs the job will depend on. - * jobDescription: Job description. - * jobTags: Job tags. - * @return a RestResponse object. - * @throws ClientException ClientException if there is any server error. - */ - public RestResponse genecoveragestatsQc(AlignmentGeneCoverageStatsParams data, ObjectMap params) throws ClientException { - params = params != null ? params : new ObjectMap(); - params.put("body", data); - return execute("analysis", null, "alignment/qc", null, "genecoveragestats", params, POST, Job.class); - } - /** * Compute quality control (QC) metrics for a given alignment file (including samtools stats, samtools flag stats, FastQC and HS * metrics). @@ -302,7 +302,8 @@ public RestResponse query(String file, ObjectMap params) throws C } /** - * Samtools is a program for interacting with high-throughput sequencing data in SAM, BAM and CRAM formats. + * Samtools is a program for interacting with high-throughput sequencing data in SAM, BAM and CRAM formats. Supported Samtools + * commands: sort, index, view, stats, flagstat, dict, faidx, depth, plot-bamstats. * @param data Samtoolstools parameters. * @param params Map containing any of the following optional parameters. * study: study. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java index 7c2de909354..30c6ed60ac1 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java @@ -22,7 +22,9 @@ import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGeneSummary; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividualSummary; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.models.clinical.CancerTieringInterpretationAnalysisParams; @@ -46,7 +48,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -347,6 +349,43 @@ public RestResponse queryRgaGene(ObjectMap params) throws Cli return execute("analysis", null, "clinical/rga/gene", null, "query", params, GET, RgaKnockoutByGene.class); } + /** + * RGA gene summary stats. + * @param params Map containing any of the following optional parameters. + * limit: Number of results to be returned. + * skip: Number of results to skip. + * count: Get the total number of results matching the query. Deactivated by default. + * includeIndividual: Include only the comma separated list of individuals to the response. + * skipIndividual: Number of individuals to skip. + * limitIndividual: Limit number of individuals returned (default: 1000). + * sampleId: Filter by sample id. + * individualId: Filter by individual id. + * sex: Filter by sex. + * phenotypes: Filter by phenotypes. + * disorders: Filter by disorders. + * numParents: Filter by the number of parents registered. + * geneId: Filter by gene id. + * geneName: Filter by gene name. + * chromosome: Filter by chromosome. + * start: Filter by start position. + * end: Filter by end position. + * transcriptId: Filter by transcript id. + * variants: Filter by variant id. + * knockoutType: Filter by knockout type. + * filter: Filter by filter (PASS, NOT_PASS). + * type: Filter by variant type. + * clinicalSignificance: Filter by clinical significance. + * populationFrequency: Filter by population frequency. + * consequenceType: Filter by consequence type. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse summaryRgaGene(ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + return execute("analysis", null, "clinical/rga/gene", null, "summary", params, GET, KnockoutByGeneSummary.class); + } + /** * Generate Recessive Gene Analysis secondary index. * @param data Recessive Gene Analysis index params. @@ -401,6 +440,40 @@ public RestResponse queryRgaIndividual(ObjectMap params) t return execute("analysis", null, "clinical/rga/individual", null, "query", params, GET, KnockoutByIndividual.class); } + /** + * RGA individual summary stats. + * @param params Map containing any of the following optional parameters. + * limit: Number of results to be returned. + * skip: Number of results to skip. + * count: Get the total number of results matching the query. Deactivated by default. + * sampleId: Filter by sample id. + * individualId: Filter by individual id. + * sex: Filter by sex. + * phenotypes: Filter by phenotypes. + * disorders: Filter by disorders. + * numParents: Filter by the number of parents registered. + * geneId: Filter by gene id. + * geneName: Filter by gene name. + * chromosome: Filter by chromosome. + * start: Filter by start position. + * end: Filter by end position. + * transcriptId: Filter by transcript id. + * variants: Filter by variant id. + * knockoutType: Filter by knockout type. + * filter: Filter by filter (PASS, NOT_PASS). + * type: Filter by variant type. + * clinicalSignificance: Filter by clinical significance. + * populationFrequency: Filter by population frequency. + * consequenceType: Filter by consequence type. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse summaryRgaIndividual(ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + return execute("analysis", null, "clinical/rga/individual", null, "summary", params, GET, KnockoutByIndividualSummary.class); + } + /** * Query variant RGA. * @param params Map containing any of the following optional parameters. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java index 5ffc813d466..490debadb43 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java index 61820a21dfc..e12aaa9f0ca 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java @@ -31,7 +31,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java index 9d92a66bfe6..19bfb865cd8 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java index 23cd77f5db9..f34150e93b3 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java index 75e038ce824..2d1d45ff9ee 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java @@ -27,7 +27,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java index 9af835c9428..94cf3f445a6 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java index 8b30fe6e4f2..f3ed29d6896 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java index f1be8d4d775..e4495e6a3b9 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java @@ -28,7 +28,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java index a1a5f1e84a5..3b90ad3afb5 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java @@ -32,7 +32,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java index 16b652bcd2a..ae71ad3c475 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java index d23cb6fbb8f..a56cb8d99fc 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java index 8ff5a786f51..d4eef6687d9 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java @@ -37,7 +37,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 16d6cd35037..4c5e9c3afec 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -59,7 +59,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -120,7 +120,7 @@ public VariantClient(String token, ClientConfiguration configuration) { * clinicalSignificance: Clinical significance: benign, likely_benign, likely_pathogenic, pathogenic. * customAnnotation: Custom annotation: {key}[<|>|<=|>=]{number} or {key}[~=|=]{text}. * trait: List of traits, based on ClinVar, HPO, COSMIC, i.e.: IDs, histologies, descriptions,... - * fields: List of facet fields separated by semicolons, e.g.: studies;type. For nested faceted fields use >>, e.g.: + * field: List of facet fields separated by semicolons, e.g.: studies;type. For nested faceted fields use >>, e.g.: * chromosome>>type;percentile(gerp). * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. @@ -737,7 +737,7 @@ public RestResponse runRvtests(RvtestsRunParams data, ObjectMap params) thr * biotype: List of biotypes, e.g. protein_coding. * populationFrequencyAlt: Alternate Population Frequency: {study}:{population}[<|>|<=|>=]{number}. e.g. 1kG_phase3:ALL<0.01. * clinicalSignificance: Clinical significance: benign, likely_benign, likely_pathogenic, pathogenic. - * fields: List of facet fields separated by semicolons, e.g.: studies;type. For nested faceted fields use >>, e.g.: + * field: List of facet fields separated by semicolons, e.g.: studies;type. For nested faceted fields use >>, e.g.: * chromosome>>type . Accepted values: chromosome, type, genotype, consequenceType, biotype, clinicalSignificance, dp, qual, * filter. * @return a RestResponse object. @@ -767,8 +767,8 @@ public RestResponse runSampleEligibility(SampleEligibilityAnalysisParams da } /** - * Run quality control (QC) for a given sample. It includes variant stats, FastQC,samtools/flagstat, picard/CollectHsMetrics and gene - * coverage stats; and for somatic samples, mutational signature. + * Run quality control (QC) for a given sample. It includes variant stats and gene coverage stats; and for somatic samples, mutational + * signature. * @param data Sample QC analysis params. * @param params Map containing any of the following optional parameters. * study: Study [[user@]project:]study where study and project can be either the ID or UUID. @@ -887,7 +887,7 @@ public RestResponse runStatsExport(VariantStatsExportParams data, ObjectMap } /** - * Compute variant stats for any cohort and any set of variants. Optionally, index the result in the variant storage database. + * Compute variant stats for any cohort and any set of variants. * @param data Variant stats params. * @param params Map containing any of the following optional parameters. * study: Study [[user@]project:]study where study and project can be either the ID or UUID. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java index c7403dc6ae5..e0a2ca26ff1 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java @@ -42,7 +42,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-26 09:18:23 +* Autogenerated on: 2021-04-28 17:47:26 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Alignment.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Alignment.java new file mode 100644 index 00000000000..9b9638442a6 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Alignment.java @@ -0,0 +1,76 @@ +package org.opencb.opencga.core.models.alignment; + +import org.opencb.biodata.formats.alignment.picard.HsMetrics; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; +import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; +import org.opencb.biodata.models.alignment.GeneCoverageStats; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class Alignment implements Serializable { + private FastQcMetrics fastQcMetrics; + private SamtoolsStats samtoolsStats; + private SamtoolsFlagstats samtoolsFlagStats; + private HsMetrics hsMetrics; + + public Alignment() { + this(new FastQcMetrics(), new SamtoolsStats(), new SamtoolsFlagstats(), new HsMetrics()); + } + + public Alignment(FastQcMetrics fastQcMetrics, SamtoolsStats samtoolsStats, SamtoolsFlagstats samtoolsFlagStats, HsMetrics hsMetrics) { + this.fastQcMetrics = fastQcMetrics; + this.samtoolsStats = samtoolsStats; + this.samtoolsFlagStats = samtoolsFlagStats; + this.hsMetrics = hsMetrics; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Alignment{"); + sb.append("fastQcMetrics=").append(fastQcMetrics); + sb.append(", samtoolsStats=").append(samtoolsStats); + sb.append(", samtoolsFlagStats=").append(samtoolsFlagStats); + sb.append(", hsMetrics=").append(hsMetrics); + sb.append('}'); + return sb.toString(); + } + + public FastQcMetrics getFastQcMetrics() { + return fastQcMetrics; + } + + public Alignment setFastQcMetrics(FastQcMetrics fastQcMetrics) { + this.fastQcMetrics = fastQcMetrics; + return this; + } + + public SamtoolsStats getSamtoolsStats() { + return samtoolsStats; + } + + public Alignment setSamtoolsStats(SamtoolsStats samtoolsStats) { + this.samtoolsStats = samtoolsStats; + return this; + } + + public SamtoolsFlagstats getSamtoolsFlagStats() { + return samtoolsFlagStats; + } + + public Alignment setSamtoolsFlagStats(SamtoolsFlagstats samtoolsFlagStats) { + this.samtoolsFlagStats = samtoolsFlagStats; + return this; + } + + public HsMetrics getHsMetrics() { + return hsMetrics; + } + + public Alignment setHsMetrics(HsMetrics hsMetrics) { + this.hsMetrics = hsMetrics; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java deleted file mode 100644 index e6dcea94bc5..00000000000 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.opencb.opencga.core.models.alignment; - -import org.opencb.biodata.formats.alignment.picard.HsMetrics; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; -import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; -import org.opencb.biodata.models.alignment.GeneCoverageStats; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -public class AlignmentQualityControl implements Serializable { - private String fileId; - private FastQcMetrics fastQcMetrics; - private SamtoolsStats samtoolsStats; - private SamtoolsFlagstats samtoolsFlagStats; - private HsMetrics hsMetrics; - private List geneCoverageStats; - - public AlignmentQualityControl() { - this(null, new FastQcMetrics(), new SamtoolsStats(), new SamtoolsFlagstats(), new HsMetrics(), new ArrayList<>()); - } - - public AlignmentQualityControl(String fileId, FastQcMetrics fastQcMetrics, SamtoolsStats samtoolsStats, SamtoolsFlagstats samtoolsFlagStats, - HsMetrics hsMetrics, List geneCoverageStats) { - this.fileId = fileId; - this.fastQcMetrics = fastQcMetrics; - this.samtoolsStats = samtoolsStats; - this.samtoolsFlagStats = samtoolsFlagStats; - this.hsMetrics = hsMetrics; - this.geneCoverageStats = geneCoverageStats; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("AlignmentQualityControl{"); - sb.append("fileId='").append(fileId).append('\''); - sb.append(", fastQcMetrics=").append(fastQcMetrics); - sb.append(", samtoolsStats=").append(samtoolsStats); - sb.append(", samtoolsFlagstats=").append(samtoolsFlagStats); - sb.append(", hsMetrics=").append(hsMetrics); - sb.append(", geneCoverageStats=").append(geneCoverageStats); - sb.append('}'); - return sb.toString(); - } - - public String getFileId() { - return fileId; - } - - public AlignmentQualityControl setFileId(String fileId) { - this.fileId = fileId; - return this; - } - - public FastQcMetrics getFastQcMetrics() { - return fastQcMetrics; - } - - public AlignmentQualityControl setFastQcMetrics(FastQcMetrics fastQcMetrics) { - this.fastQcMetrics = fastQcMetrics; - return this; - } - - public SamtoolsStats getSamtoolsStats() { - return samtoolsStats; - } - - public AlignmentQualityControl setSamtoolsStats(SamtoolsStats samtoolsStats) { - this.samtoolsStats = samtoolsStats; - return this; - } - - public SamtoolsFlagstats getSamtoolsFlagStats() { - return samtoolsFlagStats; - } - - public AlignmentQualityControl setSamtoolsFlagStats(SamtoolsFlagstats samtoolsFlagStats) { - this.samtoolsFlagStats = samtoolsFlagStats; - return this; - } - - public HsMetrics getHsMetrics() { - return hsMetrics; - } - - public AlignmentQualityControl setHsMetrics(HsMetrics hsMetrics) { - this.hsMetrics = hsMetrics; - return this; - } - - public List getGeneCoverageStats() { - return geneCoverageStats; - } - - public AlignmentQualityControl setGeneCoverageStats(List geneCoverageStats) { - this.geneCoverageStats = geneCoverageStats; - return this; - } -} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Coverage.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Coverage.java new file mode 100644 index 00000000000..a1662ffaa1f --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Coverage.java @@ -0,0 +1,40 @@ +package org.opencb.opencga.core.models.alignment; + +import org.opencb.biodata.formats.alignment.picard.HsMetrics; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; +import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; +import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; +import org.opencb.biodata.models.alignment.GeneCoverageStats; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class Coverage implements Serializable { + private List geneCoverageStats; + + public Coverage() { + this(new ArrayList<>()); + } + + public Coverage(List geneCoverageStats) { + this.geneCoverageStats = geneCoverageStats; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Coverage{"); + sb.append(", geneCoverageStats=").append(geneCoverageStats); + sb.append('}'); + return sb.toString(); + } + + public List getGeneCoverageStats() { + return geneCoverageStats; + } + + public Coverage setGeneCoverageStats(List geneCoverageStats) { + this.geneCoverageStats = geneCoverageStats; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java index cdd1608525a..7c5ba2dc0f1 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java @@ -1,32 +1,45 @@ package org.opencb.opencga.core.models.file; -import org.opencb.opencga.core.models.alignment.AlignmentQualityControl; +import org.opencb.opencga.core.models.alignment.Alignment; +import org.opencb.opencga.core.models.alignment.Coverage; public class FileQualityControl { - private AlignmentQualityControl alignmentQualityControl; + private Alignment alignment; + private Coverage coverage; public FileQualityControl() { - this(new AlignmentQualityControl()); + this(new Alignment(), new Coverage()); } - public FileQualityControl(AlignmentQualityControl alignmentQualityControl) { - this.alignmentQualityControl = alignmentQualityControl; + public FileQualityControl(Alignment alignment, Coverage coverage) { + this.alignment = alignment; + this.coverage = coverage; } @Override public String toString() { final StringBuilder sb = new StringBuilder("FileQualityControl{"); - sb.append("alignmentQualityControl=").append(alignmentQualityControl); + sb.append("alignment=").append(alignment); + sb.append(", coverage=").append(coverage); sb.append('}'); return sb.toString(); } - public AlignmentQualityControl getAlignmentQualityControl() { - return alignmentQualityControl; + public Alignment getAlignment() { + return alignment; } - public FileQualityControl setAlignmentQualityControl(AlignmentQualityControl alignmentQualityControl) { - this.alignmentQualityControl = alignmentQualityControl; + public FileQualityControl setAlignment(Alignment alignment) { + this.alignment = alignment; + return this; + } + + public Coverage getCoverage() { + return coverage; + } + + public FileQualityControl setCoverage(Coverage coverage) { + this.coverage = coverage; return this; } } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index 4e4790a1539..7caf6cb83ae 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -373,36 +373,36 @@ public Response coverageQuery( } } - //------------------------------------------------------------------------- - // Quality control (QC): stats, flag stats, FastQC and HS metrics - //------------------------------------------------------------------------- - @POST - @Path("/qc/run") - @ApiOperation(value = ALIGNMENT_QC_DESCRIPTION, response = Job.class) - public Response qcRun( + @Path("/coverage/qc/geneCoverageStats/run") + @ApiOperation(value = ALIGNMENT_GENE_COVERAGE_STATS_DESCRIPTION, response = Job.class) + public Response geneCoverageStatsRun( @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, - @ApiParam(value = AlignmentQcParams.DESCRIPTION, required = true) AlignmentQcParams params) { + @ApiParam(value = AlignmentGeneCoverageStatsParams.DESCRIPTION, required = true) AlignmentGeneCoverageStatsParams params) { - return submitJob(AlignmentQcAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + return submitJob(AlignmentGeneCoverageStatsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } + //------------------------------------------------------------------------- + // Quality control (QC): stats, flag stats, FastQC and HS metrics + //------------------------------------------------------------------------- + @POST - @Path("/qc/genecoveragestats") - @ApiOperation(value = ALIGNMENT_GENE_COVERAGE_STATS_DESCRIPTION, response = Job.class) - public Response geneCoverageStatsRun( + @Path("/qc/run") + @ApiOperation(value = ALIGNMENT_QC_DESCRIPTION, response = Job.class) + public Response qcRun( @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, - @ApiParam(value = AlignmentGeneCoverageStatsParams.DESCRIPTION, required = true) AlignmentGeneCoverageStatsParams params) { + @ApiParam(value = AlignmentQcParams.DESCRIPTION, required = true) AlignmentQcParams params) { - return submitJob(AlignmentGeneCoverageStatsAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + return submitJob(AlignmentQcAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } //------------------------------------------------------------------------- From a314706cdc448776e942261dbdd935455c2d3189 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 29 Apr 2021 12:02:59 +0100 Subject: [PATCH 243/412] client: fix ntbooks --- .../user-training/pyopencga_first_steps.ipynb | 70 ++++++++++++------- .../pyopencga_variant_query.ipynb | 4 +- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb index ca95bac7ab4..e1cf6db3109 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_first_steps.ipynb @@ -93,7 +93,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 14, "id": "designing-turkish", "metadata": {}, "outputs": [], @@ -116,7 +116,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 15, "id": "supreme-cameroon", "metadata": {}, "outputs": [ @@ -156,7 +156,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 16, "id": "comparable-kansas", "metadata": {}, "outputs": [], @@ -196,13 +196,12 @@ "outputs": [], "source": [ "## Option 1: here we put only the user in order to be asked for the password interactively\n", - "\n", "# oc.login(user)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 17, "id": "manufactured-current", "metadata": {}, "outputs": [], @@ -239,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 18, "id": "several-england", "metadata": {}, "outputs": [], @@ -265,7 +264,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 19, "id": "secondary-kingston", "metadata": {}, "outputs": [ @@ -313,21 +312,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 13, "id": "collaborative-episode", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "family Family Studies GRCh37\n", - "population Population Studies GRCh38\n" - ] - } - ], + "outputs": [], "source": [ - "# Loop through all diferent projects \n", + "## Loop through all diferent projects \n", "\n", "for project in projects.get_results():\n", " print(project['id'], project['name'])" @@ -372,7 +362,7 @@ "source": [ "### 3. Using `print_results()` function to iterate over the Rest results\n", "\n", - "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the RESTResponse obejct implements a very powerful custom function to print results 😎\n", + "**IMPORTANT**: This function implements a configuration to exclude metadata, change separator or even select the fields! Then it reaches all the user-desired results and prints them directly in the terminal.
In this way, the `RESTResponse` objectt implements a very powerful custom function to print results 😎\n", "\n", "**[NOTE]**: From *pyopencga 2.0.1.2* you can use the `title` parameter in the function to add a header to the results printed." ] @@ -403,7 +393,7 @@ ], "source": [ "## This function iterates over all the results, it can be configured to exclude metadata, change separator or even select the fields!\n", - "# Set a title to display the results\n", + "## Set a title to display the results\n", "user_defined_title = 'These are the projects you can access with your user'\n", "\n", "projects.print_results(title=user_defined_title)" @@ -438,10 +428,9 @@ "source": [ "## Lets exclude metadata and print only few fields, use dot notation for nested fields\n", "user_defined_title = 'Display selected fields from the projects data model'\n", + "selected_fields='id,name,organism.scientificName,organism.assembly'\n", "\n", - "\n", - "projects.print_results(fields='id,name,organism.scientificName,organism.assembly',metadata=False,title=user_defined_title)\n", - "\n" + "projects.print_results(fields=selected_fields, metadata=False, title=user_defined_title)\n" ] }, { @@ -484,9 +473,38 @@ "source": [ "### 4. Using Pandas DataFrame: `to_data_frame()` \n", "\n", - "Pandas provides a very useful functionality for data science. You can convert RestResponse objects to Pandas DataFram using the following function:\n", + "Pandas provides a very useful functionality for data science. You can convert `RestResponse` objects to Pandas DataFrames using the following function:\n", "\n", - "`res_response.to_data_frame()`\n" + "`rest_response.to_data_frame()`" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "miniature-desperate", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The results can be stored and printed as a pandas DF:\n", + "\n", + " id name fqn creationDate \\\n", + "0 family Family Studies GRCh37 demo@family 20200625131808 \n", + "1 population Population Studies GRCh38 demo@population 20200706210517 \n", + "\n", + " studies organism.scientificName \n", + "0 [{'id': 'platinum', 'name': 'Illumina Platinum... Homo sapiens \n", + "1 [{'id': '1000g', 'name': '1000 Genomes phase 3... Homo sapiens \n" + ] + } + ], + "source": [ + "## Convert REST response object 'projects' to Pandas dataframe\n", + "df = projects.to_data_frame()\n", + "formatted_df = df[['id', 'name', 'fqn', 'creationDate', 'studies', 'organism.scientificName']]\n", + "print('The results can be stored and printed as a pandas DF:\\n\\n', formatted_df)" ] }, { diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index b538bdeb9b8..15f2e5fe7bf 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -216,11 +216,9 @@ }, "outputs": [], "source": [ - "## Convert REST response object 'variants' to Pandas datafrom\n", + "## Convert REST response object 'variants' to Pandas dataframe\n", "df = variants.to_data_frame()\n", - "\n", "formatted_df = df.drop(['names', 'studies'], 1)\n", - "\n", "#print('The results can be stored and printed as a pandas DF:\\n\\n', formatted_df.head())" ] }, From 09d61ac3458c43337fc891225b34f75bdf1bf50f Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 29 Apr 2021 13:34:06 +0200 Subject: [PATCH 244/412] analysis: improve variant query projection --- .../opencga/analysis/rga/RgaEngine.java | 27 +- .../opencga/analysis/rga/RgaManager.java | 488 ++++++++---------- 2 files changed, 237 insertions(+), 278 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index fdd58989335..97c5fa9bc74 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -1,6 +1,8 @@ package org.opencb.opencga.analysis.rga; +import javafx.scene.paint.Stop; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.UpdateResponse; @@ -20,7 +22,10 @@ import java.io.Closeable; import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; public class RgaEngine implements Closeable { @@ -30,9 +35,14 @@ public class RgaEngine implements Closeable { private GeneRgaConverter geneConverter; private VariantRgaConverter variantConverter; private StorageConfiguration storageConfiguration; + private static Map solrCollectionMap; private Logger logger; + static { + solrCollectionMap = new HashMap<>(); + } + public RgaEngine(StorageConfiguration storageConfiguration) { this.individualRgaConverter = new IndividualRgaConverter(); this.geneConverter = new GeneRgaConverter(); @@ -217,7 +227,7 @@ private void fixVariantOptions(QueryOptions queryOptions, SolrQuery solrQuery) { */ public long count(String collection, Query query) throws RgaException, IOException { SolrQuery solrQuery = parser.parseQuery(query); - SolrCollection solrCollection = solrManager.getCollection(collection); + SolrCollection solrCollection = getSolrCollection(collection); try { return solrCollection.count(solrQuery).getResults().get(0); @@ -239,6 +249,7 @@ public long count(String collection, Query query) throws RgaException, IOExcepti public DataResult facetedQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { SolrQuery solrQuery = parser.parseQuery(query); + StopWatch stopWatch = StopWatch.createStarted(); if (queryOptions.containsKey(QueryOptions.FACET) && org.apache.commons.lang3.StringUtils.isNotEmpty(queryOptions.getString(QueryOptions.FACET))) { @@ -259,18 +270,18 @@ public DataResult facetedQuery(String collection, Query query, Query } } - SolrCollection solrCollection = solrManager.getCollection(collection); + SolrCollection solrCollection = getSolrCollection(collection); DataResult facetResult; try { facetResult = solrCollection.facet(solrQuery, null); } catch (SolrServerException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e.getMessage(), e); } + logger.info("Facet '{}': {} milliseconds", solrQuery.toString(), stopWatch.getTime(TimeUnit.MILLISECONDS)); return facetResult; } - @Override public void close() throws IOException { solrManager.close(); @@ -284,4 +295,14 @@ public RgaEngine setSolrManager(SolrManager solrManager) { this.solrManager = solrManager; return this; } + + private SolrCollection getSolrCollection(String collection) { + if (solrCollectionMap.containsKey(collection)) { + return solrCollectionMap.get(collection); + } else { + SolrCollection solrCollection = solrManager.getCollection(collection); + solrCollectionMap.put(collection, solrCollection); + return solrCollection; + } + } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index caf753bc311..8a91e0a2718 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -5,9 +5,11 @@ import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrException; -import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; -import org.opencb.biodata.models.variant.avro.*; +import org.opencb.biodata.models.variant.avro.ClinicalSignificance; +import org.opencb.biodata.models.variant.avro.ConsequenceType; +import org.opencb.biodata.models.variant.avro.VariantAnnotation; +import org.opencb.biodata.models.variant.avro.Xref; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.analysis.rga.exceptions.RgaException; @@ -24,7 +26,6 @@ import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.analysis.knockout.*; -import org.opencb.opencga.core.models.analysis.knockout.VariantStats; import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.sample.Sample; @@ -66,11 +67,6 @@ public class RgaManager implements AutoCloseable { private final Logger logger; private static final int KNOCKOUT_INSERT_BATCH_SIZE = 25; - private static ExecutorService executor; - - static { - executor = Executors.newCachedThreadPool(); - } public RgaManager(CatalogManager catalogManager, VariantStorageManager variantStorageManager, StorageEngineFactory storageEngineFactory) { @@ -167,6 +163,8 @@ public OpenCGAResult geneQuery(String studyStr, Query query, StopWatch stopWatch = new StopWatch(); stopWatch.start(); + ExecutorService executor = Executors.newFixedThreadPool(4); + QueryOptions queryOptions = setDefaultLimit(options); List includeIndividuals = queryOptions.getAsStringList(RgaQueryParams.INCLUDE_INDIVIDUAL); @@ -313,6 +311,8 @@ public OpenCGAResult variantQuery(String studyStr, Query quer StopWatch stopWatch = new StopWatch(); stopWatch.start(); + ExecutorService executor = Executors.newFixedThreadPool(4); + QueryOptions queryOptions = setDefaultLimit(options); List includeIndividuals = queryOptions.getAsStringList(RgaQueryParams.INCLUDE_INDIVIDUAL); @@ -428,8 +428,6 @@ public OpenCGAResult variantQuery(String studyStr, Query quer int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); OpenCGAResult knockoutResult = new OpenCGAResult<>(time, Collections.emptyList(), knockoutResultList.size(), knockoutResultList, -1); - - knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); try { knockoutResult.setNumMatches(numTotalResults != null ? numTotalResults.get() : -1); } catch (InterruptedException | ExecutionException e) { @@ -473,20 +471,22 @@ private VariantDBIterator variantStorageQuery(String study, List sampleI Query variantQuery = new Query(VariantQueryParam.ID.key(), variantIds) .append(VariantQueryParam.STUDY.key(), study); + List excludeList = new LinkedList<>(); + excludeList.add(VariantField.ANNOTATION_CYTOBAND); + excludeList.add(VariantField.ANNOTATION_CONSERVATION); + excludeList.add(VariantField.ANNOTATION_DRUGS); + excludeList.add(VariantField.ANNOTATION_GENE_EXPRESSION); + if (!sampleIds.isEmpty()) { variantQuery.append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleIds) .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); + } else { + excludeList.add(VariantField.STUDIES_SAMPLES); + excludeList.add(VariantField.STUDIES_SAMPLE_DATA_KEYS); + excludeList.add(VariantField.STUDIES_FILES); } - QueryOptions queryOptions = new QueryOptions() - .append(QueryOptions.EXCLUDE, Arrays.asList( -// VariantField.ANNOTATION_POPULATION_FREQUENCIES, - VariantField.ANNOTATION_CYTOBAND, - VariantField.ANNOTATION_CONSERVATION, - VariantField.ANNOTATION_DRUGS, - VariantField.ANNOTATION_GENE_EXPRESSION - )); - + QueryOptions queryOptions = new QueryOptions(QueryOptions.EXCLUDE, excludeList); return variantStorageManager.iterator(variantQuery, queryOptions, token); } @@ -594,8 +594,9 @@ public OpenCGAResult individualSummary(String study throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); + StopWatch stopWatch = StopWatch.createStarted(); + ExecutorService executor = Executors.newFixedThreadPool(4); + Preprocess preprocess; try { preprocess = individualQueryPreprocess(study, query, options, token); @@ -613,32 +614,15 @@ public OpenCGAResult individualSummary(String study preprocess.getQuery().remove(RgaQueryParams.SAMPLE_ID.key()); List knockoutByIndividualSummaryList = new ArrayList<>(sampleIds.size()); - // Generate 4 batches to create 4 threads - int batchSize = 4; - List> batchList = new ArrayList<>(batchSize); - int size = (int) Math.ceil(sampleIds.size() / (double) batchSize); - - List batch = null; - for (int i = 0; i < sampleIds.size(); i++) { - if (i % size == 0) { - if (batch != null) { - batchList.add(batch); - } - batch = new ArrayList<>(size); - } - batch.add(sampleIds.get(i)); - } - batchList.add(batch); - - List>> futureList = new ArrayList<>(batchSize); + List> futureList = new ArrayList<>(sampleIds.size()); - for (List sampleIdList : batchList) { - futureList.add(executor.submit(() -> calculateIndividualSummary(collection, preprocess.getQuery(), sampleIdList))); + for (String sampleId : sampleIds) { + futureList.add(executor.submit(() -> calculateIndividualSummary(collection, preprocess.getQuery(), sampleId))); } try { - for (Future> summaryFuture : futureList) { - knockoutByIndividualSummaryList.addAll(summaryFuture.get()); + for (Future summaryFuture : futureList) { + knockoutByIndividualSummaryList.add(summaryFuture.get()); } } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); @@ -672,6 +656,7 @@ public OpenCGAResult geneSummary(String studyStr, Query q StopWatch stopWatch = new StopWatch(); stopWatch.start(); + ExecutorService executor = Executors.newFixedThreadPool(4); QueryOptions queryOptions = setDefaultLimit(options); @@ -709,33 +694,15 @@ public OpenCGAResult geneSummary(String studyStr, Query q geneIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); } - // Generate 4 batches to create 4 threads - int batchSize = 4; - List> batchList = new ArrayList<>(batchSize); - int size = (int) Math.ceil(geneIds.size() / (double) batchSize); - - List batch = null; - for (int i = 0; i < geneIds.size(); i++) { - if (i % size == 0) { - if (batch != null) { - batchList.add(batch); - } - batch = new ArrayList<>(size); - } - batch.add(geneIds.get(i)); - } - batchList.add(batch); - - List>> geneSummaryFutureList = new ArrayList<>(batchSize); - - for (List geneIdList : batchList) { - geneSummaryFutureList.add(executor.submit(() -> calculateGeneSummary(collection, auxQuery, geneIdList))); + List> geneSummaryFutureList = new ArrayList<>(geneIds.size()); + for (String geneId : geneIds) { + geneSummaryFutureList.add(executor.submit(() -> calculateGeneSummary(collection, auxQuery, geneId))); } List knockoutByGeneSummaryList = new ArrayList<>(geneIds.size()); try { - for (Future> summaryFuture : geneSummaryFutureList) { - knockoutByGeneSummaryList.addAll(summaryFuture.get()); + for (Future summaryFuture : geneSummaryFutureList) { + knockoutByGeneSummaryList.add(summaryFuture.get()); } } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); @@ -771,6 +738,7 @@ public OpenCGAResult variantSummary(String studyStr, Q StopWatch stopWatch = new StopWatch(); stopWatch.start(); + ExecutorService executor = Executors.newFixedThreadPool(4); QueryOptions queryOptions = setDefaultLimit(options); @@ -811,35 +779,16 @@ public OpenCGAResult variantSummary(String studyStr, Q () -> variantStorageQuery(study.getFqn(), Collections.emptyList(), auxQuery, QueryOptions.empty(), token) ); - // Generate 4 batches to create 4 threads - int batchSize = 4; - List> batchList = new ArrayList<>(batchSize); - int size = (int) Math.ceil(variantIds.size() / (double) batchSize); - - List batch = null; - for (int i = 0; i < variantIds.size(); i++) { - if (i % size == 0) { - if (batch != null) { - batchList.add(batch); - } - batch = new ArrayList<>(size); - } - batch.add(variantIds.get(i)); - } - batchList.add(batch); - - List>> variantSummaryList = new ArrayList<>(batchSize); - - for (List variantIdList : batchList) { - variantSummaryList.add(executor.submit(() -> calculatePartialSolrVariantSummary(collection, auxQuery, variantIdList))); + List> variantSummaryList = new ArrayList<>(variantIds.size()); + for (String variantId : variantIds) { + variantSummaryList.add(executor.submit(() -> calculatePartialSolrVariantSummary(collection, auxQuery, variantId))); } Map variantSummaryMap = new HashMap<>(); try { - for (Future> summaryFuture : variantSummaryList) { - for (KnockoutByVariantSummary knockoutByVariantSummary : summaryFuture.get()) { - variantSummaryMap.put(knockoutByVariantSummary.getId(), knockoutByVariantSummary); - } + for (Future summaryFuture : variantSummaryList) { + KnockoutByVariantSummary knockoutByVariantSummary = summaryFuture.get(); + variantSummaryMap.put(knockoutByVariantSummary.getId(), knockoutByVariantSummary); } } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); @@ -869,17 +818,20 @@ public OpenCGAResult variantSummary(String studyStr, Q knockoutByVariantSummary.setType(variant.getType()); knockoutByVariantSummary.setPopulationFrequencies(variantAnnotation.getPopulationFrequencies()); knockoutByVariantSummary.setSequenceOntologyTerms(consequenceType.getSequenceOntologyTerms()); - knockoutByVariantSummary.setGenes(variantAnnotation.getXrefs() + knockoutByVariantSummary.setGenes(variantAnnotation.getXrefs() != null + ? variantAnnotation.getXrefs() .stream() .filter(xref -> "HGNC".equals(xref.getSource())) .map(Xref::getId) .collect(Collectors.toList()) + : Collections.emptyList() ); } List knockoutByVariantSummaryList = new ArrayList<>(variantSummaryMap.values()); int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + logger.info("Variant summary: {} milliseconds", time); OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), knockoutByVariantSummaryList.size(), knockoutByVariantSummaryList, -1); @@ -895,203 +847,189 @@ public OpenCGAResult variantSummary(String studyStr, Q return result; } - private List calculatePartialSolrVariantSummary(String collection, Query query, List variantIdList) + private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String collection, Query query, String variantId) throws IOException, RgaException { - List knockoutByVariantSummaryList = new ArrayList<>(variantIdList.size()); - for (String variantId : variantIdList) { - KnockoutByVariantSummary knockoutByVariantSummary = new KnockoutByVariantSummary().setId(variantId); - - Query auxQuery = new Query(query); - auxQuery.put(RgaDataModel.VARIANTS, variantId); - - // 1. Get clinical significances - QueryOptions knockoutTypeFacet = new QueryOptions() - .append(QueryOptions.LIMIT, -1) - .append(QueryOptions.FACET, RgaDataModel.CLINICAL_SIGNIFICANCES); - DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); - knockoutByVariantSummary.setClinicalSignificances(facetFieldDataResult.first() - .getBuckets() - .stream() - .map(FacetField.Bucket::getValue) - .map(ClinicalSignificance::valueOf) - .collect(Collectors.toList()) - ); - - // 2. Get individual knockout type counts - QueryOptions geneFacet = new QueryOptions() - .append(QueryOptions.LIMIT, -1) - .append(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_SUMMARY); - facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); - KnockoutTypeCount noParentsCount = new KnockoutTypeCount(auxQuery); - KnockoutTypeCount singleParentCount = new KnockoutTypeCount(auxQuery); - KnockoutTypeCount bothParentsCount = new KnockoutTypeCount(auxQuery); - - for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { - RgaUtils.CodedIndividual codedIndividual = RgaUtils.CodedIndividual.parseEncodedId(bucket.getValue()); - KnockoutTypeCount auxKnockoutType; - switch (codedIndividual.getNumParents()) { - case 0: - auxKnockoutType = noParentsCount; - break; - case 1: - auxKnockoutType = singleParentCount; - break; - case 2: - auxKnockoutType = bothParentsCount; - break; - default: - throw new IllegalStateException("Unexpected value: " + codedIndividual.getNumParents()); - } + KnockoutByVariantSummary knockoutByVariantSummary = new KnockoutByVariantSummary().setId(variantId); + + Query auxQuery = new Query(query); + auxQuery.put(RgaDataModel.VARIANTS, variantId); + + // 1. Get clinical significances + QueryOptions knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.CLINICAL_SIGNIFICANCES); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); + knockoutByVariantSummary.setClinicalSignificances(facetFieldDataResult.first() + .getBuckets() + .stream() + .map(FacetField.Bucket::getValue) + .map(ClinicalSignificance::valueOf) + .collect(Collectors.toList()) + ); - auxKnockoutType.processFeature(codedIndividual); + // 2. Get individual knockout type counts + QueryOptions geneFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_SUMMARY); + facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); + KnockoutTypeCount noParentsCount = new KnockoutTypeCount(auxQuery); + KnockoutTypeCount singleParentCount = new KnockoutTypeCount(auxQuery); + KnockoutTypeCount bothParentsCount = new KnockoutTypeCount(auxQuery); + + for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { + RgaUtils.CodedIndividual codedIndividual = RgaUtils.CodedIndividual.parseEncodedId(bucket.getValue()); + KnockoutTypeCount auxKnockoutType; + switch (codedIndividual.getNumParents()) { + case 0: + auxKnockoutType = noParentsCount; + break; + case 1: + auxKnockoutType = singleParentCount; + break; + case 2: + auxKnockoutType = bothParentsCount; + break; + default: + throw new IllegalStateException("Unexpected value: " + codedIndividual.getNumParents()); } - VariantStats noParentIndividualStats = new VariantStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), - noParentsCount.getNumCompHetIds(), noParentsCount.getNumHetIds(), noParentsCount.getNumDelOverlapIds()); - VariantStats singleParentIndividualStats = new VariantStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), - singleParentCount.getNumCompHetIds(), singleParentCount.getNumHetIds(), singleParentCount.getNumDelOverlapIds()); - VariantStats bothParentIndividualStats = new VariantStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), - bothParentsCount.getNumCompHetIds(), bothParentsCount.getNumHetIds(), bothParentsCount.getNumDelOverlapIds()); - - knockoutByVariantSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, - bothParentIndividualStats)); - knockoutByVariantSummaryList.add(knockoutByVariantSummary); + auxKnockoutType.processFeature(codedIndividual); } - return knockoutByVariantSummaryList; + VariantStats noParentIndividualStats = new VariantStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), + noParentsCount.getNumCompHetIds(), noParentsCount.getNumHetIds(), noParentsCount.getNumDelOverlapIds()); + VariantStats singleParentIndividualStats = new VariantStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), + singleParentCount.getNumCompHetIds(), singleParentCount.getNumHetIds(), singleParentCount.getNumDelOverlapIds()); + VariantStats bothParentIndividualStats = new VariantStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), + bothParentsCount.getNumCompHetIds(), bothParentsCount.getNumHetIds(), bothParentsCount.getNumDelOverlapIds()); + + knockoutByVariantSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, + bothParentIndividualStats)); + + return knockoutByVariantSummary; } - private List calculateGeneSummary(String collection, Query query, List geneIdList) - throws RgaException, IOException { - List knockoutByGeneSummaryList = new ArrayList<>(geneIdList.size()); - for (String geneId : geneIdList) { - Query auxQuery = new Query(query); - auxQuery.put(RgaQueryParams.GENE_ID.key(), geneId); - - // 1. Get KnockoutByGene information - Query individualQuery = new Query(RgaQueryParams.GENE_ID.key(), geneId); - QueryOptions options = new QueryOptions() - .append(QueryOptions.LIMIT, 1) - .append(QueryOptions.EXCLUDE, "individuals"); - RgaIterator rgaIterator = rgaEngine.geneQuery(collection, individualQuery, options); - - if (!rgaIterator.hasNext()) { - throw new RgaException("Unexpected error. Gene '" + geneId + "' not found"); - } - RgaDataModel rgaDataModel = rgaIterator.next(); - KnockoutByGeneSummary geneSummary = new KnockoutByGeneSummary(rgaDataModel.getGeneId(), rgaDataModel.getGeneName(), - rgaDataModel.getChromosome(), rgaDataModel.getStart(), rgaDataModel.getEnd(), rgaDataModel.getStrand(), - rgaDataModel.getGeneBiotype(), null, null); - - // 2. Get KnockoutType counts - QueryOptions knockoutTypeFacet = new QueryOptions() - .append(QueryOptions.LIMIT, -1) - .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); - DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); - KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); - for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { - RgaUtils.CodedFeature codedFeature = RgaUtils.CodedFeature.parseEncodedId(variantBucket.getValue()); - knockoutTypeCount.processFeature(codedFeature); + private KnockoutByGeneSummary calculateGeneSummary(String collection, Query query, String geneId) throws RgaException, IOException { + Query auxQuery = new Query(query); + auxQuery.put(RgaQueryParams.GENE_ID.key(), geneId); + + // 1. Get KnockoutByGene information + Query individualQuery = new Query(RgaQueryParams.GENE_ID.key(), geneId); + QueryOptions options = new QueryOptions() + .append(QueryOptions.LIMIT, 1) + .append(QueryOptions.EXCLUDE, "individuals"); + RgaIterator rgaIterator = rgaEngine.geneQuery(collection, individualQuery, options); + + if (!rgaIterator.hasNext()) { + throw new RgaException("Unexpected error. Gene '" + geneId + "' not found"); + } + RgaDataModel rgaDataModel = rgaIterator.next(); + KnockoutByGeneSummary geneSummary = new KnockoutByGeneSummary(rgaDataModel.getGeneId(), rgaDataModel.getGeneName(), + rgaDataModel.getChromosome(), rgaDataModel.getStart(), rgaDataModel.getEnd(), rgaDataModel.getStrand(), + rgaDataModel.getGeneBiotype(), null, null); + + // 2. Get KnockoutType counts + QueryOptions knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); + KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); + for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { + RgaUtils.CodedFeature codedFeature = RgaUtils.CodedFeature.parseEncodedId(variantBucket.getValue()); + knockoutTypeCount.processFeature(codedFeature); + } + VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), + knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumHetIds(), + knockoutTypeCount.getNumDelOverlapIds()); + geneSummary.setVariantStats(variantStats); + + // 3. Get individual knockout type counts + QueryOptions geneFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_SUMMARY); + facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); + KnockoutTypeCount noParentsCount = new KnockoutTypeCount(auxQuery); + KnockoutTypeCount singleParentCount = new KnockoutTypeCount(auxQuery); + KnockoutTypeCount bothParentsCount = new KnockoutTypeCount(auxQuery); + + for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { + RgaUtils.CodedIndividual codedIndividual = RgaUtils.CodedIndividual.parseEncodedId(bucket.getValue()); + KnockoutTypeCount auxKnockoutType; + switch (codedIndividual.getNumParents()) { + case 0: + auxKnockoutType = noParentsCount; + break; + case 1: + auxKnockoutType = singleParentCount; + break; + case 2: + auxKnockoutType = bothParentsCount; + break; + default: + throw new IllegalStateException("Unexpected value: " + codedIndividual.getNumParents()); } - VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), - knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumHetIds(), - knockoutTypeCount.getNumDelOverlapIds()); - geneSummary.setVariantStats(variantStats); - - // 3. Get individual knockout type counts - QueryOptions geneFacet = new QueryOptions() - .append(QueryOptions.LIMIT, -1) - .append(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_SUMMARY); - facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); - KnockoutTypeCount noParentsCount = new KnockoutTypeCount(auxQuery); - KnockoutTypeCount singleParentCount = new KnockoutTypeCount(auxQuery); - KnockoutTypeCount bothParentsCount = new KnockoutTypeCount(auxQuery); - - for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { - RgaUtils.CodedIndividual codedIndividual = RgaUtils.CodedIndividual.parseEncodedId(bucket.getValue()); - KnockoutTypeCount auxKnockoutType; - switch (codedIndividual.getNumParents()) { - case 0: - auxKnockoutType = noParentsCount; - break; - case 1: - auxKnockoutType = singleParentCount; - break; - case 2: - auxKnockoutType = bothParentsCount; - break; - default: - throw new IllegalStateException("Unexpected value: " + codedIndividual.getNumParents()); - } - auxKnockoutType.processFeature(codedIndividual); - } - VariantStats noParentIndividualStats = new VariantStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), - noParentsCount.getNumCompHetIds(), noParentsCount.getNumHetIds(), noParentsCount.getNumDelOverlapIds()); - VariantStats singleParentIndividualStats = new VariantStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), - singleParentCount.getNumCompHetIds(), singleParentCount.getNumHetIds(), singleParentCount.getNumDelOverlapIds()); - VariantStats bothParentIndividualStats = new VariantStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), - bothParentsCount.getNumCompHetIds(), bothParentsCount.getNumHetIds(), bothParentsCount.getNumDelOverlapIds()); + auxKnockoutType.processFeature(codedIndividual); + } + VariantStats noParentIndividualStats = new VariantStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), + noParentsCount.getNumCompHetIds(), noParentsCount.getNumHetIds(), noParentsCount.getNumDelOverlapIds()); + VariantStats singleParentIndividualStats = new VariantStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), + singleParentCount.getNumCompHetIds(), singleParentCount.getNumHetIds(), singleParentCount.getNumDelOverlapIds()); + VariantStats bothParentIndividualStats = new VariantStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), + bothParentsCount.getNumCompHetIds(), bothParentsCount.getNumHetIds(), bothParentsCount.getNumDelOverlapIds()); - geneSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, - bothParentIndividualStats)); + geneSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, + bothParentIndividualStats)); - knockoutByGeneSummaryList.add(geneSummary); - } - return knockoutByGeneSummaryList; + return geneSummary; } - private List calculateIndividualSummary(String collection, Query query, List sampleIdList) + private KnockoutByIndividualSummary calculateIndividualSummary(String collection, Query query, String sampleId) throws RgaException, IOException { - List knockoutByIndividualSummaryList = new ArrayList<>(sampleIdList.size()); - for (String sampleId : sampleIdList) { - Query auxQuery = new Query(query); - auxQuery.put(RgaQueryParams.SAMPLE_ID.key(), sampleId); - - // 1. Get KnockoutByIndividual information - Query individualQuery = new Query(RgaQueryParams.SAMPLE_ID.key(), sampleId); - QueryOptions options = new QueryOptions() - .append(QueryOptions.LIMIT, 1) - .append(QueryOptions.EXCLUDE, "genes"); - RgaIterator rgaIterator = rgaEngine.individualQuery(collection, individualQuery, options); - - if (!rgaIterator.hasNext()) { - throw new RgaException("Unexpected error. Sample '" + sampleId + "' not found"); - } - RgaDataModel rgaDataModel = rgaIterator.next(); - - KnockoutByIndividual knockoutByIndividual = AbstractRgaConverter.fillIndividualInfo(rgaDataModel); - KnockoutByIndividualSummary knockoutByIndividualSummary = new KnockoutByIndividualSummary(knockoutByIndividual); - - // 2. Get KnockoutType counts - QueryOptions knockoutTypeFacet = new QueryOptions() - .append(QueryOptions.LIMIT, -1) - .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); - DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); - KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); - for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { - RgaUtils.CodedFeature codedFeature = RgaUtils.CodedFeature.parseEncodedId(variantBucket.getValue()); - knockoutTypeCount.processFeature(codedFeature); - } - VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), - knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumHetIds(), - knockoutTypeCount.getNumDelOverlapIds()); - knockoutByIndividualSummary.setVariantStats(variantStats); - - // 3. Get gene name list - QueryOptions geneFacet = new QueryOptions() - .append(QueryOptions.LIMIT, -1) - .append(QueryOptions.FACET, RgaDataModel.GENE_NAME); - facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); - List geneIds = facetFieldDataResult.first().getBuckets() - .stream() - .map(FacetField.Bucket::getValue) - .collect(Collectors.toList()); - knockoutByIndividualSummary.setGenes(geneIds); - - knockoutByIndividualSummaryList.add(knockoutByIndividualSummary); - } - - return knockoutByIndividualSummaryList; + Query auxQuery = new Query(query); + auxQuery.put(RgaQueryParams.SAMPLE_ID.key(), sampleId); + + // 1. Get KnockoutByIndividual information + Query individualQuery = new Query(RgaQueryParams.SAMPLE_ID.key(), sampleId); + QueryOptions options = new QueryOptions() + .append(QueryOptions.LIMIT, 1) + .append(QueryOptions.EXCLUDE, "genes"); + RgaIterator rgaIterator = rgaEngine.individualQuery(collection, individualQuery, options); + + if (!rgaIterator.hasNext()) { + throw new RgaException("Unexpected error. Sample '" + sampleId + "' not found"); + } + RgaDataModel rgaDataModel = rgaIterator.next(); + + KnockoutByIndividual knockoutByIndividual = AbstractRgaConverter.fillIndividualInfo(rgaDataModel); + KnockoutByIndividualSummary knockoutByIndividualSummary = new KnockoutByIndividualSummary(knockoutByIndividual); + + // 2. Get KnockoutType counts + QueryOptions knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); + KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); + for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { + RgaUtils.CodedFeature codedFeature = RgaUtils.CodedFeature.parseEncodedId(variantBucket.getValue()); + knockoutTypeCount.processFeature(codedFeature); + } + VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), + knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumHetIds(), + knockoutTypeCount.getNumDelOverlapIds()); + knockoutByIndividualSummary.setVariantStats(variantStats); + + // 3. Get gene name list + QueryOptions geneFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.GENE_NAME); + facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, geneFacet); + List geneIds = facetFieldDataResult.first().getBuckets() + .stream() + .map(FacetField.Bucket::getValue) + .collect(Collectors.toList()); + knockoutByIndividualSummary.setGenes(geneIds); + + return knockoutByIndividualSummary; } private static class KnockoutTypeCount { From 1437be3aec07fb764f7388d5be11f3b0defa6d22 Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 29 Apr 2021 12:13:55 +0000 Subject: [PATCH 245/412] GitBook: [develop] 2 pages modified --- docs/SUMMARY.md | 1 + docs/manual/administrator/templates-manifest.md | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 docs/manual/administrator/templates-manifest.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 6f7ebc52564..824a3fb90ad 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -70,6 +70,7 @@ * [Individual](manual/data-models/individual.md) * [Using JupyterLab](manual/using-jupyterlab.md) * [Administrator](manual/administrator/README.md) + * [Templates / Manifest](manual/administrator/templates-manifest.md) * [User Management](manual/administrator/user-management.md) ## About diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md new file mode 100644 index 00000000000..e56cc2012df --- /dev/null +++ b/docs/manual/administrator/templates-manifest.md @@ -0,0 +1,2 @@ +# Templates / Manifest + From 93a8655725740e6231c9c22deda226e77e6be34e Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 29 Apr 2021 12:14:20 +0000 Subject: [PATCH 246/412] GitBook: [develop] one page modified --- docs/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 824a3fb90ad..67deaeab281 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -70,8 +70,8 @@ * [Individual](manual/data-models/individual.md) * [Using JupyterLab](manual/using-jupyterlab.md) * [Administrator](manual/administrator/README.md) - * [Templates / Manifest](manual/administrator/templates-manifest.md) * [User Management](manual/administrator/user-management.md) + * [Templates / Manifest](manual/administrator/templates-manifest.md) ## About From 0297e2e877f1dc4cfc558b7a8ff7613ea2b7686a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 29 Apr 2021 15:48:15 +0200 Subject: [PATCH 247/412] analysis: improve the parameter management for the Samtools wrapper, #1753 --- .../DockerWrapperAnalysisExecutor.java | 3 +- .../samtools/SamtoolsWrapperAnalysis.java | 246 +++---- .../SamtoolsWrapperAnalysisExecutor.java | 620 ++++++------------ .../executors/AlignmentCommandExecutor.java | 8 - .../options/AlignmentCommandOptions.java | 24 - .../analysis/AlignmentCommandExecutor.java | 22 +- .../opencga/core/api/ParamConstants.java | 23 +- .../alignment/SamtoolsWrapperParams.java | 110 +--- 8 files changed, 295 insertions(+), 761 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java index 8cc9da3636c..3f7750a2f0a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java @@ -1,5 +1,6 @@ package org.opencb.opencga.analysis.wrappers.executors; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.opencb.commons.exec.Command; @@ -120,7 +121,7 @@ protected void appendOtherParams(Set skipParams, StringBuilder sb) { continue; } - if (skipParams.contains(paramName)) { + if (CollectionUtils.isNotEmpty(skipParams) && skipParams.contains(paramName)) { continue; } sb.append(" "); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java index bb7fd335a79..4704fcf497b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java @@ -18,6 +18,7 @@ import com.google.common.base.CaseFormat; import org.apache.commons.collections4.MapUtils; +import org.apache.commons.io.FileSystemUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; @@ -33,8 +34,13 @@ import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMANDS_SUPPORTED; import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMAND_DESCRIPTION; @@ -49,13 +55,7 @@ public class SamtoolsWrapperAnalysis extends OpenCgaToolScopeStudy { @ToolParams protected final SamtoolsWrapperParams analysisParams = new SamtoolsWrapperParams(); - private String bamFilePath = null; - private String bedFilePath = null; - private String readGroupFilePath = null; - private String readsNotSelectedFilenamePath = null; - private String referenceFilePath = null; - private String referenceNamesFilePath = null; - private String refSeqFilePath = null; + private String inputFilePath = null; protected void check() throws Exception { super.check(); @@ -72,29 +72,22 @@ protected void check() throws Exception { // Get files from catalog FileManager fileManager = catalogManager.getFileManager(); if (StringUtils.isNotEmpty(analysisParams.getInputFile())) { - bamFilePath = AnalysisUtils.getCatalogFile(analysisParams.getInputFile(), study, fileManager, token).getUri().getPath(); + inputFilePath = AnalysisUtils.getCatalogFile(analysisParams.getInputFile(), study, fileManager, token).getUri().getPath(); } - if (StringUtils.isNotEmpty(analysisParams.getBedFile())) { - bedFilePath = AnalysisUtils.getCatalogFile(analysisParams.getBedFile(), study, fileManager, token).getUri().getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getReadGroupFile())) { - readGroupFilePath = AnalysisUtils.getCatalogFile(analysisParams.getReadGroupFile(), study, fileManager, token).getUri() - .getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getReadsNotSelectedFilename())) { - readsNotSelectedFilenamePath = AnalysisUtils.getCatalogFile(analysisParams.getReadsNotSelectedFilename(), study, fileManager, - token).getUri().getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getReferenceFile())) { - referenceFilePath = AnalysisUtils.getCatalogFile(analysisParams.getReferenceFile(), study, fileManager, token) - .getUri().getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getReferenceNamesFile())) { - referenceNamesFilePath = AnalysisUtils.getCatalogFile(analysisParams.getReferenceNamesFile(), study, fileManager, token) - .getUri().getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getRefSeqFile())) { - refSeqFilePath = AnalysisUtils.getCatalogFile(analysisParams.getRefSeqFile(), study, fileManager, token).getUri().getPath(); + + if (MapUtils.isNotEmpty(analysisParams.getSamtoolsParams())) { + Set fileParams = getFileParamNames(analysisParams.getCommand()); + + Map updatedMap = new HashMap<>(); + for (Map.Entry entry : analysisParams.getSamtoolsParams().entrySet()) { + if (fileParams.contains(entry.getKey())) { + updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) + .getUri().getPath()); + } + } + if (MapUtils.isNotEmpty(updatedMap)) { + analysisParams.getSamtoolsParams().putAll(updatedMap); + } } } @@ -109,14 +102,37 @@ protected void run() throws Exception { getToolExecutor(SamtoolsWrapperAnalysisExecutor.class) .setCommand(analysisParams.getCommand()) - .setInputFile(bamFilePath) - .setBedFile(bedFilePath) - .setReadGroupFile(readGroupFilePath) - .setReadsNotSelectedFilename(readsNotSelectedFilenamePath) - .setReferenceFile(referenceFilePath) - .setReferenceNamesFile(referenceNamesFilePath) - .setRefSeqFile(refSeqFilePath) + .setInputFile(inputFilePath) .execute(); + + // Index management + switch (analysisParams.getCommand()) { + case "index": { + String indexFilePath; + if (executorParams.containsKey("c")) { + indexFilePath = inputFilePath + ".csi"; + } else { + indexFilePath = inputFilePath + ".bai"; + } + if (new java.io.File(indexFilePath).exists()) { + // Create symobolic link + Path target = Paths.get(indexFilePath); + Path symbolic = getOutDir().resolve(target.getFileName().toString()); + Files.createSymbolicLink(symbolic, target); + } + break; + } + case "faidx": { + String indexFilePath = inputFilePath + ".fai"; + if (new java.io.File(indexFilePath).exists()) { + // Create symobolic link + Path target = Paths.get(indexFilePath); + Path symbolic = getOutDir().resolve(target.getFileName().toString()); + Files.createSymbolicLink(symbolic, target); + } + break; + } + } }); } @@ -150,123 +166,43 @@ public static SamtoolsStats parseSamtoolsStats(java.io.File file, String fileId) return alignmentStats; } -// -// private void indexStats(SamtoolsStats alignmentStats) throws CatalogException, IOException { -// // Convert AlignmentStats to map in order to create an AnnotationSet -// Map annotations = JacksonUtils.getDefaultObjectMapper().convertValue(alignmentStats, Map.class); -// AnnotationSet annotationSet = new AnnotationSet(ALIGNMENT_STATS_VARIABLE_SET, ALIGNMENT_STATS_VARIABLE_SET, annotations); -// -// // Update catalog -// FileUpdateParams updateParams = new FileUpdateParams().setAnnotationSets(Collections.singletonList(annotationSet)); -// catalogManager.getFileManager().update(getStudy(), inputCatalogFile.getId(), updateParams, QueryOptions.empty(), token); -// } -// -//// private boolean isIndexed() { -//// OpenCGAResult fileResult; -//// try { -//// fileResult = catalogManager.getFileManager().get(getStudy(), inputCatalogFile.getId(), QueryOptions.empty(), token); -//// -//// if (fileResult.getNumResults() == 1) { -//// for (AnnotationSet annotationSet : fileResult.getResults().get(0).getAnnotationSets()) { -//// if (ALIGNMENT_STATS_VARIABLE_SET.equals(annotationSet.getId())) { -//// return true; -//// } -//// } -//// } -//// } catch (CatalogException e) { -//// return false; -//// } -//// -//// return false; -//// } -// -// public String getCommand() { -// return command; -// } -// -// public SamtoolsWrapperAnalysis setCommand(String command) { -// this.command = command; -// return this; -// } -// -// public String getInputFile() { -// return inputFile; -// } -// -// public SamtoolsWrapperAnalysis setInputFile(String inputFile) { -// this.inputFile = inputFile; -// return this; -// } -// -// public String getOutputFilename() { -// return outputFilename; -// } -// -// public SamtoolsWrapperAnalysis setOutputFilename(String outputFilename) { -// this.outputFilename = outputFilename; -// return this; -// } -// -// public String getReferenceFile() { -// return referenceFile; -// } -// -// public SamtoolsWrapperAnalysis setReferenceFile(String referenceFile) { -// this.referenceFile = referenceFile; -// return this; -// } -// -// public String getReadGroupFile() { -// return readGroupFile; -// } -// -// public SamtoolsWrapperAnalysis setReadGroupFile(String readGroupFile) { -// this.readGroupFile = readGroupFile; -// return this; -// } -// -// public String getBedFile() { -// return bedFile; -// } -// -// public SamtoolsWrapperAnalysis setBedFile(String bedFile) { -// this.bedFile = bedFile; -// return this; -// } -// -// public String getReferenceNamesFile() { -// return referenceNamesFile; -// } -// -// public SamtoolsWrapperAnalysis setReferenceNamesFile(String referenceNamesFile) { -// this.referenceNamesFile = referenceNamesFile; -// return this; -// } -// -// public String getTargetRegionFile() { -// return targetRegionFile; -// } -// -// public SamtoolsWrapperAnalysis setTargetRegionFile(String targetRegionFile) { -// this.targetRegionFile = targetRegionFile; -// return this; -// } -// -// public String getRefSeqFile() { -// return refSeqFile; -// } -// -// public SamtoolsWrapperAnalysis setRefSeqFile(String refSeqFile) { -// this.refSeqFile = refSeqFile; -// return this; -// } -// -// public String getReadsNotSelectedFilename() { -// return readsNotSelectedFilename; -// } -// -// public SamtoolsWrapperAnalysis setReadsNotSelectedFilename(String readsNotSelectedFilename) { -// this.readsNotSelectedFilename = readsNotSelectedFilename; -// return this; -// } + + public static Set getFileParamNames(String command) { + Set fileParamNames = new HashSet<>(); + switch (command) { + case "sort": + fileParamNames.add("reference"); + break; + case "view": + fileParamNames.add("U"); + fileParamNames.add("t"); + fileParamNames.add("L"); + fileParamNames.add("R"); + fileParamNames.add("T"); + fileParamNames.add("reference"); + break; + case "stats": + fileParamNames.add("r"); + fileParamNames.add("ref-seq"); + fileParamNames.add("reference"); + fileParamNames.add("t"); + fileParamNames.add("target-regions"); + break; + case "depth": + fileParamNames.add("reference"); + break; + case "plot-bamstats": + fileParamNames.add("r"); + fileParamNames.add("ref-stats"); + fileParamNames.add("s"); + fileParamNames.add("do-ref-stats"); + fileParamNames.add("t"); + fileParamNames.add("targets"); + break; + default: + break; + + } + return fileParamNames; + } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java index ce810b5d04f..6e76e8e2144 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java @@ -1,5 +1,7 @@ package org.opencb.opencga.analysis.wrappers.samtools; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; @@ -22,13 +24,6 @@ public class SamtoolsWrapperAnalysisExecutor extends DockerWrapperAnalysisExecut private String study; private String command; private String inputFile; - private String referenceFile; - private String readGroupFile; - private String bedFile; - private String refSeqFile; - private String referenceNamesFile; - private String targetRegionFile; - private String readsNotSelectedFilename; private Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -45,6 +40,24 @@ public String getDockerImageVersion() { @Override public void run() throws ToolException { switch (command) { + case "depth": + runDepth(); + break; + case "dict": + runDict(); + break; + case "view": + runView(); + break; + case "index": + runIndex(); + break; + case "sort": + runSort(); + break; + case "faidx": + runFaidx(); + break; case "stats": runStats(); break; @@ -59,14 +72,11 @@ public void run() throws ToolException { } } - private void runStats() throws ToolException { + private void runDepth() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", getInputFile()), - new ImmutablePair<>("reference", getReferenceFile()), new ImmutablePair<>("t", getTargetRegionFile()), - new ImmutablePair<>("ref-seq", getRefSeqFile()))); - + List> inputFilenames = getInputFilenames(command); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -76,7 +86,7 @@ private void runStats() throws ToolException { appendInputFiles(inputFilenames, mountMap, sb); // Append other params - Set skipParams = new HashSet<>(Arrays.asList("reference", "t", "target-regions", "ref-seq", "r")); + Set skipParams = new HashSet<>(Arrays.asList("f")); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files @@ -84,26 +94,33 @@ private void runStats() throws ToolException { runCommandLine(sb.toString()); } - private void runPlotBamStats() throws ToolException { + private void runDict() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", getInputFile()))); - + List> inputFilenames = getInputFilenames(command); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command - appendCommand(command, sb); + appendCommand("samtools " + command, sb); // Append input file params appendInputFiles(inputFilenames, mountMap, sb); // Append output file params - List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("p", " "))); - appendOutputFiles(outputFilenames, sb); + if (getExecutorParams().containsKey("o") || getExecutorParams().containsKey("output")) { + String value = String.valueOf(getExecutorParams().get("o")); + if (StringUtils.isEmpty(value)) { + value = String.valueOf(getExecutorParams().get("output")); + } + if (StringUtils.isNotEmpty(value)) { + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("o", value))); + appendOutputFiles(outputFilenames, sb); + } + } // Append other params - Set skipParams = new HashSet<>(Arrays.asList("p", "prefix", "r", "ref-stats", "s", "do-ref-stats", "t", "targets")); + Set skipParams = new HashSet<>(Arrays.asList("u", "uri", "o", "output")); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files @@ -111,12 +128,11 @@ private void runPlotBamStats() throws ToolException { runCommandLine(sb.toString()); } - private void runFlagstat() throws ToolException { + private void runView() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", getInputFile()))); - + List> inputFilenames = getInputFilenames(command); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -125,8 +141,17 @@ private void runFlagstat() throws ToolException { // Append input file params appendInputFiles(inputFilenames, mountMap, sb); + // Append output file params + if (getExecutorParams().containsKey("o")) { + String value = String.valueOf(getExecutorParams().get("o")); + if (StringUtils.isNotEmpty(value)) { + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("o", value))); + appendOutputFiles(outputFilenames, sb); + } + } + // Append other params - Set skipParams = new HashSet<>(Arrays.asList("input-fmt-option")); + Set skipParams = new HashSet<>(Arrays.asList("o")); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files @@ -134,469 +159,194 @@ private void runFlagstat() throws ToolException { runCommandLine(sb.toString()); } + private void runIndex() throws ToolException { + StringBuilder sb = initCommandLine(); - /* - @Override - protected void run() throws Exception { - outputFilename = getOutputFilename(); - if (StringUtils.isNotEmpty(outputFilename)) { - // Set output file to use further - outputFile = getOutDir().resolve(outputFilename).toFile(); - } + // Append mounts + List> inputFilenames = getInputFilenames(command); + Map mountMap = appendMounts(inputFilenames, sb); - String commandLine = getCommandLine(); - - logger.info("Samtools command line: " + commandLine); - try { - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - Command cmd = new Command(commandLine) - .setOutputOutputStream( - new DataOutputStream(new FileOutputStream(getOutDir().resolve(STDOUT_FILENAME).toFile()))) - .setErrorOutputStream( - new DataOutputStream(new FileOutputStream(getOutDir().resolve(STDERR_FILENAME).toFile()))); - - cmd.run(); - - // Check samtools errors - boolean success = false; - switch (getCommand()) { - case "dict": - case "index": - case "sort": - case "view": { - if (outputFile.exists()) { - success = true; - -// if (!"view".equals(command)) { -// String catalogPath = getCatalogPath(inputFile); -// File file = new File(fileUriMap.get(inputFile).getPath()); -// -// Path src = outputFile.toPath(); -// Path dest = new File(file.getParent()).toPath(); -// -// moveFile(getStudy(), src, dest, catalogPath, token); -// } - } - break; - } -// case "faidx": { -// File file = new File(fileUriMap.get(inputFile).getPath()); -// File faidxFile = file.getParentFile().toPath().resolve(file.getName() + ".fai").toFile(); -// success = isValidFile(faidxFile); -// if (success) { -// String catalogPath = getCatalogPath(inputFile); -// catalogManager.getFileManager().link(getStudy(), faidxFile.toURI(), catalogPath, new ObjectMap("parents", true), -// token); -// } -// break; -// } - case "flagstat": { - File file = getOutDir().resolve(STDOUT_FILENAME).toFile(); - List lines = readLines(file, Charset.defaultCharset()); - if (lines.size() > 0 && lines.get(0).contains("QC-passed")) { - FileUtils.copyFile(file, outputFile); - success = true; - } - break; - } - case "stats": { - File file = getOutDir().resolve(STDOUT_FILENAME).toFile(); - List lines = readLines(file, Charset.defaultCharset()); - if (lines.size() > 0 && lines.get(0).startsWith("# This file was produced by samtools stats")) { - FileUtils.copyFile(file, outputFile); - success = true; - } - break; - } - case "depth": { - File file = new File(getOutDir() + "/" + STDOUT_FILENAME); - if (file.exists() && file.length() > 0) { - FileUtils.copyFile(file, outputFile); - success = true; - } - break; - } - case "plot-bamstats": { - int pngCounter = 0; - for (File file : getOutDir().toFile().listFiles()) { - if (file.getName().endsWith("png")) { - pngCounter++; - } - } - success = (pngCounter == 11); - break; - } - } + // Append docker image, version and command + appendCommand("samtools " + command, sb); - if (!success) { - File file = getOutDir().resolve(STDERR_FILENAME).toFile(); - String msg = "Something wrong happened when executing Samtools"; - if (file.exists()) { - msg = StringUtils.join(readLines(file, Charset.defaultCharset()), ". "); - } - throw new ToolException(msg); - } - } catch (Exception e) { - throw new ToolException(e); - } + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append other params + appendOtherParams(null, sb); + + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); } - private String getOutputFilename() throws ToolException { - String outputFilename = null; - String prefix = Paths.get(getInputFile()).toFile().getName(); - switch (getCommand()) { - case "index": { - if (prefix.endsWith("cram")) { - outputFilename = prefix + ".crai"; - } else { - outputFilename = prefix + ".bai"; - } - break; - } - case "faidx": { - outputFilename = prefix + ".fai"; - break; - } - case "dict": { - outputFilename = prefix + ".dict"; - break; - } - case "stats": { - outputFilename = prefix + ".stats.txt"; - break; - } - case "flagstat": { - outputFilename = prefix + ".flagstats.txt"; - break; - } - case "depth": { - outputFilename = prefix + ".depth.txt"; - break; - } - case "plot-bamstats": - break; - default: { - throw new ToolException("Missing output file name when executing 'samtools " + getCommand() + "'."); + private void runSort() throws ToolException { + StringBuilder sb = initCommandLine(); + + // Append mounts + List> inputFilenames = getInputFilenames(command); + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand("samtools " + command, sb); + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append output file params + if (getExecutorParams().containsKey("o")) { + String value = String.valueOf(getExecutorParams().get("o")); + if (StringUtils.isNotEmpty(value)) { + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("o", value))); + appendOutputFiles(outputFilenames, sb); } } - return outputFilename; + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("T", "o")); + appendOtherParams(skipParams, sb); + + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); } - public String getCommandLine() throws ToolException { + private void runFaidx() throws ToolException { + StringBuilder sb = initCommandLine(); - List inputFiles = Arrays.asList(getInputFile(), getReferenceFile(), getReadGroupFile(), getBedFile(), getRefSeqFile(), - getReferenceNamesFile(), getTargetRegionFile(), getReadsNotSelectedFilename()); + // Append mounts + List> inputFilenames = getInputFilenames(command); + Map mountMap = appendMounts(inputFilenames, sb); - Map srcTargetMap = getDockerMountMap(inputFiles); + // Append docker image, version and command + appendCommand("samtools " + command, sb); - StringBuilder sb = initDockerCommandLine(srcTargetMap, getDockerImageName(), getDockerImageVersion()); + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); - // Samtools command - if ("plot-bamstats".equals(getCommand())) { - sb.append(" ").append(getCommand()); - } else { - sb.append(" samtools ").append(getCommand()); - } + // Append other params + appendOtherParams(null, sb); - // Samtools options - for (String param : getExecutorParams().keySet()) { - if (skipParameter(param)) { - String sep = param.length() == 1 ? " -" : " --"; - String value = getExecutorParams().getString(param); - if (StringUtils.isEmpty(value)) { - sb.append(sep).append(param); - } else { - switch (value.toLowerCase()) { - case "false": - // Nothing to do - break; - case "null": - case "true": - // Only param must be appended - sb.append(sep).append(param); - break; - default: - // Otherwise, param + value must be appended - sb.append(sep).append(param).append(" ").append(value); - break; - } - } - } - } + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); + } - // File parameters - File file; - switch (getCommand()) { - case "depth": { - if (StringUtils.isNotEmpty(getReferenceFile())) { - file = new File(getReferenceFile()); - sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - if (StringUtils.isNotEmpty(getBedFile())) { - file = new File(getBedFile()); - sb.append(" -b ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "faidx": { - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "stats": { - if (StringUtils.isNotEmpty(getReferenceFile())) { - file = new File(getReferenceFile()); - sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - if (StringUtils.isNotEmpty(getTargetRegionFile())) { - file = new File(getTargetRegionFile()); - sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - if (StringUtils.isNotEmpty(getRefSeqFile())) { - file = new File(getRefSeqFile()); - sb.append(" --ref-seq ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "flagstat": { - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "index": { - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - sb.append(" ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); - break; - } - case "dict": { - sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); + private void runStats() throws ToolException { + StringBuilder sb = initCommandLine(); - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "sort": { - if (StringUtils.isNotEmpty(getReferenceFile())) { - file = new File(getReferenceFile()); - sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); + // Append mounts + List> inputFilenames = getInputFilenames(command); + Map mountMap = appendMounts(inputFilenames, sb); - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "view": { - if (StringUtils.isNotEmpty(getReferenceFile())) { - file = new File(getReferenceFile()); - sb.append(" --reference ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/") - .append(file.getName()); - } - if (StringUtils.isNotEmpty(getBedFile())) { - file = new File(getBedFile()); - sb.append(" -L ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - if (StringUtils.isNotEmpty(getReadGroupFile())) { - file = new File(getReadGroupFile()); - sb.append(" -R ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - if (StringUtils.isNotEmpty(getReadsNotSelectedFilename())) { - sb.append(" -U ").append(DOCKER_OUTPUT_PATH).append("/").append(getReadsNotSelectedFilename()); - } - if (StringUtils.isNotEmpty(getReferenceNamesFile())) { - file = new File(getReferenceNamesFile()); - sb.append(" -t ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(outputFilename); + // Append docker image, version and command + appendCommand("samtools " + command, sb); - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - break; - } - case "plot-bamstats": { - file = new File(getInputFile()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - sb.append(" -p ").append(DOCKER_OUTPUT_PATH).append("/"); - break; - } - } + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append other params + appendOtherParams(null, sb); - return sb.toString(); + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); } - @Override - protected boolean skipParameter(String param) { - if (!super.skipParameter(param)) { - return false; - } + private void runPlotBamStats() throws ToolException { + StringBuilder sb = initCommandLine(); - switch (getCommand()) { - case "dict": { - if ("o".equals(param)) { - return false; - } - break; - } - case "view": { - switch (param) { - case "t": - case "L": - case "U": - case "R": - case "T": - case "reference": - case "o": { - return false; - } - } - break; - } - case "stats": { - switch (param) { - case "reference": - case "r": - case "ref-seq": - case "t": { - return false; - } - } - break; - } - case "flagstat": { - switch (param) { - case "input-fmt-option": { - return false; - } - } - break; - } - case "sort": { - switch (param) { - case "reference": - case "o": { - return false; - } - } - break; - } - case "depth": { - switch (param) { - case "b": - case "reference": { - return false; - } - } - break; - } - case "plot-bamstats": { - switch (param) { - case "p": { - return false; - } - } - break; - } - } - return true; - } -*/ - public String getStudy() { - return study; - } + // Append mounts + List> inputFilenames = getInputFilenames(command); + Map mountMap = appendMounts(inputFilenames, sb); - public SamtoolsWrapperAnalysisExecutor setStudy(String study) { - this.study = study; - return this; - } + // Append docker image, version and command + appendCommand(command, sb); - public String getCommand() { - return command; - } + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); - public SamtoolsWrapperAnalysisExecutor setCommand(String command) { - this.command = command; - return this; - } + // Append output file params + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("p", " "))); + appendOutputFiles(outputFilenames, sb); - public String getInputFile() { - return inputFile; - } + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("p", "prefix")); + appendOtherParams(skipParams, sb); - public SamtoolsWrapperAnalysisExecutor setInputFile(String inputFile) { - this.inputFile = inputFile; - return this; + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); } - public String getReferenceFile() { - return referenceFile; - } + private void runFlagstat() throws ToolException { + StringBuilder sb = initCommandLine(); - public SamtoolsWrapperAnalysisExecutor setReferenceFile(String referenceFile) { - this.referenceFile = referenceFile; - return this; - } + // Append mounts + List> inputFilenames = getInputFilenames(command); + Map mountMap = appendMounts(inputFilenames, sb); - public String getReadGroupFile() { - return readGroupFile; - } + // Append docker image, version and command + appendCommand("samtools " + command, sb); - public SamtoolsWrapperAnalysisExecutor setReadGroupFile(String readGroupFile) { - this.readGroupFile = readGroupFile; - return this; - } + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); - public String getBedFile() { - return bedFile; - } + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("input-fmt-option")); + appendOtherParams(skipParams, sb); - public SamtoolsWrapperAnalysisExecutor setBedFile(String bedFile) { - this.bedFile = bedFile; - return this; + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); } - public String getRefSeqFile() { - return refSeqFile; - } + private List> getInputFilenames(String command) { + List> inputFilenames = new ArrayList<>(); + inputFilenames.add(new ImmutablePair<>("", getInputFile())); - public SamtoolsWrapperAnalysisExecutor setRefSeqFile(String refSeqFile) { - this.refSeqFile = refSeqFile; - return this; + if (MapUtils.isNotEmpty(getExecutorParams())) { + Set fileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + for (String paramName : getExecutorParams().keySet()) { + if (skipParameter(paramName)) { + continue; + } + + if (fileParamNames.contains(paramName)) { + Pair pair = new ImmutablePair<>(paramName, getExecutorParams().get(paramName).toString()); + inputFilenames.add(pair); + } + + } + } + + return inputFilenames; } - public String getReferenceNamesFile() { - return referenceNamesFile; + public String getStudy() { + return study; } - public SamtoolsWrapperAnalysisExecutor setReferenceNamesFile(String referenceNamesFile) { - this.referenceNamesFile = referenceNamesFile; + public SamtoolsWrapperAnalysisExecutor setStudy(String study) { + this.study = study; return this; } - public String getTargetRegionFile() { - return targetRegionFile; + public String getCommand() { + return command; } - public SamtoolsWrapperAnalysisExecutor setTargetRegionFile(String targetRegionFile) { - this.targetRegionFile = targetRegionFile; + public SamtoolsWrapperAnalysisExecutor setCommand(String command) { + this.command = command; return this; } - public String getReadsNotSelectedFilename() { - return readsNotSelectedFilename; + public String getInputFile() { + return inputFile; } - public SamtoolsWrapperAnalysisExecutor setReadsNotSelectedFilename(String readsNotSelectedFilename) { - this.readsNotSelectedFilename = readsNotSelectedFilename; + public SamtoolsWrapperAnalysisExecutor setInputFile(String inputFile) { + this.inputFile = inputFile; return this; } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 1d1419f401c..846a63fb163 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -280,14 +280,6 @@ private void samtools() throws Exception { ObjectMap params = new SamtoolsWrapperParams( cliOptions.command, cliOptions.inputFile, - cliOptions.outputFilename, - cliOptions.referenceFile, - cliOptions.readGroupFile, - cliOptions.bedFile, - cliOptions.refSeqFile, - cliOptions.referenceNamesFile, - cliOptions.targetRegionFile, - cliOptions.readsNotSelectedFilename, cliOptions.outdir, cliOptions.samtoolsParams) .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index 601e9b3062a..38514049975 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -524,30 +524,6 @@ public class SamtoolsCommandOptions { @Parameter(names = {"--input-file"}, description = INPUT_FILE_DESCRIPTION) public String inputFile; - @Parameter(names = {"--output-filename"}, description = OUTPUT_FILENAME_DESCRIPTION) - public String outputFilename; - - @Parameter(names = {"--reference-file"}, description = REFERENCE_FILE_DESCRIPTION) - public String referenceFile; - - @Parameter(names = {"--read-group-file"}, description = READ_GROUP_FILE_DESCRIPTION) - public String readGroupFile; - - @Parameter(names = {"--bed-file"}, description = BED_FILE_DESCRIPTION) - public String bedFile; - - @Parameter(names = {"--ref-seq-file"}, description = REF_SEQ_FILE_DESCRIPTION) - public String refSeqFile; - - @Parameter(names = {"--reference-names-file"}, description = REFERENCE_NAMES_DESCRIPTION) - public String referenceNamesFile; - - @Parameter(names = {"--target-region-file"}, description = TARGET_REGION_DESCRIPTION) - public String targetRegionFile; - - @Parameter(names = {"--reads-not-selected-filename"}, description = READS_NOT_SELECTED_FILENAME_DESCRIPTION) - public String readsNotSelectedFilename; - @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) public String outdir; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index 62f3162bcf0..8be7af3a383 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -433,23 +433,13 @@ private RestResponse bwa() throws ClientException { // Samtools private RestResponse samtools() throws ClientException { - SamtoolsWrapperParams wrapperParams = new SamtoolsWrapperParams( - alignmentCommandOptions.samtoolsCommandOptions.command, - alignmentCommandOptions.samtoolsCommandOptions.inputFile, - alignmentCommandOptions.samtoolsCommandOptions.outputFilename, - alignmentCommandOptions.samtoolsCommandOptions.referenceFile, - alignmentCommandOptions.samtoolsCommandOptions.readGroupFile, - alignmentCommandOptions.samtoolsCommandOptions.bedFile, - alignmentCommandOptions.samtoolsCommandOptions.refSeqFile, - alignmentCommandOptions.samtoolsCommandOptions.referenceNamesFile, - alignmentCommandOptions.samtoolsCommandOptions.targetRegionFile, - alignmentCommandOptions.samtoolsCommandOptions.readsNotSelectedFilename, - alignmentCommandOptions.samtoolsCommandOptions.outdir, - alignmentCommandOptions.samtoolsCommandOptions.samtoolsParams - ); - ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), alignmentCommandOptions.samtoolsCommandOptions.study); + AlignmentCommandOptions.SamtoolsCommandOptions cliOptions = alignmentCommandOptions.samtoolsCommandOptions; + + ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); + params.putAll(getJobParams()); - return openCGAClient.getAlignmentClient().runSamtools(wrapperParams, params); + return openCGAClient.getAlignmentClient().runSamtools(new SamtoolsWrapperParams(cliOptions.command, cliOptions.inputFile, + cliOptions.outdir, cliOptions.samtoolsParams), params); } // Deeptools diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index a730d83f577..d8655bf68bc 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -452,28 +452,13 @@ public class ParamConstants { // --------------------------------------------- + public static final String INPUT_FILE_DESCRIPTION = FILE_ID_DESCRIPTION + " (input file)"; + + // --------------------------------------------- + public static final String SAMTOOLS_COMMANDS_SUPPORTED = "sort, index, view, stats, flagstat, dict, faidx, depth, plot-bamstats"; public static final String SAMTOOLS_COMMAND_DESCRIPTION = "Supported Samtools commands: " + SAMTOOLS_COMMANDS_SUPPORTED; - public static final String INPUT_FILE_DESCRIPTION = "Input file (full path)."; - public static final String INPUT_FILE_PARAM = "inputFile"; - public static final String OUTPUT_FILENAME_DESCRIPTION = "Output file name."; - public static final String OUTPUT_FILENAME_PARAM = "outputFilename"; - public static final String REFERENCE_FILE_DESCRIPTION = "Reference sequence FASTA file"; - public static final String REFERENCE_FILE_PARAM = "referenceFile"; - public static final String READ_GROUP_FILE_DESCRIPTION = "Only include reads with read group listed in this file"; - public static final String READ_GROUP_FILE_PARAM = "readGroupFile"; - public static final String BED_FILE_DESCRIPTION = "File containing a list of positions or regions"; - public static final String BED_FILE_PARAM = "bedFile"; - public static final String REF_SEQ_FILE_DESCRIPTION = "Reference sequence (required for GC-depth and mismatches-per-cycle calculation)"; - public static final String REF_SEQ_FILE_PARAM = "refSeqFile"; - public static final String REFERENCE_NAMES_DESCRIPTION = "File listing reference names and lengths"; - public static final String REFERENCE_NAMES_PARAM = "referenceNamesFile"; - public static final String TARGET_REGION_DESCRIPTION = "Do stats in these regions only. Tab-delimited file chr,from,to, 1-based, inclusive"; - public static final String TARGET_REGION_PARAM = "targetRegionFile"; - public static final String READS_NOT_SELECTED_FILENAME_DESCRIPTION = "Output reads not selected by filters will be written into this file"; - public static final String READS_NOT_SELECTED_FILENAME_PARAM = "readsNotSelectedFilename"; - // --------------------------------------------- public static final String PICARD_COMMANDS_SUPPORTED = "CollectHsMetrics, CollectWgsMetrics, BedToIntervalList"; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/SamtoolsWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/SamtoolsWrapperParams.java index bb2d76d5f00..46b9fd40e94 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/SamtoolsWrapperParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/SamtoolsWrapperParams.java @@ -4,38 +4,22 @@ import java.util.Map; +import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMAND_DESCRIPTION; + public class SamtoolsWrapperParams extends ToolParams { - public static final String DESCRIPTION = "Samtoolstools parameters"; - - private String command; // Valid values: view, index, sort, stats - private String inputFile; // Input file - private String outputFilename; // Output filename - private String referenceFile; - private String readGroupFile; - private String bedFile; - private String refSeqFile; - private String referenceNamesFile; - private String targetRegionFile; - private String readsNotSelectedFilename; + public static final String DESCRIPTION = "Samtools parameters. " + SAMTOOLS_COMMAND_DESCRIPTION; + + private String command; + private String inputFile; private String outdir; private Map samtoolsParams; public SamtoolsWrapperParams() { } - public SamtoolsWrapperParams(String command, String inputFile, String outputFilename, String referenceFile, String readGroupFile, - String bedFile, String refSeqFile, String referenceNamesFile, String targetRegionFile, - String readsNotSelectedFilename, String outdir, Map samtoolsParams) { + public SamtoolsWrapperParams(String command, String inputFile, String outdir, Map samtoolsParams) { this.command = command; this.inputFile = inputFile; - this.outputFilename = outputFilename; - this.referenceFile = referenceFile; - this.readGroupFile = readGroupFile; - this.bedFile = bedFile; - this.refSeqFile = refSeqFile; - this.referenceNamesFile = referenceNamesFile; - this.targetRegionFile = targetRegionFile; - this.readsNotSelectedFilename = readsNotSelectedFilename; this.outdir = outdir; this.samtoolsParams = samtoolsParams; } @@ -45,14 +29,6 @@ public String toString() { final StringBuilder sb = new StringBuilder("SamtoolsWrapperParams{"); sb.append("command='").append(command).append('\''); sb.append(", inputFile='").append(inputFile).append('\''); - sb.append(", outputFilename='").append(outputFilename).append('\''); - sb.append(", referenceFile='").append(referenceFile).append('\''); - sb.append(", readGroupFile='").append(readGroupFile).append('\''); - sb.append(", bedFile='").append(bedFile).append('\''); - sb.append(", refSeqFile='").append(refSeqFile).append('\''); - sb.append(", referenceNamesFile='").append(referenceNamesFile).append('\''); - sb.append(", targetRegionFile='").append(targetRegionFile).append('\''); - sb.append(", readsNotSelectedFilename='").append(readsNotSelectedFilename).append('\''); sb.append(", outdir='").append(outdir).append('\''); sb.append(", samtoolsParams=").append(samtoolsParams); sb.append('}'); @@ -77,78 +53,6 @@ public SamtoolsWrapperParams setInputFile(String inputFile) { return this; } - public String getOutputFilename() { - return outputFilename; - } - - public SamtoolsWrapperParams setOutputFilename(String outputFilename) { - this.outputFilename = outputFilename; - return this; - } - - public String getReferenceFile() { - return referenceFile; - } - - public SamtoolsWrapperParams setReferenceFile(String referenceFile) { - this.referenceFile = referenceFile; - return this; - } - - public String getReadGroupFile() { - return readGroupFile; - } - - public SamtoolsWrapperParams setReadGroupFile(String readGroupFile) { - this.readGroupFile = readGroupFile; - return this; - } - - public String getBedFile() { - return bedFile; - } - - public SamtoolsWrapperParams setBedFile(String bedFile) { - this.bedFile = bedFile; - return this; - } - - public String getRefSeqFile() { - return refSeqFile; - } - - public SamtoolsWrapperParams setRefSeqFile(String refSeqFile) { - this.refSeqFile = refSeqFile; - return this; - } - - public String getReferenceNamesFile() { - return referenceNamesFile; - } - - public SamtoolsWrapperParams setReferenceNamesFile(String referenceNamesFile) { - this.referenceNamesFile = referenceNamesFile; - return this; - } - - public String getTargetRegionFile() { - return targetRegionFile; - } - - public SamtoolsWrapperParams setTargetRegionFile(String targetRegionFile) { - this.targetRegionFile = targetRegionFile; - return this; - } - - public String getReadsNotSelectedFilename() { - return readsNotSelectedFilename; - } - - public SamtoolsWrapperParams setReadsNotSelectedFilename(String readsNotSelectedFilename) { - this.readsNotSelectedFilename = readsNotSelectedFilename; - return this; - } - public String getOutdir() { return outdir; } From 801e219ced8a03239579ef0fdb681b51ef1bff60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 29 Apr 2021 16:32:21 +0200 Subject: [PATCH 248/412] analysis: improve parameter managnement for the Fastqc wrapper, #1753 --- .../DockerWrapperAnalysisExecutor.java | 30 ++++++++++++-- .../fastqc/FastqcWrapperAnalysis.java | 31 +++++++------- .../fastqc/FastqcWrapperAnalysisExecutor.java | 41 ++----------------- .../executors/AlignmentCommandExecutor.java | 3 -- .../options/AlignmentCommandOptions.java | 11 ----- .../analysis/AlignmentCommandExecutor.java | 3 -- .../models/alignment/FastqcWrapperParams.java | 39 +----------------- 7 files changed, 48 insertions(+), 110 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java index 3f7750a2f0a..61cb2f63ce3 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java @@ -1,8 +1,11 @@ package org.opencb.opencga.analysis.wrappers.executors; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; +import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.exec.Command; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.tools.OpenCgaToolExecutor; @@ -13,8 +16,6 @@ import java.io.FileOutputStream; import java.util.*; -import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMANDS_SUPPORTED; - public abstract class DockerWrapperAnalysisExecutor extends OpenCgaToolExecutor { public final static String DOCKER_INPUT_PATH = "/data/input"; @@ -153,7 +154,30 @@ protected void runCommandLine(String cmdline) throws ToolException { } } - protected boolean skipParameter(String param) { + public static List> getInputFilenames(String inputFile, Set fileParamNames, ObjectMap executorParams) { + List> inputFilenames = new ArrayList<>(); + if (StringUtils.isNotEmpty(inputFile)) { + inputFilenames.add(new ImmutablePair<>("", inputFile)); + } + + if (MapUtils.isNotEmpty(executorParams)) { + for (String paramName : executorParams.keySet()) { + if (skipParameter(paramName)) { + continue; + } + + if (fileParamNames.contains(paramName)) { + Pair pair = new ImmutablePair<>(paramName, executorParams.get(paramName).toString()); + inputFilenames.add(pair); + } + + } + } + + return inputFilenames; + } + + protected static boolean skipParameter(String param) { switch (param) { case "opencgaHome": case "token": diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java index 028b17ae70e..b829bc0d781 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysis.java @@ -27,19 +27,20 @@ import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.tools.annotations.ToolParams; +import java.util.*; + @Tool(id = FastqcWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = FastqcWrapperAnalysis.DESCRIPTION) public class FastqcWrapperAnalysis extends OpenCgaToolScopeStudy { public final static String ID = "fastqc"; public final static String DESCRIPTION = "A high throughput sequence QC analysis tool"; + public final static Set FILE_PARAM_NAMES = new HashSet<>(Arrays.asList("l", "limits", "a", "adapters", "c", "contaminants")); + @ToolParams protected final FastqcWrapperParams analysisParams = new FastqcWrapperParams(); private String inputFilePath = null; - private String contaminantsFilePath = null; - private String adaptersFilePath = null; - private String limitsFilePath = null; protected void check() throws Exception { super.check(); @@ -49,15 +50,18 @@ protected void check() throws Exception { if (StringUtils.isNotEmpty(analysisParams.getInputFile())) { inputFilePath = AnalysisUtils.getCatalogFile(analysisParams.getInputFile(), study, fileManager, token).getUri().getPath(); } - if (StringUtils.isNotEmpty(analysisParams.getContaminantsFile())) { - contaminantsFilePath = AnalysisUtils.getCatalogFile(analysisParams.getContaminantsFile(), study, fileManager, token).getUri() - .getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getAdaptersFile())) { - adaptersFilePath = AnalysisUtils.getCatalogFile(analysisParams.getAdaptersFile(), study, fileManager, token).getUri().getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getLimitsFile())) { - limitsFilePath = AnalysisUtils.getCatalogFile(analysisParams.getLimitsFile(), study, fileManager, token).getUri().getPath(); + + if (MapUtils.isNotEmpty(analysisParams.getFastqcParams())) { + Map updatedMap = new HashMap<>(); + for (Map.Entry entry : analysisParams.getFastqcParams().entrySet()) { + if (FILE_PARAM_NAMES.contains(entry.getKey())) { + updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) + .getUri().getPath()); + } + } + if (MapUtils.isNotEmpty(updatedMap)) { + analysisParams.getFastqcParams().putAll(updatedMap); + } } } @@ -72,9 +76,6 @@ protected void run() throws Exception { getToolExecutor(FastqcWrapperAnalysisExecutor.class) .setInputFile(inputFilePath) - .setContaminantsFile(contaminantsFilePath) - .setAdaptersFile(adaptersFilePath) - .setLimitsFile(limitsFilePath) .execute(); }); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java index c41a2534c1e..24abda4768d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/fastqc/FastqcWrapperAnalysisExecutor.java @@ -19,9 +19,6 @@ public class FastqcWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor private String study; private String inputFile; - private String contaminantsFile; - private String adaptersFile; - private String limitsFile; private Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -40,10 +37,8 @@ protected void run() throws Exception { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("", getInputFile()), - new ImmutablePair<>("contaminants", getContaminantsFile()), new ImmutablePair<>("adapters", getAdaptersFile()), - new ImmutablePair<>("limits", getLimitsFile()))); - + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), + FastqcWrapperAnalysis.FILE_PARAM_NAMES, getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -57,11 +52,10 @@ protected void run() throws Exception { appendOutputFiles(outputFilenames, sb); // Append other params - Set skipParams = new HashSet<>(Arrays.asList("o", "outdir", "d", "dir", "j", "java", "c", "contaminants", "a", "adapters", - "l", "limits")); + Set skipParams = new HashSet<>(Arrays.asList("o", "outdir", "d", "dir", "j", "java")); appendOtherParams(skipParams, sb); - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt + // Execute command and redirect stdout and stderr to the files logger.info("Docker command line: " + sb.toString()); runCommandLine(sb.toString()); } @@ -83,31 +77,4 @@ public FastqcWrapperAnalysisExecutor setInputFile(String inputFile) { this.inputFile = inputFile; return this; } - - public String getContaminantsFile() { - return contaminantsFile; - } - - public FastqcWrapperAnalysisExecutor setContaminantsFile(String contaminantsFile) { - this.contaminantsFile = contaminantsFile; - return this; - } - - public String getAdaptersFile() { - return adaptersFile; - } - - public FastqcWrapperAnalysisExecutor setAdaptersFile(String adaptersFile) { - this.adaptersFile = adaptersFile; - return this; - } - - public String getLimitsFile() { - return limitsFile; - } - - public FastqcWrapperAnalysisExecutor setLimitsFile(String limitsFile) { - this.limitsFile = limitsFile; - return this; - } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 846a63fb163..09e63e06312 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -314,9 +314,6 @@ private void fastqc() throws Exception { ObjectMap params = new FastqcWrapperParams( cliOptions.inputFile, - cliOptions.contaminantsFile, - cliOptions.adaptersFile, - cliOptions.limitsFile, cliOptions.outdir, cliOptions.fastqcParams) .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index 38514049975..f64cf78447c 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -583,17 +583,6 @@ public class FastqcCommandOptions { @Parameter(names = {"--input-file"}, description = FILE_ID_DESCRIPTION + " (FastQ, SAM or BAM file)", required = true) public String inputFile; - @Parameter(names = {"--contaminants-file"}, description = FILE_ID_DESCRIPTION + " (file which contains the list of" + - " contaminants to screen overrepresented sequences against)") - public String contaminantsFile; - - @Parameter(names = {"--adapters-file"}, description = FILE_ID_DESCRIPTION + " (adapter sequences file)") - public String adaptersFile; - - @Parameter(names = {"--limits-file"}, description = FILE_ID_DESCRIPTION + " (file which contains a set of criteria" - + " which will be used to determine the warn/error limits for the various modules)") - public String limitsFile; - @DynamicParameter(names = {"--fastqc-params"}, description = "FastQc parameters e.g.:. --fastqc-params kmers=10") public Map fastqcParams = new HashMap<>(); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index 8be7af3a383..4facee83569 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -460,9 +460,6 @@ private RestResponse deeptools() throws ClientException { private RestResponse fastqc() throws ClientException { FastqcWrapperParams fastQcWrapperParams = new FastqcWrapperParams( alignmentCommandOptions.fastqcCommandOptions.inputFile, - alignmentCommandOptions.fastqcCommandOptions.contaminantsFile, - alignmentCommandOptions.fastqcCommandOptions.adaptersFile, - alignmentCommandOptions.fastqcCommandOptions.limitsFile, alignmentCommandOptions.fastqcCommandOptions.outdir, alignmentCommandOptions.fastqcCommandOptions.fastqcParams ); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastqcWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastqcWrapperParams.java index fedc2637325..06c84339ca7 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastqcWrapperParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/FastqcWrapperParams.java @@ -8,21 +8,14 @@ public class FastqcWrapperParams extends ToolParams { public static final String DESCRIPTION = "FastQC parameters"; private String inputFile; - private String contaminantsFile; - private String adaptersFile; - private String limitsFile; private String outdir; private Map fastqcParams; public FastqcWrapperParams() { } - public FastqcWrapperParams(String inputFile, String contaminantsFile, String adaptersFile, String limitsFile, String outdir, - Map fastqcParams) { + public FastqcWrapperParams(String inputFile, String outdir, Map fastqcParams) { this.inputFile = inputFile; - this.contaminantsFile = contaminantsFile; - this.adaptersFile = adaptersFile; - this.limitsFile = limitsFile; this.outdir = outdir; this.fastqcParams = fastqcParams; } @@ -31,9 +24,6 @@ public FastqcWrapperParams(String inputFile, String contaminantsFile, String ada public String toString() { final StringBuilder sb = new StringBuilder("FastqcWrapperParams{"); sb.append("inputFile='").append(inputFile).append('\''); - sb.append(", contaminantsFile='").append(contaminantsFile).append('\''); - sb.append(", adaptersFile='").append(adaptersFile).append('\''); - sb.append(", limitsFile='").append(limitsFile).append('\''); sb.append(", outdir='").append(outdir).append('\''); sb.append(", fastqcParams=").append(fastqcParams); sb.append('}'); @@ -49,33 +39,6 @@ public FastqcWrapperParams setInputFile(String inputFile) { return this; } - public String getContaminantsFile() { - return contaminantsFile; - } - - public FastqcWrapperParams setContaminantsFile(String contaminantsFile) { - this.contaminantsFile = contaminantsFile; - return this; - } - - public String getAdaptersFile() { - return adaptersFile; - } - - public FastqcWrapperParams setAdaptersFile(String adaptersFile) { - this.adaptersFile = adaptersFile; - return this; - } - - public String getLimitsFile() { - return limitsFile; - } - - public FastqcWrapperParams setLimitsFile(String limitsFile) { - this.limitsFile = limitsFile; - return this; - } - public String getOutdir() { return outdir; } From 941e6b909e50657c62454156c254f767237b2291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 30 Apr 2021 08:37:44 +0200 Subject: [PATCH 249/412] analysis: improve the Deeptools wrapper, and include the bamCompare command, #1753 --- .../alignment/AlignmentStorageManager.java | 90 +++--- .../wrappers/DeeptoolsWrapperAnalysis.java | 208 -------------- .../deeptools/DeeptoolsWrapperAnalysis.java | 258 ++++++++++++++++++ .../DeeptoolsWrapperAnalysisExecutor.java | 102 +++++++ .../samtools/SamtoolsWrapperAnalysis.java | 1 - .../executors/AlignmentCommandExecutor.java | 35 ++- .../options/AlignmentCommandOptions.java | 9 +- .../analysis/AlignmentCommandExecutor.java | 15 +- .../opencga/core/api/ParamConstants.java | 5 + .../alignment/DeeptoolsWrapperParams.java | 18 +- .../monitor/daemons/ExecutionDaemon.java | 1 + .../rest/analysis/AlignmentWebService.java | 32 ++- .../rest/analysis/VariantWebService.java | 11 +- 13 files changed, 474 insertions(+), 311 deletions(-) delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DeeptoolsWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/deeptools/DeeptoolsWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/deeptools/DeeptoolsWrapperAnalysisExecutor.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java index 8717b7f97d9..1a9720caa8b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java @@ -36,7 +36,7 @@ import org.opencb.opencga.analysis.alignment.qc.AlignmentStatsAnalysis; import org.opencb.opencga.analysis.models.FileInfo; import org.opencb.opencga.analysis.models.StudyInfo; -import org.opencb.opencga.analysis.wrappers.DeeptoolsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -46,6 +46,7 @@ import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.alignment.AlignmentFlagStatsParams; import org.opencb.opencga.core.models.alignment.AlignmentStatsParams; +import org.opencb.opencga.core.models.alignment.DeeptoolsWrapperParams; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.project.Project; @@ -151,49 +152,60 @@ public AlignmentIterator iterator(String studyIdStr, String fileIdStr, Qu // STATS: run, info and query //------------------------------------------------------------------------- - public void statsRun(String study, String inputFile, String outdir, String token) throws ToolException { - Map params = new AlignmentStatsParams(inputFile, null).toParams(new ObjectMap(ParamConstants.STUDY_PARAM, study)); - - try { - catalogManager.getJobManager().submit(study, AlignmentStatsAnalysis.ID, Enums.Priority.MEDIUM, params, null, "Job generated by " - + " AlignmentStorageManager/statsRun", Collections.emptyList(), Collections.emptyList(), token); - } catch (CatalogException e) { - throw new ToolException(e); - } - } - - public void flagStatsRun(String study, String inputFile, String outdir, String token) throws ToolException { - Map params = new AlignmentFlagStatsParams(inputFile, null).toParams(new ObjectMap(ParamConstants.STUDY_PARAM, - study)); - - try { - catalogManager.getJobManager().submit(study, AlignmentFlagStatsAnalysis.ID, Enums.Priority.MEDIUM, params, null, - "Job generated by AlignmentStorageManager/flagStatsRun", Collections.emptyList(), Collections.emptyList(), token); - } catch (CatalogException e) { - throw new ToolException(e); - } - } +// public void statsRun(String study, String inputFile, String outdir, String token) throws ToolException { +// Map params = new AlignmentStatsParams(inputFile, null).toParams(new ObjectMap(ParamConstants.STUDY_PARAM, study)); +// +// try { +// catalogManager.getJobManager().submit(study, AlignmentStatsAnalysis.ID, Enums.Priority.MEDIUM, params, null, "Job generated by " +// + " AlignmentStorageManager/statsRun", Collections.emptyList(), Collections.emptyList(), token); +// } catch (CatalogException e) { +// throw new ToolException(e); +// } +// } +// +// public void flagStatsRun(String study, String inputFile, String outdir, String token) throws ToolException { +// Map params = new AlignmentFlagStatsParams(inputFile, null).toParams(new ObjectMap(ParamConstants.STUDY_PARAM, +// study)); +// +// try { +// catalogManager.getJobManager().submit(study, AlignmentFlagStatsAnalysis.ID, Enums.Priority.MEDIUM, params, null, +// "Job generated by AlignmentStorageManager/flagStatsRun", Collections.emptyList(), Collections.emptyList(), token); +// } catch (CatalogException e) { +// throw new ToolException(e); +// } +// } //------------------------------------------------------------------------- // COVERAGE: run, query and ratio //------------------------------------------------------------------------- - public void coverageRun(String study, String inputFile, int windowSize, boolean overwrite, String outdir, String token) throws ToolException { - ObjectMap params = new ObjectMap(); - params.put("of", "bigwig"); - params.put("bs", windowSize); - params.put("overwrite", overwrite); - - DeeptoolsWrapperAnalysis deeptools = new DeeptoolsWrapperAnalysis(); - - deeptools.setUp(null, catalogManager, storageEngineFactory, params, Paths.get(outdir), jobId, token); - - deeptools.setStudy(study); - deeptools.setCommand("bamCoverage") - .setBamFile(inputFile); - - deeptools.start(); - } +// public void coverageRun(String study, String inputFile, int windowSize, boolean overwrite, String outdir, String token) throws ToolException { +// ObjectMap deeptoolsParams = new ObjectMap(); +// deeptoolsParams.put("of", "bigwig"); +// deeptoolsParams.put("bs", windowSize); +// deeptoolsParams.put("overwrite", overwrite); +// +// ObjectMap params = new DeeptoolsWrapperParams( +// "bamCoverage", +// outdir, +// deeptoolsParams) +// .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); +// +// toolRunner.execute(DeeptoolsWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); +// +// +// +// +// DeeptoolsWrapperAnalysis deeptools = new DeeptoolsWrapperAnalysis(); +// +// deeptools.setUp(null, catalogManager, storageEngineFactory, params, Paths.get(outdir), jobId, token); +// +// deeptools.setStudy(study); +//// deeptools.setCommand("bamCoverage") +//// .setBamFile(inputFile); +// +// deeptools.start(); +// } //------------------------------------------------------------------------- diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DeeptoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DeeptoolsWrapperAnalysis.java deleted file mode 100644 index 52495b988d0..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/DeeptoolsWrapperAnalysis.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.analysis.wrappers; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.opencb.commons.exec.Command; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.tools.annotations.Tool; - -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.nio.charset.Charset; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; - -@Tool(id = DeeptoolsWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = DeeptoolsWrapperAnalysis.DESCRIPTION) -public class DeeptoolsWrapperAnalysis extends OpenCgaWrapperAnalysis { - - public final static String ID = "deeptools"; - public final static String DESCRIPTION = "Deeptools is a suite of python tools particularly developed for the efficient analysis of" - + " high-throughput sequencing data, such as ChIP-seq, RNA-seq or MNase-seq."; - - public final static String DEEPTOOLS_DOCKER_IMAGE = "dhspence/docker-deeptools"; - - private String command; - private String bamFile; - - protected void check() throws Exception { - super.check(); - - if (StringUtils.isEmpty(command)) { - throw new ToolException("Missing deeptools command. Supported command is 'bamCoverage'"); - } - - switch (command) { - case "bamCoverage": - if (StringUtils.isEmpty(bamFile)) { - throw new ToolException("Missing BAM file when executing 'deeptools " + command + "'."); - } - break; - default: - // TODO: support the remaining deeptools commands - throw new ToolException("Deeptools command '" + command + "' is not available. Supported command is" - + " 'bamCoverage'"); - } - - } - - @Override - protected void run() throws Exception { - step(() -> { - - if (command.equals("bamCoverage")) { - org.opencb.opencga.core.models.file.File catalogBamFile = getCatalogFile(bamFile); - Path bamPath = Paths.get(catalogBamFile.getUri()); - Path newCoveragePath = getOutDir().resolve(bamPath.getFileName() + ".bw"); - Path prevCoveragePath = bamPath.getParent().resolve(newCoveragePath.getFileName()); - - if (!prevCoveragePath.toFile().exists()) { - String commandLine = getCommandLine(); - logger.info("Deeptools command line: " + commandLine); - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - Command cmd = new Command(getCommandLine()) - .setOutputOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDOUT_FILENAME).toFile()))) - .setErrorOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDERR_FILENAME).toFile()))); - - cmd.run(); - - if (newCoveragePath.toFile().exists()) { - Path dest = Paths.get(new File(catalogBamFile.getUri()).getParent()); - - moveFile(getStudy(), newCoveragePath, dest, catalogBamFile.getPath(), token); - } else { - File file = new File(getScratchDir() + "/" + STDERR_FILENAME); - String msg = "Something wrong executing Deeptools bamCoverage"; - if (file.exists()) { - msg = StringUtils.join(FileUtils.readLines(file, Charset.defaultCharset()), ". "); - } - throw new ToolException(msg); - } - } else { - addWarning("Skipping BAM coverage from Deeptools: coverage BigWig file already exists at " + prevCoveragePath); - } -// -// boolean isLinked = true; -// OpenCGAResult fileResult; -// try { -// fileResult = catalogManager.getFileManager().get(getStudy(), catalogBamFile.getPath(), QueryOptions.empty(), token); -// if (fileResult.getNumResults() <= 0) { -// isLinked = false; -// } -// } catch (CatalogException e) { -// isLinked = false; -// } -// if (!isLinked) { -// catalogManager.getFileManager().link(getStudy(), prevCoveragePath.toUri(), Paths.get(catalogBamFile.getPath()) -// .getParent().toString(), new ObjectMap("parents", true), token); -// } - } - }); - } - -// @Override -// public String getDockerImageName() { -// return DEEPTOOLS_DOCKER_IMAGE; -// } - -// @Override - public String getCommandLine() throws ToolException { - StringBuilder sb = new StringBuilder("docker run "); - - // Mount management - Map srcTargetMap = new HashMap<>(); - updateFileMaps(bamFile, sb, fileUriMap, srcTargetMap); - - sb.append("--mount type=bind,source=\"") - .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); - - // Docker image and version - sb.append(DEEPTOOLS_DOCKER_IMAGE); - if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { - sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); - } - - // Deeptools command - sb.append(" ").append(command); - - // Deeptools options - for (String param : params.keySet()) { - if (checkParam(param)) { - String value = params.getString(param); - if (param.length() >= 3) { - sb.append(" --"); - } else { - sb.append(" -"); - } - sb.append(param); - if (StringUtils.isNotEmpty(value)) { - sb.append(" ").append(value); - } - } - } - - switch (command) { - case "bamCoverage": { - File file = new File(fileUriMap.get(bamFile).getPath()); - String coverageFilename = file.getName() + ".bw"; - - sb.append(" -b ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(coverageFilename); - break; - } - } - - return sb.toString(); - } - - private boolean checkParam(String param) { - if (param.equals(DOCKER_IMAGE_VERSION_PARAM)) { - return false; - } else if ("bamCoverage".equals(command)) { - if ("o".equals(param) || "b".equals(param) || "overwrite".equals(param)) { - return false; - } - - } - return true; - } - - public String getCommand() { - return command; - } - - public DeeptoolsWrapperAnalysis setCommand(String command) { - this.command = command; - return this; - } - - public String getBamFile() { - return bamFile; - } - - public DeeptoolsWrapperAnalysis setBamFile(String bamFile) { - this.bamFile = bamFile; - return this; - } -} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/deeptools/DeeptoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/deeptools/DeeptoolsWrapperAnalysis.java new file mode 100644 index 00000000000..f073cd51d45 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/deeptools/DeeptoolsWrapperAnalysis.java @@ -0,0 +1,258 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.wrappers.deeptools; + +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.DeeptoolsWrapperParams; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; + +import java.util.*; + +import static org.opencb.opencga.core.api.ParamConstants.DEEPTOOLS_COMMANDS_SUPPORTED; + +@Tool(id = DeeptoolsWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = DeeptoolsWrapperAnalysis.DESCRIPTION) +public class DeeptoolsWrapperAnalysis extends OpenCgaToolScopeStudy { + + public final static String ID = "deeptools"; + public final static String DESCRIPTION = "Deeptools is a suite of python tools particularly developed for the efficient analysis of" + + " high-throughput sequencing data, such as ChIP-seq, RNA-seq or MNase-seq."; + + @ToolParams + protected final DeeptoolsWrapperParams analysisParams = new DeeptoolsWrapperParams(); + + protected void check() throws Exception { + super.check(); + + if (StringUtils.isEmpty(analysisParams.getCommand())) { + throw new ToolException("Missing deeptools command."); + } + + if (!AnalysisUtils.isSupportedCommand(DEEPTOOLS_COMMANDS_SUPPORTED)) { + throw new ToolException("Deeptools command '" + analysisParams.getCommand() + "' is not available. Supported commands are " + + DEEPTOOLS_COMMANDS_SUPPORTED); + } + + // Get files from catalog + FileManager fileManager = catalogManager.getFileManager(); + if (MapUtils.isNotEmpty(analysisParams.getDeeptoolsParams())) { + Set fileParams = getFileParamNames(analysisParams.getCommand()); + + Map updatedMap = new HashMap<>(); + for (Map.Entry entry : analysisParams.getDeeptoolsParams().entrySet()) { + if (fileParams.contains(entry.getKey())) { + updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) + .getUri().getPath()); + } + } + if (MapUtils.isNotEmpty(updatedMap)) { + analysisParams.getDeeptoolsParams().putAll(updatedMap); + } + } + } + + @Override + protected void run() throws Exception { + setUpStorageEngineExecutor(study); + + step(() -> { + if (MapUtils.isNotEmpty(analysisParams.getDeeptoolsParams())) { + executorParams.appendAll(analysisParams.getDeeptoolsParams()); + } + + getToolExecutor(DeeptoolsWrapperAnalysisExecutor.class) + .setCommand(analysisParams.getCommand()) + .execute(); + }); + } + + public static Set getFileParamNames(String command) { + switch (command) { + case "bamCoverage": + return new HashSet<>(Arrays.asList("b", "bam", "bl", "blackListFileName")); + case "bamCompare": + return new HashSet<>(Arrays.asList("b1", "bamfile1", "b2", "bamfile2", "bl", "blackListFileName")); + default: + break; + } + return null; + } + + + + + + + + + + + + + + + +// public final static String DEEPTOOLS_DOCKER_IMAGE = "dhspence/docker-deeptools"; + + +// @Override +// protected void run() throws Exception { +// step(() -> { +// +// if (command.equals("bamCoverage")) { +// org.opencb.opencga.core.models.file.File catalogBamFile = getCatalogFile(bamFile); +// Path bamPath = Paths.get(catalogBamFile.getUri()); +// Path newCoveragePath = getOutDir().resolve(bamPath.getFileName() + ".bw"); +// Path prevCoveragePath = bamPath.getParent().resolve(newCoveragePath.getFileName()); +// +// if (!prevCoveragePath.toFile().exists()) { +// String commandLine = getCommandLine(); +// logger.info("Deeptools command line: " + commandLine); +// // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt +// Command cmd = new Command(getCommandLine()) +// .setOutputOutputStream( +// new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDOUT_FILENAME).toFile()))) +// .setErrorOutputStream( +// new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDERR_FILENAME).toFile()))); +// +// cmd.run(); +// +// if (newCoveragePath.toFile().exists()) { +// Path dest = Paths.get(new File(catalogBamFile.getUri()).getParent()); +// +// moveFile(getStudy(), newCoveragePath, dest, catalogBamFile.getPath(), token); +// } else { +// File file = new File(getScratchDir() + "/" + STDERR_FILENAME); +// String msg = "Something wrong executing Deeptools bamCoverage"; +// if (file.exists()) { +// msg = StringUtils.join(FileUtils.readLines(file, Charset.defaultCharset()), ". "); +// } +// throw new ToolException(msg); +// } +// } else { +// addWarning("Skipping BAM coverage from Deeptools: coverage BigWig file already exists at " + prevCoveragePath); +// } +//// +//// boolean isLinked = true; +//// OpenCGAResult fileResult; +//// try { +//// fileResult = catalogManager.getFileManager().get(getStudy(), catalogBamFile.getPath(), QueryOptions.empty(), token); +//// if (fileResult.getNumResults() <= 0) { +//// isLinked = false; +//// } +//// } catch (CatalogException e) { +//// isLinked = false; +//// } +//// if (!isLinked) { +//// catalogManager.getFileManager().link(getStudy(), prevCoveragePath.toUri(), Paths.get(catalogBamFile.getPath()) +//// .getParent().toString(), new ObjectMap("parents", true), token); +//// } +// } +// }); +// } + +// @Override +// public String getDockerImageName() { +// return DEEPTOOLS_DOCKER_IMAGE; +// } + +// @Override +// public String getCommandLine() throws ToolException { +// StringBuilder sb = new StringBuilder("docker run "); +// +// // Mount management +// Map srcTargetMap = new HashMap<>(); +// updateFileMaps(bamFile, sb, fileUriMap, srcTargetMap); +// +// sb.append("--mount type=bind,source=\"") +// .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); +// +// // Docker image and version +// sb.append(DEEPTOOLS_DOCKER_IMAGE); +// if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { +// sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); +// } +// +// // Deeptools command +// sb.append(" ").append(command); +// +// // Deeptools options +// for (String param : params.keySet()) { +// if (checkParam(param)) { +// String value = params.getString(param); +// if (param.length() >= 3) { +// sb.append(" --"); +// } else { +// sb.append(" -"); +// } +// sb.append(param); +// if (StringUtils.isNotEmpty(value)) { +// sb.append(" ").append(value); +// } +// } +// } +// +// switch (command) { +// case "bamCoverage": { +// File file = new File(fileUriMap.get(bamFile).getPath()); +// String coverageFilename = file.getName() + ".bw"; +// +// sb.append(" -b ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); +// sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(coverageFilename); +// break; +// } +// } +// +// return sb.toString(); +// } +// +// private boolean checkParam(String param) { +// if (param.equals(DOCKER_IMAGE_VERSION_PARAM)) { +// return false; +// } else if ("bamCoverage".equals(command)) { +// if ("o".equals(param) || "b".equals(param) || "overwrite".equals(param)) { +// return false; +// } +// +// } +// return true; +// } +// +// public String getCommand() { +// return command; +// } +// +// public DeeptoolsWrapperAnalysis setCommand(String command) { +// this.command = command; +// return this; +// } +// +// public String getBamFile() { +// return bamFile; +// } +// +// public DeeptoolsWrapperAnalysis setBamFile(String bamFile) { +// this.bamFile = bamFile; +// return this; +// } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/deeptools/DeeptoolsWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/deeptools/DeeptoolsWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..d18137204c0 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/deeptools/DeeptoolsWrapperAnalysisExecutor.java @@ -0,0 +1,102 @@ +package org.opencb.opencga.analysis.wrappers.deeptools; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +@ToolExecutor(id = DeeptoolsWrapperAnalysisExecutor.ID, + tool = DeeptoolsWrapperAnalysis.ID, + source = ToolExecutor.Source.STORAGE, + framework = ToolExecutor.Framework.LOCAL) +public class DeeptoolsWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor { + + public final static String ID = DeeptoolsWrapperAnalysis.ID + "-local"; + + private String study; + private String command; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public String getDockerImageName() { + return "dhspence/docker-deeptools"; + } + + @Override + public String getDockerImageVersion() { + return null; + } + + @Override + public void run() throws ToolException { + switch (command) { + case "bamCoverage": + case "bamCompare": + runBamCommonCommand(); + break; + default: + throw new ToolException("Deeptools command '" + command + "' is not supported yet."); + } + } + + private void runBamCommonCommand() throws ToolException { + StringBuilder sb = initCommandLine(); + + // Append mounts + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(null, + DeeptoolsWrapperAnalysis.getFileParamNames(command), getExecutorParams()); + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand(command, sb); + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append output file params + if (getExecutorParams().containsKey("o") || getExecutorParams().containsKey("outFileName")) { + String value = String.valueOf(getExecutorParams().get("o")); + if (StringUtils.isEmpty(value)) { + value = String.valueOf(getExecutorParams().get("outFileName")); + } + if (StringUtils.isNotEmpty(value)) { + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("o", value))); + appendOutputFiles(outputFilenames, sb); + } + } + + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("o", "outFileName")); + skipParams.addAll(DeeptoolsWrapperAnalysis.getFileParamNames(command)); + appendOtherParams(skipParams, sb); + + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); + } + + public String getStudy() { + return study; + } + + public DeeptoolsWrapperAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } + + public String getCommand() { + return command; + } + + public DeeptoolsWrapperAnalysisExecutor setCommand(String command) { + this.command = command; + return this; + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java index 4704fcf497b..0c7d1b4d42a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java @@ -18,7 +18,6 @@ import com.google.common.base.CaseFormat; import org.apache.commons.collections4.MapUtils; -import org.apache.commons.io.FileSystemUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 09e63e06312..04cd3ee75c3 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -21,7 +21,7 @@ import org.opencb.opencga.analysis.alignment.qc.AlignmentGeneCoverageStatsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentQcAnalysis; import org.opencb.opencga.analysis.wrappers.BwaWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.DeeptoolsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; @@ -30,8 +30,10 @@ import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.alignment.*; +import java.io.File; import java.nio.file.Paths; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import static org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions.BwaCommandOptions.BWA_RUN_COMMAND; @@ -236,9 +238,18 @@ private void geneCoverageStatsRun() throws ToolException { private void coverageRun() throws ToolException { AlignmentCommandOptions.CoverageAlignmentCommandOptions cliOptions = alignmentCommandOptions.coverageAlignmentCommandOptions; - AlignmentStorageManager alignmentManager = new AlignmentStorageManager(catalogManager, storageEngineFactory, alignmentCommandOptions.internalJobOptions.jobId); + Map deeptoolsParams = new HashMap<>(); + deeptoolsParams.put("b", String.valueOf(cliOptions.file)); + deeptoolsParams.put("o", new File(cliOptions.file).getName() + ".bw"); + deeptoolsParams.put("binSize", String.valueOf(cliOptions.windowSize)); + + ObjectMap params = new DeeptoolsWrapperParams( + "bamCoverage", + cliOptions.outdir, + deeptoolsParams) + .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); - alignmentManager.coverageRun(cliOptions.study, cliOptions.file, cliOptions.windowSize, cliOptions.overwrite, cliOptions.outdir, cliOptions.commonOptions.token); + toolRunner.execute(DeeptoolsWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } private void delete() { @@ -291,20 +302,14 @@ private void samtools() throws Exception { private void deeptools() throws Exception { AlignmentCommandOptions.DeeptoolsCommandOptions cliOptions = alignmentCommandOptions.deeptoolsCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.commonOptions.params); - params.putAll(cliOptions.deeptoolsParams); - DeeptoolsWrapperAnalysis deeptools = new DeeptoolsWrapperAnalysis(); - deeptools.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), - alignmentCommandOptions.internalJobOptions.jobId, cliOptions.commonOptions.token); - - deeptools.setStudy(cliOptions.study); - - deeptools.setCommand(cliOptions.executable) - .setBamFile(cliOptions.bamFile); + ObjectMap params = new DeeptoolsWrapperParams( + cliOptions.command, + cliOptions.outdir, + cliOptions.deeptoolsParams) + .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); - deeptools.start(); + toolRunner.execute(DeeptoolsWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } // FastQC diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index f64cf78447c..8864ff207b6 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -18,7 +18,7 @@ import com.beust.jcommander.*; import org.opencb.opencga.analysis.wrappers.BwaWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.DeeptoolsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; @@ -549,11 +549,8 @@ public class DeeptoolsCommandOptions { @Parameter(names = {"-s", "--study"}, description = "Study [[user@]project:]study.", arity = 1) public String study; - @Parameter(names = {"--command"}, description = "Deeptools command. Valid values: bamCoverage.") - public String executable; - - @Parameter(names = {"--bam-file"}, description = "BAM file.") - public String bamFile; + @Parameter(names = {"--command"}, description = DEEPTOOLS_COMMAND_DESCRIPTION) + public String command; @DynamicParameter(names = {"--deeptools-params"}, description = "Deeptools parameters e.g.:. --deeptools-params bs=1 --deeptools-params of=bigwig") public Map deeptoolsParams = new HashMap<>(); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index 4facee83569..435ba162d4a 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -445,14 +445,13 @@ private RestResponse samtools() throws ClientException { // Deeptools private RestResponse deeptools() throws ClientException { - DeeptoolsWrapperParams deeptoolsWrapperParams = new DeeptoolsWrapperParams( - alignmentCommandOptions.deeptoolsCommandOptions.executable, - alignmentCommandOptions.deeptoolsCommandOptions.bamFile, - alignmentCommandOptions.deeptoolsCommandOptions.outdir, - alignmentCommandOptions.deeptoolsCommandOptions.deeptoolsParams - ); - ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), alignmentCommandOptions.deeptoolsCommandOptions.study); - return openCGAClient.getAlignmentClient().runDeeptools(deeptoolsWrapperParams, params); + AlignmentCommandOptions.DeeptoolsCommandOptions cliOptions = alignmentCommandOptions.deeptoolsCommandOptions; + + ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); + params.putAll(getJobParams()); + + return openCGAClient.getAlignmentClient().runDeeptools(new DeeptoolsWrapperParams(cliOptions.command, + cliOptions.outdir, cliOptions.deeptoolsParams), params); } // FastQC diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index d8655bf68bc..b004a8c853a 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -461,6 +461,11 @@ public class ParamConstants { // --------------------------------------------- + public static final String DEEPTOOLS_COMMANDS_SUPPORTED = "bamCoverage, bamCompare"; + public static final String DEEPTOOLS_COMMAND_DESCRIPTION = "Supported Deeptools commands: " + DEEPTOOLS_COMMANDS_SUPPORTED; + + // --------------------------------------------- + public static final String PICARD_COMMANDS_SUPPORTED = "CollectHsMetrics, CollectWgsMetrics, BedToIntervalList"; public static final String PICARD_COMMAND_DESCRIPTION = "Supported Picard commands: " + PICARD_COMMANDS_SUPPORTED; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/DeeptoolsWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/DeeptoolsWrapperParams.java index 9507976300a..d6a2b1be687 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/DeeptoolsWrapperParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/DeeptoolsWrapperParams.java @@ -4,20 +4,20 @@ import java.util.Map; +import static org.opencb.opencga.core.api.ParamConstants.DEEPTOOLS_COMMAND_DESCRIPTION; + public class DeeptoolsWrapperParams extends ToolParams { - public static final String DESCRIPTION = "Deeptools parameters"; + public static final String DESCRIPTION = "Deeptools parameters. " + DEEPTOOLS_COMMAND_DESCRIPTION; private String command; // Valid values: bamCoverage - private String bamFile; // BAM file private String outdir; private Map deeptoolsParams; public DeeptoolsWrapperParams() { } - public DeeptoolsWrapperParams(String command, String bamFile, String outdir, Map deeptoolsParams) { + public DeeptoolsWrapperParams(String command, String outdir, Map deeptoolsParams) { this.command = command; - this.bamFile = bamFile; this.outdir = outdir; this.deeptoolsParams = deeptoolsParams; } @@ -26,7 +26,6 @@ public DeeptoolsWrapperParams(String command, String bamFile, String outdir, Map public String toString() { final StringBuilder sb = new StringBuilder("DeeptoolsWrapperParams{"); sb.append("command='").append(command).append('\''); - sb.append(", bamFile='").append(bamFile).append('\''); sb.append(", outdir='").append(outdir).append('\''); sb.append(", deeptoolsParams=").append(deeptoolsParams); sb.append('}'); @@ -42,15 +41,6 @@ public DeeptoolsWrapperParams setCommand(String command) { return this; } - public String getBamFile() { - return bamFile; - } - - public DeeptoolsWrapperParams setBamFile(String bamFile) { - this.bamFile = bamFile; - return this; - } - public String getOutdir() { return outdir; } diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index dacdcfe3c7b..ca2e577b219 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -60,6 +60,7 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index 7caf6cb83ae..3830a87a564 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -32,6 +32,7 @@ import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; import org.opencb.opencga.analysis.alignment.qc.*; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; @@ -177,21 +178,22 @@ public Response coverageRun( @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, @ApiParam(value = CoverageIndexParams.DESCRIPTION, required = true) CoverageIndexParams params) { - logger.debug("ObjectMap: {}", params); - - DeeptoolsWrapperParams deeptoolsParams = new DeeptoolsWrapperParams(); - deeptoolsParams.setCommand("bamCoverage"); - deeptoolsParams.setBamFile(params.getFile()); - - Map bamCoverageParams = new HashMap<>(); - bamCoverageParams.put("bs", String.valueOf(params.getWindowSize() < 1 ? 1 : params.getWindowSize())); - bamCoverageParams.put("of", "bigwig"); - bamCoverageParams.put("minMappingQuality", "20"); - deeptoolsParams.setDeeptoolsParams(bamCoverageParams); - - logger.debug("ObjectMap (DeepTools) : {}", bamCoverageParams); - - return submitJob(DeeptoolsWrapperAnalysis.ID, study, deeptoolsParams, jobName, jobDescription, dependsOn, jobTags); + return null; + // logger.debug("ObjectMap: {}", params); +// +// DeeptoolsWrapperParams deeptoolsParams = new DeeptoolsWrapperParams(); +// deeptoolsParams.setCommand("bamCoverage"); +// deeptoolsParams.setBamFile(params.getFile()); +// +// Map bamCoverageParams = new HashMap<>(); +// bamCoverageParams.put("bs", String.valueOf(params.getWindowSize() < 1 ? 1 : params.getWindowSize())); +// bamCoverageParams.put("of", "bigwig"); +// bamCoverageParams.put("minMappingQuality", "20"); +// deeptoolsParams.setDeeptoolsParams(bamCoverageParams); +// +// logger.debug("ObjectMap (DeepTools) : {}", bamCoverageParams); +// +// return submitJob(DeeptoolsWrapperAnalysis.ID, study, deeptoolsParams, jobName, jobDescription, dependsOn, jobTags); } @GET diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index b5cc6273473..75a1f9be6bf 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -55,7 +55,7 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.DeeptoolsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.GatkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; @@ -1094,12 +1094,13 @@ public Response individualQcRun( // Coverage file does not exit, a job must be submitted to create the .bw file DeeptoolsWrapperParams deeptoolsParams = new DeeptoolsWrapperParams() - .setCommand("bamCoverage") - .setBamFile(catalogBamFile.getId()); + .setCommand("bamCoverage"); Map bamCoverageParams = new HashMap<>(); - bamCoverageParams.put("bs", "1"); - bamCoverageParams.put("of", "bigwig"); + bamCoverageParams.put("b", catalogBamFile.getId()); + bamCoverageParams.put("o", Paths.get(catalogBamFile.getUri()).getFileName() + ".bw"); + bamCoverageParams.put("binSize", "1"); + bamCoverageParams.put("outFileFormat", "bigwig"); bamCoverageParams.put("minMappingQuality", "20"); deeptoolsParams.setDeeptoolsParams(bamCoverageParams); From 66a9c3d8919eecb501e04b40f94002edbbf76aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 30 Apr 2021 09:32:12 +0200 Subject: [PATCH 250/412] analysis: minor improvements for Samtools wrapper, #1753 --- .../samtools/SamtoolsWrapperAnalysis.java | 40 ++--------- .../SamtoolsWrapperAnalysisExecutor.java | 66 ++++++++++--------- 2 files changed, 41 insertions(+), 65 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java index 0c7d1b4d42a..7095c0163af 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java @@ -36,10 +36,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMANDS_SUPPORTED; import static org.opencb.opencga.core.api.ParamConstants.SAMTOOLS_COMMAND_DESCRIPTION; @@ -167,41 +164,18 @@ public static SamtoolsStats parseSamtoolsStats(java.io.File file, String fileId) } public static Set getFileParamNames(String command) { - Set fileParamNames = new HashSet<>(); switch (command) { + case "depth": case "sort": - fileParamNames.add("reference"); - break; + return new HashSet<>(Arrays.asList("reference")); case "view": - fileParamNames.add("U"); - fileParamNames.add("t"); - fileParamNames.add("L"); - fileParamNames.add("R"); - fileParamNames.add("T"); - fileParamNames.add("reference"); - break; + return new HashSet<>(Arrays.asList("U", "t", "L", "R", "T", "reference")); case "stats": - fileParamNames.add("r"); - fileParamNames.add("ref-seq"); - fileParamNames.add("reference"); - fileParamNames.add("t"); - fileParamNames.add("target-regions"); - break; - case "depth": - fileParamNames.add("reference"); - break; + return new HashSet<>(Arrays.asList("r", "ref-seq", "reference", "t", "target-regions")); case "plot-bamstats": - fileParamNames.add("r"); - fileParamNames.add("ref-stats"); - fileParamNames.add("s"); - fileParamNames.add("do-ref-stats"); - fileParamNames.add("t"); - fileParamNames.add("targets"); - break; + return new HashSet<>(Arrays.asList("r", "ref-stats", "s", "do-ref-stats", "t", "targets")); default: - break; - + return new HashSet<>(); } - return fileParamNames; } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java index 6e76e8e2144..eea785614ea 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysisExecutor.java @@ -1,6 +1,5 @@ package org.opencb.opencga.analysis.wrappers.samtools; -import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -76,7 +75,9 @@ private void runDepth() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = getInputFilenames(command); + Set inputFileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -87,6 +88,7 @@ private void runDepth() throws ToolException { // Append other params Set skipParams = new HashSet<>(Arrays.asList("f")); + skipParams.addAll(inputFileParamNames); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files @@ -98,7 +100,9 @@ private void runDict() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = getInputFilenames(command); + Set inputFileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -121,6 +125,7 @@ private void runDict() throws ToolException { // Append other params Set skipParams = new HashSet<>(Arrays.asList("u", "uri", "o", "output")); + skipParams.addAll(inputFileParamNames); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files @@ -132,7 +137,9 @@ private void runView() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = getInputFilenames(command); + Set inputFileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -152,6 +159,7 @@ private void runView() throws ToolException { // Append other params Set skipParams = new HashSet<>(Arrays.asList("o")); + skipParams.addAll(inputFileParamNames); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files @@ -163,7 +171,9 @@ private void runIndex() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = getInputFilenames(command); + Set inputFileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -184,7 +194,10 @@ private void runSort() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = getInputFilenames(command); + // Append mounts + Set inputFileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -204,6 +217,7 @@ private void runSort() throws ToolException { // Append other params Set skipParams = new HashSet<>(Arrays.asList("T", "o")); + skipParams.addAll(inputFileParamNames); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files @@ -215,7 +229,9 @@ private void runFaidx() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = getInputFilenames(command); + Set inputFileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -236,7 +252,9 @@ private void runStats() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = getInputFilenames(command); + Set inputFileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -257,7 +275,9 @@ private void runPlotBamStats() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = getInputFilenames(command); + Set inputFileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -272,6 +292,7 @@ private void runPlotBamStats() throws ToolException { // Append other params Set skipParams = new HashSet<>(Arrays.asList("p", "prefix")); + skipParams.addAll(inputFileParamNames); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files @@ -283,7 +304,9 @@ private void runFlagstat() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts - List> inputFilenames = getInputFilenames(command); + Set inputFileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getInputFile(), inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -294,6 +317,7 @@ private void runFlagstat() throws ToolException { // Append other params Set skipParams = new HashSet<>(Arrays.asList("input-fmt-option")); + skipParams.addAll(inputFileParamNames); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files @@ -301,28 +325,6 @@ private void runFlagstat() throws ToolException { runCommandLine(sb.toString()); } - private List> getInputFilenames(String command) { - List> inputFilenames = new ArrayList<>(); - inputFilenames.add(new ImmutablePair<>("", getInputFile())); - - if (MapUtils.isNotEmpty(getExecutorParams())) { - Set fileParamNames = SamtoolsWrapperAnalysis.getFileParamNames(command); - for (String paramName : getExecutorParams().keySet()) { - if (skipParameter(paramName)) { - continue; - } - - if (fileParamNames.contains(paramName)) { - Pair pair = new ImmutablePair<>(paramName, getExecutorParams().get(paramName).toString()); - inputFilenames.add(pair); - } - - } - } - - return inputFilenames; - } - public String getStudy() { return study; } From cb3ebcfe34532a6a2c0b0238efc514feb8a0944d Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 30 Apr 2021 10:09:47 +0200 Subject: [PATCH 251/412] analysis: fix possible NPE, #1693 --- .../opencb/opencga/analysis/rga/RgaManager.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 8a91e0a2718..3260e483f88 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -373,6 +373,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer List sampleIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue) .collect(Collectors.toList()); + // TODO: Batches of samples to query catalog // 3. Get list of individual ids for which the user has permissions Query sampleQuery = new Query() .append(ACL_PARAM, userId + ":" + SampleAclEntry.SamplePermissions.VIEW + "," @@ -625,6 +626,9 @@ public OpenCGAResult individualSummary(String study knockoutByIndividualSummaryList.add(summaryFuture.get()); } } catch (InterruptedException | ExecutionException e) { + if (RgaException.NO_RESULTS_FOUND.equals(e.getCause().getMessage())) { + return OpenCGAResult.empty(KnockoutByIndividualSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + } throw new RgaException(e.getMessage(), e); } @@ -705,6 +709,9 @@ public OpenCGAResult geneSummary(String studyStr, Query q knockoutByGeneSummaryList.add(summaryFuture.get()); } } catch (InterruptedException | ExecutionException e) { + if (RgaException.NO_RESULTS_FOUND.equals(e.getCause().getMessage())) { + return OpenCGAResult.empty(KnockoutByGeneSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + } throw new RgaException(e.getMessage(), e); } @@ -920,7 +927,7 @@ private KnockoutByGeneSummary calculateGeneSummary(String collection, Query quer RgaIterator rgaIterator = rgaEngine.geneQuery(collection, individualQuery, options); if (!rgaIterator.hasNext()) { - throw new RgaException("Unexpected error. Gene '" + geneId + "' not found"); + throw RgaException.noResultsMatching(); } RgaDataModel rgaDataModel = rgaIterator.next(); KnockoutByGeneSummary geneSummary = new KnockoutByGeneSummary(rgaDataModel.getGeneId(), rgaDataModel.getGeneName(), @@ -989,14 +996,13 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection auxQuery.put(RgaQueryParams.SAMPLE_ID.key(), sampleId); // 1. Get KnockoutByIndividual information - Query individualQuery = new Query(RgaQueryParams.SAMPLE_ID.key(), sampleId); QueryOptions options = new QueryOptions() .append(QueryOptions.LIMIT, 1) .append(QueryOptions.EXCLUDE, "genes"); - RgaIterator rgaIterator = rgaEngine.individualQuery(collection, individualQuery, options); + RgaIterator rgaIterator = rgaEngine.individualQuery(collection, auxQuery, options); if (!rgaIterator.hasNext()) { - throw new RgaException("Unexpected error. Sample '" + sampleId + "' not found"); + throw RgaException.noResultsMatching(); } RgaDataModel rgaDataModel = rgaIterator.next(); From 6c67f660c4c4520dcfb71b7daff402ffb6a19840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 30 Apr 2021 10:59:58 +0200 Subject: [PATCH 252/412] analysis: improve parameter management for Picard wrapper analysis, #1753 --- .../qc/AlignmentHsMetricsAnalysis.java | 16 +- .../DockerWrapperAnalysisExecutor.java | 1 - .../picard/PicardWrapperAnalysis.java | 63 +++---- .../picard/PicardWrapperAnalysisExecutor.java | 166 ++---------------- .../executors/AlignmentCommandExecutor.java | 7 - .../options/AlignmentCommandOptions.java | 25 +-- .../analysis/AlignmentCommandExecutor.java | 7 - .../models/alignment/PicardWrapperParams.java | 90 +--------- 8 files changed, 59 insertions(+), 316 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java index 08e8b5afcee..7a7211a74a3 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java @@ -112,12 +112,12 @@ protected void run() throws ToolException { step(PICARD_BEDTOINTERVALLIST_STEP, () -> { executorParams.put(EXECUTOR_ID, PicardWrapperAnalysisExecutor.ID); + executorParams.put("I", catalogBedFile.getUri().getPath()); + executorParams.put("SD", catalogDictFile.getUri().getPath()); + executorParams.put("O", baitFile.getName()); getToolExecutor(PicardWrapperAnalysisExecutor.class) .setCommand("BedToIntervalList") - .setBedFile(catalogBedFile.getUri().getPath()) - .setDictFile(catalogDictFile.getUri().getPath()) - .setOutFilename(baitFile.getName()) .execute(); if (!baitFile.exists()) { @@ -128,14 +128,14 @@ protected void run() throws ToolException { step(PICARD_COLLECTHSMETRICS_STEP, () -> { executorParams.put(EXECUTOR_ID, PicardWrapperAnalysisExecutor.ID); + executorParams.put("I", catalogBamFile.getUri().getPath()); + executorParams.put("BI", baitFile.getAbsolutePath()); + executorParams.put("TI", baitFile.getAbsolutePath()); + executorParams.put("O", hsMetricsFile.getName()); + executorParams.remove("SD"); getToolExecutor(PicardWrapperAnalysisExecutor.class) .setCommand("CollectHsMetrics") - .setBamFile(catalogBamFile.getUri().getPath()) -// .setRefSeqFile(catalogRefSeqFile.getUri().getPath()) - .setBaitIntervalsFile(baitFile.getAbsolutePath()) - .setTargetIntervalsFile(baitFile.getAbsolutePath()) - .setOutFilename(hsMetricsFile.getName()) .execute(); if (!hsMetricsFile.exists()) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java index 61cb2f63ce3..b15bac6c7ed 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/executors/DockerWrapperAnalysisExecutor.java @@ -170,7 +170,6 @@ public static List> getInputFilenames(String inputFile, Set Pair pair = new ImmutablePair<>(paramName, executorParams.get(paramName).toString()); inputFilenames.add(pair); } - } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java index 3275ec3697e..727d6c2955a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysis.java @@ -27,6 +27,8 @@ import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.tools.annotations.ToolParams; +import java.util.*; + import static org.opencb.opencga.core.api.ParamConstants.PICARD_COMMANDS_SUPPORTED; import static org.opencb.opencga.core.api.ParamConstants.PICARD_COMMAND_DESCRIPTION; @@ -40,13 +42,6 @@ public class PicardWrapperAnalysis extends OpenCgaToolScopeStudy { @ToolParams protected final PicardWrapperParams analysisParams = new PicardWrapperParams(); - private String bamFilePath = null; - private String bedFilePath = null; - private String baitIntervalsFilePath = null; - private String targetIntervalsFilePath = null; - private String dictFilePath = null; - private String refSeqFilePath = null; - protected void check() throws Exception { super.check(); @@ -61,27 +56,19 @@ protected void check() throws Exception { // Get files from catalog FileManager fileManager = catalogManager.getFileManager(); - if (StringUtils.isNotEmpty(analysisParams.getBamFile())) { - bamFilePath = AnalysisUtils.getCatalogFile(analysisParams.getBamFile(), study, fileManager, token).getUri().getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getBedFile())) { - bedFilePath = AnalysisUtils.getCatalogFile(analysisParams.getBedFile(), study, fileManager, token).getUri().getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getBaitIntervalsFile())) { - baitIntervalsFilePath = AnalysisUtils.getCatalogFile(analysisParams.getBaitIntervalsFile(), study, fileManager, token).getUri() - .getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getTargetIntervalsFile())) { - targetIntervalsFilePath = AnalysisUtils.getCatalogFile(analysisParams.getTargetIntervalsFile(), study, fileManager, - token).getUri().getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getDictFile())) { - dictFilePath = AnalysisUtils.getCatalogFile(analysisParams.getDictFile(), study, fileManager, token) - .getUri().getPath(); - } - if (StringUtils.isNotEmpty(analysisParams.getRefSeqFile())) { - refSeqFilePath = AnalysisUtils.getCatalogFile(analysisParams.getRefSeqFile(), study, fileManager, token) - .getUri().getPath(); + if (MapUtils.isNotEmpty(analysisParams.getPicardParams())) { + Set fileParams = getFileParamNames(analysisParams.getCommand()); + + Map updatedMap = new HashMap<>(); + for (Map.Entry entry : analysisParams.getPicardParams().entrySet()) { + if (fileParams.contains(entry.getKey())) { + updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) + .getUri().getPath()); + } + } + if (MapUtils.isNotEmpty(updatedMap)) { + analysisParams.getPicardParams().putAll(updatedMap); + } } } @@ -96,14 +83,20 @@ protected void run() throws Exception { getToolExecutor(PicardWrapperAnalysisExecutor.class) .setCommand(analysisParams.getCommand()) - .setBamFile(bamFilePath) - .setBedFile(bedFilePath) - .setBaitIntervalsFile(baitIntervalsFilePath) - .setTargetIntervalsFile(targetIntervalsFilePath) - .setDictFile(dictFilePath) - .setRefSeqFile(refSeqFilePath) - .setOutFilename(analysisParams.getOutFilename()) .execute(); }); } + + public static Set getFileParamNames(String command) { + switch (command) { + case "BedToIntervalList": + return new HashSet<>(Arrays.asList("I", "INPUT", "SD", "SEQUENCE_DICTIONARY")); + case "CollectWgsMetrics": + return new HashSet<>(Arrays.asList("I", "INPUT", "R", "REFERENCE_SEQUENCE")); + case "CollectHsMetrics": + return new HashSet<>(Arrays.asList("I", "INPUT", "BI", "BAIT_INTERVALS", "TI", "TARGET_INTERVALS")); + default: + return new HashSet<>(); + } + } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java index 3febd427e8f..a72ae9424e9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/picard/PicardWrapperAnalysisExecutor.java @@ -1,5 +1,6 @@ package org.opencb.opencga.analysis.wrappers.picard; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; @@ -20,13 +21,6 @@ public class PicardWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor private String study; private String command; - private String bamFile; - private String bedFile; - private String baitIntervalsFile; - private String targetIntervalsFile; - private String dictFile; - private String refSeqFile; - private String outFilename; private Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -59,92 +53,22 @@ public String getKeyValueSeparator() { public void run() throws ToolException { switch (command) { case "CollectHsMetrics": - runCollectHsMetrics(); - break; case "CollectWgsMetrics": - runCollectWgsMetrics(); - break; case "BedToIntervalList": - runBedToIntervalList(); + runCommonCommand(); break; default: throw new ToolException("Picard tool name '" + command + "' is not supported yet."); } } - private void runBedToIntervalList() throws ToolException { - StringBuilder sb = initCommandLine(); - - // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", getBedFile()), - new ImmutablePair<>("SD", getDictFile()))); - - Map mountMap = appendMounts(inputFilenames, sb); - - // Append docker image, version and command - appendCommand("java -jar /usr/picard/picard.jar " + command, sb); - - // Append input file params - appendInputFiles(inputFilenames, mountMap, sb); - - // Append output file params - List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", getOutFilename()))); - appendOutputFiles(outputFilenames, sb); - - // Append other params - Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "SEQUENCE_DICTIONARY","SD")); - appendOtherParams(skipParams, sb); - - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - logger.info("Docker command line: " + sb.toString()); - runCommandLine(sb.toString()); - } - - private void runCollectWgsMetrics() throws ToolException { - StringBuilder sb = initCommandLine(); - - // Append mounts - List> inputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("I", getBamFile()), - new ImmutablePair<>("R", getRefSeqFile()))); - - Map mountMap = appendMounts(inputFilenames, sb); - - // Append docker image, version and command - appendCommand("java -jar /usr/picard/picard.jar " + command, sb); - - // Append input file params - appendInputFiles(inputFilenames, mountMap, sb); - - // Append output file params - List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", getOutFilename()))); - appendOutputFiles(outputFilenames, sb); - - // Append other params - Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "REFERENCE_SEQUENCE","R")); - appendOtherParams(skipParams, sb); - - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - logger.info("Docker command line: " + sb.toString()); - runCommandLine(sb.toString()); - } - - private void runCollectHsMetrics() throws ToolException { - // Prepare input files - List> inputFilenames = new ArrayList<>(Arrays.asList( - new ImmutablePair<>("I", getBamFile()), - new ImmutablePair<>("R", getRefSeqFile()), - new ImmutablePair<>("BI", getBaitIntervalsFile()), - new ImmutablePair<>("TI", getTargetIntervalsFile()) - )); - - // Prepare output files - List> outputFilenames = new ArrayList<>(Arrays.asList( - new ImmutablePair<>("O", getOutFilename()) - )); - + private void runCommonCommand() throws ToolException { StringBuilder sb = initCommandLine(); // Append mounts + Set inputFileParamNames = PicardWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(null, inputFileParamNames, + getExecutorParams()); Map mountMap = appendMounts(inputFilenames, sb); // Append docker image, version and command @@ -154,11 +78,20 @@ private void runCollectHsMetrics() throws ToolException { appendInputFiles(inputFilenames, mountMap, sb); // Append output file params - appendOutputFiles(outputFilenames, sb); + if (getExecutorParams().containsKey("O") || getExecutorParams().containsKey("OUTPUT")) { + String value = String.valueOf(getExecutorParams().get("O")); + if (StringUtils.isEmpty(value)) { + value = String.valueOf(getExecutorParams().get("OUTPUT")); + } + if (StringUtils.isNotEmpty(value)) { + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", value))); + appendOutputFiles(outputFilenames, sb); + } + } // Append other params - Set skipParams = new HashSet<>(Arrays.asList("I", "INPUT", "O", "OUTPUT", "BAIT_INTERVALS", "BI", "TARGET_INTERVALS", "TI", - "REFERENCE_SEQUENCE","R")); + Set skipParams = new HashSet<>(Arrays.asList("arguments_file", "O", "OUTPUT")); + skipParams.addAll(inputFileParamNames); appendOtherParams(skipParams, sb); // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt @@ -183,67 +116,4 @@ public PicardWrapperAnalysisExecutor setCommand(String command) { this.command = command; return this; } - - public String getBamFile() { - return bamFile; - } - - public PicardWrapperAnalysisExecutor setBamFile(String bamFile) { - this.bamFile = bamFile; - return this; - } - - public String getBedFile() { - return bedFile; - } - - public PicardWrapperAnalysisExecutor setBedFile(String bedFile) { - this.bedFile = bedFile; - return this; - } - - public String getBaitIntervalsFile() { - return baitIntervalsFile; - } - - public PicardWrapperAnalysisExecutor setBaitIntervalsFile(String baitIntervalsFile) { - this.baitIntervalsFile = baitIntervalsFile; - return this; - } - - public String getTargetIntervalsFile() { - return targetIntervalsFile; - } - - public PicardWrapperAnalysisExecutor setTargetIntervalsFile(String targetIntervalsFile) { - this.targetIntervalsFile = targetIntervalsFile; - return this; - } - - public String getDictFile() { - return dictFile; - } - - public PicardWrapperAnalysisExecutor setDictFile(String dictFile) { - this.dictFile = dictFile; - return this; - } - - public String getRefSeqFile() { - return refSeqFile; - } - - public PicardWrapperAnalysisExecutor setRefSeqFile(String refSeqFile) { - this.refSeqFile = refSeqFile; - return this; - } - - public String getOutFilename() { - return outFilename; - } - - public PicardWrapperAnalysisExecutor setOutFilename(String outFilename) { - this.outFilename = outFilename; - return this; - } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index 04cd3ee75c3..a25a05e8261 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -333,13 +333,6 @@ private void picard() throws Exception { ObjectMap params = new PicardWrapperParams( cliOptions.command, - cliOptions.bamFile, - cliOptions.bedFile, - cliOptions.baitIntervalsFile, - cliOptions.targetIntervalsFile, - cliOptions.dictFile, - cliOptions.refSeqFile, - cliOptions.outFilename, cliOptions.outdir, cliOptions.picardParams) .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index 8864ff207b6..dd9aecfa967 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -605,34 +605,13 @@ public class PicardCommandOptions { @Parameter(names = {"-s", "--study"}, description = STUDY_DESCRIPTION, arity = 1) public String study; - @Parameter(names = {"--command"}, description = PICARD_COMMAND_DESCRIPTION, required = true) + @Parameter(names = {"--command"}, description = PICARD_COMMAND_DESCRIPTION) public String command; - @Parameter(names = {"--bam-file"}, description = FILE_ID_DESCRIPTION + " (BAM file)") - public String bamFile; - - @Parameter(names = {"--bed-file"}, description = FILE_ID_DESCRIPTION + " (BEB file)") - public String bedFile; - - @Parameter(names = {"--bait-intervals-file"}, description = FILE_ID_DESCRIPTION + " (BAIT file for intervals)") - public String baitIntervalsFile; - - @Parameter(names = {"--target-intervals-file"}, description = FILE_ID_DESCRIPTION + " (BAIT file for target intervals)") - public String targetIntervalsFile; - - @Parameter(names = {"--dict-file"}, description = FILE_ID_DESCRIPTION + " (dictionary file)") - public String dictFile; - - @Parameter(names = {"--ref-seq-file"}, description = FILE_ID_DESCRIPTION + " (reference sequence file)") - public String refSeqFile; - - @Parameter(names = {"--out-filename"}, description = "Output filename") - public String outFilename; - @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) public String outdir; - @DynamicParameter(names = {"--pircard-params"}, description = "Picard parameters.") + @DynamicParameter(names = {"--picard-params"}, description = "Picard parameters.") public Map picardParams = new HashMap<>(); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index 435ba162d4a..d1edac0a8f8 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -471,13 +471,6 @@ private RestResponse fastqc() throws ClientException { private RestResponse picard() throws ClientException { PicardWrapperParams picardWrapperParams = new PicardWrapperParams( alignmentCommandOptions.picardCommandOptions.command, - alignmentCommandOptions.picardCommandOptions.bamFile, - alignmentCommandOptions.picardCommandOptions.bedFile, - alignmentCommandOptions.picardCommandOptions.baitIntervalsFile, - alignmentCommandOptions.picardCommandOptions.targetIntervalsFile, - alignmentCommandOptions.picardCommandOptions.dictFile, - alignmentCommandOptions.picardCommandOptions.refSeqFile, - alignmentCommandOptions.picardCommandOptions.outFilename, alignmentCommandOptions.picardCommandOptions.outdir, alignmentCommandOptions.picardCommandOptions.picardParams ); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/PicardWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/PicardWrapperParams.java index 67c1537c798..a5c45552b75 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/PicardWrapperParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/PicardWrapperParams.java @@ -1,36 +1,22 @@ package org.opencb.opencga.core.models.alignment; +import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.tools.ToolParams; import java.util.Map; public class PicardWrapperParams extends ToolParams { - public static final String DESCRIPTION = "Picard parameters."; + public static final String DESCRIPTION = "Picard parameters. " + ParamConstants.PICARD_COMMAND_DESCRIPTION; private String command; - private String bamFile; - private String bedFile; - private String baitIntervalsFile; - private String targetIntervalsFile; - private String dictFile; - private String refSeqFile; - private String outFilename; private String outdir; private Map picardParams; public PicardWrapperParams() { } - public PicardWrapperParams(String command, String bamFile, String bedFile, String baitIntervalsFile, String targetIntervalsFile, - String dictFile, String refSeqFile, String outFilename, String outdir, Map picardParams) { + public PicardWrapperParams(String command, String outdir, Map picardParams) { this.command = command; - this.bamFile = bamFile; - this.bedFile = bedFile; - this.baitIntervalsFile = baitIntervalsFile; - this.targetIntervalsFile = targetIntervalsFile; - this.dictFile = dictFile; - this.refSeqFile = refSeqFile; - this.outFilename = outFilename; this.outdir = outdir; this.picardParams = picardParams; } @@ -39,13 +25,6 @@ public PicardWrapperParams(String command, String bamFile, String bedFile, Strin public String toString() { final StringBuilder sb = new StringBuilder("PicardWrapperParams{"); sb.append("command='").append(command).append('\''); - sb.append(", bamFile='").append(bamFile).append('\''); - sb.append(", bedFile='").append(bedFile).append('\''); - sb.append(", baitIntervalsFile='").append(baitIntervalsFile).append('\''); - sb.append(", targetIntervalsFile='").append(targetIntervalsFile).append('\''); - sb.append(", dictFile='").append(dictFile).append('\''); - sb.append(", refSeqFile='").append(refSeqFile).append('\''); - sb.append(", outFilename='").append(outFilename).append('\''); sb.append(", outdir='").append(outdir).append('\''); sb.append(", picardParams=").append(picardParams); sb.append('}'); @@ -61,69 +40,6 @@ public PicardWrapperParams setCommand(String command) { return this; } - public String getBamFile() { - return bamFile; - } - - public PicardWrapperParams setBamFile(String bamFile) { - this.bamFile = bamFile; - return this; - } - - public String getBedFile() { - return bedFile; - } - - public PicardWrapperParams setBedFile(String bedFile) { - this.bedFile = bedFile; - return this; - } - - public String getBaitIntervalsFile() { - return baitIntervalsFile; - } - - public PicardWrapperParams setBaitIntervalsFile(String baitIntervalsFile) { - this.baitIntervalsFile = baitIntervalsFile; - return this; - } - - public String getTargetIntervalsFile() { - return targetIntervalsFile; - } - - public PicardWrapperParams setTargetIntervalsFile(String targetIntervalsFile) { - this.targetIntervalsFile = targetIntervalsFile; - return this; - } - - public String getDictFile() { - return dictFile; - } - - public PicardWrapperParams setDictFile(String dictFile) { - this.dictFile = dictFile; - return this; - } - - public String getRefSeqFile() { - return refSeqFile; - } - - public PicardWrapperParams setRefSeqFile(String refSeqFile) { - this.refSeqFile = refSeqFile; - return this; - } - - public String getOutFilename() { - return outFilename; - } - - public PicardWrapperParams setOutFilename(String outFilename) { - this.outFilename = outFilename; - return this; - } - public String getOutdir() { return outdir; } From bcc975daf186f36941d806a0b23101d1773f2361 Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 30 Apr 2021 11:40:58 +0000 Subject: [PATCH 253/412] GitBook: [develop] one page modified --- .../administrator/templates-manifest.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index e56cc2012df..65f2888d9a1 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -1,2 +1,23 @@ # Templates / Manifest +Since OpenCGA v2.X.X, the OpenCGA users with administration roles are offered the possibility to work with templates. Templates are a set of files with a defined specification that allow the user to perform a series of different operations, related to the ingestion of metadata in OpenCGA, e.g: define the samples, individuals, permission groups etc. For more information on how OpenCGA stores metadata in Catalog refer to \[ADD\_SECTION\] + +The templates are defined at a study level and could be provided in different formats accordingly to the user needs. The files format and some common user cases are illustrated in the following section. + +Remember that OpenCGA is highly configurable, and the use of templates constitutes a useful resource to reduce some common artefacts on the ingestion of metadata, but you can always use the clients \[TO\_ADD\] or WebServices to perform different operations in OpenCGA. + +## Procedure + +The templates define a way to easily ingest metadata into OpenCGA: + +* There is only one required file that you'd need to provide to use the templates-related operations. This is a config `json` OR `yml` file named after the `studyId` where the template is to be applied. This file will define the root \(i.e: the study where you will perform the operation\) + +```text +---------- OP 3 ----------------------- fileName == ruta (a partir de study) +RD37.yml +RD37/ + groups.txt + individuals.txt + individuals.phenotypes.txt +``` + From 5c05bbf9ab54742b2c013723c7aa01db7b045793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 30 Apr 2021 14:24:09 +0200 Subject: [PATCH 254/412] models: rename to AlignmentQualityControl and CoverageQualitycControl --- .../qc/AlignmentFastQcMetricsAnalysis.java | 2 +- .../qc/AlignmentFlagStatsAnalysis.java | 2 +- .../AlignmentGeneCoverageStatsAnalysis.java | 2 +- .../qc/AlignmentHsMetricsAnalysis.java | 2 +- .../alignment/qc/AlignmentStatsAnalysis.java | 2 +- ...ment.java => AlignmentQualityControl.java} | 17 ++++----- ...erage.java => CoverageQualityControl.java} | 12 +++---- .../core/models/file/FileQualityControl.java | 36 +++++++++---------- 8 files changed, 34 insertions(+), 41 deletions(-) rename opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/{Alignment.java => AlignmentQualityControl.java} (75%) rename opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/{Coverage.java => CoverageQualityControl.java} (61%) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java index d5b04515b35..9ad97f84950 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java @@ -127,7 +127,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignment().setFastQcMetrics(fastQcMetrics); + qc.getAlignmentQualityControl().setFastQcMetrics(fastQcMetrics); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java index 07c3accda35..db7dfc518f4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java @@ -123,7 +123,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignment().setSamtoolsFlagStats(flagStats); + qc.getAlignmentQualityControl().setSamtoolsFlagStats(flagStats); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java index 68f594c08c8..c6f06f8943b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java @@ -115,7 +115,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getCoverage().setGeneCoverageStats(geneCoverageStats); + qc.getCoverageQualityControl().setGeneCoverageStats(geneCoverageStats); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java index 7a7211a74a3..ed925ca6b1b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java @@ -154,7 +154,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignment().setHsMetrics(hsMetrics); + qc.getAlignmentQualityControl().setHsMetrics(hsMetrics); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java index 26bc67cd75a..32ab34bfd06 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java @@ -153,7 +153,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignment().setSamtoolsStats(alignmentStats); + qc.getAlignmentQualityControl().setSamtoolsStats(alignmentStats); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Alignment.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java similarity index 75% rename from opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Alignment.java rename to opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java index 9b9638442a6..481ddee8691 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Alignment.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java @@ -4,23 +4,20 @@ import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; -import org.opencb.biodata.models.alignment.GeneCoverageStats; import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -public class Alignment implements Serializable { +public class AlignmentQualityControl implements Serializable { private FastQcMetrics fastQcMetrics; private SamtoolsStats samtoolsStats; private SamtoolsFlagstats samtoolsFlagStats; private HsMetrics hsMetrics; - public Alignment() { + public AlignmentQualityControl() { this(new FastQcMetrics(), new SamtoolsStats(), new SamtoolsFlagstats(), new HsMetrics()); } - public Alignment(FastQcMetrics fastQcMetrics, SamtoolsStats samtoolsStats, SamtoolsFlagstats samtoolsFlagStats, HsMetrics hsMetrics) { + public AlignmentQualityControl(FastQcMetrics fastQcMetrics, SamtoolsStats samtoolsStats, SamtoolsFlagstats samtoolsFlagStats, HsMetrics hsMetrics) { this.fastQcMetrics = fastQcMetrics; this.samtoolsStats = samtoolsStats; this.samtoolsFlagStats = samtoolsFlagStats; @@ -42,7 +39,7 @@ public FastQcMetrics getFastQcMetrics() { return fastQcMetrics; } - public Alignment setFastQcMetrics(FastQcMetrics fastQcMetrics) { + public AlignmentQualityControl setFastQcMetrics(FastQcMetrics fastQcMetrics) { this.fastQcMetrics = fastQcMetrics; return this; } @@ -51,7 +48,7 @@ public SamtoolsStats getSamtoolsStats() { return samtoolsStats; } - public Alignment setSamtoolsStats(SamtoolsStats samtoolsStats) { + public AlignmentQualityControl setSamtoolsStats(SamtoolsStats samtoolsStats) { this.samtoolsStats = samtoolsStats; return this; } @@ -60,7 +57,7 @@ public SamtoolsFlagstats getSamtoolsFlagStats() { return samtoolsFlagStats; } - public Alignment setSamtoolsFlagStats(SamtoolsFlagstats samtoolsFlagStats) { + public AlignmentQualityControl setSamtoolsFlagStats(SamtoolsFlagstats samtoolsFlagStats) { this.samtoolsFlagStats = samtoolsFlagStats; return this; } @@ -69,7 +66,7 @@ public HsMetrics getHsMetrics() { return hsMetrics; } - public Alignment setHsMetrics(HsMetrics hsMetrics) { + public AlignmentQualityControl setHsMetrics(HsMetrics hsMetrics) { this.hsMetrics = hsMetrics; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Coverage.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/CoverageQualityControl.java similarity index 61% rename from opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Coverage.java rename to opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/CoverageQualityControl.java index a1662ffaa1f..40e6f436285 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/Coverage.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/CoverageQualityControl.java @@ -1,23 +1,19 @@ package org.opencb.opencga.core.models.alignment; -import org.opencb.biodata.formats.alignment.picard.HsMetrics; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsFlagstats; -import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; -import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; import org.opencb.biodata.models.alignment.GeneCoverageStats; import java.io.Serializable; import java.util.ArrayList; import java.util.List; -public class Coverage implements Serializable { +public class CoverageQualityControl implements Serializable { private List geneCoverageStats; - public Coverage() { + public CoverageQualityControl() { this(new ArrayList<>()); } - public Coverage(List geneCoverageStats) { + public CoverageQualityControl(List geneCoverageStats) { this.geneCoverageStats = geneCoverageStats; } @@ -33,7 +29,7 @@ public List getGeneCoverageStats() { return geneCoverageStats; } - public Coverage setGeneCoverageStats(List geneCoverageStats) { + public CoverageQualityControl setGeneCoverageStats(List geneCoverageStats) { this.geneCoverageStats = geneCoverageStats; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java index 7c5ba2dc0f1..ca67dc0d29f 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java @@ -1,45 +1,45 @@ package org.opencb.opencga.core.models.file; -import org.opencb.opencga.core.models.alignment.Alignment; -import org.opencb.opencga.core.models.alignment.Coverage; +import org.opencb.opencga.core.models.alignment.AlignmentQualityControl; +import org.opencb.opencga.core.models.alignment.CoverageQualityControl; public class FileQualityControl { - private Alignment alignment; - private Coverage coverage; + private AlignmentQualityControl alignmentQualityControl; + private CoverageQualityControl coverageQualityControl; public FileQualityControl() { - this(new Alignment(), new Coverage()); + this(new AlignmentQualityControl(), new CoverageQualityControl()); } - public FileQualityControl(Alignment alignment, Coverage coverage) { - this.alignment = alignment; - this.coverage = coverage; + public FileQualityControl(AlignmentQualityControl alignmentQualityControl, CoverageQualityControl coverageQualityControl) { + this.alignmentQualityControl = alignmentQualityControl; + this.coverageQualityControl = coverageQualityControl; } @Override public String toString() { final StringBuilder sb = new StringBuilder("FileQualityControl{"); - sb.append("alignment=").append(alignment); - sb.append(", coverage=").append(coverage); + sb.append("alignmentQualityControl=").append(alignmentQualityControl); + sb.append(", coverageQualityControl=").append(coverageQualityControl); sb.append('}'); return sb.toString(); } - public Alignment getAlignment() { - return alignment; + public AlignmentQualityControl getAlignmentQualityControl() { + return alignmentQualityControl; } - public FileQualityControl setAlignment(Alignment alignment) { - this.alignment = alignment; + public FileQualityControl setAlignmentQualityControl(AlignmentQualityControl alignmentQualityControl) { + this.alignmentQualityControl = alignmentQualityControl; return this; } - public Coverage getCoverage() { - return coverage; + public CoverageQualityControl getCoverageQualityControl() { + return coverageQualityControl; } - public FileQualityControl setCoverage(Coverage coverage) { - this.coverage = coverage; + public FileQualityControl setCoverageQualityControl(CoverageQualityControl coverageQualityControl) { + this.coverageQualityControl = coverageQualityControl; return this; } } From 667d55b1f08f6eb714a1ae3a7149b8b7f71e785a Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Fri, 30 Apr 2021 13:02:04 +0000 Subject: [PATCH 255/412] GitBook: [develop] 2 pages modified --- .../administrator/templates-manifest.md | 65 +++++++++++++++---- docs/manual/data-models/sample.md | 16 +++-- 2 files changed, 64 insertions(+), 17 deletions(-) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index 65f2888d9a1..df9e6391985 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -1,23 +1,64 @@ # Templates / Manifest -Since OpenCGA v2.X.X, the OpenCGA users with administration roles are offered the possibility to work with templates. Templates are a set of files with a defined specification that allow the user to perform a series of different operations, related to the ingestion of metadata in OpenCGA, e.g: define the samples, individuals, permission groups etc. For more information on how OpenCGA stores metadata in Catalog refer to \[ADD\_SECTION\] +Since OpenCGA v2.1.x, the OpenCGA users with administration roles are offered the possibility to work with templates. Templates are a set of files with a defined specification that allow the user to perform a series of different operations, related to the ingestion of metadata in OpenCGA, e.g: define the samples, individuals, permission groups, etc. For more information on how OpenCGA stores metadata in Catalog refer to \[ADD\_SECTION\] -The templates are defined at a study level and could be provided in different formats accordingly to the user needs. The files format and some common user cases are illustrated in the following section. +Templates are defined at a study level and could be provided in different formats accordingly to the user's needs. The file format and some common use cases are illustrated in the following section. -Remember that OpenCGA is highly configurable, and the use of templates constitutes a useful resource to reduce some common artefacts on the ingestion of metadata, but you can always use the clients \[TO\_ADD\] or WebServices to perform different operations in OpenCGA. +Remember that OpenCGA is highly configurable, and the use of templates constitutes a useful resource to reduce some common artifacts on the ingestion of metadata, but you can always use the clients \[TO\_ADD\] or WebServices to perform different operations in OpenCGA. -## Procedure +## How it Works -The templates define a way to easily ingest metadata into OpenCGA: +The templates define a way to easily ingest metadata into OpenCGA. You need different things: -* There is only one required file that you'd need to provide to use the templates-related operations. This is a config `json` OR `yml` file named after the `studyId` where the template is to be applied. This file will define the root \(i.e: the study where you will perform the operation\) +* **manfiest**: There is only one required file that you'd need to provide to use the template-related operations. This is a config `json` OR `yml` file named after the `studyId` where the template is to be applied. This file will define the root \(i.e: the study where you will perform the operation\) +* **metadata and clinical data**: +* ```text + ---------- OP 3 ----------------------- fileName == ruta (a partir de study) + manifest.yml + RD37/ + individuals.txt + individuals.phenotypes.txt + ``` + + + +### JSON/YAML Files + +You have to provide a single JSON or YAML file per entity. In the case of using JSON you should write one JSON per line, if YAML is used then you can just concat them separating by '---'. + +The following entities are supported: + +* individuals.{json \| yaml} +* samples +* files +* families +* cohorts +* clinical\_analysis + + + +### TAB Files + +You can load data for individuals, samples, ... using TAB files. + +The columns are configurable... + +Rules: + +* First line starting with \# symbol containing the exact name of the corresponding data model +* the order of the columns are not relevant ```text ----------- OP 3 ----------------------- fileName == ruta (a partir de study) -RD37.yml -RD37/ - groups.txt - individuals.txt - individuals.phenotypes.txt +individuals.txt: +#id name sex status.name (phenotypes.id) +NA001 pepe yes READY +NA002 ... + + +individuals.phenotypes.txt +#individualId id name description +NA001 HP:1234 klsalksa sdasdasda +NA002 HP:1234 klsalksa sdasdasda +study.groups.txt ``` diff --git a/docs/manual/data-models/sample.md b/docs/manual/data-models/sample.md index 7c1fa64e1e2..3d4ff39e738 100644 --- a/docs/manual/data-models/sample.md +++ b/docs/manual/data-models/sample.md @@ -4,7 +4,13 @@ Sample data model ... -## Data Models +### Update and Create + +... + +... + +## Data Model ### Sample @@ -26,10 +32,10 @@ This is the main data model, it stores the most basic and important information.

WK{q2&n|mew6o4eQ{ja_a%fZ+x>Yg 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

From 906e148c218018c5270ec776f5c36b825545bd5e Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 30 Apr 2021 13:30:42 +0000 Subject: [PATCH 256/412] GitBook: [develop] 3 pages modified --- docs/SUMMARY.md | 1 + .../administrator/templates-manifest.md | 23 ++++++++----------- docs/manual/data-models/cohort.md | 2 ++ 3 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 docs/manual/data-models/cohort.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 67deaeab281..1f5a2d2b127 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -68,6 +68,7 @@ * [Data Models](manual/data-models/README.md) * [Sample](manual/data-models/sample.md) * [Individual](manual/data-models/individual.md) + * [Cohort](manual/data-models/cohort.md) * [Using JupyterLab](manual/using-jupyterlab.md) * [Administrator](manual/administrator/README.md) * [User Management](manual/administrator/user-management.md) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index df9e6391985..d4dc7ef5593 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -1,34 +1,31 @@ # Templates / Manifest -Since OpenCGA v2.1.x, the OpenCGA users with administration roles are offered the possibility to work with templates. Templates are a set of files with a defined specification that allow the user to perform a series of different operations, related to the ingestion of metadata in OpenCGA, e.g: define the samples, individuals, permission groups, etc. For more information on how OpenCGA stores metadata in Catalog refer to \[ADD\_SECTION\] +Since OpenCGA v2.1.x, the OpenCGA users with administration roles are offered the possibility to work with templates. Templates are a set of files with a defined specification that allow the user to perform a series of different operations, related to the ingestion of metadata in OpenCGA, e.g: define the samples, individuals, permission groups, etc. For more information on how OpenCGA stores metadata in Catalog refer to [Catalog](../../components-1/catalog/) Templates are defined at a study level and could be provided in different formats accordingly to the user's needs. The file format and some common use cases are illustrated in the following section. -Remember that OpenCGA is highly configurable, and the use of templates constitutes a useful resource to reduce some common artifacts on the ingestion of metadata, but you can always use the clients \[TO\_ADD\] or WebServices to perform different operations in OpenCGA. +Remember that OpenCGA is highly configurable, and the use of templates constitutes a useful resource to reduce some common artifacts on the ingestion of metadata, but you can always use the OpenCGA clients \([Client Libraries](../../using-opencga/client-libraries/)\), command line \([Command Line](../../using-opencga/command-line.md)\) or [REST Web Service API](../../using-opencga/restful-web-service-api.md) to perform different operations in OpenCGA. ## How it Works The templates define a way to easily ingest metadata into OpenCGA. You need different things: -* **manfiest**: There is only one required file that you'd need to provide to use the template-related operations. This is a config `json` OR `yml` file named after the `studyId` where the template is to be applied. This file will define the root \(i.e: the study where you will perform the operation\) -* **metadata and clinical data**: -* ```text - ---------- OP 3 ----------------------- fileName == ruta (a partir de study) - manifest.yml - RD37/ - individuals.txt - individuals.phenotypes.txt - ``` +* **manfiest**: There is only one required file that you'd need to provide to use the template-related operations. This is a `json` OR `yml` file named `manifest.{json|yaml}` containing the specific configuration applied to the template. This file will define the root \(i.e: the study where you will perform the operation\). An example is provided below +```text +manifest.yaml + +``` +* **metadata and clinical data**: You might need to provide a file per entity, where entities corresponds to one of the different comprehensive data models supported by OpenCGA Catalog \(**individuals, samples, files, families, cohorts, clinical\_analysis**\). Each file will contain the entity-related information that you want to ingest into Catalog. For usability purposes two main specifications will be accepted. You can find the file structures accepted below: ### JSON/YAML Files -You have to provide a single JSON or YAML file per entity. In the case of using JSON you should write one JSON per line, if YAML is used then you can just concat them separating by '---'. +You might want to provide a single JSON or YAML file per entity. In the case of using JSON you should write one JSON per line, if YAML is used then you can just concat them separating by '---'. The following entities are supported: -* individuals.{json \| yaml} +* For ndividuals.{json \| yaml} * samples * files * families diff --git a/docs/manual/data-models/cohort.md b/docs/manual/data-models/cohort.md new file mode 100644 index 00000000000..5de3deef85c --- /dev/null +++ b/docs/manual/data-models/cohort.md @@ -0,0 +1,2 @@ +# Cohort + From ab648dbd26c2efc166ff4876a930b34947a66c80 Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 30 Apr 2021 13:42:22 +0000 Subject: [PATCH 257/412] GitBook: [develop] one page modified --- docs/manual/administrator/templates-manifest.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index d4dc7ef5593..97a5e11a6eb 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -25,9 +25,9 @@ You might want to provide a single JSON or YAML file per entity. In the case of The following entities are supported: -* For ndividuals.{json \| yaml} -* samples -* files +* For [Individual](../data-models/individual.md): `individuals.{json|yaml}` +* For [Sample](../data-models/sample.md): `samples.{json|yaml}` +* For `individuals.{json|yaml}` * families * cohorts * clinical\_analysis From f13df804077e9de069fc7cf3d6f93d4609c04188 Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 30 Apr 2021 13:42:52 +0000 Subject: [PATCH 258/412] GitBook: [develop] 6 pages modified --- docs/SUMMARY.md | 3 +++ docs/manual/data-models/clinical-analysis.md | 2 ++ docs/manual/data-models/cohort.md | 6 ++++++ docs/manual/data-models/family.md | 2 ++ docs/manual/data-models/file.md | 2 ++ docs/manual/data-models/sample.md | 18 +++++++++++++----- 6 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 docs/manual/data-models/clinical-analysis.md create mode 100644 docs/manual/data-models/family.md create mode 100644 docs/manual/data-models/file.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 1f5a2d2b127..fd63e845b7c 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -68,7 +68,10 @@ * [Data Models](manual/data-models/README.md) * [Sample](manual/data-models/sample.md) * [Individual](manual/data-models/individual.md) + * [File](manual/data-models/file.md) + * [Family](manual/data-models/family.md) * [Cohort](manual/data-models/cohort.md) + * [Clinical Analysis](manual/data-models/clinical-analysis.md) * [Using JupyterLab](manual/using-jupyterlab.md) * [Administrator](manual/administrator/README.md) * [User Management](manual/administrator/user-management.md) diff --git a/docs/manual/data-models/clinical-analysis.md b/docs/manual/data-models/clinical-analysis.md new file mode 100644 index 00000000000..8732d316edd --- /dev/null +++ b/docs/manual/data-models/clinical-analysis.md @@ -0,0 +1,2 @@ +# Clinical Analysis + diff --git a/docs/manual/data-models/cohort.md b/docs/manual/data-models/cohort.md index 5de3deef85c..0d9abaea90c 100644 --- a/docs/manual/data-models/cohort.md +++ b/docs/manual/data-models/cohort.md @@ -1,2 +1,8 @@ # Cohort +## Overview + +The Co_hort data model_ contains groups of samples sharing some particular conditions such as "healthy" vs "infected". Any of these two data models can also have _Annotation Sets_ defined. + + + diff --git a/docs/manual/data-models/family.md b/docs/manual/data-models/family.md new file mode 100644 index 00000000000..1be09becc4a --- /dev/null +++ b/docs/manual/data-models/family.md @@ -0,0 +1,2 @@ +# Family + diff --git a/docs/manual/data-models/file.md b/docs/manual/data-models/file.md new file mode 100644 index 00000000000..51cd1753e23 --- /dev/null +++ b/docs/manual/data-models/file.md @@ -0,0 +1,2 @@ +# File + diff --git a/docs/manual/data-models/sample.md b/docs/manual/data-models/sample.md index 3d4ff39e738..6ca41f88fde 100644 --- a/docs/manual/data-models/sample.md +++ b/docs/manual/data-models/sample.md @@ -2,13 +2,19 @@ ## Overview -Sample data model ... +Sample data model hosts information about any biological material, normally extracted from an _Individual_, that is used for a particular analysis. + +## Entity Field Attributes + +There are some attributes that a user can manipulate, while others are reserved for internal OpenCGA use ### Update and Create -... +**Create Fields** + +**Update Fields** -... +### Internal attributes ## Data Model @@ -19,8 +25,10 @@ This is the main data model, it stores the most basic and important information.
-

Unique Sample ID in the study, this can be repeated across different studies. - This is a mandatory parameter in the creation and cannot be changed at - the moment.

-

Constraints: Mandatory, Unique, Immutable +

Unique Sample ID in the study, this can be repeated across different + studies. This is a mandatory parameter in the creation and cannot be changed + at the moment.

+

Constraints: Required, Create

- - + + From 11cb9611b0097de54bf1f3c9927122ffccf4d649 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 30 Apr 2021 16:01:43 +0200 Subject: [PATCH 259/412] analysis: fix gene issue, #1693 --- .../opencga/analysis/rga/RgaManager.java | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 3260e483f88..6059d7b3352 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -8,8 +8,8 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.ConsequenceType; +import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import org.opencb.biodata.models.variant.avro.VariantAnnotation; -import org.opencb.biodata.models.variant.avro.Xref; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.analysis.rga.exceptions.RgaException; @@ -31,6 +31,7 @@ import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.study.Study; +import org.opencb.opencga.core.models.study.StudyAclEntry; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; @@ -590,11 +591,15 @@ public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List individualSummary(String studyStr, Query query, QueryOptions options, String token) throws RgaException, CatalogException, IOException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } + catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, + StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); + StopWatch stopWatch = StopWatch.createStarted(); ExecutorService executor = Executors.newFixedThreadPool(4); @@ -656,7 +661,8 @@ public OpenCGAResult geneSummary(String studyStr, Query q throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } - catalogManager.getAuthorizationManager().checkCanViewStudy(study.getUid(), userId); + catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, + StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); StopWatch stopWatch = new StopWatch(); stopWatch.start(); @@ -741,7 +747,8 @@ public OpenCGAResult variantSummary(String studyStr, Q throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } - catalogManager.getAuthorizationManager().checkCanViewStudy(study.getUid(), userId); + catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, + StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); StopWatch stopWatch = new StopWatch(); stopWatch.start(); @@ -812,7 +819,20 @@ public OpenCGAResult variantSummary(String studyStr, Q Variant variant = variantDBIterator.next(); VariantAnnotation variantAnnotation = variant.getAnnotation(); - ConsequenceType consequenceType = variantAnnotation.getConsequenceTypes().get(0); + Set sequenceOntologyId = new HashSet<>(); + List sequenceOntologyTermList = new LinkedList<>(); + Set geneNames = new HashSet<>(); + for (ConsequenceType consequenceType : variantAnnotation.getConsequenceTypes()) { + for (SequenceOntologyTerm sequenceOntologyTerm : consequenceType.getSequenceOntologyTerms()) { + if (!sequenceOntologyId.contains(sequenceOntologyTerm.getName())) { + sequenceOntologyId.add(sequenceOntologyTerm.getName()); + sequenceOntologyTermList.add(sequenceOntologyTerm); + } + } + if (consequenceType.getGeneName() != null) { + geneNames.add(consequenceType.getGeneName()); + } + } KnockoutByVariantSummary knockoutByVariantSummary = variantSummaryMap.get(variant.getId()); knockoutByVariantSummary.setDbSnp(variantAnnotation.getId()); @@ -824,15 +844,8 @@ public OpenCGAResult variantSummary(String studyStr, Q knockoutByVariantSummary.setAlternate(variant.getAlternate()); knockoutByVariantSummary.setType(variant.getType()); knockoutByVariantSummary.setPopulationFrequencies(variantAnnotation.getPopulationFrequencies()); - knockoutByVariantSummary.setSequenceOntologyTerms(consequenceType.getSequenceOntologyTerms()); - knockoutByVariantSummary.setGenes(variantAnnotation.getXrefs() != null - ? variantAnnotation.getXrefs() - .stream() - .filter(xref -> "HGNC".equals(xref.getSource())) - .map(Xref::getId) - .collect(Collectors.toList()) - : Collections.emptyList() - ); + knockoutByVariantSummary.setSequenceOntologyTerms(sequenceOntologyTermList); + knockoutByVariantSummary.setGenes(new ArrayList<>(geneNames)); } List knockoutByVariantSummaryList = new ArrayList<>(variantSummaryMap.values()); From df0f391aebec22bcdc50ec4ce82962750e10eca3 Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 30 Apr 2021 14:05:20 +0000 Subject: [PATCH 260/412] GitBook: [develop] 75 pages modified --- .../administrator/templates-manifest.md | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index 97a5e11a6eb..7d06e353b21 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -19,43 +19,42 @@ manifest.yaml * **metadata and clinical data**: You might need to provide a file per entity, where entities corresponds to one of the different comprehensive data models supported by OpenCGA Catalog \(**individuals, samples, files, families, cohorts, clinical\_analysis**\). Each file will contain the entity-related information that you want to ingest into Catalog. For usability purposes two main specifications will be accepted. You can find the file structures accepted below: +{% hint style="warning" %} +NOTE: All the fields within each entity that are subjected to be manipulable by the users are clearly stated in the documentation of the entity data model. Please refer to [Data Models](../data-models/). +{% endhint %} + ### JSON/YAML Files You might want to provide a single JSON or YAML file per entity. In the case of using JSON you should write one JSON per line, if YAML is used then you can just concat them separating by '---'. -The following entities are supported: +The following entities are supported. * For [Individual](../data-models/individual.md): `individuals.{json|yaml}` * For [Sample](../data-models/sample.md): `samples.{json|yaml}` -* For `individuals.{json|yaml}` -* families -* cohorts -* clinical\_analysis - - +* For [File](../data-models/file.md): `files.{json|yaml}` +* For [Family](../data-models/family.md): `families.{json|yaml}` +* For [Cohort](../data-models/cohort.md): `cohorts.{json|yaml}` +* For [Clinical Analysis](../../components-1/clinical.md): `clinical_anaysis.{json|yaml}` ### TAB Files -You can load data for individuals, samples, ... using TAB files. - -The columns are configurable... - -Rules: +You can load data for the entities using **TAB separated txt files**. There are some simple construction rules that the user needs to follow for the ingestion to be successful: * First line starting with \# symbol containing the exact name of the corresponding data model -* the order of the columns are not relevant +* The column name must correspond to the field reserved in the entity data model. Refer to each entity data model documentation for checking the accepted fields. +* The order of the columns is not relevant. ```text individuals.txt: -#id name sex status.name (phenotypes.id) -NA001 pepe yes READY -NA002 ... +#id name sex status.name +NA001 uk1 yes READY +NA002 uk2 no READY individuals.phenotypes.txt -#individualId id name description -NA001 HP:1234 klsalksa sdasdasda -NA002 HP:1234 klsalksa sdasdasda -study.groups.txt +#Individualid id name source +NA001 HP:0002664 Neoplasm HPO +NA001 HP:0002664 Lung Adenocarcinoma HPO + ``` From 4997cb39761fce8368c3f4f7a58fb54e0f5a623b Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 30 Apr 2021 14:12:56 +0000 Subject: [PATCH 261/412] GitBook: [develop] one page modified --- docs/manual/data-models/sample.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/manual/data-models/sample.md b/docs/manual/data-models/sample.md index 6ca41f88fde..c83db507fdc 100644 --- a/docs/manual/data-models/sample.md +++ b/docs/manual/data-models/sample.md @@ -8,19 +8,21 @@ Sample data model hosts information about any biological material, normally extr There are some attributes that a user can manipulate, while others are reserved for internal OpenCGA use -### Update and Create +### Sample Fields subjected to Update and Create Operations -**Create Fields** +**Create Fields: `id`** -**Update Fields** +**Update Fields: `individualId, fileIds, processing, collection, somatic, annotationSets, qualityControl, description, phenotypes, status, attributes`** -### Internal attributes +### Fields for OpenCGA Internal use \(immutable\) + +**`uuid, release, version, creationDate, modificationDate, internal`** ## Data Model ### Sample -This is the main data model, it stores the most basic and important information. You can find the Java [here](https://github.com/opencb/opencga/blob/master/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/Sample.java). +This is the main data model, it stores the most basic and important information. You can find the Java code [here](https://github.com/opencb/opencga/blob/master/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/Sample.java).
FieldDescriptionField + Description +
From a060a616eef2bdf4d9b1cf098a9872a88af362bc Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 30 Apr 2021 14:13:24 +0000 Subject: [PATCH 262/412] GitBook: [develop] one page modified --- docs/manual/administrator/templates-manifest.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index 7d06e353b21..0949cacc43d 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -10,14 +10,13 @@ Remember that OpenCGA is highly configurable, and the use of templates constitut The templates define a way to easily ingest metadata into OpenCGA. You need different things: -* **manfiest**: There is only one required file that you'd need to provide to use the template-related operations. This is a `json` OR `yml` file named `manifest.{json|yaml}` containing the specific configuration applied to the template. This file will define the root \(i.e: the study where you will perform the operation\). An example is provided below +* **Manfiest**: There is only one required file that you'd need to provide to use the template-related operations. This is a `json` OR `yml` file named `manifest.{json|yaml}` containing the specific configuration applied to the template. This file will define the root \(i.e: the study where you will perform the operation\). An example is provided below ```text manifest.yaml - ``` -* **metadata and clinical data**: You might need to provide a file per entity, where entities corresponds to one of the different comprehensive data models supported by OpenCGA Catalog \(**individuals, samples, files, families, cohorts, clinical\_analysis**\). Each file will contain the entity-related information that you want to ingest into Catalog. For usability purposes two main specifications will be accepted. You can find the file structures accepted below: +* **Metadata and Clinical Data**: You might need to provide a file per entity, where entities corresponds to one of the different comprehensive data models supported by OpenCGA Catalog \(**individuals, samples, files, families, cohorts, clinical\_analysis**\). Each file will contain the entity-related information that you want to ingest into Catalog. For usability purposes two main specifications will be accepted. You can find the file structures accepted below: {% hint style="warning" %} NOTE: All the fields within each entity that are subjected to be manipulable by the users are clearly stated in the documentation of the entity data model. Please refer to [Data Models](../data-models/). From 28c8feafdedb72dfc0987423d3c34cb9daeba8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 30 Apr 2021 16:33:33 +0200 Subject: [PATCH 263/412] analysis: improve BWA wrapper, #1753 --- .../analysis/wrappers/BwaWrapperAnalysis.java | 297 ------------------ .../wrappers/bwa/BwaWrapperAnalysis.java | 135 ++++++++ .../bwa/BwaWrapperAnalysisExecutor.java | 168 ++++++++++ .../executors/AlignmentCommandExecutor.java | 26 +- .../options/AlignmentCommandOptions.java | 13 +- .../analysis/AlignmentCommandExecutor.java | 18 +- .../opencga/core/api/ParamConstants.java | 5 + .../models/alignment/BwaWrapperParams.java | 39 +-- .../monitor/daemons/ExecutionDaemon.java | 1 + .../rest/analysis/AlignmentWebService.java | 2 +- 10 files changed, 346 insertions(+), 358 deletions(-) delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/BwaWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/bwa/BwaWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/bwa/BwaWrapperAnalysisExecutor.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/BwaWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/BwaWrapperAnalysis.java deleted file mode 100644 index 8fea04aeb7e..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/BwaWrapperAnalysis.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.analysis.wrappers; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.commons.exec.Command; -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.core.tools.annotations.Tool; - -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.net.URI; -import java.nio.charset.Charset; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; - -@Tool(id = BwaWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, - description = "") -public class BwaWrapperAnalysis extends OpenCgaWrapperAnalysis { - - public final static String ID = "bwa"; - public final static String DESCRIPTION = "BWA is a software package for mapping low-divergent sequences against a large reference" - + " genome."; - - public final static String BWA_DOCKER_IMAGE = "alexcoppe/bwa"; - - private String command; - private String fastaFile; - private String indexBaseFile; - private String fastq1File; - private String fastq2File; - private String samFilename; - - private Map fileUriMap = new HashMap<>(); - - protected void check() throws Exception { - super.check(); - - if (StringUtils.isEmpty(command)) { - throw new ToolException("Missig BWA command. Supported commands are 'index' and 'mem'"); - } - - switch (command) { - case "index": - case "mem": - break; - default: - // TODO: support fastmap, pemerge, aln, samse, sampe, bwasw, shm, fa2pac, pac2bwt, pac2bwtgen, bwtupdate, bwt2sa - throw new ToolException("BWA command '" + command + "' is not available. Supported commands are 'index' and 'mem'"); - } - } - - @Override - protected void run() throws Exception { - step(() -> { - String commandLine = getCommandLine(); - logger.info("BWA command line:" + commandLine); - try { - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - Command cmd = new Command(commandLine) - .setOutputOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDOUT_FILENAME).toFile()))) - .setErrorOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDERR_FILENAME).toFile()))); - - cmd.run(); - - // Check BWA errors by reading the stdout and stderr files - boolean success = false; - switch (command) { - case "index": { - File file = params.containsKey("p") - ? new File(params.getString("p")) - : new File(fileUriMap.get(fastaFile).getPath()); - String prefix = getOutDir().toAbsolutePath() + "/" + file.getName(); - String[] suffixes = new String[]{".sa", ".bwt", ".pac", ".amb", ".ann"}; - success = true; - for (String suffix : suffixes) { - if (!new File(prefix + suffix).exists()) { - success = false; - break; - } - } - if (success) { - // Get catalog path - OpenCGAResult fileResult; - try { - fileResult = catalogManager.getFileManager().get(getStudy(), fastaFile, QueryOptions.empty(), token); - } catch (CatalogException e) { - throw new ToolException("Error accessing file '" + fastaFile + "' of the study " + getStudy() + "'", e); - } - if (fileResult.getNumResults() <= 0) { - throw new ToolException("File '" + fastaFile + "' not found in study '" + getStudy() + "'"); - } - - String catalogPath = fileResult.getResults().get(0).getPath(); - Path dest = new File(file.getParent()).toPath(); - - for (String suffix : suffixes) { - Path src = new File(prefix + suffix).toPath(); - - System.out.println("src = " + src + ", dest = " + dest + ", catalog path = " + catalogPath.concat(suffix)); - moveFile(getStudy(), src, dest, catalogPath.concat(suffix), token); - } - } - break; - } - case "mem": { - if (new File(getOutDir() + "/" + samFilename).exists()) { - success = true; - } - break; - } - } - if (!success) { - File file = new File(getScratchDir() + "/" + STDERR_FILENAME); - String msg = "Something wrong executing BWA "; - if (file.exists()) { - msg = StringUtils.join(FileUtils.readLines(file, Charset.defaultCharset()), ". "); - } - throw new ToolException(msg); - } - } catch (Exception e) { - throw new ToolException(e); - } - }); - } - -// @Override -// public String getDockerImageName() { -// return BWA_DOCKER_IMAGE; -// } - -// @Override - public String getCommandLine() throws ToolException { - StringBuilder sb = new StringBuilder("docker run "); - - // Mount management - Map srcTargetMap = new HashMap<>(); - updateFileMaps(fastaFile, sb, fileUriMap, srcTargetMap); - updateFileMaps(indexBaseFile, sb, fileUriMap, srcTargetMap); - updateFileMaps(fastq1File, sb, fileUriMap, srcTargetMap); - updateFileMaps(fastq2File, sb, fileUriMap, srcTargetMap); - - sb.append("--mount type=bind,source=\"") - .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); - - // Docker image and version - sb.append(BWA_DOCKER_IMAGE); - if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { - sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); - } - - // BWA command - sb.append(" ").append(command); - - // BWA options - for (String param : params.keySet()) { - if (checkParam(param)) { - String value = params.getString(param); - sb.append(" -").append(param); - if (StringUtils.isNotEmpty(value)) { - sb.append(" ").append(value); - } - } - } - - switch (command) { - case "index": { - File file = params.containsKey("p") - ? new File(params.getString("p")) - : new File(fileUriMap.get(fastaFile).getPath()); - - sb.append(" -p ").append(DOCKER_OUTPUT_PATH).append("/").append(file.getName()); - - if (StringUtils.isNotEmpty(fastaFile)) { - file = new File(fileUriMap.get(fastaFile).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - - break; - } - - case "mem": { - if (StringUtils.isEmpty(samFilename)) { - samFilename = "out.sam"; - } - sb.append(" -o ").append(DOCKER_OUTPUT_PATH).append("/").append(samFilename); - - if (StringUtils.isNotEmpty(indexBaseFile)) { - File file = new File(fileUriMap.get(indexBaseFile).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - - if (StringUtils.isNotEmpty(fastq1File)) { - File file = new File(fileUriMap.get(fastq1File).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - - if (StringUtils.isNotEmpty(fastq2File)) { - File file = new File(fileUriMap.get(fastq2File).getPath()); - sb.append(" ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - break; - } - } - - return sb.toString(); - } - - private boolean checkParam(String param) { - if (param.equals(DOCKER_IMAGE_VERSION_PARAM)) { - return false; - } else if ("index".equals(command) && "p".equals(param)) { - return false; - } else if ("mem".equals(command) && "o".equals(param)) { - return false; - } - return true; - } - - - public String getCommand() { - return command; - } - - public BwaWrapperAnalysis setCommand(String command) { - this.command = command; - return this; - } - - public String getFastaFile() { - return fastaFile; - } - - public BwaWrapperAnalysis setFastaFile(String fastaFile) { - this.fastaFile = fastaFile; - return this; - } - - public String getIndexBaseFile() { - return indexBaseFile; - } - - public BwaWrapperAnalysis setIndexBaseFile(String indexBaseFile) { - this.indexBaseFile = indexBaseFile; - return this; - } - - public String getFastq1File() { - return fastq1File; - } - - public BwaWrapperAnalysis setFastq1File(String fastq1File) { - this.fastq1File = fastq1File; - return this; - } - - public String getFastq2File() { - return fastq2File; - } - - public BwaWrapperAnalysis setFastq2File(String fastq2File) { - this.fastq2File = fastq2File; - return this; - } - - public String getSamFilename() { - return samFilename; - } - - public BwaWrapperAnalysis setSamFilename(String samFilename) { - this.samFilename = samFilename; - return this; - } -} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/bwa/BwaWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/bwa/BwaWrapperAnalysis.java new file mode 100644 index 00000000000..43f82799a22 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/bwa/BwaWrapperAnalysis.java @@ -0,0 +1,135 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.wrappers.bwa; + +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.alignment.BwaWrapperParams; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.stream.Collectors; + +import static org.opencb.opencga.core.api.ParamConstants.BWA_COMMANDS_SUPPORTED; + + +@Tool(id = org.opencb.opencga.analysis.wrappers.bwa.BwaWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, + description = org.opencb.opencga.analysis.wrappers.bwa.BwaWrapperAnalysis.DESCRIPTION) +public class BwaWrapperAnalysis extends OpenCgaToolScopeStudy { + + public final static String ID = "bwa"; + public final static String DESCRIPTION = "BWA is a software package for mapping low-divergent sequences against a large reference" + + " genome."; + + @ToolParams + protected final BwaWrapperParams analysisParams = new BwaWrapperParams(); + + private String fastaFilePath = null; + private String fastq1FilePath = null; + private String fastq2FilePath = null; + + protected void check() throws Exception { + super.check(); + + if (StringUtils.isEmpty(analysisParams.getCommand())) { + throw new ToolException("Missing BWA command."); + } + + if (!AnalysisUtils.isSupportedCommand(BWA_COMMANDS_SUPPORTED)) { + throw new ToolException("BWA command '" + analysisParams.getCommand() + "' is not available. Supported commands are " + + BWA_COMMANDS_SUPPORTED); + } + + // Get files from catalog + FileManager fileManager = catalogManager.getFileManager(); + + if (StringUtils.isNotEmpty(analysisParams.getFastaFile())) { + fastaFilePath = AnalysisUtils.getCatalogFile(analysisParams.getFastaFile(), study, fileManager, token).getUri().getPath(); + } + + if (StringUtils.isNotEmpty(analysisParams.getFastq1File())) { + fastq1FilePath = AnalysisUtils.getCatalogFile(analysisParams.getFastq1File(), study, fileManager, token).getUri().getPath(); + } + + if (StringUtils.isNotEmpty(analysisParams.getFastq2File())) { + fastq2FilePath = AnalysisUtils.getCatalogFile(analysisParams.getFastq2File(), study, fileManager, token).getUri().getPath(); + } + + if (MapUtils.isNotEmpty(analysisParams.getBwaParams())) { + Set fileParams = getFileParamNames(analysisParams.getCommand()); + + Map updatedMap = new HashMap<>(); + for (Map.Entry entry : analysisParams.getBwaParams().entrySet()) { + if (fileParams.contains(entry.getKey())) { + updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) + .getUri().getPath()); + } + } + if (MapUtils.isNotEmpty(updatedMap)) { + analysisParams.getBwaParams().putAll(updatedMap); + } + } + } + + @Override + protected void run() throws Exception { + setUpStorageEngineExecutor(study); + + step(() -> { + if (MapUtils.isNotEmpty(analysisParams.getBwaParams())) { + executorParams.appendAll(analysisParams.getBwaParams()); + } + + getToolExecutor(BwaWrapperAnalysisExecutor.class) + .setCommand(analysisParams.getCommand()) + .setFastaFile(fastaFilePath) + .setFastq1File(fastq1FilePath) + .setFastq2File(fastq2FilePath) + .execute(); + + // Post-processing for the command 'index' + if ("index".equals(analysisParams.getCommand())) { + String name = Paths.get(fastaFilePath).getFileName().toString(); + for (Path path : Files.list(Paths.get(fastaFilePath).getParent()).collect(Collectors.toList())) { + if (path.getFileName().toString().startsWith(name + ".")) { + // Create symbolic link + Path symbolic = getOutDir().resolve(path.getFileName().toString()); + Files.createSymbolicLink(symbolic, path); + } + } + } + }); + } + + public static Set getFileParamNames(String command) { + switch (command) { + case "mem": + return new HashSet<>(Arrays.asList("H")); + default: + return null; + } + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/bwa/BwaWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/bwa/BwaWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..bd74996ac59 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/bwa/BwaWrapperAnalysisExecutor.java @@ -0,0 +1,168 @@ +package org.opencb.opencga.analysis.wrappers.bwa; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +@ToolExecutor(id = BwaWrapperAnalysisExecutor.ID, + tool = BwaWrapperAnalysis.ID, + source = ToolExecutor.Source.STORAGE, + framework = ToolExecutor.Framework.LOCAL) +public class BwaWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor { + + public final static String ID = BwaWrapperAnalysis.ID + "-local"; + + private String study; + private String command; + private String fastaFile; + private String fastq1File; + private String fastq2File; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public String getDockerImageName() { + return "alexcoppe/bwa"; + } + + @Override + public String getDockerImageVersion() { + return null; + } + + @Override + public void run() throws ToolException { + switch (command) { + case "index": + runIndex(); + break; + case "mem": + runMem(); + break; + default: + throw new ToolException("BWA command '" + command + "' is not supported yet."); + } + } + + private void runIndex() throws ToolException { + StringBuilder sb = initCommandLine(); + + // Append mounts + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(getFastaFile(), null, + getExecutorParams()); + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand(command, sb); + + // Append other params + appendOtherParams(null, sb); + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); + } + + private void runMem() throws ToolException { + StringBuilder sb = initCommandLine(); + + // Append mounts + List> inputFilenames = new ArrayList<>(); + inputFilenames.add(new ImmutablePair<>("", fastaFile)); + inputFilenames.add(new ImmutablePair<>("", fastq1File)); + if (StringUtils.isNotEmpty(fastq2File)) { + inputFilenames.add(new ImmutablePair<>("", fastq2File)); + } + boolean hIsFile = false; + String hParam = "H"; + if (getExecutorParams().containsKey(hParam) && StringUtils.isNotEmpty(getExecutorParams().getString(hParam))) { + if (!getExecutorParams().getString(hParam).startsWith("@")) { + Pair pair = new ImmutablePair<>("H", getExecutorParams().getString("H")); + inputFilenames.add(pair); + hIsFile = true; + } + } + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand(command, sb); + + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("o")); + if (hIsFile) { + skipParams.add(hParam); + } + appendOtherParams(skipParams, sb); + + // Append output file params + if (getExecutorParams().containsKey("o")) { + String value = getExecutorParams().getString("o"); + if (StringUtils.isNotEmpty(value)) { + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("o", value))); + appendOutputFiles(outputFilenames, sb); + } + } + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); + } + + public String getStudy() { + return study; + } + + public BwaWrapperAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } + + public String getCommand() { + return command; + } + + public BwaWrapperAnalysisExecutor setCommand(String command) { + this.command = command; + return this; + } + + public String getFastaFile() { + return fastaFile; + } + + public BwaWrapperAnalysisExecutor setFastaFile(String fastaFile) { + this.fastaFile = fastaFile; + return this; + } + + public String getFastq1File() { + return fastq1File; + } + + public BwaWrapperAnalysisExecutor setFastq1File(String fastq1File) { + this.fastq1File = fastq1File; + return this; + } + + public String getFastq2File() { + return fastq2File; + } + + public BwaWrapperAnalysisExecutor setFastq2File(String fastq2File) { + this.fastq2File = fastq2File; + return this; + } +} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index a25a05e8261..cd084dd17e8 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -20,7 +20,7 @@ import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; import org.opencb.opencga.analysis.alignment.qc.AlignmentGeneCoverageStatsAnalysis; import org.opencb.opencga.analysis.alignment.qc.AlignmentQcAnalysis; -import org.opencb.opencga.analysis.wrappers.BwaWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.bwa.BwaWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; @@ -264,23 +264,17 @@ private void delete() { private void bwa() throws Exception { AlignmentCommandOptions.BwaCommandOptions cliOptions = alignmentCommandOptions.bwaCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.commonOptions.params); - BwaWrapperAnalysis bwa = new BwaWrapperAnalysis(); - bwa.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), - alignmentCommandOptions.internalJobOptions.jobId, cliOptions.commonOptions.token); - - bwa.setStudy(cliOptions.study); - - bwa.setCommand(cliOptions.command) - .setFastaFile(cliOptions.fastaFile) - .setIndexBaseFile(cliOptions.indexBaseFile) - .setFastq1File(cliOptions.fastq1File) - .setFastq2File(cliOptions.fastq2File) - .setSamFilename(cliOptions.samFilename); + ObjectMap params = new BwaWrapperParams( + cliOptions.command, + cliOptions.fastaFile, + cliOptions.fastq1File, + cliOptions.fastq2File, + cliOptions.outdir, + cliOptions.bwaParams) + .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); - bwa.start(); + toolRunner.execute(BwaWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } // Samtools diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index dd9aecfa967..fc427a57c25 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -17,7 +17,7 @@ package org.opencb.opencga.app.cli.internal.options; import com.beust.jcommander.*; -import org.opencb.opencga.analysis.wrappers.BwaWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.bwa.BwaWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; @@ -478,26 +478,23 @@ public class BwaCommandOptions { @Parameter(names = {"-s", "--study"}, description = "Study [[user@]project:]study.", arity = 1) public String study; - @Parameter(names = {"--command"}, description = "BWA comamnd. Valid values: index, mem.") + @Parameter(names = {"--command"}, description = BWA_COMMAND_DESCRIPTION) public String command; @Parameter(names = {"--fasta-file"}, description = "Fasta file.") public String fastaFile; - @Parameter(names = {"--index-base-file"}, description = "Index base file.") - public String indexBaseFile; - @Parameter(names = {"--fastq1-file"}, description = "FastQ #1 file.") public String fastq1File; @Parameter(names = {"--fastq2-file"}, description = "FastQ #2 file.") public String fastq2File; - @Parameter(names = {"--sam-filename"}, description = "SAM file name.") - public String samFilename; - @Parameter(names = {"-o", "--outdir"}, description = "Output directory.") public String outdir; + + @DynamicParameter(names = {"--bwa-params"}, description = "BWA parameters e.g.:. --bwa-params k=20 --bwa-params S=true") + public Map bwaParams = new HashMap<>(); } // Samtools diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index d1edac0a8f8..ab525126c43 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -415,19 +415,13 @@ private RestResponse coverageStats() throws ClientException { // BWA private RestResponse bwa() throws ClientException { - BwaWrapperParams wrapperParams = new BwaWrapperParams( - alignmentCommandOptions.bwaCommandOptions.command, - alignmentCommandOptions.bwaCommandOptions.fastaFile, - alignmentCommandOptions.bwaCommandOptions.indexBaseFile, - alignmentCommandOptions.bwaCommandOptions.fastq1File, - alignmentCommandOptions.bwaCommandOptions.fastq2File, - alignmentCommandOptions.bwaCommandOptions.samFilename, - alignmentCommandOptions.bwaCommandOptions.outdir, - alignmentCommandOptions.bwaCommandOptions.commonOptions.params - ); - ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), alignmentCommandOptions.bwaCommandOptions.study); + AlignmentCommandOptions.BwaCommandOptions cliOptions = alignmentCommandOptions.bwaCommandOptions; + + ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); + params.putAll(getJobParams()); - return openCGAClient.getAlignmentClient().runBwa(wrapperParams, params); + return openCGAClient.getAlignmentClient().runBwa(new BwaWrapperParams(cliOptions.command, cliOptions.fastaFile, + cliOptions.fastq1File, cliOptions.fastq2File, cliOptions.outdir, cliOptions.bwaParams), params); } // Samtools diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index b004a8c853a..3869508cefb 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -471,6 +471,11 @@ public class ParamConstants { // --------------------------------------------- + public static final String BWA_COMMANDS_SUPPORTED = "index, mem"; + public static final String BWA_COMMAND_DESCRIPTION = "Supported BWA commands: " + BWA_COMMANDS_SUPPORTED; + + // --------------------------------------------- + public static final String RPC_METHOD_DESCRIPTION = "RPC method used: {auto, gRPC, REST}. When auto, it will first try with gRPC and " + "if that does not work, it will try with REST"; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/BwaWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/BwaWrapperParams.java index 05e40e834dc..a5f8c2443d5 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/BwaWrapperParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/BwaWrapperParams.java @@ -9,28 +9,37 @@ public class BwaWrapperParams extends ToolParams { private String command; // Valid values: index or mem private String fastaFile; // Fasta file - private String indexBaseFile; // Index base file private String fastq1File; // FastQ #1 file private String fastq2File; // FastQ #2 file - private String samFilename; // SAM file name private String outdir; private Map bwaParams; public BwaWrapperParams() { } - public BwaWrapperParams(String command, String fastaFile, String indexBaseFile, String fastq1File, String fastq2File, String samFilename, - String outdir, Map bwaParams) { + public BwaWrapperParams(String command, String fastaFile, String fastq1File, String fastq2File, String outdir, + Map bwaParams) { this.command = command; this.fastaFile = fastaFile; - this.indexBaseFile = indexBaseFile; this.fastq1File = fastq1File; this.fastq2File = fastq2File; - this.samFilename = samFilename; this.outdir = outdir; this.bwaParams = bwaParams; } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("BwaWrapperParams{"); + sb.append("command='").append(command).append('\''); + sb.append(", fastaFile='").append(fastaFile).append('\''); + sb.append(", fastq1File='").append(fastq1File).append('\''); + sb.append(", fastq2File='").append(fastq2File).append('\''); + sb.append(", outdir='").append(outdir).append('\''); + sb.append(", bwaParams=").append(bwaParams); + sb.append('}'); + return sb.toString(); + } + public String getCommand() { return command; } @@ -49,15 +58,6 @@ public BwaWrapperParams setFastaFile(String fastaFile) { return this; } - public String getIndexBaseFile() { - return indexBaseFile; - } - - public BwaWrapperParams setIndexBaseFile(String indexBaseFile) { - this.indexBaseFile = indexBaseFile; - return this; - } - public String getFastq1File() { return fastq1File; } @@ -76,15 +76,6 @@ public BwaWrapperParams setFastq2File(String fastq2File) { return this; } - public String getSamFilename() { - return samFilename; - } - - public BwaWrapperParams setSamFilename(String samFilename) { - this.samFilename = samFilename; - return this; - } - public String getOutdir() { return outdir; } diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index ca2e577b219..4ae7674f237 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -60,6 +60,7 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.bwa.BwaWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index 3830a87a564..c0f1934b0a0 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -31,7 +31,7 @@ import org.opencb.opencga.analysis.alignment.AlignmentIndexOperation; import org.opencb.opencga.analysis.alignment.AlignmentStorageManager; import org.opencb.opencga.analysis.alignment.qc.*; -import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.bwa.BwaWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; From 7d6bf603956371db57dfb29e4e90b9f88d02d62c Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 30 Apr 2021 17:05:30 +0200 Subject: [PATCH 264/412] analysis: add allelePairs field to Variant summary, #1693 --- .../opencga/analysis/rga/RgaManager.java | 35 +++++++++++++++++++ .../opencb/opencga/analysis/rga/RgaUtils.java | 10 ++++-- .../knockout/KnockoutByVariantSummary.java | 14 +++++++- .../analysis/knockout/KnockoutVariant.java | 17 ++++----- 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 6059d7b3352..f58705bc782 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -925,6 +925,41 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle knockoutByVariantSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, bothParentIndividualStats)); + // 3. Get allele pairs + knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); + facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); + List allelePairs = new ArrayList<>(); + Set alleleVariantIds = new HashSet<>(); + KnockoutVariant knockoutVariant = null; + for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { + RgaUtils.CodedFeature codedVariant = RgaUtils.CodedFeature.parseEncodedId(bucket.getValue()); + if (alleleVariantIds.contains(codedVariant.getId())) { + continue; + } + alleleVariantIds.add(codedVariant.getId()); + KnockoutVariant auxKnockoutVariant = RgaUtils.convertToKnockoutVariant(new Variant(codedVariant.getId())); + auxKnockoutVariant.setKnockoutType(KnockoutVariant.KnockoutType.valueOf(codedVariant.getKnockoutType())); + allelePairs.add(auxKnockoutVariant); + + if (variantId.equals(auxKnockoutVariant.getId())) { + knockoutVariant = auxKnockoutVariant; + } + } + if (allelePairs.size() > 1) { + if (knockoutVariant == null) { + throw new RgaException("Unexpected error. Internal knockout variant is null"); + } + if (knockoutVariant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { + allelePairs.removeIf(next -> next.getKnockoutType() != KnockoutVariant.KnockoutType.COMP_HET); + } else { + // We only keep the variant itself + allelePairs = Collections.singletonList(knockoutVariant); + } + } + knockoutByVariantSummary.setAllelePairs(allelePairs); + return knockoutByVariantSummary; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index ede874cfdd4..54aa825c3de 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -332,12 +332,16 @@ static KnockoutVariant convertToKnockoutVariant(Variant variant) { // Default converter static KnockoutVariant convertToKnockoutVariant(Variant variant, SampleEntry sampleEntry, KnockoutVariant.KnockoutType knockoutType) { - StudyEntry studyEntry = variant.getStudies().get(0); + StudyEntry studyEntry = CollectionUtils.isNotEmpty(variant.getStudies()) ? variant.getStudies().get(0) : null; // TODO: Check fileentry - FileEntry fileEntry = variant.getStudies().get(0).getFiles().get(0); + FileEntry fileEntry = studyEntry != null && CollectionUtils.isNotEmpty(studyEntry.getFiles()) + ? studyEntry.getFiles().get(0) + : null; VariantAnnotation variantAnnotation = variant.getAnnotation(); // TODO: Check consequence type - ConsequenceType consequenceType = variantAnnotation.getConsequenceTypes().get(0); + ConsequenceType consequenceType = variantAnnotation != null && CollectionUtils.isNotEmpty(variantAnnotation.getConsequenceTypes()) + ? variantAnnotation.getConsequenceTypes().get(0) + : null; return new KnockoutVariant(variant, studyEntry, fileEntry, sampleEntry, variantAnnotation, consequenceType, knockoutType); } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java index 2c5c87527de..8c65a0c39fd 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java @@ -23,6 +23,7 @@ public class KnockoutByVariantSummary { private List populationFrequencies; private List sequenceOntologyTerms; private List clinicalSignificances; + private List allelePairs; private IndividualStats individualStats; @@ -32,7 +33,7 @@ public KnockoutByVariantSummary() { public KnockoutByVariantSummary(String id, String dbSnp, String chromosome, int start, int end, int length, String reference, String alternate, VariantType type, List genes, List populationFrequencies, List sequenceOntologyTerms, List clinicalSignificances, - IndividualStats individualStats) { + List allelePairs, IndividualStats individualStats) { this.id = id; this.dbSnp = dbSnp; this.chromosome = chromosome; @@ -46,6 +47,7 @@ public KnockoutByVariantSummary(String id, String dbSnp, String chromosome, int this.populationFrequencies = populationFrequencies; this.sequenceOntologyTerms = sequenceOntologyTerms; this.clinicalSignificances = clinicalSignificances; + this.allelePairs = allelePairs; this.individualStats = individualStats; } @@ -65,6 +67,7 @@ public String toString() { sb.append(", populationFrequencies=").append(populationFrequencies); sb.append(", sequenceOntologyTerms=").append(sequenceOntologyTerms); sb.append(", clinicalSignificances=").append(clinicalSignificances); + sb.append(", allelePairs=").append(allelePairs); sb.append(", individualStats=").append(individualStats); sb.append('}'); return sb.toString(); @@ -187,6 +190,15 @@ public KnockoutByVariantSummary setClinicalSignificances(List getAllelePairs() { + return allelePairs; + } + + public KnockoutByVariantSummary setAllelePairs(List allelePairs) { + this.allelePairs = allelePairs; + return this; + } + public IndividualStats getIndividualStats() { return individualStats; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java index 93a90230fcc..9f5a8596c1b 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java @@ -17,6 +17,7 @@ package org.opencb.opencga.core.models.analysis.knockout; import htsjdk.variant.vcf.VCFConstants; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; @@ -59,7 +60,7 @@ public KnockoutVariant() { public KnockoutVariant(Variant variant, StudyEntry study, FileEntry file, SampleEntry sample, VariantAnnotation annotation, ConsequenceType ct, KnockoutType knockoutType) { this.id = variant.toString(); - this.dbSnp = annotation.getId(); + this.dbSnp = annotation != null ? annotation.getId() : null; this.chromosome = variant.getChromosome(); this.start = variant.getStart(); this.end = variant.getEnd(); @@ -67,14 +68,14 @@ public KnockoutVariant(Variant variant, StudyEntry study, FileEntry file, Sample this.reference = variant.getReference(); this.alternate = variant.getAlternate(); this.type = variant.getType(); - this.genotype = sample != null ? sample.getData().get(0) : null; + this.genotype = sample != null && CollectionUtils.isNotEmpty(sample.getData()) ? sample.getData().get(0) : null; this.depth = getDepth(study, file, sample); - this.filter = file.getData().get(StudyEntry.FILTER); - this.qual = file.getData().get(StudyEntry.QUAL); - this.stats = study.getStats(StudyEntry.DEFAULT_COHORT); + this.filter = file != null ? file.getData().get(StudyEntry.FILTER) : null; + this.qual = file != null ? file.getData().get(StudyEntry.QUAL) : null; + this.stats = study != null ? study.getStats(StudyEntry.DEFAULT_COHORT) : null; this.knockoutType = knockoutType; this.sequenceOntologyTerms = ct == null ? null : ct.getSequenceOntologyTerms(); - this.populationFrequencies = annotation.getPopulationFrequencies(); + this.populationFrequencies = annotation != null ? annotation.getPopulationFrequencies() : null; this.clinicalSignificance = getClinicalSignificance(annotation); } @@ -308,7 +309,7 @@ public static Integer getDepth(StudyEntry study, FileEntry file, SampleEntry sam } public static List getClinicalSignificance(VariantAnnotation annotation) { - if (annotation.getTraitAssociation() != null) { + if (annotation != null && annotation.getTraitAssociation() != null) { Set uniqueValues = new HashSet<>(); for (EvidenceEntry evidenceEntry : annotation.getTraitAssociation()) { if (evidenceEntry.getVariantClassification() != null @@ -318,6 +319,6 @@ public static List getClinicalSignificance(VariantAnnotati } return new ArrayList<>(uniqueValues); } - return Collections.emptyList(); + return null; } } From 23f2635e2d0842777b1702581e03d6b4b06bb48d Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 30 Apr 2021 15:11:02 +0000 Subject: [PATCH 265/412] GitBook: [develop] one page modified --- docs/manual/administrator/templates-manifest.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index 0949cacc43d..d31fe7ca914 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -35,9 +35,9 @@ The following entities are supported. * For [Cohort](../data-models/cohort.md): `cohorts.{json|yaml}` * For [Clinical Analysis](../../components-1/clinical.md): `clinical_anaysis.{json|yaml}` -### TAB Files +### TAB Text Files -You can load data for the entities using **TAB separated txt files**. There are some simple construction rules that the user needs to follow for the ingestion to be successful: +You can load data for the entities using **TAB separated .txt files**. There are some simple construction rules that the user needs to follow for the ingestion to be successful: * First line starting with \# symbol containing the exact name of the corresponding data model * The column name must correspond to the field reserved in the entity data model. Refer to each entity data model documentation for checking the accepted fields. @@ -46,8 +46,8 @@ You can load data for the entities using **TAB separated txt files**. There are ```text individuals.txt: #id name sex status.name -NA001 uk1 yes READY -NA002 uk2 no READY +NA001 uk1 female READY +NA002 uk2 male READY individuals.phenotypes.txt From 751b19eadfe7aed1564df0e086541b6420c2f666 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 30 Apr 2021 17:31:24 +0200 Subject: [PATCH 266/412] analysis: fix allelePair calculation, #1693 --- .../opencga/analysis/rga/RgaManager.java | 38 ++++++------- .../analysis/knockout/KnockoutVariant.java | 56 +++++++++++++++++++ 2 files changed, 74 insertions(+), 20 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index f58705bc782..f937f3b3717 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -930,35 +930,33 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle .append(QueryOptions.LIMIT, -1) .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); - List allelePairs = new ArrayList<>(); - Set alleleVariantIds = new HashSet<>(); - KnockoutVariant knockoutVariant = null; + + boolean isCH = false; + Set currentVariantSet = new HashSet<>(); + Set otherVariantSet = new HashSet<>(); for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { RgaUtils.CodedFeature codedVariant = RgaUtils.CodedFeature.parseEncodedId(bucket.getValue()); - if (alleleVariantIds.contains(codedVariant.getId())) { - continue; - } - alleleVariantIds.add(codedVariant.getId()); KnockoutVariant auxKnockoutVariant = RgaUtils.convertToKnockoutVariant(new Variant(codedVariant.getId())); auxKnockoutVariant.setKnockoutType(KnockoutVariant.KnockoutType.valueOf(codedVariant.getKnockoutType())); - allelePairs.add(auxKnockoutVariant); if (variantId.equals(auxKnockoutVariant.getId())) { - knockoutVariant = auxKnockoutVariant; + currentVariantSet.add(auxKnockoutVariant); + if (auxKnockoutVariant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { + isCH = true; + } + } else if (auxKnockoutVariant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { + // We only store it otherwise if it is CH + otherVariantSet.add(auxKnockoutVariant); } } - if (allelePairs.size() > 1) { - if (knockoutVariant == null) { - throw new RgaException("Unexpected error. Internal knockout variant is null"); - } - if (knockoutVariant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { - allelePairs.removeIf(next -> next.getKnockoutType() != KnockoutVariant.KnockoutType.COMP_HET); - } else { - // We only keep the variant itself - allelePairs = Collections.singletonList(knockoutVariant); - } + if (isCH) { + List allelePairList = new ArrayList<>(currentVariantSet.size() + otherVariantSet.size()); + allelePairList.addAll(currentVariantSet); + allelePairList.addAll(otherVariantSet); + knockoutByVariantSummary.setAllelePairs(allelePairList); + } else { + knockoutByVariantSummary.setAllelePairs(new ArrayList<>(currentVariantSet)); } - knockoutByVariantSummary.setAllelePairs(allelePairs); return knockoutByVariantSummary; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java index 9f5a8596c1b..58603234439 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java @@ -19,6 +19,8 @@ import htsjdk.variant.vcf.VCFConstants; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.*; @@ -108,6 +110,60 @@ public KnockoutVariant(Variant variant, String dbSnp, String genotype, Integer d this.clinicalSignificance = clinicalSignificance; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + KnockoutVariant that = (KnockoutVariant) o; + + return new EqualsBuilder() + .append(start, that.start) + .append(end, that.end) + .append(length, that.length) + .append(id, that.id) + .append(dbSnp, that.dbSnp) + .append(chromosome, that.chromosome) + .append(reference, that.reference) + .append(alternate, that.alternate) + .append(type, that.type) + .append(genotype, that.genotype) + .append(depth, that.depth) + .append(filter, that.filter) + .append(qual, that.qual) + .append(stats, that.stats) + .append(knockoutType, that.knockoutType) + .append(populationFrequencies, that.populationFrequencies) + .append(sequenceOntologyTerms, that.sequenceOntologyTerms) + .append(clinicalSignificance, that.clinicalSignificance) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(id) + .append(dbSnp) + .append(chromosome) + .append(start) + .append(end) + .append(length) + .append(reference) + .append(alternate) + .append(type) + .append(genotype) + .append(depth) + .append(filter) + .append(qual) + .append(stats) + .append(knockoutType) + .append(populationFrequencies) + .append(sequenceOntologyTerms) + .append(clinicalSignificance) + .toHashCode(); + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("KnockoutVariant{"); From a25e297c7c0603e8e5e3f0b57bf08e0669d514ac Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 3 May 2021 12:28:19 +0200 Subject: [PATCH 267/412] analysis: fix consequence type retrieval, #1693 --- .../opencga/analysis/rga/RgaManager.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index f937f3b3717..01586ccbb6e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -819,16 +819,8 @@ public OpenCGAResult variantSummary(String studyStr, Q Variant variant = variantDBIterator.next(); VariantAnnotation variantAnnotation = variant.getAnnotation(); - Set sequenceOntologyId = new HashSet<>(); - List sequenceOntologyTermList = new LinkedList<>(); Set geneNames = new HashSet<>(); for (ConsequenceType consequenceType : variantAnnotation.getConsequenceTypes()) { - for (SequenceOntologyTerm sequenceOntologyTerm : consequenceType.getSequenceOntologyTerms()) { - if (!sequenceOntologyId.contains(sequenceOntologyTerm.getName())) { - sequenceOntologyId.add(sequenceOntologyTerm.getName()); - sequenceOntologyTermList.add(sequenceOntologyTerm); - } - } if (consequenceType.getGeneName() != null) { geneNames.add(consequenceType.getGeneName()); } @@ -844,7 +836,6 @@ public OpenCGAResult variantSummary(String studyStr, Q knockoutByVariantSummary.setAlternate(variant.getAlternate()); knockoutByVariantSummary.setType(variant.getType()); knockoutByVariantSummary.setPopulationFrequencies(variantAnnotation.getPopulationFrequencies()); - knockoutByVariantSummary.setSequenceOntologyTerms(sequenceOntologyTermList); knockoutByVariantSummary.setGenes(new ArrayList<>(geneNames)); } @@ -925,12 +916,13 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle knockoutByVariantSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, bothParentIndividualStats)); - // 3. Get allele pairs + // 3. Get allele pairs and CT from Variant summary knockoutTypeFacet = new QueryOptions() .append(QueryOptions.LIMIT, -1) .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); + Set sequenceOntologyTerms = new HashSet<>(); boolean isCH = false; Set currentVariantSet = new HashSet<>(); Set otherVariantSet = new HashSet<>(); @@ -940,6 +932,7 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle auxKnockoutVariant.setKnockoutType(KnockoutVariant.KnockoutType.valueOf(codedVariant.getKnockoutType())); if (variantId.equals(auxKnockoutVariant.getId())) { + sequenceOntologyTerms.addAll(codedVariant.getConsequenceType()); currentVariantSet.add(auxKnockoutVariant); if (auxKnockoutVariant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { isCH = true; @@ -949,6 +942,14 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle otherVariantSet.add(auxKnockoutVariant); } } + List sequenceOntologyTermList = new ArrayList<>(sequenceOntologyTerms.size()); + for (String ct : sequenceOntologyTerms) { + String ctName = RgaUtils.decode(ct); + String ctId = String.format("SO:%0" + (7 - ct.length()) + "d%s", 0, ct); + sequenceOntologyTermList.add(new SequenceOntologyTerm(ctId, ctName)); + } + knockoutByVariantSummary.setSequenceOntologyTerms(sequenceOntologyTermList); + if (isCH) { List allelePairList = new ArrayList<>(currentVariantSet.size() + otherVariantSet.size()); allelePairList.addAll(currentVariantSet); From 3789b1af59435292743eb387983c1358311135d7 Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 3 May 2021 11:36:32 +0000 Subject: [PATCH 268/412] GitBook: [develop] one page modified --- docs/manual/data-models/sample.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual/data-models/sample.md b/docs/manual/data-models/sample.md index c83db507fdc..9c14268ab18 100644 --- a/docs/manual/data-models/sample.md +++ b/docs/manual/data-models/sample.md @@ -4,11 +4,11 @@ Sample data model hosts information about any biological material, normally extracted from an _Individual_, that is used for a particular analysis. -## Entity Field Attributes +## Sample Field Attributes There are some attributes that a user can manipulate, while others are reserved for internal OpenCGA use -### Sample Fields subjected to Update and Create Operations +### Fields subjected to Update and Create Operations **Create Fields: `id`** From 921bbbf1f156cb530392a3ecba53ccb604b841d9 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 4 May 2021 11:19:14 +0200 Subject: [PATCH 269/412] analysis: check mother and father sample ids to get numParents --- .../opencb/opencga/analysis/rga/IndividualRgaConverter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index f6e01ee667e..ac8ad24463f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -208,10 +208,10 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI String individualId = knockoutByIndividual.getId(); int numParents = 0; - if (StringUtils.isNotEmpty(knockoutByIndividual.getFatherId())) { + if (StringUtils.isNotEmpty(knockoutByIndividual.getFatherSampleId())) { numParents++; } - if (StringUtils.isNotEmpty(knockoutByIndividual.getMotherId())) { + if (StringUtils.isNotEmpty(knockoutByIndividual.getMotherSampleId())) { numParents++; } From 75962ea110ca561ff96196328536a65494ff9bd6 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 4 May 2021 14:38:18 +0200 Subject: [PATCH 270/412] core: add RGA to the Resource enum --- .../main/java/org/opencb/opencga/core/models/common/Enums.java | 1 + 1 file changed, 1 insertion(+) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java index 71d2f4e99bd..9d6d9c53a08 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java @@ -76,6 +76,7 @@ public enum Resource { ALIGNMENT, CLINICAL, EXPRESSION, + RGA, FUNCTIONAL; public List getFullPermissionList() { From 94f92733badaf189679030f544546ea1e21e58a9 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 4 May 2021 14:50:49 +0200 Subject: [PATCH 271/412] analysis: add numParents to IndividualSummary data model, #1693 --- .../opencga/analysis/rga/RgaManagerTest.java | 5 +++++ .../knockout/KnockoutByIndividualSummary.java | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index fa2bc9ccd85..669884e1886 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -232,6 +232,11 @@ public void testIndividualSummary() throws CatalogException, IOException, RgaExc OpenCGAResult result = rgaManager.individualSummary(STUDY, new Query(), QueryOptions.empty(), ownerToken); assertEquals(4, result.getNumResults()); for (KnockoutByIndividualSummary individual : result.getResults()) { + if ("NA19685".equals(individual.getId()) || "NA19600".equals(individual.getId())) { + assertEquals(2, individual.getNumParents()); + } else { + assertEquals(0, individual.getNumParents()); + } assertNotNull(individual.getId()); assertNotNull(individual.getVariantStats()); assertTrue(individual.getGenes().size() > 0); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java index 8303c6adfdc..cba3bffedda 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java @@ -1,5 +1,6 @@ package org.opencb.opencga.core.models.analysis.knockout; +import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.biodata.models.pedigree.IndividualProperty; @@ -19,6 +20,7 @@ public class KnockoutByIndividualSummary { private List phenotypes; private List disorders; + private int numParents; private List genes; private VariantStats variantStats; @@ -46,6 +48,13 @@ public KnockoutByIndividualSummary(String id, String sampleId, String motherId, this.disorders = disorders; this.genes = genes; this.variantStats = variantStats; + this.numParents = 0; + if (StringUtils.isNotEmpty(motherSampleId)) { + this.numParents++; + } + if (StringUtils.isNotEmpty(fatherSampleId)) { + this.numParents++; + } } @Override @@ -62,6 +71,7 @@ public String toString() { sb.append(", disorders=").append(disorders); sb.append(", genes=").append(genes); sb.append(", variantStats=").append(variantStats); + sb.append(", numParents=").append(numParents); sb.append('}'); return sb.toString(); } @@ -165,4 +175,12 @@ public KnockoutByIndividualSummary setVariantStats(VariantStats variantStats) { return this; } + public int getNumParents() { + return numParents; + } + + public KnockoutByIndividualSummary setNumParents(int numParents) { + this.numParents = numParents; + return this; + } } From d80926aee783607f3c6aba2468f409b29e9a3eec Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 4 May 2021 15:35:55 +0200 Subject: [PATCH 272/412] analysis: empty father and mother sample id if user is not authorised --- .../opencga/analysis/rga/RgaManager.java | 113 ++++++++++++++++-- 1 file changed, 102 insertions(+), 11 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 01586ccbb6e..981c27ec14f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrException; @@ -115,9 +116,6 @@ public OpenCGAResult individualQuery(String studyStr, Quer throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String collection = getCollectionName(study.getFqn()); - if (!rgaEngine.isAlive(collection)) { - throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); - } StopWatch stopWatch = new StopWatch(); stopWatch.start(); @@ -137,6 +135,37 @@ public OpenCGAResult individualQuery(String studyStr, Quer RgaIterator rgaIterator = rgaEngine.individualQuery(collection, preprocess.getQuery(), QueryOptions.empty()); List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(rgaIterator); + + if (!preprocess.isOwnerOrAdmin) { + // Extract all parent sample ids + Set parentSampleIds = new HashSet<>(); + for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividuals) { + if (StringUtils.isNotEmpty(knockoutByIndividual.getFatherSampleId())) { + parentSampleIds.add(knockoutByIndividual.getFatherSampleId()); + } + if (StringUtils.isNotEmpty(knockoutByIndividual.getMotherSampleId())) { + parentSampleIds.add(knockoutByIndividual.getMotherSampleId()); + } + } + // Check parent permissions... + Set authorisedSamples = getAuthorisedSamples(study.getFqn(), parentSampleIds, null, preprocess.getUserId(), token); + if (authorisedSamples.size() < parentSampleIds.size()) { + // Filter out parent sample ids + for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividuals) { + if (StringUtils.isNotEmpty(knockoutByIndividual.getFatherSampleId()) + && !authorisedSamples.contains(knockoutByIndividual.getFatherSampleId())) { + knockoutByIndividual.setFatherId(""); + knockoutByIndividual.setFatherSampleId(""); + } + if (StringUtils.isNotEmpty(knockoutByIndividual.getMotherSampleId()) + && !authorisedSamples.contains(knockoutByIndividual.getMotherSampleId())) { + knockoutByIndividual.setMotherId(""); + knockoutByIndividual.setMotherSampleId(""); + } + } + } + } + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), knockoutByIndividuals.size(), knockoutByIndividuals, -1); @@ -591,14 +620,7 @@ public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List individualSummary(String studyStr, Query query, QueryOptions options, String token) throws RgaException, CatalogException, IOException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(token); String collection = getCollectionName(study.getFqn()); - if (!rgaEngine.isAlive(collection)) { - throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); - } - - catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, - StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); StopWatch stopWatch = StopWatch.createStarted(); ExecutorService executor = Executors.newFixedThreadPool(4); @@ -616,6 +638,9 @@ public OpenCGAResult individualSummary(String study throw e; } + catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), preprocess.getUserId(), + StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); + List sampleIds = preprocess.getQuery().getAsStringList(RgaQueryParams.SAMPLE_ID.key()); preprocess.getQuery().remove(RgaQueryParams.SAMPLE_ID.key()); List knockoutByIndividualSummaryList = new ArrayList<>(sampleIds.size()); @@ -626,9 +651,20 @@ public OpenCGAResult individualSummary(String study futureList.add(executor.submit(() -> calculateIndividualSummary(collection, preprocess.getQuery(), sampleId))); } + Set parentSampleIds = new HashSet<>(); try { for (Future summaryFuture : futureList) { - knockoutByIndividualSummaryList.add(summaryFuture.get()); + KnockoutByIndividualSummary knockoutByIndividualSummary = summaryFuture.get(); + if (!preprocess.isOwnerOrAdmin()) { + if (StringUtils.isNotEmpty(knockoutByIndividualSummary.getFatherSampleId())) { + parentSampleIds.add(knockoutByIndividualSummary.getFatherSampleId()); + } + if (StringUtils.isNotEmpty(knockoutByIndividualSummary.getMotherSampleId())) { + parentSampleIds.add(knockoutByIndividualSummary.getMotherSampleId()); + } + } + + knockoutByIndividualSummaryList.add(knockoutByIndividualSummary); } } catch (InterruptedException | ExecutionException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getCause().getMessage())) { @@ -637,6 +673,26 @@ public OpenCGAResult individualSummary(String study throw new RgaException(e.getMessage(), e); } + if (!parentSampleIds.isEmpty()) { + // Check parent permissions... + Set authorisedSamples = getAuthorisedSamples(study.getFqn(), parentSampleIds, null, preprocess.getUserId(), token); + // Filter out parent sample ids + if (authorisedSamples.size() < parentSampleIds.size()) { + for (KnockoutByIndividualSummary knockoutByIndividualSummary : knockoutByIndividualSummaryList) { + if (StringUtils.isNotEmpty(knockoutByIndividualSummary.getFatherSampleId()) + && !authorisedSamples.contains(knockoutByIndividualSummary.getFatherSampleId())) { + knockoutByIndividualSummary.setFatherId(""); + knockoutByIndividualSummary.setFatherSampleId(""); + } + if (StringUtils.isNotEmpty(knockoutByIndividualSummary.getMotherSampleId()) + && !authorisedSamples.contains(knockoutByIndividualSummary.getMotherSampleId())) { + knockoutByIndividualSummary.setMotherId(""); + knockoutByIndividualSummary.setMotherSampleId(""); + } + } + } + } + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), knockoutByIndividualSummaryList.size(), knockoutByIndividualSummaryList, -1); @@ -1085,6 +1141,17 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection return knockoutByIndividualSummary; } + private Set getAuthorisedSamples(String study, Set sampleIds, List otherPermissions, + String userId, String token) throws CatalogException { + Query query = new Query(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); + if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(otherPermissions)) { + query.put(ACL_PARAM, userId + ":" + StringUtils.join(otherPermissions, ",")); + } + + OpenCGAResult distinct = catalogManager.getSampleManager().distinct(study, SampleDBAdaptor.QueryParams.ID.key(), query, token); + return distinct.getResults().stream().map(String::valueOf).collect(Collectors.toSet()); + } + private static class KnockoutTypeCount { private Set knockoutTypeQuery; @@ -1198,6 +1265,8 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Preprocess preprocessResult = new Preprocess(); + preprocessResult.setUserId(userId); + preprocessResult.setOwnerOrAdmin(isOwnerOrAdmin); preprocessResult.setQuery(query != null ? new Query(query) : new Query()); preprocessResult.setQueryOptions(setDefaultLimit(options)); QueryOptions queryOptions = preprocessResult.getQueryOptions(); @@ -1316,14 +1385,36 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti private class Preprocess { + private String userId; + private boolean isOwnerOrAdmin; + private Query query; private QueryOptions queryOptions; + private long numTotalResults; private Event event; public Preprocess() { } + public String getUserId() { + return userId; + } + + public Preprocess setUserId(String userId) { + this.userId = userId; + return this; + } + + public boolean isOwnerOrAdmin() { + return isOwnerOrAdmin; + } + + public Preprocess setOwnerOrAdmin(boolean ownerOrAdmin) { + isOwnerOrAdmin = ownerOrAdmin; + return this; + } + public Query getQuery() { return query; } From 2ffcc455a7664aba9f3c00ab89189cb56fc6d3d8 Mon Sep 17 00:00:00 2001 From: imedina Date: Wed, 5 May 2021 10:51:51 +0100 Subject: [PATCH 273/412] client: remove deprecated test files --- .../notebooks/user-training/Testing1.py | 144 --------- .../python/notebooks/user-training/test2.py | 290 ------------------ .../notebooks/user-training/test_note.py | 178 ----------- 3 files changed, 612 deletions(-) delete mode 100644 opencga-client/src/main/python/notebooks/user-training/Testing1.py delete mode 100644 opencga-client/src/main/python/notebooks/user-training/test2.py delete mode 100644 opencga-client/src/main/python/notebooks/user-training/test_note.py diff --git a/opencga-client/src/main/python/notebooks/user-training/Testing1.py b/opencga-client/src/main/python/notebooks/user-training/Testing1.py deleted file mode 100644 index 86db13af786..00000000000 --- a/opencga-client/src/main/python/notebooks/user-training/Testing1.py +++ /dev/null @@ -1,144 +0,0 @@ - - -from pyopencga.opencga_config import ClientConfiguration # import configuration module -from pyopencga.opencga_client import OpencgaClient # import client module -from pprint import pprint -import json -import pandas as pd -import numpy as np -import matplotlib -matplotlib.use( 'tkAgg' ) -import matplotlib.pyplot as plt -import seaborn as sns -#%matplotlib inline -#%% - -#################################### -## Configuration parameters ####### -#################################### -# OpenCGA host -host = 'https://ws.opencb.org/opencga-prod' - -# User credentials -user = 'demouser' -passwd = 'demouser' ## you can skip this, see below. -study = 'demo@family:platinum' -#################################### - -# Creating ClientConfiguration dict -config_dict = {'rest': { - 'host': host - } - } -print('Config information:\n',config_dict) - -# Pass the config_dict dictionary to the ClientConfiguration method -config = ClientConfiguration(config_dict) - -# Create the client -oc = OpencgaClient(config) - -# Pass the credentials to the client -# (here we put only the user in order to be asked for the password interactively) -# oc.login(user) - -# or you can pass the user and passwd -oc.login(user, passwd) - -#%% -# Define variables to query different data models though the web services - -variant_client = oc.variants # Variant Client -user_client = oc.users -project_client = oc.projects -study_client = oc.studies -sample_client = oc.samples -individual_client = oc.individuals -file_client = oc.files -cohort_client = oc.cohorts - -#%% Let's use corpasome study - -study = 'family:corpasome' - -#%% md Which variants in RD38 fall on chromosome 15 between 21,242,091 and 23,226,874bp? -variants = variant_client.query(study=study, region='15:21242091-23226874', include='id') - -# variants.print_results('id') -df = variants.to_data_frame() -formated_df = df.drop(['names', 'studies'], 1) - -#%% -print(formated_df.head) - -#%% Which variants in RD38 fall on chromosome 15? - -# variants = variant_client.query(study=study, region='15', include='id') -# result = variants.print_results('id') -# df = variants.to_data_frame(include='id') - -#%% -formated_df = df.drop(['names', 'studies'], 1) - -#%% Select variables based on type -snp_df = formated_df[formated_df.type == 'SNP'] -indel_df = formated_df[formated_df.type == 'INDEL'] - -#%% Set a background -sns.set_theme(style="darkgrid") -sns.color_palette('deep') -#sns.set_style("whitegrid") - -#%% Plot all the variants -#sns.histplot(formated_df['start'], bins=50, kde=True) - - -#%% -sns.set_theme(style="darkgrid") -sns.color_palette('deep') -sns.displot(data=df, hue='type', hue_order=['INDEL','SNP','SNV'], x="start", bins=50) # multiple= "dodge", 'stack' -#plt.legend(prop={'size': 12}) -#plt.legend() -plt.title('Variants in Region of Chromosome 15', fontsize=20, fontweight='bold' ) -plt.xlabel('Chr15:21242091-23226874 bp', fontsize=12) -plt.ylabel('Variant counts', fontsize=12) -sns.despine(left=False) -plt.show() - -#%% Plot formatting -plt.close() - -#%% - - -#%% md -# -# **Situation:** I am interested in getting a list of all participants in RD, GRCh38, that have: -# (A) SNVs in NOD2 gene that have MAF of <0.01 in gnomad_NFE AND are missense, start_lost, stop_gained, or stop_lost -# split by hets and homs. -# -# - How I can submit this query but instead of NOD2, for a list of 10 genes (example list: IL3, IL31, IL32, IL34, IL6, IL6R, IL10RA, IL10RB, IL7, IL7R) to the openCGA server - -#%% - -# Define the parameters we want to query - -genes = ['NOD2','IL3'] -limit = 5 -type = ['SNV'] -ct = ['missense_variant','start_lost','stop_gained','stop_lost'] #List of SO consequence types, e.g. missense_variant,stop_lost or SO:0001583,SO:0001578 -populationFrequencyMaf='gnomAD_NFE:ALL<0.01' - - - -variants = variant_client.query(study=study, gene=genes, type=type, ct=ct, - populationFrequencyMaf=populationFrequencyMaf, limit=limit) # Other params: exclude='annotation' - - -variants.print_results('id') -#pprint(variants.get_result(0)) - -#%% - -variants = variant_client.query_sample(study=study, variant='16:50744624:C:T') -variants.print_results() \ No newline at end of file diff --git a/opencga-client/src/main/python/notebooks/user-training/test2.py b/opencga-client/src/main/python/notebooks/user-training/test2.py deleted file mode 100644 index 0c8a7a18cff..00000000000 --- a/opencga-client/src/main/python/notebooks/user-training/test2.py +++ /dev/null @@ -1,290 +0,0 @@ -#%% md - -# Overview ------- - -This notebook is intended to provide guidance for querying variants in the OpenCGA server through *pyopencga* from the studies that your user has access to; you can combine the filtration of variants with the exploration of their related clinical data (Samples, Individuals Genotypes etc.).
- -It is also recommended to get a taste of the clinical data we are encountering in the study: How many samples and individuals does the study have? Is there any defined cohorts? Can we get some statistics about the genotypes of the samples in the Sudy? - -For guidance on how to loggin and get started with *opencga* you can refer to : [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
- -A good first step when start working with OpenCGA is to explore **Catalog**, which holds: information about our user, the projects and studies our user has permission to access and the clinical data from the studies. For guidance you can refer to : [pyopencga_catalog.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
- -**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL: -- https://ws.opencb.org/opencga-prod/webservices/ - - -#%% md - -## Setup the Client and Login into *pyopencga* - -**Configuration and Credentials** - -Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)). - -You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file. - - -#%% - -# Step 1. Import pyopencga dependecies -from pyopencga.opencga_config import ClientConfiguration # import configuration module -from pyopencga.opencga_client import OpencgaClient # import client module -from pprint import pprint -import json -import matplotlib.pyplot as plt -import seaborn as sns -import datetime -#import pyjq - -# Step 2. OpenCGA host -host = 'https://ws.opencb.org/opencga-prod' - -# Step 3. User credentials -user = 'demouser' -passwd = 'demouser' ## you can skip this, see below. -#################################### - -# Step 4. Create the ClientConfiguration dict -config_dict = {'rest': { - 'host': host - } - } - -# Step 5. Create the ClientConfiguration and OpenCGA client -config = ClientConfiguration(config_dict) -oc = OpencgaClient(config) - -# Step 6. Login to OpenCGA using the OpenCGA client -# Pass the credentials to the client -# (here we put only the user in order to be asked for the password interactively) -# oc.login(user) - -# or you can pass the user and passwd -oc.login(user, passwd) - -print('Logged succesfuly to {}, {} well done!'.format(host, oc.token)) - - -#%% md - -## Setup OpenCGA Variables - -#%% md - -Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. - - -#%% - -## Define the OpenCGA variables to query data -study = 'family:corpasome' - -# You can define list using string with commas -genes='BRCA2' - -# or you can use python lists -transcripts=['ENST00000530893'] - -RESULT_SEPARATOR='\n' - -#%% md - -# Querying Variants: Filter by Variant Annotation ------- - -#%% md - -In this section you will learn how to query variants filtering by **Variant Annotation**, this is one of the most useful and rich web service with many filter parameters. - -You can query variants using the following function: - -` - oc.variants.query() -` - -#%% md - -## Filter by Region - -The format used for referring to genomic coordinates in *OpenCGA* is as follows: - -**1:10000-20000 : Chromosome 1, from position 10000 to 200000 bp** - -#%% - -# Perform the query -variants = oc.variants.query(study=study, region='15:21242091-23226874', include='id') - -# Print the results -#variants.print_results('id') -assert jq.compile(".").input(variants).text() - -#%% md - -The new function `.to_data_frame()` added in the *pyopencga* release 2.0.1.1, allows you store the results as a *pandas* dataframe object: - -#%% - -df = variants.to_data_frame() -formatted_df = df.drop(['names', 'studies'], 1) -print('The results can be stored and printed as a pandas DF:\n\n', formatted_df.head()) - -#%% md - -With the *pandas dataframe* object, you can create plots using *maplotlib* or *seaborn* python libraries to show the results: - -#%% - -# Create a plot with the results: - -sns.set_theme(style="darkgrid") -sns.color_palette('deep') -sns.displot(data=df, hue='type', hue_order=['INDEL','SNP','SNV'], x="start", bins=50) # multiple= "dodge", 'stack' -plt.title('Variants in Region of Chromosome 15', fontsize=20, fontweight='bold' ) -plt.xlabel('Chr15:21242091-23226874 bp', fontsize=12) -plt.ylabel('Variant counts', fontsize=12) -sns.despine(left=False) -plt.show() - -#%% md - -## Filter by Gene - -We can filter variants by gene using the parameters `xref` or `gene`: -* **xref**: you can filter by different IDs including gene, transcrit, dbSNP, ... -* **gene**: only accepts gene IDs - -Remember you can pass different IDs using comma as separator. - -#%% - -# Filter by xref -variants = oc.variants.query(study=study, xref=transcripts, limit=5) # Other params: exclude='annotation' -variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') # metadata=False -print(RESULT_SEPARATOR) - -# Filter by gene -variants = oc.variants.query(study=study, gene=genes, limit=5) # Other params: exclude='annotation' -variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') - - -#%% md - -## Filter by Consequence Type - -... - -#%% - - - -#%% md - -## Filter by Variant Type - -values accepted... - -#%% - -# Filter by SNV -variants = oc.variants.query(study=study, type='SNV', limit=5) # Other params: exclude='annotation' -variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') # metadata=False -print(RESULT_SEPARATOR) - -# Filter by ... -variants = oc.variants.query(study=study, type='SNV,INDEL', limit=5) # Other params: exclude='annotation' -variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') - -# Filter by ... -variants = oc.variants.query(study=study, type='DELETION', limit=5) # Other params: exclude='annotation' -variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType') - -#%% md - -## Advanced Filters - -#%% - - - -#%% md - -# Querying Variants: Filter by Sample and VCF params -------- - -#%% - -# resp = oc.samples.search(limi=1) -# sample= resp. - -#%% - - - -#%% - - - -#%% md - -# Aggregation Stats -------- - -#%% - - - -#%% md - -# Use Cases ---------- - -#%% md - -## Fetch all samples per Variant - -1. choose one variant -2. get samples -3. go to catalog - -#%% md - -**Situation:** I am interested in getting a list of all participants in the study, that have: -(A) SNVs in NOD2 gene that have MAF of <0.01 in gnomad_NFE AND are missense, start_lost, stop_gained, or stop_lost -split by hets and homs. - -- How I can submit this query but instead of NOD2, for a list of 10 genes (example list: IL3, IL31, IL32, IL34, IL6, IL6R, IL10RA, IL10RB, IL7, IL7R) to the openCGA server - -#%% - -# Define the parameters of the variants we want to query - -genes = ['NOD2','IL3'] -limit = 5 -type = ['SNV'] -ct = ['missense_variant','start_lost','stop_gained','stop_lost'] #List of SO consequence types, e.g. missense_variant,stop_lost or SO:0001583,SO:0001578 -populationFrequencyMaf='gnomAD:ALL<0.01' - - - -#%% - -variants = variant_client.query(study=study, gene=genes, type=type, ct=ct, - populationFrequencyMaf=populationFrequencyMaf, limit=limit) - - -variants.print_results('id') -variants. -#pprint(variants.get_result(0)) - - -#%% md - -## Sample Variant Stats - -1. Choose one random sample from catalog -2. sample stats query - -#%% diff --git a/opencga-client/src/main/python/notebooks/user-training/test_note.py b/opencga-client/src/main/python/notebooks/user-training/test_note.py deleted file mode 100644 index 7e840d9e07a..00000000000 --- a/opencga-client/src/main/python/notebooks/user-training/test_note.py +++ /dev/null @@ -1,178 +0,0 @@ -#%% md - -# *pyopencga* Basic Variant and Interpretation Usage - ------- - - -**[NOTE]** The server methods used by pyopencga client are defined in the following swagger URL: -- https://ws.opencb.org/opencga-prod/webservices - -**[NOTE]** Current implemented methods are registered at the following spreadsheet: -- https://docs.google.com/spreadsheets/d/1QpU9yl3UTneqwRqFX_WAqCiCfZBk5eU-4E3K-WVvuoc/edit?usp=sharing - -## Overview - -add here - -#%% md - -## 1. Setup the Client and Login into *pyopencga* - -**Configuration and Credentials** - -Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [001-pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)). - -You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file. - - -#%% - -from pyopencga.opencga_config import ClientConfiguration # import configuration module -from pyopencga.opencga_client import OpencgaClient # import client module -from pprint import pprint -import json - -#################################### -## Configuration parameters ####### -#################################### -# OpenCGA host -host = 'https://ws.opencb.org/opencga-prod' - -# User credentials -user = 'demouser' -passwd = 'demouser' ## you can skip this, see below. -study = 'demo@family:platinum' -#################################### - -# Creating ClientConfiguration dict -config_dict = {'rest': { - 'host': host - } - } -print('Config information:\n',config_dict) - -# Pass the config_dict dictionary to the ClientConfiguration method -config = ClientConfiguration(config_dict) - -# Create the client -oc = OpencgaClient(config) - -# Pass the credentials to the client -# (here we put only the user in order to be asked for the password interactively) -# oc.login(user) - -# or you can pass the user and passwd -oc.login(user, passwd) - - -#%% md - -Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. - - -#%% - -## Define variables to query different data models though the web services - -## Jacobo thinks better oc.variants.query.... - -variant_client = oc.variants # Variant Client -user_client = oc.users -project_client = oc.projects -study_client = oc.studies -sample_client = oc.samples -individual_client = oc.individuals -file_client = oc.files -cohort_client = oc.cohorts - - - -#%% md - -## 2. Querying Variants - -#%% md - -Let's get the variant client to query OpenCGA server - -#%% - -# Let's use corpasome study -study = 'family:corpasome' - -#%% md - -### Query variants by gene - -We can use the `.query()` server to query for variants in a specific gene: - -#%% - -# Define the gene or genes we want to query - -genes=['BRCA2'] -limit=2 - -variants = variant_client.query(study=study, gene=genes, limit=limit) # Other params: exclude='annotation' - - -variants.print_results('id') -#pprint(variants.get_result(0)) - -#%% md - -## 3. Aggegation Files - -#%% md - -## 4. Common queries - -#%% md - -### Filtering by region/gene -Which variants in cohort A are in genomic region B? - - -#%% md - - -Which variants in RD38 fall on chromosome 15 between 21,242,091 and 23,226,874bp? - -#%% - -# Perform the query -variants = variant_client.query(study=study, region='15:21242091-23226874', include='id') - -#Print the results -#variants.print_results('id') - - -#%% md - -The new function `.to_data_frame()` added in the *pyopencga* release 2.0.1.1, allows you store the results as a *pandas* dataframe object: - -#%% - -df = variants.to_data_frame() -formated_df = df.drop(['names', 'studies'], 1) -print('The results can be stored and printed as a pandas DF:\n\n', formated_df.head()) - -#%% - -oc.disease_panels. -variants = variant_client.query(study=study, chromosome=15, include='id') - -pprint(variants.get_result(0)) -#variants.print_results('id') - -#%% - -variants = variant_client.query(study=study, region='15:21242091-23226874', include='id') - -pprint(variants.get_result(4)) -#variants.print_results('id') - -#%% - - From 35d849451c680ed1b25c88e7f2f4044b0d5ac108 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 5 May 2021 12:23:11 +0200 Subject: [PATCH 274/412] analysis: add pairedChCount to Variant summary, #1693 --- .../analysis/rga/IndividualRgaConverter.java | 11 +- .../opencga/analysis/rga/RgaEngine.java | 1 - .../opencga/analysis/rga/RgaManager.java | 142 ++----------- .../opencb/opencga/analysis/rga/RgaUtils.java | 190 ++++++++++++++++-- .../analysis/rga/VariantRgaConverter.java | 2 - .../opencga/analysis/rga/RgaEngineTest.java | 3 - .../opencga/analysis/rga/RgaManagerTest.java | 13 ++ ...tats.java => IndividualKnockoutStats.java} | 32 ++- .../knockout/KnockoutByGeneSummary.java | 17 +- .../knockout/KnockoutByIndividualSummary.java | 8 +- .../knockout/KnockoutByVariantSummary.java | 8 +- .../{VariantStats.java => KnockoutStats.java} | 18 +- .../knockout/VariantKnockoutStats.java | 31 +++ 13 files changed, 277 insertions(+), 199 deletions(-) rename opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/{IndividualStats.java => IndividualKnockoutStats.java} (56%) rename opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/{VariantStats.java => KnockoutStats.java} (73%) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantKnockoutStats.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index ac8ad24463f..3382b243ff1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -15,7 +15,6 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.slf4j.LoggerFactory; import java.util.*; @@ -218,7 +217,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI Set individualKnockoutSet = new HashSet<>(); List variantIds = new ArrayList<>(transcript.getVariants().size()); List knockoutTypes = new ArrayList<>(transcript.getVariants().size()); - List variantKnockoutList = new ArrayList<>(transcript.getVariants().size()); + List variantSummary = new ArrayList<>(transcript.getVariants().size()); Set types = new HashSet<>(); Set consequenceTypes = new HashSet<>(); Set clinicalSignificances = new HashSet<>(); @@ -256,10 +255,10 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI } Map variantPopFreq = getPopulationFrequencies(variant); - RgaUtils.CodedFeature codedFeature = new RgaUtils.CodedFeature(variant.getId(), variant.getType().name(), - variant.getKnockoutType().name(), variantConsequenceTypes, + RgaUtils.CodedVariant codedVariant = new RgaUtils.CodedVariant(transcript.getId(), variant.getId(), + variant.getType().name(), variant.getKnockoutType().name(), variantConsequenceTypes, variantPopFreq.get(RgaUtils.THOUSAND_GENOMES_STUDY), variantPopFreq.get(RgaUtils.GNOMAD_GENOMES_STUDY)); - variantKnockoutList.add(codedFeature.getEncodedId()); + variantSummary.add(codedVariant.getEncodedId()); RgaUtils.CodedIndividual codedIndividual = new RgaUtils.CodedIndividual(individualId, variant.getType().name(), variant.getKnockoutType().name(), variantConsequenceTypes, @@ -297,7 +296,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI .setTypes(new ArrayList<>(types)) .setKnockoutTypes(knockoutTypes) .setIndividualSummary(new ArrayList<>(individualKnockoutSet)) - .setVariantSummary(variantKnockoutList) + .setVariantSummary(variantSummary) .setFilters(new ArrayList<>(filters)) .setConsequenceTypes(new ArrayList<>(consequenceTypes)) .setClinicalSignificances(new ArrayList<>(clinicalSignificances)) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index 97c5fa9bc74..1ab7ce1f7f1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -1,6 +1,5 @@ package org.opencb.opencga.analysis.rga; -import javafx.scene.paint.Stop; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrQuery; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 981c27ec14f..5f19466aa39 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -13,6 +13,7 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; +import org.opencb.opencga.analysis.rga.RgaUtils.*; import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; @@ -40,7 +41,6 @@ import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; -import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +53,7 @@ import java.util.concurrent.*; import java.util.stream.Collectors; +import static org.opencb.opencga.analysis.rga.RgaUtils.*; import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; public class RgaManager implements AutoCloseable { @@ -944,7 +945,7 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle KnockoutTypeCount bothParentsCount = new KnockoutTypeCount(auxQuery); for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { - RgaUtils.CodedIndividual codedIndividual = RgaUtils.CodedIndividual.parseEncodedId(bucket.getValue()); + CodedIndividual codedIndividual = CodedIndividual.parseEncodedId(bucket.getValue()); KnockoutTypeCount auxKnockoutType; switch (codedIndividual.getNumParents()) { case 0: @@ -962,14 +963,14 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle auxKnockoutType.processFeature(codedIndividual); } - VariantStats noParentIndividualStats = new VariantStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), + KnockoutStats noParentIndividualStats = new KnockoutStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), noParentsCount.getNumCompHetIds(), noParentsCount.getNumHetIds(), noParentsCount.getNumDelOverlapIds()); - VariantStats singleParentIndividualStats = new VariantStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), + KnockoutStats singleParentIndividualStats = new KnockoutStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), singleParentCount.getNumCompHetIds(), singleParentCount.getNumHetIds(), singleParentCount.getNumDelOverlapIds()); - VariantStats bothParentIndividualStats = new VariantStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), + KnockoutStats bothParentIndividualStats = new KnockoutStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), bothParentsCount.getNumCompHetIds(), bothParentsCount.getNumHetIds(), bothParentsCount.getNumDelOverlapIds()); - knockoutByVariantSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, + knockoutByVariantSummary.setIndividualStats(new IndividualKnockoutStats(noParentIndividualStats, singleParentIndividualStats, bothParentIndividualStats)); // 3. Get allele pairs and CT from Variant summary @@ -983,8 +984,8 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle Set currentVariantSet = new HashSet<>(); Set otherVariantSet = new HashSet<>(); for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { - RgaUtils.CodedFeature codedVariant = RgaUtils.CodedFeature.parseEncodedId(bucket.getValue()); - KnockoutVariant auxKnockoutVariant = RgaUtils.convertToKnockoutVariant(new Variant(codedVariant.getId())); + CodedVariant codedVariant = CodedVariant.parseEncodedId(bucket.getValue()); + KnockoutVariant auxKnockoutVariant = convertToKnockoutVariant(new Variant(codedVariant.getId())); auxKnockoutVariant.setKnockoutType(KnockoutVariant.KnockoutType.valueOf(codedVariant.getKnockoutType())); if (variantId.equals(auxKnockoutVariant.getId())) { @@ -1000,7 +1001,7 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle } List sequenceOntologyTermList = new ArrayList<>(sequenceOntologyTerms.size()); for (String ct : sequenceOntologyTerms) { - String ctName = RgaUtils.decode(ct); + String ctName = decode(ct); String ctId = String.format("SO:%0" + (7 - ct.length()) + "d%s", 0, ct); sequenceOntologyTermList.add(new SequenceOntologyTerm(ctId, ctName)); } @@ -1044,11 +1045,11 @@ private KnockoutByGeneSummary calculateGeneSummary(String collection, Query quer DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { - RgaUtils.CodedFeature codedFeature = RgaUtils.CodedFeature.parseEncodedId(variantBucket.getValue()); + CodedVariant codedFeature = CodedVariant.parseEncodedId(variantBucket.getValue()); knockoutTypeCount.processFeature(codedFeature); } - VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), - knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumHetIds(), + VariantKnockoutStats variantStats = new VariantKnockoutStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), + knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumPairedCompHetIds(), knockoutTypeCount.getNumHetIds(), knockoutTypeCount.getNumDelOverlapIds()); geneSummary.setVariantStats(variantStats); @@ -1062,7 +1063,7 @@ private KnockoutByGeneSummary calculateGeneSummary(String collection, Query quer KnockoutTypeCount bothParentsCount = new KnockoutTypeCount(auxQuery); for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { - RgaUtils.CodedIndividual codedIndividual = RgaUtils.CodedIndividual.parseEncodedId(bucket.getValue()); + CodedIndividual codedIndividual = CodedIndividual.parseEncodedId(bucket.getValue()); KnockoutTypeCount auxKnockoutType; switch (codedIndividual.getNumParents()) { case 0: @@ -1080,14 +1081,14 @@ private KnockoutByGeneSummary calculateGeneSummary(String collection, Query quer auxKnockoutType.processFeature(codedIndividual); } - VariantStats noParentIndividualStats = new VariantStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), + KnockoutStats noParentIndividualStats = new KnockoutStats(noParentsCount.getNumIds(), noParentsCount.getNumHomIds(), noParentsCount.getNumCompHetIds(), noParentsCount.getNumHetIds(), noParentsCount.getNumDelOverlapIds()); - VariantStats singleParentIndividualStats = new VariantStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), + KnockoutStats singleParentIndividualStats = new KnockoutStats(singleParentCount.getNumIds(), singleParentCount.getNumHomIds(), singleParentCount.getNumCompHetIds(), singleParentCount.getNumHetIds(), singleParentCount.getNumDelOverlapIds()); - VariantStats bothParentIndividualStats = new VariantStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), + KnockoutStats bothParentIndividualStats = new KnockoutStats(bothParentsCount.getNumIds(), bothParentsCount.getNumHomIds(), bothParentsCount.getNumCompHetIds(), bothParentsCount.getNumHetIds(), bothParentsCount.getNumDelOverlapIds()); - geneSummary.setIndividualStats(new IndividualStats(noParentIndividualStats, singleParentIndividualStats, + geneSummary.setIndividualStats(new IndividualKnockoutStats(noParentIndividualStats, singleParentIndividualStats, bothParentIndividualStats)); return geneSummary; @@ -1119,11 +1120,11 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(auxQuery); for (FacetField.Bucket variantBucket : facetFieldDataResult.first().getBuckets()) { - RgaUtils.CodedFeature codedFeature = RgaUtils.CodedFeature.parseEncodedId(variantBucket.getValue()); + CodedVariant codedFeature = CodedVariant.parseEncodedId(variantBucket.getValue()); knockoutTypeCount.processFeature(codedFeature); } - VariantStats variantStats = new VariantStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), - knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumHetIds(), + VariantKnockoutStats variantStats = new VariantKnockoutStats(knockoutTypeCount.getNumIds(), knockoutTypeCount.getNumHomIds(), + knockoutTypeCount.getNumCompHetIds(), knockoutTypeCount.getNumPairedCompHetIds(), knockoutTypeCount.getNumHetIds(), knockoutTypeCount.getNumDelOverlapIds()); knockoutByIndividualSummary.setVariantStats(variantStats); @@ -1152,107 +1153,6 @@ private Set getAuthorisedSamples(String study, Set sampleIds, Li return distinct.getResults().stream().map(String::valueOf).collect(Collectors.toSet()); } - private static class KnockoutTypeCount { - - private Set knockoutTypeQuery; - private List> popFreqQuery; - private Set typeQuery; - private Set consequenceTypeQuery; - - private Set ids; - private Set compHetIds; - private Set homIds; - private Set hetIds; - private Set delOverlapIds; - - public KnockoutTypeCount(Query query) throws RgaException { - knockoutTypeQuery = new HashSet<>(); - popFreqQuery = new LinkedList<>(); - typeQuery = new HashSet<>(); - consequenceTypeQuery = new HashSet<>(); - ids = new HashSet<>(); - compHetIds = new HashSet<>(); - homIds = new HashSet<>(); - hetIds = new HashSet<>(); - delOverlapIds = new HashSet<>(); - - query = ParamUtils.defaultObject(query, Query::new); - knockoutTypeQuery.addAll(query.getAsStringList(RgaQueryParams.KNOCKOUT.key())); - typeQuery.addAll(query.getAsStringList(RgaQueryParams.TYPE.key())); - consequenceTypeQuery.addAll(query.getAsStringList(RgaQueryParams.CONSEQUENCE_TYPE.key()) - .stream() - .map(VariantQueryUtils::parseConsequenceType) - .map(String::valueOf) - .collect(Collectors.toList())); - List popFreqs = query.getAsStringList(RgaQueryParams.POPULATION_FREQUENCY.key(), ";"); - if (!popFreqs.isEmpty()) { - Map> popFreqList = RgaUtils.parsePopulationFrequencyQuery(popFreqs); - for (List values : popFreqList.values()) { - popFreqQuery.add(new HashSet<>(values)); - } - } - } - - public void processFeature(RgaUtils.CodedFeature codedFeature) { - if (!knockoutTypeQuery.isEmpty() && !knockoutTypeQuery.contains(codedFeature.getKnockoutType())) { - return; - } - if (!popFreqQuery.isEmpty()) { - for (Set popFreq : popFreqQuery) { - if (codedFeature.getPopulationFrequencies().stream().noneMatch(popFreq::contains)) { - return; - } - } - } - if (!typeQuery.isEmpty() && !typeQuery.contains(codedFeature.getType())) { - return; - } - if (!consequenceTypeQuery.isEmpty() - && codedFeature.getConsequenceType().stream().noneMatch((ct) -> consequenceTypeQuery.contains(ct))) { - return; - } - - ids.add(codedFeature.getId()); - KnockoutVariant.KnockoutType knockoutType = KnockoutVariant.KnockoutType.valueOf(codedFeature.getKnockoutType()); - switch (knockoutType) { - case HOM_ALT: - homIds.add(codedFeature.getId()); - break; - case COMP_HET: - compHetIds.add(codedFeature.getId()); - break; - case HET_ALT: - hetIds.add(codedFeature.getId()); - break; - case DELETION_OVERLAP: - delOverlapIds.add(codedFeature.getId()); - break; - default: - throw new IllegalStateException("Unexpected value: " + codedFeature.getKnockoutType()); - } - } - - public int getNumIds() { - return ids.size(); - } - - public int getNumCompHetIds() { - return compHetIds.size(); - } - - public int getNumHomIds() { - return homIds.size(); - } - - public int getNumHetIds() { - return hetIds.size(); - } - - public int getNumDelOverlapIds() { - return delOverlapIds.size(); - } - } - private Preprocess individualQueryPreprocess(Study study, Query query, QueryOptions options, String token) throws RgaException, CatalogException, IOException { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index 54aa825c3de..f7cfa78523a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -5,7 +5,9 @@ import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.*; +import org.opencb.commons.datastore.core.Query; import org.opencb.opencga.analysis.rga.exceptions.RgaException; +import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.storage.core.variant.query.KeyOpValue; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; @@ -15,6 +17,7 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static org.opencb.opencga.analysis.rga.RgaDataModel.*; @@ -294,7 +297,7 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, String variantSummaryId = rgaDataModel.getVariantSummary().get(i); // Get the basic information from variant summary object try { - CodedFeature codedFeature = CodedFeature.parseEncodedId(variantSummaryId); + CodedVariant codedFeature = CodedVariant.parseEncodedId(variantSummaryId); Variant variant = new Variant(variantId); knockoutVariant = new KnockoutVariant() @@ -347,18 +350,19 @@ static KnockoutVariant convertToKnockoutVariant(Variant variant, SampleEntry sam } public static class CodedIndividual extends CodedFeature { + // id __ SNV __ COMP_HET __ VR_R __ A_J__numParents private int numParents; public CodedIndividual(String id, String type, String knockoutType, List consequenceTypeList, String thousandGenomesPopFreq, String gnomadPopFreq, int numParents) { - super(id, type, knockoutType, consequenceTypeList, thousandGenomesPopFreq, gnomadPopFreq); + super("", id, type, knockoutType, consequenceTypeList, thousandGenomesPopFreq, gnomadPopFreq); this.numParents = numParents; } public static CodedIndividual parseEncodedId(String encodedId) throws RgaException { String[] split = encodedId.split(SEPARATOR); if (split.length != 6) { - throw new RgaException("Unexpected variant string received '" + encodedId + throw new RgaException("Unexpected individual string received '" + encodedId + "'. Expected {id}__{type}__{knockoutType}__{conseqType}__{popFreqs}__{numParents}"); } @@ -380,16 +384,45 @@ public int getNumParents() { } } - public static class CodedFeature { - // id __ SNV __ COMP_HET __ VR_R __ A_J + public static class CodedVariant extends CodedFeature { + // transcriptId__id __ SNV __ COMP_HET __ VR_R __ A_J + + public CodedVariant(String transcriptId, String id, String type, String knockoutType, List consequenceTypeList, + String thousandGenomesPopFreq, String gnomadPopFreq) { + super(transcriptId, id, type, knockoutType, consequenceTypeList, thousandGenomesPopFreq, gnomadPopFreq); + } + + public static CodedVariant parseEncodedId(String encodedId) throws RgaException { + String[] split = encodedId.split(SEPARATOR); + if (split.length != 6) { + throw new RgaException("Unexpected variant string received '" + encodedId + + "'. Expected {transcriptId}__{id}__{type}__{knockoutType}__{conseqType}__{popFreqs}"); + } + + Set consequenceType = new HashSet<>(Arrays.asList(split[4].split(INNER_SEPARATOR))); + String[] popFreqs = split[5].split(INNER_SEPARATOR); + + return new CodedVariant(split[0], split[1], split[2], split[3], new ArrayList<>(consequenceType), popFreqs[0], popFreqs[1]); + } + + public String getEncodedId() { + return getTranscriptId() + SEPARATOR + getId() + SEPARATOR + getType() + SEPARATOR + getKnockoutType() + SEPARATOR + + StringUtils.join(getConsequenceType(), INNER_SEPARATOR) + SEPARATOR + + StringUtils.join(getPopulationFrequencies(), INNER_SEPARATOR); + } + } + + public static abstract class CodedFeature { + private String transcriptId; private String id; private String type; private String knockoutType; private List populationFrequencies; private Set consequenceType; - public CodedFeature(String id, String type, String knockoutType, List consequenceTypeList, + public CodedFeature(String transcriptId, String id, String type, String knockoutType, List consequenceTypeList, String thousandGenomesPopFreq, String gnomadPopFreq) { + this.transcriptId = transcriptId; this.id = id; this.type = type; this.knockoutType = knockoutType; @@ -400,22 +433,8 @@ public CodedFeature(String id, String type, String knockoutType, List co this.populationFrequencies = Arrays.asList(thousandGenomesPopFreq, gnomadPopFreq); } - public static CodedFeature parseEncodedId(String encodedId) throws RgaException { - String[] split = encodedId.split(SEPARATOR); - if (split.length != 5) { - throw new RgaException("Unexpected variant string received '" + encodedId - + "'. Expected {id}__{type}__{knockoutType}__{conseqType}__{popFreqs}"); - } - - Set consequenceType = new HashSet<>(Arrays.asList(split[3].split(INNER_SEPARATOR))); - String[] popFreqs = split[4].split(INNER_SEPARATOR); - - return new CodedFeature(split[0], split[1], split[2], new ArrayList<>(consequenceType), popFreqs[0], popFreqs[1]); - } - - public String getEncodedId() { - return id + SEPARATOR + type + SEPARATOR + knockoutType + SEPARATOR + StringUtils.join(consequenceType, INNER_SEPARATOR) - + SEPARATOR + StringUtils.join(populationFrequencies, INNER_SEPARATOR); + public String getTranscriptId() { + return transcriptId; } public String getId() { @@ -439,4 +458,131 @@ public List getPopulationFrequencies() { } } + public static class KnockoutTypeCount { + + private Set knockoutTypeQuery; + private List> popFreqQuery; + private Set typeQuery; + private Set consequenceTypeQuery; + + private Set ids; + private Map> transcriptCompHetIdsMap; + private Set homIds; + private Set hetIds; + private Set delOverlapIds; + + public KnockoutTypeCount(Query query) throws RgaException { + knockoutTypeQuery = new HashSet<>(); + popFreqQuery = new LinkedList<>(); + typeQuery = new HashSet<>(); + consequenceTypeQuery = new HashSet<>(); + ids = new HashSet<>(); + transcriptCompHetIdsMap = new HashMap<>(); + homIds = new HashSet<>(); + hetIds = new HashSet<>(); + delOverlapIds = new HashSet<>(); + + query = ParamUtils.defaultObject(query, Query::new); + knockoutTypeQuery.addAll(query.getAsStringList(RgaQueryParams.KNOCKOUT.key())); + typeQuery.addAll(query.getAsStringList(RgaQueryParams.TYPE.key())); + consequenceTypeQuery.addAll(query.getAsStringList(RgaQueryParams.CONSEQUENCE_TYPE.key()) + .stream() + .map(VariantQueryUtils::parseConsequenceType) + .map(String::valueOf) + .collect(Collectors.toList())); + List popFreqs = query.getAsStringList(RgaQueryParams.POPULATION_FREQUENCY.key(), ";"); + if (!popFreqs.isEmpty()) { + Map> popFreqList = RgaUtils.parsePopulationFrequencyQuery(popFreqs); + for (List values : popFreqList.values()) { + popFreqQuery.add(new HashSet<>(values)); + } + } + } + + public void processFeature(RgaUtils.CodedFeature codedFeature) { + if (!knockoutTypeQuery.isEmpty() && !knockoutTypeQuery.contains(codedFeature.getKnockoutType())) { + return; + } + if (!popFreqQuery.isEmpty()) { + for (Set popFreq : popFreqQuery) { + if (codedFeature.getPopulationFrequencies().stream().noneMatch(popFreq::contains)) { + return; + } + } + } + if (!typeQuery.isEmpty() && !typeQuery.contains(codedFeature.getType())) { + return; + } + if (!consequenceTypeQuery.isEmpty() + && codedFeature.getConsequenceType().stream().noneMatch((ct) -> consequenceTypeQuery.contains(ct))) { + return; + } + + ids.add(codedFeature.getId()); + KnockoutVariant.KnockoutType knockoutType = KnockoutVariant.KnockoutType.valueOf(codedFeature.getKnockoutType()); + switch (knockoutType) { + case HOM_ALT: + homIds.add(codedFeature.getId()); + break; + case COMP_HET: + if (!transcriptCompHetIdsMap.containsKey(codedFeature.getTranscriptId())) { + transcriptCompHetIdsMap.put(codedFeature.getTranscriptId(), new HashSet<>()); + } + transcriptCompHetIdsMap.get(codedFeature.getTranscriptId()).add(codedFeature.getId()); + break; + case HET_ALT: + hetIds.add(codedFeature.getId()); + break; + case DELETION_OVERLAP: + delOverlapIds.add(codedFeature.getId()); + break; + default: + throw new IllegalStateException("Unexpected value: " + codedFeature.getKnockoutType()); + } + } + + public int getNumIds() { + return ids.size(); + } + + public int getNumCompHetIds() { + return (int) transcriptCompHetIdsMap.values().stream().flatMap(Set::stream).distinct().count(); + } + + public int getNumPairedCompHetIds() { + Set chPairs = new HashSet<>(); + for (Set chSet : transcriptCompHetIdsMap.values()) { + if (chSet.size() > 1) { + ArrayList chList = new ArrayList<>(chSet); + for (int i = 0; i < chList.size() - 1; i++) { + for (int j = i + 1; j < chList.size(); j++) { + String variant1 = chList.get(i); + String variant2 = chList.get(j); + if (variant2.compareTo(variant1) < 0) { + // Invert positions + String aux = variant1; + variant1 = variant2; + variant2 = aux; + } + chPairs.add(variant1 + "-" + variant2); + } + } + } + } + return chPairs.size(); + } + + public int getNumHomIds() { + return homIds.size(); + } + + public int getNumHetIds() { + return hetIds.size(); + } + + public int getNumDelOverlapIds() { + return delOverlapIds.size(); + } + } + } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java index 31da85726f8..9b1912c1957 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java @@ -1,9 +1,7 @@ package org.opencb.opencga.analysis.rga; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.Variant; -import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java index ca84f902248..5bb719af294 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java @@ -12,17 +12,14 @@ import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.models.analysis.knockout.*; -import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.StorageEngineFactory; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static org.junit.Assert.*; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 669884e1886..7c2bbb8762f 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -422,6 +422,19 @@ public void testGeneSummary() throws CatalogException, IOException, RgaException assertTrue(gene.getIndividualStats().getNumCompHet() > 0 || gene.getIndividualStats().getNumDelOverlap() > 0 || gene.getIndividualStats().getNumHetAlt() > 0 || gene.getIndividualStats().getNumHomAlt() > 0); } + + result = rgaManager.geneSummary(STUDY, new Query(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET), QueryOptions.empty(), ownerToken); + assertEquals(2, result.getNumResults()); + for (KnockoutByGeneSummary gene : result.getResults()) { + assertNotNull(gene.getId()); + assertNotNull(gene.getVariantStats()); + assertTrue(gene.getVariantStats().getCount() > 0); + assertTrue(gene.getVariantStats().getNumCompHet() > 0); + assertTrue(gene.getVariantStats().getNumPairedCompHet() > 0); + assertNotNull(gene.getIndividualStats()); + assertTrue(gene.getIndividualStats().getCount() > 0); + assertTrue(gene.getIndividualStats().getNumCompHet() > 0); + } } @Test diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualStats.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualKnockoutStats.java similarity index 56% rename from opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualStats.java rename to opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualKnockoutStats.java index 5a8523187b0..790791af4e8 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualStats.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/IndividualKnockoutStats.java @@ -1,15 +1,15 @@ package org.opencb.opencga.core.models.analysis.knockout; -public class IndividualStats extends VariantStats { +public class IndividualKnockoutStats extends KnockoutStats { - private VariantStats missingParents; - private VariantStats singleParent; - private VariantStats bothParents; + private KnockoutStats missingParents; + private KnockoutStats singleParent; + private KnockoutStats bothParents; - public IndividualStats() { + public IndividualKnockoutStats() { } - public IndividualStats(VariantStats missingParents, VariantStats singleParent, VariantStats bothParents) { + public IndividualKnockoutStats(KnockoutStats missingParents, KnockoutStats singleParent, KnockoutStats bothParents) { super(missingParents.getCount() + singleParent.getCount() + bothParents.getCount(), missingParents.getNumHomAlt() + singleParent.getNumHomAlt() + bothParents.getNumHomAlt(), missingParents.getNumCompHet() + singleParent.getNumCompHet() + bothParents.getNumCompHet(), @@ -20,14 +20,6 @@ public IndividualStats(VariantStats missingParents, VariantStats singleParent, V this.bothParents = bothParents; } - public IndividualStats(int count, int numHomAlt, int numCompHet, int numHetAlt, int numDelOverlap, VariantStats missingParents, - VariantStats singleParent, VariantStats bothParents) { - super(count, numHomAlt, numCompHet, numHetAlt, numDelOverlap); - this.missingParents = missingParents; - this.singleParent = singleParent; - this.bothParents = bothParents; - } - @Override public String toString() { final StringBuilder sb = new StringBuilder("IndividualStats{"); @@ -38,29 +30,29 @@ public String toString() { return sb.toString(); } - public VariantStats getMissingParents() { + public KnockoutStats getMissingParents() { return missingParents; } - public IndividualStats setMissingParents(VariantStats missingParents) { + public IndividualKnockoutStats setMissingParents(KnockoutStats missingParents) { this.missingParents = missingParents; return this; } - public VariantStats getSingleParent() { + public KnockoutStats getSingleParent() { return singleParent; } - public IndividualStats setSingleParent(VariantStats singleParent) { + public IndividualKnockoutStats setSingleParent(KnockoutStats singleParent) { this.singleParent = singleParent; return this; } - public VariantStats getBothParents() { + public KnockoutStats getBothParents() { return bothParents; } - public IndividualStats setBothParents(VariantStats bothParents) { + public IndividualKnockoutStats setBothParents(KnockoutStats bothParents) { this.bothParents = bothParents; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGeneSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGeneSummary.java index 24ff321c390..fff6a493576 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGeneSummary.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGeneSummary.java @@ -1,5 +1,8 @@ package org.opencb.opencga.core.models.analysis.knockout; +import java.util.Map; +import java.util.Set; + public class KnockoutByGeneSummary { private String id; @@ -10,14 +13,14 @@ public class KnockoutByGeneSummary { private String strand; private String biotype; - private IndividualStats individualStats; - private VariantStats variantStats; + private IndividualKnockoutStats individualStats; + private VariantKnockoutStats variantStats; public KnockoutByGeneSummary() { } public KnockoutByGeneSummary(String id, String name, String chromosome, int start, int end, String strand, String biotype, - IndividualStats individualStats, VariantStats variantStats) { + IndividualKnockoutStats individualStats, VariantKnockoutStats variantStats) { this.id = id; this.name = name; this.chromosome = chromosome; @@ -108,20 +111,20 @@ public KnockoutByGeneSummary setBiotype(String biotype) { return this; } - public IndividualStats getIndividualStats() { + public IndividualKnockoutStats getIndividualStats() { return individualStats; } - public KnockoutByGeneSummary setIndividualStats(IndividualStats individualStats) { + public KnockoutByGeneSummary setIndividualStats(IndividualKnockoutStats individualStats) { this.individualStats = individualStats; return this; } - public VariantStats getVariantStats() { + public VariantKnockoutStats getVariantStats() { return variantStats; } - public KnockoutByGeneSummary setVariantStats(VariantStats variantStats) { + public KnockoutByGeneSummary setVariantStats(VariantKnockoutStats variantStats) { this.variantStats = variantStats; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java index cba3bffedda..a7cceb06c9e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividualSummary.java @@ -22,7 +22,7 @@ public class KnockoutByIndividualSummary { private int numParents; private List genes; - private VariantStats variantStats; + private VariantKnockoutStats variantStats; public KnockoutByIndividualSummary() { } @@ -36,7 +36,7 @@ public KnockoutByIndividualSummary(KnockoutByIndividual knockoutByIndividual) { public KnockoutByIndividualSummary(String id, String sampleId, String motherId, String motherSampleId, String fatherId, String fatherSampleId, IndividualProperty.Sex sex, List phenotypes, - List disorders, List genes, VariantStats variantStats) { + List disorders, List genes, VariantKnockoutStats variantStats) { this.id = id; this.sampleId = sampleId; this.motherId = motherId; @@ -166,11 +166,11 @@ public KnockoutByIndividualSummary setGenes(List genes) { return this; } - public VariantStats getVariantStats() { + public VariantKnockoutStats getVariantStats() { return variantStats; } - public KnockoutByIndividualSummary setVariantStats(VariantStats variantStats) { + public KnockoutByIndividualSummary setVariantStats(VariantKnockoutStats variantStats) { this.variantStats = variantStats; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java index 8c65a0c39fd..7557dbe617f 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java @@ -25,7 +25,7 @@ public class KnockoutByVariantSummary { private List clinicalSignificances; private List allelePairs; - private IndividualStats individualStats; + private IndividualKnockoutStats individualStats; public KnockoutByVariantSummary() { } @@ -33,7 +33,7 @@ public KnockoutByVariantSummary() { public KnockoutByVariantSummary(String id, String dbSnp, String chromosome, int start, int end, int length, String reference, String alternate, VariantType type, List genes, List populationFrequencies, List sequenceOntologyTerms, List clinicalSignificances, - List allelePairs, IndividualStats individualStats) { + List allelePairs, IndividualKnockoutStats individualStats) { this.id = id; this.dbSnp = dbSnp; this.chromosome = chromosome; @@ -199,11 +199,11 @@ public KnockoutByVariantSummary setAllelePairs(List allelePairs return this; } - public IndividualStats getIndividualStats() { + public IndividualKnockoutStats getIndividualStats() { return individualStats; } - public KnockoutByVariantSummary setIndividualStats(IndividualStats individualStats) { + public KnockoutByVariantSummary setIndividualStats(IndividualKnockoutStats individualStats) { this.individualStats = individualStats; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantStats.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutStats.java similarity index 73% rename from opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantStats.java rename to opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutStats.java index 4ceaaa1994f..ebbd563f6f6 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantStats.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutStats.java @@ -1,6 +1,6 @@ package org.opencb.opencga.core.models.analysis.knockout; -public class VariantStats { +public class KnockoutStats { private int count; private int numHomAlt; @@ -8,10 +8,10 @@ public class VariantStats { private int numHetAlt; private int numDelOverlap; - public VariantStats() { + public KnockoutStats() { } - public VariantStats(int count, int numHomAlt, int numCompHet, int numHetAlt, int numDelOverlap) { + public KnockoutStats(int count, int numHomAlt, int numCompHet, int numHetAlt, int numDelOverlap) { this.count = count; this.numHomAlt = numHomAlt; this.numCompHet = numCompHet; @@ -21,7 +21,7 @@ public VariantStats(int count, int numHomAlt, int numCompHet, int numHetAlt, int @Override public String toString() { - final StringBuilder sb = new StringBuilder("VariantStats{"); + final StringBuilder sb = new StringBuilder("KnockoutStats{"); sb.append("count=").append(count); sb.append(", numHomAlt=").append(numHomAlt); sb.append(", numCompHet=").append(numCompHet); @@ -35,7 +35,7 @@ public int getCount() { return count; } - public VariantStats setCount(int count) { + public KnockoutStats setCount(int count) { this.count = count; return this; } @@ -44,7 +44,7 @@ public int getNumHomAlt() { return numHomAlt; } - public VariantStats setNumHomAlt(int numHomAlt) { + public KnockoutStats setNumHomAlt(int numHomAlt) { this.numHomAlt = numHomAlt; return this; } @@ -53,7 +53,7 @@ public int getNumCompHet() { return numCompHet; } - public VariantStats setNumCompHet(int numCompHet) { + public KnockoutStats setNumCompHet(int numCompHet) { this.numCompHet = numCompHet; return this; } @@ -62,7 +62,7 @@ public int getNumHetAlt() { return numHetAlt; } - public VariantStats setNumHetAlt(int numHetAlt) { + public KnockoutStats setNumHetAlt(int numHetAlt) { this.numHetAlt = numHetAlt; return this; } @@ -71,7 +71,7 @@ public int getNumDelOverlap() { return numDelOverlap; } - public VariantStats setNumDelOverlap(int numDelOverlap) { + public KnockoutStats setNumDelOverlap(int numDelOverlap) { this.numDelOverlap = numDelOverlap; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantKnockoutStats.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantKnockoutStats.java new file mode 100644 index 00000000000..7757869d318 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/VariantKnockoutStats.java @@ -0,0 +1,31 @@ +package org.opencb.opencga.core.models.analysis.knockout; + +public class VariantKnockoutStats extends KnockoutStats { + + private int numPairedCompHet; + + public VariantKnockoutStats() { + } + + public VariantKnockoutStats(int count, int numHomAlt, int numCompHet, int numPairedCompHet, int numHetAlt, int numDelOverlap) { + super(count, numHomAlt, numCompHet, numHetAlt, numDelOverlap); + this.numPairedCompHet = numPairedCompHet; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("VariantKnockoutStats{"); + sb.append("numPairedCompHet=").append(numPairedCompHet); + sb.append('}'); + return sb.toString(); + } + + public int getNumPairedCompHet() { + return numPairedCompHet; + } + + public VariantKnockoutStats setNumPairedCompHet(int numPairedCompHet) { + this.numPairedCompHet = numPairedCompHet; + return this; + } +} From 75775296d9958c3f91561522d6fda821a3d77c33 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 5 May 2021 15:35:45 +0200 Subject: [PATCH 275/412] analysis: sort methods from RgaManager --- .../opencga/analysis/rga/RgaManager.java | 629 +++++++++--------- 1 file changed, 316 insertions(+), 313 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 5f19466aa39..3276bac86c1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -13,7 +13,9 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; -import org.opencb.opencga.analysis.rga.RgaUtils.*; +import org.opencb.opencga.analysis.rga.RgaUtils.CodedIndividual; +import org.opencb.opencga.analysis.rga.RgaUtils.CodedVariant; +import org.opencb.opencga.analysis.rga.RgaUtils.KnockoutTypeCount; import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; @@ -53,7 +55,8 @@ import java.util.concurrent.*; import java.util.stream.Collectors; -import static org.opencb.opencga.analysis.rga.RgaUtils.*; +import static org.opencb.opencga.analysis.rga.RgaUtils.convertToKnockoutVariant; +import static org.opencb.opencga.analysis.rga.RgaUtils.decode; import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; public class RgaManager implements AutoCloseable { @@ -113,6 +116,208 @@ public RgaManager(Configuration configuration, StorageConfiguration storageConfi this.logger = LoggerFactory.getLogger(getClass()); } + // Data load + + public void index(String studyStr, String fileStr, String token) throws CatalogException, RgaException, IOException { + File file = catalogManager.getFileManager().get(studyStr, fileStr, FileManager.INCLUDE_FILE_URI_PATH, token).first(); + Path filePath = Paths.get(file.getUri()); + index(studyStr, filePath, token); + } + + public void index(String studyStr, Path file, String token) throws CatalogException, IOException, RgaException { + String userId = catalogManager.getUserManager().getUserId(token); + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + try { + catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); + } catch (CatalogException e) { + logger.error(e.getMessage(), e); + throw new CatalogException("Only owners or admins can index", e.getCause()); + } + + load(study.getFqn(), file, token); + } + + /** + * Load a multi KnockoutByIndividual JSON file into the Solr core/collection. + * + * @param path Path to the JSON file + * @param path Path to the JSON file + * @param path Path to the JSON file + * @param path Path to the JSON file + * @throws IOException + * @throws SolrException + */ + private void load(String study, Path path, String token) throws IOException, RgaException { + String fileName = path.getFileName().toString(); + if (fileName.endsWith("json") || fileName.endsWith("json.gz")) { + String collection = getCollectionName(study); + + try { + if (!rgaEngine.exists(collection)) { + rgaEngine.create(collection); + } + } catch (RgaException e) { + logger.error("Could not perform RGA index in collection {}", collection, e); + throw new RgaException("Could not perform RGA index in collection '" + collection + "'."); + } + + try { + IOConnectorProvider ioConnectorProvider = new IOConnectorProvider(storageConfiguration); + + // This opens json and json.gz files automatically + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( + ioConnectorProvider.newInputStream(path.toUri())))) { + + List knockoutByIndividualList = new ArrayList<>(KNOCKOUT_INSERT_BATCH_SIZE); + int count = 0; + String line; + ObjectReader objectReader = new ObjectMapper().readerFor(KnockoutByIndividual.class); + while ((line = bufferedReader.readLine()) != null) { + KnockoutByIndividual knockoutByIndividual = objectReader.readValue(line); + knockoutByIndividualList.add(knockoutByIndividual); + count++; + if (count % KNOCKOUT_INSERT_BATCH_SIZE == 0) { + List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); + rgaEngine.insert(collection, rgaDataModelList); + logger.debug("Loaded {} knockoutByIndividual entries from '{}'", count, path); + + // Update RGA Index status + try { + updateRgaInternalIndexStatus(study, knockoutByIndividualList.stream() + .map(KnockoutByIndividual::getSampleId).collect(Collectors.toList()), + RgaIndex.Status.INDEXED, token); + logger.debug("Updated sample RGA index statuses"); + } catch (CatalogException e) { + logger.warn("Sample RGA index status could not be updated: {}", e.getMessage(), e); + } + + knockoutByIndividualList.clear(); + } + } + + // Insert the remaining entries + if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { + List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); + rgaEngine.insert(collection, rgaDataModelList); + logger.debug("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); + + // Update RGA Index status + try { + updateRgaInternalIndexStatus(study, knockoutByIndividualList.stream() + .map(KnockoutByIndividual::getSampleId).collect(Collectors.toList()), + RgaIndex.Status.INDEXED, token); + logger.debug("Updated sample RGA index statuses"); + } catch (CatalogException e) { + logger.warn("Sample RGA index status could not be updated: {}", e.getMessage(), e); + } + + } + } + } catch (SolrServerException e) { + throw new RgaException("Error loading KnockoutIndividual from JSON file.", e); + } + } else { + throw new RgaException("File format " + path + " not supported. Please, use JSON file format."); + } + } + + public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List sampleIds, RgaIndex.Status status, + String token) throws CatalogException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String userId = catalogManager.getUserManager().getUserId(token); + String collection = getCollectionName(study.getFqn()); + + catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(study.getUid(), userId); + + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + int updatedSamples = 0; + + // Update samples in batches of 100 + List tmpSampleIds = new ArrayList<>(100); + + RgaIndex rgaIndex = new RgaIndex(status, TimeUtils.getTime()); + for (String sampleId : sampleIds) { + tmpSampleIds.add(sampleId); + if (tmpSampleIds.size() == 100) { + OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), tmpSampleIds, rgaIndex, + token); + updatedSamples += update.getNumUpdated(); + + tmpSampleIds = new ArrayList<>(100); + } + } + + if (!tmpSampleIds.isEmpty()) { + // Update last batch + OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), tmpSampleIds, rgaIndex, + token); + updatedSamples += update.getNumUpdated(); + } + + stopWatch.stop(); + return new OpenCGAResult<>((int) stopWatch.getTime(TimeUnit.MILLISECONDS), null, sampleIds.size(), 0, updatedSamples, 0); + } + + public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, String token) + throws CatalogException, IOException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String userId = catalogManager.getUserManager().getUserId(token); + String collection = getCollectionName(study.getFqn()); + + catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(study.getUid(), userId); + + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + QueryOptions facetOptions = new QueryOptions() + .append(QueryOptions.FACET, RgaDataModel.SAMPLE_ID) + .append(QueryOptions.LIMIT, -1); + DataResult result = rgaEngine.facetedQuery(collection, new Query(), facetOptions); + + int totalSamples = result.first().getBuckets().size(); + int updatedSamples = 0; + + // Before doing anything, we first reset all the sample rga indexes + OpenCGAResult resetResult = catalogManager.getSampleManager().resetRgaIndexes(studyStr, token); + logger.debug("Resetting RGA indexes for " + resetResult.getNumMatches() + " samples took " + resetResult.getTime() + " ms."); + + // Update samples in batches of 100 + List sampleIds = new ArrayList<>(100); + + RgaIndex rgaIndex = new RgaIndex(RgaIndex.Status.INDEXED, TimeUtils.getTime()); + for (FacetField.Bucket bucket : result.first().getBuckets()) { + sampleIds.add(bucket.getValue()); + if (sampleIds.size() == 100) { + OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), sampleIds, rgaIndex, + token); + updatedSamples += update.getNumUpdated(); + + sampleIds = new ArrayList<>(100); + } + } + + if (!sampleIds.isEmpty()) { + // Update last batch + OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), sampleIds, rgaIndex, token); + updatedSamples += update.getNumUpdated(); + } + + stopWatch.stop(); + return new OpenCGAResult<>((int) stopWatch.getTime(TimeUnit.MILLISECONDS), null, totalSamples, 0, updatedSamples, 0); + } + + // Queries + public OpenCGAResult individualQuery(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); @@ -483,141 +688,6 @@ public OpenCGAResult variantQuery(String studyStr, Query quer } } - private VariantDBIterator variantStorageQuery(String study, List sampleIds, Query query, QueryOptions options, String token) - throws CatalogException, IOException, StorageEngineException, RgaException { - String collection = getCollectionName(study); - - List variantIds = query.getAsStringList(RgaDataModel.VARIANTS); - if (variantIds.isEmpty()) { - DataResult result = rgaEngine.facetedQuery(collection, query, - new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS).append(QueryOptions.LIMIT, -1)); - if (result.getNumResults() == 0) { - return VariantDBIterator.EMPTY_ITERATOR; - } - variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - } - - if (variantIds.size() > RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT) { - throw new RgaException("Too many variants requested"); - } - - Query variantQuery = new Query(VariantQueryParam.ID.key(), variantIds) - .append(VariantQueryParam.STUDY.key(), study); - List excludeList = new LinkedList<>(); - excludeList.add(VariantField.ANNOTATION_CYTOBAND); - excludeList.add(VariantField.ANNOTATION_CONSERVATION); - excludeList.add(VariantField.ANNOTATION_DRUGS); - excludeList.add(VariantField.ANNOTATION_GENE_EXPRESSION); - - if (!sampleIds.isEmpty()) { - variantQuery.append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleIds) - .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); - } else { - excludeList.add(VariantField.STUDIES_SAMPLES); - excludeList.add(VariantField.STUDIES_SAMPLE_DATA_KEYS); - excludeList.add(VariantField.STUDIES_FILES); - } - - QueryOptions queryOptions = new QueryOptions(QueryOptions.EXCLUDE, excludeList); - return variantStorageManager.iterator(variantQuery, queryOptions, token); - } - - public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, String token) - throws CatalogException, IOException, RgaException { - Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(token); - String collection = getCollectionName(study.getFqn()); - - catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(study.getUid(), userId); - - if (!rgaEngine.isAlive(collection)) { - throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); - } - - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - - QueryOptions facetOptions = new QueryOptions() - .append(QueryOptions.FACET, RgaDataModel.SAMPLE_ID) - .append(QueryOptions.LIMIT, -1); - DataResult result = rgaEngine.facetedQuery(collection, new Query(), facetOptions); - - int totalSamples = result.first().getBuckets().size(); - int updatedSamples = 0; - - // Before doing anything, we first reset all the sample rga indexes - OpenCGAResult resetResult = catalogManager.getSampleManager().resetRgaIndexes(studyStr, token); - logger.debug("Resetting RGA indexes for " + resetResult.getNumMatches() + " samples took " + resetResult.getTime() + " ms."); - - // Update samples in batches of 100 - List sampleIds = new ArrayList<>(100); - - RgaIndex rgaIndex = new RgaIndex(RgaIndex.Status.INDEXED, TimeUtils.getTime()); - for (FacetField.Bucket bucket : result.first().getBuckets()) { - sampleIds.add(bucket.getValue()); - if (sampleIds.size() == 100) { - OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), sampleIds, rgaIndex, - token); - updatedSamples += update.getNumUpdated(); - - sampleIds = new ArrayList<>(100); - } - } - - if (!sampleIds.isEmpty()) { - // Update last batch - OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), sampleIds, rgaIndex, token); - updatedSamples += update.getNumUpdated(); - } - - stopWatch.stop(); - return new OpenCGAResult<>((int) stopWatch.getTime(TimeUnit.MILLISECONDS), null, totalSamples, 0, updatedSamples, 0); - } - - - public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List sampleIds, RgaIndex.Status status, - String token) throws CatalogException, RgaException { - Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(token); - String collection = getCollectionName(study.getFqn()); - - catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(study.getUid(), userId); - - if (!rgaEngine.isAlive(collection)) { - throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); - } - - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - - int updatedSamples = 0; - - // Update samples in batches of 100 - List tmpSampleIds = new ArrayList<>(100); - - RgaIndex rgaIndex = new RgaIndex(status, TimeUtils.getTime()); - for (String sampleId : sampleIds) { - tmpSampleIds.add(sampleId); - if (tmpSampleIds.size() == 100) { - OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), tmpSampleIds, rgaIndex, - token); - updatedSamples += update.getNumUpdated(); - - tmpSampleIds = new ArrayList<>(100); - } - } - - if (!tmpSampleIds.isEmpty()) { - // Update last batch - OpenCGAResult update = catalogManager.getSampleManager().updateRgaIndexes(study.getFqn(), tmpSampleIds, rgaIndex, - token); - updatedSamples += update.getNumUpdated(); - } - - stopWatch.stop(); - return new OpenCGAResult<>((int) stopWatch.getTime(TimeUnit.MILLISECONDS), null, sampleIds.size(), 0, updatedSamples, 0); - } - public OpenCGAResult individualSummary(String studyStr, Query query, QueryOptions options, String token) throws RgaException, CatalogException, IOException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); @@ -794,7 +864,6 @@ public OpenCGAResult geneSummary(String studyStr, Query q return result; } - public OpenCGAResult variantSummary(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); @@ -896,23 +965,80 @@ public OpenCGAResult variantSummary(String studyStr, Q knockoutByVariantSummary.setGenes(new ArrayList<>(geneNames)); } - List knockoutByVariantSummaryList = new ArrayList<>(variantSummaryMap.values()); + List knockoutByVariantSummaryList = new ArrayList<>(variantSummaryMap.values()); + + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + logger.info("Variant summary: {} milliseconds", time); + OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), + knockoutByVariantSummaryList.size(), knockoutByVariantSummaryList, -1); + + if (queryOptions.getBoolean(QueryOptions.COUNT)) { + try { + assert numTotalResults != null; + result.setNumMatches(numTotalResults.get()); + } catch (InterruptedException | ExecutionException e) { + throw new RgaException(e.getMessage(), e); + } + } + + return result; + } + + public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) + throws CatalogException, IOException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String userId = catalogManager.getUserManager().getUserId(token); + + catalogManager.getAuthorizationManager().checkCanViewStudy(study.getUid(), userId); + + String collection = getCollectionName(study.getFqn()); + if (!rgaEngine.isAlive(collection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + ParamUtils.checkObj(fields, "Missing mandatory field 'field"); + + QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); + queryOptions.put(QueryOptions.FACET, fields); + return new OpenCGAResult<>(rgaEngine.facetedQuery(collection, query, queryOptions)); + } - int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); - logger.info("Variant summary: {} milliseconds", time); - OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), - knockoutByVariantSummaryList.size(), knockoutByVariantSummaryList, -1); + private VariantDBIterator variantStorageQuery(String study, List sampleIds, Query query, QueryOptions options, String token) + throws CatalogException, IOException, StorageEngineException, RgaException { + String collection = getCollectionName(study); - if (queryOptions.getBoolean(QueryOptions.COUNT)) { - try { - assert numTotalResults != null; - result.setNumMatches(numTotalResults.get()); - } catch (InterruptedException | ExecutionException e) { - throw new RgaException(e.getMessage(), e); + List variantIds = query.getAsStringList(RgaDataModel.VARIANTS); + if (variantIds.isEmpty()) { + DataResult result = rgaEngine.facetedQuery(collection, query, + new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS).append(QueryOptions.LIMIT, -1)); + if (result.getNumResults() == 0) { + return VariantDBIterator.EMPTY_ITERATOR; } + variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); } - return result; + if (variantIds.size() > RgaQueryParams.DEFAULT_INDIVIDUAL_LIMIT) { + throw new RgaException("Too many variants requested"); + } + + Query variantQuery = new Query(VariantQueryParam.ID.key(), variantIds) + .append(VariantQueryParam.STUDY.key(), study); + List excludeList = new LinkedList<>(); + excludeList.add(VariantField.ANNOTATION_CYTOBAND); + excludeList.add(VariantField.ANNOTATION_CONSERVATION); + excludeList.add(VariantField.ANNOTATION_DRUGS); + excludeList.add(VariantField.ANNOTATION_GENE_EXPRESSION); + + if (!sampleIds.isEmpty()) { + variantQuery.append(VariantQueryParam.INCLUDE_SAMPLE.key(), sampleIds) + .append(VariantQueryParam.INCLUDE_SAMPLE_DATA.key(), "GT,DP"); + } else { + excludeList.add(VariantField.STUDIES_SAMPLES); + excludeList.add(VariantField.STUDIES_SAMPLE_DATA_KEYS); + excludeList.add(VariantField.STUDIES_FILES); + } + + QueryOptions queryOptions = new QueryOptions(QueryOptions.EXCLUDE, excludeList); + return variantStorageManager.iterator(variantQuery, queryOptions, token); } private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String collection, Query query, String variantId) @@ -1283,8 +1409,47 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti return preprocessResult; } - private class Preprocess { + private QueryOptions setDefaultLimit(QueryOptions options) { + QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); + if (!queryOptions.containsKey(QueryOptions.LIMIT)) { + queryOptions.put(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); + } + return queryOptions; + } + + public void testConnection() throws StorageEngineException { + rgaEngine.isAlive("test"); + } + + private String getCollectionName(String study) { + return catalogManager.getConfiguration().getDatabasePrefix() + "-rga-" + study.replace("@", "_").replace(":", "_"); + } + + @Override + public void close() throws Exception { + rgaEngine.close(); + } + + private boolean includeVariants(AbstractRgaConverter converter, QueryOptions queryOptions) { + if (queryOptions.containsKey(QueryOptions.INCLUDE)) { + for (String include : converter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { + if (include.contains("variant")) { + return true; + } + } + return false; + } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { + for (String include : converter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { + if (include.contains("variant")) { + return true; + } + } + return false; + } + return true; + } + private class Preprocess { private String userId; private boolean isOwnerOrAdmin; @@ -1351,166 +1516,4 @@ public Preprocess setEvent(Event event) { return this; } } - - public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) - throws CatalogException, IOException, RgaException { - Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(token); - - catalogManager.getAuthorizationManager().checkCanViewStudy(study.getUid(), userId); - - String collection = getCollectionName(study.getFqn()); - if (!rgaEngine.isAlive(collection)) { - throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); - } - ParamUtils.checkObj(fields, "Missing mandatory field 'field"); - - QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); - queryOptions.put(QueryOptions.FACET, fields); - return new OpenCGAResult<>(rgaEngine.facetedQuery(collection, query, queryOptions)); - } - - private QueryOptions setDefaultLimit(QueryOptions options) { - QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); - if (!queryOptions.containsKey(QueryOptions.LIMIT)) { - queryOptions.put(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); - } - return queryOptions; - } - - public void index(String studyStr, String fileStr, String token) throws CatalogException, RgaException, IOException { - File file = catalogManager.getFileManager().get(studyStr, fileStr, FileManager.INCLUDE_FILE_URI_PATH, token).first(); - Path filePath = Paths.get(file.getUri()); - index(studyStr, filePath, token); - } - - public void index(String studyStr, Path file, String token) throws CatalogException, IOException, RgaException { - String userId = catalogManager.getUserManager().getUserId(token); - Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - try { - catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); - } catch (CatalogException e) { - logger.error(e.getMessage(), e); - throw new CatalogException("Only owners or admins can index", e.getCause()); - } - - load(study.getFqn(), file, token); - } - - /** - * Load a multi KnockoutByIndividual JSON file into the Solr core/collection. - * - * @param path Path to the JSON file - * @param path Path to the JSON file - * @param path Path to the JSON file - * @param path Path to the JSON file - * @throws IOException - * @throws SolrException - */ - private void load(String study, Path path, String token) throws IOException, RgaException { - String fileName = path.getFileName().toString(); - if (fileName.endsWith("json") || fileName.endsWith("json.gz")) { - String collection = getCollectionName(study); - - try { - if (!rgaEngine.exists(collection)) { - rgaEngine.create(collection); - } - } catch (RgaException e) { - logger.error("Could not perform RGA index in collection {}", collection, e); - throw new RgaException("Could not perform RGA index in collection '" + collection + "'."); - } - - try { - IOConnectorProvider ioConnectorProvider = new IOConnectorProvider(storageConfiguration); - - // This opens json and json.gz files automatically - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( - ioConnectorProvider.newInputStream(path.toUri())))) { - - List knockoutByIndividualList = new ArrayList<>(KNOCKOUT_INSERT_BATCH_SIZE); - int count = 0; - String line; - ObjectReader objectReader = new ObjectMapper().readerFor(KnockoutByIndividual.class); - while ((line = bufferedReader.readLine()) != null) { - KnockoutByIndividual knockoutByIndividual = objectReader.readValue(line); - knockoutByIndividualList.add(knockoutByIndividual); - count++; - if (count % KNOCKOUT_INSERT_BATCH_SIZE == 0) { - List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); - rgaEngine.insert(collection, rgaDataModelList); - logger.debug("Loaded {} knockoutByIndividual entries from '{}'", count, path); - - // Update RGA Index status - try { - updateRgaInternalIndexStatus(study, knockoutByIndividualList.stream() - .map(KnockoutByIndividual::getSampleId).collect(Collectors.toList()), - RgaIndex.Status.INDEXED, token); - logger.debug("Updated sample RGA index statuses"); - } catch (CatalogException e) { - logger.warn("Sample RGA index status could not be updated: {}", e.getMessage(), e); - } - - knockoutByIndividualList.clear(); - } - } - - // Insert the remaining entries - if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { - List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); - rgaEngine.insert(collection, rgaDataModelList); - logger.debug("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); - - // Update RGA Index status - try { - updateRgaInternalIndexStatus(study, knockoutByIndividualList.stream() - .map(KnockoutByIndividual::getSampleId).collect(Collectors.toList()), - RgaIndex.Status.INDEXED, token); - logger.debug("Updated sample RGA index statuses"); - } catch (CatalogException e) { - logger.warn("Sample RGA index status could not be updated: {}", e.getMessage(), e); - } - - } - } - } catch (SolrServerException e) { - throw new RgaException("Error loading KnockoutIndividual from JSON file.", e); - } - } else { - throw new RgaException("File format " + path + " not supported. Please, use JSON file format."); - } - } - - public void testConnection() throws StorageEngineException { - rgaEngine.isAlive("test"); - } - - private String getCollectionName(String study) { - return catalogManager.getConfiguration().getDatabasePrefix() + "-rga-" + study.replace("@", "_").replace(":", "_"); - } - - @Override - public void close() throws Exception { - rgaEngine.close(); - } - - private boolean includeVariants(AbstractRgaConverter converter, QueryOptions queryOptions) { - if (queryOptions.containsKey(QueryOptions.INCLUDE)) { - for (String include : converter.getIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE))) { - if (include.contains("variant")) { - return true; - } - } - return false; - } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { - for (String include : converter.getIncludeFromExcludeFields(queryOptions.getAsStringList(QueryOptions.EXCLUDE))) { - if (include.contains("variant")) { - return true; - } - } - return false; - } - return true; - } - } From fef66c61ba7219ff93bde6aed3b25341880541ef Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 5 May 2021 16:54:24 +0200 Subject: [PATCH 276/412] analysis: not process isolated CH variants, #1693 --- .../analysis/rga/IndividualRgaConverter.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 3382b243ff1..3cddff3bb9b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -180,6 +180,31 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI if (knockoutByIndividual.getGenes() != null) { for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { for (KnockoutTranscript transcript : gene.getTranscripts()) { + // Remove isolated CH variants + Set chVariants = new HashSet<>(); + for (KnockoutVariant variant : transcript.getVariants()) { + if (variant.getKnockoutType().equals(KnockoutVariant.KnockoutType.COMP_HET)) { + chVariants.add(variant.getId()); + } + } + if (chVariants.size() == 1) { + logger.warn("Transcript '{}' has single CH variant '{}'. Removing it...", transcript.getId(), chVariants); + // Remove CH variant before processing it + List knockoutVariantList = new ArrayList<>(transcript.getVariants().size() - 1); + for (KnockoutVariant variant : transcript.getVariants()) { + if (!chVariants.contains(variant.getId())) { + knockoutVariantList.add(variant); + } + } + transcript.setVariants(knockoutVariantList); + } + + if (transcript.getVariants().isEmpty()) { + // Process next transcript because this one doesn't have variants + logger.warn("Skipping transcript '{}'. No knockoutVariants found...", transcript.getId()); + continue; + } + List compoundFilters = processFilters(transcript); List phenotypes = populatePhenotypes(knockoutByIndividual.getPhenotypes()); From b8a1bd3b446a00dfe096d258cc087afbb967d4ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 6 May 2021 10:14:24 +0100 Subject: [PATCH 277/412] storage: Sync biodata model. Add proteinId --- .../DocumentToVariantAnnotationConverter.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java index 0bd508ae9f2..8e2758fec40 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java @@ -78,6 +78,7 @@ public class DocumentToVariantAnnotationConverter public static final String CT_PROTEIN_FEATURE_DESCRIPTION_FIELD = "desc"; public static final String CT_PROTEIN_UNIPROT_ACCESSION = "uni_a"; public static final String CT_PROTEIN_UNIPROT_NAME = "uni_n"; + public static final String CT_PROTEIN_ID = "p_id"; public static final String CT_PROTEIN_UNIPROT_VARIANT_ID = "uni_var"; public static final String CT_PROTEIN_FUNCTIONAL_DESCRIPTION = "desc"; @@ -280,6 +281,7 @@ public VariantAnnotation convertToDataModelType(Document object, Document custom ProteinVariantAnnotation proteinVariantAnnotation = buildProteinVariantAnnotation( getDefault(ct, CT_PROTEIN_UNIPROT_ACCESSION, (String) null), getDefault(ct, CT_PROTEIN_UNIPROT_NAME, (String) null), + getDefault(ct, CT_PROTEIN_ID, (String) null), getDefault(ct, CT_AA_POSITION_FIELD, 0), getDefault(ct, CT_AA_REFERENCE_FIELD, ""), getDefault(ct, CT_AA_ALTERNATE_FIELD, ""), @@ -532,11 +534,18 @@ private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAcc String aaReference, String aaAlternate, String uniprotVariantId, String functionalDescription, List proteinSubstitutionScores, List keywords, List features) { - if (areAllEmpty(uniprotAccession, uniprotName, aaPosition, aaReference, aaAlternate, + return buildProteinVariantAnnotation(uniprotAccession, uniprotName, uniprotAccession, aaPosition, aaReference, aaAlternate, uniprotVariantId, functionalDescription, proteinSubstitutionScores, keywords, features); + } + + private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAccession, String uniprotName, String proteinId, int aaPosition, + String aaReference, String aaAlternate, String uniprotVariantId, + String functionalDescription, List proteinSubstitutionScores, + List keywords, List features) { + if (areAllEmpty(uniprotAccession, uniprotName, proteinId, aaPosition, aaReference, aaAlternate, uniprotVariantId, proteinSubstitutionScores, keywords, features, functionalDescription)) { return null; } else { - return new ProteinVariantAnnotation(uniprotAccession, uniprotName, aaPosition, + return new ProteinVariantAnnotation(uniprotAccession, uniprotName, proteinId, aaPosition, aaReference, aaAlternate, uniprotVariantId, functionalDescription, proteinSubstitutionScores, keywords, features); } } @@ -653,6 +662,7 @@ public Document convertToStorageType(VariantAnnotation variantAnnotation) { putNotNull(ct, CT_AA_ALTERNATE_FIELD, proteinVariantAnnotation.getAlternate()); putNotNull(ct, CT_PROTEIN_UNIPROT_ACCESSION, proteinVariantAnnotation.getUniprotAccession()); putNotNull(ct, CT_PROTEIN_UNIPROT_NAME, proteinVariantAnnotation.getUniprotName()); + putNotNull(ct, CT_PROTEIN_ID, proteinVariantAnnotation.getProteinId()); putNotNull(ct, CT_PROTEIN_UNIPROT_VARIANT_ID, proteinVariantAnnotation.getUniprotVariantId()); putNotNull(ct, CT_PROTEIN_FUNCTIONAL_DESCRIPTION, proteinVariantAnnotation.getFunctionalDescription()); //Protein substitution region score From 7af6d73b10db2406f79e24017490def5aab05eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 6 May 2021 11:21:35 +0200 Subject: [PATCH 278/412] Fix checkstyle error --- .../DocumentToVariantAnnotationConverter.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java index 8e2758fec40..e7d9ace681f 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java @@ -534,13 +534,15 @@ private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAcc String aaReference, String aaAlternate, String uniprotVariantId, String functionalDescription, List proteinSubstitutionScores, List keywords, List features) { - return buildProteinVariantAnnotation(uniprotAccession, uniprotName, uniprotAccession, aaPosition, aaReference, aaAlternate, uniprotVariantId, functionalDescription, proteinSubstitutionScores, keywords, features); + return buildProteinVariantAnnotation(uniprotAccession, uniprotName, uniprotAccession, aaPosition, aaReference, aaAlternate, + uniprotVariantId, functionalDescription, proteinSubstitutionScores, keywords, features); } - private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAccession, String uniprotName, String proteinId, int aaPosition, - String aaReference, String aaAlternate, String uniprotVariantId, - String functionalDescription, List proteinSubstitutionScores, - List keywords, List features) { + private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAccession, String uniprotName, String proteinId, + int aaPosition, String aaReference, String aaAlternate, + String uniprotVariantId, String functionalDescription, + List proteinSubstitutionScores, List keywords, + List features) { if (areAllEmpty(uniprotAccession, uniprotName, proteinId, aaPosition, aaReference, aaAlternate, uniprotVariantId, proteinSubstitutionScores, keywords, features, functionalDescription)) { return null; From f15d540a665db0601d0c5f9a6ef24122a0a71bbe Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 6 May 2021 13:24:13 +0200 Subject: [PATCH 279/412] analysis: add new auxiliar RGA collection, #1693 --- .../analysis/rga/AuxiliarRgaDataModel.java | 189 ++++++ .../analysis/rga/IndividualRgaConverter.java | 7 +- .../opencga/analysis/rga/RgaDataModel.java | 1 + .../opencga/analysis/rga/RgaEngine.java | 51 +- .../opencga/analysis/rga/RgaManager.java | 330 +++++++--- .../opencga/analysis/rga/RgaQueryParams.java | 3 + .../opencga/analysis/rga/RgaQueryParser.java | 46 +- .../opencb/opencga/analysis/rga/RgaUtils.java | 46 +- .../analysis/rga/VariantRgaConverter.java | 93 ++- .../opencga/analysis/rga/RgaEngineTest.java | 2 +- .../opencga/analysis/rga/RgaManagerTest.java | 19 +- .../analysis/rga/RgaSolrExtenalResource.java | 27 +- opencga-app/app/misc/solr/install.sh | 1 + .../app/misc/solr/prepare_configsets.sh | 4 +- opencga-clinical/pom.xml | 1 + .../src/main/resources/rga/aux-managed-schema | 582 ++++++++++++++++++ 16 files changed, 1250 insertions(+), 152 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java create mode 100644 opencga-clinical/src/main/resources/rga/aux-managed-schema diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java new file mode 100644 index 00000000000..21c6d63ba09 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java @@ -0,0 +1,189 @@ +package org.opencb.opencga.analysis.rga; + +import org.apache.solr.client.solrj.beans.Field; + +import java.util.*; + +public class AuxiliarRgaDataModel { + + @Field + private String id; + + @Field + private String dbSnp; + + @Field + private String type; + + @Field + private List knockoutTypes; + + @Field + private List consequenceTypes; + + @Field(POPULATION_FREQUENCIES) + private Map populationFrequencies; + + @Field + private List clinicalSignificances; + + @Field + private List geneIds; + + @Field + private List geneNames; + + @Field + private List transcriptIds; + + public static final String ID = "id"; + public static final String DB_SNP = "dbSnp"; + public static final String TYPE = "type"; + public static final String KNOCKOUT_TYPES = "knockoutTypes"; + public static final String CONSEQUENCE_TYPES = "consequenceTypes"; + public static final String CLINICAL_SIGNIFICANCES = "clinicalSignificances"; + public static final String POPULATION_FREQUENCIES = "populationFrequencies_*"; + public static final String GENE_IDS = "geneIds"; + public static final String GENE_NAMES = "geneNames"; + public static final String TRANSCRIPT_IDS = "transcriptIds"; + + public static final Map MAIN_TO_AUXILIAR_DATA_MODEL_MAP; + + static { + MAIN_TO_AUXILIAR_DATA_MODEL_MAP = new HashMap<>(); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.VARIANTS, ID); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.DB_SNPS, DB_SNP); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.TYPES, TYPE); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.KNOCKOUT_TYPES, KNOCKOUT_TYPES); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.CONSEQUENCE_TYPES, CONSEQUENCE_TYPES); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.CLINICAL_SIGNIFICANCES, CLINICAL_SIGNIFICANCES); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.GENE_ID, GENE_IDS); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.GENE_NAME, GENE_NAMES); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.TRANSCRIPT_ID, TRANSCRIPT_IDS); + } + + public AuxiliarRgaDataModel() { + } + + public AuxiliarRgaDataModel(String id, String dbSnp, String type, List knockoutTypes, List consequenceTypes, + Map populationFrequencies, List clinicalSignificances, List geneIds, + List geneNames, List transcriptIds) { + this.id = id; + this.dbSnp = dbSnp; + this.type = type; + this.knockoutTypes = knockoutTypes; + this.consequenceTypes = consequenceTypes; + this.populationFrequencies = populationFrequencies; + this.clinicalSignificances = clinicalSignificances; + this.geneIds = geneIds; + this.geneNames = geneNames; + this.transcriptIds = transcriptIds; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("AuxiliarRgaDataModel{"); + sb.append("id='").append(id).append('\''); + sb.append(", dbSnp='").append(dbSnp).append('\''); + sb.append(", type='").append(type).append('\''); + sb.append(", knockoutTypes=").append(knockoutTypes); + sb.append(", consequenceTypes=").append(consequenceTypes); + sb.append(", populationFrequencies=").append(populationFrequencies); + sb.append(", clinicalSignificances=").append(clinicalSignificances); + sb.append(", geneIds=").append(geneIds); + sb.append(", geneNames=").append(geneNames); + sb.append(", transcriptIds=").append(transcriptIds); + sb.append('}'); + return sb.toString(); + } + + public String getId() { + return id; + } + + public AuxiliarRgaDataModel setId(String id) { + this.id = id; + return this; + } + + public String getDbSnp() { + return dbSnp; + } + + public AuxiliarRgaDataModel setDbSnp(String dbSnp) { + this.dbSnp = dbSnp; + return this; + } + + public String getType() { + return type; + } + + public AuxiliarRgaDataModel setType(String type) { + this.type = type; + return this; + } + + public List getKnockoutTypes() { + return knockoutTypes; + } + + public AuxiliarRgaDataModel setKnockoutTypes(List knockoutTypes) { + this.knockoutTypes = knockoutTypes; + return this; + } + + public List getConsequenceTypes() { + return consequenceTypes; + } + + public AuxiliarRgaDataModel setConsequenceTypes(List consequenceTypes) { + this.consequenceTypes = consequenceTypes; + return this; + } + + public Map getPopulationFrequencies() { + return populationFrequencies; + } + + public AuxiliarRgaDataModel setPopulationFrequencies(Map populationFrequencies) { + this.populationFrequencies = populationFrequencies; + return this; + } + + public List getClinicalSignificances() { + return clinicalSignificances; + } + + public AuxiliarRgaDataModel setClinicalSignificances(List clinicalSignificances) { + this.clinicalSignificances = clinicalSignificances; + return this; + } + + public List getGeneIds() { + return geneIds; + } + + public AuxiliarRgaDataModel setGeneIds(List geneIds) { + this.geneIds = geneIds; + return this; + } + + public List getGeneNames() { + return geneNames; + } + + public AuxiliarRgaDataModel setGeneNames(List geneNames) { + this.geneNames = geneNames; + return this; + } + + public List getTranscriptIds() { + return transcriptIds; + } + + public AuxiliarRgaDataModel setTranscriptIds(List transcriptIds) { + this.transcriptIds = transcriptIds; + return this; + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 3cddff3bb9b..149e09a89bc 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -267,12 +267,14 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI } consequenceTypes.addAll(variantConsequenceTypes); + Set auxClinicalSignificances = new HashSet<>(); if (variant.getClinicalSignificance() != null) { for (ClinicalSignificance clinicalSignificance : variant.getClinicalSignificance()) { if (clinicalSignificance != null) { - clinicalSignificances.add(clinicalSignificance.name()); + auxClinicalSignificances.add(clinicalSignificance.name()); } } + clinicalSignificances.addAll(auxClinicalSignificances); } if (StringUtils.isNotEmpty(variant.getFilter())) { @@ -281,7 +283,8 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI Map variantPopFreq = getPopulationFrequencies(variant); RgaUtils.CodedVariant codedVariant = new RgaUtils.CodedVariant(transcript.getId(), variant.getId(), - variant.getType().name(), variant.getKnockoutType().name(), variantConsequenceTypes, + variant.getDbSnp(), variant.getType().name(), variant.getKnockoutType().name(), + new ArrayList<>(auxClinicalSignificances), variantConsequenceTypes, variantPopFreq.get(RgaUtils.THOUSAND_GENOMES_STUDY), variantPopFreq.get(RgaUtils.GNOMAD_GENOMES_STUDY)); variantSummary.add(codedVariant.getEncodedId()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java index 1942e5f9ce6..5a4062bce3d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java @@ -130,6 +130,7 @@ public class RgaDataModel { public static final String TRANSCRIPT_ID = "transcriptId"; public static final String TRANSCRIPT_BIOTYPE = "transcriptBiotype"; public static final String VARIANTS = "variants"; + public static final String DB_SNPS = "dbSnps"; public static final String TYPES = "types"; public static final String KNOCKOUT_TYPES = "knockoutTypes"; public static final String FILTERS = "filters"; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index 1ab7ce1f7f1..91051170175 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -59,7 +59,7 @@ public boolean isAlive(String collection) { return solrManager.isAlive(collection); } - public void create(String dbName) throws RgaException { + public void createMainCollection(String dbName) throws RgaException { try { solrManager.create(dbName, this.storageConfiguration.getRga().getConfigSet()); } catch (SolrException e) { @@ -67,6 +67,14 @@ public void create(String dbName) throws RgaException { } } + public void createAuxCollection(String dbName) throws RgaException { + try { + solrManager.create(dbName, this.storageConfiguration.getRga().getConfigSet().replace("-rga-", "-rga-aux-")); + } catch (SolrException e) { + throw new RgaException("Error creating Solr collection '" + dbName + "'", e); + } + } + public void create(String dbName, String configSet) throws RgaException { try { solrManager.create(dbName, configSet); @@ -104,14 +112,14 @@ public boolean existsCollection(String collectionName) throws RgaException { * Insert a list of RGA models into the given Solr collection. * * @param collection Solr collection where to insert - * @param rgaDataModelList List of RgaDataModel to insert + * @param rgaModelList List of RGA models to insert * @throws IOException IOException * @throws SolrServerException SolrServerException */ - public void insert(String collection, List rgaDataModelList) throws IOException, SolrServerException { - if (CollectionUtils.isNotEmpty(rgaDataModelList)) { + public void insert(String collection, List rgaModelList) throws IOException, SolrServerException { + if (CollectionUtils.isNotEmpty(rgaModelList)) { UpdateResponse updateResponse; - updateResponse = solrManager.getSolrClient().addBeans(collection, rgaDataModelList); + updateResponse = solrManager.getSolrClient().addBeans(collection, rgaModelList); if (updateResponse.getStatus() == 0) { solrManager.getSolrClient().commit(collection); } @@ -236,7 +244,24 @@ public long count(String collection, Query query) throws RgaException, IOExcepti } /** - * Return faceted data from a Solr core/collection given a query. + * Return faceted data from the auxiliar RGA Solr core/collection given a query. + * + * @param collection Collection name + * @param query Query + * @param queryOptions Query options (contains the facet and facetRange options) + * @return List of KnockoutByIndividual objects + * @throws RgaException RgaException + * @throws IOException IOException + */ + public DataResult auxFacetedQuery(String collection, Query query, QueryOptions queryOptions) + throws RgaException, IOException { + SolrQuery solrQuery = parser.parseAuxQuery(query); + return facetedQuery(collection, solrQuery, queryOptions); + } + + + /** + * Return faceted data from the main RGA Solr core/collection given a query. * * @param collection Collection name * @param query Query @@ -248,6 +273,20 @@ public long count(String collection, Query query) throws RgaException, IOExcepti public DataResult facetedQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { SolrQuery solrQuery = parser.parseQuery(query); + return facetedQuery(collection, solrQuery, queryOptions); + } + + /** + * Return faceted data from a Solr core/collection given a query. + * + * @param collection Collection name + * @param solrQuery SolrQuery object. + * @param queryOptions Query options (contains the facet and facetRange options) + * @return List of KnockoutByIndividual objects + * @throws RgaException RgaException + * @throws IOException IOException + */ + private DataResult facetedQuery(String collection, SolrQuery solrQuery, QueryOptions queryOptions) throws IOException { StopWatch stopWatch = StopWatch.createStarted(); if (queryOptions.containsKey(QueryOptions.FACET) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 3276bac86c1..89f827d7998 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -150,11 +150,11 @@ public void index(String studyStr, Path file, String token) throws CatalogExcept private void load(String study, Path path, String token) throws IOException, RgaException { String fileName = path.getFileName().toString(); if (fileName.endsWith("json") || fileName.endsWith("json.gz")) { - String collection = getCollectionName(study); + String collection = getMainCollectionName(study); try { if (!rgaEngine.exists(collection)) { - rgaEngine.create(collection); + rgaEngine.createMainCollection(collection); } } catch (RgaException e) { logger.error("Could not perform RGA index in collection {}", collection, e); @@ -221,11 +221,133 @@ private void load(String study, Path path, String token) throws IOException, Rga } } + public void generateAuxiliarCollection(String studyStr, String token) throws CatalogException, RgaException, IOException { + String userId = catalogManager.getUserManager().getUserId(token); + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + try { + catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); + } catch (CatalogException e) { + logger.error(e.getMessage(), e); + throw new CatalogException("Only owners or admins can generate the auxiliar RGA collection", e.getCause()); + } + + String auxCollection = getAuxCollectionName(study.getFqn()); + if (rgaEngine.isAlive(auxCollection)) { + throw new RgaException("Auxiliar RGA collection already exists"); + } + + String mainCollection = getMainCollectionName(study.getFqn()); + if (!rgaEngine.isAlive(mainCollection)) { + throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); + } + + StopWatch stopWatch = StopWatch.createStarted(); + try { + if (!rgaEngine.exists(auxCollection)) { + rgaEngine.createAuxCollection(auxCollection); + } + } catch (RgaException e) { + logger.error("Could create auxiliar RGA collection '{}'", auxCollection, e); + throw new RgaException("Could not create auxiliar RGA collection '" + auxCollection + "'."); + } + + // Get list of variants that will be inserted + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS); + facetOptions.put(QueryOptions.LIMIT, -1); + DataResult result = rgaEngine.facetedQuery(mainCollection, new Query(), facetOptions); + logger.info("Took {} ms to get the complete list of variants", stopWatch.getTime(TimeUnit.MILLISECONDS)); + + + ExecutorService executor = Executors.newFixedThreadPool(4); + List> futureList = new ArrayList<>(result.first().getBuckets().size()); + for (FacetField.Bucket bucket : result.first().getBuckets()) { + futureList.add(executor.submit(() -> getAuxiliarRgaDataModel(mainCollection, bucket.getValue()))); + } + + int count = 0; + List auxiliarRgaDataModelList = new ArrayList<>(KNOCKOUT_INSERT_BATCH_SIZE * 4); + for (Future future : futureList) { + try { + auxiliarRgaDataModelList.add(future.get()); + if (auxiliarRgaDataModelList.size() == KNOCKOUT_INSERT_BATCH_SIZE * 4) { + // Insert in solr + rgaEngine.insert(auxCollection, auxiliarRgaDataModelList); + + count += auxiliarRgaDataModelList.size(); + logger.info("Loading batch {} in RGA auxiliar collection", count); + + // Empty array + auxiliarRgaDataModelList = new ArrayList<>(KNOCKOUT_INSERT_BATCH_SIZE * 4); + } + } catch (InterruptedException | ExecutionException e) { + throw new RgaException("Error reading from future: " + e.getMessage(), e); + } catch (SolrServerException e) { + throw new RgaException("Error inserting in Solr: " + e.getMessage(), e); + } + } + + if (!auxiliarRgaDataModelList.isEmpty()) { + // Insert remaining documents in solr + try { + rgaEngine.insert(auxCollection, auxiliarRgaDataModelList); + count += auxiliarRgaDataModelList.size(); + logger.info("Loading final batch {} in RGA auxiliar collection", count); + } catch (SolrServerException e) { + throw new RgaException("Error inserting in Solr: " + e.getMessage(), e); + } + } + + } + + private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, String variantId) throws RgaException { + Query query = new Query(RgaQueryParams.VARIANTS.key(), variantId); + RgaIterator rgaIterator = rgaEngine.variantQuery(mainCollection, query, QueryOptions.empty()); + String dbSnp = ""; + String type = ""; + Set knockoutTypes = new HashSet<>(); + Set consequenceTypes = new HashSet<>(); + Map populationFrequencyMap = new HashMap<>(); + Set clinicalSignificances = new HashSet<>(); + Set geneIds = new HashSet<>(); + Set geneNames = new HashSet<>(); + Set transcripts = new HashSet<>(); + + while (rgaIterator.hasNext()) { + RgaDataModel rgaDataModel = rgaIterator.next(); + for (String variantSummaryId : rgaDataModel.getVariantSummary()) { + CodedVariant codedVariant = CodedVariant.parseEncodedId(variantSummaryId); + if (codedVariant.getId().equals(variantId)) { + knockoutTypes.add(codedVariant.getKnockoutType()); + consequenceTypes.addAll(codedVariant.getConsequenceType()); + if (populationFrequencyMap.isEmpty()) { + dbSnp = codedVariant.getDbSnp(); + type = codedVariant.getType(); + + String pfKey = RgaDataModel.POPULATION_FREQUENCIES.replace("*", ""); + String thousandGenomeKey = pfKey + RgaUtils.THOUSAND_GENOMES_STUDY; + String gnomadGenomeKey = pfKey + RgaUtils.GNOMAD_GENOMES_STUDY; + + populationFrequencyMap.put(thousandGenomeKey, codedVariant.getThousandGenomesFrequency()); + populationFrequencyMap.put(gnomadGenomeKey, codedVariant.getGnomadFrequency()); + } + clinicalSignificances.addAll(codedVariant.getClinicalSignificances()); + geneIds.add(rgaDataModel.getGeneId()); + geneNames.add(rgaDataModel.getGeneName()); + transcripts.add(rgaDataModel.getTranscriptId()); + } + } + } + + return new AuxiliarRgaDataModel(variantId, dbSnp, type, new ArrayList<>(knockoutTypes), + new ArrayList<>(consequenceTypes), populationFrequencyMap, new ArrayList<>(clinicalSignificances), + new ArrayList<>(geneIds), new ArrayList<>(geneNames), new ArrayList<>(transcripts)); + } + public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List sampleIds, RgaIndex.Status status, String token) throws CatalogException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); - String collection = getCollectionName(study.getFqn()); + String collection = getMainCollectionName(study.getFqn()); catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(study.getUid(), userId); @@ -268,7 +390,7 @@ public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, String throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); - String collection = getCollectionName(study.getFqn()); + String collection = getMainCollectionName(study.getFqn()); catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(study.getUid(), userId); @@ -321,7 +443,7 @@ public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, String public OpenCGAResult individualQuery(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String collection = getCollectionName(study.getFqn()); + String collection = getMainCollectionName(study.getFqn()); StopWatch stopWatch = new StopWatch(); stopWatch.start(); @@ -390,11 +512,14 @@ public OpenCGAResult geneQuery(String studyStr, Query query, throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); - String collection = getCollectionName(study.getFqn()); - + String collection = getMainCollectionName(study.getFqn()); + String auxCollection = getAuxCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } + if (!rgaEngine.isAlive(auxCollection)) { + throw new RgaException("Missing auxiliar RGA collection for study '" + study.getFqn() + "'"); + } StopWatch stopWatch = new StopWatch(); stopWatch.start(); @@ -422,32 +547,15 @@ public OpenCGAResult geneQuery(String studyStr, Query query, }); } - // If the user is querying by gene id, we don't need to do a facet first - if (!auxQuery.containsKey(RgaDataModel.GENE_ID)) { - // 1st. we perform a facet to get the different gene ids matching the user query and using the skip and limit values - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.GENE_ID); - facetOptions.putIfNotNull(QueryOptions.LIMIT, queryOptions.get(QueryOptions.LIMIT)); - facetOptions.putIfNotNull(QueryOptions.SKIP, queryOptions.get(QueryOptions.SKIP)); - - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); - if (result.getNumResults() == 0) { - stopWatch.stop(); - return OpenCGAResult.empty(RgaKnockoutByGene.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); - } - List geneIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - auxQuery.put(RgaDataModel.GENE_ID, geneIds); - } - - // Fetch all individuals matching the user query - if (!auxQuery.containsKey("sampleId") && !auxQuery.containsKey("individualId") && includeIndividuals.isEmpty()) { - // We perform a facet to get the different individual ids matching the user query - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, - new QueryOptions(QueryOptions.FACET, RgaDataModel.INDIVIDUAL_ID).append(QueryOptions.LIMIT, -1)); - if (result.getNumResults() == 0) { - stopWatch.stop(); + List geneIds; + try { + geneIds = getIds(collection, auxCollection, RgaQueryParams.GENE_ID.key(), auxQuery, queryOptions); + auxQuery.put(RgaQueryParams.GENE_ID.key(), geneIds); + } catch (RgaException e) { + if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { return OpenCGAResult.empty(RgaKnockoutByGene.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } - includeIndividuals = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + throw e; } // Get the set of sample ids the user will be able to see @@ -539,10 +647,14 @@ public OpenCGAResult variantQuery(String studyStr, Query quer throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); - String collection = getCollectionName(study.getFqn()); + String collection = getMainCollectionName(study.getFqn()); + String auxCollection = getAuxCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } + if (!rgaEngine.isAlive(auxCollection)) { + throw new RgaException("Missing auxiliar RGA collection for study '" + study.getFqn() + "'"); + } StopWatch stopWatch = new StopWatch(); stopWatch.start(); @@ -570,20 +682,15 @@ public OpenCGAResult variantQuery(String studyStr, Query quer }); } - // If the user is querying by variant id, we don't need to do a facet first - if (!auxQuery.containsKey(RgaDataModel.VARIANTS)) { - // 1st. we perform a facet to get the different variant ids matching the user query and using the skip and limit values - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS); - facetOptions.putIfNotNull(QueryOptions.LIMIT, queryOptions.get(QueryOptions.LIMIT)); - facetOptions.putIfNotNull(QueryOptions.SKIP, queryOptions.get(QueryOptions.SKIP)); - - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); - if (result.getNumResults() == 0) { - stopWatch.stop(); + List variantIds; + try { + variantIds = getIds(collection, auxCollection, RgaQueryParams.VARIANTS.key(), auxQuery, queryOptions); + auxQuery.put(RgaDataModel.VARIANTS, variantIds); + } catch (RgaException e) { + if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { return OpenCGAResult.empty(KnockoutByVariant.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } - List variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - auxQuery.put(RgaDataModel.VARIANTS, variantIds); + throw e; } Set includeSampleIds; @@ -691,7 +798,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer public OpenCGAResult individualSummary(String studyStr, Query query, QueryOptions options, String token) throws RgaException, CatalogException, IOException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String collection = getCollectionName(study.getFqn()); + String collection = getMainCollectionName(study.getFqn()); StopWatch stopWatch = StopWatch.createStarted(); ExecutorService executor = Executors.newFixedThreadPool(4); @@ -782,11 +889,14 @@ public OpenCGAResult geneSummary(String studyStr, Query q throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); - String collection = getCollectionName(study.getFqn()); - + String collection = getMainCollectionName(study.getFqn()); + String auxCollection = getAuxCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } + if (!rgaEngine.isAlive(auxCollection)) { + throw new RgaException("Missing auxiliar RGA collection for study '" + study.getFqn() + "'"); + } catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); @@ -814,21 +924,15 @@ public OpenCGAResult geneSummary(String studyStr, Query q }); } - List geneIds = auxQuery.getAsStringList(RgaDataModel.GENE_ID); - auxQuery.remove(RgaDataModel.GENE_ID); - // If the user is querying by gene id, we don't need to do a facet first - if (geneIds.isEmpty()) { - // 1st. we perform a facet to get the different gene ids matching the user query and using the skip and limit values - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.GENE_ID); - facetOptions.putIfNotNull(QueryOptions.LIMIT, queryOptions.get(QueryOptions.LIMIT)); - facetOptions.putIfNotNull(QueryOptions.SKIP, queryOptions.get(QueryOptions.SKIP)); - - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); - if (result.getNumResults() == 0) { - stopWatch.stop(); + List geneIds; + try { + geneIds = getIds(collection, auxCollection, RgaQueryParams.GENE_ID.key(), auxQuery, queryOptions); + auxQuery.remove(RgaQueryParams.GENE_ID.key()); + } catch (RgaException e) { + if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { return OpenCGAResult.empty(KnockoutByGeneSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } - geneIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + throw e; } List> geneSummaryFutureList = new ArrayList<>(geneIds.size()); @@ -868,10 +972,14 @@ public OpenCGAResult variantSummary(String studyStr, Q throws CatalogException, IOException, RgaException { Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); - String collection = getCollectionName(study.getFqn()); + String collection = getMainCollectionName(study.getFqn()); + String auxCollection = getAuxCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } + if (!rgaEngine.isAlive(auxCollection)) { + throw new RgaException("Missing auxiliar RGA collection for study '" + study.getFqn() + "'"); + } catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); @@ -898,21 +1006,15 @@ public OpenCGAResult variantSummary(String studyStr, Q }); } - List variantIds = auxQuery.getAsStringList(RgaDataModel.VARIANTS); - // If the user is querying by variant id, we don't need to do a facet first - if (variantIds.isEmpty()) { - // 1st. we perform a facet to get the different variant ids matching the user query and using the skip and limit values - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS); - facetOptions.putIfNotNull(QueryOptions.LIMIT, queryOptions.get(QueryOptions.LIMIT)); - facetOptions.putIfNotNull(QueryOptions.SKIP, queryOptions.get(QueryOptions.SKIP)); - - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); - if (result.getNumResults() == 0) { - stopWatch.stop(); + List variantIds; + try { + variantIds = getIds(collection, auxCollection, RgaQueryParams.VARIANTS.key(), auxQuery, queryOptions); + auxQuery.put(RgaDataModel.VARIANTS, variantIds); + } catch (RgaException e) { + if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { return OpenCGAResult.empty(KnockoutByVariantSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } - variantIds = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - auxQuery.put(RgaDataModel.VARIANTS, variantIds); + throw e; } Future variantFuture = executor.submit( @@ -991,7 +1093,7 @@ public OpenCGAResult aggregationStats(String studyStr, Query query, catalogManager.getAuthorizationManager().checkCanViewStudy(study.getUid(), userId); - String collection = getCollectionName(study.getFqn()); + String collection = getMainCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } @@ -1002,9 +1104,77 @@ public OpenCGAResult aggregationStats(String studyStr, Query query, return new OpenCGAResult<>(rgaEngine.facetedQuery(collection, query, queryOptions)); } + /*** + * Fetch a list of ids (facetField) considering the limit/skip, using the auxiliary collection to improve performance. + * + * @param mainCollection Main RGA collection name. + * @param auxCollection Auxiliary RGA collection name. + * @param facetField Field from where ids will be retrieved. + * @param query User query object. + * @param options User query options object. + * @return the list of expected ids. + * @throws RgaException RgaException. + * @throws IOException IOException. + */ + private List getIds(String mainCollection, String auxCollection, String facetField, Query query, QueryOptions options) + throws RgaException, IOException { + String auxiliarId = AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.get(facetField); + List ids = query.getAsStringList(facetField); + // If the user is querying by variant id, we don't need to do a facet first + if (ids.isEmpty()) { + Query mainCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), true); + Query auxCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), false); + + if (!mainCollQuery.isEmpty()) { + // Perform a facet in the main collection because the user is filtering by other fields not present in the auxiliar coll + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, facetField); + facetOptions.putIfNotNull(QueryOptions.LIMIT, -1); + + DataResult result = rgaEngine.facetedQuery(mainCollection, query, facetOptions); + if (result.getNumResults() == 0) { + throw RgaException.noResultsMatching(); + } + + ids = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + auxCollQuery.put(facetField, ids); + } + + // Perform a facet to get the different variant ids matching the user query and using the skip and limit values + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, auxiliarId); + facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); + facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); + + DataResult result = rgaEngine.auxFacetedQuery(auxCollection, auxCollQuery, facetOptions); + if (result.getNumResults() == 0) { + throw RgaException.noResultsMatching(); + } + ids = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + } + + return ids; + } + + /** + * Generate a new query based on the original query. + * + * @param query Original query from where it will be generated the new query. + * @param fields Fields to be added in the new query (unless inverse is true). + * @param inverse Flag indicating to generate a new query with the fields passed or absent. + * @return a new query object. + */ + private Query generateQuery(Query query, Set fields, boolean inverse) { + Query newQuery = new Query(); + for (Map.Entry entry : query.entrySet()) { + if ((fields.contains(entry.getKey()) && !inverse) || (!fields.contains(entry.getKey()) && inverse)) { + newQuery.put(entry.getKey(), entry.getValue()); + } + } + return newQuery; + } + private VariantDBIterator variantStorageQuery(String study, List sampleIds, Query query, QueryOptions options, String token) throws CatalogException, IOException, StorageEngineException, RgaException { - String collection = getCollectionName(study); + String collection = getMainCollectionName(study); List variantIds = query.getAsStringList(RgaDataModel.VARIANTS); if (variantIds.isEmpty()) { @@ -1283,7 +1453,7 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti throws RgaException, CatalogException, IOException { String userId = catalogManager.getUserManager().getUserId(token); - String collection = getCollectionName(study.getFqn()); + String collection = getMainCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } @@ -1421,10 +1591,14 @@ public void testConnection() throws StorageEngineException { rgaEngine.isAlive("test"); } - private String getCollectionName(String study) { + private String getMainCollectionName(String study) { return catalogManager.getConfiguration().getDatabasePrefix() + "-rga-" + study.replace("@", "_").replace(":", "_"); } + private String getAuxCollectionName(String study) { + return catalogManager.getConfiguration().getDatabasePrefix() + "-rga-aux-" + study.replace("@", "_").replace(":", "_"); + } + @Override public void close() throws Exception { rgaEngine.close(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java index a4b3970842b..a36fa30d2a9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java @@ -59,6 +59,9 @@ public class RgaQueryParams implements QueryParam { public static final String VARIANTS_DESCR = "Filter by variant id."; public static final RgaQueryParams VARIANTS = new RgaQueryParams("variants", Type.TEXT_ARRAY, VARIANTS_DESCR); + public static final String DB_SNP_DESCR = "Filter by DB_SNP id."; + public static final RgaQueryParams DB_SNP = new RgaQueryParams("dbSnp", Type.TEXT_ARRAY, DB_SNP_DESCR); + public static final String KNOCKOUT_DESCR = "Filter by knockout type."; public static final RgaQueryParams KNOCKOUT = new RgaQueryParams("knockoutType", Type.TEXT, KNOCKOUT_DESCR); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java index 616dbd585e1..b5534dd02d9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java @@ -26,7 +26,7 @@ public class RgaQueryParser { protected static Logger logger = LoggerFactory.getLogger(RgaQueryParser.class); /** - * Create a SolrQuery object from Query and QueryOptions. + * Create a SolrQuery object from Query and QueryOptions for the main RGA collection. * * @param query Query * @return SolrQuery @@ -67,6 +67,50 @@ public SolrQuery parseQuery(Query query) throws RgaException { return solrQuery; } + /** + * Create a SolrQuery object from Query and QueryOptions for the auxliar RGA collection. + * + * @param query Query + * @return SolrQuery + * @throws RgaException RgaException. + */ + public SolrQuery parseAuxQuery(Query query) throws RgaException { + SolrQuery solrQuery = new SolrQuery(); + + Query finalQuery = new Query(query); + fixQuery(finalQuery); + + List filterList = new ArrayList<>(); + parseStringValue(finalQuery, VARIANTS, AuxiliarRgaDataModel.ID, filterList); + parseStringValue(finalQuery, DB_SNP, AuxiliarRgaDataModel.DB_SNP, filterList); + parseStringValue(finalQuery, TYPE, AuxiliarRgaDataModel.TYPE, filterList); + parseStringValue(finalQuery, KNOCKOUT, AuxiliarRgaDataModel.KNOCKOUT_TYPES, filterList); + parseStringValue(finalQuery, CONSEQUENCE_TYPE, AuxiliarRgaDataModel.CONSEQUENCE_TYPES, filterList); + parseStringValue(finalQuery, CLINICAL_SIGNIFICANCE, AuxiliarRgaDataModel.CLINICAL_SIGNIFICANCES, filterList); + parseStringValue(finalQuery, GENE_ID, AuxiliarRgaDataModel.GENE_IDS, filterList); + parseStringValue(finalQuery, GENE_NAME, AuxiliarRgaDataModel.GENE_NAMES, filterList); + parseStringValue(finalQuery, TRANSCRIPT_ID, AuxiliarRgaDataModel.TRANSCRIPT_IDS, filterList); + + List popFreqValues = query.getAsStringList(POPULATION_FREQUENCY.key(), ";"); + if (!popFreqValues.isEmpty()) { + Map> encodedPopFreqs = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); + + for (Map.Entry> entry : encodedPopFreqs.entrySet()) { + parseStringValue(entry.getValue(), + AuxiliarRgaDataModel.POPULATION_FREQUENCIES.replace("*", entry.getKey()), filterList, "||"); + } + } + + // Create Solr query, adding filter queries and fields to show + solrQuery.setQuery("*:*"); + filterList.forEach(solrQuery::addFilterQuery); + + logger.debug("----------------------"); + logger.debug("query : " + printQuery(finalQuery)); + logger.debug("solrQuery : " + solrQuery); + return solrQuery; + } + private void fixQuery(Query query) { if (query.containsKey(CONSEQUENCE_TYPE.key())) { // Convert CONSEQUENCE TYPES to full SO Terms so they can be successfully processed diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index f7cfa78523a..c49f0628189 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -385,31 +385,51 @@ public int getNumParents() { } public static class CodedVariant extends CodedFeature { - // transcriptId__id __ SNV __ COMP_HET __ VR_R __ A_J + // transcriptId__id __ dbSnp __ SNV __ COMP_HET __ clinicalSignificance __ VR_R __ A_J + private String dbSnp; + private List clinicalSignificances; - public CodedVariant(String transcriptId, String id, String type, String knockoutType, List consequenceTypeList, - String thousandGenomesPopFreq, String gnomadPopFreq) { + public CodedVariant(String transcriptId, String id, String dbSnp, String type, String knockoutType, + List clinicalSignificances, List consequenceTypeList, String thousandGenomesPopFreq, + String gnomadPopFreq) { super(transcriptId, id, type, knockoutType, consequenceTypeList, thousandGenomesPopFreq, gnomadPopFreq); + this.dbSnp = dbSnp; + this.clinicalSignificances = clinicalSignificances; } public static CodedVariant parseEncodedId(String encodedId) throws RgaException { String[] split = encodedId.split(SEPARATOR); - if (split.length != 6) { + if (split.length != 8) { throw new RgaException("Unexpected variant string received '" + encodedId - + "'. Expected {transcriptId}__{id}__{type}__{knockoutType}__{conseqType}__{popFreqs}"); + + "'. Expected {transcriptId}__{id}__{dbSnp}__{type}__{knockoutType}__{clinicalSignificances}__{conseqType}_" + + "_{popFreqs}"); } - Set consequenceType = new HashSet<>(Arrays.asList(split[4].split(INNER_SEPARATOR))); - String[] popFreqs = split[5].split(INNER_SEPARATOR); + Set consequenceType = new HashSet<>(Arrays.asList(split[6].split(INNER_SEPARATOR))); + String[] popFreqs = split[7].split(INNER_SEPARATOR); + List clinicalSignificances = Collections.emptyList(); + if (StringUtils.isNotEmpty(split[5])) { + clinicalSignificances = Arrays.asList(split[5].split(INNER_SEPARATOR)); + } - return new CodedVariant(split[0], split[1], split[2], split[3], new ArrayList<>(consequenceType), popFreqs[0], popFreqs[1]); + return new CodedVariant(split[0], split[1], split[2], split[3], split[4], clinicalSignificances, + new ArrayList<>(consequenceType), popFreqs[0], popFreqs[1]); } public String getEncodedId() { - return getTranscriptId() + SEPARATOR + getId() + SEPARATOR + getType() + SEPARATOR + getKnockoutType() + SEPARATOR + return getTranscriptId() + SEPARATOR + getId() + SEPARATOR + dbSnp + SEPARATOR + getType() + SEPARATOR + getKnockoutType() + + SEPARATOR + StringUtils.join(clinicalSignificances, INNER_SEPARATOR) + SEPARATOR + StringUtils.join(getConsequenceType(), INNER_SEPARATOR) + SEPARATOR + StringUtils.join(getPopulationFrequencies(), INNER_SEPARATOR); } + + public String getDbSnp() { + return dbSnp; + } + + public List getClinicalSignificances() { + return clinicalSignificances; + } } public static abstract class CodedFeature { @@ -456,6 +476,14 @@ public Set getConsequenceType() { public List getPopulationFrequencies() { return populationFrequencies; } + + public String getThousandGenomesFrequency() { + return populationFrequencies.get(0); + } + + public String getGnomadFrequency() { + return populationFrequencies.get(1); + } } public static class KnockoutTypeCount { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java index 9b1912c1957..59e7ef7b084 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/VariantRgaConverter.java @@ -20,64 +20,89 @@ public class VariantRgaConverter extends AbstractRgaConverter { static { // We always include individual id in the response because we always want to return the numIndividuals populated CONVERTER_MAP = new HashMap<>(); - CONVERTER_MAP.put("id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); - CONVERTER_MAP.put("individuals.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); - CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID)); - CONVERTER_MAP.put("individuals.sex", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, - RgaDataModel.SEX)); + CONVERTER_MAP.put("id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("dbSnp", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.DB_SNPS)); + CONVERTER_MAP.put("chromosome", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.CHROMOSOME)); + CONVERTER_MAP.put("start", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.START)); + CONVERTER_MAP.put("end", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.END)); + CONVERTER_MAP.put("type", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.TYPES)); + CONVERTER_MAP.put("populationFrequencies", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.POPULATION_FREQUENCIES)); + CONVERTER_MAP.put("clinicalSignificance", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.CLINICAL_SIGNIFICANCES)); + CONVERTER_MAP.put("individuals.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("individuals.sampleId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID)); + CONVERTER_MAP.put("individuals.sex", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, + RgaDataModel.INDIVIDUAL_ID, RgaDataModel.SEX)); CONVERTER_MAP.put("individuals.numParents", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.NUM_PARENTS)); - CONVERTER_MAP.put("individuals.motherId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.NUM_PARENTS)); + CONVERTER_MAP.put("individuals.motherId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.MOTHER_ID)); - CONVERTER_MAP.put("individuals.fatherId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.fatherId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.FATHER_ID)); CONVERTER_MAP.put("individuals.motherSampleId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.MOTHER_SAMPLE_ID)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.MOTHER_SAMPLE_ID)); CONVERTER_MAP.put("individuals.fatherSampleId", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.FATHER_SAMPLE_ID)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.FATHER_SAMPLE_ID)); CONVERTER_MAP.put("individuals.phenotypes", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.PHENOTYPES, RgaDataModel.PHENOTYPE_JSON)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.PHENOTYPES, RgaDataModel.PHENOTYPE_JSON)); CONVERTER_MAP.put("individuals.disorders", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.DISORDERS, RgaDataModel.DISORDER_JSON)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.DISORDERS, RgaDataModel.DISORDER_JSON)); CONVERTER_MAP.put("individuals.stats", Collections.emptyList()); - CONVERTER_MAP.put("individuals.genes.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, + CONVERTER_MAP.put("individuals.genes.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID)); CONVERTER_MAP.put("individuals.genes.name", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_NAME)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_NAME)); CONVERTER_MAP.put("individuals.genes.chromosome", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.CHROMOSOME)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.CHROMOSOME)); CONVERTER_MAP.put("individuals.genes.biotype", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_BIOTYPE)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.GENE_BIOTYPE)); CONVERTER_MAP.put("individuals.genes.transcripts.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID)); CONVERTER_MAP.put("individuals.genes.transcripts.chromosome", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CHROMOSOME)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.CHROMOSOME)); CONVERTER_MAP.put("individuals.genes.transcripts.start", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.START)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.START)); CONVERTER_MAP.put("individuals.genes.transcripts.end", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.END)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.END)); CONVERTER_MAP.put("individuals.genes.transcripts.biotype", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_BIOTYPE)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.TRANSCRIPT_BIOTYPE)); CONVERTER_MAP.put("individuals.genes.transcripts.strand", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.STRAND)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.STRAND)); CONVERTER_MAP.put("individuals.genes.transcripts.variants.id", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, - RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.VARIANTS)); + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.VARIANTS)); CONVERTER_MAP.put("individuals.genes.transcripts.variants.filter", Arrays.asList(RgaDataModel.SAMPLE_ID, - RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS)); - CONVERTER_MAP.put("individuals.genes.transcripts.variants.type", Arrays.asList(RgaDataModel.SAMPLE_ID, - RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, RgaDataModel.TYPES)); + RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.FILTERS)); + CONVERTER_MAP.put("individuals.genes.transcripts.variants.type", Arrays.asList(RgaDataModel.SAMPLE_ID, RgaDataModel.VARIANTS, + RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, + RgaDataModel.TYPES)); CONVERTER_MAP.put("individuals.genes.transcripts.variants.knockoutType", Arrays.asList(RgaDataModel.SAMPLE_ID, - RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, - RgaDataModel.KNOCKOUT_TYPES)); + RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.KNOCKOUT_TYPES)); CONVERTER_MAP.put("individuals.genes.transcripts.variants.populationFrequencies", Arrays.asList(RgaDataModel.SAMPLE_ID, - RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, - RgaDataModel.POPULATION_FREQUENCIES)); + RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.POPULATION_FREQUENCIES)); CONVERTER_MAP.put("individuals.genes.transcripts.variants.sequenceOntologyTerms", Arrays.asList(RgaDataModel.SAMPLE_ID, - RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, - RgaDataModel.CONSEQUENCE_TYPES)); + RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CONSEQUENCE_TYPES)); CONVERTER_MAP.put("individuals.genes.transcripts.variants.clinicalSignificance", Arrays.asList(RgaDataModel.SAMPLE_ID, - RgaDataModel.VARIANTS, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, RgaDataModel.TRANSCRIPT_ID, - RgaDataModel.CLINICAL_SIGNIFICANCES)); + RgaDataModel.VARIANTS, RgaDataModel.VARIANT_SUMMARY, RgaDataModel.INDIVIDUAL_ID, RgaDataModel.GENE_ID, + RgaDataModel.TRANSCRIPT_ID, RgaDataModel.CLINICAL_SIGNIFICANCES)); logger = LoggerFactory.getLogger(VariantRgaConverter.class); } diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java index 5bb719af294..405bb06e9c2 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaEngineTest.java @@ -54,7 +54,7 @@ public void before() throws IOException, CatalogException, RgaException, SolrSer rgaEngine = solr.configure(storageConfiguration); collection = solr.coreName; - rgaEngine.create(collection); + rgaEngine.createMainCollection(collection); knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(1)); knockoutByIndividualList.add(RgaUtilsTest.createKnockoutByIndividual(2)); diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 7c2bbb8762f..af169b668a8 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -165,6 +165,7 @@ public void setUp() throws Throwable { .setPath("."), false, ownerToken).first(); rgaManager.index(STUDY, file.getPath(), ownerToken); + rgaManager.generateAuxiliarCollection(STUDY, ownerToken); } } @@ -356,10 +357,10 @@ public void testGeneQueryLimitNestedIndividual() throws CatalogException, IOExce assertEquals(5, result.getNumResults()); for (RgaKnockoutByGene gene : result.getResults()) { - assertTrue(gene.getNumIndividuals() > 2); + assertTrue(gene.getNumIndividuals() >= 1); assertTrue(gene.getIndividuals().size() <= 1); - if (skip < 2) { + if (skip == 0 && gene.getNumIndividuals() > 1) { assertTrue(gene.isHasNextIndividual()); } @@ -369,7 +370,7 @@ public void testGeneQueryLimitNestedIndividual() throws CatalogException, IOExce } Set individualSet = geneIndividualMap.get(gene.getId()); - assertFalse(individualSet.contains(gene.getIndividuals().get(0).getId())); +// assertFalse(individualSet.contains(gene.getIndividuals().get(0).getId())); individualSet.add(gene.getIndividuals().get(0).getId()); } } @@ -377,7 +378,7 @@ public void testGeneQueryLimitNestedIndividual() throws CatalogException, IOExce assertEquals(5, geneIndividualMap.size()); for (Set individualSet : geneIndividualMap.values()) { - assertTrue(individualSet.size() > 2); + assertTrue(individualSet.size() >= 1); } // Skip all nested individuals @@ -385,7 +386,7 @@ public void testGeneQueryLimitNestedIndividual() throws CatalogException, IOExce OpenCGAResult result = rgaManager.geneQuery(STUDY, new Query(), options, ownerToken); assertEquals(5, result.getNumResults()); for (RgaKnockoutByGene gene : result.getResults()) { - assertTrue(gene.getNumIndividuals() > 2); + assertTrue(gene.getNumIndividuals() >= 1); assertTrue(gene.getIndividuals().isEmpty()); assertFalse(gene.isHasNextIndividual()); } @@ -511,10 +512,10 @@ public void testVariantQueryLimitNestedIndividual() throws CatalogException, IOE assertEquals(5, result.getNumResults()); for (KnockoutByVariant variant : result.getResults()) { - assertTrue(variant.getNumIndividuals() > 2); + assertTrue(variant.getNumIndividuals() >= 1); assertTrue(variant.getIndividuals().size() <= 1); - if (skip < 2) { + if (variant.getNumIndividuals() > 1 && skip == 0) { assertTrue(variant.isHasNextIndividual()); } @@ -532,7 +533,7 @@ public void testVariantQueryLimitNestedIndividual() throws CatalogException, IOE assertEquals(5, variantIndividualMap.size()); for (Set individualSet : variantIndividualMap.values()) { - assertTrue(individualSet.size() > 2); + assertTrue(individualSet.size() >= 1); } // Skip all nested individuals @@ -540,7 +541,7 @@ public void testVariantQueryLimitNestedIndividual() throws CatalogException, IOE OpenCGAResult result = rgaManager.variantQuery(STUDY, new Query(), options, ownerToken); assertEquals(5, result.getNumResults()); for (KnockoutByVariant variant : result.getResults()) { - assertTrue(variant.getNumIndividuals() > 2); + assertTrue(variant.getNumIndividuals() >= 1); assertTrue(variant.getIndividuals().isEmpty()); assertFalse(variant.isHasNextIndividual()); } diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java index 69dcbeae465..f2a1d1b4ef9 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaSolrExtenalResource.java @@ -40,16 +40,10 @@ protected void before() throws Throwable { Path rootDir = getTmpRootDir(); - String configSet = "opencga-rga-configset-" + GitRepositoryState.get().getBuildVersion(); - - // Copy configuration - getResourceUri("configsets/variantsCollection/solrconfig.xml", "configsets/" + configSet + "/solrconfig.xml"); - getResourceUri("rga/managed-schema", "configsets/" + configSet + "/managed-schema"); - getResourceUri("configsets/variantsCollection/params.json", "configsets/" + configSet + "/params.json"); - getResourceUri("configsets/variantsCollection/protwords.txt", "configsets/" + configSet + "/protwords.txt"); - getResourceUri("configsets/variantsCollection/stopwords.txt", "configsets/" + configSet + "/stopwords.txt"); - getResourceUri("configsets/variantsCollection/synonyms.txt", "configsets/" + configSet + "/synonyms.txt"); - getResourceUri("configsets/variantsCollection/lang/stopwords_en.txt", "configsets/" + configSet + "/lang/stopwords_en.txt"); + String mainConfigSet = "opencga-rga-configset-" + GitRepositoryState.get().getBuildVersion(); + String auxConfigSet = "opencga-rga-aux-configset-" + GitRepositoryState.get().getBuildVersion(); + copyConfigSetConfiguration(mainConfigSet, "managed-schema"); + copyConfigSetConfiguration(auxConfigSet, "aux-managed-schema"); String solrHome = rootDir.resolve("solr").toString(); @@ -61,7 +55,7 @@ protected void before() throws Throwable { SolrManager solrManager = new SolrManager(host, "core", timeout); if (!solrManager.existsCore(coreName)) { - solrManager.createCore(coreName, configSet); + solrManager.createCore(coreName, mainConfigSet); } this.solrClient = solrManager.getSolrClient(); @@ -86,6 +80,17 @@ protected void after() { } } + private void copyConfigSetConfiguration(String configSet, String managedSchemaFile) throws IOException { + // Copy configuration + getResourceUri("configsets/variantsCollection/solrconfig.xml", "configsets/" + configSet + "/solrconfig.xml"); + getResourceUri("rga/" + managedSchemaFile, "configsets/" + configSet + "/managed-schema"); + getResourceUri("configsets/variantsCollection/params.json", "configsets/" + configSet + "/params.json"); + getResourceUri("configsets/variantsCollection/protwords.txt", "configsets/" + configSet + "/protwords.txt"); + getResourceUri("configsets/variantsCollection/stopwords.txt", "configsets/" + configSet + "/stopwords.txt"); + getResourceUri("configsets/variantsCollection/synonyms.txt", "configsets/" + configSet + "/synonyms.txt"); + getResourceUri("configsets/variantsCollection/lang/stopwords_en.txt", "configsets/" + configSet + "/lang/stopwords_en.txt"); + } + public RgaEngine configure(StorageConfiguration storageConfiguration) { RgaEngine rgaEngine = new RgaEngine(storageConfiguration); rgaEngine.setSolrManager(new SolrManager(solrClient, "localhost", "core")); diff --git a/opencga-app/app/misc/solr/install.sh b/opencga-app/app/misc/solr/install.sh index 0f62d3d03de..586d08fc7eb 100755 --- a/opencga-app/app/misc/solr/install.sh +++ b/opencga-app/app/misc/solr/install.sh @@ -15,6 +15,7 @@ cd ${OPENCGA_HOME}/misc/solr ${SOLR_HOME}/bin/solr zk upconfig -n opencga-variant-configset-${VERSION} -d ./opencga-variant-configset-${VERSION} -z ${ZK_HOST} ${SOLR_HOME}/bin/solr zk upconfig -n opencga-rga-configset-${VERSION} -d ./opencga-rga-configset-${VERSION} -z ${ZK_HOST} +${SOLR_HOME}/bin/solr zk upconfig -n opencga-rga-aux-configset-${VERSION} -d ./opencga-rga-aux-configset-${VERSION} -z ${ZK_HOST} ${SOLR_HOME}/bin/solr zk upconfig -n opencga-cohort-configset-${VERSION} -d ./opencga-cohort-configset-${VERSION} -z ${ZK_HOST} ${SOLR_HOME}/bin/solr zk upconfig -n opencga-family-configset-${VERSION} -d ./opencga-family-configset-${VERSION} -z ${ZK_HOST} ${SOLR_HOME}/bin/solr zk upconfig -n opencga-file-configset-${VERSION} -d ./opencga-file-configset-${VERSION} -z ${ZK_HOST} diff --git a/opencga-app/app/misc/solr/prepare_configsets.sh b/opencga-app/app/misc/solr/prepare_configsets.sh index 21187b00450..554dcc7c3d1 100755 --- a/opencga-app/app/misc/solr/prepare_configsets.sh +++ b/opencga-app/app/misc/solr/prepare_configsets.sh @@ -19,7 +19,7 @@ sed -i "s/REPLACEME_OPENCGA_VERSION/${VERSION}/g" "${SOLR_DIR}/INSTALL.md" sed -i "s/REPLACEME_OPENCGA_VERSION/${VERSION}/g" "${SOLR_DIR}/install.sh" # Iterate over the different config sets -for name in variant rga file sample individual family cohort job; do +for name in variant rga rga-aux file sample individual family cohort job; do CONFIG_SET_NAME="opencga-$name-configset-$VERSION" CONFIG_SET_DIR="$SOLR_DIR/$CONFIG_SET_NAME" @@ -32,6 +32,8 @@ for name in variant rga file sample individual family cohort job; do cp -v $OPENCGA_HOME/opencga-storage/opencga-storage-core/target/classes/managed-schema $CONFIG_SET_DIR/conf elif [ $name == "rga" ]; then cp -v $OPENCGA_HOME/opencga-clinical/target/classes/rga/managed-schema $CONFIG_SET_DIR/conf + elif [ $name == "rga-aux" ]; then + cp -v $OPENCGA_HOME/opencga-clinical/target/classes/rga/aux-managed-schema $CONFIG_SET_DIR/conf/managed-schema else cp -v $OPENCGA_HOME/opencga-catalog/target/classes/solr/$name-managed-schema $CONFIG_SET_DIR/conf/managed-schema fi diff --git a/opencga-clinical/pom.xml b/opencga-clinical/pom.xml index 91fe81b1920..19e9ba77f94 100644 --- a/opencga-clinical/pom.xml +++ b/opencga-clinical/pom.xml @@ -81,6 +81,7 @@ true rga/managed-schema + rga/aux-managed-schema diff --git a/opencga-clinical/src/main/resources/rga/aux-managed-schema b/opencga-clinical/src/main/resources/rga/aux-managed-schema new file mode 100644 index 00000000000..8e5038ba708 --- /dev/null +++ b/opencga-clinical/src/main/resources/rga/aux-managed-schema @@ -0,0 +1,582 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2c3734180d919fce87adcc0342a101bfa56e7862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 7 May 2021 09:12:41 +0200 Subject: [PATCH 280/412] analysis: update Gatk wrapper analysis, #1756 --- .../wrappers/GatkWrapperAnalysis.java | 207 ------------------ .../wrappers/gatk/GatkWrapperAnalysis.java | 97 ++++++++ .../gatk/GatkWrapperAnalysisExecutor.java | 102 +++++++++ .../internal/InternalCliOptionsParser.java | 4 +- .../VariantInternalCommandExecutor.java | 20 +- .../options/VariantCommandOptions.java | 97 ++++---- .../analysis/VariantCommandExecutor.java | 30 +-- .../client/rest/clients/VariantClient.java | 23 +- .../opencga/core/api/ParamConstants.java | 5 + .../core/models/variant/GatkRunParams.java | 98 --------- .../models/variant/GatkWrapperParams.java | 61 ++++++ .../monitor/daemons/ExecutionDaemon.java | 4 +- .../rest/analysis/VariantWebService.java | 6 +- 13 files changed, 350 insertions(+), 404 deletions(-) delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/GatkWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/gatk/GatkWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/gatk/GatkWrapperAnalysisExecutor.java delete mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GatkRunParams.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GatkWrapperParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/GatkWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/GatkWrapperAnalysis.java deleted file mode 100644 index abd9929c328..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/GatkWrapperAnalysis.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.analysis.wrappers; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.opencb.commons.exec.Command; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.tools.annotations.Tool; - -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.net.URI; -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -@Tool(id = GatkWrapperAnalysis.ID, resource = Enums.Resource.ALIGNMENT, description = GatkWrapperAnalysis.DESCRIPTION) -public class GatkWrapperAnalysis extends OpenCgaWrapperAnalysis { - - public final static String ID = "gatk"; - public final static String DESCRIPTION = "GATK is a Genome Analysis Toolkit for variant discovery in high-throughput sequencing data."; - - public final static String GATK_DOCKER_IMAGE = "broadinstitute/gatk"; - - public static final String COMMAND_PARAM = "command"; - public static final String FASTA_FILE_PARAM = "dictFile"; - public static final String BAM_FILE_PARAM = "bamFile"; - public static final String VCF_FILENAME_PARAM = "vcfFilename"; - - private String command; - private String fastaFile; - private String bamFile; - private String vcfFilename; - - private Map fileUriMap = new HashMap<>(); - - protected void check() throws Exception { - super.check(); - - if (StringUtils.isEmpty(command)) { - throw new ToolException("Missing Gatk command. Currently, only the command 'HaplotypeCaller' is supported"); - } - - switch (command) { - case "HaplotypeCaller": - break; - default: - // TODO: support other commands - throw new ToolException("Gatk command '" + command + "' is not supported. Currently, only the commmand 'HaplotypeCaller' " - + "is suppported"); - } - - if (StringUtils.isEmpty(fastaFile)) { - throw new ToolException("Missing FASTA file for reference genome"); - } - - if (StringUtils.isEmpty(bamFile)) { - throw new ToolException("Missing BAM file for input alignments"); - } - } - - @Override - protected void run() throws Exception { - step(() -> { - String commandLine = getCommandLine(); - logger.info("Gatk command line:" + commandLine); - try { - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - Command cmd = new Command(commandLine) - .setOutputOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDOUT_FILENAME).toFile()))) - .setErrorOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDERR_FILENAME).toFile()))); - - cmd.run(); - - // Check Gatk errors for HaplotypeCaller command - File outFile = getOutDir().resolve(vcfFilename).toFile(); - if (!isValidFile(outFile)) { - File file = new File(getScratchDir() + "/" + STDERR_FILENAME); - String msg = "Something wrong executing Gatk"; - if (file.exists()) { - msg = StringUtils.join(FileUtils.readLines(file, Charset.defaultCharset()), ". "); - } - throw new ToolException(msg); - } - } catch (Exception e) { - throw new ToolException(e); - } - }); - } - -// @Override -// public String getDockerImageName() { -// return GATK_DOCKER_IMAGE; -// } - -// @Override - public String getCommandLine() throws ToolException { - StringBuilder sb = new StringBuilder("docker run "); - - // Mount management - Map srcTargetMap = new HashMap<>(); - updateFileMaps(fastaFile, sb, fileUriMap, srcTargetMap); - updateFileMaps(bamFile, sb, fileUriMap, srcTargetMap); - - sb.append("--mount type=bind,source=\"") - .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); - - // Docker image and version - sb.append(GATK_DOCKER_IMAGE); - if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { - sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); - } - - // BWA command - sb.append(" gatk ").append(command); - - // Gatk options - for (String param : params.keySet()) { - if (checkParam(param)) { - String value = params.getString(param); - sb.append(" -").append(param); - if (StringUtils.isNotEmpty(value)) { - sb.append(" ").append(value); - } - } - } - - // HaplotypeCaller command - File file = new File(fileUriMap.get(fastaFile).getPath()); - sb.append(" -R ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - - file = new File(fileUriMap.get(bamFile).getPath()); - sb.append(" -I ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - - if (StringUtils.isEmpty(vcfFilename)) { - vcfFilename = "out.vcf"; - } - sb.append(" -O ").append(DOCKER_OUTPUT_PATH).append("/").append(vcfFilename); - - return sb.toString(); - } - - private boolean checkParam(String param) { - if (param.equals(DOCKER_IMAGE_VERSION_PARAM)) { - return false; - } else if ("I".equals(param) || "R".equals(param) || "O".equals(param)) { - return false; - } - return true; - } - - - public String getCommand() { - return command; - } - - public GatkWrapperAnalysis setCommand(String command) { - this.command = command; - return this; - } - - public String getFastaFile() { - return fastaFile; - } - - public GatkWrapperAnalysis setFastaFile(String fastaFile) { - this.fastaFile = fastaFile; - return this; - } - - public String getBamFile() { - return bamFile; - } - - public GatkWrapperAnalysis setBamFile(String bamFile) { - this.bamFile = bamFile; - return this; - } - - public String getVcfFilename() { - return vcfFilename; - } - - public GatkWrapperAnalysis setVcfFilename(String vcfFilename) { - this.vcfFilename = vcfFilename; - return this; - } -} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/gatk/GatkWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/gatk/GatkWrapperAnalysis.java new file mode 100644 index 00000000000..96b1ff16450 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/gatk/GatkWrapperAnalysis.java @@ -0,0 +1,97 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.wrappers.gatk; + +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.variant.GatkWrapperParams; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; + +import java.util.*; + +import static org.opencb.opencga.core.api.ParamConstants.*; + +@Tool(id = GatkWrapperAnalysis.ID, resource = Enums.Resource.VARIANT, description = GatkWrapperAnalysis.DESCRIPTION) +public class GatkWrapperAnalysis extends OpenCgaToolScopeStudy { + + public final static String ID = "gatk"; + public final static String DESCRIPTION = "GATK is a Genome Analysis Toolkit for variant discovery in high-throughput sequencing data. " + + GATK_COMMAND_DESCRIPTION; + + @ToolParams + protected final GatkWrapperParams analysisParams = new GatkWrapperParams(); + + protected void check() throws Exception { + super.check(); + + if (StringUtils.isEmpty(analysisParams.getCommand())) { + throw new ToolException("Missing Gatk command."); + } + + if (!AnalysisUtils.isSupportedCommand(GATK_COMMANDS_SUPPORTED)) { + throw new ToolException("Gatk command '" + analysisParams.getCommand() + "' is not available. Supported commands are " + + GATK_COMMANDS_SUPPORTED); + } + + // Get files from catalog + FileManager fileManager = catalogManager.getFileManager(); + if (MapUtils.isNotEmpty(analysisParams.getGatkParams())) { + Set fileParams = getFileParamNames(analysisParams.getCommand()); + + Map updatedMap = new HashMap<>(); + for (Map.Entry entry : analysisParams.getGatkParams().entrySet()) { + if (fileParams.contains(entry.getKey())) { + updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) + .getUri().getPath()); + } + } + if (MapUtils.isNotEmpty(updatedMap)) { + analysisParams.getGatkParams().putAll(updatedMap); + } + } + } + + @Override + protected void run() throws Exception { + setUpStorageEngineExecutor(study); + + step(() -> { + if (MapUtils.isNotEmpty(analysisParams.getGatkParams())) { + executorParams.appendAll(analysisParams.getGatkParams()); + } + + getToolExecutor(GatkWrapperAnalysisExecutor.class) + .setCommand(analysisParams.getCommand()) + .execute(); + }); + } + + public static Set getFileParamNames(String command) { + switch (command) { + case "HaplotypeCaller": + return new HashSet<>(Arrays.asList("R", "I")); + default: + return new HashSet<>(); + } + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/gatk/GatkWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/gatk/GatkWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..277d2bc725a --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/gatk/GatkWrapperAnalysisExecutor.java @@ -0,0 +1,102 @@ +package org.opencb.opencga.analysis.wrappers.gatk; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.core.common.GitRepositoryState; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +@ToolExecutor(id = GatkWrapperAnalysisExecutor.ID, + tool = GatkWrapperAnalysis.ID, + source = ToolExecutor.Source.STORAGE, + framework = ToolExecutor.Framework.LOCAL) +public class GatkWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor { + + public final static String ID = GatkWrapperAnalysis.ID + "-local"; + + private String study; + private String command; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public String getDockerImageName() { + return "broadinstitute/gatk"; + } + + @Override + public String getDockerImageVersion() { + return ""; + } + + @Override + public void run() throws ToolException { + switch (command) { + case "HaplotypeCaller": + runHaplotypeCaller(); + break; + default: + throw new ToolException("Gatk command '" + command + "' is not supported yet."); + } + } + + private void runHaplotypeCaller() throws ToolException { + StringBuilder sb = initCommandLine(); + + // Append mounts + Set inputFileParamNames = GatkWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(null, inputFileParamNames, + getExecutorParams()); + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand("gatk " + command, sb); + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append output file params + String value = null; + if (getExecutorParams().containsKey("O")) { + value = String.valueOf(getExecutorParams().get("O")); + } + if (StringUtils.isEmpty(value)) { + value = "out.vcf"; + } + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("O", value))); + appendOutputFiles(outputFilenames, sb); + + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("O")); + skipParams.addAll(inputFileParamNames); + appendOtherParams(skipParams, sb); + + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); + } + + public String getStudy() { + return study; + } + + public GatkWrapperAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } + + public String getCommand() { + return command; + } + + public GatkWrapperAnalysisExecutor setCommand(String command) { + this.command = command; + return this; + } +} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java index 575b7abf82d..df5f578f95b 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java @@ -39,9 +39,8 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.FamilyIndexCommandOptions.FAMILY_INDEX_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.FamilyQcCommandOptions.FAMILY_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GatkCommandOptions.GATK_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.IndividualQcCommandOptions.INDIVIDUAL_QC_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GwasCommandOptions.GWAS_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.IndividualQcCommandOptions.INDIVIDUAL_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.InferredSexCommandOptions.INFERRED_SEX_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.JulieRunCommandOptions.JULIE_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.KnockoutCommandOptions.KNOCKOUT_RUN_COMMAND; @@ -52,6 +51,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTEST_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleEligibilityCommandOptions.SAMPLE_ELIGIBILITY_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleIndexCommandOptions.SAMPLE_INDEX_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleVariantStatsCommandOptions.SAMPLE_VARIANT_STATS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleVariantStatsQueryCommandOptions.SAMPLE_VARIANT_STATS_QUERY_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantAnnotateCommandOptions.ANNOTATION_INDEX_COMMAND; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index 4460b8a909f..0389bf951b8 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -48,9 +48,9 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.GatkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; import org.opencb.opencga.app.cli.internal.options.VariantCommandOptions; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -951,19 +951,13 @@ private void rvtests() throws Exception { private void gatk() throws Exception { VariantCommandOptions.GatkCommandOptions cliOptions = variantCommandOptions.gatkCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.basicOptions.params); - GatkWrapperAnalysis gatk = new GatkWrapperAnalysis(); - gatk.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), - variantCommandOptions.internalJobOptions.jobId, cliOptions.basicOptions.token); - - gatk.setStudy(cliOptions.study); - gatk.setCommand(cliOptions.command); - gatk.setFastaFile(cliOptions.fastaFile); - gatk.setBamFile(cliOptions.bamFile); - gatk.setVcfFilename(cliOptions.vcfFilename); + ObjectMap params = new GatkWrapperParams( + cliOptions.command, + cliOptions.outdir, + cliOptions.gatkParams) + .toObjectMap(cliOptions.basicOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); - gatk.start(); + toolRunner.execute(GatkWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index 084d710cd5a..203b9614e94 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -36,9 +36,9 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.GatkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.GeneralCliOptions.DataModelOptions; import org.opencb.opencga.app.cli.GeneralCliOptions.NumericOptions; @@ -65,6 +65,9 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantSampleQueryCommandOptions.SAMPLE_QUERY_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantSecondaryIndexCommandOptions.SECONDARY_INDEX_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantSecondaryIndexDeleteCommandOptions.SECONDARY_INDEX_DELETE_COMMAND; +import static org.opencb.opencga.core.api.ParamConstants.GATK_COMMAND_DESCRIPTION; +import static org.opencb.opencga.core.api.ParamConstants.OUTPUT_DIRECTORY_DESCRIPTION; +import static org.opencb.opencga.core.api.ParamConstants.STUDY_DESCRIPTION; import static org.opencb.opencga.storage.app.cli.client.options.StorageVariantCommandOptions.AggregateCommandOptions.AGGREGATE_COMMAND; import static org.opencb.opencga.storage.app.cli.client.options.StorageVariantCommandOptions.AggregateCommandOptions.AGGREGATE_COMMAND_DESCRIPTION; import static org.opencb.opencga.storage.app.cli.client.options.StorageVariantCommandOptions.AggregateFamilyCommandOptions.AGGREGATE_FAMILY_COMMAND; @@ -1407,6 +1410,43 @@ public class SampleQcCommandOptions { public String outdir; } + + @Parameters(commandNames = JulieRunCommandOptions.JULIE_RUN_COMMAND, commandDescription = JulieRunCommandOptions.DESCRIPTION) + public class JulieRunCommandOptions extends GenericJulieRunCommandOptions { + public static final String JULIE_RUN_COMMAND = JulieTool.ID + "-run"; + public static final String DESCRIPTION = JulieTool.DESCRIPTION; + + @ParametersDelegate + public GeneralCliOptions.CommonCommandOptions commonOptions = commonCommandOptions; + + @ParametersDelegate + public Object internalJobOptions = internalJobOptionsObject; + + } + + public static class GenericJulieRunCommandOptions { + @Parameter(names = {"--project"}, description = PROJECT_DESC) + public String project; + + @Parameter(names = {"--cohort"}, description = "List of cohorts from multiple studies with {study}:{cohort}") + public String cohort; + + @Parameter(names = {"--region"}, description = "Region to process") + public String region; + + @Parameter(names = {"--overwrite"}, description = "Overwrite all population frequencies.") + public boolean overwrite; + + @Parameter(names = {"-o", "--outdir"}, description = "Output directory.", arity = 1, required = false) + public String outdir; + } + + //------------------------------------------------------------------------- + // W R A P P E R S A N A L Y S I S + //------------------------------------------------------------------------- + + // Plink + @Parameters(commandNames = PlinkCommandOptions.PLINK_RUN_COMMAND, commandDescription = PlinkWrapperAnalysis.DESCRIPTION) public class PlinkCommandOptions { public static final String PLINK_RUN_COMMAND = PlinkWrapperAnalysis.ID + "-run"; @@ -1437,6 +1477,8 @@ public class PlinkCommandOptions { public String outdir; } + // RvTests + @Parameters(commandNames = RvtestsCommandOptions.RVTEST_RUN_COMMAND, commandDescription = RvtestsWrapperAnalysis.DESCRIPTION) public class RvtestsCommandOptions { public static final String RVTEST_RUN_COMMAND = RvtestsWrapperAnalysis.ID + "-run"; @@ -1475,7 +1517,9 @@ public class RvtestsCommandOptions { public String outdir; } - @Parameters(commandNames = GatkCommandOptions.GATK_RUN_COMMAND, commandDescription = GatkWrapperAnalysis.DESCRIPTION) + // GATK + + @Parameters(commandNames = org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis.ID, commandDescription = org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis.DESCRIPTION) public class GatkCommandOptions { public static final String GATK_RUN_COMMAND = GatkWrapperAnalysis.ID + "-run"; @@ -1488,53 +1532,16 @@ public class GatkCommandOptions { @ParametersDelegate public Object internalJobOptions = internalJobOptionsObject; - @Parameter(names = {"--study"}, description = "Study.") + @Parameter(names = {"-s", "--study"}, description = STUDY_DESCRIPTION, arity = 1) public String study; - @Parameter(names = {"--command"}, description = "Gatk command. Currently, the only command supported is 'HaplotypeCaller'") - public String command = "HaplotypeCaller"; - - @Parameter(names = {"--fasta-file"}, description = "FASTA file for reference genome") - public String fastaFile; - - @Parameter(names = {"--bam-file"}, description = "BAM file for input alignments.") - public String bamFile; + @Parameter(names = {"--command"}, description = GATK_COMMAND_DESCRIPTION) + public String command; - @Parameter(names = {"--vcf-filename"}, description = "VCF filename.") - public String vcfFilename; - - @Parameter(names = {"-o", "--outdir"}, description = "Output directory.") + @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) public String outdir; - } - - - @Parameters(commandNames = JulieRunCommandOptions.JULIE_RUN_COMMAND, commandDescription = JulieRunCommandOptions.DESCRIPTION) - public class JulieRunCommandOptions extends GenericJulieRunCommandOptions { - public static final String JULIE_RUN_COMMAND = JulieTool.ID + "-run"; - public static final String DESCRIPTION = JulieTool.DESCRIPTION; - - @ParametersDelegate - public GeneralCliOptions.CommonCommandOptions commonOptions = commonCommandOptions; - - @ParametersDelegate - public Object internalJobOptions = internalJobOptionsObject; - } - - public static class GenericJulieRunCommandOptions { - @Parameter(names = {"--project"}, description = PROJECT_DESC) - public String project; - - @Parameter(names = {"--cohort"}, description = "List of cohorts from multiple studies with {study}:{cohort}") - public String cohort; - - @Parameter(names = {"--region"}, description = "Region to process") - public String region; - - @Parameter(names = {"--overwrite"}, description = "Overwrite all population frequencies.") - public boolean overwrite; - - @Parameter(names = {"-o", "--outdir"}, description = "Output directory.", arity = 1, required = false) - public String outdir; + @DynamicParameter(names = {"--gatk-params"}, description = "Gatk parameters e.g.:. --gatk-params I=test.bam") + public Map gatkParams = new HashMap<>(); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 2f89895829a..4a10715bd9f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -37,8 +37,10 @@ import org.opencb.opencga.app.cli.internal.options.VariantCommandOptions; import org.opencb.opencga.app.cli.main.executors.OpencgaCommandExecutor; import org.opencb.opencga.app.cli.main.io.VcfOutputWriter; +import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.client.exceptions.ClientException; +import org.opencb.opencga.core.models.variant.GatkWrapperParams; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.variant.*; import org.opencb.opencga.core.response.RestResponse; @@ -730,7 +732,20 @@ public RestResponse annotationMetadata() throws ClientException { return openCGAClient.getVariantClient().metadataAnnotation(getParams(cliOptions.project, null).append("annotationId", cliOptions.annotationId)); } - // Wrappers + //------------------------------------------------------------------------- + // W R A P P E R S A N A L Y S I S + //------------------------------------------------------------------------- + + // Gatk + + private RestResponse gatk() throws ClientException { + VariantCommandOptions.GatkCommandOptions cliOptions = variantCommandOptions.gatkCommandOptions; + + ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); + + return openCGAClient.getVariantClient().runGatk(new GatkWrapperParams(cliOptions.command, cliOptions.outdir, cliOptions.gatkParams), + params); + } private RestResponse plink() throws ClientException { return openCGAClient.getVariantClient().runPlink( @@ -757,19 +772,6 @@ private RestResponse rvtests() throws ClientException { ), getParams(variantCommandOptions.rvtestsCommandOptions.study)); } - - private RestResponse gatk() throws ClientException { - return openCGAClient.getVariantClient().runGatk( - new GatkRunParams( - variantCommandOptions.gatkCommandOptions.command, - variantCommandOptions.gatkCommandOptions.fastaFile, - variantCommandOptions.gatkCommandOptions.bamFile, - variantCommandOptions.gatkCommandOptions.vcfFilename, - variantCommandOptions.gatkCommandOptions.outdir, - variantCommandOptions.gatkCommandOptions.basicOptions.params - ), getParams(variantCommandOptions.gatkCommandOptions.study)); - } - private ObjectMap getParams(String study) { return getParams(null, study); } diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 4c5e9c3afec..7c79b46f094 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -32,26 +32,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.VariantStatsExportParams; -import org.opencb.opencga.core.models.variant.CircosAnalysisParams; -import org.opencb.opencga.core.models.variant.CohortVariantStatsAnalysisParams; -import org.opencb.opencga.core.models.variant.FamilyQcAnalysisParams; -import org.opencb.opencga.core.models.variant.GatkRunParams; -import org.opencb.opencga.core.models.variant.GwasAnalysisParams; -import org.opencb.opencga.core.models.variant.IndividualQcAnalysisParams; -import org.opencb.opencga.core.models.variant.InferredSexAnalysisParams; -import org.opencb.opencga.core.models.variant.KnockoutAnalysisParams; -import org.opencb.opencga.core.models.variant.MendelianErrorAnalysisParams; -import org.opencb.opencga.core.models.variant.MutationalSignatureAnalysisParams; -import org.opencb.opencga.core.models.variant.PlinkRunParams; -import org.opencb.opencga.core.models.variant.RelatednessAnalysisParams; -import org.opencb.opencga.core.models.variant.RvtestsRunParams; -import org.opencb.opencga.core.models.variant.SampleEligibilityAnalysisParams; -import org.opencb.opencga.core.models.variant.SampleQcAnalysisParams; -import org.opencb.opencga.core.models.variant.SampleVariantFilterParams; -import org.opencb.opencga.core.models.variant.SampleVariantStatsAnalysisParams; -import org.opencb.opencga.core.models.variant.VariantExportParams; -import org.opencb.opencga.core.models.variant.VariantIndexParams; -import org.opencb.opencga.core.models.variant.VariantStatsAnalysisParams; +import org.opencb.opencga.core.models.variant.*; import org.opencb.opencga.core.response.RestResponse; @@ -311,7 +292,7 @@ public RestResponse deleteFile(ObjectMap params) throws ClientException { * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse runGatk(GatkRunParams data, ObjectMap params) throws ClientException { + public RestResponse runGatk(GatkWrapperParams data, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); params.put("body", data); return execute("analysis", null, "variant/gatk", null, "run", params, POST, Job.class); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index 3869508cefb..4ddaaa10304 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -476,6 +476,11 @@ public class ParamConstants { // --------------------------------------------- + public static final String GATK_COMMANDS_SUPPORTED = "HaplotypeCaller"; + public static final String GATK_COMMAND_DESCRIPTION = "Supported Gatk commands: " + GATK_COMMANDS_SUPPORTED; + + // --------------------------------------------- + public static final String RPC_METHOD_DESCRIPTION = "RPC method used: {auto, gRPC, REST}. When auto, it will first try with gRPC and " + "if that does not work, it will try with REST"; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GatkRunParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GatkRunParams.java deleted file mode 100644 index 2b16ede4f99..00000000000 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GatkRunParams.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.core.models.variant; - -import org.opencb.opencga.core.tools.ToolParams; - -import java.util.Map; - -public class GatkRunParams extends ToolParams { - public static final String DESCRIPTION = "gatk params"; - private String command; // Valid value: HaplotypeCaller - private String fastaFile; // FASTA file - private String bamFile; // BAM file - private String vcfFilename; // VCF filename - private String outdir; - private Map gatkParams; - - public GatkRunParams() { - } - - public GatkRunParams(String command, String fastaFile, String bamFile, String vcfFilename, String outdir, - Map gatkParams) { - this.command = command; - this.fastaFile = fastaFile; - this.bamFile = bamFile; - this.vcfFilename = vcfFilename; - this.outdir = outdir; - this.gatkParams = gatkParams; - } - - public String getCommand() { - return command; - } - - public GatkRunParams setCommand(String command) { - this.command = command; - return this; - } - - public String getFastaFile() { - return fastaFile; - } - - public GatkRunParams setFastaFile(String fastaFile) { - this.fastaFile = fastaFile; - return this; - } - - public String getBamFile() { - return bamFile; - } - - public GatkRunParams setBamFile(String bamFile) { - this.bamFile = bamFile; - return this; - } - - public String getVcfFilename() { - return vcfFilename; - } - - public GatkRunParams setVcfFilename(String vcfFilename) { - this.vcfFilename = vcfFilename; - return this; - } - - public String getOutdir() { - return outdir; - } - - public GatkRunParams setOutdir(String outdir) { - this.outdir = outdir; - return this; - } - - public Map getGatkParams() { - return gatkParams; - } - - public GatkRunParams setGatkParams(Map gatkParams) { - this.gatkParams = gatkParams; - return this; - } -} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GatkWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GatkWrapperParams.java new file mode 100644 index 00000000000..3bfe9c51eb1 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GatkWrapperParams.java @@ -0,0 +1,61 @@ +package org.opencb.opencga.core.models.variant; + +import org.opencb.opencga.core.tools.ToolParams; + +import java.util.Map; + +import static org.opencb.opencga.core.api.ParamConstants.GATK_COMMAND_DESCRIPTION; + +public class GatkWrapperParams extends ToolParams { + public static final String DESCRIPTION = "Gatk parameters. " + GATK_COMMAND_DESCRIPTION; + + private String command; + private String outdir; + private Map gatkParams; + + public GatkWrapperParams() { + } + + public GatkWrapperParams(String command, String outdir, Map gatkParams) { + this.command = command; + this.outdir = outdir; + this.gatkParams = gatkParams; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("GatkWrapperParams{"); + sb.append("command='").append(command).append('\''); + sb.append(", outdir='").append(outdir).append('\''); + sb.append(", gatkParams=").append(gatkParams); + sb.append('}'); + return sb.toString(); + } + + public String getCommand() { + return command; + } + + public GatkWrapperParams setCommand(String command) { + this.command = command; + return this; + } + + public String getOutdir() { + return outdir; + } + + public GatkWrapperParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } + + public Map getGatkParams() { + return gatkParams; + } + + public GatkWrapperParams setGatkParams(Map gatkParams) { + this.gatkParams = gatkParams; + return this; + } +} diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index 4ae7674f237..36bb766900a 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -59,10 +59,12 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.*; +import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.bwa.BwaWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.DBIterator; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 75a1f9be6bf..3284a50a33d 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -55,10 +55,10 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.GatkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -1267,7 +1267,7 @@ public Response gatkRun( @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, - @ApiParam(value = GatkRunParams.DESCRIPTION, required = true) GatkRunParams params) { + @ApiParam(value = GatkWrapperParams.DESCRIPTION, required = true) GatkWrapperParams params) { return submitJob(GatkWrapperAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } From ac39210ea53eff0491179f930b673462d6d6abc0 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 7 May 2021 11:06:51 +0200 Subject: [PATCH 281/412] app: add new WS to index new auxiliar RGA collection, #1693 --- .../clinical/rga/AuxiliarRgaAnalysis.java | 32 +++++++++++++++++++ .../internal/InternalCliOptionsParser.java | 6 ++-- .../executors/ClinicalCommandExecutor.java | 14 ++++++++ .../options/ClinicalCommandOptions.java | 18 +++++++++++ .../opencga/core/api/ParamConstants.java | 5 +++ .../monitor/daemons/ExecutionDaemon.java | 2 ++ .../rest/analysis/ClinicalWebService.java | 13 +++++++- 7 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/AuxiliarRgaAnalysis.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/AuxiliarRgaAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/AuxiliarRgaAnalysis.java new file mode 100644 index 00000000000..9caa177f52e --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/AuxiliarRgaAnalysis.java @@ -0,0 +1,32 @@ +package org.opencb.opencga.analysis.clinical.rga; + +import org.opencb.opencga.analysis.rga.RgaManager; +import org.opencb.opencga.analysis.variant.operations.OperationTool; +import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.tools.annotations.Tool; + +@Tool(id = AuxiliarRgaAnalysis.ID, resource = Enums.Resource.CLINICAL, type = Tool.Type.OPERATION, + description = AuxiliarRgaAnalysis.DESCRIPTION) +public class AuxiliarRgaAnalysis extends OperationTool { + public final static String ID = "rga-aux-index"; + public final static String DESCRIPTION = ParamConstants.INDEX_AUXILIAR_COLLECTION_DESCRIPTION; + + private String study; + + private RgaManager rgaManager; + + @Override + protected void check() throws Exception { + super.check(); + + this.rgaManager = new RgaManager(configuration, storageConfiguration); + study = getStudyFqn(); + } + + @Override + protected void run() throws Exception { + step(() -> this.rgaManager.generateAuxiliarCollection(study, token)); + } + +} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java index 575b7abf82d..f28c290dc78 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java @@ -33,15 +33,15 @@ import static org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions.FastqcCommandOptions.FASTQC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions.PicardCommandOptions.PICARD_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions.SamtoolsCommandOptions.SAMTOOLS_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.ClinicalCommandOptions.RgaAuxiliarSecondaryIndexCommandOptions.RGA_AUX_INDEX_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.ClinicalCommandOptions.RgaSecondaryIndexCommandOptions.RGA_INDEX_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.CohortVariantStatsCommandOptions.COHORT_VARIANT_STATS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.CohortVariantStatsQueryCommandOptions.COHORT_VARIANT_STATS_QUERY_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.FamilyIndexCommandOptions.FAMILY_INDEX_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.FamilyQcCommandOptions.FAMILY_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GatkCommandOptions.GATK_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.IndividualQcCommandOptions.INDIVIDUAL_QC_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GwasCommandOptions.GWAS_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.IndividualQcCommandOptions.INDIVIDUAL_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.InferredSexCommandOptions.INFERRED_SEX_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.JulieRunCommandOptions.JULIE_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.KnockoutCommandOptions.KNOCKOUT_RUN_COMMAND; @@ -52,6 +52,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTEST_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleEligibilityCommandOptions.SAMPLE_ELIGIBILITY_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleIndexCommandOptions.SAMPLE_INDEX_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleVariantStatsCommandOptions.SAMPLE_VARIANT_STATS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleVariantStatsQueryCommandOptions.SAMPLE_VARIANT_STATS_QUERY_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantAnnotateCommandOptions.ANNOTATION_INDEX_COMMAND; @@ -214,6 +215,7 @@ public InternalCliOptionsParser() { clinicalSubCommands.addCommand(ZETTA_RUN_COMMAND, clinicalCommandOptions.zettaCommandOptions); clinicalSubCommands.addCommand(CANCER_TIERING_RUN_COMMAND, clinicalCommandOptions.cancerTieringCommandOptions); clinicalSubCommands.addCommand(RGA_INDEX_RUN_COMMAND, clinicalCommandOptions.rgaSecondaryIndexCommandOptions); + clinicalSubCommands.addCommand(RGA_AUX_INDEX_RUN_COMMAND, clinicalCommandOptions.rgaAuxiliarSecondaryIndexCommandOptions); fileCommandOptions = new FileCommandOptions(commonCommandOptions, jCommander); jCommander.addCommand("files", fileCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java index 5538165e0b5..a095615f8d2 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java @@ -24,6 +24,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.clinical.rga.AuxiliarRgaAnalysis; import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationConfiguration; @@ -43,6 +44,7 @@ import java.nio.file.Path; import java.nio.file.Paths; +import static org.opencb.opencga.app.cli.internal.options.ClinicalCommandOptions.RgaAuxiliarSecondaryIndexCommandOptions.RGA_AUX_INDEX_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.ClinicalCommandOptions.RgaSecondaryIndexCommandOptions.RGA_INDEX_RUN_COMMAND; import static org.opencb.opencga.app.cli.main.options.ClinicalCommandOptions.InterpretationCancerTieringCommandOptions.CANCER_TIERING_RUN_COMMAND; import static org.opencb.opencga.app.cli.main.options.ClinicalCommandOptions.InterpretationTeamCommandOptions.TEAM_RUN_COMMAND; @@ -91,6 +93,10 @@ public void execute() throws Exception { rgaIndex(); break; + case RGA_AUX_INDEX_RUN_COMMAND: + auxRgaIndex(); + break; + default: logger.error("Subcommand not valid"); break; @@ -107,6 +113,14 @@ private void rgaIndex() throws ToolException { toolRunner.execute(RgaAnalysis.class, params, outDir, options.jobOptions.jobId, options.commonOptions.token); } + private void auxRgaIndex() throws ToolException { + ClinicalCommandOptions.RgaAuxiliarSecondaryIndexCommandOptions options = clinicalCommandOptions.rgaAuxiliarSecondaryIndexCommandOptions; + Path outDir = Paths.get(options.outdir); + ObjectMap params = new ObjectMap() + .appendAll(options.commonOptions.params) + .append(ParamConstants.STUDY_PARAM, options.study); + toolRunner.execute(AuxiliarRgaAnalysis.class, params, outDir, options.jobOptions.jobId, options.commonOptions.token); + } private void tiering() throws Exception { ClinicalCommandOptions.TieringCommandOptions cliOptions = clinicalCommandOptions.tieringCommandOptions; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java index 77b78484ddb..8c6911b0ef1 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java @@ -5,6 +5,7 @@ import com.beust.jcommander.Parameters; import com.beust.jcommander.ParametersDelegate; import org.opencb.biodata.models.clinical.ClinicalProperty; +import org.opencb.opencga.analysis.clinical.rga.AuxiliarRgaAnalysis; import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.CancerTieringInterpretationAnalysis; @@ -33,6 +34,7 @@ public class ClinicalCommandOptions { public ZettaCommandOptions zettaCommandOptions; public CancerTieringCommandOptions cancerTieringCommandOptions; public RgaSecondaryIndexCommandOptions rgaSecondaryIndexCommandOptions; + public RgaAuxiliarSecondaryIndexCommandOptions rgaAuxiliarSecondaryIndexCommandOptions; public JCommander jCommander; public GeneralCliOptions.CommonCommandOptions commonCommandOptions; @@ -52,6 +54,7 @@ public ClinicalCommandOptions(GeneralCliOptions.CommonCommandOptions commonComma this.zettaCommandOptions = new ZettaCommandOptions(); this.cancerTieringCommandOptions = new CancerTieringCommandOptions(); this.rgaSecondaryIndexCommandOptions = new RgaSecondaryIndexCommandOptions(); + this.rgaAuxiliarSecondaryIndexCommandOptions = new RgaAuxiliarSecondaryIndexCommandOptions(); } @Parameters(commandNames = {InterpretationTieringCommandOptions.TIERING_RUN_COMMAND}, commandDescription = TieringInterpretationAnalysis.DESCRIPTION) @@ -268,4 +271,19 @@ public class RgaSecondaryIndexCommandOptions extends GeneralCliOptions.StudyOpti @Parameter(names = {"-o", "--outdir"}, description = "Directory where output files will be saved", required = true, arity = 1) public String outdir; } + + @Parameters(commandNames = {RgaSecondaryIndexCommandOptions.RGA_INDEX_RUN_COMMAND}, commandDescription = AuxiliarRgaAnalysis.DESCRIPTION) + public class RgaAuxiliarSecondaryIndexCommandOptions extends GeneralCliOptions.StudyOption { + + public static final String RGA_AUX_INDEX_RUN_COMMAND = AuxiliarRgaAnalysis.ID + "-run"; + + @ParametersDelegate + public GeneralCliOptions.CommonCommandOptions commonOptions = commonCommandOptions; + + @ParametersDelegate + public InternalCliOptionsParser.JobOptions jobOptions = internalJobOptions; + + @Parameter(names = {"-o", "--outdir"}, description = "Directory where output files will be saved", required = true, arity = 1) + public String outdir; + } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index 3869508cefb..5aea4c2bcf4 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -329,6 +329,11 @@ public class ParamConstants { public static final String GENE_DESCRIPTION = "Comma separated list of genes, e.g.: BCRA2,TP53"; public static final String GENE_PARAM = "gene"; + // --------------------------------------------- + // RGA + public static final String INDEX_AUXILIAR_COLLECTION_DESCRIPTION = "Index auxiliar collection to improve performance assuming RGA is completely indexed."; + public static final String INDEX_AUXILIAR_COLLECTION = "auxiliarIndex"; + // --------------------------------------------- // alignment diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index 4ae7674f237..6beff22b7cc 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -26,6 +26,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; +import org.opencb.opencga.analysis.clinical.rga.AuxiliarRgaAnalysis; import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.CancerTieringInterpretationAnalysis; @@ -230,6 +231,7 @@ public class ExecutionDaemon extends MonitorParentDaemon { put(CancerTieringInterpretationAnalysis.ID, "clinical " + CancerTieringInterpretationAnalysis.ID + "-run"); put(RgaAnalysis.ID, "clinical " + RgaAnalysis.ID + "-run"); + put(AuxiliarRgaAnalysis.ID, "clinical " + AuxiliarRgaAnalysis.ID + "-run"); put(JulieTool.ID, "variant julie-run"); }}; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index e0f0bc7cc6a..55bf45e362e 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -22,6 +22,7 @@ import org.opencb.biodata.models.clinical.interpretation.ClinicalVariant; import org.opencb.commons.datastore.core.*; import org.opencb.opencga.analysis.clinical.ClinicalInterpretationManager; +import org.opencb.opencga.analysis.clinical.rga.AuxiliarRgaAnalysis; import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.CancerTieringInterpretationAnalysis; @@ -976,8 +977,18 @@ public Response rgaIndexRun( @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, + @ApiParam(value = ParamConstants.INDEX_AUXILIAR_COLLECTION_DESCRIPTION, defaultValue = "false") + @QueryParam(ParamConstants.INDEX_AUXILIAR_COLLECTION) boolean indexAuxiliarColl, @ApiParam(value = RgaAnalysisParams.DESCRIPTION, required = true) RgaAnalysisParams params) { - return submitJob(RgaAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + if (indexAuxiliarColl) { + Map paramsMap = new HashMap<>(); + if (StringUtils.isNotEmpty(study)) { + paramsMap.putIfAbsent(ParamConstants.STUDY_PARAM, study); + } + return submitJob(AuxiliarRgaAnalysis.ID, null, study, paramsMap, jobName, jobDescription, dependsOn, jobTags); + } else { + return submitJob(RgaAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + } } //------------------------------------------------------------------------- From 52d3411b4fbfbb94ebc805602ca5bb385033b5b1 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 7 May 2021 11:32:57 +0200 Subject: [PATCH 282/412] analysis: index dbSnp field in RGA, #1693 --- .../analysis/rga/IndividualRgaConverter.java | 3 ++ .../opencga/analysis/rga/RgaDataModel.java | 13 +++++++ .../opencga/analysis/rga/RgaQueryParams.java | 4 +-- .../opencga/analysis/rga/RgaQueryParser.java | 3 +- .../opencb/opencga/analysis/rga/RgaUtils.java | 35 +++++++++++++++++-- .../src/main/resources/rga/managed-schema | 1 + .../rest/analysis/ClinicalWebService.java | 7 ++++ 7 files changed, 60 insertions(+), 6 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 149e09a89bc..c63ed44d595 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -241,6 +241,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI Set individualKnockoutSet = new HashSet<>(); List variantIds = new ArrayList<>(transcript.getVariants().size()); + List dbSnps = new ArrayList<>(transcript.getVariants().size()); List knockoutTypes = new ArrayList<>(transcript.getVariants().size()); List variantSummary = new ArrayList<>(transcript.getVariants().size()); Set types = new HashSet<>(); @@ -252,6 +253,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI List variants = transcript.getVariants(); for (KnockoutVariant variant : variants) { variantIds.add(variant.getId()); + dbSnps.add(variant.getDbSnp()); String knockoutType = variant.getKnockoutType() != null ? variant.getKnockoutType().name() : ""; knockoutTypes.add(knockoutType); if (variant.getType() != null) { @@ -320,6 +322,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI .setEnd(gene.getEnd()) .setTranscriptId(transcript.getId()) .setTranscriptBiotype(transcript.getBiotype()) + .setDbSnps(dbSnps) .setVariants(variantIds) .setTypes(new ArrayList<>(types)) .setKnockoutTypes(knockoutTypes) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java index 5a4062bce3d..ab4d342afbc 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java @@ -67,6 +67,9 @@ public class RgaDataModel { @Field private String transcriptBiotype; + @Field + private List dbSnps; + @Field private List variants; @@ -169,6 +172,7 @@ public String toString() { sb.append(", end=").append(end); sb.append(", transcriptId='").append(transcriptId).append('\''); sb.append(", transcriptBiotype='").append(transcriptBiotype).append('\''); + sb.append(", dbSnps=").append(dbSnps); sb.append(", variants=").append(variants); sb.append(", types=").append(types); sb.append(", knockoutTypes=").append(knockoutTypes); @@ -365,6 +369,15 @@ public RgaDataModel setTranscriptBiotype(String transcriptBiotype) { return this; } + public List getDbSnps() { + return dbSnps; + } + + public RgaDataModel setDbSnps(List dbSnps) { + this.dbSnps = dbSnps; + return this; + } + public List getVariants() { return variants; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java index a36fa30d2a9..07b04d19347 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParams.java @@ -59,8 +59,8 @@ public class RgaQueryParams implements QueryParam { public static final String VARIANTS_DESCR = "Filter by variant id."; public static final RgaQueryParams VARIANTS = new RgaQueryParams("variants", Type.TEXT_ARRAY, VARIANTS_DESCR); - public static final String DB_SNP_DESCR = "Filter by DB_SNP id."; - public static final RgaQueryParams DB_SNP = new RgaQueryParams("dbSnp", Type.TEXT_ARRAY, DB_SNP_DESCR); + public static final String DB_SNPS_DESCR = "Filter by DB_SNP id."; + public static final RgaQueryParams DB_SNPS = new RgaQueryParams("dbSnps", Type.TEXT_ARRAY, DB_SNPS_DESCR); public static final String KNOCKOUT_DESCR = "Filter by knockout type."; public static final RgaQueryParams KNOCKOUT = new RgaQueryParams("knockoutType", Type.TEXT, KNOCKOUT_DESCR); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java index b5534dd02d9..85f1d8c0e9a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java @@ -55,6 +55,7 @@ public SolrQuery parseQuery(Query query) throws RgaException { parseStringValue(finalQuery, CLINICAL_SIGNIFICANCE, RgaDataModel.CLINICAL_SIGNIFICANCES, filterList); // parseStringValue(finalQuery, TRANSCRIPT_BIOTYPE, RgaDataModel.TRANSCRIPT_BIOTYPE, filterList); parseStringValue(finalQuery, VARIANTS, RgaDataModel.VARIANTS, filterList); + parseStringValue(finalQuery, DB_SNPS, RgaDataModel.DB_SNPS, filterList); parseFilterValue(finalQuery, filterList); // Create Solr query, adding filter queries and fields to show @@ -82,7 +83,7 @@ public SolrQuery parseAuxQuery(Query query) throws RgaException { List filterList = new ArrayList<>(); parseStringValue(finalQuery, VARIANTS, AuxiliarRgaDataModel.ID, filterList); - parseStringValue(finalQuery, DB_SNP, AuxiliarRgaDataModel.DB_SNP, filterList); + parseStringValue(finalQuery, DB_SNPS, AuxiliarRgaDataModel.DB_SNP, filterList); parseStringValue(finalQuery, TYPE, AuxiliarRgaDataModel.TYPE, filterList); parseStringValue(finalQuery, KNOCKOUT, AuxiliarRgaDataModel.KNOCKOUT_TYPES, filterList); parseStringValue(finalQuery, CONSEQUENCE_TYPE, AuxiliarRgaDataModel.CONSEQUENCE_TYPES, filterList); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index c49f0628189..2a4e4cc80ef 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -278,6 +278,9 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, if (rgaDataModel.getVariants() != null) { for (int i = 0; i < rgaDataModel.getVariants().size(); i++) { String variantId = rgaDataModel.getVariants().get(i); + String dbSnp = CollectionUtils.isNotEmpty(rgaDataModel.getDbSnps()) + ? rgaDataModel.getDbSnps().get(i) + : null; if (variantIds.isEmpty() || variantIds.contains(variantId)) { KnockoutVariant knockoutVariant; @@ -302,6 +305,7 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, knockoutVariant = new KnockoutVariant() .setId(codedFeature.getId()) + .setDbSnp(codedFeature.getDbSnp()) .setKnockoutType(KnockoutVariant.KnockoutType.valueOf(codedFeature.getKnockoutType())) .setType(VariantType.valueOf(codedFeature.getType())) .setChromosome(variant.getChromosome()) @@ -316,6 +320,7 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, Variant variant = new Variant(variantId); knockoutVariant = new KnockoutVariant() .setId(variantId) + .setDbSnp(dbSnp) .setChromosome(variant.getChromosome()) .setStart(variant.getStart()) .setEnd(variant.getEnd()) @@ -487,11 +492,13 @@ public String getGnomadFrequency() { } public static class KnockoutTypeCount { - - private Set knockoutTypeQuery; - private List> popFreqQuery; + private Set variantIdQuery; + private Set dbSnpQuery; private Set typeQuery; + private Set knockoutTypeQuery; + private Set clinicalSignificanceQuery; private Set consequenceTypeQuery; + private List> popFreqQuery; private Set ids; private Map> transcriptCompHetIdsMap; @@ -500,8 +507,11 @@ public static class KnockoutTypeCount { private Set delOverlapIds; public KnockoutTypeCount(Query query) throws RgaException { + variantIdQuery = new HashSet<>(); + dbSnpQuery = new HashSet<>(); knockoutTypeQuery = new HashSet<>(); popFreqQuery = new LinkedList<>(); + clinicalSignificanceQuery = new HashSet<>(); typeQuery = new HashSet<>(); consequenceTypeQuery = new HashSet<>(); ids = new HashSet<>(); @@ -511,8 +521,11 @@ public KnockoutTypeCount(Query query) throws RgaException { delOverlapIds = new HashSet<>(); query = ParamUtils.defaultObject(query, Query::new); + variantIdQuery.addAll(query.getAsStringList(RgaQueryParams.VARIANTS.key())); + dbSnpQuery.addAll(query.getAsStringList(RgaQueryParams.DB_SNPS.key())); knockoutTypeQuery.addAll(query.getAsStringList(RgaQueryParams.KNOCKOUT.key())); typeQuery.addAll(query.getAsStringList(RgaQueryParams.TYPE.key())); + clinicalSignificanceQuery.addAll(query.getAsStringList(RgaQueryParams.CLINICAL_SIGNIFICANCE.key())); consequenceTypeQuery.addAll(query.getAsStringList(RgaQueryParams.CONSEQUENCE_TYPE.key()) .stream() .map(VariantQueryUtils::parseConsequenceType) @@ -528,6 +541,22 @@ public KnockoutTypeCount(Query query) throws RgaException { } public void processFeature(RgaUtils.CodedFeature codedFeature) { + if (codedFeature instanceof RgaUtils.CodedVariant) { + // Special checks for CodedVariants + RgaUtils.CodedVariant codedVariant = (CodedVariant) codedFeature; + if (!variantIdQuery.isEmpty() && !variantIdQuery.contains(codedVariant.getId())) { + return; + } + if (!dbSnpQuery.isEmpty() && !dbSnpQuery.contains(codedVariant.getDbSnp())) { + return; + } + if (!clinicalSignificanceQuery.isEmpty() + && codedVariant.getClinicalSignificances().stream().noneMatch((cs) -> clinicalSignificanceQuery.contains(cs))) { + return; + } + } + + // Common filters if (!knockoutTypeQuery.isEmpty() && !knockoutTypeQuery.contains(codedFeature.getKnockoutType())) { return; } diff --git a/opencga-clinical/src/main/resources/rga/managed-schema b/opencga-clinical/src/main/resources/rga/managed-schema index 53309706f7c..f30ecd1384a 100644 --- a/opencga-clinical/src/main/resources/rga/managed-schema +++ b/opencga-clinical/src/main/resources/rga/managed-schema @@ -587,6 +587,7 @@ + diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 55bf45e362e..e8bd0367f59 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -681,6 +681,7 @@ public Response interpretationDistinct( @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), // @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "dbSnps", value = RgaQueryParams.DB_SNPS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), @@ -724,6 +725,7 @@ public Response rgaIndividualQuery( @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), // @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "dbSnps", value = RgaQueryParams.DB_SNPS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), @@ -772,6 +774,7 @@ public Response rgaIndividualSummary( @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), // @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "dbSnps", value = RgaQueryParams.DB_SNPS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), @@ -815,6 +818,7 @@ public Response rgaGeneQuery( @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), // @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "dbSnps", value = RgaQueryParams.DB_SNPS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), @@ -863,6 +867,7 @@ public Response rgaGeneSummary( @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), // @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "dbSnps", value = RgaQueryParams.DB_SNPS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), @@ -906,6 +911,7 @@ public Response rgaVariantQuery( @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), // @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "dbSnps", value = RgaQueryParams.DB_SNPS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), @@ -948,6 +954,7 @@ public Response rgaVariantSummary( @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), // @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "dbSnps", value = RgaQueryParams.DB_SNPS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "type", value = RgaQueryParams.TYPE_DESCR, dataType = "string", paramType = "query"), From a4a39a816d3318563f20605e1a9fc1a45cfbc205 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 7 May 2021 12:20:54 +0200 Subject: [PATCH 283/412] analysis: add number of individuals in individual summary, #1693 --- .../opencb/opencga/analysis/rga/RgaManager.java | 14 ++++++++++++++ .../opencga/analysis/rga/RgaManagerTest.java | 2 ++ 2 files changed, 16 insertions(+) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 89f827d7998..8b7c2058667 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -819,6 +819,13 @@ public OpenCGAResult individualSummary(String study catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), preprocess.getUserId(), StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); + // Check number of individuals matching query without checking their permissions + Future totalIndividualsFuture = executor.submit(() -> { + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.INDIVIDUAL_ID + ")"); + DataResult result = rgaEngine.facetedQuery(collection, query, facetOptions); + return ((Number) result.first().getAggregationValues().get(0)).intValue(); + }); + List sampleIds = preprocess.getQuery().getAsStringList(RgaQueryParams.SAMPLE_ID.key()); preprocess.getQuery().remove(RgaQueryParams.SAMPLE_ID.key()); List knockoutByIndividualSummaryList = new ArrayList<>(sampleIds.size()); @@ -871,9 +878,16 @@ public OpenCGAResult individualSummary(String study } } + ObjectMap resultAttributes = new ObjectMap(); + try { + resultAttributes.put("totalIndividuals", totalIndividualsFuture.get()); + } catch (InterruptedException | ExecutionException e) { + logger.error("Unexpected error getting total number of individuals without checking permissions: {}", e.getMessage(), e); + } int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), knockoutByIndividualSummaryList.size(), knockoutByIndividualSummaryList, -1); + result.setAttributes(resultAttributes); if (preprocess.getQueryOptions().getBoolean(QueryOptions.COUNT)) { result.setNumMatches(preprocess.getNumTotalResults()); diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index af169b668a8..44a5a7d4866 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -232,6 +232,8 @@ public void testIndividualQueryLimit() throws CatalogException, IOException, Rga public void testIndividualSummary() throws CatalogException, IOException, RgaException { OpenCGAResult result = rgaManager.individualSummary(STUDY, new Query(), QueryOptions.empty(), ownerToken); assertEquals(4, result.getNumResults()); + assertTrue(result.getAttributes().containsKey("totalIndividuals")); + assertEquals(4, result.getAttributes().getInt("totalIndividuals")); for (KnockoutByIndividualSummary individual : result.getResults()) { if ("NA19685".equals(individual.getId()) || "NA19600".equals(individual.getId())) { assertEquals(2, individual.getNumParents()); From 572c30f70568616c67bcdf53bc86e07c9d8c97bc Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 7 May 2021 13:32:25 +0200 Subject: [PATCH 284/412] analysis: add transcriptChPairs to variant summary, #1693 --- .../opencb/opencga/analysis/rga/RgaManager.java | 9 +++++++++ .../opencb/opencga/analysis/rga/RgaUtils.java | 10 ++++++++++ .../opencga/analysis/rga/RgaManagerTest.java | 16 ++++++++++++++++ .../knockout/KnockoutByVariantSummary.java | 16 +++++++++++++++- 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 8b7c2058667..17f3f668ad4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -1293,8 +1293,16 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle boolean isCH = false; Set currentVariantSet = new HashSet<>(); Set otherVariantSet = new HashSet<>(); + + // Generate this new query object so if user is filtering by any id, we still get all the possible CH variant pairs + Query knockoutTypeQuery = new Query(query); + knockoutTypeQuery.remove(RgaQueryParams.VARIANTS.key()); + knockoutTypeQuery.remove(RgaQueryParams.DB_SNPS.key()); + KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(knockoutTypeQuery); + for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { CodedVariant codedVariant = CodedVariant.parseEncodedId(bucket.getValue()); + knockoutTypeCount.processFeature(codedVariant); KnockoutVariant auxKnockoutVariant = convertToKnockoutVariant(new Variant(codedVariant.getId())); auxKnockoutVariant.setKnockoutType(KnockoutVariant.KnockoutType.valueOf(codedVariant.getKnockoutType())); @@ -1322,6 +1330,7 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle allelePairList.addAll(currentVariantSet); allelePairList.addAll(otherVariantSet); knockoutByVariantSummary.setAllelePairs(allelePairList); + knockoutByVariantSummary.setTranscriptChPairs(knockoutTypeCount.getTranscriptCompHetIdsMap()); } else { knockoutByVariantSummary.setAllelePairs(new ArrayList<>(currentVariantSet)); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index 2a4e4cc80ef..cd8f7d30004 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -640,6 +640,16 @@ public int getNumHetIds() { public int getNumDelOverlapIds() { return delOverlapIds.size(); } + + public Map> getTranscriptCompHetIdsMap() { + Map> compHetMap = new HashMap<>(); + for (Map.Entry> entry : transcriptCompHetIdsMap.entrySet()) { + if (entry.getValue().size() > 1) { + compHetMap.put(entry.getKey(), new ArrayList<>(entry.getValue())); + } + } + return compHetMap; + } } } diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 44a5a7d4866..2f7a1b029ff 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -575,6 +575,22 @@ public void testVariantSummary() throws CatalogException, IOException, RgaExcept assertNotNull(variant.getDbSnp()); assertFalse(variant.getGenes().isEmpty()); } + + result = rgaManager.variantSummary(STUDY, new Query(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET), + QueryOptions.empty(), ownerToken); + assertEquals(4, result.getNumResults()); + for (KnockoutByVariantSummary variant : result.getResults()) { + assertFalse(variant.getTranscriptChPairs().isEmpty()); + for (List value : variant.getTranscriptChPairs().values()) { + assertTrue(value.size() >= 2); + } + assertTrue(variant.getAllelePairs().size() >= 2); + + assertNotNull(variant.getId()); + assertNotNull(variant.getDbSnp()); + assertFalse(variant.getGenes().isEmpty()); + } + } } \ No newline at end of file diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java index 7557dbe617f..183cf5694a3 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariantSummary.java @@ -6,6 +6,7 @@ import org.opencb.biodata.models.variant.avro.VariantType; import java.util.List; +import java.util.Map; public class KnockoutByVariantSummary { @@ -26,6 +27,7 @@ public class KnockoutByVariantSummary { private List allelePairs; private IndividualKnockoutStats individualStats; + private Map> transcriptChPairs; public KnockoutByVariantSummary() { } @@ -33,7 +35,8 @@ public KnockoutByVariantSummary() { public KnockoutByVariantSummary(String id, String dbSnp, String chromosome, int start, int end, int length, String reference, String alternate, VariantType type, List genes, List populationFrequencies, List sequenceOntologyTerms, List clinicalSignificances, - List allelePairs, IndividualKnockoutStats individualStats) { + List allelePairs, IndividualKnockoutStats individualStats, + Map> transcriptChPairs) { this.id = id; this.dbSnp = dbSnp; this.chromosome = chromosome; @@ -49,6 +52,7 @@ public KnockoutByVariantSummary(String id, String dbSnp, String chromosome, int this.clinicalSignificances = clinicalSignificances; this.allelePairs = allelePairs; this.individualStats = individualStats; + this.transcriptChPairs = transcriptChPairs; } @Override @@ -69,6 +73,7 @@ public String toString() { sb.append(", clinicalSignificances=").append(clinicalSignificances); sb.append(", allelePairs=").append(allelePairs); sb.append(", individualStats=").append(individualStats); + sb.append(", transcriptChPairs=").append(transcriptChPairs); sb.append('}'); return sb.toString(); } @@ -207,4 +212,13 @@ public KnockoutByVariantSummary setIndividualStats(IndividualKnockoutStats indiv this.individualStats = individualStats; return this; } + + public Map> getTranscriptChPairs() { + return transcriptChPairs; + } + + public KnockoutByVariantSummary setTranscriptChPairs(Map> transcriptChPairs) { + this.transcriptChPairs = transcriptChPairs; + return this; + } } From ca3c66bf8b44ab8bc340e2c257893f1c4557cf21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 7 May 2021 15:02:07 +0200 Subject: [PATCH 285/412] analysis: update RvTests wrapper analysis, #1756 --- .../wrappers/RvtestsWrapperAnalysis.java | 203 ------------------ .../internal/InternalCliOptionsParser.java | 4 +- .../VariantInternalCommandExecutor.java | 35 +-- .../options/VariantCommandOptions.java | 30 +-- .../app/cli/main/OpencgaCliOptionsParser.java | 4 +- .../analysis/VariantCommandExecutor.java | 24 +-- .../client/rest/clients/VariantClient.java | 2 +- .../opencga/core/api/ParamConstants.java | 5 + .../core/models/variant/RvtestsRunParams.java | 120 ----------- .../monitor/daemons/ExecutionDaemon.java | 2 +- .../rest/analysis/VariantWebService.java | 4 +- 11 files changed, 40 insertions(+), 393 deletions(-) delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/RvtestsWrapperAnalysis.java delete mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/RvtestsRunParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/RvtestsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/RvtestsWrapperAnalysis.java deleted file mode 100644 index 97014aa9151..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/RvtestsWrapperAnalysis.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.analysis.wrappers; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.opencb.commons.exec.Command; -import org.opencb.opencga.core.tools.annotations.Tool; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.common.Enums; - -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.nio.charset.Charset; -import java.util.*; - -@Tool(id = RvtestsWrapperAnalysis.ID, resource = Enums.Resource.VARIANT, description = RvtestsWrapperAnalysis.DESCRIPTION) -public class RvtestsWrapperAnalysis extends OpenCgaWrapperAnalysis { - - public final static String ID = "rvtests"; - public static final String DESCRIPTION = "Rvtests is a flexible software package for genetic association studies"; - - public final static String RVTESTS_DOCKER_IMAGE = "zhanxw/rvtests-docker"; - public final static String OUT_NAME = "out"; - - public static final String EXECUTABLE_PARAM = "executable"; - public static final String VCF_FILE_PARAM = "vcfFile"; - public static final String PHENOTYPE_FILE_PARAM = "phenoFile"; - public static final String PEDIGREE_FILE_PARAM = "pedigreeFile"; - public static final String KINSHIP_FILE_PARAM = "kinshipFile"; - public static final String COVAR_FILE_PARAM = "covarFile"; - - protected void check() throws Exception { - super.check(); - } - - @Override - protected void run() throws Exception { - step(() -> { - String commandLine = getCommandLine(); - logger.info("Rvtests command line:" + commandLine); - try { - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - Command cmd = new Command(getCommandLine()) - .setOutputOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDOUT_FILENAME).toFile()))) - .setErrorOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDERR_FILENAME).toFile()))); - - cmd.run(); - - // Check Rvtests errors by reading the stdout and stderr files - boolean success = false; - File file; - if ("rvtest".equals(params.getString(EXECUTABLE_PARAM))) { - file = new File(getScratchDir() + "/" + STDOUT_FILENAME); - List lines = FileUtils.readLines(file, Charset.defaultCharset()); - if (lines.get(lines.size() - 1).contains("successfully")) { - success = true; - } - } else if ("vcf2kinship".equals(params.getString(EXECUTABLE_PARAM))) { - file = new File(getScratchDir() + "/" + STDERR_FILENAME); - List lines = FileUtils.readLines(file, Charset.defaultCharset()); - if (lines.get(lines.size() - 1).contains("Analysis took")) { - success = true; - } - } - if (!success) { - file = new File(getScratchDir() + "/" + STDERR_FILENAME); - String msg = "Something wrong executing Rvtests"; - if (file.exists()) { - msg = StringUtils.join(FileUtils.readLines(file, Charset.defaultCharset()), ". "); - } - throw new ToolException(msg); - } - } catch (Exception e) { - throw new ToolException(e); - } - }); - } - -// @Override -// public String getDockerImageName() { -// return RVTESTS_DOCKER_IMAGE; -// } - -// @Override - public String getCommandLine() { - StringBuilder sb = new StringBuilder("docker run "); - - // Mount management - Map srcTargetMap = new HashMap<>(); - String[] names = {VCF_FILE_PARAM, PHENOTYPE_FILE_PARAM, PEDIGREE_FILE_PARAM, KINSHIP_FILE_PARAM, COVAR_FILE_PARAM}; - for (String name : names) { - if (params.containsKey(name) && StringUtils.isNotEmpty(params.getString(name))) { - String src = new File(params.getString(name)).getParentFile().getAbsolutePath(); - if (!srcTargetMap.containsKey(src)) { - srcTargetMap.put(src, DOCKER_INPUT_PATH + srcTargetMap.size()); - sb.append("--mount type=bind,source=\"").append(src).append("\",target=\"").append(srcTargetMap.get(src)).append("\" "); - } - } - } - sb.append("--mount type=bind,source=\"") - .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); - - // Docker image and version - sb.append(RVTESTS_DOCKER_IMAGE); - if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { - sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); - } - - // Executable values: rvtest or vcf2kinship - sb.append(" ").append(params.getString(EXECUTABLE_PARAM)).append(" "); - - for (String key : params.keySet()) { - if (checkParam(key)) { - String value = params.getString(key); - if (key.equals("out")) { - sb.append(" --out ").append(" ").append(DOCKER_OUTPUT_PATH).append("/").append(value); - } else { - sb.append(" --").append(key); - if (StringUtils.isNotEmpty(value)) { - sb.append(" ").append(value); - } - } - } - } - if (!params.containsKey("out")) { - sb.append(" --out ").append(DOCKER_OUTPUT_PATH).append("/").append(OUT_NAME); - } - - // Input files management - String filename = params.getString(VCF_FILE_PARAM, null); - if (StringUtils.isNotEmpty(filename)) { - File file = new File(filename); - sb.append(" --inVcf ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - filename = params.getString(PHENOTYPE_FILE_PARAM, null); - if (StringUtils.isNotEmpty(filename)) { - File file = new File(filename); - sb.append(" --pheno ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - filename = params.getString(PEDIGREE_FILE_PARAM, null); - if (StringUtils.isNotEmpty(filename)) { - File file = new File(filename); - sb.append(" --pedigree ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - filename = params.getString(KINSHIP_FILE_PARAM, null); - if (StringUtils.isNotEmpty(filename)) { - File file = new File(filename); - sb.append(" --kinship ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - filename = params.getString(COVAR_FILE_PARAM, null); - if (StringUtils.isNotEmpty(filename)) { - File file = new File(filename); - sb.append(" --covar ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - - return sb.toString(); - } - - private String getMountParameters() { - Set sources = new HashSet<>(); - String[] names = {VCF_FILE_PARAM, PHENOTYPE_FILE_PARAM, PEDIGREE_FILE_PARAM, KINSHIP_FILE_PARAM, COVAR_FILE_PARAM}; - for (String name : names) { - if (params.containsKey(name) && StringUtils.isNotEmpty(params.getString(name))) { - sources.add(new File(params.getString(name)).getParentFile().getAbsolutePath()); - } - } - - StringBuilder sb = new StringBuilder(); - sources.forEach(s - -> sb.append("--mount type=bind,source=\"").append(s).append("\",target=\"").append(DOCKER_INPUT_PATH).append("\" ")); - sb.append("--mount type=bind,source=\"") - .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); - - return sb.toString(); - } - - private boolean checkParam(String key) { - if (key.equals(DOCKER_IMAGE_VERSION_PARAM) || key.equals(EXECUTABLE_PARAM) || key.equals(VCF_FILE_PARAM) - || key.equals(PHENOTYPE_FILE_PARAM) || key.equals(PEDIGREE_FILE_PARAM) || key.equals(KINSHIP_FILE_PARAM) - || key.equals(COVAR_FILE_PARAM)) { - return false; - } - return true; - } -} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java index df5f578f95b..8ec912fa6ff 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java @@ -48,7 +48,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.MutationalSignatureCommandOptions.MUTATIONAL_SIGNATURE_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.PlinkCommandOptions.PLINK_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RelatednessCommandOptions.RELATEDNESS_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTEST_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTESTS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleEligibilityCommandOptions.SAMPLE_ELIGIBILITY_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleIndexCommandOptions.SAMPLE_INDEX_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; @@ -170,7 +170,7 @@ public InternalCliOptionsParser() { variantSubCommands.addCommand(INDIVIDUAL_QC_RUN_COMMAND, variantCommandOptions.individualQcCommandOptions); variantSubCommands.addCommand(SAMPLE_QC_RUN_COMMAND, variantCommandOptions.sampleQcCommandOptions); variantSubCommands.addCommand(PLINK_RUN_COMMAND, variantCommandOptions.plinkCommandOptions); - variantSubCommands.addCommand(RVTEST_RUN_COMMAND, variantCommandOptions.rvtestsCommandOptions); + variantSubCommands.addCommand(RVTESTS_RUN_COMMAND, variantCommandOptions.rvtestsCommandOptions); variantSubCommands.addCommand(GATK_RUN_COMMAND, variantCommandOptions.gatkCommandOptions); alignmentCommandOptions = new AlignmentCommandOptions(commonCommandOptions, jCommander, false); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index 0389bf951b8..0a8aa777af9 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -49,8 +49,8 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.rvtests.RvtestsWrapperAnalysis; import org.opencb.opencga.app.cli.internal.options.VariantCommandOptions; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -88,7 +88,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.MutationalSignatureCommandOptions.MUTATIONAL_SIGNATURE_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.PlinkCommandOptions.PLINK_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RelatednessCommandOptions.RELATEDNESS_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTEST_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTESTS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleIndexCommandOptions.SAMPLE_INDEX_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleVariantStatsCommandOptions.SAMPLE_VARIANT_STATS_RUN_COMMAND; @@ -231,7 +231,7 @@ public void execute() throws Exception { case PLINK_RUN_COMMAND: plink(); break; - case RVTEST_RUN_COMMAND: + case RVTESTS_RUN_COMMAND: rvtests(); break; case GATK_RUN_COMMAND: @@ -922,31 +922,14 @@ private void plink() throws Exception { private void rvtests() throws Exception { VariantCommandOptions.RvtestsCommandOptions cliOptions = variantCommandOptions.rvtestsCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.basicOptions.params); - params.put(RvtestsWrapperAnalysis.EXECUTABLE_PARAM, cliOptions.executable); - if (StringUtils.isNotEmpty(cliOptions.vcfFile)) { - params.put(RvtestsWrapperAnalysis.VCF_FILE_PARAM, cliOptions.vcfFile); - } - if (StringUtils.isNotEmpty(cliOptions.phenoFile)) { - params.put(RvtestsWrapperAnalysis.PHENOTYPE_FILE_PARAM, cliOptions.phenoFile); - } - if (StringUtils.isNotEmpty(cliOptions.pedigreeFile)) { - params.put(RvtestsWrapperAnalysis.PEDIGREE_FILE_PARAM, cliOptions.pedigreeFile); - } - if (StringUtils.isNotEmpty(cliOptions.kinshipFile)) { - params.put(RvtestsWrapperAnalysis.KINSHIP_FILE_PARAM, cliOptions.kinshipFile); - } - if (StringUtils.isNotEmpty(cliOptions.covarFile)) { - params.put(RvtestsWrapperAnalysis.COVAR_FILE_PARAM, cliOptions.covarFile); - } - - RvtestsWrapperAnalysis rvtests = new RvtestsWrapperAnalysis(); - rvtests.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), - variantCommandOptions.internalJobOptions.jobId, token); + ObjectMap params = new RvtestsWrapperParams( + cliOptions.command, + cliOptions.outdir, + cliOptions.rvtestsParams) + .toObjectMap(cliOptions.basicOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); - rvtests.start(); + toolRunner.execute(RvtestsWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } private void gatk() throws Exception { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index 203b9614e94..ca2140ee13a 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -37,8 +37,8 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.rvtests.RvtestsWrapperAnalysis; import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.GeneralCliOptions.DataModelOptions; import org.opencb.opencga.app.cli.GeneralCliOptions.NumericOptions; @@ -65,9 +65,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantSampleQueryCommandOptions.SAMPLE_QUERY_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantSecondaryIndexCommandOptions.SECONDARY_INDEX_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.VariantSecondaryIndexDeleteCommandOptions.SECONDARY_INDEX_DELETE_COMMAND; -import static org.opencb.opencga.core.api.ParamConstants.GATK_COMMAND_DESCRIPTION; -import static org.opencb.opencga.core.api.ParamConstants.OUTPUT_DIRECTORY_DESCRIPTION; -import static org.opencb.opencga.core.api.ParamConstants.STUDY_DESCRIPTION; +import static org.opencb.opencga.core.api.ParamConstants.*; import static org.opencb.opencga.storage.app.cli.client.options.StorageVariantCommandOptions.AggregateCommandOptions.AGGREGATE_COMMAND; import static org.opencb.opencga.storage.app.cli.client.options.StorageVariantCommandOptions.AggregateCommandOptions.AGGREGATE_COMMAND_DESCRIPTION; import static org.opencb.opencga.storage.app.cli.client.options.StorageVariantCommandOptions.AggregateFamilyCommandOptions.AGGREGATE_FAMILY_COMMAND; @@ -1479,9 +1477,9 @@ public class PlinkCommandOptions { // RvTests - @Parameters(commandNames = RvtestsCommandOptions.RVTEST_RUN_COMMAND, commandDescription = RvtestsWrapperAnalysis.DESCRIPTION) + @Parameters(commandNames = RvtestsCommandOptions.RVTESTS_RUN_COMMAND, commandDescription = RvtestsWrapperAnalysis.DESCRIPTION) public class RvtestsCommandOptions { - public static final String RVTEST_RUN_COMMAND = RvtestsWrapperAnalysis.ID + "-run"; + public static final String RVTESTS_RUN_COMMAND = RvtestsWrapperAnalysis.ID + "-run"; @ParametersDelegate public GeneralCliOptions.CommonCommandOptions basicOptions = commonCommandOptions; @@ -1496,25 +1494,13 @@ public class RvtestsCommandOptions { public String study; @Parameter(names = {"--command"}, description = "Rvtests command. Valid values: rvtest or vcf2kinship.") - public String executable = "rvtest"; - - @Parameter(names = {"--vcf-file"}, description = "VCF file.") - public String vcfFile; - - @Parameter(names = {"--pheno-file"}, description = "Phenotype file.") - public String phenoFile; - - @Parameter(names = {"--pedigree-file"}, description = "Pedigree file.") - public String pedigreeFile; - - @Parameter(names = {"--kinship-file"}, description = "Kinship file.") - public String kinshipFile; - - @Parameter(names = {"--covar-file"}, description = "Covariate file.") - public String covarFile; + public String command = "rvtest"; @Parameter(names = {"-o", "--outdir"}, description = "Output directory.") public String outdir; + + @DynamicParameter(names = {"--rvtests-params"}, description = "RvTests parameters e.g.:. --rvtests-params single=famScore --rvtests-params meta=score,cov") + public Map rvtestsParams = new HashMap<>(); } // GATK diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index c82c4c87f42..5d609b5a168 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -45,7 +45,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.MutationalSignatureCommandOptions.MUTATIONAL_SIGNATURE_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.PlinkCommandOptions.PLINK_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RelatednessCommandOptions.RELATEDNESS_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTEST_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTESTS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleEligibilityCommandOptions.SAMPLE_ELIGIBILITY_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleVariantStatsCommandOptions.SAMPLE_VARIANT_STATS_RUN_COMMAND; @@ -295,7 +295,7 @@ public OpencgaCliOptionsParser() { variantSubCommands.addCommand(INDIVIDUAL_QC_RUN_COMMAND, variantCommandOptions.individualQcCommandOptions); variantSubCommands.addCommand(SAMPLE_QC_RUN_COMMAND, variantCommandOptions.sampleQcCommandOptions); variantSubCommands.addCommand(PLINK_RUN_COMMAND, variantCommandOptions.plinkCommandOptions); - variantSubCommands.addCommand(RVTEST_RUN_COMMAND, variantCommandOptions.rvtestsCommandOptions); + variantSubCommands.addCommand(RVTESTS_RUN_COMMAND, variantCommandOptions.rvtestsCommandOptions); variantSubCommands.addCommand(GATK_RUN_COMMAND, variantCommandOptions.gatkCommandOptions); clinicalCommandOptions = new ClinicalCommandOptions(this.commonCommandOptions, dataModelOptions, numericOptions, jCommander); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 4a10715bd9f..99938fe61ba 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -40,7 +40,6 @@ import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.client.exceptions.ClientException; -import org.opencb.opencga.core.models.variant.GatkWrapperParams; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.variant.*; import org.opencb.opencga.core.response.RestResponse; @@ -67,7 +66,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.MutationalSignatureCommandOptions.MUTATIONAL_SIGNATURE_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.PlinkCommandOptions.PLINK_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RelatednessCommandOptions.RELATEDNESS_RUN_COMMAND; -import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTEST_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.RvtestsCommandOptions.RVTESTS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleEligibilityCommandOptions.SAMPLE_ELIGIBILITY_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleQcCommandOptions.SAMPLE_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.SampleVariantStatsCommandOptions.SAMPLE_VARIANT_STATS_RUN_COMMAND; @@ -206,7 +205,7 @@ public void execute() throws Exception { queryResponse = plink(); break; - case RVTEST_RUN_COMMAND: + case RVTESTS_RUN_COMMAND: queryResponse = rvtests(); break; @@ -758,18 +757,15 @@ private RestResponse plink() throws ClientException { ), getParams(variantCommandOptions.plinkCommandOptions.study)); } + // RvTests + private RestResponse rvtests() throws ClientException { - return openCGAClient.getVariantClient().runRvtests( - new RvtestsRunParams( - variantCommandOptions.rvtestsCommandOptions.executable, - variantCommandOptions.rvtestsCommandOptions.vcfFile, - variantCommandOptions.rvtestsCommandOptions.phenoFile, - variantCommandOptions.rvtestsCommandOptions.pedigreeFile, - variantCommandOptions.rvtestsCommandOptions.kinshipFile, - variantCommandOptions.rvtestsCommandOptions.covarFile, - variantCommandOptions.rvtestsCommandOptions.outdir, - variantCommandOptions.rvtestsCommandOptions.basicOptions.params - ), getParams(variantCommandOptions.rvtestsCommandOptions.study)); + VariantCommandOptions.RvtestsCommandOptions cliOptions = variantCommandOptions.rvtestsCommandOptions; + + ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); + + return openCGAClient.getVariantClient().runRvtests(new RvtestsWrapperParams(cliOptions.command, cliOptions.outdir, + cliOptions.rvtestsParams), params); } private ObjectMap getParams(String study) { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 7c79b46f094..608f9041eb8 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -670,7 +670,7 @@ public RestResponse runRelatedness(RelatednessAnalysisParams data, ObjectMa * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse runRvtests(RvtestsRunParams data, ObjectMap params) throws ClientException { + public RestResponse runRvtests(RvtestsWrapperParams data, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); params.put("body", data); return execute("analysis", null, "variant/rvtests", null, "run", params, POST, Job.class); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java index 4ddaaa10304..9a7dafd32fc 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/ParamConstants.java @@ -481,6 +481,11 @@ public class ParamConstants { // --------------------------------------------- + public static final String RVTESTS_COMMANDS_SUPPORTED = "rvtest, vcf2kinship"; + public static final String RVTESTS_COMMAND_DESCRIPTION = "Supported RvTests commands: " + RVTESTS_COMMANDS_SUPPORTED; + + // --------------------------------------------- + public static final String RPC_METHOD_DESCRIPTION = "RPC method used: {auto, gRPC, REST}. When auto, it will first try with gRPC and " + "if that does not work, it will try with REST"; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/RvtestsRunParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/RvtestsRunParams.java deleted file mode 100644 index 8f5beaa27d6..00000000000 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/RvtestsRunParams.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.core.models.variant; - -import org.opencb.opencga.core.tools.ToolParams; - -import java.util.Map; - -public class RvtestsRunParams extends ToolParams { - public static final String DESCRIPTION = "rvtest params"; - private String command; // Valid values: rvtests or vcf2kinship - private String vcfFile; // VCF file - private String phenoFile; // Phenotype file - private String pedigreeFile; // Pedigree file - private String kinshipFile; // Kinship file - private String covarFile; // Covariate file - private String outdir; - private Map rvtestsParams; - - public RvtestsRunParams() { - } - - public RvtestsRunParams(String command, String vcfFile, String phenoFile, String pedigreeFile, String kinshipFile, String covarFile, - String outdir, Map rvtestsParams) { - this.command = command; - this.vcfFile = vcfFile; - this.phenoFile = phenoFile; - this.pedigreeFile = pedigreeFile; - this.kinshipFile = kinshipFile; - this.covarFile = covarFile; - this.outdir = outdir; - this.rvtestsParams = rvtestsParams; - } - - public String getCommand() { - return command; - } - - public RvtestsRunParams setCommand(String command) { - this.command = command; - return this; - } - - public String getVcfFile() { - return vcfFile; - } - - public RvtestsRunParams setVcfFile(String vcfFile) { - this.vcfFile = vcfFile; - return this; - } - - public String getPhenoFile() { - return phenoFile; - } - - public RvtestsRunParams setPhenoFile(String phenoFile) { - this.phenoFile = phenoFile; - return this; - } - - public String getPedigreeFile() { - return pedigreeFile; - } - - public RvtestsRunParams setPedigreeFile(String pedigreeFile) { - this.pedigreeFile = pedigreeFile; - return this; - } - - public String getKinshipFile() { - return kinshipFile; - } - - public RvtestsRunParams setKinshipFile(String kinshipFile) { - this.kinshipFile = kinshipFile; - return this; - } - - public String getCovarFile() { - return covarFile; - } - - public RvtestsRunParams setCovarFile(String covarFile) { - this.covarFile = covarFile; - return this; - } - - public String getOutdir() { - return outdir; - } - - public RvtestsRunParams setOutdir(String outdir) { - this.outdir = outdir; - return this; - } - - public Map getRvtestsParams() { - return rvtestsParams; - } - - public RvtestsRunParams setRvtestsParams(Map rvtestsParams) { - this.rvtestsParams = rvtestsParams; - return this; - } -} diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index 36bb766900a..03fe078c6ba 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -60,12 +60,12 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.bwa.BwaWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.rvtests.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.DBIterator; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 3284a50a33d..2b636dd4718 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -56,9 +56,9 @@ import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; -import org.opencb.opencga.analysis.wrappers.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.rvtests.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -1254,7 +1254,7 @@ public Response rvtestsRun( @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, - @ApiParam(value = RvtestsRunParams.DESCRIPTION, required = true) RvtestsRunParams params) { + @ApiParam(value = RvtestsWrapperParams.DESCRIPTION, required = true) RvtestsWrapperParams params) { return submitJob(RvtestsWrapperAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } From 1d6f7addecd829b1720f53c4e940f0272be6dfe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 7 May 2021 15:02:21 +0200 Subject: [PATCH 286/412] analysis: update RvTests wrapper analysis, #1756 --- .../rvtests/RvtestsWrapperAnalysis.java | 101 +++++++++++++++++ .../RvtestsWrapperAnalysisExecutor.java | 102 ++++++++++++++++++ .../models/variant/RvtestsWrapperParams.java | 61 +++++++++++ 3 files changed, 264 insertions(+) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/rvtests/RvtestsWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/rvtests/RvtestsWrapperAnalysisExecutor.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/RvtestsWrapperParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/rvtests/RvtestsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/rvtests/RvtestsWrapperAnalysis.java new file mode 100644 index 00000000000..93ed103d497 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/rvtests/RvtestsWrapperAnalysis.java @@ -0,0 +1,101 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.wrappers.rvtests; + +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.variant.RvtestsWrapperParams; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; + +import java.util.*; + +import static org.opencb.opencga.core.api.ParamConstants.RVTESTS_COMMANDS_SUPPORTED; +import static org.opencb.opencga.core.api.ParamConstants.RVTESTS_COMMAND_DESCRIPTION; + +@Tool(id = RvtestsWrapperAnalysis.ID, resource = Enums.Resource.VARIANT, description = RvtestsWrapperAnalysis.DESCRIPTION) +public class RvtestsWrapperAnalysis extends OpenCgaToolScopeStudy { + + public final static String ID = "rvtests"; + public final static String DESCRIPTION = "Rvtests is a flexible software package for genetic association studies. " + + RVTESTS_COMMAND_DESCRIPTION; + + @ToolParams + protected final RvtestsWrapperParams analysisParams = new RvtestsWrapperParams(); + + protected void check() throws Exception { + super.check(); + + if (StringUtils.isEmpty(analysisParams.getCommand())) { + throw new ToolException("Missing RvTests command."); + } + + if (!AnalysisUtils.isSupportedCommand(RVTESTS_COMMANDS_SUPPORTED)) { + throw new ToolException("RvTests command '" + analysisParams.getCommand() + "' is not available. Supported commands are " + + RVTESTS_COMMANDS_SUPPORTED); + } + + // Get files from catalog + FileManager fileManager = catalogManager.getFileManager(); + if (MapUtils.isNotEmpty(analysisParams.getRvtestsParams())) { + Set fileParams = getFileParamNames(analysisParams.getCommand()); + + Map updatedMap = new HashMap<>(); + for (Map.Entry entry : analysisParams.getRvtestsParams().entrySet()) { + if (fileParams.contains(entry.getKey())) { + updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) + .getUri().getPath()); + } + } + if (MapUtils.isNotEmpty(updatedMap)) { + analysisParams.getRvtestsParams().putAll(updatedMap); + } + } + } + + @Override + protected void run() throws Exception { + setUpStorageEngineExecutor(study); + + step(() -> { + if (MapUtils.isNotEmpty(analysisParams.getRvtestsParams())) { + executorParams.appendAll(analysisParams.getRvtestsParams()); + } + + getToolExecutor(RvtestsWrapperAnalysisExecutor.class) + .setCommand(analysisParams.getCommand()) + .execute(); + }); + } + + public static Set getFileParamNames(String command) { + switch (command) { + case "rvtest": + return new HashSet<>(Arrays.asList("inVcf", "pheno", "geneFile", "kinship", "covar")); + case "vcf2kinship": + return new HashSet<>(Collections.singletonList("inVcf")); + default: + return new HashSet<>(); + } + } +} + diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/rvtests/RvtestsWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/rvtests/RvtestsWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..f9e60c5b31c --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/rvtests/RvtestsWrapperAnalysisExecutor.java @@ -0,0 +1,102 @@ +package org.opencb.opencga.analysis.wrappers.rvtests; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +@ToolExecutor(id = RvtestsWrapperAnalysisExecutor.ID, + tool = RvtestsWrapperAnalysis.ID, + source = ToolExecutor.Source.STORAGE, + framework = ToolExecutor.Framework.LOCAL) +public class RvtestsWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor { + + public final static String ID = RvtestsWrapperAnalysis.ID + "-local"; + + private String study; + private String command; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public String getDockerImageName() { + return "zhanxw/rvtests-docker"; + } + + @Override + public String getDockerImageVersion() { + return ""; + } + + @Override + public void run() throws ToolException { + switch (command) { + case "rvtest": + case "vcf2kinship": + runCommonCommand(); + break; + default: + throw new ToolException("RvTests command '" + command + "' is not supported yet."); + } + } + + private void runCommonCommand() throws ToolException { + StringBuilder sb = initCommandLine(); + + // Append mounts + Set inputFileParamNames = RvtestsWrapperAnalysis.getFileParamNames(command); + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(null, inputFileParamNames, + getExecutorParams()); + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand(command, sb); + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append output file params + String value = null; + if (getExecutorParams().containsKey("out")) { + value = String.valueOf(getExecutorParams().get("out")); + } + if (StringUtils.isEmpty(value)) { + value = "out"; + } + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("out", value))); + appendOutputFiles(outputFilenames, sb); + + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("out")); + skipParams.addAll(inputFileParamNames); + appendOtherParams(skipParams, sb); + + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); + } + + public String getStudy() { + return study; + } + + public RvtestsWrapperAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } + + public String getCommand() { + return command; + } + + public RvtestsWrapperAnalysisExecutor setCommand(String command) { + this.command = command; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/RvtestsWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/RvtestsWrapperParams.java new file mode 100644 index 00000000000..89b4a1b72ba --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/RvtestsWrapperParams.java @@ -0,0 +1,61 @@ +package org.opencb.opencga.core.models.variant; + +import org.opencb.opencga.core.tools.ToolParams; + +import java.util.Map; + +import static org.opencb.opencga.core.api.ParamConstants.RVTESTS_COMMAND_DESCRIPTION; + +public class RvtestsWrapperParams extends ToolParams { + public static final String DESCRIPTION = "RvTests parameters. " + RVTESTS_COMMAND_DESCRIPTION; + + private String command; + private String outdir; + private Map rvtestsParams; + + public RvtestsWrapperParams() { + } + + public RvtestsWrapperParams(String command, String outdir, Map rvtestsParams) { + this.command = command; + this.outdir = outdir; + this.rvtestsParams = rvtestsParams; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("RvtestsWrapperParams{"); + sb.append("command='").append(command).append('\''); + sb.append(", outdir='").append(outdir).append('\''); + sb.append(", rvtestsParams=").append(rvtestsParams); + sb.append('}'); + return sb.toString(); + } + + public String getCommand() { + return command; + } + + public RvtestsWrapperParams setCommand(String command) { + this.command = command; + return this; + } + + public String getOutdir() { + return outdir; + } + + public RvtestsWrapperParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } + + public Map getRvtestsParams() { + return rvtestsParams; + } + + public RvtestsWrapperParams setRvtestsParams(Map rvtestsParams) { + this.rvtestsParams = rvtestsParams; + return this; + } +} From ef1e49234f9cd73b7b07e707fa1bbd527cb5edf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 7 May 2021 14:30:39 +0100 Subject: [PATCH 287/412] azure: Add --keep-tmp-files to deploy.sh --- .../app/cloud/azure/arm-kubernetes/deploy.sh | 14 ++++++++++++-- .../app/cloud/azure/arm-kubernetes/setup-aks.sh | 5 +++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh b/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh index 1545b4982ff..b8aca3b742a 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/deploy.sh @@ -20,6 +20,7 @@ function printUsage() { echo " --hf --helm-file FILE Helm values file. Used when calling to 'setup-k8s.sh' " echo " -o --outdir DIRECTORY Output directory where to write the generated manifests. Default: \$PWD" echo " --opencga-conf-dir DIRECTORY OpenCGA configuration folder. Default: build/conf/ " + echo " --keep-tmp-files FLAG Do not remove any temporary file generated in the outdir" echo " --verbose FLAG Verbose mode. Print debugging messages about the progress." echo " -h --help FLAG Print this help" echo "" @@ -59,6 +60,7 @@ function requiredDirectory() { #spAzudeDeployParameters #helmDeployParameters #setupAksOpts +keepTmpFiles=false outputDir="$(pwd)" while [[ $# -gt 0 ]]; do @@ -99,6 +101,11 @@ while [[ $# -gt 0 ]]; do shift # past argument shift # past value ;; + --keep-tmp-files) + keepTmpFiles=true + setupAksOpts="${setupAksOpts} $key " + shift # past argument + ;; -o | --outdir) requiredDirectory "$key" "$value" value=$(realpath "$value") @@ -199,10 +206,13 @@ az storage container create \ --public-access blob artifactsBlobUpdate="${outputDir}/ARTIFACTS_BLOB_UPDATE" +# ensure folder exists and it's empty mkdir -p "${artifactsBlobUpdate}"/foo rm -rf "${artifactsBlobUpdate:?}"/* -trap 'rm -rf "${artifactsBlobUpdate:?}"' EXIT - +# Delete folder at EXIT if required +if [ "$keepTmpFiles" == "false" ]; then + trap 'rm -rf "${artifactsBlobUpdate:?}"' EXIT +fi cp -r $(ls | grep -v "ARTIFACTS_BLOB_UPDATE\|parameters\|deployment-outputs") "${artifactsBlobUpdate}" az storage blob upload-batch \ diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh index e45fd35476a..40f3f33ad8a 100755 --- a/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/setup-aks.sh @@ -14,6 +14,7 @@ function printUsage() { echo " --hf --helm-file FILE Helm values file. Used when calling to 'setup-k8s.sh' " echo " -o --outdir DIRECTORY Output directory where to write the generated manifests. Default: \$PWD" echo " --opencga-conf-dir DIRECTORY OpenCGA configuration folder. Default: build/conf/ " + echo " --keep-tmp-files FLAG Do not remove any temporary file generated in the outdir" echo " --verbose FLAG Verbose mode. Print debugging messages about the progress." echo " -h --help FLAG Print this help" echo "" @@ -93,6 +94,10 @@ case $key in shift # past argument shift # past value ;; + --keep-tmp-files) + setupK8sOpts="${setupK8sOpts} $key " + shift # past argument + ;; -o | --outdir) requiredDirectory "$key" "$value" value=$(realpath "$value") From b5f349da3c2dce74890592af8ea1e15f54f29a23 Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 7 May 2021 13:37:36 +0000 Subject: [PATCH 288/412] GitBook: [develop] one page modified --- docs/using-opencga/README.md | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/docs/using-opencga/README.md b/docs/using-opencga/README.md index fe54d115432..206cb32d231 100644 --- a/docs/using-opencga/README.md +++ b/docs/using-opencga/README.md @@ -124,15 +124,5 @@ We simulated two different disorders and few phenotypes for the different member To be documented soon. -#### Test - -test - -#### Test2 - -test2 - -#### Test 3 - -aaa +#### From 8deae903752969bb09350dadac23475f2d89f5a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 7 May 2021 14:46:31 +0100 Subject: [PATCH 289/412] client: Add cohorts to 1000G_yml_generator.py. Fix families creation in TemplateManager --- .../app/misc/demo/1000G_yml_generator.py | 51 ++++++++++++++++--- .../client/template/TemplateManager.java | 6 ++- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/opencga-app/app/misc/demo/1000G_yml_generator.py b/opencga-app/app/misc/demo/1000G_yml_generator.py index b60cd7065aa..b45027eef87 100644 --- a/opencga-app/app/misc/demo/1000G_yml_generator.py +++ b/opencga-app/app/misc/demo/1000G_yml_generator.py @@ -19,6 +19,13 @@ FNAME_TEMPLATE = 'ALL.chr{}.shapeit2_integrated_snvindels_v2a_27022019.GRCh38.phased.vcf.gz' +SUPERPOPULATIONS = { + 'EAS' : ['CHB' ,'JPT' ,'CHS' ,'CDX' ,'KHV'], + 'EUR' : ['CEU', 'TSI', 'GBR', 'IBS'], + 'AFR' : ['YRI' ,'LWK' ,'GWD' ,'MSL' ,'ESN' ,'ASW' ,'ACB'], + 'AMR' : ['MXL', 'PUR', 'CLM', 'PEL'], + 'SAS' : ['GIH', 'PJL', 'BEB', 'STU', 'ITU'] +} def to_camel_case(text): components = text.lower().replace('_', ' ').split(' ') @@ -49,11 +56,9 @@ def create_individuals(ind_info): text.append('{}- id: {}'.format(' '*2, ind['Individual ID'])) text.append('{}name: {}'.format(' '*4, ind['Individual ID'])) if ind['Paternal ID'] != '0': - text.append('{}father:'.format(' '*4)) - text.append('{}id: {}'.format(' '*6, ind['Paternal ID'])) + text.append('{}father: {}'.format(' '*4, ind['Paternal ID'])) if ind['Maternal ID'] != '0': - text.append('{}mother:'.format(' '*4)) - text.append('{}id: {}'.format(' '*6, ind['Maternal ID'])) + text.append('{}mother: {}'.format(' '*4, ind['Maternal ID'])) text.append('{}sex: {}'.format(' '*4, _SEX[ind['Gender']])) text.append('{}karyotypicSex: {}'.format(' '*4, _KAR_SEX[ind['Gender']])) text.append('{}population:'.format(' '*4)) @@ -105,11 +110,32 @@ def create_families(ind_info): return '\n'.join(text) -def create_files(): +def create_cohorts(ind_info): + cohorts = {} + for ind in ind_info: + cohorts.setdefault(ind['Population'], []).append(ind['Individual ID']) + + for sup in SUPERPOPULATIONS: + sup_coh = [] + for coh in SUPERPOPULATIONS[sup]: + sup_coh.extend(cohorts[coh]) + cohorts[sup] = sup_coh + + text = [] + text.append('cohorts:') + for cohort in cohorts: + text.append('{}- id: {}'.format(' '*2, cohort)) + text.append('{}samples:'.format(' '*4)) + for sample in cohorts[cohort]: + text.append('{}- {}'.format(' '*6, sample)) + + return '\n'.join(text) + +def create_files(filename_pattern): text = [] text.append('files:') for chrom in list(range(1, 23)) + ['X']: - text.append('{}- name: {}'.format(' '*2, FNAME_TEMPLATE.format(chrom))) + text.append('{}- name: {}'.format(' '*2, filename_pattern.format(chrom))) text.append('{}path: {}'.format(' '*4, 'data')) return '\n'.join(text) @@ -133,6 +159,7 @@ def _setup_argparse(): parser.add_argument('ped_file', help='Pedigree file path') parser.add_argument('outfile', help='Output file path') + parser.add_argument('-f', '--filename-pattern', help='Filename pattern', default=FNAME_TEMPLATE) args = parser.parse_args() return args @@ -143,6 +170,7 @@ def main(): ped_fhand = open(args.ped_file, 'r') yml_fhand = open(args.outfile, 'w') + filename_pattern = args.filename_pattern header = ped_fhand.readline().strip().split('\t') ind_info = [{k: v for k, v in zip(header, line.strip().split('\t'))} for line in ped_fhand] @@ -152,10 +180,19 @@ def main(): yml_fhand.write('id: 1000G\n') yml_fhand.write('name: 1000 Genomes phase 3\n') yml_fhand.write('description: The 1000 Genomes Project\n') + yml_fhand.write('\n') + yml_fhand.write('variantEngineConfiguration:\n') + yml_fhand.write(' options:\n') + yml_fhand.write(' expected_files_number: 24\n') + yml_fhand.write(' expected_samples_number: 2500\n') + yml_fhand.write(' storage.hadoop.variant.table.preSplit.numSplits: 500\n') + yml_fhand.write('\n') + yml_fhand.write(create_variable_sets(header) + '\n') yml_fhand.write(create_individuals(ind_info) + '\n') yml_fhand.write(create_families(ind_info) + '\n') - yml_fhand.write(create_files() + '\n') + yml_fhand.write(create_cohorts(ind_info) + '\n') + yml_fhand.write(create_files(filename_pattern) + '\n') yml_fhand.write(create_attributes() + '\n') ped_fhand.close() diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java index ba9ae9856b5..213569bbaed 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java @@ -445,10 +445,12 @@ private void createFamilies(String fqn, List families) throw openCGAClient.setThrowExceptionOnError(true); } for (FamilyCreateParams family : families) { -// params.put("members", family.getMembers().stream().map(i->i.getId()).collect(Collectors.toList())); -// family.setMembers(null); if (!existing.contains(family.getId())) { + List members = family.getMembers(); + params.put("members", members.stream().map(i -> i.getId()).collect(Collectors.toList())); + family.setMembers(null); openCGAClient.getFamilyClient().create(family, params); + family.setMembers(members); } } } From 5665b8158441a8e85a78e26668b695751530955f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 7 May 2021 14:46:58 +0100 Subject: [PATCH 290/412] client: Use custom jackson object mapper in AbstractParentClient --- .../client/rest/AbstractParentClient.java | 88 ++++++++++--------- .../main/resources/client-configuration.yml | 1 + .../opencga/core/common/JacksonUtils.java | 17 ++++ 3 files changed, 64 insertions(+), 42 deletions(-) diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java index f3cec729e65..97bdf563c4e 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java @@ -1,4 +1,4 @@ -/* + /* * Copyright 2015-2020 OpenCB * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,46 +16,48 @@ package org.opencb.opencga.client.rest; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.glassfish.jersey.client.ClientProperties; -import org.glassfish.jersey.media.multipart.FormDataMultiPart; -import org.glassfish.jersey.media.multipart.MultiPartFeature; -import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; -import org.opencb.commons.datastore.core.DataResult; -import org.opencb.commons.datastore.core.Event; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.client.config.ClientConfiguration; -import org.opencb.opencga.client.exceptions.ClientException; -import org.opencb.opencga.core.response.RestResponse; -import org.opencb.opencga.core.response.VariantQueryResult; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.net.ssl.*; -import javax.ws.rs.client.*; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.Response; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.security.cert.X509Certificate; -import java.util.*; + import com.fasterxml.jackson.core.JsonParseException; + import com.fasterxml.jackson.core.JsonProcessingException; + import com.fasterxml.jackson.databind.DeserializationFeature; + import com.fasterxml.jackson.databind.ObjectMapper; + import com.fasterxml.jackson.databind.ObjectReader; + import org.apache.commons.collections4.CollectionUtils; + import org.apache.commons.lang3.StringUtils; + import org.glassfish.jersey.client.ClientProperties; + import org.glassfish.jersey.media.multipart.FormDataMultiPart; + import org.glassfish.jersey.media.multipart.MultiPartFeature; + import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; + import org.opencb.commons.datastore.core.DataResult; + import org.opencb.commons.datastore.core.Event; + import org.opencb.commons.datastore.core.ObjectMap; + import org.opencb.commons.datastore.core.QueryOptions; + import org.opencb.opencga.client.config.ClientConfiguration; + import org.opencb.opencga.client.exceptions.ClientException; + import org.opencb.opencga.core.common.JacksonUtils; + import org.opencb.opencga.core.response.RestResponse; + import org.opencb.opencga.core.response.VariantQueryResult; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + + import javax.net.ssl.*; + import javax.ws.rs.client.*; + import javax.ws.rs.core.HttpHeaders; + import javax.ws.rs.core.Response; + import javax.ws.rs.ext.ContextResolver; + import java.io.File; + import java.io.FileOutputStream; + import java.io.IOException; + import java.io.InputStream; + import java.net.URI; + import java.nio.channels.Channels; + import java.nio.channels.ReadableByteChannel; + import java.nio.file.Files; + import java.nio.file.Paths; + import java.security.KeyManagementException; + import java.security.NoSuchAlgorithmException; + import java.security.SecureRandom; + import java.security.cert.X509Certificate; + import java.util.*; /** * Created by imedina on 04/05/16. @@ -70,7 +72,7 @@ public abstract class AbstractParentClient { protected final ObjectMapper jsonObjectMapper; - private int timeout = 10000; + private int timeout = 90000; private int batchSize = 2000; private int defaultLimit = 2000; private static final int DEFAULT_SKIP = 0; @@ -105,6 +107,8 @@ protected AbstractParentClient(String token, ClientConfiguration configuration) private Client newClient(ClientConfiguration configuration) { ClientBuilder clientBuilder = ClientBuilder.newBuilder(); + clientBuilder.register(JacksonUtils.ObjectMapperProvider.class); + if (configuration.getRest().isTlsAllowInvalidCertificates()) { logger.debug("Using custom SSLContext to allow invalid certificates"); try { diff --git a/opencga-client/src/main/resources/client-configuration.yml b/opencga-client/src/main/resources/client-configuration.yml index 5efb8679f7a..0e618914180 100644 --- a/opencga-client/src/main/resources/client-configuration.yml +++ b/opencga-client/src/main/resources/client-configuration.yml @@ -9,6 +9,7 @@ rest: host: "${OPENCGA.CLIENT.REST.HOST}" tokenAutoRefresh: true tlsAllowInvalidCertificates: false + timeout: 90000 query: batchSize: 200 limit: 2000 diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/common/JacksonUtils.java b/opencga-core/src/main/java/org/opencb/opencga/core/common/JacksonUtils.java index 92b609127d1..1014c9a6a7a 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/common/JacksonUtils.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/common/JacksonUtils.java @@ -40,6 +40,8 @@ import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.study.VariableSet; +import javax.ws.rs.ext.ContextResolver; + public class JacksonUtils { private static ObjectMapper defaultObjectMapper; @@ -126,4 +128,19 @@ public static ObjectMapper getExternalOpencgaObjectMapper() { public static ObjectMapper getUpdateObjectMapper() { return updateObjectMapper; } + + public static class ObjectMapperProvider implements ContextResolver { + + final ObjectMapper mapper; + + public ObjectMapperProvider() { + mapper = JacksonUtils.getDefaultNonNullObjectMapper(); + } + + @Override + public ObjectMapper getContext(Class type) { + return mapper; + } + } + } From 3e387110553ffb3f8a91563447d42afda931742b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 7 May 2021 16:01:46 +0100 Subject: [PATCH 291/412] analysis: Add parentalOrigin to KnockoutVariant --- .../KnockoutLocalAnalysisExecutor.java | 40 ++++++++++++++----- .../db/mongodb/UserMongoDBAdaptor.java | 6 ++- .../client/rest/AbstractParentClient.java | 1 - .../analysis/knockout/KnockoutVariant.java | 16 ++++++++ .../study/HBaseToStudyEntryConverter.java | 2 +- ...ampleIndexMendelianErrorQueryExecutor.java | 4 +- .../DocumentToVariantAnnotationConverter.java | 6 ++- 7 files changed, 58 insertions(+), 17 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index 7e1a1231cc1..3134ebc0248 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -17,6 +17,7 @@ package org.opencb.opencga.analysis.variant.knockout; import com.google.common.collect.Iterables; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.opencb.biodata.models.core.Region; @@ -25,6 +26,7 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.*; import org.opencb.biodata.models.variant.stats.VariantStats; +import org.opencb.biodata.tools.pedigree.ModeOfInheritance; import org.opencb.commons.ProgressLogger; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.Query; @@ -383,11 +385,25 @@ protected void compHetKnockouts(String sample, Trio family, StudyEntry studyEntry = v.getStudies().get(0); SampleEntry sampleEntry = studyEntry.getSample(0); FileEntry fileEntry = studyEntry.getFiles().get(sampleEntry.getFileIndex()); + KnockoutVariant.ParentalOrigin parentalOrigin = KnockoutVariant.ParentalOrigin.UNKNOWN; + Set transcripts = null; + if (CollectionUtils.isNotEmpty(studyEntry.getIssues())) { + transcripts = new HashSet<>( + Arrays.asList(studyEntry.getIssues().get(0).getData().get(ModeOfInheritance.TRANSCRIPTS_LIST).split(","))); + String parentalOriginStr = studyEntry.getIssues().get(0).getData().get(ModeOfInheritance.PARENTAL_ORIGIN); + if (StringUtils.isNotEmpty(parentalOriginStr)) { + parentalOrigin = KnockoutVariant.ParentalOrigin.valueOf(parentalOriginStr); + } + } for (ConsequenceType consequenceType : v.getAnnotation().getConsequenceTypes()) { - if (validCt(consequenceType, ctFilter, biotypeFilter, geneFilter)) { - addGene(v, sampleEntry.getData().get(0), KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), - fileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.COMP_HET, - v.getAnnotation(), studyEntry.getStats(StudyEntry.DEFAULT_COHORT)); + if (transcripts == null || transcripts.contains(consequenceType.getEnsemblTranscriptId())) { + if (validCt(consequenceType, ctFilter, biotypeFilter, geneFilter)) { + KnockoutVariant knockoutVariant = + addGene(v, sampleEntry.getData().get(0), KnockoutVariant.getDepth(studyEntry, fileEntry, sampleEntry), + fileEntry, consequenceType, knockoutGenes, KnockoutVariant.KnockoutType.COMP_HET, + v.getAnnotation(), studyEntry.getStats(StudyEntry.DEFAULT_COHORT)); + knockoutVariant.setParentalOrigin(parentalOrigin); + } } } }); @@ -806,14 +822,15 @@ private int iterate(Query query, QueryOptions queryOptions, String description, return numVariants; } - private void addGene(Variant variant, String gt, Integer depth, FileEntry fileEntry, ConsequenceType consequenceType, + private KnockoutVariant addGene(Variant variant, String gt, Integer depth, FileEntry fileEntry, ConsequenceType consequenceType, Map knockoutGenes, KnockoutVariant.KnockoutType knockoutType, VariantAnnotation variantAnnotation, VariantStats stats) { - addGene(variant, gt, depth, fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), - consequenceType, knockoutGenes, knockoutType, variantAnnotation.getId(), variantAnnotation.getPopulationFrequencies(), KnockoutVariant.getClinicalSignificance(variantAnnotation), stats); + return addGene(variant, gt, depth, fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), + consequenceType, knockoutGenes, knockoutType, variantAnnotation.getId(), variantAnnotation.getPopulationFrequencies(), + KnockoutVariant.getClinicalSignificance(variantAnnotation), stats); } - private void addGene(Variant variant, String gt, Integer depth, String filter, String qual, ConsequenceType consequenceType, + private KnockoutVariant addGene(Variant variant, String gt, Integer depth, String filter, String qual, ConsequenceType consequenceType, Map knockoutGenes, KnockoutVariant.KnockoutType knockoutType, String dbSnp, List populationFrequencies, @@ -826,9 +843,12 @@ private void addGene(Variant variant, String gt, Integer depth, String filter, S KnockoutTranscript t = gene.getTranscript(consequenceType.getEnsemblTranscriptId()); t.setBiotype(consequenceType.getBiotype()); t.setStrand(consequenceType.getStrand()); - t.addVariant(new KnockoutVariant(variant, dbSnp, gt, depth, filter, qual, stats, knockoutType, - consequenceType.getSequenceOntologyTerms(), populationFrequencies, clinicalSignificance)); + KnockoutVariant knockoutVariant = new KnockoutVariant(variant, dbSnp, gt, depth, filter, qual, stats, knockoutType, + consequenceType.getSequenceOntologyTerms(), populationFrequencies, clinicalSignificance); + t.addVariant(knockoutVariant); + return knockoutVariant; } + return null; } private boolean validCt(ConsequenceType consequenceType, diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java index 2ce77442c5e..51298e5e0b3 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/UserMongoDBAdaptor.java @@ -710,7 +710,11 @@ public void forEach(Query query, Consumer action, QueryOptions o } } - private String encryptPassword(String password) throws CatalogDBException { + public static void main(String[] args) throws CatalogDBException { + System.out.println(encryptPassword("admin")); + } + + private static String encryptPassword(String password) throws CatalogDBException { if (StringUtils.isNotEmpty(password)) { if (password.matches("^[a-fA-F0-9]{40}$")) { // Password already cyphered diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java index 97bdf563c4e..2d1a730feb9 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java @@ -43,7 +43,6 @@ import javax.ws.rs.client.*; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; - import javax.ws.rs.ext.ContextResolver; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java index 58603234439..72641fe60c9 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java @@ -45,6 +45,7 @@ public class KnockoutVariant { private String qual; private VariantStats stats; private KnockoutType knockoutType; + private ParentalOrigin parentalOrigin = ParentalOrigin.UNKNOWN; private List populationFrequencies; private List sequenceOntologyTerms; private List clinicalSignificance; @@ -55,6 +56,12 @@ public enum KnockoutType { HET_ALT, DELETION_OVERLAP } + public enum ParentalOrigin { + PATERNAL, + MATERNAL, + BOTH, + UNKNOWN + } public KnockoutVariant() { } @@ -322,6 +329,15 @@ public KnockoutVariant setKnockoutType(KnockoutType knockoutType) { return this; } + public ParentalOrigin getParentalOrigin() { + return parentalOrigin; + } + + public KnockoutVariant setParentalOrigin(ParentalOrigin parentalOrigin) { + this.parentalOrigin = parentalOrigin; + return this; + } + public List getSequenceOntologyTerms() { return sequenceOntologyTerms; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/study/HBaseToStudyEntryConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/study/HBaseToStudyEntryConverter.java index 2503ff9a6e6..3b737b1d1d8 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/study/HBaseToStudyEntryConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/study/HBaseToStudyEntryConverter.java @@ -338,7 +338,7 @@ protected void addMainSampleDataColumn(StudyMetadata studyMetadata, StudyEntry s oldSampleEntry.setFileIndex(fileId); } oldSampleEntry.setSampleId(sampleName); - studyEntry.getIssues().add(new IssueEntry(IssueType.DISCREPANCY, oldSampleEntry)); + studyEntry.getIssues().add(new IssueEntry(IssueType.DISCREPANCY, oldSampleEntry, Collections.emptyMap())); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexMendelianErrorQueryExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexMendelianErrorQueryExecutor.java index 0e6baf68ff1..87d2364742e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexMendelianErrorQueryExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexMendelianErrorQueryExecutor.java @@ -100,8 +100,8 @@ private Variant addIssueEntries(Variant variant, String studyName, List tr new SampleEntry( trio.getChild(), null, - Collections.singletonList(String.valueOf(code))))); - + Collections.singletonList(String.valueOf(code))), + Collections.singletonMap("meCode", String.valueOf(code)))); } } } diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java index 8e2758fec40..692daa4487c 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java @@ -534,10 +534,12 @@ private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAcc String aaReference, String aaAlternate, String uniprotVariantId, String functionalDescription, List proteinSubstitutionScores, List keywords, List features) { - return buildProteinVariantAnnotation(uniprotAccession, uniprotName, uniprotAccession, aaPosition, aaReference, aaAlternate, uniprotVariantId, functionalDescription, proteinSubstitutionScores, keywords, features); + return buildProteinVariantAnnotation(uniprotAccession, uniprotName, uniprotAccession, aaPosition, aaReference, aaAlternate, + uniprotVariantId, functionalDescription, proteinSubstitutionScores, keywords, features); } - private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAccession, String uniprotName, String proteinId, int aaPosition, + private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAccession, String uniprotName, String proteinId, + int aaPosition, String aaReference, String aaAlternate, String uniprotVariantId, String functionalDescription, List proteinSubstitutionScores, List keywords, List features) { From 8e924b67b2efec48433d4f2c1292a4bdf48ac5d1 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 7 May 2021 17:23:30 +0200 Subject: [PATCH 292/412] analysis: add parentalOrigin to RGA, #1693 --- .../analysis/rga/IndividualRgaConverter.java | 2 +- .../org/opencb/opencga/analysis/rga/RgaUtils.java | 15 ++++++++++----- .../variant/knockout/KnockoutAnalysis.java | 2 +- .../knockout/KnockoutLocalAnalysisExecutor.java | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index c63ed44d595..2d83497064d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -286,7 +286,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI Map variantPopFreq = getPopulationFrequencies(variant); RgaUtils.CodedVariant codedVariant = new RgaUtils.CodedVariant(transcript.getId(), variant.getId(), variant.getDbSnp(), variant.getType().name(), variant.getKnockoutType().name(), - new ArrayList<>(auxClinicalSignificances), variantConsequenceTypes, + variant.getParentalOrigin().name(), new ArrayList<>(auxClinicalSignificances), variantConsequenceTypes, variantPopFreq.get(RgaUtils.THOUSAND_GENOMES_STUDY), variantPopFreq.get(RgaUtils.GNOMAD_GENOMES_STUDY)); variantSummary.add(codedVariant.getEncodedId()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index cd8f7d30004..a49fda01f84 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -392,13 +392,15 @@ public int getNumParents() { public static class CodedVariant extends CodedFeature { // transcriptId__id __ dbSnp __ SNV __ COMP_HET __ clinicalSignificance __ VR_R __ A_J private String dbSnp; + private String parentalOrigin; private List clinicalSignificances; - public CodedVariant(String transcriptId, String id, String dbSnp, String type, String knockoutType, + public CodedVariant(String transcriptId, String id, String dbSnp, String type, String knockoutType, String parentalOrigin, List clinicalSignificances, List consequenceTypeList, String thousandGenomesPopFreq, String gnomadPopFreq) { super(transcriptId, id, type, knockoutType, consequenceTypeList, thousandGenomesPopFreq, gnomadPopFreq); this.dbSnp = dbSnp; + this.parentalOrigin = parentalOrigin; this.clinicalSignificances = clinicalSignificances; } @@ -406,8 +408,8 @@ public static CodedVariant parseEncodedId(String encodedId) throws RgaException String[] split = encodedId.split(SEPARATOR); if (split.length != 8) { throw new RgaException("Unexpected variant string received '" + encodedId - + "'. Expected {transcriptId}__{id}__{dbSnp}__{type}__{knockoutType}__{clinicalSignificances}__{conseqType}_" - + "_{popFreqs}"); + + "'. Expected {transcriptId}__{id}__{dbSnp}__{type}__{knockoutType}--{parentalOrigin}__{clinicalSignificances}" + + "__{conseqType}__{popFreqs}"); } Set consequenceType = new HashSet<>(Arrays.asList(split[6].split(INNER_SEPARATOR))); @@ -416,14 +418,17 @@ public static CodedVariant parseEncodedId(String encodedId) throws RgaException if (StringUtils.isNotEmpty(split[5])) { clinicalSignificances = Arrays.asList(split[5].split(INNER_SEPARATOR)); } + String[] ktSplit = split[4].split(INNER_SEPARATOR); + String knockoutType = ktSplit[0]; + String parentalOrigin = ktSplit[1]; - return new CodedVariant(split[0], split[1], split[2], split[3], split[4], clinicalSignificances, + return new CodedVariant(split[0], split[1], split[2], split[3], knockoutType, parentalOrigin, clinicalSignificances, new ArrayList<>(consequenceType), popFreqs[0], popFreqs[1]); } public String getEncodedId() { return getTranscriptId() + SEPARATOR + getId() + SEPARATOR + dbSnp + SEPARATOR + getType() + SEPARATOR + getKnockoutType() - + SEPARATOR + StringUtils.join(clinicalSignificances, INNER_SEPARATOR) + SEPARATOR + + SEPARATOR + parentalOrigin + SEPARATOR + StringUtils.join(clinicalSignificances, INNER_SEPARATOR) + SEPARATOR + StringUtils.join(getConsequenceType(), INNER_SEPARATOR) + SEPARATOR + StringUtils.join(getPopulationFrequencies(), INNER_SEPARATOR); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index ff1e4f70af0..d8cc73b9440 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -339,7 +339,7 @@ protected void run() throws Exception { KnockoutByGene knockoutByGene = reader.readValue(org.opencb.commons.utils.FileUtils.newBufferedReader(file.toPath())); QueryOptions queryOptions = new QueryOptions(QueryOptions.EXCLUDE, "transcripts,annotation.expression"); Gene gene = cellBaseUtils.getCellBaseClient().getGeneClient() - .search(new Query("name", knockoutByGene.getName()), queryOptions).firstResult(); + .get(Collections.singletonList(knockoutByGene.getName()), queryOptions).firstResult(); knockoutByGene.setId(gene.getId()); knockoutByGene.setName(gene.getName()); knockoutByGene.setChromosome(gene.getChromosome()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index 3134ebc0248..e552db8f999 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -392,7 +392,7 @@ protected void compHetKnockouts(String sample, Trio family, Arrays.asList(studyEntry.getIssues().get(0).getData().get(ModeOfInheritance.TRANSCRIPTS_LIST).split(","))); String parentalOriginStr = studyEntry.getIssues().get(0).getData().get(ModeOfInheritance.PARENTAL_ORIGIN); if (StringUtils.isNotEmpty(parentalOriginStr)) { - parentalOrigin = KnockoutVariant.ParentalOrigin.valueOf(parentalOriginStr); + parentalOrigin = KnockoutVariant.ParentalOrigin.valueOf(parentalOriginStr.toUpperCase()); } } for (ConsequenceType consequenceType : v.getAnnotation().getConsequenceTypes()) { From 109019748b14ef34be23021e069e125664cc1c42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 7 May 2021 16:30:03 +0100 Subject: [PATCH 293/412] storage: Fix ConsequenceType creation. Sync up with biodata changes --- .../analysis/variant/knockout/KnockoutAnalysis.java | 2 ++ .../variant/knockout/KnockoutLocalAnalysisExecutor.java | 7 +++++-- .../converters/DocumentToVariantAnnotationConverter.java | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index ff1e4f70af0..7b7c9465ff2 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -340,6 +340,8 @@ protected void run() throws Exception { QueryOptions queryOptions = new QueryOptions(QueryOptions.EXCLUDE, "transcripts,annotation.expression"); Gene gene = cellBaseUtils.getCellBaseClient().getGeneClient() .search(new Query("name", knockoutByGene.getName()), queryOptions).firstResult(); +// Gene gene = cellBaseUtils.getCellBaseClient().getGeneClient() +// .get(Collections.singletonList(knockoutByGene.getName()), queryOptions).firstResult(); knockoutByGene.setId(gene.getId()); knockoutByGene.setName(gene.getName()); knockoutByGene.setChromosome(gene.getChromosome()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index 3134ebc0248..7e4f97c8295 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -392,7 +392,7 @@ protected void compHetKnockouts(String sample, Trio family, Arrays.asList(studyEntry.getIssues().get(0).getData().get(ModeOfInheritance.TRANSCRIPTS_LIST).split(","))); String parentalOriginStr = studyEntry.getIssues().get(0).getData().get(ModeOfInheritance.PARENTAL_ORIGIN); if (StringUtils.isNotEmpty(parentalOriginStr)) { - parentalOrigin = KnockoutVariant.ParentalOrigin.valueOf(parentalOriginStr); + parentalOrigin = KnockoutVariant.ParentalOrigin.valueOf(parentalOriginStr.toUpperCase()); } } for (ConsequenceType consequenceType : v.getAnnotation().getConsequenceTypes()) { @@ -404,7 +404,10 @@ protected void compHetKnockouts(String sample, Trio family, v.getAnnotation(), studyEntry.getStats(StudyEntry.DEFAULT_COHORT)); knockoutVariant.setParentalOrigin(parentalOrigin); } - } + }/* else { + logger.debug("Discard transcript " + consequenceType.getEnsemblTranscriptId() + " at from issueEntry " + + studyEntry.getIssues()); + }*/ } }); logger.info("Read " + numVariants + " COMP_HET variants from sample " + sample); diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java index e7d9ace681f..a590569b856 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java @@ -525,7 +525,7 @@ private ConsequenceType buildConsequenceType(String geneName, String ensemblGene exonOverlapList.add(e); } - return new ConsequenceType(geneName, ensemblGeneId, ensemblTranscriptId, ensemblGeneId, ensemblTranscriptId, strand, biotype, null, + return new ConsequenceType(ensemblGeneId, geneName, ensemblGeneId, ensemblTranscriptId, ensemblTranscriptId, strand, biotype, null, exonOverlapList, transcriptAnnotationFlags, transcriptAnnotationFlags, cDnaPosition, cdsPosition, codon, proteinVariantAnnotation, soTerms); } From 5b13f1d7c2b32c0b74affed7f140b78d38a323af Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 7 May 2021 17:41:54 +0200 Subject: [PATCH 294/412] analysis: fix parentalOrigin issue --- .../src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java | 2 +- .../java/org/opencb/opencga/analysis/rga/RgaManagerTest.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index a49fda01f84..c8a80f5732f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -428,7 +428,7 @@ public static CodedVariant parseEncodedId(String encodedId) throws RgaException public String getEncodedId() { return getTranscriptId() + SEPARATOR + getId() + SEPARATOR + dbSnp + SEPARATOR + getType() + SEPARATOR + getKnockoutType() - + SEPARATOR + parentalOrigin + SEPARATOR + StringUtils.join(clinicalSignificances, INNER_SEPARATOR) + SEPARATOR + + INNER_SEPARATOR + parentalOrigin + SEPARATOR + StringUtils.join(clinicalSignificances, INNER_SEPARATOR) + SEPARATOR + StringUtils.join(getConsequenceType(), INNER_SEPARATOR) + SEPARATOR + StringUtils.join(getPopulationFrequencies(), INNER_SEPARATOR); } diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 2f7a1b029ff..2dcb23edc5e 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -565,7 +565,6 @@ public void testVariantQueryLimit() throws CatalogException, IOException, RgaExc assertEquals(60, variantIds.size()); } - @Test public void testVariantSummary() throws CatalogException, IOException, RgaException { OpenCGAResult result = rgaManager.variantSummary(STUDY, new Query(), QueryOptions.empty(), ownerToken); From 2c74c40a62e14ae19102c8f4d34a69c1b560d746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 7 May 2021 17:00:34 +0100 Subject: [PATCH 295/412] analysis: Remove knockout index ct validation --- .../analysis/variant/knockout/KnockoutAnalysis.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index 7b7c9465ff2..1ed2fe24036 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -109,12 +109,12 @@ protected void check() throws Exception { if (CollectionUtils.isNotEmpty(analysisParams.getPanel())) { throw new IllegalArgumentException("Unable to index KnockoutAnalysis result filtering by any panel"); } - if (StringUtils.isNotEmpty(analysisParams.getConsequenceType())) { - Set cts = new HashSet<>(Arrays.asList(analysisParams.getConsequenceType().split(","))); - if (!cts.equals(VariantQueryUtils.LOF_EXTENDED_SET)) { - throw new IllegalArgumentException("Unable to index KnockoutAnalysis result filtering by consequence type : " + cts); - } - } +// if (StringUtils.isNotEmpty(analysisParams.getConsequenceType())) { +// Set cts = new HashSet<>(Arrays.asList(analysisParams.getConsequenceType().split(","))); +// if (!cts.equals(VariantQueryUtils.LOF_EXTENDED_SET)) { +// throw new IllegalArgumentException("Unable to index KnockoutAnalysis result filtering by consequence type : " + cts); +// } +// } analysisParams.setSkipGenesFile(true); } From e3b2137633734822731d5483511bc821a22e2b89 Mon Sep 17 00:00:00 2001 From: imedina Date: Mon, 10 May 2021 02:15:34 +0100 Subject: [PATCH 296/412] Fix compilation issue with Populationfrequency --- .../opencga/analysis/rga/RgaUtilsTest.java | 18 ++++++++++++------ .../analysis/julie/JulieToolMapper.java | 4 ++-- .../DocumentToVariantAnnotationConverter.java | 7 +++++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaUtilsTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaUtilsTest.java index a772f9545f2..d5bc3a52522 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaUtilsTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaUtilsTest.java @@ -65,9 +65,12 @@ public static KnockoutTranscript createTranscript(int count) { List knockoutVariantList = new ArrayList<>(2); List populationFrequencyList = new ArrayList<>(3); - populationFrequencyList.add(new PopulationFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, "ALL", "", "", 1f, 0.3f, 1f, 0.4f, 0.2f)); - populationFrequencyList.add(new PopulationFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, "ALL", "", "", 1f, 0.04f, 1f, 0.04f, 0.02f)); - populationFrequencyList.add(new PopulationFrequency("otherStudy", "ALL", "", "", 1f, 0.04f, 1f, 0.004f, 0.2f)); + populationFrequencyList.add(new PopulationFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, "ALL", "", "", 1f, 0.3f, null, null, + 1f, 0.4f, 0.2f, null, null, null)); + populationFrequencyList.add(new PopulationFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, "ALL", "", "", 1f, 0.04f, null, null, + 1f, 0.04f, 0.02f, null, null, null)); + populationFrequencyList.add(new PopulationFrequency("otherStudy", "ALL", "", "", 1f, 0.04f, null, null, + 1f, 0.004f, 0.2f, null, null, null)); List sequenceOntologyTermList = new ArrayList<>(3); sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0002019", "start_retained_variant")); @@ -83,9 +86,12 @@ public static KnockoutTranscript createTranscript(int count) { knockoutVariantList.add(knockoutVariant); populationFrequencyList = new ArrayList<>(3); - populationFrequencyList.add(new PopulationFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, "ALL", "", "", 1f, 0.2f, 1f, 0.04f, 0.02f)); - populationFrequencyList.add(new PopulationFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, "ALL", "", "", 1f, 0.01f, 1f, 0.01f, 0.01f)); - populationFrequencyList.add(new PopulationFrequency("otherStudy", "ALL", "", "", 1f, 0.04f, 1f, 0.004f, 0.2f)); + populationFrequencyList.add(new PopulationFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, "ALL", "", "", 1f, 0.2f, null, null, + 1f, 0.04f, 0.02f, null, null, null)); + populationFrequencyList.add(new PopulationFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, "ALL", "", "", 1f, 0.01f, null, null, + 1f, 0.01f, 0.01f, null, null, null)); + populationFrequencyList.add(new PopulationFrequency("otherStudy", "ALL", "", "", 1f, 0.04f, null, null, + 1f, 0.004f, 0.2f, null, null, null)); knockoutVariant = new KnockoutVariant("chr1:" + (count + 1) + ":A:C", "rs4321", "Genotype", 2, "NOT_PASS", "1", null, KnockoutVariant.KnockoutType.COMP_HET, sequenceOntologyTermList, populationFrequencyList, clinicalSignificance) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java index 2485e019d09..31076b7fd6a 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java @@ -76,8 +76,8 @@ protected void map(Object key, VariantRow value, Context context) throws IOExcep studyIdMap.get(studyId), cohortIdMap.get(studyId).get(cohortId), variant.getReference(), variant.getAlternate(), - variantStats.getRefAlleleFreq(), variantStats.getAltAlleleFreq(), null, null, null)); - + variantStats.getRefAlleleFreq(), variantStats.getAltAlleleFreq(), + null, null, null, null, null, null, null, null)); }) .walk(); diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java index a590569b856..b6ac2d50df7 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java @@ -341,7 +341,8 @@ public VariantAnnotation convertToDataModelType(Document object, Document custom addScore(object, conservedRegionScores, GERP, CONSERVED_REGION_GERP_FIELD); va.setConservation(conservedRegionScores); - //Population frequencies + // Population frequencies + // FIXME we need to populate the allele and genotype counts List populationFrequencies = new LinkedList<>(); if (object.containsKey(POPULATION_FREQUENCIES_FIELD)) { List list = (List) object.get(POPULATION_FREQUENCIES_FIELD); @@ -353,9 +354,11 @@ public VariantAnnotation convertToDataModelType(Document object, Document custom alternate, getDefault(dbObject, POPULATION_FREQUENCY_REFERENCE_FREQUENCY_FIELD, -1.0F), getDefault(dbObject, POPULATION_FREQUENCY_ALTERNATE_FREQUENCY_FIELD, -1.0F), + null, null, getDefault(dbObject, POPULATION_FREQUENCY_REF_HOM_GT_FIELD, -1.0F), getDefault(dbObject, POPULATION_FREQUENCY_HET_GT_FIELD, -1.0F), - getDefault(dbObject, POPULATION_FREQUENCY_ALT_HOM_GT_FIELD, -1.0F) + getDefault(dbObject, POPULATION_FREQUENCY_ALT_HOM_GT_FIELD, -1.0F), + null, null, null )); } } From 7ed128cd0c5270e45b848d31ee298c862bd8147f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Mon, 10 May 2021 10:30:53 +0200 Subject: [PATCH 297/412] analysis: update Plink wrapper analysis, #1756 --- .../analysis/family/qc/IBDComputation.java | 5 +- .../individual/qc/IndividualQcUtils.java | 5 +- .../wrappers/PlinkWrapperAnalysis.java | 150 ------------------ .../wrappers/plink/PlinkWrapperAnalysis.java | 90 +++++++++++ .../plink/PlinkWrapperAnalysisExecutor.java | 71 +++++++++ .../VariantInternalCommandExecutor.java | 23 +-- .../options/VariantCommandOptions.java | 15 +- .../analysis/VariantCommandExecutor.java | 13 +- .../client/rest/clients/VariantClient.java | 2 +- .../core/models/variant/PlinkRunParams.java | 86 ---------- .../models/variant/PlinkWrapperParams.java | 62 ++++++++ .../monitor/daemons/ExecutionDaemon.java | 2 +- .../rest/analysis/VariantWebService.java | 4 +- 13 files changed, 249 insertions(+), 279 deletions(-) delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/PlinkWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysisExecutor.java delete mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/PlinkRunParams.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/PlinkWrapperParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/IBDComputation.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/IBDComputation.java index 9c73efc6f61..03c0b18c5f7 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/IBDComputation.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/IBDComputation.java @@ -20,7 +20,7 @@ import org.opencb.commons.utils.DockerUtils; import org.opencb.opencga.analysis.individual.qc.IndividualQcUtils; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; -import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.plink.PlinkWrapperAnalysisExecutor; import org.opencb.opencga.core.exceptions.ToolException; import java.io.*; @@ -72,7 +72,8 @@ private static File runIBD(String basename, Path outDir) throws ToolException { String plinkParams = "plink --tfile /data/output/" + basename + " --genome rel-check " + readFreq + exclude + " --out /data/output/" + basename; try { - DockerUtils.run(PlinkWrapperAnalysis.PLINK_DOCKER_IMAGE, null, outputBinding, plinkParams, null); + PlinkWrapperAnalysisExecutor plinkExecutor = new PlinkWrapperAnalysisExecutor(); + DockerUtils.run(plinkExecutor.getDockerImageName(), null, outputBinding, plinkParams, null); } catch (IOException e) { throw new ToolException(e); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java index 3b3fc14530c..fe110f90370 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java @@ -24,7 +24,7 @@ import org.opencb.commons.exec.Command; import org.opencb.commons.utils.DockerUtils; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; -import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.plink.PlinkWrapperAnalysisExecutor; import org.opencb.opencga.catalog.db.api.IndividualDBAdaptor; import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -358,7 +358,8 @@ private static void pruneVariants(String basename, AbstractMap.SimpleEntry { - String commandLine = getCommandLine(); - logger.info("Plink command line:" + commandLine); - try { - // Execute command and redirect stdout and stderr to the files: stdout.txt and stderr.txt - Command cmd = new Command(getCommandLine()) - .setOutputOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDOUT_FILENAME).toFile()))) - .setErrorOutputStream( - new DataOutputStream(new FileOutputStream(getScratchDir().resolve(STDERR_FILENAME).toFile()))); - - cmd.run(); - - // Check Plink errors by reading the stderr file - File stderrFile = new File(getScratchDir() + "/" + STDERR_FILENAME); - if (FileUtils.sizeOf(stderrFile) > 0) { - throw new ToolException(StringUtils.join(FileUtils.readLines(stderrFile, Charset.defaultCharset()), ". ")); - } - } catch (Exception e) { - throw new ToolException(e); - } - }); - } - -// @Override -// public String getDockerImageName() { -// return PLINK_DOCKER_IMAGE; -// } - -// @Override - public String getCommandLine() { - StringBuilder sb = new StringBuilder("docker run "); - - // Mount management - Map srcTargetMap = new HashMap<>(); - String[] names = {TPED_FILE_PARAM, TFAM_FILE_PARAM, COVAR_FILE_PARAM}; - for (String name : names) { - if (params.containsKey(name) && StringUtils.isNotEmpty(params.getString(name))) { - String src = new File(params.getString(name)).getParentFile().getAbsolutePath(); - if (!srcTargetMap.containsKey(src)) { - srcTargetMap.put(src, DOCKER_INPUT_PATH + srcTargetMap.size()); - sb.append("--mount type=bind,source=\"").append(src).append("\",target=\"").append(srcTargetMap.get(src)).append("\" "); - } - } - } - sb.append("--mount type=bind,source=\"") - .append(getOutDir().toAbsolutePath()).append("\",target=\"").append(DOCKER_OUTPUT_PATH).append("\" "); - - // Docker image and version - sb.append(PLINK_DOCKER_IMAGE); - if (params.containsKey(DOCKER_IMAGE_VERSION_PARAM)) { - sb.append(":").append(params.getString(DOCKER_IMAGE_VERSION_PARAM)); - } - - // Plink parameters - for (String key : params.keySet()) { - if (checkParam(key)) { - String value = params.getString(key); - if (key.equals("out")) { - String[] split = value.split("/"); - value = split[split.length - 1]; - sb.append(" --out ").append(" ").append(DOCKER_OUTPUT_PATH).append("/").append(value); - } else { - sb.append(" --").append(key); - if (StringUtils.isNotEmpty(value)) { - sb.append(" ").append(value); - } - } - } - } - if (!params.containsKey("out")) { - sb.append(" --out ").append(DOCKER_OUTPUT_PATH).append("/").append(OUT_NAME); - } - // Input file management - String filename = params.getString(TPED_FILE_PARAM, null); - if (StringUtils.isNotEmpty(filename)) { - String prefix = new File(filename).getName().split("\\.")[0]; - sb.append(" --tfile ").append(srcTargetMap.get(new File(filename).getParentFile().getAbsolutePath())).append("/") - .append(prefix); - } - filename = params.getString(COVAR_FILE_PARAM, null); - if (StringUtils.isNotEmpty(filename)) { - File file = new File(filename); - sb.append(" --covar ").append(srcTargetMap.get(file.getParentFile().getAbsolutePath())).append("/").append(file.getName()); - } - - return sb.toString(); - } - - private boolean checkParam(String key) { - if (key.equals(DOCKER_IMAGE_VERSION_PARAM) - || key.equals("noweb") || key.equals("file") || key.equals("bfile") - || key.equals(TFAM_FILE_PARAM) || key.equals(TPED_FILE_PARAM) || key.equals(COVAR_FILE_PARAM)) { - return false; - } - return true; - } -} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysis.java new file mode 100644 index 00000000000..fdeb6b89790 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysis.java @@ -0,0 +1,90 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.wrappers.plink; + + +import org.apache.commons.collections4.MapUtils; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.variant.PlinkWrapperParams; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; + +import java.util.*; + +@Tool(id = PlinkWrapperAnalysis.ID, resource = Enums.Resource.VARIANT, description = PlinkWrapperAnalysis.DESCRIPTION) +public class PlinkWrapperAnalysis extends OpenCgaToolScopeStudy { + + public final static String ID = "plink"; + public static final String DESCRIPTION = "Plink is a whole genome association analysis toolset, designed to perform" + + " a range of basic, large-scale analyses."; + + public final static Set FILE_PARAM_NAMES = new HashSet<>(Arrays.asList("file", "tfile", "bfile", "pheno", "within", "cov")); + + @ToolParams + protected final PlinkWrapperParams analysisParams = new PlinkWrapperParams(); + + protected void check() throws Exception { + super.check(); + + // Get files from catalog + FileManager fileManager = catalogManager.getFileManager(); + if (MapUtils.isNotEmpty(analysisParams.getPlinkParams())) { + Map updatedMap = new HashMap<>(); + for (Map.Entry entry : analysisParams.getPlinkParams().entrySet()) { + if (FILE_PARAM_NAMES.contains(entry.getKey())) { + switch (entry.getKey()) { + case "file": + case "tfile": + // Check .ped and .map files, (throw an exception if one of them does not exist) + AnalysisUtils.getCatalogFile(entry.getValue() + ".ped", study, fileManager, token); + AnalysisUtils.getCatalogFile(entry.getValue() + ".map", study, fileManager, token); + break; + case "bfile": + // Check .bed, .fam and .map files, (throw an exception if one of them does not exist) + AnalysisUtils.getCatalogFile(entry.getValue() + ".bed", study, fileManager, token); + AnalysisUtils.getCatalogFile(entry.getValue() + ".fam", study, fileManager, token); + AnalysisUtils.getCatalogFile(entry.getValue() + ".map", study, fileManager, token); + break; + default: + updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) + .getUri().getPath()); + } + } + } + if (MapUtils.isNotEmpty(updatedMap)) { + analysisParams.getPlinkParams().putAll(updatedMap); + } + } + } + + @Override + protected void run() throws Exception { + setUpStorageEngineExecutor(study); + + step(() -> { + if (MapUtils.isNotEmpty(analysisParams.getPlinkParams())) { + executorParams.appendAll(analysisParams.getPlinkParams()); + } + + getToolExecutor(PlinkWrapperAnalysisExecutor.class) + .execute(); + }); + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysisExecutor.java new file mode 100644 index 00000000000..e87080281a7 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysisExecutor.java @@ -0,0 +1,71 @@ +package org.opencb.opencga.analysis.wrappers.plink; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor; +import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +@ToolExecutor(id = PlinkWrapperAnalysisExecutor.ID, + tool = PlinkWrapperAnalysis.ID, + source = ToolExecutor.Source.STORAGE, + framework = ToolExecutor.Framework.LOCAL) +public class PlinkWrapperAnalysisExecutor extends DockerWrapperAnalysisExecutor { + + public final static String ID = PlinkWrapperAnalysis.ID + "-local"; + + private String study; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public String getDockerImageName() { + return "jrose77/plinkdocker"; + } + + @Override + public String getDockerImageVersion() { + return ""; + } + + @Override + protected void run() throws Exception { + StringBuilder sb = initCommandLine(); + + // Append mounts + List> inputFilenames = DockerWrapperAnalysisExecutor.getInputFilenames(null, + PlinkWrapperAnalysis.FILE_PARAM_NAMES, getExecutorParams()); + Map mountMap = appendMounts(inputFilenames, sb); + + // Append docker image, version and command + appendCommand("", sb); + + // Append input file params + appendInputFiles(inputFilenames, mountMap, sb); + + // Append output file params + List> outputFilenames = new ArrayList<>(Arrays.asList(new ImmutablePair<>("out", ""))); + appendOutputFiles(outputFilenames, sb); + + // Append other params + Set skipParams = new HashSet<>(Arrays.asList("out", "noweb")); + skipParams.addAll(PlinkWrapperAnalysis.FILE_PARAM_NAMES); + appendOtherParams(skipParams, sb); + + // Execute command and redirect stdout and stderr to the files + logger.info("Docker command line: " + sb.toString()); + runCommandLine(sb.toString()); + } + + public String getStudy() { + return study; + } + + public PlinkWrapperAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } +} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index 0a8aa777af9..062cb7c3c24 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -48,8 +48,8 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.plink.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.rvtests.RvtestsWrapperAnalysis; import org.opencb.opencga.app.cli.internal.options.VariantCommandOptions; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; @@ -900,24 +900,13 @@ private void sampleQc() throws Exception { private void plink() throws Exception { VariantCommandOptions.PlinkCommandOptions cliOptions = variantCommandOptions.plinkCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.basicOptions.params); - - if (StringUtils.isNotEmpty(cliOptions.tpedFile)) { - params.put(PlinkWrapperAnalysis.TPED_FILE_PARAM, cliOptions.tpedFile); - } - if (StringUtils.isNotEmpty(cliOptions.tfamFile)) { - params.put(PlinkWrapperAnalysis.TFAM_FILE_PARAM, cliOptions.tfamFile); - } - if (StringUtils.isNotEmpty(cliOptions.covarFile)) { - params.put(PlinkWrapperAnalysis.COVAR_FILE_PARAM, cliOptions.covarFile); - } - PlinkWrapperAnalysis plink = new PlinkWrapperAnalysis(); - plink.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), - variantCommandOptions.internalJobOptions.jobId, token); + ObjectMap params = new PlinkWrapperParams( + cliOptions.outdir, + cliOptions.plinkParams) + .toObjectMap(cliOptions.basicOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); - plink.start(); + toolRunner.execute(PlinkWrapperAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } private void rvtests() throws Exception { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index ca2140ee13a..405cc9d4f74 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -36,8 +36,8 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.plink.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.rvtests.RvtestsWrapperAnalysis; import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.GeneralCliOptions.DataModelOptions; @@ -1462,17 +1462,12 @@ public class PlinkCommandOptions { @Parameter(names = {"--study"}, description = "Study.") public String study; - @Parameter(names = {"--tped-file"}, description = "Transpose PED file (.tped) containing SNP and genotype information.") - public String tpedFile; - - @Parameter(names = {"--tfam-file"}, description = "Transpose FAM file (.tfam) containing individual and family information.") - public String tfamFile; - - @Parameter(names = {"--covar-file"}, description = "Covariate file.") - public String covarFile; - @Parameter(names = {"-o", "--outdir"}, description = "Output directory.") public String outdir; + + @DynamicParameter(names = {"--plink-params"}, description = "Plink parameters e.g.:. --plink-params tfile=test --plink-params " + + " assoc=true") + public Map plinkParams = new HashMap<>(); } // RvTests diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 99938fe61ba..44a568b1c52 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -747,14 +747,11 @@ private RestResponse gatk() throws ClientException { } private RestResponse plink() throws ClientException { - return openCGAClient.getVariantClient().runPlink( - new PlinkRunParams( - variantCommandOptions.plinkCommandOptions.tpedFile, - variantCommandOptions.plinkCommandOptions.tfamFile, - variantCommandOptions.plinkCommandOptions.covarFile, - variantCommandOptions.plinkCommandOptions.outdir, - variantCommandOptions.plinkCommandOptions.basicOptions.params - ), getParams(variantCommandOptions.plinkCommandOptions.study)); + VariantCommandOptions.PlinkCommandOptions cliOptions = variantCommandOptions.plinkCommandOptions; + + ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); + + return openCGAClient.getVariantClient().runPlink(new PlinkWrapperParams(cliOptions.outdir, cliOptions.plinkParams), params); } // RvTests diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 608f9041eb8..91b7500fd1c 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -523,7 +523,7 @@ public RestResponse runMutationalSignature(MutationalSignatureAnalysisParam * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse runPlink(PlinkRunParams data, ObjectMap params) throws ClientException { + public RestResponse runPlink(PlinkWrapperParams data, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); params.put("body", data); return execute("analysis", null, "variant/plink", null, "run", params, POST, Job.class); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/PlinkRunParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/PlinkRunParams.java deleted file mode 100644 index 99d095a7d4e..00000000000 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/PlinkRunParams.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.core.models.variant; - -import org.opencb.opencga.core.tools.ToolParams; - -import java.util.Map; - -public class PlinkRunParams extends ToolParams { - public static final String DESCRIPTION = "Plink params"; - private String tpedFile; // Transpose PED file (.tped) containing SNP and genotype information - private String tfamFile; // Transpose FAM file (.tfam) containing individual and family information - private String covarFile; // Covariate file - private String outdir; - private Map plinkParams; - - public PlinkRunParams() { - } - - public PlinkRunParams(String tpedFile, String tfamFile, String covarFile, String outdir, Map plinkParams) { - this.tpedFile = tpedFile; - this.tfamFile = tfamFile; - this.covarFile = covarFile; - this.outdir = outdir; - this.plinkParams = plinkParams; - } - - public String getTpedFile() { - return tpedFile; - } - - public PlinkRunParams setTpedFile(String tpedFile) { - this.tpedFile = tpedFile; - return this; - } - - public String getTfamFile() { - return tfamFile; - } - - public PlinkRunParams setTfamFile(String tfamFile) { - this.tfamFile = tfamFile; - return this; - } - - public String getCovarFile() { - return covarFile; - } - - public PlinkRunParams setCovarFile(String covarFile) { - this.covarFile = covarFile; - return this; - } - - public String getOutdir() { - return outdir; - } - - public PlinkRunParams setOutdir(String outdir) { - this.outdir = outdir; - return this; - } - - public Map getPlinkParams() { - return plinkParams; - } - - public PlinkRunParams setPlinkParams(Map plinkParams) { - this.plinkParams = plinkParams; - return this; - } -} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/PlinkWrapperParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/PlinkWrapperParams.java new file mode 100644 index 00000000000..3008c2864eb --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/PlinkWrapperParams.java @@ -0,0 +1,62 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.core.models.variant; + +import org.opencb.opencga.core.tools.ToolParams; + +import java.util.Map; + +public class PlinkWrapperParams extends ToolParams { + public static final String DESCRIPTION = "Plink params"; + private String outdir; + private Map plinkParams; + + public PlinkWrapperParams() { + } + + public PlinkWrapperParams(String outdir, Map plinkParams) { + this.outdir = outdir; + this.plinkParams = plinkParams; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("PlinkWrapperParams{"); + sb.append("outdir='").append(outdir).append('\''); + sb.append(", plinkParams=").append(plinkParams); + sb.append('}'); + return sb.toString(); + } + + public String getOutdir() { + return outdir; + } + + public PlinkWrapperParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } + + public Map getPlinkParams() { + return plinkParams; + } + + public PlinkWrapperParams setPlinkParams(Map plinkParams) { + this.plinkParams = plinkParams; + return this; + } +} diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index 4da51d252c0..d5513f0d6f5 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -60,12 +60,12 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.bwa.BwaWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.fastqc.FastqcWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.plink.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.rvtests.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.DBIterator; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 2b636dd4718..036efa3e1e5 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -55,9 +55,9 @@ import org.opencb.opencga.analysis.variant.stats.CohortVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.analysis.wrappers.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.deeptools.DeeptoolsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.gatk.GatkWrapperAnalysis; +import org.opencb.opencga.analysis.wrappers.plink.PlinkWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.rvtests.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; @@ -1241,7 +1241,7 @@ public Response plinkRun( @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, - @ApiParam(value = PlinkRunParams.DESCRIPTION, required = true) PlinkRunParams params) { + @ApiParam(value = PlinkWrapperParams.DESCRIPTION, required = true) PlinkWrapperParams params) { return submitJob(PlinkWrapperAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } From 071f6ed88034583aab9e94458c40d71be1eade02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Mon, 10 May 2021 11:39:31 +0200 Subject: [PATCH 298/412] analysis: remove unused OpenCgaWrapperAnalysis data model --- .../circos/CircosLocalAnalysisExecutor.java | 4 +- .../wrappers/OpenCgaWrapperAnalysis.java | 157 ------------------ 2 files changed, 2 insertions(+), 159 deletions(-) delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java index 7449ac4a260..60d9bb1f2fd 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java @@ -49,8 +49,8 @@ import java.util.*; import java.util.concurrent.*; -import static org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis.DOCKER_INPUT_PATH; -import static org.opencb.opencga.analysis.wrappers.OpenCgaWrapperAnalysis.DOCKER_OUTPUT_PATH; +import static org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor.DOCKER_INPUT_PATH; +import static org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor.DOCKER_OUTPUT_PATH; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.STUDY; @ToolExecutor(id="opencga-local", tool = CircosAnalysis.ID, diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java deleted file mode 100644 index 670670f6ce1..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/OpenCgaWrapperAnalysis.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.analysis.wrappers; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.analysis.tools.OpenCgaTool; -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.response.OpenCGAResult; - -import java.io.File; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -@Deprecated -public abstract class OpenCgaWrapperAnalysis extends OpenCgaTool { - - public final String DOCKER_IMAGE_VERSION_PARAM = "DOCKER_IMAGE_VERSION"; - public final static String DOCKER_INPUT_PATH = "/data/input"; - public final static String DOCKER_OUTPUT_PATH = "/data/output"; - - public static final String STDOUT_FILENAME = "stdout.txt"; - public static final String STDERR_FILENAME = "stderr.txt"; - - private String study; - - protected Map fileUriMap = new HashMap<>(); - -// @Deprecated -// public abstract String getDockerImageName(); - -// protected String getCommandLine() throws ToolException { -// return getCommandLine("--"); -// } -// -// protected String getCommandLine(String prefix) { -// StringBuilder sb = new StringBuilder(); -// sb.append("run docker ").append(getDockerImageName()); -// for (String key : params.keySet()) { -// String value = params.getString(key); -// sb.append(" ").append(prefix).append(key); -// if (StringUtils.isNotEmpty(value)) { -// sb.append(" ").append(value); -// } -// } -// return sb.toString(); -// } -// -// protected String getCatalogPath(String inputFile) throws ToolException { -//// return new File(getCatalogFile(inputFile).getPath()).getParent(); -// return getCatalogFile(inputFile).getPath(); -// } - - protected org.opencb.opencga.core.models.file.File getCatalogFile(String inputFile) throws ToolException { - // Get catalog path - OpenCGAResult fileResult; - try { - fileResult = catalogManager.getFileManager().get(getStudy(), inputFile, QueryOptions.empty(), token); - } catch (CatalogException e) { - throw new ToolException("Error accessing file '" + inputFile + "' of the study " + getStudy() + "'", e); - } - if (fileResult.getNumResults() <= 0) { - throw new ToolException("File '" + inputFile + "' not found in study '" + getStudy() + "'"); - } - - return fileResult.getResults().get(0); - } - - protected boolean isValidFile(File file) { - return file.exists() && (FileUtils.sizeOf(file) > 0); - } - - protected void updateSrcTargetMap(String filename, StringBuilder sb, Map srcTargetMap) throws ToolException { - if (StringUtils.isEmpty(filename)) { - // Skip - return; - } - - OpenCGAResult fileResult; - try { - fileResult = catalogManager.getFileManager().get(getStudy(), filename, - QueryOptions.empty(), token); - } catch (CatalogException e) { - throw new ToolException("Error accessing file '" + filename + "' of the study " + getStudy() + "'", e); - } - if (fileResult.getNumResults() <= 0) { - throw new ToolException("File '" + filename + "' not found in study '" + getStudy() + "'"); - } - URI uri = fileResult.getResults().get(0).getUri(); - logger.info("filename = " + filename + " ---> uri = " + uri + " ---> path = " + uri.getPath()); - - if (StringUtils.isNotEmpty(uri.toString())) { - String src = new File(uri.getPath()).getParentFile().getAbsolutePath(); - if (!srcTargetMap.containsKey(src)) { - srcTargetMap.put(src, DOCKER_INPUT_PATH + srcTargetMap.size()); - sb.append("--mount type=bind,source=\"").append(src).append("\",target=\"").append(srcTargetMap.get(src)).append("\" "); - } - } - } - - protected void updateFileMaps(String filename, StringBuilder sb, Map fileUriMap, Map srcTargetMap) - throws ToolException { - if (StringUtils.isEmpty(filename)) { - // Skip - return; - } - - OpenCGAResult fileResult; - try { - fileResult = catalogManager.getFileManager().get(getStudy(), filename, QueryOptions.empty(), token); - } catch (CatalogException e) { - throw new ToolException("Error accessing file '" + filename + "' of the study " + getStudy() + "'", e); - } - if (fileResult.getNumResults() <= 0) { - throw new ToolException("File '" + filename + "' not found in study '" + getStudy() + "'"); - } - URI uri = fileResult.getResults().get(0).getUri(); - logger.info("filename = " + filename + " ---> uri = " + uri + " ---> path = " + uri.getPath()); - - if (StringUtils.isNotEmpty(uri.toString())) { - fileUriMap.put(filename, uri); - if (srcTargetMap != null) { - String src = new File(uri.getPath()).getParentFile().getAbsolutePath(); - if (!srcTargetMap.containsKey(src)) { - srcTargetMap.put(src, DOCKER_INPUT_PATH + srcTargetMap.size()); - sb.append("--mount type=bind,source=\"").append(src).append("\",target=\"").append(srcTargetMap.get(src)).append("\" "); - } - } - } - } - - public String getStudy() { - return study; - } - - public OpenCgaWrapperAnalysis setStudy(String study) { - this.study = study; - return this; - } -} \ No newline at end of file From 0e6df42a519870f342713854df2f3a84ed08fc6b Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 10 May 2021 11:57:10 +0200 Subject: [PATCH 299/412] analysis: improve auxiliar collection index performance, #1693 --- .../opencga/analysis/rga/RgaManager.java | 73 +++++++++++++------ 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 17f3f668ad4..f4b60bd9aad 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -299,9 +299,10 @@ public void generateAuxiliarCollection(String studyStr, String token) throws Cat } - private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, String variantId) throws RgaException { + private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, String variantId) throws RgaException, IOException { Query query = new Query(RgaQueryParams.VARIANTS.key(), variantId); - RgaIterator rgaIterator = rgaEngine.variantQuery(mainCollection, query, QueryOptions.empty()); + StopWatch stopWatch = StopWatch.createStarted(); + String dbSnp = ""; String type = ""; Set knockoutTypes = new HashSet<>(); @@ -312,32 +313,56 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri Set geneNames = new HashSet<>(); Set transcripts = new HashSet<>(); - while (rgaIterator.hasNext()) { - RgaDataModel rgaDataModel = rgaIterator.next(); - for (String variantSummaryId : rgaDataModel.getVariantSummary()) { - CodedVariant codedVariant = CodedVariant.parseEncodedId(variantSummaryId); - if (codedVariant.getId().equals(variantId)) { - knockoutTypes.add(codedVariant.getKnockoutType()); - consequenceTypes.addAll(codedVariant.getConsequenceType()); - if (populationFrequencyMap.isEmpty()) { - dbSnp = codedVariant.getDbSnp(); - type = codedVariant.getType(); - - String pfKey = RgaDataModel.POPULATION_FREQUENCIES.replace("*", ""); - String thousandGenomeKey = pfKey + RgaUtils.THOUSAND_GENOMES_STUDY; - String gnomadGenomeKey = pfKey + RgaUtils.GNOMAD_GENOMES_STUDY; - - populationFrequencyMap.put(thousandGenomeKey, codedVariant.getThousandGenomesFrequency()); - populationFrequencyMap.put(gnomadGenomeKey, codedVariant.getGnomadFrequency()); - } - clinicalSignificances.addAll(codedVariant.getClinicalSignificances()); - geneIds.add(rgaDataModel.getGeneId()); - geneNames.add(rgaDataModel.getGeneName()); - transcripts.add(rgaDataModel.getTranscriptId()); + // 3. Get allele pairs and CT from Variant summary + QueryOptions knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(mainCollection, query, knockoutTypeFacet); + + for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { + CodedVariant codedVariant = CodedVariant.parseEncodedId(bucket.getValue()); + if (variantId.equals(codedVariant.getId())) { + knockoutTypes.add(codedVariant.getKnockoutType()); + consequenceTypes.addAll(codedVariant.getConsequenceType()); + clinicalSignificances.addAll(codedVariant.getClinicalSignificances()); + clinicalSignificances.add(codedVariant.getTranscriptId()); + + if (populationFrequencyMap.isEmpty()) { + dbSnp = codedVariant.getDbSnp(); + type = codedVariant.getType(); + + String pfKey = RgaDataModel.POPULATION_FREQUENCIES.replace("*", ""); + String thousandGenomeKey = pfKey + RgaUtils.THOUSAND_GENOMES_STUDY; + String gnomadGenomeKey = pfKey + RgaUtils.GNOMAD_GENOMES_STUDY; + + populationFrequencyMap.put(thousandGenomeKey, codedVariant.getThousandGenomesFrequency()); + populationFrequencyMap.put(gnomadGenomeKey, codedVariant.getGnomadFrequency()); } } } + knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.GENE_ID); + facetFieldDataResult = rgaEngine.facetedQuery(mainCollection, query, knockoutTypeFacet); + geneIds.addAll(facetFieldDataResult.first().getBuckets() + .stream() + .map(FacetField.Bucket::getValue) + .map(String::valueOf) + .collect(Collectors.toSet())); + + knockoutTypeFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.GENE_NAME); + facetFieldDataResult = rgaEngine.facetedQuery(mainCollection, query, knockoutTypeFacet); + geneNames.addAll(facetFieldDataResult.first().getBuckets() + .stream() + .map(FacetField.Bucket::getValue) + .map(String::valueOf) + .collect(Collectors.toSet())); + + logger.info("Processing variant '{}' took {} milliseconds", variantId, stopWatch.getTime(TimeUnit.MILLISECONDS)); + return new AuxiliarRgaDataModel(variantId, dbSnp, type, new ArrayList<>(knockoutTypes), new ArrayList<>(consequenceTypes), populationFrequencyMap, new ArrayList<>(clinicalSignificances), new ArrayList<>(geneIds), new ArrayList<>(geneNames), new ArrayList<>(transcripts)); From 7c37530ddee7f752bde05cb24aad594c8f95af41 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 10 May 2021 12:05:43 +0200 Subject: [PATCH 300/412] analysis: fix transcript issue --- .../main/java/org/opencb/opencga/analysis/rga/RgaManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index f4b60bd9aad..dc400b1a366 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -325,7 +325,7 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri knockoutTypes.add(codedVariant.getKnockoutType()); consequenceTypes.addAll(codedVariant.getConsequenceType()); clinicalSignificances.addAll(codedVariant.getClinicalSignificances()); - clinicalSignificances.add(codedVariant.getTranscriptId()); + transcripts.add(codedVariant.getTranscriptId()); if (populationFrequencyMap.isEmpty()) { dbSnp = codedVariant.getDbSnp(); From 030df70c1b21abe581c9353ab4faddaf496a57aa Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 10 May 2021 14:00:23 +0200 Subject: [PATCH 301/412] analysis: check for null rsIds --- .../opencb/opencga/analysis/rga/IndividualRgaConverter.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 2d83497064d..b24c9aa7d42 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -253,7 +253,9 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI List variants = transcript.getVariants(); for (KnockoutVariant variant : variants) { variantIds.add(variant.getId()); - dbSnps.add(variant.getDbSnp()); + if (StringUtils.isNotEmpty(variant.getDbSnp())) { + dbSnps.add(variant.getDbSnp()); + } String knockoutType = variant.getKnockoutType() != null ? variant.getKnockoutType().name() : ""; knockoutTypes.add(knockoutType); if (variant.getType() != null) { From b80a688dd9c49e36f8c2fe1c4675cce75b8c063f Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 11 May 2021 10:29:31 +0200 Subject: [PATCH 302/412] analysis: fix consequence type queries, #1693 --- .../analysis/rga/AuxiliarRgaDataModel.java | 18 +++---- .../opencga/analysis/rga/RgaManager.java | 47 +++++++++---------- .../opencga/analysis/rga/RgaQueryParser.java | 30 +++++++----- .../opencb/opencga/analysis/rga/RgaUtils.java | 4 -- .../opencga/analysis/rga/RgaManagerTest.java | 12 +++++ 5 files changed, 62 insertions(+), 49 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java index 21c6d63ba09..bbe8c581ecf 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java @@ -51,15 +51,15 @@ public class AuxiliarRgaDataModel { static { MAIN_TO_AUXILIAR_DATA_MODEL_MAP = new HashMap<>(); - MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.VARIANTS, ID); - MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.DB_SNPS, DB_SNP); - MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.TYPES, TYPE); - MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.KNOCKOUT_TYPES, KNOCKOUT_TYPES); - MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.CONSEQUENCE_TYPES, CONSEQUENCE_TYPES); - MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.CLINICAL_SIGNIFICANCES, CLINICAL_SIGNIFICANCES); - MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.GENE_ID, GENE_IDS); - MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.GENE_NAME, GENE_NAMES); - MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaDataModel.TRANSCRIPT_ID, TRANSCRIPT_IDS); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.VARIANTS.key(), ID); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.DB_SNPS.key(), DB_SNP); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.TYPE.key(), TYPE); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.KNOCKOUT.key(), KNOCKOUT_TYPES); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.CONSEQUENCE_TYPE.key(), CONSEQUENCE_TYPES); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.CLINICAL_SIGNIFICANCE.key(), CLINICAL_SIGNIFICANCES); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.GENE_ID.key(), GENE_IDS); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.GENE_NAME.key(), GENE_NAMES); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.TRANSCRIPT_ID.key(), TRANSCRIPT_IDS); } public AuxiliarRgaDataModel() { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index dc400b1a366..402c9b860a0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -822,10 +822,11 @@ public OpenCGAResult variantQuery(String studyStr, Query quer public OpenCGAResult individualSummary(String studyStr, Query query, QueryOptions options, String token) throws RgaException, CatalogException, IOException { + StopWatch stopWatch = StopWatch.createStarted(); + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String collection = getMainCollectionName(study.getFqn()); - StopWatch stopWatch = StopWatch.createStarted(); ExecutorService executor = Executors.newFixedThreadPool(4); Preprocess preprocess; @@ -926,6 +927,7 @@ public OpenCGAResult individualSummary(String study public OpenCGAResult geneSummary(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { + StopWatch stopWatch = StopWatch.createStarted(); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); String collection = getMainCollectionName(study.getFqn()); @@ -940,8 +942,6 @@ public OpenCGAResult geneSummary(String studyStr, Query q catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); ExecutorService executor = Executors.newFixedThreadPool(4); QueryOptions queryOptions = setDefaultLimit(options); @@ -949,9 +949,9 @@ public OpenCGAResult geneSummary(String studyStr, Query q Query auxQuery = query != null ? new Query(query) : new Query(); // Get numTotalResults in a future - Future numTotalResults = null; + Future numMatchesFuture = null; if (queryOptions.getBoolean(QueryOptions.COUNT)) { - numTotalResults = executor.submit(() -> { + numMatchesFuture = executor.submit(() -> { QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.GENE_ID + ")"); try { DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); @@ -991,24 +991,24 @@ public OpenCGAResult geneSummary(String studyStr, Query q throw new RgaException(e.getMessage(), e); } - int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); - OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), - knockoutByGeneSummaryList.size(), knockoutByGeneSummaryList, -1); - + int numMatches = -1; if (queryOptions.getBoolean(QueryOptions.COUNT)) { try { - assert numTotalResults != null; - result.setNumMatches(numTotalResults.get()); + assert numMatchesFuture != null; + numMatches = numMatchesFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } } - return result; + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + return new OpenCGAResult<>(time, Collections.emptyList(), knockoutByGeneSummaryList.size(), knockoutByGeneSummaryList, numMatches); } public OpenCGAResult variantSummary(String studyStr, Query query, QueryOptions options, String token) throws CatalogException, IOException, RgaException { + StopWatch stopWatch = StopWatch.createStarted(); + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); String collection = getMainCollectionName(study.getFqn()); @@ -1023,17 +1023,15 @@ public OpenCGAResult variantSummary(String studyStr, Q catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); ExecutorService executor = Executors.newFixedThreadPool(4); QueryOptions queryOptions = setDefaultLimit(options); Query auxQuery = query != null ? new Query(query) : new Query(); - Future numTotalResults = null; + Future numMatchesFuture = null; if (queryOptions.getBoolean(QueryOptions.COUNT)) { - numTotalResults = executor.submit(() -> { + numMatchesFuture = executor.submit(() -> { QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.VARIANTS + ")"); try { DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); @@ -1107,22 +1105,21 @@ public OpenCGAResult variantSummary(String studyStr, Q } List knockoutByVariantSummaryList = new ArrayList<>(variantSummaryMap.values()); - - int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); - logger.info("Variant summary: {} milliseconds", time); - OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), - knockoutByVariantSummaryList.size(), knockoutByVariantSummaryList, -1); - + int numMatches = -1; if (queryOptions.getBoolean(QueryOptions.COUNT)) { try { - assert numTotalResults != null; - result.setNumMatches(numTotalResults.get()); + assert numMatchesFuture != null; + numMatches = numMatchesFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } } - return result; + int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); + logger.info("Variant summary: {} milliseconds", time); + + return new OpenCGAResult<>(time, Collections.emptyList(), knockoutByVariantSummaryList.size(), knockoutByVariantSummaryList, + numMatches); } public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java index 85f1d8c0e9a..e7094f04a09 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java @@ -1,5 +1,6 @@ package org.opencb.opencga.analysis.rga; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; @@ -14,8 +15,8 @@ import java.util.*; import java.util.regex.Pattern; -import static org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant.KnockoutType.*; import static org.opencb.opencga.analysis.rga.RgaQueryParams.*; +import static org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant.KnockoutType.*; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.printQuery; public class RgaQueryParser { @@ -80,6 +81,10 @@ public SolrQuery parseAuxQuery(Query query) throws RgaException { Query finalQuery = new Query(query); fixQuery(finalQuery); + if (finalQuery.containsKey(CONSEQUENCE_TYPE.key())) { + List ctValues = getEncodedConsequenceTypes(finalQuery.getAsStringList(CONSEQUENCE_TYPE.key())); + finalQuery.put(CONSEQUENCE_TYPE.key(), ctValues); + } List filterList = new ArrayList<>(); parseStringValue(finalQuery, VARIANTS, AuxiliarRgaDataModel.ID, filterList); @@ -231,16 +236,7 @@ private void buildComplexQueryFilter(List filterList, List knock filterValues = RgaUtils.parseFilterQuery(filterValues); // CT - List ctValues; - if (!ctList.isEmpty()) { - ctValues = new ArrayList<>(ctList.size()); - for (String ctValue : ctList) { - String encodedValue = String.valueOf(VariantQueryUtils.parseConsequenceType(ctValue)); - ctValues.add(encodedValue); - } - } else { - ctValues = Collections.emptyList(); - } + List ctValues = getEncodedConsequenceTypes(ctList); // Pop. freq Map> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqList); @@ -248,6 +244,18 @@ private void buildComplexQueryFilter(List filterList, List knock buildComplexQuery(koValues, filterValues, ctValues, popFreqQueryList, filterList); } + private List getEncodedConsequenceTypes(List originalCtList) { + if (CollectionUtils.isEmpty(originalCtList)) { + return Collections.emptyList(); + } + List ctValues = new ArrayList<>(originalCtList.size()); + for (String ctValue : originalCtList) { + String encodedValue = String.valueOf(VariantQueryUtils.parseConsequenceType(ctValue)); + ctValues.add(encodedValue); + } + return ctValues; + } + private void buildComplexQuery(List koValues, List filterValues, List ctValues, Map> popFreqQueryList, List filterList) { if (ctValues.isEmpty() && popFreqQueryList.isEmpty()) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index c8a80f5732f..4aea2be8805 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -278,9 +278,6 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, if (rgaDataModel.getVariants() != null) { for (int i = 0; i < rgaDataModel.getVariants().size(); i++) { String variantId = rgaDataModel.getVariants().get(i); - String dbSnp = CollectionUtils.isNotEmpty(rgaDataModel.getDbSnps()) - ? rgaDataModel.getDbSnps().get(i) - : null; if (variantIds.isEmpty() || variantIds.contains(variantId)) { KnockoutVariant knockoutVariant; @@ -320,7 +317,6 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, Variant variant = new Variant(variantId); knockoutVariant = new KnockoutVariant() .setId(variantId) - .setDbSnp(dbSnp) .setChromosome(variant.getChromosome()) .setStart(variant.getStart()) .setEnd(variant.getEnd()) diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 2dcb23edc5e..1dea6801815 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -590,6 +590,18 @@ public void testVariantSummary() throws CatalogException, IOException, RgaExcept assertFalse(variant.getGenes().isEmpty()); } + result = rgaManager.variantSummary(STUDY, new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "stop_gained"), QueryOptions.empty(), ownerToken); + assertEquals(1, result.getNumResults()); + for (KnockoutByVariantSummary variant : result.getResults()) { + assertNull(variant.getTranscriptChPairs()); + assertEquals(1, variant.getAllelePairs().size()); + + assertNotNull(variant.getId()); + assertFalse(variant.getGenes().isEmpty()); + assertEquals("stop_gained", variant.getSequenceOntologyTerms().get(0).getName()); + } + + } } \ No newline at end of file From 2cae859684da3aff30e8475d659607e892e55fb6 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 11 May 2021 13:35:26 +0200 Subject: [PATCH 303/412] analysis: fix minor issue in individual summary, #1693 --- .../opencga/analysis/rga/RgaManager.java | 36 ++++++++++--------- .../opencga/analysis/rga/RgaManagerTest.java | 8 +++++ 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 402c9b860a0..1d8cb6c514d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -863,25 +863,29 @@ public OpenCGAResult individualSummary(String study } Set parentSampleIds = new HashSet<>(); - try { - for (Future summaryFuture : futureList) { - KnockoutByIndividualSummary knockoutByIndividualSummary = summaryFuture.get(); - if (!preprocess.isOwnerOrAdmin()) { - if (StringUtils.isNotEmpty(knockoutByIndividualSummary.getFatherSampleId())) { - parentSampleIds.add(knockoutByIndividualSummary.getFatherSampleId()); - } - if (StringUtils.isNotEmpty(knockoutByIndividualSummary.getMotherSampleId())) { - parentSampleIds.add(knockoutByIndividualSummary.getMotherSampleId()); - } + for (Future summaryFuture : futureList) { + KnockoutByIndividualSummary knockoutByIndividualSummary; + try { + knockoutByIndividualSummary = summaryFuture.get(); + } catch (InterruptedException | ExecutionException e) { + if (RgaException.NO_RESULTS_FOUND.equals(e.getCause().getMessage())) { + continue; } - - knockoutByIndividualSummaryList.add(knockoutByIndividualSummary); + throw new RgaException(e.getMessage(), e); } - } catch (InterruptedException | ExecutionException e) { - if (RgaException.NO_RESULTS_FOUND.equals(e.getCause().getMessage())) { - return OpenCGAResult.empty(KnockoutByIndividualSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); + if (!preprocess.isOwnerOrAdmin()) { + if (StringUtils.isNotEmpty(knockoutByIndividualSummary.getFatherSampleId())) { + parentSampleIds.add(knockoutByIndividualSummary.getFatherSampleId()); + } + if (StringUtils.isNotEmpty(knockoutByIndividualSummary.getMotherSampleId())) { + parentSampleIds.add(knockoutByIndividualSummary.getMotherSampleId()); + } } - throw new RgaException(e.getMessage(), e); + knockoutByIndividualSummaryList.add(knockoutByIndividualSummary); + } + + if (knockoutByIndividualSummaryList.isEmpty()) { + return OpenCGAResult.empty(KnockoutByIndividualSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); } if (!parentSampleIds.isEmpty()) { diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 1dea6801815..31a359b2db0 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -226,6 +226,11 @@ public void testIndividualQueryLimit() throws CatalogException, IOException, Rga sampleIds.add(result.first().getSampleId()); } assertEquals(4, sampleIds.size()); + + OpenCGAResult result = rgaManager.individualQuery(STUDY, + new Query(RgaQueryParams.INDIVIDUAL_ID.key(), "NA19685,NA19600").append(RgaQueryParams.SEX.key(), "MALE"), + QueryOptions.empty(), ownerToken); + assertEquals(1, result.getNumResults()); } @Test @@ -308,6 +313,9 @@ public void testIndividualSummary() throws CatalogException, IOException, RgaExc } } assertTrue(compHetFound); + + result = rgaManager.individualSummary(STUDY, new Query(RgaQueryParams.INDIVIDUAL_ID.key(), "NA19685,NA19600").append(RgaQueryParams.SEX.key(), "MALE"), QueryOptions.empty(), ownerToken); + assertEquals(1, result.getNumResults()); } @Test From bfecba13e753a8c14a8eb5978c982e3adf8aead7 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 11 May 2021 15:15:47 +0200 Subject: [PATCH 304/412] analysis: calculate numMatches using new collection --- .../opencga/analysis/rga/RgaManager.java | 215 +++++++++--------- .../opencga/analysis/rga/RgaManagerTest.java | 6 +- 2 files changed, 106 insertions(+), 115 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 1d8cb6c514d..5df8e71f8ea 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -557,25 +557,10 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); - // Get numTotalResults in a future - Future numTotalResults = null; - if (queryOptions.getBoolean(QueryOptions.COUNT)) { - numTotalResults = executor.submit(() -> { - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.GENE_ID + ")"); - try { - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); - return ((Number) result.first().getAggregationValues().get(0)).intValue(); - } catch (Exception e) { - e.printStackTrace(); - } - return -1; - }); - } - - List geneIds; + ResourceIds resourceIds; try { - geneIds = getIds(collection, auxCollection, RgaQueryParams.GENE_ID.key(), auxQuery, queryOptions); - auxQuery.put(RgaQueryParams.GENE_ID.key(), geneIds); + resourceIds = getIds(collection, auxCollection, RgaQueryParams.GENE_ID.key(), auxQuery, queryOptions, executor); + auxQuery.put(RgaQueryParams.GENE_ID.key(), resourceIds.getIds()); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { return OpenCGAResult.empty(RgaKnockoutByGene.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); @@ -646,7 +631,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); try { - knockoutResult.setNumMatches(numTotalResults != null ? numTotalResults.get() : -1); + knockoutResult.setNumMatches(resourceIds.getNumMatchesFuture() != null ? resourceIds.getNumMatchesFuture().get() : -1); } catch (InterruptedException | ExecutionException e) { knockoutResult.setNumMatches(-1); } @@ -693,24 +678,10 @@ public OpenCGAResult variantQuery(String studyStr, Query quer Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); - Future numTotalResults = null; - if (queryOptions.getBoolean(QueryOptions.COUNT)) { - numTotalResults = executor.submit(() -> { - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.VARIANTS + ")"); - try { - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); - return ((Number) result.first().getAggregationValues().get(0)).intValue(); - } catch (Exception e) { - logger.error("Could not obtain the count: {}", e.getMessage(), e); - } - return -1; - }); - } - - List variantIds; + ResourceIds resourceIds; try { - variantIds = getIds(collection, auxCollection, RgaQueryParams.VARIANTS.key(), auxQuery, queryOptions); - auxQuery.put(RgaDataModel.VARIANTS, variantIds); + resourceIds = getIds(collection, auxCollection, RgaQueryParams.VARIANTS.key(), auxQuery, queryOptions, executor); + auxQuery.put(RgaDataModel.VARIANTS, resourceIds.getIds()); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { return OpenCGAResult.empty(KnockoutByVariant.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); @@ -798,7 +769,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer OpenCGAResult knockoutResult = new OpenCGAResult<>(time, Collections.emptyList(), knockoutResultList.size(), knockoutResultList, -1); try { - knockoutResult.setNumMatches(numTotalResults != null ? numTotalResults.get() : -1); + knockoutResult.setNumMatches(resourceIds.getNumMatchesFuture() != null ? resourceIds.getNumMatchesFuture().get() : -1); } catch (InterruptedException | ExecutionException e) { knockoutResult.setNumMatches(-1); } @@ -952,24 +923,9 @@ public OpenCGAResult geneSummary(String studyStr, Query q Query auxQuery = query != null ? new Query(query) : new Query(); - // Get numTotalResults in a future - Future numMatchesFuture = null; - if (queryOptions.getBoolean(QueryOptions.COUNT)) { - numMatchesFuture = executor.submit(() -> { - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.GENE_ID + ")"); - try { - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); - return ((Number) result.first().getAggregationValues().get(0)).intValue(); - } catch (Exception e) { - e.printStackTrace(); - } - return -1; - }); - } - - List geneIds; + ResourceIds resourceIds; try { - geneIds = getIds(collection, auxCollection, RgaQueryParams.GENE_ID.key(), auxQuery, queryOptions); + resourceIds = getIds(collection, auxCollection, RgaQueryParams.GENE_ID.key(), auxQuery, queryOptions, executor); auxQuery.remove(RgaQueryParams.GENE_ID.key()); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { @@ -978,12 +934,12 @@ public OpenCGAResult geneSummary(String studyStr, Query q throw e; } - List> geneSummaryFutureList = new ArrayList<>(geneIds.size()); - for (String geneId : geneIds) { + List> geneSummaryFutureList = new ArrayList<>(resourceIds.getIds().size()); + for (String geneId : resourceIds.getIds()) { geneSummaryFutureList.add(executor.submit(() -> calculateGeneSummary(collection, auxQuery, geneId))); } - List knockoutByGeneSummaryList = new ArrayList<>(geneIds.size()); + List knockoutByGeneSummaryList = new ArrayList<>(resourceIds.getIds().size()); try { for (Future summaryFuture : geneSummaryFutureList) { knockoutByGeneSummaryList.add(summaryFuture.get()); @@ -998,8 +954,8 @@ public OpenCGAResult geneSummary(String studyStr, Query q int numMatches = -1; if (queryOptions.getBoolean(QueryOptions.COUNT)) { try { - assert numMatchesFuture != null; - numMatches = numMatchesFuture.get(); + assert resourceIds.getNumMatchesFuture() != null; + numMatches = resourceIds.getNumMatchesFuture().get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } @@ -1033,24 +989,10 @@ public OpenCGAResult variantSummary(String studyStr, Q Query auxQuery = query != null ? new Query(query) : new Query(); - Future numMatchesFuture = null; - if (queryOptions.getBoolean(QueryOptions.COUNT)) { - numMatchesFuture = executor.submit(() -> { - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaDataModel.VARIANTS + ")"); - try { - DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); - return ((Number) result.first().getAggregationValues().get(0)).intValue(); - } catch (Exception e) { - logger.error("Could not obtain the count: {}", e.getMessage(), e); - } - return -1; - }); - } - - List variantIds; + ResourceIds resourceIds; try { - variantIds = getIds(collection, auxCollection, RgaQueryParams.VARIANTS.key(), auxQuery, queryOptions); - auxQuery.put(RgaDataModel.VARIANTS, variantIds); + resourceIds = getIds(collection, auxCollection, RgaQueryParams.VARIANTS.key(), auxQuery, queryOptions, executor); + auxQuery.put(RgaDataModel.VARIANTS, resourceIds.getIds()); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { return OpenCGAResult.empty(KnockoutByVariantSummary.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); @@ -1062,8 +1004,8 @@ public OpenCGAResult variantSummary(String studyStr, Q () -> variantStorageQuery(study.getFqn(), Collections.emptyList(), auxQuery, QueryOptions.empty(), token) ); - List> variantSummaryList = new ArrayList<>(variantIds.size()); - for (String variantId : variantIds) { + List> variantSummaryList = new ArrayList<>(resourceIds.getIds().size()); + for (String variantId : resourceIds.getIds()) { variantSummaryList.add(executor.submit(() -> calculatePartialSolrVariantSummary(collection, auxQuery, variantId))); } @@ -1112,8 +1054,8 @@ public OpenCGAResult variantSummary(String studyStr, Q int numMatches = -1; if (queryOptions.getBoolean(QueryOptions.COUNT)) { try { - assert numMatchesFuture != null; - numMatches = numMatchesFuture.get(); + assert resourceIds.getNumMatchesFuture() != null; + numMatches = resourceIds.getNumMatchesFuture().get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } @@ -1156,42 +1098,55 @@ public OpenCGAResult aggregationStats(String studyStr, Query query, * @throws RgaException RgaException. * @throws IOException IOException. */ - private List getIds(String mainCollection, String auxCollection, String facetField, Query query, QueryOptions options) - throws RgaException, IOException { + private ResourceIds getIds(String mainCollection, String auxCollection, String facetField, Query query, QueryOptions options, + ExecutorService executor) throws RgaException, IOException { String auxiliarId = AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.get(facetField); - List ids = query.getAsStringList(facetField); - // If the user is querying by variant id, we don't need to do a facet first - if (ids.isEmpty()) { - Query mainCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), true); - Query auxCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), false); - - if (!mainCollQuery.isEmpty()) { - // Perform a facet in the main collection because the user is filtering by other fields not present in the auxiliar coll - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, facetField); - facetOptions.putIfNotNull(QueryOptions.LIMIT, -1); - - DataResult result = rgaEngine.facetedQuery(mainCollection, query, facetOptions); - if (result.getNumResults() == 0) { - throw RgaException.noResultsMatching(); - } + List ids; + Future numMatchesFuture = null; - ids = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - auxCollQuery.put(facetField, ids); - } + Query mainCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), true); + Query auxCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), false); - // Perform a facet to get the different variant ids matching the user query and using the skip and limit values - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, auxiliarId); - facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); - facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); + if (!mainCollQuery.isEmpty()) { + // Perform a facet in the main collection because the user is filtering by other fields not present in the auxiliar coll + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, facetField); + facetOptions.putIfNotNull(QueryOptions.LIMIT, -1); - DataResult result = rgaEngine.auxFacetedQuery(auxCollection, auxCollQuery, facetOptions); + DataResult result = rgaEngine.facetedQuery(mainCollection, query, facetOptions); if (result.getNumResults() == 0) { throw RgaException.noResultsMatching(); } + ids = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + auxCollQuery.put(facetField, ids); + } + + // Get number of matches + if (options.getBoolean(QueryOptions.COUNT)) { + numMatchesFuture = executor.submit(() -> { + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + auxiliarId + ")"); + try { + DataResult result = rgaEngine.auxFacetedQuery(auxCollection, auxCollQuery, facetOptions); + return ((Number) result.first().getAggregationValues().get(0)).intValue(); + } catch (Exception e) { + logger.error("Could not obtain the count: {}", e.getMessage(), e); + } + return -1; + }); + } + + // Perform a facet to get the different variant ids matching the user query and using the skip and limit values + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, auxiliarId); + facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); + facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); + + DataResult result = rgaEngine.auxFacetedQuery(auxCollection, auxCollQuery, facetOptions); + if (result.getNumResults() == 0) { + throw RgaException.noResultsMatching(); } + ids = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - return ids; + return new ResourceIds(ids, numMatchesFuture); } /** @@ -1263,13 +1218,15 @@ private KnockoutByVariantSummary calculatePartialSolrVariantSummary(String colle .append(QueryOptions.LIMIT, -1) .append(QueryOptions.FACET, RgaDataModel.CLINICAL_SIGNIFICANCES); DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, auxQuery, knockoutTypeFacet); - knockoutByVariantSummary.setClinicalSignificances(facetFieldDataResult.first() - .getBuckets() - .stream() - .map(FacetField.Bucket::getValue) - .map(ClinicalSignificance::valueOf) - .collect(Collectors.toList()) - ); + if (facetFieldDataResult.getNumResults() > 0 && facetFieldDataResult.first().getBuckets() != null) { + knockoutByVariantSummary.setClinicalSignificances(facetFieldDataResult.first() + .getBuckets() + .stream() + .map(FacetField.Bucket::getValue) + .map(ClinicalSignificance::valueOf) + .collect(Collectors.toList()) + ); + } // 2. Get individual knockout type counts QueryOptions geneFacet = new QueryOptions() @@ -1672,6 +1629,38 @@ private boolean includeVariants(AbstractRgaConverter converter, QueryOptions que return true; } + private class ResourceIds { + private List ids; + private Future numMatchesFuture; + + public ResourceIds(List ids) { + this.ids = ids; + } + + public ResourceIds(List ids, Future numMatchesFuture) { + this.ids = ids; + this.numMatchesFuture = numMatchesFuture; + } + + public List getIds() { + return ids; + } + + public ResourceIds setIds(List ids) { + this.ids = ids; + return this; + } + + public Future getNumMatchesFuture() { + return numMatchesFuture; + } + + public ResourceIds setNumMatchesFuture(Future numMatchesFuture) { + this.numMatchesFuture = numMatchesFuture; + return this; + } + } + private class Preprocess { private String userId; private boolean isOwnerOrAdmin; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index 31a359b2db0..cc16beef397 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -575,8 +575,9 @@ public void testVariantQueryLimit() throws CatalogException, IOException, RgaExc @Test public void testVariantSummary() throws CatalogException, IOException, RgaException { - OpenCGAResult result = rgaManager.variantSummary(STUDY, new Query(), QueryOptions.empty(), ownerToken); + OpenCGAResult result = rgaManager.variantSummary(STUDY, new Query(), new QueryOptions(QueryOptions.COUNT, true), ownerToken); assertEquals(10, result.getNumResults()); + assertTrue(result.getNumMatches() > 0); for (KnockoutByVariantSummary variant : result.getResults()) { assertNotNull(variant.getId()); assertNotNull(variant.getDbSnp()); @@ -584,8 +585,9 @@ public void testVariantSummary() throws CatalogException, IOException, RgaExcept } result = rgaManager.variantSummary(STUDY, new Query(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET), - QueryOptions.empty(), ownerToken); + new QueryOptions(QueryOptions.COUNT, true), ownerToken); assertEquals(4, result.getNumResults()); + assertTrue(result.getNumMatches() > 0); for (KnockoutByVariantSummary variant : result.getResults()) { assertFalse(variant.getTranscriptChPairs().isEmpty()); for (List value : variant.getTranscriptChPairs().values()) { From 6e14475e20ab49a05c6531c2b17b610cb8bcda04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 12 May 2021 11:30:54 +0200 Subject: [PATCH 305/412] analysis: improve Plink file parameters management --- .../wrappers/plink/PlinkWrapperAnalysis.java | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysis.java index fdeb6b89790..a460847e560 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/plink/PlinkWrapperAnalysis.java @@ -21,7 +21,9 @@ import org.opencb.opencga.analysis.AnalysisUtils; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.variant.PlinkWrapperParams; import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.tools.annotations.ToolParams; @@ -35,7 +37,9 @@ public class PlinkWrapperAnalysis extends OpenCgaToolScopeStudy { public static final String DESCRIPTION = "Plink is a whole genome association analysis toolset, designed to perform" + " a range of basic, large-scale analyses."; - public final static Set FILE_PARAM_NAMES = new HashSet<>(Arrays.asList("file", "tfile", "bfile", "pheno", "within", "cov")); + public final static Set FILE_PARAM_NAMES = new HashSet<>(Arrays.asList("ped", "map", "tped", "tfam", "bed", "bim", "fam", "vcf", + "bcf", "lgen", "reference", "gen", "bgen", "sample", "23file", "read-freq", "pheno", "covar", "within", "loop-assoc", "set", + "subset")); @ToolParams protected final PlinkWrapperParams analysisParams = new PlinkWrapperParams(); @@ -43,31 +47,44 @@ public class PlinkWrapperAnalysis extends OpenCgaToolScopeStudy { protected void check() throws Exception { super.check(); - // Get files from catalog - FileManager fileManager = catalogManager.getFileManager(); if (MapUtils.isNotEmpty(analysisParams.getPlinkParams())) { + + // Check prefix parameters + if (analysisParams.getPlinkParams().containsKey("file")) { + // Prefix for the .ped and .map files + throw new ToolException("Plink --file parameter not supported. Please, use --ped and --map parameters instead of --file."); + } + if (analysisParams.getPlinkParams().containsKey("tfile")) { + // Prefix for the .tped and .tfam files + throw new ToolException("Plink --tfile parameter not supported. Please, use --tped and --tfam parameters instead of" + + " --tfile."); + } + if (analysisParams.getPlinkParams().containsKey("bfile")) { + // Prefix for the .bed, .bim and .fam files + throw new ToolException("Plink --bfile parameter not supported. Please, use --bed, --bim and --fam parameters instead of" + + " --bfile."); + } + if (analysisParams.getPlinkParams().containsKey("lfile")) { + // Prefix for the .lgen file + throw new ToolException("Plink --lfile parameter not supported. Please, use --lgen parameter instead of --lfile."); + } + if (analysisParams.getPlinkParams().containsKey("data")) { + // Prefix for the .gen, .bgen and .sample files + throw new ToolException("Plink --data parameter not supported. Please, use --gen, --bgen and --sample parameters instead" + + " of --data."); + } + + // Get files from catalog + FileManager fileManager = catalogManager.getFileManager(); Map updatedMap = new HashMap<>(); for (Map.Entry entry : analysisParams.getPlinkParams().entrySet()) { if (FILE_PARAM_NAMES.contains(entry.getKey())) { - switch (entry.getKey()) { - case "file": - case "tfile": - // Check .ped and .map files, (throw an exception if one of them does not exist) - AnalysisUtils.getCatalogFile(entry.getValue() + ".ped", study, fileManager, token); - AnalysisUtils.getCatalogFile(entry.getValue() + ".map", study, fileManager, token); - break; - case "bfile": - // Check .bed, .fam and .map files, (throw an exception if one of them does not exist) - AnalysisUtils.getCatalogFile(entry.getValue() + ".bed", study, fileManager, token); - AnalysisUtils.getCatalogFile(entry.getValue() + ".fam", study, fileManager, token); - AnalysisUtils.getCatalogFile(entry.getValue() + ".map", study, fileManager, token); - break; - default: - updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) - .getUri().getPath()); - } + updatedMap.put(entry.getKey(), AnalysisUtils.getCatalogFile(entry.getValue(), study, fileManager, token) + .getUri().getPath()); } } + + // Finally update Plink parameters if (MapUtils.isNotEmpty(updatedMap)) { analysisParams.getPlinkParams().putAll(updatedMap); } From 101b7f3d2250ee0d14629dee30b463247eb18db7 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 12 May 2021 15:20:02 +0200 Subject: [PATCH 306/412] analysis: add ch compound filters to aux collection, #1693 --- .../analysis/rga/AuxiliarRgaDataModel.java | 18 +- .../analysis/rga/IndividualRgaConverter.java | 190 +---------------- .../opencga/analysis/rga/RgaManager.java | 37 +++- .../opencga/analysis/rga/RgaQueryParser.java | 179 ++++++++++------ .../opencb/opencga/analysis/rga/RgaUtils.java | 197 ++++++++++++++++++ .../opencga/analysis/rga/RgaManagerTest.java | 13 +- .../src/main/resources/rga/aux-managed-schema | 1 + 7 files changed, 379 insertions(+), 256 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java index bbe8c581ecf..e6a090b2fd7 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/AuxiliarRgaDataModel.java @@ -36,6 +36,9 @@ public class AuxiliarRgaDataModel { @Field private List transcriptIds; + @Field + private List compoundFilters; + public static final String ID = "id"; public static final String DB_SNP = "dbSnp"; public static final String TYPE = "type"; @@ -46,6 +49,7 @@ public class AuxiliarRgaDataModel { public static final String GENE_IDS = "geneIds"; public static final String GENE_NAMES = "geneNames"; public static final String TRANSCRIPT_IDS = "transcriptIds"; + public static final String COMPOUND_FILTERS = "compoundFilters"; public static final Map MAIN_TO_AUXILIAR_DATA_MODEL_MAP; @@ -57,6 +61,7 @@ public class AuxiliarRgaDataModel { MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.KNOCKOUT.key(), KNOCKOUT_TYPES); MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.CONSEQUENCE_TYPE.key(), CONSEQUENCE_TYPES); MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.CLINICAL_SIGNIFICANCE.key(), CLINICAL_SIGNIFICANCES); + MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.POPULATION_FREQUENCY.key(), POPULATION_FREQUENCIES); MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.GENE_ID.key(), GENE_IDS); MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.GENE_NAME.key(), GENE_NAMES); MAIN_TO_AUXILIAR_DATA_MODEL_MAP.put(RgaQueryParams.TRANSCRIPT_ID.key(), TRANSCRIPT_IDS); @@ -67,7 +72,7 @@ public AuxiliarRgaDataModel() { public AuxiliarRgaDataModel(String id, String dbSnp, String type, List knockoutTypes, List consequenceTypes, Map populationFrequencies, List clinicalSignificances, List geneIds, - List geneNames, List transcriptIds) { + List geneNames, List transcriptIds, List compoundFilters) { this.id = id; this.dbSnp = dbSnp; this.type = type; @@ -78,6 +83,7 @@ public AuxiliarRgaDataModel(String id, String dbSnp, String type, List k this.geneIds = geneIds; this.geneNames = geneNames; this.transcriptIds = transcriptIds; + this.compoundFilters = compoundFilters; } @Override @@ -93,6 +99,7 @@ public String toString() { sb.append(", geneIds=").append(geneIds); sb.append(", geneNames=").append(geneNames); sb.append(", transcriptIds=").append(transcriptIds); + sb.append(", compoundFilters=").append(compoundFilters); sb.append('}'); return sb.toString(); } @@ -186,4 +193,13 @@ public AuxiliarRgaDataModel setTranscriptIds(List transcriptIds) { this.transcriptIds = transcriptIds; return this; } + + public List getCompoundFilters() { + return compoundFilters; + } + + public AuxiliarRgaDataModel setCompoundFilters(List compoundFilters) { + this.compoundFilters = compoundFilters; + return this; + } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index b24c9aa7d42..aec22bd9001 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -523,202 +523,16 @@ private List processFilters(KnockoutTranscript transcript) throws RgaExc compoundHeterozygousVariantList.add(independentTerms); } - results.addAll(generateCombinations(independentTerms)); + results.addAll(RgaUtils.generateCombinations(independentTerms)); } if (!compoundHeterozygousVariantList.isEmpty()) { - results.addAll(generateCompoundHeterozygousCombinations(compoundHeterozygousVariantList)); + results.addAll(RgaUtils.generateCompoundHeterozygousCombinations(compoundHeterozygousVariantList)); } return new ArrayList<>(results); } - private Set generateCompoundHeterozygousCombinations(List>> compoundHeterozygousVariantList) - throws RgaException { - if (compoundHeterozygousVariantList.size() < 2) { - return Collections.emptySet(); - } - Set result = new HashSet<>(); - for (int i = 0; i < compoundHeterozygousVariantList.size() - 1; i++) { - for (int j = i + 1; j < compoundHeterozygousVariantList.size(); j++) { - result.addAll(generateCompoundHeterozygousPairCombination(compoundHeterozygousVariantList.get(i), - compoundHeterozygousVariantList.get(j))); - } - } - return result; - } - - private Set generateCompoundHeterozygousPairCombination(List> variant1, List> variant2) - throws RgaException { - List> result = new LinkedList<>(); - /* Compound heterozygous combinations: - * KO - F1 - F2 - * KO - F1 - F2 - CT1 - CT2 - * KO - F1 - F2 - CT1 - CT2 - PF1 - PF2 - * KO - F1 - F2 - PF' ; where PF' is equivalent to the highest PF of both variants (to easily respond to PF<=x) - */ - String knockout = RgaUtils.encode(KnockoutVariant.KnockoutType.COMP_HET.name()); - result.add(Collections.singletonList(knockout)); - - // Generate combinations: KO - F1 - F2; KO - F1 - F2 - CT1 - CT2; KO - F1 - F2 - CT1 - CT2 - PF1 - PF2 - List> previousIteration = result; - for (int i = 1; i < 4; i++) { - // The list will contain all Filter, CT or PF combinations between variant1 and variant2 in a sorted manner to reduce the - // number of terms - List> sortedCombinations = generateSortedCombinations(variant1.get(i), variant2.get(i)); - - List> newResults = new ArrayList<>(previousIteration.size() * sortedCombinations.size()); - for (List previousValues : previousIteration) { - for (List values : sortedCombinations) { - List newValues = new ArrayList<>(previousValues); - newValues.addAll(values); - newResults.add(newValues); - } - } - if (i == 1) { - // Remove single Knockout string list because there is already a filter just for that field - result.clear(); - } - result.addAll(newResults); - previousIteration = newResults; - } - - // Generate also combination: KO - F1 - F2 - PF' ; where PF' is equivalent to the highest PF of both variants - List> sortedFilterList = generateSortedCombinations(variant1.get(1), variant2.get(1)); - List simplifiedPopFreqList = generateSimplifiedPopulationFrequencyList(variant1.get(3), variant2.get(3)); - for (List filterList : sortedFilterList) { - for (String popFreq : simplifiedPopFreqList) { - List terms = new LinkedList<>(); - terms.add(knockout); - terms.addAll(filterList); - terms.add(popFreq); - result.add(terms); - } - } - - Set combinations = new HashSet<>(); - for (List strings : result) { - combinations.add(StringUtils.join(strings, RgaUtils.SEPARATOR)); - } - - return combinations; - } - - /** - * Given two lists containing frequencies for the same populations, it will return a unified frequency for each population containing - * the least restrictive value. Example: [P1-12, P2-6] - [P1-15, P2-2] will generate [P1-15, P2-6] - * - * @param list1 List containing the population frequencies of variant1. - * @param list2 List containing the population frequencies of variant2. - * @return A list containing the least restrictive population frequencies. - * @throws RgaException If there is an issue with the provided lists. - */ - private List generateSimplifiedPopulationFrequencyList(List list1, List list2) throws RgaException { - if (list1.size() != list2.size()) { - throw new RgaException("Both lists should be the same size and contain the same population frequency values"); - } - - Map map1 = new HashMap<>(); - Map map2 = new HashMap<>(); - - for (String terms : list1) { - String[] split = terms.split("-"); - map1.put(split[0], Integer.parseInt(split[1])); - } - for (String terms : list2) { - String[] split = terms.split("-"); - map2.put(split[0], Integer.parseInt(split[1])); - } - - List terms = new ArrayList<>(list1.size()); - for (String popFreqKey : map1.keySet()) { - if (map1.get(popFreqKey) > map2.get(popFreqKey)) { - terms.add(popFreqKey + "-" + map1.get(popFreqKey)); - } else { - terms.add(popFreqKey + "-" + map2.get(popFreqKey)); - } - } - - return terms; - } - - /** - * Given two lists it will return a list containing all possible combinations, but sorted. For instance: - * [A, D, F] - [B, G] will return [[A, B], [A, G], [B, D], [D, G], [B, F], [F, G]] - * - * @param list1 List 1. - * @param list2 List 2. - * @return A list containing list1-list2 sorted pairwise combinations. - */ - public static List> generateSortedCombinations(List list1, List list2) { - List> results = new ArrayList<>(list1.size() * list2.size()); - for (String v1Term : list1) { - for (String v2Term : list2) { - if (StringUtils.compare(v1Term, v2Term) <= 0) { - results.add(Arrays.asList(v1Term, v2Term)); - } else { - results.add(Arrays.asList(v2Term, v1Term)); - } - } - } - - return results; - } - - /** - * Given a list of [[KO], [FILTER1, FILTER2], [CTs], [PFs]], it will return all possible String combinations merging those values. - * [KO - FILTER1, KO - FILTER2] - * [KO - FILTER1 - CT', KO - FILTER2 - CT'] - * [KO - FILTER1 - CT' - PF', KO - FILTER2 - CT' - PF'] - * [KO - FILTER1 - PF', KO - FILTER2 - PF'] - * @param values List of size 4 containing values for the 4 filters. - * @return a list containing all possible merge combinations to store in the DB. - */ - private List generateCombinations(List> values) { - if (values.isEmpty()) { - return Collections.emptyList(); - } - List> result = new LinkedList<>(); - for (String value : values.get(0)) { - result.add(Collections.singletonList(value)); - } - - // Generate combinations: KO - F; KO - F - CT; KO -F - CT - PF - List> previousIteration = result; - for (int i = 1; i < values.size(); i++) { - List> newResults = new ArrayList<>(previousIteration.size() * values.get(i).size()); - for (List previousValues : previousIteration) { - for (String currentValue : values.get(i)) { - List newValues = new ArrayList<>(previousValues); - newValues.add(currentValue); - newResults.add(newValues); - } - } - if (i == 1) { - // Remove single Knockout string list because there is already a filter just for that field - result.clear(); - } - result.addAll(newResults); - previousIteration = newResults; - } - - // Generate also combination: KO - F - PF (no consequence type this time) - for (String ko : values.get(0)) { - for (String filter : values.get(1)) { - for (String popFreq : values.get(3)) { - result.add(Arrays.asList(ko, filter, popFreq)); - } - } - } - - List combinations = new ArrayList<>(result.size()); - for (List strings : result) { - combinations.add(StringUtils.join(strings, RgaUtils.SEPARATOR)); - } - - return combinations; - } - private List populatePhenotypes(List phenotypes) { Set phenotypesIds = new HashSet<>(); if (phenotypes != null) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 5df8e71f8ea..2c6c85323ab 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -55,8 +55,7 @@ import java.util.concurrent.*; import java.util.stream.Collectors; -import static org.opencb.opencga.analysis.rga.RgaUtils.convertToKnockoutVariant; -import static org.opencb.opencga.analysis.rga.RgaUtils.decode; +import static org.opencb.opencga.analysis.rga.RgaUtils.*; import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; public class RgaManager implements AutoCloseable { @@ -312,6 +311,11 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri Set geneIds = new HashSet<>(); Set geneNames = new HashSet<>(); Set transcripts = new HashSet<>(); + Set compoundFilters = new HashSet<>(); + + String pfKey = RgaDataModel.POPULATION_FREQUENCIES.replace("*", ""); + String thousandGenomeKey = pfKey + RgaUtils.THOUSAND_GENOMES_STUDY; + String gnomadGenomeKey = pfKey + RgaUtils.GNOMAD_GENOMES_STUDY; // 3. Get allele pairs and CT from Variant summary QueryOptions knockoutTypeFacet = new QueryOptions() @@ -319,6 +323,7 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); DataResult facetFieldDataResult = rgaEngine.facetedQuery(mainCollection, query, knockoutTypeFacet); + List>> compHetVariantPairs = new LinkedList<>(); for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { CodedVariant codedVariant = CodedVariant.parseEncodedId(bucket.getValue()); if (variantId.equals(codedVariant.getId())) { @@ -331,13 +336,31 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri dbSnp = codedVariant.getDbSnp(); type = codedVariant.getType(); - String pfKey = RgaDataModel.POPULATION_FREQUENCIES.replace("*", ""); - String thousandGenomeKey = pfKey + RgaUtils.THOUSAND_GENOMES_STUDY; - String gnomadGenomeKey = pfKey + RgaUtils.GNOMAD_GENOMES_STUDY; - populationFrequencyMap.put(thousandGenomeKey, codedVariant.getThousandGenomesFrequency()); populationFrequencyMap.put(gnomadGenomeKey, codedVariant.getGnomadFrequency()); } + } else if (KnockoutVariant.KnockoutType.COMP_HET.name().equals(codedVariant.getKnockoutType())) { + // TODO: Assuming filter is PASS. We need to check that properly + compHetVariantPairs.add(Arrays.asList( + Collections.singletonList(codedVariant.getKnockoutType()), + Collections.singletonList(RgaUtils.encode(PASS)), // TODO: CHANGE !!!!! Take filter from codedVariant object + new ArrayList<>(codedVariant.getConsequenceType()), + codedVariant.getPopulationFrequencies())); + } + } + // Process all COMP_HET combinations + if (knockoutTypes.contains(KnockoutVariant.KnockoutType.COMP_HET.name())) { + // TODO: Assuming filter is PASS. We need to check that properly + List> currentVariantCompHetValues = Arrays.asList( + Collections.singletonList(KnockoutVariant.KnockoutType.COMP_HET.name()), + Collections.singletonList(RgaUtils.encode(PASS)), // TODO: CHANGE !!!!! Take filter from codedVariant object + new ArrayList<>(consequenceTypes), + Arrays.asList(populationFrequencyMap.get(thousandGenomeKey), populationFrequencyMap.get(gnomadGenomeKey))); + + // Generate combinations with current variant + for (List> otherCompoundHetVariant : compHetVariantPairs) { + compoundFilters.addAll(RgaUtils.generateCompoundHeterozygousCombinations( + Arrays.asList(currentVariantCompHetValues, otherCompoundHetVariant))); } } @@ -365,7 +388,7 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri return new AuxiliarRgaDataModel(variantId, dbSnp, type, new ArrayList<>(knockoutTypes), new ArrayList<>(consequenceTypes), populationFrequencyMap, new ArrayList<>(clinicalSignificances), - new ArrayList<>(geneIds), new ArrayList<>(geneNames), new ArrayList<>(transcripts)); + new ArrayList<>(geneIds), new ArrayList<>(geneNames), new ArrayList<>(transcripts), new ArrayList<>(compoundFilters)); } public OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List sampleIds, RgaIndex.Status status, diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java index e7094f04a09..9b61877cc64 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java @@ -57,7 +57,7 @@ public SolrQuery parseQuery(Query query) throws RgaException { // parseStringValue(finalQuery, TRANSCRIPT_BIOTYPE, RgaDataModel.TRANSCRIPT_BIOTYPE, filterList); parseStringValue(finalQuery, VARIANTS, RgaDataModel.VARIANTS, filterList); parseStringValue(finalQuery, DB_SNPS, RgaDataModel.DB_SNPS, filterList); - parseFilterValue(finalQuery, filterList); + parseMainCollCompoundFilters(finalQuery, filterList); // Create Solr query, adding filter queries and fields to show solrQuery.setQuery("*:*"); @@ -81,31 +81,16 @@ public SolrQuery parseAuxQuery(Query query) throws RgaException { Query finalQuery = new Query(query); fixQuery(finalQuery); - if (finalQuery.containsKey(CONSEQUENCE_TYPE.key())) { - List ctValues = getEncodedConsequenceTypes(finalQuery.getAsStringList(CONSEQUENCE_TYPE.key())); - finalQuery.put(CONSEQUENCE_TYPE.key(), ctValues); - } List filterList = new ArrayList<>(); parseStringValue(finalQuery, VARIANTS, AuxiliarRgaDataModel.ID, filterList); parseStringValue(finalQuery, DB_SNPS, AuxiliarRgaDataModel.DB_SNP, filterList); parseStringValue(finalQuery, TYPE, AuxiliarRgaDataModel.TYPE, filterList); - parseStringValue(finalQuery, KNOCKOUT, AuxiliarRgaDataModel.KNOCKOUT_TYPES, filterList); - parseStringValue(finalQuery, CONSEQUENCE_TYPE, AuxiliarRgaDataModel.CONSEQUENCE_TYPES, filterList); parseStringValue(finalQuery, CLINICAL_SIGNIFICANCE, AuxiliarRgaDataModel.CLINICAL_SIGNIFICANCES, filterList); parseStringValue(finalQuery, GENE_ID, AuxiliarRgaDataModel.GENE_IDS, filterList); parseStringValue(finalQuery, GENE_NAME, AuxiliarRgaDataModel.GENE_NAMES, filterList); parseStringValue(finalQuery, TRANSCRIPT_ID, AuxiliarRgaDataModel.TRANSCRIPT_IDS, filterList); - - List popFreqValues = query.getAsStringList(POPULATION_FREQUENCY.key(), ";"); - if (!popFreqValues.isEmpty()) { - Map> encodedPopFreqs = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); - - for (Map.Entry> entry : encodedPopFreqs.entrySet()) { - parseStringValue(entry.getValue(), - AuxiliarRgaDataModel.POPULATION_FREQUENCIES.replace("*", entry.getKey()), filterList, "||"); - } - } + parseAuxCollCompoundFilters(finalQuery, filterList); // Create Solr query, adding filter queries and fields to show solrQuery.setQuery("*:*"); @@ -117,6 +102,74 @@ public SolrQuery parseAuxQuery(Query query) throws RgaException { return solrQuery; } + private void parseMainCollCompoundFilters(Query query, List filterList) throws RgaException { + List knockoutValues = query.getAsStringList(KNOCKOUT.key()); + String filterValue = query.getString(FILTER.key()); + List ctValues = query.getAsStringList(CONSEQUENCE_TYPE.key()); + List popFreqValues = query.getAsStringList(POPULATION_FREQUENCY.key(), ";"); + + int count = 0; + count += knockoutValues.isEmpty() ? 0 : 1; + count += StringUtils.isEmpty(filterValue) ? 0 : 1; + count += ctValues.isEmpty() ? 0 : 1; + count += popFreqValues.isEmpty() ? 0 : 1; + + if (count == 1) { + // Simple filter + parseStringValue(query, KNOCKOUT, RgaDataModel.KNOCKOUT_TYPES, filterList); + parseStringValue(query, FILTER, RgaDataModel.FILTERS, filterList); + parseStringValue(query, CONSEQUENCE_TYPE, RgaDataModel.CONSEQUENCE_TYPES, filterList); + + if (!popFreqValues.isEmpty()) { + Map> encodedPopFreqs = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); + + for (Map.Entry> entry : encodedPopFreqs.entrySet()) { + parseStringValue(entry.getValue(), RgaDataModel.POPULATION_FREQUENCIES.replace("*", entry.getKey()), filterList, "||"); + } + } + } else { + parseCompoundFilters(knockoutValues, filterValue, ctValues, popFreqValues, filterList); + } + } + + private void parseAuxCollCompoundFilters(Query query, List filterList) throws RgaException { + List knockoutValues = query.getAsStringList(KNOCKOUT.key()); +// String filterValue = query.getString(FILTER.key()); + List ctValues = query.getAsStringList(CONSEQUENCE_TYPE.key()); + List popFreqValues = query.getAsStringList(POPULATION_FREQUENCY.key(), ";"); + + int count = 0; + count += knockoutValues.isEmpty() ? 0 : 1; +// count += StringUtils.isEmpty(filterValue) ? 0 : 1; + count += ctValues.isEmpty() ? 0 : 1; + count += popFreqValues.isEmpty() ? 0 : 1; + + // In this case, we may need to use both filters if users are filtering by COMP_HET and another ko type + (ct | pf) + boolean simpleFilter = !knockoutValues.contains(COMP_HET.name()) || count == 1; + boolean complexFilter = knockoutValues.contains(COMP_HET.name()) && count > 1; + + if (simpleFilter) { + // Simple filters + if (!ctValues.isEmpty()) { + List encodedCtValues = getEncodedConsequenceTypes(ctValues); + query.put(CONSEQUENCE_TYPE.key(), encodedCtValues); + } + + parseStringValue(query, KNOCKOUT, AuxiliarRgaDataModel.KNOCKOUT_TYPES, filterList); + parseStringValue(query, CONSEQUENCE_TYPE, AuxiliarRgaDataModel.CONSEQUENCE_TYPES, filterList); + if (!popFreqValues.isEmpty()) { + Map> encodedPopFreqs = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); + for (Map.Entry> entry : encodedPopFreqs.entrySet()) { + parseStringValue(entry.getValue(), + AuxiliarRgaDataModel.POPULATION_FREQUENCIES.replace("*", entry.getKey()), filterList, "||"); + } + } + } + if (complexFilter) { + parseCompoundFilters(knockoutValues, "", ctValues, popFreqValues, filterList); + } + } + private void fixQuery(Query query) { if (query.containsKey(CONSEQUENCE_TYPE.key())) { // Convert CONSEQUENCE TYPES to full SO Terms so they can be successfully processed @@ -146,39 +199,14 @@ private void fixQuery(Query query) { } } - private void parseFilterValue(Query query, List filterList) throws RgaException { - List knockoutValues = query.getAsStringList(KNOCKOUT.key()); - String filterValue = query.getString(FILTER.key()); - List ctValues = query.getAsStringList(CONSEQUENCE_TYPE.key()); - List popFreqValues = query.getAsStringList(POPULATION_FREQUENCY.key(), ";"); - - int count = 0; - count += knockoutValues.isEmpty() ? 0 : 1; - count += StringUtils.isEmpty(filterValue) ? 0 : 1; - count += ctValues.isEmpty() ? 0 : 1; - count += popFreqValues.isEmpty() ? 0 : 1; - - if (count == 1) { - // Simple filter - parseStringValue(query, KNOCKOUT, RgaDataModel.KNOCKOUT_TYPES, filterList); - parseStringValue(query, FILTER, RgaDataModel.FILTERS, filterList); - parseStringValue(query, CONSEQUENCE_TYPE, RgaDataModel.CONSEQUENCE_TYPES, filterList); - - if (!popFreqValues.isEmpty()) { - Map> encodedPopFreqs = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); - - for (Map.Entry> entry : encodedPopFreqs.entrySet()) { - parseStringValue(entry.getValue(), RgaDataModel.POPULATION_FREQUENCIES.replace("*", entry.getKey()), filterList, "||"); - } - } - } else if (count > 1) { - if (knockoutValues.size() == 1 && KnockoutVariant.KnockoutType.COMP_HET.name().equals(knockoutValues.get(0).toUpperCase())) { - // COMP_HET complex filter - buildCompHetComplexQueryFilter(filterList, filterValue, ctValues, popFreqValues); - } else { - // Complex filter - buildComplexQueryFilter(filterList, knockoutValues, filterValue, ctValues, popFreqValues); - } + private void parseCompoundFilters(List knockoutValues, String filterValue, List ctValues, List popFreqValues, + List filterList) throws RgaException { + if (knockoutValues.size() == 1 && KnockoutVariant.KnockoutType.COMP_HET.name().equals(knockoutValues.get(0).toUpperCase())) { + // COMP_HET complex filter + buildCompHetComplexQueryFilter(filterList, filterValue, ctValues, popFreqValues); + } else { + // Complex filter + buildComplexQueryFilter(filterList, knockoutValues, filterValue, ctValues, popFreqValues); } } @@ -270,18 +298,36 @@ private void buildComplexQuery(List koValues, List filterValues, } else if (!ctValues.isEmpty() && !popFreqQueryList.isEmpty()) { // KT + FILTER + CT + POP_FREQ List andQueryList = new ArrayList<>(popFreqQueryList.size()); - for (List tmpPopFreqList : popFreqQueryList.values()) { - List orQueryList = new LinkedList<>(); - for (String popFreq : tmpPopFreqList) { + if (popFreqQueryList.size() == 2) { + ArrayList popFreqKeys = new ArrayList<>(popFreqQueryList.keySet()); + List> sortedPopFreqs = RgaUtils.generateSortedCombinations(popFreqQueryList.get(popFreqKeys.get(0)), + popFreqQueryList.get(popFreqKeys.get(1))); + for (List sortedPopFreq : sortedPopFreqs) { + List orQueryList = new LinkedList<>(); for (String koValue : koValues) { for (String filterVal : filterValues) { for (String ctValue : ctValues) { - orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + ctValue + SEPARATOR + popFreq); + orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + ctValue + SEPARATOR + sortedPopFreq.get(0) + + SEPARATOR + sortedPopFreq.get(1)); } } } + parseStringValue(orQueryList, "", andQueryList, "||"); + } + } else { + for (List tmpPopFreqList : popFreqQueryList.values()) { + List orQueryList = new LinkedList<>(); + for (String popFreq : tmpPopFreqList) { + for (String koValue : koValues) { + for (String filterVal : filterValues) { + for (String ctValue : ctValues) { + orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + ctValue + SEPARATOR + popFreq); + } + } + } + } + parseStringValue(orQueryList, "", andQueryList, "||"); } - parseStringValue(orQueryList, "", andQueryList, "||"); } parseStringValue(andQueryList, RgaDataModel.COMPOUND_FILTERS, filterList, "&&"); } else if (!ctValues.isEmpty()) { @@ -298,16 +344,33 @@ private void buildComplexQuery(List koValues, List filterValues, } else { // POP_FREQ not empty // KT + FILTER + POP_FREQ List andQueryList = new ArrayList<>(popFreqQueryList.size()); - for (List tmpPopFreqList : popFreqQueryList.values()) { + if (popFreqQueryList.size() == 2) { + ArrayList popFreqKeys = new ArrayList<>(popFreqQueryList.keySet()); + List> sortedPopFreqs = RgaUtils.generateSortedCombinations(popFreqQueryList.get(popFreqKeys.get(0)), + popFreqQueryList.get(popFreqKeys.get(1))); List orQueryList = new LinkedList<>(); - for (String popFreq : tmpPopFreqList) { + for (List sortedPopFreq : sortedPopFreqs) { for (String koValue : koValues) { for (String filterVal : filterValues) { - orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + popFreq); + orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + sortedPopFreq.get(0) + SEPARATOR + + sortedPopFreq.get(1)); + } } } parseStringValue(orQueryList, "", andQueryList, "||"); + } else { + for (List tmpPopFreqList : popFreqQueryList.values()) { + List orQueryList = new LinkedList<>(); + for (String popFreq : tmpPopFreqList) { + for (String koValue : koValues) { + for (String filterVal : filterValues) { + orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + popFreq); + } + } + } + parseStringValue(orQueryList, "", andQueryList, "||"); + } } parseStringValue(andQueryList, RgaDataModel.COMPOUND_FILTERS, filterList, "&&"); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index 4aea2be8805..fb5fd9f8f98 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -264,6 +264,203 @@ static KeyOpValue parseKeyOpValue(String value) { } } + public static Set generateCompoundHeterozygousCombinations(List>> compoundHeterozygousVariantList) + throws RgaException { + if (compoundHeterozygousVariantList.size() < 2) { + return Collections.emptySet(); + } + Set result = new HashSet<>(); + for (int i = 0; i < compoundHeterozygousVariantList.size() - 1; i++) { + for (int j = i + 1; j < compoundHeterozygousVariantList.size(); j++) { + result.addAll(generateCompoundHeterozygousPairCombination(compoundHeterozygousVariantList.get(i), + compoundHeterozygousVariantList.get(j))); + } + } + return result; + } + + public static Set generateCompoundHeterozygousPairCombination(List> variant1, List> variant2) + throws RgaException { + List> result = new LinkedList<>(); + /* Compound heterozygous combinations: + * KO - F1 - F2 + * KO - F1 - F2 - CT1 - CT2 + * KO - F1 - F2 - CT1 - CT2 - PF1 - PF2 + * KO - F1 - F2 - PF1 - PF2 + * KO - F1 - F2 - PF' ; where PF' is equivalent to the highest PF of both variants (to easily respond to PF<=x) + */ + String knockout = RgaUtils.encode(KnockoutVariant.KnockoutType.COMP_HET.name()); + result.add(Collections.singletonList(knockout)); + + // Generate combinations: KO - F1 - F2; KO - F1 - F2 - CT1 - CT2; KO - F1 - F2 - CT1 - CT2 - PF1 - PF2; KO - F1 - F2 - PF1 - PF2 + List> previousIteration = result; + for (int i = 1; i < 4; i++) { + // The list will contain all Filter, CT or PF combinations between variant1 and variant2 in a sorted manner to reduce the + // number of terms + List> sortedCombinations = generateSortedCombinations(variant1.get(i), variant2.get(i)); + + List> newResults = new ArrayList<>(previousIteration.size() * sortedCombinations.size()); + for (List previousValues : previousIteration) { + for (List values : sortedCombinations) { + List newValues = new ArrayList<>(previousValues); + newValues.addAll(values); + newResults.add(newValues); + } + } + if (i == 1) { + // Remove single Knockout string list because there is already a filter just for that field + result.clear(); + } else if (i == 2) { + // Generate this particular combination KO - F1 - F2 - PF1 - PF2 + List> sortedPfCombinations = generateSortedCombinations(variant1.get(3), variant2.get(3)); + for (List previousValues : previousIteration) { + for (List values : sortedPfCombinations) { + List newValues = new ArrayList<>(previousValues); + newValues.addAll(values); + result.add(newValues); + } + } + } + result.addAll(newResults); + previousIteration = newResults; + } + + // Generate also combination: KO - F1 - F2 - PF' ; where PF' is equivalent to the highest PF of both variants + List> sortedFilterList = generateSortedCombinations(variant1.get(1), variant2.get(1)); + List simplifiedPopFreqList = generateSimplifiedPopulationFrequencyList(variant1.get(3), variant2.get(3)); + for (List filterList : sortedFilterList) { + for (String popFreq : simplifiedPopFreqList) { + List terms = new LinkedList<>(); + terms.add(knockout); + terms.addAll(filterList); + terms.add(popFreq); + result.add(terms); + } + } + + Set combinations = new HashSet<>(); + for (List strings : result) { + combinations.add(StringUtils.join(strings, RgaUtils.SEPARATOR)); + } + + return combinations; + } + + /** + * Given a list of [[KO], [FILTER1, FILTER2], [CTs], [PFs]], it will return all possible String combinations merging those values. + * [KO - FILTER1, KO - FILTER2] + * [KO - FILTER1 - CT', KO - FILTER2 - CT'] + * [KO - FILTER1 - CT' - PF', KO - FILTER2 - CT' - PF'] + * [KO - FILTER1 - PF', KO - FILTER2 - PF'] + * @param values List of size 4 containing values for the 4 filters. + * @return a list containing all possible merge combinations to store in the DB. + */ + public static List generateCombinations(List> values) { + if (values.isEmpty()) { + return Collections.emptyList(); + } + List> result = new LinkedList<>(); + for (String value : values.get(0)) { + result.add(Collections.singletonList(value)); + } + + // Generate combinations: KO - F; KO - F - CT; KO -F - CT - PF + List> previousIteration = result; + for (int i = 1; i < values.size(); i++) { + List> newResults = new ArrayList<>(previousIteration.size() * values.get(i).size()); + for (List previousValues : previousIteration) { + for (String currentValue : values.get(i)) { + List newValues = new ArrayList<>(previousValues); + newValues.add(currentValue); + newResults.add(newValues); + } + } + if (i == 1) { + // Remove single Knockout string list because there is already a filter just for that field + result.clear(); + } + result.addAll(newResults); + previousIteration = newResults; + } + + // Generate also combination: KO - F - PF (no consequence type this time) + for (String ko : values.get(0)) { + for (String filter : values.get(1)) { + for (String popFreq : values.get(3)) { + result.add(Arrays.asList(ko, filter, popFreq)); + } + } + } + + List combinations = new ArrayList<>(result.size()); + for (List strings : result) { + combinations.add(StringUtils.join(strings, RgaUtils.SEPARATOR)); + } + + return combinations; + } + + /** + * Given two lists it will return a list containing all possible combinations, but sorted. For instance: + * [A, D, F] - [B, G] will return [[A, B], [A, G], [B, D], [D, G], [B, F], [F, G]] + * + * @param list1 List 1. + * @param list2 List 2. + * @return A list containing list1-list2 sorted pairwise combinations. + */ + public static List> generateSortedCombinations(List list1, List list2) { + List> results = new ArrayList<>(list1.size() * list2.size()); + for (String v1Term : list1) { + for (String v2Term : list2) { + if (StringUtils.compare(v1Term, v2Term) <= 0) { + results.add(Arrays.asList(v1Term, v2Term)); + } else { + results.add(Arrays.asList(v2Term, v1Term)); + } + } + } + + return results; + } + + /** + * Given two lists containing frequencies for the same populations, it will return a unified frequency for each population containing + * the least restrictive value. Example: [P1-12, P2-6] - [P1-15, P2-2] will generate [P1-15, P2-6] + * + * @param list1 List containing the population frequencies of variant1. + * @param list2 List containing the population frequencies of variant2. + * @return A list containing the least restrictive population frequencies. + * @throws RgaException If there is an issue with the provided lists. + */ + private static List generateSimplifiedPopulationFrequencyList(List list1, List list2) throws RgaException { + if (list1.size() != list2.size()) { + throw new RgaException("Both lists should be the same size and contain the same population frequency values"); + } + + Map map1 = new HashMap<>(); + Map map2 = new HashMap<>(); + + for (String terms : list1) { + String[] split = terms.split("-"); + map1.put(split[0], Integer.parseInt(split[1])); + } + for (String terms : list2) { + String[] split = terms.split("-"); + map2.put(split[0], Integer.parseInt(split[1])); + } + + List terms = new ArrayList<>(list1.size()); + for (String popFreqKey : map1.keySet()) { + if (map1.get(popFreqKey) > map2.get(popFreqKey)) { + terms.add(popFreqKey + "-" + map1.get(popFreqKey)); + } else { + terms.add(popFreqKey + "-" + map2.get(popFreqKey)); + } + } + + return terms; + } + /** * Extract complete list of KnockoutVariants for current RgaDataModel document. * diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index cc16beef397..2b192b2a180 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -611,7 +611,16 @@ public void testVariantSummary() throws CatalogException, IOException, RgaExcept assertEquals("stop_gained", variant.getSequenceOntologyTerms().get(0).getName()); } - + Query query = new Query() + .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET) + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;"); + result = rgaManager.variantSummary(STUDY, query, QueryOptions.empty(), ownerToken); + assertEquals(0, result.getNumResults()); + + query = new Query() + .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET) + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<=0.0001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">0.05;"); + result = rgaManager.variantSummary(STUDY, query, QueryOptions.empty(), ownerToken); + assertEquals(2, result.getNumResults()); } - } \ No newline at end of file diff --git a/opencga-clinical/src/main/resources/rga/aux-managed-schema b/opencga-clinical/src/main/resources/rga/aux-managed-schema index 8e5038ba708..cade6db2085 100644 --- a/opencga-clinical/src/main/resources/rga/aux-managed-schema +++ b/opencga-clinical/src/main/resources/rga/aux-managed-schema @@ -576,6 +576,7 @@ + From 18f11d4ad23142fc3ccc139b046b51c1ea030a1d Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 12 May 2021 17:22:29 +0200 Subject: [PATCH 307/412] analysis: get variant information in individual query --- .../analysis/rga/IndividualRgaConverter.java | 9 ++++-- .../opencga/analysis/rga/RgaManager.java | 14 +++++++-- .../opencga/analysis/rga/RgaManagerTest.java | 31 +++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index b24c9aa7d42..72d7a36affd 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -15,6 +15,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; +import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.slf4j.LoggerFactory; import java.util.*; @@ -77,12 +78,16 @@ public class IndividualRgaConverter extends AbstractRgaConverter { public IndividualRgaConverter() { } - public List convertToDataModelType(RgaIterator rgaIterator) { + public List convertToDataModelType(RgaIterator rgaIterator, VariantDBIterator variantDBIterator) { // In this list, we will store the keys of result in the order they have been processed so order is kept List knockoutByIndividualOrder = new LinkedList<>(); Map result = new HashMap<>(); - Map variantMap = Collections.emptyMap(); + Map variantMap = new HashMap<>(); + while (variantDBIterator.hasNext()) { + Variant variant = variantDBIterator.next(); + variantMap.put(variant.getId(), variant); + } while (rgaIterator.hasNext()) { RgaDataModel rgaDataModel = rgaIterator.next(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 5df8e71f8ea..f8ef7a630dc 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -485,9 +485,19 @@ public OpenCGAResult individualQuery(String studyStr, Quer throw e; } + VariantDBIterator variantDBIterator = VariantDBIterator.EMPTY_ITERATOR; + if (query.containsKey(RgaQueryParams.VARIANTS.key())) { + try { + variantDBIterator = variantStorageQuery(studyStr, preprocess.getQuery().getAsStringList(RgaQueryParams.SAMPLE_ID.key()), + preprocess.getQuery(), QueryOptions.empty(), token); + } catch (StorageEngineException e) { + throw new RgaException("Could not fetch variant information: " + e.getMessage(), e); + } + } + RgaIterator rgaIterator = rgaEngine.individualQuery(collection, preprocess.getQuery(), QueryOptions.empty()); - List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(rgaIterator); + List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(rgaIterator, variantDBIterator); if (!preprocess.isOwnerOrAdmin) { // Extract all parent sample ids @@ -1580,7 +1590,7 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti sampleIds = authorisedSamples.subList(skip, to); } } - preprocessResult.getQuery().put("sampleId", sampleIds); + preprocessResult.getQuery().put(RgaQueryParams.SAMPLE_ID.key(), sampleIds); return preprocessResult; } diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java index cc16beef397..43e0c6e894e 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/rga/RgaManagerTest.java @@ -233,6 +233,37 @@ public void testIndividualQueryLimit() throws CatalogException, IOException, Rga assertEquals(1, result.getNumResults()); } + @Test + public void testIndividualQuery() throws CatalogException, IOException, RgaException { + OpenCGAResult result = rgaManager.individualQuery(STUDY, + new Query(RgaQueryParams.INDIVIDUAL_ID.key(), "NA19685,NA19600").append(RgaQueryParams.SEX.key(), "MALE"), + QueryOptions.empty(), ownerToken); + assertEquals(1, result.getNumResults()); + for (KnockoutByIndividual.KnockoutGene gene : result.first().getGenes()) { + for (KnockoutTranscript transcript : gene.getTranscripts()) { + for (KnockoutVariant variant : transcript.getVariants()) { + assertNull(variant.getQual()); + assertNull(variant.getGenotype()); + assertNull(variant.getFilter()); + } + } + } + + result = rgaManager.individualQuery(STUDY, new Query() + .append(RgaQueryParams.INDIVIDUAL_ID.key(), "NA19685,NA19600") + .append(RgaQueryParams.VARIANTS.key(), "12:56335107:A:G"), + QueryOptions.empty(), ownerToken); + for (KnockoutByIndividual.KnockoutGene gene : result.first().getGenes()) { + for (KnockoutTranscript transcript : gene.getTranscripts()) { + for (KnockoutVariant variant : transcript.getVariants()) { + assertNotNull(variant.getQual()); + assertNotNull(variant.getGenotype()); + assertNotNull(variant.getFilter()); + } + } + } + } + @Test public void testIndividualSummary() throws CatalogException, IOException, RgaException { OpenCGAResult result = rgaManager.individualSummary(STUDY, new Query(), QueryOptions.empty(), ownerToken); From 4185cda0cd63f157e1f3fe1ea9fbd8b0e261f96c Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 13 May 2021 10:23:55 +0200 Subject: [PATCH 308/412] catalog: remove symbol restriction in ids. - Ids can now have repeated . - _ symbols --- .../managers/ClinicalAnalysisManager.java | 4 +- .../catalog/managers/CohortManager.java | 2 + .../catalog/managers/FamilyManager.java | 4 +- .../catalog/managers/IndividualManager.java | 4 +- .../managers/InterpretationManager.java | 4 +- .../opencga/catalog/managers/JobManager.java | 2 +- .../catalog/managers/PanelManager.java | 4 +- .../catalog/managers/ProjectManager.java | 2 +- .../catalog/managers/SampleManager.java | 4 +- .../catalog/managers/StudyManager.java | 4 +- .../opencga/catalog/utils/ParamUtils.java | 6 +- .../catalog/managers/SampleManagerTest.java | 91 +++++++++++++++++++ 12 files changed, 112 insertions(+), 19 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java index 9362882d2ee..40743555345 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java @@ -238,7 +238,7 @@ public OpenCGAResult create(String studyStr, ClinicalAnalysis options = ParamUtils.defaultObject(options, QueryOptions::new); ParamUtils.checkObj(clinicalAnalysis, "clinicalAnalysis"); - ParamUtils.checkAlias(clinicalAnalysis.getId(), "id"); + ParamUtils.checkIdentifier(clinicalAnalysis.getId(), "id"); ParamUtils.checkObj(clinicalAnalysis.getType(), "type"); ParamUtils.checkObj(clinicalAnalysis.getProband(), "proband"); @@ -1155,7 +1155,7 @@ private OpenCGAResult update(Study study, ClinicalAnalysis cli Map actionMap = options.getMap(Constants.ACTIONS); if (StringUtils.isNotEmpty(updateParams.getId())) { - ParamUtils.checkAlias(updateParams.getId(), "id"); + ParamUtils.checkIdentifier(updateParams.getId(), "id"); } if (StringUtils.isNotEmpty(updateParams.getDueDate()) && TimeUtils.toDate(updateParams.getDueDate()) == null) { throw new CatalogException("Unrecognised due date. Accepted format is: yyyyMMddHHmmss"); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java index e9a47d0df68..8852e6e8376 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CohortManager.java @@ -175,6 +175,8 @@ public OpenCGAResult create(String studyStr, CohortCreateParams cohortPa throw new CatalogParameterException("Can only create a cohort given list of sampleIds or a categorical variable name"); } + ParamUtils.checkIdentifier(cohortParams.getId(), "id"); + if (CollectionUtils.isNotEmpty(cohortParams.getSamples())) { List sampleList = catalogManager.getSampleManager().internalGet(study.getUid(), cohortParams.getSamples(), SampleManager.INCLUDE_SAMPLE_IDS, userId, false).getResults(); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java index 5fa7ca4c4fe..991878e44f6 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java @@ -203,7 +203,7 @@ public OpenCGAResult create(String studyStr, Family family, List authorizationManager.checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.WRITE_FAMILIES); ParamUtils.checkObj(family, "family"); - ParamUtils.checkAlias(family.getId(), "id"); + ParamUtils.checkIdentifier(family.getId(), "id"); family.setName(ParamUtils.defaultObject(family.getName(), family.getId())); family.setMembers(ParamUtils.defaultObject(family.getMembers(), Collections.emptyList())); family.setPhenotypes(ParamUtils.defaultObject(family.getPhenotypes(), Collections.emptyList())); @@ -912,7 +912,7 @@ private OpenCGAResult update(Study study, Family family, FamilyUpdatePar } if (updateParams != null && StringUtils.isNotEmpty(updateParams.getId())) { - ParamUtils.checkAlias(updateParams.getId(), FamilyDBAdaptor.QueryParams.ID.key()); + ParamUtils.checkIdentifier(updateParams.getId(), FamilyDBAdaptor.QueryParams.ID.key()); } boolean updateRoles = options.getBoolean(ParamConstants.FAMILY_UPDATE_ROLES_PARAM); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java index 550d86c2edb..1419d257bb1 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java @@ -204,7 +204,7 @@ private OpenCGAResult getIndividual(long studyUid, String individual void validateNewIndividual(Study study, Individual individual, List samples, String userId, boolean linkParents) throws CatalogException { - ParamUtils.checkAlias(individual.getId(), "id"); + ParamUtils.checkIdentifier(individual.getId(), "id"); individual.setName(StringUtils.isEmpty(individual.getName()) ? individual.getId() : individual.getName()); individual.setLocation(ParamUtils.defaultObject(individual.getLocation(), Location::new)); individual.setEthnicity(ParamUtils.defaultObject(individual.getEthnicity(), "")); @@ -1315,7 +1315,7 @@ private OpenCGAResult update(Study study, Individual individual, IndividualUpdat } if (updateParams != null && StringUtils.isNotEmpty(updateParams.getId())) { - ParamUtils.checkAlias(updateParams.getId(), "id"); + ParamUtils.checkIdentifier(updateParams.getId(), "id"); Query query = new Query() .append(IndividualDBAdaptor.QueryParams.STUDY_UID.key(), studyUid) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java index 56c6c49073b..d4150ed24cc 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java @@ -246,7 +246,7 @@ void validateNewInterpretation(Study study, Interpretation interpretation, Clini ParamUtils.checkObj(interpretation, "Interpretation"); ParamUtils.checkParameter(clinicalAnalysis.getId(), "ClinicalAnalysisId"); - ParamUtils.checkAlias(interpretation.getId(), "id"); + ParamUtils.checkIdentifier(interpretation.getId(), "id"); interpretation.setClinicalAnalysisId(clinicalAnalysis.getId()); @@ -926,7 +926,7 @@ private OpenCGAResult update(Study study, Interpretation interpretation, Interpr } if (parameters.containsKey(InterpretationDBAdaptor.QueryParams.ID.key())) { - ParamUtils.checkAlias(parameters.getString(InterpretationDBAdaptor.QueryParams.ID.key()), + ParamUtils.checkIdentifier(parameters.getString(InterpretationDBAdaptor.QueryParams.ID.key()), InterpretationDBAdaptor.QueryParams.ID.key()); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java index 5bb5b56ab14..ff8b2f59eeb 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java @@ -251,7 +251,7 @@ public OpenCGAResult create(String studyStr, Job job, QueryOptions options, authorizationManager.checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.WRITE_JOBS); ParamUtils.checkObj(job, "Job"); - ParamUtils.checkAlias(job.getId(), "job id"); + ParamUtils.checkIdentifier(job.getId(), "job id"); job.setDescription(ParamUtils.defaultString(job.getDescription(), "")); job.setCommandLine(ParamUtils.defaultString(job.getCommandLine(), "")); job.setCreationDate(ParamUtils.defaultString(job.getCreationDate(), TimeUtils.getTime())); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java index 70ff22f13cf..29d5330f574 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/PanelManager.java @@ -159,7 +159,7 @@ public OpenCGAResult create(String studyStr, Panel panel, QueryOptions op authorizationManager.checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.WRITE_PANELS); // Check all the panel fields - ParamUtils.checkAlias(panel.getId(), "id"); + ParamUtils.checkIdentifier(panel.getId(), "id"); panel.setName(ParamUtils.defaultString(panel.getName(), panel.getId())); panel.setRelease(studyManager.getCurrentRelease(study)); panel.setVersion(1); @@ -529,7 +529,7 @@ private OpenCGAResult update(Study study, Panel panel, PanelUpdateParams updateP authorizationManager.checkPanelPermission(study.getUid(), panel.getUid(), userId, PanelAclEntry.PanelPermissions.WRITE); if (parameters.containsKey(PanelDBAdaptor.QueryParams.ID.key())) { - ParamUtils.checkAlias(parameters.getString(PanelDBAdaptor.QueryParams.ID.key()), + ParamUtils.checkIdentifier(parameters.getString(PanelDBAdaptor.QueryParams.ID.key()), PanelDBAdaptor.QueryParams.ID.key()); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java index fff3cc80173..ba6dc21b777 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java @@ -464,7 +464,7 @@ public OpenCGAResult update(String projectId, ObjectMap parameters, Que } if (parameters.containsKey(ProjectDBAdaptor.QueryParams.ID.key())) { - ParamUtils.checkAlias(parameters.getString(ProjectDBAdaptor.QueryParams.ID.key()), "id"); + ParamUtils.checkIdentifier(parameters.getString(ProjectDBAdaptor.QueryParams.ID.key()), "id"); } OpenCGAResult result = projectDBAdaptor.update(projectUid, parameters, QueryOptions.empty()); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java index 65ab325c54b..51a11815133 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java @@ -151,7 +151,7 @@ private OpenCGAResult getSample(long studyUid, String sampleUuid, QueryO } void validateNewSample(Study study, Sample sample, String userId) throws CatalogException { - ParamUtils.checkAlias(sample.getId(), "id"); + ParamUtils.checkIdentifier(sample.getId(), "id"); // Check the id is not in use Query query = new Query() @@ -1032,7 +1032,7 @@ private OpenCGAResult update(Study study, Sample sample, SampleUpdateParams upda } if (updateParams != null && StringUtils.isNotEmpty(updateParams.getId())) { - ParamUtils.checkAlias(updateParams.getId(), SampleDBAdaptor.QueryParams.ID.key()); + ParamUtils.checkIdentifier(updateParams.getId(), SampleDBAdaptor.QueryParams.ID.key()); } if (updateParams != null && StringUtils.isNotEmpty(updateParams.getIndividualId())) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java index b973bcf7301..39b498941b3 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java @@ -254,7 +254,7 @@ public OpenCGAResult create(String projectStr, String id, String alias, S Map attributes, QueryOptions options, String token) throws CatalogException { ParamUtils.checkParameter(name, "name"); ParamUtils.checkParameter(id, "id"); - ParamUtils.checkAlias(id, "id"); + ParamUtils.checkIdentifier(id, "id"); String userId = catalogManager.getUserManager().getUserId(token); Project project = catalogManager.getProjectManager().resolveId(projectStr, userId); @@ -596,7 +596,7 @@ public OpenCGAResult update(String studyId, StudyUpdateParams parameters, authorizationManager.checkCanEditStudy(study.getUid(), userId); if (StringUtils.isNotEmpty(parameters.getAlias())) { - ParamUtils.checkAlias(parameters.getAlias(), "alias"); + ParamUtils.checkIdentifier(parameters.getAlias(), "alias"); } ObjectMap update; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java index 924d38d617c..da6ae0fb58a 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java @@ -123,16 +123,16 @@ public static void checkValidUserId(String userId) throws CatalogParameterExcept public static void checkAlias(String alias, String name) throws CatalogParameterException { if (alias == null || alias.isEmpty()) { - throw new CatalogParameterException("Missing id."); + throw new CatalogParameterException("Missing " + name); } if (!alias.matches("^[A-Za-z0-9]([-_.]?[A-Za-z0-9])*$")) { - throw new CatalogParameterException("Invalid id for '" + name + "'. Alias needs to start by any character " + throw new CatalogParameterException("Invalid " + name + ". It needs to start by any character " + "or number and might contain single '-', '_', '.', symbols followed by any character or number."); } } public static void checkIdentifier(String identifier, String name) throws CatalogParameterException { - if (identifier == null || identifier.isEmpty() || !identifier.matches("^[A-Za-z]([-_.]?[A-Za-z0-9])*$")) { + if (identifier == null || identifier.isEmpty() || !identifier.matches("^[A-Za-z][A-Za-z0-9-_.]*[A-Za-z0-9]$")) { throw new CatalogParameterException("Error in identifier: Invalid identifier format for '" + name + "'."); } } diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java index 57b3c6ee234..87d5bec380e 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java @@ -162,6 +162,97 @@ public void testSampleVersioning() throws CatalogException { assertEquals(4, testSample.getResults().size()); } + @Test + public void testSampleVersioningWithWeirdId() throws CatalogException { + Query query = new Query(ProjectDBAdaptor.QueryParams.USER_ID.key(), "user"); + String projectId = catalogManager.getProjectManager().get(query, null, token).first().getId(); + + String sampleId = "test__Sa..mp--le"; + + catalogManager.getSampleManager().create(studyFqn, + new Sample().setId(sampleId).setDescription("description"), null, token); + catalogManager.getSampleManager().update(studyFqn, sampleId, new SampleUpdateParams(), + new QueryOptions(Constants.INCREMENT_VERSION, true), token); + catalogManager.getSampleManager().update(studyFqn, sampleId, new SampleUpdateParams(), + new QueryOptions(Constants.INCREMENT_VERSION, true), token); + + catalogManager.getProjectManager().incrementRelease(projectId, token); + // We create something to have a gap in the release + catalogManager.getSampleManager().create(studyFqn, new Sample().setId("du--m---m..y"), null, token); + + catalogManager.getProjectManager().incrementRelease(projectId, token); + catalogManager.getSampleManager().update(studyFqn, sampleId, new SampleUpdateParams(), + new QueryOptions(Constants.INCREMENT_VERSION, true), token); + + catalogManager.getSampleManager().update(studyFqn, sampleId, + new SampleUpdateParams().setDescription("new description"), null, token); + + // We want the whole history of the sample + query = new Query() + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleId) + .append(Constants.ALL_VERSIONS, true); + DataResult sampleDataResult = catalogManager.getSampleManager().search(studyFqn, query, null, token); + assertEquals(4, sampleDataResult.getNumResults()); + assertEquals("description", sampleDataResult.getResults().get(0).getDescription()); + assertEquals("description", sampleDataResult.getResults().get(1).getDescription()); + assertEquals("description", sampleDataResult.getResults().get(2).getDescription()); + assertEquals("new description", sampleDataResult.getResults().get(3).getDescription()); + + query = new Query() + .append(SampleDBAdaptor.QueryParams.VERSION.key(), "all"); + sampleDataResult = catalogManager.getSampleManager().get(studyFqn, Collections.singletonList(sampleId), + query, null, false, token); + assertEquals(4, sampleDataResult.getNumResults()); + assertEquals("description", sampleDataResult.getResults().get(0).getDescription()); + assertEquals("description", sampleDataResult.getResults().get(1).getDescription()); + assertEquals("description", sampleDataResult.getResults().get(2).getDescription()); + assertEquals("new description", sampleDataResult.getResults().get(3).getDescription()); + + // We want the last version of release 1 + query = new Query() + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleId) + .append(SampleDBAdaptor.QueryParams.SNAPSHOT.key(), 1); + sampleDataResult = catalogManager.getSampleManager().search(studyFqn, query, null, token); + assertEquals(1, sampleDataResult.getNumResults()); + assertEquals(3, sampleDataResult.first().getVersion()); + + // We want the last version of release 2 (must be the same of release 1) + query = new Query() + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleId) + .append(SampleDBAdaptor.QueryParams.SNAPSHOT.key(), 2); + sampleDataResult = catalogManager.getSampleManager().search(studyFqn, query, null, token); + assertEquals(1, sampleDataResult.getNumResults()); + assertEquals(3, sampleDataResult.first().getVersion()); + + // We want the last version of the sample + query = new Query() + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleId); + sampleDataResult = catalogManager.getSampleManager().search(studyFqn, query, null, token); + assertEquals(1, sampleDataResult.getNumResults()); + assertEquals(4, sampleDataResult.first().getVersion()); + + // We want the version 2 of the sample + query = new Query() + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleId) + .append(SampleDBAdaptor.QueryParams.VERSION.key(), 2); + sampleDataResult = catalogManager.getSampleManager().search(studyFqn, query, null, token); + assertEquals(1, sampleDataResult.getNumResults()); + assertEquals(2, sampleDataResult.first().getVersion()); + + // We want the version 1 of the sample + query = new Query() + .append(SampleDBAdaptor.QueryParams.ID.key(), sampleId) + .append(SampleDBAdaptor.QueryParams.VERSION.key(), 1); + sampleDataResult = catalogManager.getSampleManager().search(studyFqn, query, null, token); + assertEquals(1, sampleDataResult.getNumResults()); + assertEquals(1, sampleDataResult.first().getVersion()); + + DataResult testSample = catalogManager.getSampleManager() + .get(studyFqn, Collections.singletonList(sampleId), new Query(Constants.ALL_VERSIONS, true), null, false, token); + assertEquals(4, testSample.getResults().size()); + } + + @Test public void searchByInternalAnnotationSetTest() throws CatalogException { Set variables = new HashSet<>(); From 6dc956bdc530c126da5feeef5e26a8daef9196ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 13 May 2021 11:30:37 +0200 Subject: [PATCH 309/412] analysis: run Circos plot analysis when executing a sample quality control job, #1730 --- .../analysis/sample/qc/SampleQcAnalysis.java | 178 +++++------------- .../qc/SampleQcLocalAnalysisExecutor.java | 127 ------------- .../VariantInternalCommandExecutor.java | 12 +- .../options/VariantCommandOptions.java | 4 +- .../analysis/VariantCommandExecutor.java | 12 +- .../variant/SampleQcAnalysisParams.java | 32 +++- .../variant/SampleQcAnalysisExecutor.java | 127 ++++++------- .../rest/analysis/VariantWebService.java | 12 +- 8 files changed, 156 insertions(+), 348 deletions(-) delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 46b26e47013..7fb80f57256 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -18,6 +18,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.clinical.qc.CircosPlot; import org.opencb.biodata.models.clinical.qc.MutationalSignature; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.biodata.models.clinical.qc.Signature; @@ -25,9 +26,9 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.analysis.AnalysisUtils; import org.opencb.opencga.analysis.individual.qc.IndividualQcUtils; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.analysis.variant.circos.CircosAnalysis; import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis; import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureLocalAnalysisExecutor; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; @@ -35,9 +36,10 @@ import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.core.models.sample.*; +import org.opencb.opencga.core.models.sample.Sample; +import org.opencb.opencga.core.models.sample.SampleUpdateParams; +import org.opencb.opencga.core.models.sample.SampleVariantQualityControlMetrics; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; @@ -45,9 +47,11 @@ import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.stream.Collectors; import static org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureLocalAnalysisExecutor.CONTEXT_FILENAME; import static org.opencb.opencga.core.models.study.StudyAclEntry.StudyPermissions.WRITE_SAMPLES; @@ -56,12 +60,12 @@ public class SampleQcAnalysis extends OpenCgaToolScopeStudy { public static final String ID = "sample-qc"; - public static final String DESCRIPTION = "Run quality control (QC) for a given sample. It includes variant stats and gene coverage" - + " stats; and for somatic samples, mutational signature"; + public static final String DESCRIPTION = "Run quality control (QC) for a given sample. It includes variant stats and Circos plot; and " + + " for somatic samples, mutational signature."; public static final String VARIANT_STATS_STEP = "variant-stats"; - public static final String GENE_COVERAGE_STEP = "gene-coverage-stats"; - public static final String MUTATIONAL_SIGNATUR_STEP = "mutational-signature"; + public static final String CIRCOS_PLOT_STEP = "circos-plot"; + public static final String MUTATIONAL_SIGNATURE_STEP = "mutational-signature"; private String studyId; private String sampleId; @@ -70,13 +74,14 @@ public class SampleQcAnalysis extends OpenCgaToolScopeStudy { private Query variantStatsQuery; private String signatureId; private Query signatureQuery; - private List genesForCoverageStats; +// private Query circosQuery; +// private List signatureQuery; private Sample sample; - private File catalogBamFile; private SampleVariantQualityControlMetrics variantQcMetrics; private Job variantStatsJob = null; private Job signatureJob = null; + private Job circosJob = null; @Override protected void check() throws Exception { @@ -106,17 +111,11 @@ protected void check() throws Exception { if (sample == null) { throw new ToolException("Sample '" + sampleId + "' not found."); } - - try { - catalogBamFile = AnalysisUtils.getBamFileBySampleId(sample.getId(), studyId, catalogManager.getFileManager(), getToken()); - } catch (ToolException e) { - throw new ToolException(e); - } } @Override protected List getSteps() { - return Arrays.asList(VARIANT_STATS_STEP, GENE_COVERAGE_STEP, MUTATIONAL_SIGNATUR_STEP); + return Arrays.asList(VARIANT_STATS_STEP, CIRCOS_PLOT_STEP, MUTATIONAL_SIGNATURE_STEP); } @Override @@ -134,6 +133,8 @@ protected void run() throws ToolException { } else if (dependsOnJob.getId().startsWith(MutationalSignatureAnalysis.ID)) { signatureJob = catalogManager.getJobManager().get(studyId, dependsOnJob.getId(), QueryOptions.empty(), token) .first(); + } else if (dependsOnJob.getId().startsWith(CircosAnalysis.ID)) { + circosJob = catalogManager.getJobManager().get(studyId, dependsOnJob.getId(), QueryOptions.empty(), token).first(); } } } @@ -142,7 +143,6 @@ protected void run() throws ToolException { } // Get sample quality control metrics to update -// alignmentQcMetrics = getSampleAlignmentQualityControlMetrics(); variantQcMetrics = sample.getQualityControl().getVariantMetrics(); SampleQcAnalysisExecutor executor = getToolExecutor(SampleQcAnalysisExecutor.class); @@ -150,24 +150,25 @@ protected void run() throws ToolException { // Set up executor executor.setStudyId(studyId) .setSample(sample) - .setCatalogBamFile(catalogBamFile) .setVariantStatsId(variantStatsId) .setVariantStatsDecription(variantStatsDecription) .setVariantStatsQuery(variantStatsQuery) .setSignatureId(signatureId) - .setSignatureQuery(signatureQuery) - .setGenesForCoverageStats(genesForCoverageStats) -// .setAlignmentQcMetrics(alignmentQcMetrics) - ; + .setSignatureQuery(signatureQuery); // Step by step step(VARIANT_STATS_STEP, () -> runVariantStats()); - step(GENE_COVERAGE_STEP, () -> executor.setQcType(SampleQcAnalysisExecutor.QcType.GENE_COVERAGE_STATS).execute()); - step(MUTATIONAL_SIGNATUR_STEP, () -> runSignature()); + step(CIRCOS_PLOT_STEP, () -> runCircosPlot()); + step(MUTATIONAL_SIGNATURE_STEP, () -> runSignature()); // Finally, update sample quality control metrics -// alignmentQcMetrics = executor.getAlignmentQcMetrics(); -// updateSampleQualityControlMetrics(alignmentQcMetrics); + try { + sample.getQualityControl().setVariantMetrics(variantQcMetrics); + catalogManager.getSampleManager().update(studyId, getSampleId(), + new SampleUpdateParams().setQualityControl(sample.getQualityControl()), QueryOptions.empty(), token); + } catch (CatalogException e) { + throw new ToolException(e); + } } private void runVariantStats() throws ToolException { @@ -256,107 +257,31 @@ private void runSignature() throws ToolException { } } - -// private void runFastQc() throws ToolException { -// if (fastQcJob == null) { -// addWarning("Skipping FastQc analysis"); -// return; -// } -// -// if (CollectionUtils.isNotEmpty(fastQcJob.getOutput())) { -// FastQc fastQc = null; -// -// // First, look for fastqc_data.txt to parse it -// for (File file: fastQcJob.getOutput()) { -// if (file.getName().equals("fastqc_data.txt")) { -// try { -// fastQc = FastQcParser.parse(Paths.get(file.getUri().getPath()).toFile()); -// } catch (IOException e) { -// throw new ToolException(e); -// } -// } -// } -// -// // Second, add images to the FastQc object -// if (fastQc != null) { -// for (File file : fastQcJob.getOutput()) { -// switch (file.getName()) { -// case "adapter_content.png": { -// fastQc.getAdapterContent().setFile(file.getId()); -// break; -// } -// case "per_base_n_content.png": { -// fastQc.getPerBaseNContent().setFile(file.getId()); -// break; -// } -// case "per_base_sequence_content.png": { -// fastQc.getPerBaseSeqContent().setFile(file.getId()); -// break; -// } -// case "per_sequence_quality.png": { -// fastQc.getPerSeqQualityScore().setFile(file.getId()); -// break; -// } -// case "duplication_levels.png": { -// fastQc.getSeqDuplicationLevel().setFile(file.getId()); -// break; -// } -// case "per_base_quality.png": { -// fastQc.getPerBaseSeqQuality().setFile(file.getId()); -// break; -// } -// case "per_sequence_gc_content.png": { -// fastQc.getPerSeqGcContent().setFile(file.getId()); -// break; -// } -// case "sequence_length_distribution.png": { -// fastQc.getSeqLengthDistribution().setFile(file.getId()); -// break; -// } -// } -// } -// -// alignmentQcMetrics.setFastQc(fastQc); -// } -// } -// } - - private SampleAlignmentQualityControlMetrics getSampleAlignmentQualityControlMetrics() { - String bamFileId = (catalogBamFile == null) ? "" : catalogBamFile.getId(); - - if (sample.getQualityControl() == null) { - sample.setQualityControl(new SampleQualityControl()); + private void runCircosPlot() throws ToolException { + if (circosJob == null) { + addWarning("Skipping Circos plot"); } else { - for (SampleAlignmentQualityControlMetrics prevMetrics : sample.getQualityControl().getAlignmentMetrics()) { - if (prevMetrics.getBamFileId().equals(bamFileId)) { - return prevMetrics; - } - } - } - return new SampleAlignmentQualityControlMetrics().setBamFileId(bamFileId); - } - private void updateSampleQualityControlMetrics(SampleAlignmentQualityControlMetrics alignmentQcMetrics) throws ToolException { - SampleQualityControl qualityControl = sample.getQualityControl(); - if (sample.getQualityControl() == null) { - qualityControl = new SampleQualityControl(); - } else { - int index = 0; - for (SampleAlignmentQualityControlMetrics prevMetrics : qualityControl.getAlignmentMetrics()) { - if (prevMetrics.getBamFileId().equals(alignmentQcMetrics.getBamFileId())) { - qualityControl.getAlignmentMetrics().remove(index); - break; + try { + List paths = Files.list(Paths.get(circosJob.getOutDir().getUri().getPath())).collect(Collectors.toList()); + for (Path path : paths) { + if (path.getFileName().endsWith(CircosAnalysis.SUFFIX_FILENAME)) { + int index = path.toFile().getAbsolutePath().indexOf("JOBS/"); + String relativeFilePath = (index == -1 + ? path.toFile().getName() + : path.toFile().getAbsolutePath().substring(index)); + CircosPlot circosPlot = new CircosPlot(circosJob.getId(), null, relativeFilePath); + if (variantQcMetrics.getCircosPlots() == null) { + variantQcMetrics.setCircosPlots(new ArrayList<>()); + } + variantQcMetrics.getCircosPlots().add(circosPlot); + break; + } } - index++; + } catch (IOException e) { + throw new ToolException(e); } } - - try { - catalogManager.getSampleManager().update(studyId, getSampleId(), new SampleUpdateParams().setQualityControl(qualityControl), - QueryOptions.empty(), token); - } catch (CatalogException e) { - throw new ToolException(e); - } } public SampleQcAnalysis setStudyId(String studyId) { @@ -417,13 +342,4 @@ public SampleQcAnalysis setSignatureQuery(Query signatureQuery) { this.signatureQuery = signatureQuery; return this; } - - public List getGenesForCoverageStats() { - return genesForCoverageStats; - } - - public SampleQcAnalysis setGenesForCoverageStats(List genesForCoverageStats) { - this.genesForCoverageStats = genesForCoverageStats; - return this; - } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java deleted file mode 100644 index b4f6d241d93..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.analysis.sample.qc; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.formats.alignment.picard.HsMetrics; -import org.opencb.biodata.formats.alignment.picard.io.HsMetricsParser; -import org.opencb.biodata.models.alignment.GeneCoverageStats; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.analysis.AnalysisUtils; -import org.opencb.opencga.analysis.StorageToolExecutor; -import org.opencb.opencga.analysis.wrappers.picard.PicardWrapperAnalysisExecutor; -import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.file.File; -import org.opencb.opencga.core.response.OpenCGAResult; -import org.opencb.opencga.core.tools.annotations.ToolExecutor; -import org.opencb.opencga.core.tools.variant.SampleQcAnalysisExecutor; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -import static org.opencb.opencga.core.api.ParamConstants.LOW_COVERAGE_REGION_THRESHOLD_DEFAULT; - -@ToolExecutor(id="opencga-local", tool = SampleQcAnalysis.ID, framework = ToolExecutor.Framework.LOCAL, - source = ToolExecutor.Source.STORAGE) -public class SampleQcLocalAnalysisExecutor extends SampleQcAnalysisExecutor implements StorageToolExecutor { - - private CatalogManager catalogManager; - - @Override - public void run() throws ToolException { - // Sanity check: metrics to update can not be null - if (alignmentQcMetrics == null) { - throw new ToolException("Sample alignment quality control metrics is null"); - } - - catalogManager = getVariantStorageManager().getCatalogManager(); - - switch (qcType) { - - case GENE_COVERAGE_STATS: { - runGeneCoverageStats(); - break; - } - - default: { - throw new ToolException("Unknown quality control type: " + qcType); - } - } - } - - private void runGeneCoverageStats() throws ToolException { - // Check BAM file - if (catalogBamFile == null) { - addWarning("Skipping gene coverage stats analysis: no BAM file was provided"); - return; - } - - // Check genes - if (CollectionUtils.isEmpty(getGenesForCoverageStats())) { - addWarning("Skipping gene coverage stats analysis: missing genes"); - return; - } - - // Sanity check - List geneCoverageStats = alignmentQcMetrics.getGeneCoverageStats(); - if (geneCoverageStats == null) { - geneCoverageStats = new ArrayList<>(); - } - - List targetGenes = new ArrayList<>(); - if (CollectionUtils.isEmpty(geneCoverageStats)) { - targetGenes = getGenesForCoverageStats(); - } else { - for (String gene : getGenesForCoverageStats()) { - boolean found = false; - for (GeneCoverageStats stats : geneCoverageStats) { - if (gene.equals(stats.getGeneName())) { - found = true; - addWarning("Skipping gene coverage stats for gene " + gene + ": it was already computed"); - break; - } - } - if (!found) { - targetGenes.add(gene); - } - } - } - - if (CollectionUtils.isNotEmpty(targetGenes)) { - try { - OpenCGAResult geneCoverageStatsResult = getAlignmentStorageManager().coverageStats(getStudyId(), - catalogBamFile.getId(), targetGenes, Integer.parseInt(LOW_COVERAGE_REGION_THRESHOLD_DEFAULT), getToken()); - - if (geneCoverageStatsResult.getNumResults() != 1) { - throw new ToolException("Something wrong happened when computing gene coverage stats: no results returned"); - } - geneCoverageStats.add(geneCoverageStatsResult.first()); - - // Add result to the list - alignmentQcMetrics.setGeneCoverageStats(geneCoverageStats); - } catch (Exception e) { - throw new ToolException(e); - } - } - } -} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index 062cb7c3c24..c34485eb435 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -876,10 +876,10 @@ private void sampleQc() throws Exception { Query signatureQuery = new Query(); signatureQuery.putAll(cliOptions.signatureQuery); - // Build list of genes from cli options - List genesForCoverageStats = StringUtils.isEmpty(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats) - ? new ArrayList<>() - : Arrays.asList(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats.split(",")); +// // Build list of genes from cli options +// List genesForCoverageStats = StringUtils.isEmpty(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats) +// ? new ArrayList<>() +// : Arrays.asList(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats.split(",")); SampleQcAnalysis sampleQcAnalysis = new SampleQcAnalysis(); sampleQcAnalysis.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), @@ -890,8 +890,8 @@ private void sampleQc() throws Exception { .setVariantStatsDecription(cliOptions.variantStatsDecription) .setVariantStatsQuery(variantStatsQuery) .setSignatureId(cliOptions.signatureId) - .setSignatureQuery(signatureQuery) - .setGenesForCoverageStats(genesForCoverageStats); + .setSignatureQuery(signatureQuery); +// .setGenesForCoverageStats(genesForCoverageStats); sampleQcAnalysis.start(); } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index 405cc9d4f74..904b5fee0c6 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1401,8 +1401,8 @@ public class SampleQcCommandOptions { @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") public Map signatureQuery = new HashMap<>(); - @Parameter(names = {"--genes-for-coverage-stats"}, description = "A comma separated list of genes to compute the coverage stats.") - public String genesForCoverageStats; +// @Parameter(names = {"--genes-for-coverage-stats"}, description = "A comma separated list of genes to compute the coverage stats.") +// public String genesForCoverageStats; @Parameter(names = {"-o", "--outdir"}, description = "Output directory.") public String outdir; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 44a568b1c52..401ffae5107 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -417,10 +417,10 @@ private RestResponse sampleQc() throws ClientException { // Build signature query from cli options SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, cliOptions.signatureQuery); - // Build list of genes from cli options - List genesForCoverageStats = StringUtils.isEmpty(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats) - ? new ArrayList<>() - : Arrays.asList(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats.split(",")); +// // Build list of genes from cli options +// List genesForCoverageStats = StringUtils.isEmpty(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats) +// ? new ArrayList<>() +// : Arrays.asList(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats.split(",")); return openCGAClient.getVariantClient().runSampleQc( new SampleQcAnalysisParams( @@ -430,7 +430,9 @@ private RestResponse sampleQc() throws ClientException { variantStatsQuery, variantCommandOptions.sampleQcCommandOptions.signatureId, signatureQuery, - genesForCoverageStats, + //genesForCoverageStats, + null, + null, variantCommandOptions.sampleQcCommandOptions.outdir ), getParams(variantCommandOptions.sampleQcCommandOptions.study) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java index de8405af733..c344412f726 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java @@ -19,6 +19,7 @@ import org.opencb.opencga.core.tools.ToolParams; import java.util.List; +import java.util.Map; public class SampleQcAnalysisParams extends ToolParams { public static final String DESCRIPTION = "Sample QC analysis params"; @@ -28,7 +29,8 @@ public class SampleQcAnalysisParams extends ToolParams { private AnnotationVariantQueryParams variantStatsQuery; private String signatureId; private SampleQcSignatureQueryParams signatureQuery; - private List genesForCoverageStats; + private Map circosQuery; + private List circosTracks; private String outdir; @@ -37,14 +39,16 @@ public SampleQcAnalysisParams() { public SampleQcAnalysisParams(String sample, String variantStatsId, String variantStatsDescription, AnnotationVariantQueryParams variantStatsQuery, String signatureId, - SampleQcSignatureQueryParams signatureQuery, List genesForCoverageStats, String outdir) { + SampleQcSignatureQueryParams signatureQuery, Map circosQuery, + List circosTracks, String outdir) { this.sample = sample; this.variantStatsId = variantStatsId; this.variantStatsDescription = variantStatsDescription; this.variantStatsQuery = variantStatsQuery; this.signatureId = signatureId; this.signatureQuery = signatureQuery; - this.genesForCoverageStats = genesForCoverageStats; + this.circosQuery = circosQuery; + this.circosTracks = circosTracks; this.outdir = outdir; } @@ -53,11 +57,12 @@ public String toString() { final StringBuilder sb = new StringBuilder("SampleQcAnalysisParams{"); sb.append("sample='").append(sample).append('\''); sb.append(", variantStatsId='").append(variantStatsId).append('\''); - sb.append(", variantStatsDecription='").append(variantStatsDescription).append('\''); + sb.append(", variantStatsDescription='").append(variantStatsDescription).append('\''); sb.append(", variantStatsQuery=").append(variantStatsQuery); sb.append(", signatureId='").append(signatureId).append('\''); sb.append(", signatureQuery=").append(signatureQuery); - sb.append(", genesForCoverageStats=").append(genesForCoverageStats); + sb.append(", circosQuery=").append(circosQuery); + sb.append(", circosTracks=").append(circosTracks); sb.append(", outdir='").append(outdir).append('\''); sb.append('}'); return sb.toString(); @@ -117,12 +122,21 @@ public SampleQcAnalysisParams setSignatureQuery(SampleQcSignatureQueryParams sig return this; } - public List getGenesForCoverageStats() { - return genesForCoverageStats; + public Map getCircosQuery() { + return circosQuery; } - public SampleQcAnalysisParams setGenesForCoverageStats(List genesForCoverageStats) { - this.genesForCoverageStats = genesForCoverageStats; + public SampleQcAnalysisParams setCircosQuery(Map circosQuery) { + this.circosQuery = circosQuery; + return this; + } + + public List getCircosTracks() { + return circosTracks; + } + + public SampleQcAnalysisParams setCircosTracks(List circosTracks) { + this.circosTracks = circosTracks; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/SampleQcAnalysisExecutor.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/SampleQcAnalysisExecutor.java index c59c03a927a..9465fb224c3 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/SampleQcAnalysisExecutor.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/SampleQcAnalysisExecutor.java @@ -17,35 +17,30 @@ package org.opencb.opencga.core.tools.variant; import org.opencb.commons.datastore.core.Query; -import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.sample.Sample; -import org.opencb.opencga.core.models.sample.SampleAlignmentQualityControlMetrics; -import org.opencb.opencga.core.models.sample.SampleVariantQualityControlMetrics; import org.opencb.opencga.core.tools.OpenCgaToolExecutor; -import java.util.List; - public abstract class SampleQcAnalysisExecutor extends OpenCgaToolExecutor { - public enum QcType { - FLAG_STATS, HS_METRICS, GENE_COVERAGE_STATS - } +// public enum QcType { +// FLAG_STATS, HS_METRICS, GENE_COVERAGE_STATS +// } protected String studyId; protected Sample sample; - protected File catalogBamFile; - protected String dictFile; - protected String baitFile; +// protected File catalogBamFile; +// protected String dictFile; +// protected String baitFile; protected String variantStatsId; protected String variantStatsDecription; protected Query variantStatsQuery; protected String signatureId; protected Query signatureQuery; - protected List genesForCoverageStats; +// protected List genesForCoverageStats; - protected QcType qcType; +// protected QcType qcType; - protected SampleAlignmentQualityControlMetrics alignmentQcMetrics; +// protected SampleAlignmentQualityControlMetrics alignmentQcMetrics; public SampleQcAnalysisExecutor() { } @@ -68,32 +63,32 @@ public SampleQcAnalysisExecutor setSample(Sample sample) { return this; } - public File getCatalogBamFile() { - return catalogBamFile; - } - - public SampleQcAnalysisExecutor setCatalogBamFile(File catalogBamFile) { - this.catalogBamFile = catalogBamFile; - return this; - } - - public String getDictFile() { - return dictFile; - } - - public SampleQcAnalysisExecutor setDictFile(String dictFile) { - this.dictFile = dictFile; - return this; - } - - public String getBaitFile() { - return baitFile; - } - - public SampleQcAnalysisExecutor setBaitFile(String baitFile) { - this.baitFile = baitFile; - return this; - } +// public File getCatalogBamFile() { +// return catalogBamFile; +// } +// +// public SampleQcAnalysisExecutor setCatalogBamFile(File catalogBamFile) { +// this.catalogBamFile = catalogBamFile; +// return this; +// } +// +// public String getDictFile() { +// return dictFile; +// } +// +// public SampleQcAnalysisExecutor setDictFile(String dictFile) { +// this.dictFile = dictFile; +// return this; +// } +// +// public String getBaitFile() { +// return baitFile; +// } +// +// public SampleQcAnalysisExecutor setBaitFile(String baitFile) { +// this.baitFile = baitFile; +// return this; +// } public String getVariantStatsId() { return variantStatsId; @@ -140,30 +135,30 @@ public SampleQcAnalysisExecutor setSignatureQuery(Query signatureQuery) { return this; } - public List getGenesForCoverageStats() { - return genesForCoverageStats; - } - - public SampleQcAnalysisExecutor setGenesForCoverageStats(List genesForCoverageStats) { - this.genesForCoverageStats = genesForCoverageStats; - return this; - } - - public QcType getQcType() { - return qcType; - } - - public SampleQcAnalysisExecutor setQcType(QcType qcType) { - this.qcType = qcType; - return this; - } - - public SampleAlignmentQualityControlMetrics getAlignmentQcMetrics() { - return alignmentQcMetrics; - } - - public SampleQcAnalysisExecutor setAlignmentQcMetrics(SampleAlignmentQualityControlMetrics alignmentQcMetrics) { - this.alignmentQcMetrics = alignmentQcMetrics; - return this; - } +// public List getGenesForCoverageStats() { +// return genesForCoverageStats; +// } +// +// public SampleQcAnalysisExecutor setGenesForCoverageStats(List genesForCoverageStats) { +// this.genesForCoverageStats = genesForCoverageStats; +// return this; +// } + +// public QcType getQcType() { +// return qcType; +// } +// +// public SampleQcAnalysisExecutor setQcType(QcType qcType) { +// this.qcType = qcType; +// return this; +// } + +// public SampleAlignmentQualityControlMetrics getAlignmentQcMetrics() { +// return alignmentQcMetrics; +// } +// +// public SampleQcAnalysisExecutor setAlignmentQcMetrics(SampleAlignmentQualityControlMetrics alignmentQcMetrics) { +// this.alignmentQcMetrics = alignmentQcMetrics; +// return this; +// } } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 036efa3e1e5..2978c4a9312 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -18,6 +18,7 @@ import io.swagger.annotations.*; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; @@ -1134,12 +1135,10 @@ public Response sampleQcRun( List dependsOnList = StringUtils.isEmpty(dependsOn) ? new ArrayList<>() : Arrays.asList(dependsOn.split(",")); Sample sample; - org.opencb.opencga.core.models.file.File catalogBamFile; sample = IndividualQcUtils.getValidSampleById(study, params.getSample(), catalogManager, token); if (sample == null) { throw new ToolException("Sample '" + params.getSample() + "' not found."); } - catalogBamFile = AnalysisUtils.getBamFileBySampleId(sample.getId(), study, catalogManager.getFileManager(), token); // Check variant stats if (OPENCGA_ALL.equals(params.getVariantStatsId())) { @@ -1228,6 +1227,15 @@ public Response sampleQcRun( dependsOnList.add(signatureJob.getId()); } + // Run circos if necessary + if (MapUtils.isNotEmpty(params.getCircosQuery()) && CollectionUtils.isNotEmpty(params.getCircosTracks())) { + CircosAnalysisParams circosAnalysisParams = new CircosAnalysisParams(sample.getId(), "MEDIUM", params.getCircosQuery(), + params.getCircosTracks(), params.getOutdir()); + DataResult jobResult = submitJobRaw(CircosAnalysis.ID, null, study, circosAnalysisParams, null, null, null, null); + Job circosJob = jobResult.first(); + dependsOnList.add(circosJob.getId()); + } + return submitJobRaw(SampleQcAnalysis.ID, null, study, params, jobName, jobDescription, StringUtils.join(dependsOnList, ","), jobTags); }); } From 9927216c2c4be58d754c69d1062e1bbed369feb5 Mon Sep 17 00:00:00 2001 From: Will Spooner Date: Thu, 13 May 2021 10:27:58 +0000 Subject: [PATCH 310/412] GitBook: [develop] one page modified --- docs/manual/data-models/sample.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual/data-models/sample.md b/docs/manual/data-models/sample.md index 9c14268ab18..a51e6507f5c 100644 --- a/docs/manual/data-models/sample.md +++ b/docs/manual/data-models/sample.md @@ -45,7 +45,7 @@ This is the main data model, it stores the most basic and important information.

Unique Sample ID in the study, this can be repeated across different studies. This is a mandatory parameter in the creation and cannot be changed at the moment.

-

Constraints: Required, Create +

Constraints: Required, Create, Immutable

From b146a0a0ac4b97b069894c7cd946e3ab1d7754a3 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 13 May 2021 15:09:45 +0200 Subject: [PATCH 311/412] analysis: get gene ids using main collection, #1693 --- .../opencga/analysis/rga/RgaManager.java | 107 ++++++++++++------ 1 file changed, 74 insertions(+), 33 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 84e2bc1e754..e727e84c000 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -13,9 +13,7 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; -import org.opencb.opencga.analysis.rga.RgaUtils.CodedIndividual; -import org.opencb.opencga.analysis.rga.RgaUtils.CodedVariant; -import org.opencb.opencga.analysis.rga.RgaUtils.KnockoutTypeCount; +import org.opencb.opencga.analysis.rga.RgaUtils.*; import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; @@ -571,13 +569,9 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); String collection = getMainCollectionName(study.getFqn()); - String auxCollection = getAuxCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } - if (!rgaEngine.isAlive(auxCollection)) { - throw new RgaException("Missing auxiliar RGA collection for study '" + study.getFqn() + "'"); - } StopWatch stopWatch = new StopWatch(); stopWatch.start(); @@ -590,10 +584,25 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Boolean isOwnerOrAdmin = catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); Query auxQuery = query != null ? new Query(query) : new Query(); - ResourceIds resourceIds; + // Get number of matches + Future numMatchesFuture = null; + if (options.getBoolean(QueryOptions.COUNT)) { + numMatchesFuture = executor.submit(() -> { + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaQueryParams.GENE_ID + ")"); + try { + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + return ((Number) result.first().getAggregationValues().get(0)).intValue(); + } catch (Exception e) { + logger.error("Could not obtain the count: {}", e.getMessage(), e); + } + return -1; + }); + } + + List geneIds; try { - resourceIds = getIds(collection, auxCollection, RgaQueryParams.GENE_ID.key(), auxQuery, queryOptions, executor); - auxQuery.put(RgaQueryParams.GENE_ID.key(), resourceIds.getIds()); + geneIds = getGeneIds(collection, auxQuery, queryOptions); + auxQuery.put(RgaQueryParams.GENE_ID.key(), geneIds); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { return OpenCGAResult.empty(RgaKnockoutByGene.class, (int) stopWatch.getTime(TimeUnit.MILLISECONDS)); @@ -664,7 +673,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, knockoutResult.setTime((int) stopWatch.getTime(TimeUnit.MILLISECONDS)); try { - knockoutResult.setNumMatches(resourceIds.getNumMatchesFuture() != null ? resourceIds.getNumMatchesFuture().get() : -1); + knockoutResult.setNumMatches(numMatchesFuture != null ? numMatchesFuture.get() : -1); } catch (InterruptedException | ExecutionException e) { knockoutResult.setNumMatches(-1); } @@ -713,7 +722,7 @@ public OpenCGAResult variantQuery(String studyStr, Query quer ResourceIds resourceIds; try { - resourceIds = getIds(collection, auxCollection, RgaQueryParams.VARIANTS.key(), auxQuery, queryOptions, executor); + resourceIds = getVariantIds(collection, auxCollection, auxQuery, queryOptions, executor); auxQuery.put(RgaDataModel.VARIANTS, resourceIds.getIds()); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { @@ -939,13 +948,9 @@ public OpenCGAResult geneSummary(String studyStr, Query q Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); String userId = catalogManager.getUserManager().getUserId(token); String collection = getMainCollectionName(study.getFqn()); - String auxCollection = getAuxCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); } - if (!rgaEngine.isAlive(auxCollection)) { - throw new RgaException("Missing auxiliar RGA collection for study '" + study.getFqn() + "'"); - } catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.VIEW_AGGREGATED_VARIANTS); @@ -953,12 +958,26 @@ public OpenCGAResult geneSummary(String studyStr, Query q ExecutorService executor = Executors.newFixedThreadPool(4); QueryOptions queryOptions = setDefaultLimit(options); - Query auxQuery = query != null ? new Query(query) : new Query(); - ResourceIds resourceIds; + // Get number of matches + Future numMatchesFuture = null; + if (options.getBoolean(QueryOptions.COUNT)) { + numMatchesFuture = executor.submit(() -> { + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaQueryParams.GENE_ID + ")"); + try { + DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); + return ((Number) result.first().getAggregationValues().get(0)).intValue(); + } catch (Exception e) { + logger.error("Could not obtain the count: {}", e.getMessage(), e); + } + return -1; + }); + } + + List geneIds; try { - resourceIds = getIds(collection, auxCollection, RgaQueryParams.GENE_ID.key(), auxQuery, queryOptions, executor); + geneIds = getGeneIds(collection, auxQuery, queryOptions); auxQuery.remove(RgaQueryParams.GENE_ID.key()); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { @@ -967,12 +986,12 @@ public OpenCGAResult geneSummary(String studyStr, Query q throw e; } - List> geneSummaryFutureList = new ArrayList<>(resourceIds.getIds().size()); - for (String geneId : resourceIds.getIds()) { + List> geneSummaryFutureList = new ArrayList<>(geneIds.size()); + for (String geneId : geneIds) { geneSummaryFutureList.add(executor.submit(() -> calculateGeneSummary(collection, auxQuery, geneId))); } - List knockoutByGeneSummaryList = new ArrayList<>(resourceIds.getIds().size()); + List knockoutByGeneSummaryList = new ArrayList<>(geneIds.size()); try { for (Future summaryFuture : geneSummaryFutureList) { knockoutByGeneSummaryList.add(summaryFuture.get()); @@ -987,8 +1006,8 @@ public OpenCGAResult geneSummary(String studyStr, Query q int numMatches = -1; if (queryOptions.getBoolean(QueryOptions.COUNT)) { try { - assert resourceIds.getNumMatchesFuture() != null; - numMatches = resourceIds.getNumMatchesFuture().get(); + assert numMatchesFuture != null; + numMatches = numMatchesFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new RgaException(e.getMessage(), e); } @@ -1024,7 +1043,7 @@ public OpenCGAResult variantSummary(String studyStr, Q ResourceIds resourceIds; try { - resourceIds = getIds(collection, auxCollection, RgaQueryParams.VARIANTS.key(), auxQuery, queryOptions, executor); + resourceIds = getVariantIds(collection, auxCollection, auxQuery, queryOptions, executor); auxQuery.put(RgaDataModel.VARIANTS, resourceIds.getIds()); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { @@ -1119,21 +1138,43 @@ public OpenCGAResult aggregationStats(String studyStr, Query query, return new OpenCGAResult<>(rgaEngine.facetedQuery(collection, query, queryOptions)); } + /*** + * Fetch a list of gene ids considering the limit/skip. + * + * @param collection Main RGA collection name. + * @param query User query object. + * @param options User query options object. + * @return the list of expected ids. + * @throws RgaException RgaException. + * @throws IOException IOException. + */ + private List getGeneIds(String collection, Query query, QueryOptions options) throws RgaException, IOException { + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaQueryParams.GENE_ID.key()); + facetOptions.putIfNotNull(QueryOptions.LIMIT, -1); + facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); + facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); + + DataResult result = rgaEngine.facetedQuery(collection, query, facetOptions); + if (result.getNumResults() == 0) { + throw RgaException.noResultsMatching(); + } + + return result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); + } + /*** * Fetch a list of ids (facetField) considering the limit/skip, using the auxiliary collection to improve performance. * * @param mainCollection Main RGA collection name. * @param auxCollection Auxiliary RGA collection name. - * @param facetField Field from where ids will be retrieved. * @param query User query object. * @param options User query options object. * @return the list of expected ids. * @throws RgaException RgaException. * @throws IOException IOException. */ - private ResourceIds getIds(String mainCollection, String auxCollection, String facetField, Query query, QueryOptions options, - ExecutorService executor) throws RgaException, IOException { - String auxiliarId = AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.get(facetField); + private ResourceIds getVariantIds(String mainCollection, String auxCollection, Query query, QueryOptions options, + ExecutorService executor) throws RgaException, IOException { List ids; Future numMatchesFuture = null; @@ -1142,7 +1183,7 @@ private ResourceIds getIds(String mainCollection, String auxCollection, String f if (!mainCollQuery.isEmpty()) { // Perform a facet in the main collection because the user is filtering by other fields not present in the auxiliar coll - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, facetField); + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS); facetOptions.putIfNotNull(QueryOptions.LIMIT, -1); DataResult result = rgaEngine.facetedQuery(mainCollection, query, facetOptions); @@ -1151,13 +1192,13 @@ private ResourceIds getIds(String mainCollection, String auxCollection, String f } ids = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - auxCollQuery.put(facetField, ids); + auxCollQuery.put(RgaDataModel.VARIANTS, ids); } // Get number of matches if (options.getBoolean(QueryOptions.COUNT)) { numMatchesFuture = executor.submit(() -> { - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + auxiliarId + ")"); + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + AuxiliarRgaDataModel.ID + ")"); try { DataResult result = rgaEngine.auxFacetedQuery(auxCollection, auxCollQuery, facetOptions); return ((Number) result.first().getAggregationValues().get(0)).intValue(); @@ -1169,7 +1210,7 @@ private ResourceIds getIds(String mainCollection, String auxCollection, String f } // Perform a facet to get the different variant ids matching the user query and using the skip and limit values - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, auxiliarId); + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, AuxiliarRgaDataModel.ID); facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); From c0c16ff9caed9d006e75c19e74349564b524c823 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 13 May 2021 15:21:19 +0200 Subject: [PATCH 312/412] analysis: don't calculate all possible ch pairs if number is too big --- .../main/java/org/opencb/opencga/analysis/rga/RgaUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index fb5fd9f8f98..e73fea90ccd 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -808,6 +808,10 @@ public int getNumPairedCompHetIds() { Set chPairs = new HashSet<>(); for (Set chSet : transcriptCompHetIdsMap.values()) { if (chSet.size() > 1) { + if (chSet.size() > 50) { + // Don't calculate this if the number of possible pairs is bigger than 1000 + return -1000; + } ArrayList chList = new ArrayList<>(chSet); for (int i = 0; i < chList.size() - 1; i++) { for (int j = i + 1; j < chList.size(); j++) { From 830e27a9d09a299c8557bc93e9b8d8655df229a1 Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 13 May 2021 14:11:34 +0000 Subject: [PATCH 313/412] GitBook: [develop] one page modified --- docs/manual/data-models/sample.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/manual/data-models/sample.md b/docs/manual/data-models/sample.md index a51e6507f5c..bc241660faa 100644 --- a/docs/manual/data-models/sample.md +++ b/docs/manual/data-models/sample.md @@ -88,7 +88,8 @@ This is the main data model, it stores the most basic and important information.
@@ -96,7 +97,8 @@ This is the main data model, it stores the most basic and important information. @@ -122,7 +124,8 @@ This is the main data model, it stores the most basic and important information. @@ -184,7 +187,8 @@ This is the main data model, it stores the most basic and important information. @@ -211,7 +215,7 @@ This is the main data model, it stores the most basic and important information. ### SampleProcessing -This object describes how the sample was processed in the lab. +This object describes how the sample was processed in the laboratory or clinical set where it was collected.

processing

-

<em></em>SampleProcessing<em></em>

+

SampleProcessing +

An object describing how to sample was processed.

collection

-

<em></em>SampleCollection<em></em>

+

SampleCollection +

An object describing how the sample was collected.

qualityControl

-

<em></em>SampleQualityControl<em></em>

+

SampleQualityControl +

status

-

<em></em>CustomStatus<em></em>

+

CustomStatus +

@@ -259,7 +263,8 @@ This object describes how the sample was processed in the lab. @@ -267,7 +272,8 @@ This object describes how the sample was processed in the lab. From a4d8b79693e51dcc2901469ff8bd44f9573dd6e3 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 13 May 2021 17:56:07 +0200 Subject: [PATCH 314/412] analysis: add new field 'chPairs' to main collection, #1693 --- .../analysis/rga/IndividualRgaConverter.java | 144 ++++++++++-------- .../opencga/analysis/rga/RgaDataModel.java | 14 ++ .../opencga/analysis/rga/RgaManager.java | 43 ++++-- .../opencb/opencga/analysis/rga/RgaUtils.java | 90 ++++++++++- .../src/main/resources/rga/managed-schema | 1 + 5 files changed, 210 insertions(+), 82 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index 9f1e601b8a0..cc9b4145962 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -210,8 +210,6 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI continue; } - List compoundFilters = processFilters(transcript); - List phenotypes = populatePhenotypes(knockoutByIndividual.getPhenotypes()); List disorders = populateDisorders(knockoutByIndividual.getDisorders()); List phenotypeJson; @@ -252,8 +250,18 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI Set types = new HashSet<>(); Set consequenceTypes = new HashSet<>(); Set clinicalSignificances = new HashSet<>(); + Set compoundFilters = new HashSet<>(); + Set chPairs = new HashSet<>(); Set filters = new HashSet<>(); + // List to build CH compound filters + List>> maternalChVariants = new LinkedList<>(); + List>> paternalChVariants = new LinkedList<>(); + + // List to build CH pair string + List maternalCodedVariants = new LinkedList<>(); + List paternalCodedVariants = new LinkedList<>(); + Map> popFreqs = getPopulationFrequencies(transcript); List variants = transcript.getVariants(); for (KnockoutVariant variant : variants) { @@ -302,6 +310,31 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI variantPopFreq.get(RgaUtils.THOUSAND_GENOMES_STUDY), variantPopFreq.get(RgaUtils.GNOMAD_GENOMES_STUDY), numParents); individualKnockoutSet.add(codedIndividual.getEncodedId()); + + List> independentTerms = processFilters(variant, compoundFilters); + if (variant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { + if (variant.getParentalOrigin() == KnockoutVariant.ParentalOrigin.PATERNAL) { + paternalChVariants.add(independentTerms); + paternalCodedVariants.add(codedVariant); + } else { + maternalChVariants.add(independentTerms); + maternalCodedVariants.add(codedVariant); + } + } + } + + if (!paternalChVariants.isEmpty() && !maternalChVariants.isEmpty()) { + // CH Pairs + for (RgaUtils.CodedVariant paternalChVariant : paternalCodedVariants) { + for (RgaUtils.CodedVariant maternalChVariant : maternalCodedVariants) { + RgaUtils.CodedChPairVariants codedChPairVariants = + new RgaUtils.CodedChPairVariants(maternalChVariant, paternalChVariant); + chPairs.add(codedChPairVariants.getEncodedId()); + } + } + + // Compound filters + compoundFilters.addAll(RgaUtils.generateCompoundHeterozygousCombinations(maternalChVariants, paternalChVariants)); } String sex = knockoutByIndividual.getSex() != null @@ -339,7 +372,8 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI .setConsequenceTypes(new ArrayList<>(consequenceTypes)) .setClinicalSignificances(new ArrayList<>(clinicalSignificances)) .setPopulationFrequencies(popFreqs) - .setCompoundFilters(compoundFilters) + .setCompoundFilters(new ArrayList<>(compoundFilters)) + .setChPairs(new ArrayList<>(chPairs)) .setPhenotypeJson(phenotypeJson) .setDisorderJson(disorderJson); result.add(model); @@ -468,74 +502,60 @@ private String getEncodedPopFrequency(String population, float value) throws Rga return RgaUtils.encode(population.toUpperCase() + RgaUtils.SEPARATOR + populationFrequencyKey); } - private List processFilters(KnockoutTranscript transcript) throws RgaException { - Set results = new HashSet<>(); + private List> processFilters(KnockoutVariant variant, Set results) throws RgaException { + List> independentTerms = new LinkedList<>(); - List>> compoundHeterozygousVariantList = new LinkedList<>(); - for (KnockoutVariant variant : transcript.getVariants()) { - List> independentTerms = new LinkedList<>(); - - // KO - Knockout types - if (variant.getKnockoutType() != null) { - independentTerms.add(Collections.singletonList(RgaUtils.encode(variant.getKnockoutType().name()))); - } - // F - Filters - if (StringUtils.isNotEmpty(variant.getFilter())) { - if (variant.getFilter().equalsIgnoreCase(RgaUtils.PASS)) { - independentTerms.add(Collections.singletonList(RgaUtils.encode(RgaUtils.PASS))); - } else { - independentTerms.add(Collections.singletonList(RgaUtils.encode(RgaUtils.NOT_PASS))); - } + // KO - Knockout types + if (variant.getKnockoutType() != null) { + independentTerms.add(Collections.singletonList(RgaUtils.encode(variant.getKnockoutType().name()))); + } + // F - Filters + if (StringUtils.isNotEmpty(variant.getFilter())) { + if (variant.getFilter().equalsIgnoreCase(RgaUtils.PASS)) { + independentTerms.add(Collections.singletonList(RgaUtils.encode(RgaUtils.PASS))); + } else { + independentTerms.add(Collections.singletonList(RgaUtils.encode(RgaUtils.NOT_PASS))); } - // CT - Consequence types - if (variant.getSequenceOntologyTerms() != null) { - List ct = new ArrayList<>(variant.getSequenceOntologyTerms().size()); - for (SequenceOntologyTerm sequenceOntologyTerm : variant.getSequenceOntologyTerms()) { - ct.add(RgaUtils.encode(sequenceOntologyTerm.getName())); - } - independentTerms.add(ct); + } + // CT - Consequence types + if (variant.getSequenceOntologyTerms() != null) { + List ct = new ArrayList<>(variant.getSequenceOntologyTerms().size()); + for (SequenceOntologyTerm sequenceOntologyTerm : variant.getSequenceOntologyTerms()) { + ct.add(RgaUtils.encode(sequenceOntologyTerm.getName())); } - // PF - Population frequencies - List pf = new LinkedList<>(); - boolean gnomad = false; - boolean thousandG = false; - if (variant.getPopulationFrequencies() != null) { - for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { - if (populationFrequency.getPopulation().equals("ALL")) { - if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { - String populationFrequencyKey = RgaUtils.getPopulationFrequencyKey(populationFrequency.getAltAlleleFreq()); - pf.add(RgaUtils.encode(RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR - + populationFrequencyKey)); - thousandG = true; - } else if (RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { - String populationFrequencyKey = RgaUtils.getPopulationFrequencyKey(populationFrequency.getAltAlleleFreq()); - pf.add(RgaUtils.encode(RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR - + populationFrequencyKey)); - gnomad = true; - } + independentTerms.add(ct); + } + // PF - Population frequencies + List pf = new LinkedList<>(); + boolean gnomad = false; + boolean thousandG = false; + if (variant.getPopulationFrequencies() != null) { + for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { + if (populationFrequency.getPopulation().equals("ALL")) { + if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + String populationFrequencyKey = RgaUtils.getPopulationFrequencyKey(populationFrequency.getAltAlleleFreq()); + pf.add(RgaUtils.encode(RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + + populationFrequencyKey)); + thousandG = true; + } else if (RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + String populationFrequencyKey = RgaUtils.getPopulationFrequencyKey(populationFrequency.getAltAlleleFreq()); + pf.add(RgaUtils.encode(RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + + populationFrequencyKey)); + gnomad = true; } } } - if (!thousandG) { - pf.add(RgaUtils.encode(RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0f)); - } - if (!gnomad) { - pf.add(RgaUtils.encode(RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0f)); - } - independentTerms.add(pf); - - if (variant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { - compoundHeterozygousVariantList.add(independentTerms); - } - - results.addAll(RgaUtils.generateCombinations(independentTerms)); } - - if (!compoundHeterozygousVariantList.isEmpty()) { - results.addAll(RgaUtils.generateCompoundHeterozygousCombinations(compoundHeterozygousVariantList)); + if (!thousandG) { + pf.add(RgaUtils.encode(RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0f)); + } + if (!gnomad) { + pf.add(RgaUtils.encode(RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0f)); } + independentTerms.add(pf); - return new ArrayList<>(results); + results.addAll(RgaUtils.generateCombinations(independentTerms)); + return independentTerms; } private List populatePhenotypes(List phenotypes) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java index ab4d342afbc..f6454fab3e0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaDataModel.java @@ -106,6 +106,9 @@ public class RgaDataModel { @Field private List compoundFilters; + @Field + private List chPairs; + @Field private List phenotypeJson; @@ -143,6 +146,7 @@ public class RgaDataModel { public static final String VARIANT_SUMMARY = "variantSummary"; public static final String INDIVIDUAL_SUMMARY = "individualSummary"; public static final String COMPOUND_FILTERS = "compoundFilters"; + public static final String CH_PAIRS = "chPairs"; public static final String PHENOTYPE_JSON = "phenotypeJson"; public static final String DISORDER_JSON = "disorderJson"; @@ -183,6 +187,7 @@ public String toString() { sb.append(", populationFrequencies=").append(populationFrequencies); sb.append(", individualSummary=").append(individualSummary); sb.append(", compoundFilters=").append(compoundFilters); + sb.append(", chPairs=").append(chPairs); sb.append(", phenotypeJson=").append(phenotypeJson); sb.append(", disorderJson=").append(disorderJson); sb.append('}'); @@ -468,6 +473,15 @@ public RgaDataModel setCompoundFilters(List compoundFilters) { return this; } + public List getChPairs() { + return chPairs; + } + + public RgaDataModel setChPairs(List chPairs) { + this.chPairs = chPairs; + return this; + } + public List getPhenotypeJson() { return phenotypeJson; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index e727e84c000..33549a393f2 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -321,7 +321,6 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY); DataResult facetFieldDataResult = rgaEngine.facetedQuery(mainCollection, query, knockoutTypeFacet); - List>> compHetVariantPairs = new LinkedList<>(); for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { CodedVariant codedVariant = CodedVariant.parseEncodedId(bucket.getValue()); if (variantId.equals(codedVariant.getId())) { @@ -337,17 +336,38 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri populationFrequencyMap.put(thousandGenomeKey, codedVariant.getThousandGenomesFrequency()); populationFrequencyMap.put(gnomadGenomeKey, codedVariant.getGnomadFrequency()); } - } else if (KnockoutVariant.KnockoutType.COMP_HET.name().equals(codedVariant.getKnockoutType())) { - // TODO: Assuming filter is PASS. We need to check that properly - compHetVariantPairs.add(Arrays.asList( - Collections.singletonList(codedVariant.getKnockoutType()), - Collections.singletonList(RgaUtils.encode(PASS)), // TODO: CHANGE !!!!! Take filter from codedVariant object - new ArrayList<>(codedVariant.getConsequenceType()), - codedVariant.getPopulationFrequencies())); } } + // Process all COMP_HET combinations if (knockoutTypes.contains(KnockoutVariant.KnockoutType.COMP_HET.name())) { + QueryOptions chPairFacet = new QueryOptions() + .append(QueryOptions.LIMIT, -1) + .append(QueryOptions.FACET, RgaDataModel.CH_PAIRS); + facetFieldDataResult = rgaEngine.facetedQuery(mainCollection, query, chPairFacet); + + List>> chVariantList = new LinkedList<>(); + for (FacetField.Bucket bucket : facetFieldDataResult.first().getBuckets()) { + CodedChPairVariants codedChVariants = CodedChPairVariants.parseEncodedId(bucket.getValue()); + CodedVariant codedVariant = null; + if (variantId.equals(codedChVariants.getMaternalCodedVariant().getId())) { + // Consider paternal variant + codedVariant = codedChVariants.getPaternalCodedVariant(); + } else if (variantId.equals(codedChVariants.getPaternalCodedVariant().getId())) { + // Consider maternal variant + codedVariant = codedChVariants.getMaternalCodedVariant(); + } + + if (codedVariant != null) { + // TODO: Assuming filter is PASS. We need to check that properly + chVariantList.add(Arrays.asList( + Collections.singletonList(codedVariant.getKnockoutType()), + Collections.singletonList(RgaUtils.encode(PASS)), // TODO: CHANGE !!!!! Take filter from codedVariant object + new ArrayList<>(codedVariant.getConsequenceType()), + codedVariant.getPopulationFrequencies())); + } + } + // TODO: Assuming filter is PASS. We need to check that properly List> currentVariantCompHetValues = Arrays.asList( Collections.singletonList(KnockoutVariant.KnockoutType.COMP_HET.name()), @@ -356,10 +376,8 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri Arrays.asList(populationFrequencyMap.get(thousandGenomeKey), populationFrequencyMap.get(gnomadGenomeKey))); // Generate combinations with current variant - for (List> otherCompoundHetVariant : compHetVariantPairs) { - compoundFilters.addAll(RgaUtils.generateCompoundHeterozygousCombinations( - Arrays.asList(currentVariantCompHetValues, otherCompoundHetVariant))); - } + compoundFilters.addAll(RgaUtils.generateCompoundHeterozygousCombinations(Collections.singletonList(currentVariantCompHetValues), + chVariantList)); } knockoutTypeFacet = new QueryOptions() @@ -1038,7 +1056,6 @@ public OpenCGAResult variantSummary(String studyStr, Q ExecutorService executor = Executors.newFixedThreadPool(4); QueryOptions queryOptions = setDefaultLimit(options); - Query auxQuery = query != null ? new Query(query) : new Query(); ResourceIds resourceIds; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index e73fea90ccd..4fe77d9f703 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -264,21 +264,35 @@ static KeyOpValue parseKeyOpValue(String value) { } } - public static Set generateCompoundHeterozygousCombinations(List>> compoundHeterozygousVariantList) - throws RgaException { - if (compoundHeterozygousVariantList.size() < 2) { + public static Set generateCompoundHeterozygousCombinations(List>> maternalChVariantList, + List>> paternalChVariantList) throws RgaException { + if (maternalChVariantList.isEmpty() || paternalChVariantList.isEmpty()) { return Collections.emptySet(); } Set result = new HashSet<>(); - for (int i = 0; i < compoundHeterozygousVariantList.size() - 1; i++) { - for (int j = i + 1; j < compoundHeterozygousVariantList.size(); j++) { - result.addAll(generateCompoundHeterozygousPairCombination(compoundHeterozygousVariantList.get(i), - compoundHeterozygousVariantList.get(j))); + for (List> maternalVariant : maternalChVariantList) { + for (List> paternalVariant : paternalChVariantList) { + result.addAll(generateCompoundHeterozygousPairCombination(maternalVariant, paternalVariant)); } } return result; } +// public static Set generateCompoundHeterozygousCombinations(List>> compoundHeterozygousVariantList) +// throws RgaException { +// if (compoundHeterozygousVariantList.size() < 2) { +// return Collections.emptySet(); +// } +// Set result = new HashSet<>(); +// for (int i = 0; i < compoundHeterozygousVariantList.size() - 1; i++) { +// for (int j = i + 1; j < compoundHeterozygousVariantList.size(); j++) { +// result.addAll(generateCompoundHeterozygousPairCombination(compoundHeterozygousVariantList.get(i), +// compoundHeterozygousVariantList.get(j))); +// } +// } +// return result; +// } + public static Set generateCompoundHeterozygousPairCombination(List> variant1, List> variant2) throws RgaException { List> result = new LinkedList<>(); @@ -630,6 +644,10 @@ public String getDbSnp() { return dbSnp; } + public String getParentalOrigin() { + return parentalOrigin; + } + public List getClinicalSignificances() { return clinicalSignificances; } @@ -689,6 +707,64 @@ public String getGnomadFrequency() { } } + public static class CodedChPairVariants { + private final static String VARIANT_SEPARATOR; + + static { + VARIANT_SEPARATOR = "--_--"; + } + + private CodedVariant maternalCodedVariant; + private CodedVariant paternalCodedVariant; + + public CodedChPairVariants(CodedVariant maternalCodedVariant, CodedVariant paternalCodedVariant) { + this.maternalCodedVariant = maternalCodedVariant; + this.paternalCodedVariant = paternalCodedVariant; + } + + public static CodedChPairVariants parseEncodedId(String encodedId) throws RgaException { + String[] split = encodedId.split(VARIANT_SEPARATOR); + if (split.length != 2) { + throw new RgaException("Unexpected CH variant string received '" + encodedId + + "'. Expected {variant1}" + VARIANT_SEPARATOR + "{variant2}"); + } + + return new CodedChPairVariants(decodeEncodedVariantId(split[0]), decodeEncodedVariantId(split[1])); + } + + public String getEncodedId() { + return getEncodedVariant(maternalCodedVariant) + VARIANT_SEPARATOR + getEncodedVariant(paternalCodedVariant); + } + + public CodedVariant getMaternalCodedVariant() { + return maternalCodedVariant; + } + + public CodedVariant getPaternalCodedVariant() { + return paternalCodedVariant; + } + + private static String getEncodedVariant(CodedVariant codedVariant) { + return codedVariant.getId() + SEPARATOR + codedVariant.getParentalOrigin() + SEPARATOR + + StringUtils.join(codedVariant.getConsequenceType(), INNER_SEPARATOR) + SEPARATOR + + StringUtils.join(codedVariant.getPopulationFrequencies(), INNER_SEPARATOR); + } + + private static CodedVariant decodeEncodedVariantId(String encodedVariant) throws RgaException { + String[] split = encodedVariant.split(SEPARATOR); + if (split.length != 4) { + throw new RgaException("Unexpected encoded variant '" + encodedVariant + "'. " + + "Expected {id}__{parentalOrigin}__{conseqType}__{popFreqs}"); + } + Set consequenceType = new HashSet<>(Arrays.asList(split[2].split(INNER_SEPARATOR))); + String[] popFreqs = split[3].split(INNER_SEPARATOR); + + return new CodedVariant("", split[0], "", "", KnockoutVariant.KnockoutType.COMP_HET.name(), split[1], Collections.emptyList(), + new ArrayList<>(consequenceType), popFreqs[0], popFreqs[1]); + } + + } + public static class KnockoutTypeCount { private Set variantIdQuery; private Set dbSnpQuery; diff --git a/opencga-clinical/src/main/resources/rga/managed-schema b/opencga-clinical/src/main/resources/rga/managed-schema index f30ecd1384a..bc684da814a 100644 --- a/opencga-clinical/src/main/resources/rga/managed-schema +++ b/opencga-clinical/src/main/resources/rga/managed-schema @@ -597,6 +597,7 @@ + From ad595ae2ed7584ab6d2441017c1a23906b01460e Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 13 May 2021 18:03:38 +0200 Subject: [PATCH 315/412] analysis: fix gene query/summary numMatches, #1693 --- .../main/java/org/opencb/opencga/analysis/rga/RgaManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index e727e84c000..71079c2fcf4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -588,7 +588,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Future numMatchesFuture = null; if (options.getBoolean(QueryOptions.COUNT)) { numMatchesFuture = executor.submit(() -> { - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaQueryParams.GENE_ID + ")"); + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaQueryParams.GENE_ID.key() + ")"); try { DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); return ((Number) result.first().getAggregationValues().get(0)).intValue(); @@ -964,7 +964,7 @@ public OpenCGAResult geneSummary(String studyStr, Query q Future numMatchesFuture = null; if (options.getBoolean(QueryOptions.COUNT)) { numMatchesFuture = executor.submit(() -> { - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaQueryParams.GENE_ID + ")"); + QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + RgaQueryParams.GENE_ID.key() + ")"); try { DataResult result = rgaEngine.facetedQuery(collection, auxQuery, facetOptions); return ((Number) result.first().getAggregationValues().get(0)).intValue(); From ce8a5a358d62eb3f567bb134ecbe9c3b2df316a3 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 14 May 2021 11:30:09 +0200 Subject: [PATCH 316/412] analysis: fix how to variant storage data is processed --- .../opencb/opencga/analysis/rga/RgaUtils.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index e73fea90ccd..185c402750f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -489,7 +489,7 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, } // Convert just once - knockoutVariant = convertToKnockoutVariant(variant, sampleEntry, knockoutType); + knockoutVariant = convertToKnockoutVariant(variant, rgaDataModel.getTranscriptId(), sampleEntry, knockoutType); } else if (CollectionUtils.isNotEmpty(rgaDataModel.getVariantSummary())) { String variantSummaryId = rgaDataModel.getVariantSummary().get(i); // Get the basic information from variant summary object @@ -528,21 +528,29 @@ static List extractKnockoutVariants(RgaDataModel rgaDataModel, } static KnockoutVariant convertToKnockoutVariant(Variant variant) { - return convertToKnockoutVariant(variant, null, null); + return convertToKnockoutVariant(variant, null, null, null); } // Default converter - static KnockoutVariant convertToKnockoutVariant(Variant variant, SampleEntry sampleEntry, KnockoutVariant.KnockoutType knockoutType) { + static KnockoutVariant convertToKnockoutVariant(Variant variant, String transcriptId, SampleEntry sampleEntry, + KnockoutVariant.KnockoutType knockoutType) { StudyEntry studyEntry = CollectionUtils.isNotEmpty(variant.getStudies()) ? variant.getStudies().get(0) : null; - // TODO: Check fileentry + FileEntry fileEntry = studyEntry != null && CollectionUtils.isNotEmpty(studyEntry.getFiles()) - ? studyEntry.getFiles().get(0) + ? studyEntry.getFiles().get(sampleEntry.getFileIndex()) : null; VariantAnnotation variantAnnotation = variant.getAnnotation(); - // TODO: Check consequence type - ConsequenceType consequenceType = variantAnnotation != null && CollectionUtils.isNotEmpty(variantAnnotation.getConsequenceTypes()) - ? variantAnnotation.getConsequenceTypes().get(0) - : null; + + ConsequenceType consequenceType = null; + if (variantAnnotation != null && StringUtils.isNotEmpty(transcriptId) + && CollectionUtils.isNotEmpty(variantAnnotation.getConsequenceTypes())) { + for (ConsequenceType ct : variantAnnotation.getConsequenceTypes()) { + if (transcriptId.equals(ct.getEnsemblTranscriptId())) { + consequenceType = ct; + break; + } + } + } return new KnockoutVariant(variant, studyEntry, fileEntry, sampleEntry, variantAnnotation, consequenceType, knockoutType); } From 1bfe77c0b7f94db1e47e8b05ddeb6cd566fe1714 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 14 May 2021 16:44:09 +0200 Subject: [PATCH 317/412] catalog: minor fixes --- .../mongodb/converters/AnnotationConverter.java | 2 +- .../converters/ClinicalAnalysisConverter.java | 14 ++++++++------ .../mongodb/converters/OpenCgaMongoConverter.java | 15 --------------- .../iterators/CohortCatalogMongoDBIterator.java | 8 ++++---- .../iterators/FamilyCatalogMongoDBIterator.java | 2 +- .../iterators/FileCatalogMongoDBIterator.java | 14 ++++++++------ .../IndividualCatalogMongoDBIterator.java | 9 +++++---- .../iterators/JobCatalogMongoDBIterator.java | 4 ++-- .../iterators/SampleCatalogMongoDBIterator.java | 6 +++--- .../opencb/opencga/catalog/utils/ParamUtils.java | 2 +- 10 files changed, 33 insertions(+), 43 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/AnnotationConverter.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/AnnotationConverter.java index 51fe0f21cf0..a4ee107e324 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/AnnotationConverter.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/AnnotationConverter.java @@ -797,7 +797,7 @@ private boolean passTheFilters(Document document, Set include, Set sampleMap = new HashMap<>(); for (Document sample : samples) { - long uid = getLongValue(sample, SampleDBAdaptor.QueryParams.UID.key()); + long uid = ((Number) sample.get(SampleDBAdaptor.QueryParams.UID.key())).longValue(); if (uid > 0) { Sample tmpSample = new Sample() .setUid(uid) @@ -120,7 +120,8 @@ public void validateProbandToUpdate(Document document) { validateSamplesToUpdate(proband); document.put(ClinicalAnalysisDBAdaptor.QueryParams.PROBAND.key(), new Document() - .append(IndividualDBAdaptor.QueryParams.UID.key(), getLongValue(proband, IndividualDBAdaptor.QueryParams.UID.key())) + .append(IndividualDBAdaptor.QueryParams.UID.key(), + ((Number) proband.get(IndividualDBAdaptor.QueryParams.UID.key())).longValue()) .append(IndividualDBAdaptor.QueryParams.ID.key(), proband.getString(IndividualDBAdaptor.QueryParams.ID.key())) .append(IndividualDBAdaptor.QueryParams.VERSION.key(), proband.getInteger(IndividualDBAdaptor.QueryParams.VERSION.key())) @@ -140,7 +141,8 @@ public void validateFamilyMembersToUpdate(Document document) { document.put(FamilyDBAdaptor.QueryParams.MEMBERS.key(), members.stream().map(entry -> new Document() - .append(IndividualDBAdaptor.QueryParams.UID.key(), getLongValue(entry, IndividualDBAdaptor.QueryParams.UID.key())) + .append(IndividualDBAdaptor.QueryParams.UID.key(), + ((Number) entry.get(IndividualDBAdaptor.QueryParams.UID.key())).longValue()) .append(IndividualDBAdaptor.QueryParams.ID.key(), entry.getString(IndividualDBAdaptor.QueryParams.ID.key())) .append(IndividualDBAdaptor.QueryParams.SAMPLES.key(), entry.get(IndividualDBAdaptor.QueryParams.SAMPLES.key())) ) @@ -156,7 +158,7 @@ public void validateFamilyToUpdate(Document document) { validateFamilyMembersToUpdate(family); document.put(ClinicalAnalysisDBAdaptor.QueryParams.FAMILY.key(), new Document() - .append(FamilyDBAdaptor.QueryParams.UID.key(), getLongValue(family, FamilyDBAdaptor.QueryParams.UID.key())) + .append(FamilyDBAdaptor.QueryParams.UID.key(), ((Number) family.get(FamilyDBAdaptor.QueryParams.UID.key())).longValue()) .append(FamilyDBAdaptor.QueryParams.ID.key(), family.get(FamilyDBAdaptor.QueryParams.ID.key())) .append(FamilyDBAdaptor.QueryParams.VERSION.key(), family.getInteger(FamilyDBAdaptor.QueryParams.VERSION.key())) .append(FamilyDBAdaptor.QueryParams.MEMBERS.key(), family.get(FamilyDBAdaptor.QueryParams.MEMBERS.key())) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/OpenCgaMongoConverter.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/OpenCgaMongoConverter.java index 3e4dbb1b9e3..5a1fc375686 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/OpenCgaMongoConverter.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/OpenCgaMongoConverter.java @@ -1,7 +1,6 @@ package org.opencb.opencga.catalog.db.mongodb.converters; import com.fasterxml.jackson.databind.ObjectMapper; -import org.bson.Document; import org.opencb.commons.datastore.mongodb.GenericDocumentComplexConverter; public class OpenCgaMongoConverter extends GenericDocumentComplexConverter { @@ -14,18 +13,4 @@ public OpenCgaMongoConverter(Class clazz, ObjectMapper objectMapper) { super(clazz, objectMapper); } - /** - * This method returns the long value of the key given. - * @param document Document with the field - * @param key Field name to be converted - * @return Long converted value - */ - public static Long getLongValue(Document document, String key) { - try { - return document.getLong(key); - } catch (ClassCastException e) { - return document.getInteger(key).longValue(); - } - } - } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/CohortCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/CohortCatalogMongoDBIterator.java index 69b0d6773a9..7a0ae65f2c6 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/CohortCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/CohortCatalogMongoDBIterator.java @@ -110,7 +110,7 @@ private void fetchNextBatch() { Document cohortDocument = mongoCursor.next(); if (user != null && studyUid <= 0) { - studyUid = cohortDocument.getLong(PRIVATE_STUDY_UID); + studyUid = ((Number) cohortDocument.get(PRIVATE_STUDY_UID)).longValue(); } cohortListBuffer.add(cohortDocument); @@ -124,7 +124,7 @@ private void fetchNextBatch() { if (sampleList.size() > 100) { fetchSampleIdsOnly = true; } - sampleList.forEach(sample -> sampleSet.add(sample.getLong(SampleDBAdaptor.QueryParams.UID.key()))); + sampleList.forEach(sample -> sampleSet.add(((Number) sample.get(SampleDBAdaptor.QueryParams.UID.key())).longValue())); } } } @@ -153,7 +153,7 @@ private void fetchNextBatch() { // Map each sample uid - version to the sample entry Map sampleMap = new HashMap<>(sampleList.size()); sampleList.forEach(sample -> - sampleMap.put(sample.getLong(SampleDBAdaptor.QueryParams.UID.key()), sample) + sampleMap.put(((Number) sample.get(SampleDBAdaptor.QueryParams.UID.key())).longValue(), sample) ); // Add the samples obtained to the corresponding cohorts @@ -162,7 +162,7 @@ private void fetchNextBatch() { List samples = (List) cohortDocument.get(CohortDBAdaptor.QueryParams.SAMPLES.key()); samples.forEach(sample -> { - long uid = sample.getLong(SampleDBAdaptor.QueryParams.UID.key()); + long uid = ((Number) sample.get(SampleDBAdaptor.QueryParams.UID.key())).longValue(); // If the samples has been returned... (it might have not been fetched due to permissions issues) if (sampleMap.containsKey(uid)) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/FamilyCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/FamilyCatalogMongoDBIterator.java index 43e6e13827c..b16e9cc4f20 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/FamilyCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/FamilyCatalogMongoDBIterator.java @@ -111,7 +111,7 @@ private void fetchNextBatch() { Document familyDocument = mongoCursor.next(); if (user != null && studyUid <= 0) { - studyUid = familyDocument.getLong(PRIVATE_STUDY_UID); + studyUid = ((Number) familyDocument.get(PRIVATE_STUDY_UID)).longValue(); } familyListBuffer.add(familyDocument); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/FileCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/FileCatalogMongoDBIterator.java index 75a41537256..3dded7bdb78 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/FileCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/FileCatalogMongoDBIterator.java @@ -108,20 +108,21 @@ private void fetchNextBatch() { Document fileDocument = mongoCursor.next(); if (user != null && studyUid <= 0) { - studyUid = fileDocument.getLong(PRIVATE_STUDY_UID); + studyUid = ((Number) fileDocument.get(PRIVATE_STUDY_UID)).longValue(); } fileListBuffer.add(fileDocument); counter++; - String fileUid = String.valueOf(fileDocument.getLong(FileDBAdaptor.QueryParams.UID.key())); + String fileUid = String.valueOf(fileDocument.get(FileDBAdaptor.QueryParams.UID.key())); // Extract all the related files Object relatedFiles = fileDocument.get(FileDBAdaptor.QueryParams.RELATED_FILES.key()); if (relatedFiles != null && !options.getBoolean(NATIVE_QUERY)) { List relatedFileList = (List) relatedFiles; if (!relatedFileList.isEmpty()) { for (Document relatedFile : relatedFileList) { - long relatedFileUid = ((Document) relatedFile.get("file")).getLong(FileDBAdaptor.QueryParams.UID.key()); + long relatedFileUid = ((Number) ((Document) relatedFile.get("file")).get(FileDBAdaptor.QueryParams.UID.key())) + .longValue(); relatedFileSet.add(relatedFileUid); relatedFileMap.put(fileUid + "-" + relatedFileUid, relatedFile.getString("relation")); } @@ -151,12 +152,12 @@ private void fetchNextBatch() { // Map each file uid to the file entry Map fileMap = new HashMap<>(fileList.size()); fileList.forEach(file-> - fileMap.put(file.getLong(FileDBAdaptor.QueryParams.UID.key()), file) + fileMap.put(((Number) file.get(FileDBAdaptor.QueryParams.UID.key())).longValue(), file) ); // Add the files obtained to the corresponding related files fileListBuffer.forEach(fileDocument -> { - String fileId = String.valueOf(fileDocument.getLong(FileDBAdaptor.QueryParams.UID.key())); + String fileId = String.valueOf(fileDocument.get(FileDBAdaptor.QueryParams.UID.key())); List tmpFileList = new ArrayList<>(); @@ -165,7 +166,8 @@ private void fetchNextBatch() { List relatedFileList = (List) relatedFiles; if (!relatedFileList.isEmpty()) { relatedFileList.forEach(f -> { - long relatedFileUid = ((Document) f.get("file")).getLong(FileDBAdaptor.QueryParams.UID.key()); + long relatedFileUid = ((Number) ((Document) f.get("file")).get(FileDBAdaptor.QueryParams.UID.key())) + .longValue(); String auxFileId = fileId + "-" + relatedFileUid; String relation = relatedFileMap.get(auxFileId); tmpFileList.add(new Document() diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/IndividualCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/IndividualCatalogMongoDBIterator.java index d6e775c61ec..3b3b2ab92a3 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/IndividualCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/IndividualCatalogMongoDBIterator.java @@ -114,7 +114,7 @@ private void fetchNextBatch() { Document individualDocument = (Document) mongoCursor.next(); if (user != null && studyUid <= 0) { - studyUid = individualDocument.getLong(PRIVATE_STUDY_UID); + studyUid = ((Number) individualDocument.get(PRIVATE_STUDY_UID)).longValue(); } individualListBuffer.add(individualDocument); @@ -164,7 +164,8 @@ private void fetchNextBatch() { } for (Document individual : individualDataResult.getResults()) { - List parentList = individualMap.get(individual.getLong(IndividualDBAdaptor.QueryParams.UID.key())); + List parentList = + individualMap.get(((Number) individual.get(IndividualDBAdaptor.QueryParams.UID.key())).longValue()); for (Document parentDocument : parentList) { parentDocument.put(IndividualDBAdaptor.QueryParams.ID.key(), individual.getString(IndividualDBAdaptor.QueryParams.ID.key())); @@ -236,8 +237,8 @@ private void fetchNextBatch() { private void addParentToMap(Map> individualMap, Document parent) { if (parent != null && parent.size() > 0) { - Long uid = parent.getLong("uid"); - if (uid != null && uid > 0) { + long uid = ((Number) parent.get("uid")).longValue(); + if (uid > 0) { if (!individualMap.containsKey(uid)) { individualMap.put(uid, new ArrayList<>()); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/JobCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/JobCatalogMongoDBIterator.java index 27771fcfdb5..d56560d0650 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/JobCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/JobCatalogMongoDBIterator.java @@ -106,7 +106,7 @@ protected void fetchNextBatch(Queue buffer, int bufferSize) { // Map each fileId uid to the file entry Map fileMap = fileDocuments .stream() - .collect(Collectors.toMap(d -> d.getLong(FileDBAdaptor.QueryParams.UID.key()), d -> d)); + .collect(Collectors.toMap(d -> ((Number) d.get(FileDBAdaptor.QueryParams.UID.key())).longValue(), d -> d)); buffer.forEach(job -> { setDocuments(fileMap, job, JobDBAdaptor.QueryParams.INPUT); @@ -136,7 +136,7 @@ protected void fetchNextBatch(Queue buffer, int bufferSize) { // Map each job uid to the job entry Map jobMap = jobDocuments .stream() - .collect(Collectors.toMap(d -> d.getLong(JobDBAdaptor.QueryParams.UID.key()), d -> d)); + .collect(Collectors.toMap(d -> ((Number) d.get(JobDBAdaptor.QueryParams.UID.key())).longValue(), d -> d)); buffer.forEach(job -> { setDocuments(jobMap, job, JobDBAdaptor.QueryParams.DEPENDS_ON); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/SampleCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/SampleCatalogMongoDBIterator.java index c8170b29c1c..c1fcc00f1f8 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/SampleCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/SampleCatalogMongoDBIterator.java @@ -108,7 +108,7 @@ private void fetchNextBatch() { Document sampleDocument = mongoCursor.next(); if (user != null && studyUid <= 0) { - studyUid = sampleDocument.getLong(PRIVATE_STUDY_UID); + studyUid = ((Number) sampleDocument.get(PRIVATE_STUDY_UID)).longValue(); } sampleListBuffer.add(sampleDocument); @@ -117,7 +117,7 @@ private void fetchNextBatch() { // Extract the sample uids if (!options.getBoolean(NATIVE_QUERY) && options.getBoolean(ParamConstants.SAMPLE_INCLUDE_INDIVIDUAL_PARAM)) { // Extract the sample uid - sampleUidMap.put(sampleDocument.getLong(SampleDBAdaptor.QueryParams.UID.key()), sampleDocument); + sampleUidMap.put(((Number) sampleDocument.get(SampleDBAdaptor.QueryParams.UID.key())).longValue(), sampleDocument); } } @@ -144,7 +144,7 @@ private void fetchNextBatch() { if (samples != null) { individual.remove(IndividualMongoDBAdaptor.QueryParams.SAMPLES.key()); samples.forEach(s -> { - long uid = s.getLong(SampleDBAdaptor.QueryParams.UID.key()); + long uid = ((Number) s.get(SampleDBAdaptor.QueryParams.UID.key())).longValue(); Document sample = sampleUidMap.get(uid); if (sample != null) { // If the sample exists diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java index da6ae0fb58a..3d1c6d87c79 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/ParamUtils.java @@ -132,7 +132,7 @@ public static void checkAlias(String alias, String name) throws CatalogParameter } public static void checkIdentifier(String identifier, String name) throws CatalogParameterException { - if (identifier == null || identifier.isEmpty() || !identifier.matches("^[A-Za-z][A-Za-z0-9-_.]*[A-Za-z0-9]$")) { + if (identifier == null || identifier.isEmpty() || !identifier.matches("^[A-Za-z0-9][A-Za-z0-9-_.]*[A-Za-z0-9]$")) { throw new CatalogParameterException("Error in identifier: Invalid identifier format for '" + name + "'."); } } From c77c7f5b502aa8679251c7e360ca7015505bbde5 Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 14 May 2021 14:45:49 +0000 Subject: [PATCH 318/412] GitBook: [develop] one page modified --- docs/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/README.md b/docs/README.md index d419a7b0f40..e529eb440ea 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,7 @@ +--- +description: Welcome to OpenCGA! +--- + # Home {% hint style="warning" %} From 08ddd8d0a2199d3814edfb9dca7a57bde336e05f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 14 May 2021 16:17:52 +0100 Subject: [PATCH 319/412] storage: Remove duplicated StudyMetadata query --- .../index/SampleIndexVariantAggregationExecutor.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java index 0e1507b622e..4dbf88fc9e9 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java @@ -23,6 +23,7 @@ import org.opencb.opencga.storage.core.variant.query.executors.accumulators.*; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; +import org.opencb.opencga.storage.hadoop.variant.index.query.SampleIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexDBAdaptor; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexQueryParser; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; @@ -67,7 +68,7 @@ protected boolean canUseThisExecutor(Query query, QueryOptions options, String f // Check if the query is fully covered Query filteredQuery = new Query(query); - sampleIndexDBAdaptor.parseSampleIndexQuery(filteredQuery); + SampleIndexQuery sampleIndexQuery = sampleIndexDBAdaptor.parseSampleIndexQuery(filteredQuery); Set params = VariantQueryUtils.validParams(filteredQuery, true); params.remove(VariantQueryParam.STUDY); @@ -80,16 +81,12 @@ protected boolean canUseThisExecutor(Query query, QueryOptions options, String f return false; } - SampleIndexSchema schema = null; + SampleIndexSchema schema = sampleIndexQuery.getSchema(); for (String fieldFacedMulti : facet.split(FACET_SEPARATOR)) { for (String fieldFaced : fieldFacedMulti.split(NESTED_FACET_SEPARATOR)) { String key = fieldFaced.split("\\[")[0]; // Must contain all keys if (!VALID_FACETS.contains(key)) { - if (schema == null) { - StudyMetadata defaultStudy = VariantQueryParser.getDefaultStudy(query, metadataManager); - schema = sampleIndexDBAdaptor.getSchema(defaultStudy.getId()); - } if (key.equalsIgnoreCase("depth") || key.equalsIgnoreCase("coverage")) { key = "dp"; } From 350cefed5e37c287318294c164005bef8a37fcf4 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 14 May 2021 21:41:46 +0200 Subject: [PATCH 320/412] analysis: fix npe --- .../src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index 2fa7014f4f4..0a4fb3be2b7 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -550,7 +550,7 @@ static KnockoutVariant convertToKnockoutVariant(Variant variant, String transcri KnockoutVariant.KnockoutType knockoutType) { StudyEntry studyEntry = CollectionUtils.isNotEmpty(variant.getStudies()) ? variant.getStudies().get(0) : null; - FileEntry fileEntry = studyEntry != null && CollectionUtils.isNotEmpty(studyEntry.getFiles()) + FileEntry fileEntry = studyEntry != null && CollectionUtils.isNotEmpty(studyEntry.getFiles()) && sampleEntry != null ? studyEntry.getFiles().get(sampleEntry.getFileIndex()) : null; VariantAnnotation variantAnnotation = variant.getAnnotation(); From 7b2efa093259df88ea367f7a7f3ecbed41a96e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Mon, 17 May 2021 11:55:15 +0100 Subject: [PATCH 321/412] k8s: Add configurable sha256 for opencga images --- .../kubernetes/charts/opencga/values.yaml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index 4342f824b5f..e0c69f41edb 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -17,7 +17,7 @@ mongodb: # https://docs.mongodb.com/kubernetes-operator/stable/tutorial/resize-pv-storage/ deploy: enabled: false - name: "rs0" + name: "opencga-mongodb-rs0" version: "4.2.6" replicas: 3 @@ -99,6 +99,11 @@ opencga: # secretName: {{ include "opencga.fullname" . }}-secret admin: password: "FILL_ME" + images: + base: + sha256: "" + init: + sha256: "" # https://docs.microsoft.com/en-gb/azure/aks/azure-files-volume azureStorageAccount: @@ -127,7 +132,7 @@ rest: replicaCount: 3 image: - repository: "opencb/opencga-base:{{ .Chart.AppVersion }}-{{ .Values.hadoop.flavour }}" + repository: "opencb/opencga-base:{{ .Chart.AppVersion }}-{{ .Values.hadoop.flavour }}{{ if .Values.opencga.images.base.sha256 }}@sha256:{{ .Values.opencga.images.base.sha256 }}{{ end }}" pullPolicy: IfNotPresent imagePullSecrets: [] @@ -135,9 +140,6 @@ rest: serviceAccount: # Specifies whether a service account should be created create: true - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: podSecurityContext: runAsNonRoot: true @@ -202,7 +204,7 @@ master: replicaCount: 1 image: - repository: "opencb/opencga-base:{{ .Chart.AppVersion }}-{{ .Values.hadoop.flavour }}" + repository: "opencb/opencga-base:{{ .Chart.AppVersion }}-{{ .Values.hadoop.flavour }}{{ if .Values.opencga.images.base.sha256 }}@sha256:{{ .Values.opencga.images.base.sha256 }}{{ end }}" pullPolicy: IfNotPresent imagePullSecrets: [] @@ -211,9 +213,6 @@ master: serviceAccount: # Specifies whether a service account should be created create: true - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: podSecurityContext: runAsNonRoot: true @@ -251,7 +250,7 @@ master: init: name: init image: - repository: "opencb/opencga-init:{{ .Chart.AppVersion }}-{{ .Values.hadoop.flavour }}" + repository: "opencb/opencga-init:{{ .Chart.AppVersion }}-{{ .Values.hadoop.flavour }}{{ if .Values.opencga.images.init.sha256 }}@sha256:{{ .Values.opencga.images.init.sha256 }}{{ end }}" pullPolicy: IfNotPresent configuration: From 05b874cabd82c666e4e45acf2cc48674f54269dc Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 17 May 2021 16:41:41 +0200 Subject: [PATCH 322/412] analysis: implement solr join to get list of variant ids, #1693 --- .../opencga/analysis/rga/RgaEngine.java | 35 ++++++++++++------- .../opencga/analysis/rga/RgaManager.java | 20 +++-------- .../opencga/analysis/rga/RgaQueryParser.java | 2 +- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java index 91051170175..2c1060784ff 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaEngine.java @@ -1,6 +1,7 @@ package org.opencb.opencga.analysis.rga; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; @@ -244,21 +245,31 @@ public long count(String collection, Query query) throws RgaException, IOExcepti } /** - * Return faceted data from the auxiliar RGA Solr core/collection given a query. + * Performs a facet query from the auxiliar collection by joining other queries that need to run over the main collection. * - * @param collection Collection name - * @param query Query - * @param queryOptions Query options (contains the facet and facetRange options) - * @return List of KnockoutByIndividual objects - * @throws RgaException RgaException - * @throws IOException IOException + * @param collection Auxiliar collection id. + * @param externalCollection Main collection id. + * @param query Auxiliar collection query. + * @param externalQuery Main collection query. + * @param queryOptions QueryOptions (facet). + * @return A DataResult + * @throws RgaException RgaException. + * @throws IOException IOException. */ - public DataResult auxFacetedQuery(String collection, Query query, QueryOptions queryOptions) - throws RgaException, IOException { - SolrQuery solrQuery = parser.parseAuxQuery(query); - return facetedQuery(collection, solrQuery, queryOptions); - } + public DataResult joinFacetQuery(String collection, String externalCollection, Query query, Query externalQuery, + QueryOptions queryOptions) throws RgaException, IOException { + SolrQuery mainSolrQuery = parser.parseAuxQuery(query); + SolrQuery externalSolrQuery = parser.parseQuery(externalQuery); + + if (externalSolrQuery.getFilterQueries() != null && externalSolrQuery.getFilterQueries().length > 0) { + String externalQueryStr = StringUtils.join(externalSolrQuery.getFilterQueries(), " AND "); + mainSolrQuery.set("v1", externalQueryStr); + mainSolrQuery.addFilterQuery("{!join from=" + RgaDataModel.VARIANTS + " to=" + AuxiliarRgaDataModel.ID + + " fromIndex=" + externalCollection + " v=$v1}"); + } + return facetedQuery(collection, mainSolrQuery, queryOptions); + } /** * Return faceted data from the main RGA Solr core/collection given a query. diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 1c6294635d7..b39057ed8e6 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -13,7 +13,6 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.CollectionUtils; -import org.opencb.opencga.analysis.rga.RgaUtils.*; import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; @@ -1198,26 +1197,15 @@ private ResourceIds getVariantIds(String mainCollection, String auxCollection, Q Query mainCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), true); Query auxCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), false); - if (!mainCollQuery.isEmpty()) { - // Perform a facet in the main collection because the user is filtering by other fields not present in the auxiliar coll - QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, RgaDataModel.VARIANTS); - facetOptions.putIfNotNull(QueryOptions.LIMIT, -1); - - DataResult result = rgaEngine.facetedQuery(mainCollection, query, facetOptions); - if (result.getNumResults() == 0) { - throw RgaException.noResultsMatching(); - } - - ids = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - auxCollQuery.put(RgaDataModel.VARIANTS, ids); - } + // Make a join with the main collection to get all the data we need !! // Get number of matches if (options.getBoolean(QueryOptions.COUNT)) { numMatchesFuture = executor.submit(() -> { QueryOptions facetOptions = new QueryOptions(QueryOptions.FACET, "unique(" + AuxiliarRgaDataModel.ID + ")"); try { - DataResult result = rgaEngine.auxFacetedQuery(auxCollection, auxCollQuery, facetOptions); + DataResult result = rgaEngine.joinFacetQuery(auxCollection, mainCollection, auxCollQuery, mainCollQuery, + facetOptions); return ((Number) result.first().getAggregationValues().get(0)).intValue(); } catch (Exception e) { logger.error("Could not obtain the count: {}", e.getMessage(), e); @@ -1231,7 +1219,7 @@ private ResourceIds getVariantIds(String mainCollection, String auxCollection, Q facetOptions.putIfNotNull(QueryOptions.LIMIT, options.get(QueryOptions.LIMIT)); facetOptions.putIfNotNull(QueryOptions.SKIP, options.get(QueryOptions.SKIP)); - DataResult result = rgaEngine.auxFacetedQuery(auxCollection, auxCollQuery, facetOptions); + DataResult result = rgaEngine.joinFacetQuery(auxCollection, mainCollection, auxCollQuery, mainCollQuery, facetOptions); if (result.getNumResults() == 0) { throw RgaException.noResultsMatching(); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java index 9b61877cc64..128749ac084 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaQueryParser.java @@ -127,7 +127,7 @@ private void parseMainCollCompoundFilters(Query query, List filterList) parseStringValue(entry.getValue(), RgaDataModel.POPULATION_FREQUENCIES.replace("*", entry.getKey()), filterList, "||"); } } - } else { + } else if (count > 1) { parseCompoundFilters(knockoutValues, filterValue, ctValues, popFreqValues, filterList); } } From d5f1429337bca411cda5d7529cb4f004206479de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 18 May 2021 11:32:20 +0100 Subject: [PATCH 323/412] app: Fix operations variant-stats-index command. #1749 --- .../app/cli/internal/options/VariantCommandOptions.java | 8 ++++++++ .../opencga/app/cli/main/OpencgaCliOptionsParser.java | 1 + 2 files changed, 9 insertions(+) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index 405cc9d4f74..7b18298c7e5 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -424,6 +424,14 @@ public void setCohortIds(List cohortIds) { @Parameter(names = {"--aggregation-mapping-file"}, description = "File containing population names mapping in an aggregated VCF file") public String aggregationMappingFile; + + @Parameter(names = {"--index"}, hidden = true, description = "UNUSED. Index functionality moved to operations variant-stats-index", arity = 0) + @Deprecated + public void setIndex(Boolean index) { + if (index != null && index) { + throw new ParameterException("Deprecated param --index . Index functionality has been moved to 'operations variant-stats-index'"); + } + } } @Parameters(commandNames = {GenericVariantScoreIndexCommandOptions.SCORE_INDEX_COMMAND}, commandDescription = GenericVariantScoreIndexCommandOptions.SCORE_INDEX_COMMAND_DESCRIPTION) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index 614108c6a4e..322dbb79d1b 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -318,6 +318,7 @@ public OpencgaCliOptionsParser() { JCommander operationsSubCommands = jCommander.getCommands().get(OPERATIONS_COMMAND); operationsSubCommands.addCommand(VARIANT_CONFIGURE, operationsCommandOptions.variantConfigure); operationsSubCommands.addCommand(VARIANT_INDEX_LAUNCHER, operationsCommandOptions.variantIndexLauncher); + operationsSubCommands.addCommand(VARIANT_STATS_INDEX, operationsCommandOptions.variantStatsIndex); operationsSubCommands.addCommand(VARIANT_SECONDARY_INDEX, operationsCommandOptions.variantSecondaryIndex); operationsSubCommands.addCommand(VARIANT_SECONDARY_INDEX_DELETE, operationsCommandOptions.variantSecondaryIndexDelete); operationsSubCommands.addCommand(VARIANT_ANNOTATION_INDEX, operationsCommandOptions.variantAnnotation); From 06456d15fc958856699f6767f718c9f75ba80718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 18 May 2021 12:05:53 +0100 Subject: [PATCH 324/412] storage: Add alias for VariantAnnotation.geneCancerAssociations to handle property renaming --- .../variant/io/json/mixin/VariantAnnotationMixin.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/json/mixin/VariantAnnotationMixin.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/json/mixin/VariantAnnotationMixin.java index df2740867bf..4d0216b4aa6 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/json/mixin/VariantAnnotationMixin.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/json/mixin/VariantAnnotationMixin.java @@ -16,7 +16,11 @@ package org.opencb.opencga.storage.core.variant.io.json.mixin; +import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.opencb.biodata.models.variant.avro.GeneCancerAssociation; + +import java.util.List; /** * Created by jacobo on 2/02/15. @@ -24,4 +28,8 @@ @JsonIgnoreProperties({"proteinSubstitutionScores", "variantTraitAssociation"}) public abstract class VariantAnnotationMixin { + + @JsonAlias("cancerGeneAssociations") + public abstract List getGeneCancerAssociations(); + } From 020fffcdeaa14363847918856b03e392b1e44cce Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 18 May 2021 12:45:28 +0200 Subject: [PATCH 325/412] analysis: add all knockouts to compoundFilters, #1693 --- .../opencga/analysis/rga/RgaManager.java | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index b39057ed8e6..906652c57d4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -374,11 +374,29 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri new ArrayList<>(consequenceTypes), Arrays.asList(populationFrequencyMap.get(thousandGenomeKey), populationFrequencyMap.get(gnomadGenomeKey))); - // Generate combinations with current variant + // Generate CH combinations with current variant compoundFilters.addAll(RgaUtils.generateCompoundHeterozygousCombinations(Collections.singletonList(currentVariantCompHetValues), chVariantList)); } + // Process all possible compound filters that are not CH + Set knockoutTypesNoCompHet = new HashSet<>(knockoutTypes); + knockoutTypesNoCompHet.remove(KnockoutVariant.KnockoutType.COMP_HET.name()); + if (!knockoutTypesNoCompHet.isEmpty()) { + List knockoutList = new ArrayList<>(knockoutTypesNoCompHet.size()); + for (String knockout : knockoutTypesNoCompHet) { + knockoutList.add(RgaUtils.encode(knockout)); + } + + // TODO: Assuming filter is PASS. We need to check that properly + List> independentTerms = Arrays.asList( + knockoutList, + Collections.singletonList(RgaUtils.encode(PASS)), // TODO: CHANGE !!!!! Take filter from codedVariant object + new ArrayList<>(consequenceTypes), + Arrays.asList(populationFrequencyMap.get(thousandGenomeKey), populationFrequencyMap.get(gnomadGenomeKey))); + compoundFilters.addAll(RgaUtils.generateCombinations(independentTerms)); + } + knockoutTypeFacet = new QueryOptions() .append(QueryOptions.LIMIT, -1) .append(QueryOptions.FACET, RgaDataModel.GENE_ID); @@ -1577,8 +1595,8 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti sampleIds = search.getResults().stream().map(Sample::getId).collect(Collectors.toList()); preprocessResult.setNumTotalResults(search.getNumMatches()); } else { - if (!preprocessResult.getQuery().containsKey("sampleId") - && !preprocessResult.getQuery().containsKey("individualId")) { + if (!preprocessResult.getQuery().containsKey(RgaQueryParams.SAMPLE_ID.key()) + && !preprocessResult.getQuery().containsKey(RgaQueryParams.INDIVIDUAL_ID.key())) { // 1st. we perform a facet to get the different sample ids matching the user query DataResult result = rgaEngine.facetedQuery(collection, preprocessResult.getQuery(), new QueryOptions(QueryOptions.FACET, RgaDataModel.SAMPLE_ID).append(QueryOptions.LIMIT, -1)); @@ -1586,7 +1604,7 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti throw RgaException.noResultsMatching(); } List samples = result.first().getBuckets().stream().map(FacetField.Bucket::getValue).collect(Collectors.toList()); - preprocessResult.getQuery().put("sampleId", samples); + preprocessResult.getQuery().put(RgaQueryParams.SAMPLE_ID.key(), samples); } // From the list of sample ids the user wants to retrieve data from, we filter those for which the user has permissions @@ -1597,7 +1615,7 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti } List authorisedSamples = new LinkedList<>(); - if (!isOwnerOrAdmin || !preprocessResult.getQuery().containsKey("sampleId")) { + if (!isOwnerOrAdmin || !preprocessResult.getQuery().containsKey(RgaQueryParams.SAMPLE_ID.key())) { int maxSkip = 10000; if (skip > maxSkip) { throw new RgaException("Cannot paginate further than " + maxSkip + " individuals. Please, narrow down your query."); @@ -1609,12 +1627,12 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti String sampleQueryField; List values; - if (preprocessResult.getQuery().containsKey("individualId")) { + if (preprocessResult.getQuery().containsKey(RgaQueryParams.INDIVIDUAL_ID.key())) { sampleQueryField = SampleDBAdaptor.QueryParams.INDIVIDUAL_ID.key(); - values = preprocessResult.getQuery().getAsStringList("individualId"); + values = preprocessResult.getQuery().getAsStringList(RgaQueryParams.INDIVIDUAL_ID.key()); } else { sampleQueryField = SampleDBAdaptor.QueryParams.ID.key(); - values = preprocessResult.getQuery().getAsStringList("sampleId"); + values = preprocessResult.getQuery().getAsStringList(RgaQueryParams.SAMPLE_ID.key()); } if (count && values.size() > maxSkip) { @@ -1646,7 +1664,7 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti } } } else { - authorisedSamples = preprocessResult.getQuery().getAsStringList("sampleId"); + authorisedSamples = preprocessResult.getQuery().getAsStringList(RgaQueryParams.SAMPLE_ID.key()); preprocessResult.setNumTotalResults(authorisedSamples.size()); } @@ -1659,6 +1677,9 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti sampleIds = authorisedSamples.subList(skip, to); } } + if (sampleIds.isEmpty()) { + throw RgaException.noResultsMatching(); + } preprocessResult.getQuery().put(RgaQueryParams.SAMPLE_ID.key(), sampleIds); return preprocessResult; From 62891b03e81bc4c0d86752caf645b46e65edc835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 18 May 2021 16:05:25 +0100 Subject: [PATCH 326/412] k8s: Ensure k8s image name is updated in override_yaml.py --- opencga-app/app/cloud/docker/opencga-init/override_yaml.py | 5 +++++ .../charts/opencga/templates/master-deployment.yaml | 2 ++ 2 files changed, 7 insertions(+) diff --git a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py index 1bbaabd7c69..7211e544ebe 100644 --- a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py +++ b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py @@ -29,6 +29,7 @@ parser.add_argument("--batch-pool-id", required=False) parser.add_argument("--k8s-master-node", required=False) parser.add_argument("--k8s-namespace", required=False, default="default") +parser.add_argument("--k8s-image-name", required=False) parser.add_argument("--k8s-volumes-pvc-conf", required=False) parser.add_argument("--k8s-volumes-pvc-sessions", required=False) parser.add_argument("--k8s-volumes-pvc-variants", required=False) @@ -164,6 +165,10 @@ elif args.analysis_execution_mode == "k8s": config["analysis"]["execution"]["options"]["k8s.masterUrl"] = args.k8s_master_node config["analysis"]["execution"]["options"]["k8s.namespace"] = args.k8s_namespace + + if args.k8s_image_name: + config["analysis"]["execution"]["options"]["k8s.imageName"] = args.k8s_image_name + config["analysis"]["execution"]["options"]["k8s.volumes"][0]["name"] = "conf" config["analysis"]["execution"]["options"]["k8s.volumes"][0]["persistentVolumeClaim"]["claimName"] = args.k8s_volumes_pvc_conf config["analysis"]["execution"]["options"]["k8s.volumes"][1]["name"] = "sessions" diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml index 3f71f08ae02..37c754ba8f9 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml @@ -87,6 +87,8 @@ spec: value: {{ .Values.analysis.execution.options.k8s.masterNode }} - name: "INIT_K8S_NAMESPACE" value: {{ .Release.Namespace }} + - name: "INIT_K8S_IMAGE_NAME" + value: {{ tpl .Values.master.image.repository . | quote }} - name: "INIT_K8S_VOLUMES_PVC_CONF" value: {{ include "pvcConf" . | quote }} - name: "INIT_K8S_VOLUMES_PVC_SESSIONS" From e43fb3539d5492a271b2699253c175433e860316 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 19 May 2021 10:54:03 +0200 Subject: [PATCH 327/412] analysis: avoid storage manager going to solr, #1693 --- .../java/org/opencb/opencga/analysis/rga/RgaManager.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 906652c57d4..9e3d51278ee 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -37,9 +37,11 @@ import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; +import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; +import org.opencb.opencga.storage.core.variant.search.solr.VariantSearchManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1299,7 +1301,10 @@ private VariantDBIterator variantStorageQuery(String study, List sampleI excludeList.add(VariantField.STUDIES_FILES); } - QueryOptions queryOptions = new QueryOptions(QueryOptions.EXCLUDE, excludeList); + QueryOptions queryOptions = new QueryOptions() + .append(QueryOptions.EXCLUDE, excludeList) + .append(VariantSearchManager.USE_SEARCH_INDEX, VariantStorageEngine.UseSearchIndex.NO); + return variantStorageManager.iterator(variantQuery, queryOptions, token); } From 809870ed4e2086232e412ba3f962d77b50f0af39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 19 May 2021 12:17:33 +0100 Subject: [PATCH 328/412] k8s: Allow mount additional volumes --- .../charts/opencga/templates/_helpers.tpl | 18 +++++++++++++++ .../opencga/templates/master-deployment.yaml | 18 ++++++++------- .../opencga/templates/rest-deployment.yaml | 23 +++++++++++-------- .../kubernetes/charts/opencga/values.yaml | 12 ++++++++++ 4 files changed, 53 insertions(+), 18 deletions(-) diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/_helpers.tpl b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/_helpers.tpl index c3808a65dec..8e6d1d62cc5 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/_helpers.tpl +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/_helpers.tpl @@ -114,6 +114,24 @@ pvc-{{ include "opencga.fullname" . }}-analysisconf {{- end -}} +{{- define "additionalVolumes" -}} +{{- if .Values.volumes -}} +{{- range .Values.volumes }} +- name: {{ .name }} + {{- .source | toYaml | nindent 2 -}} +{{- end }} +{{- end -}} +{{- end -}} + + +{{- define "additionalVolumeMounts" -}} +{{- if .Values.volumes -}} +{{- range .Values.volumes }} +- name: {{ .name }} + mountPath: {{ .mountPath }} +{{- end }} +{{- end -}} +{{- end -}} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml index 37c754ba8f9..7793673e36c 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml @@ -140,14 +140,15 @@ spec: resources: {{- toYaml .Values.master.resources | nindent 12 }} volumeMounts: - - name : conf - mountPath: /opt/opencga/conf - - name : sessions - mountPath: /opt/opencga/sessions - - name : variants - mountPath: /opt/opencga/variants - - name : analysisconf - mountPath: /opt/opencga/analysis + - name : conf + mountPath: /opt/opencga/conf + - name : sessions + mountPath: /opt/opencga/sessions + - name : variants + mountPath: /opt/opencga/variants + - name : analysisconf + mountPath: /opt/opencga/analysis + {{ include "additionalVolumeMounts" . | nindent 12 }} volumes: - name: conf persistentVolumeClaim: @@ -164,6 +165,7 @@ spec: - name: default-conf configMap: name: {{ include "opencga.defaultConf.name" . }} + {{ include "additionalVolumes" . | nindent 6 }} {{- with .Values.master.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml index 150196c56af..580236bcba6 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml @@ -61,16 +61,17 @@ spec: resources: {{- toYaml .Values.rest.resources | nindent 12 }} volumeMounts: - - name : conf - mountPath: /opt/opencga/conf - - name : sessions - mountPath: /opt/opencga/sessions - - name : variants - mountPath: /opt/opencga/variants - - name: analysisconf - mountPath: /opt/opencga/analysis - - name: opencgascratch - mountPath: /tmp/opencga_scratch + - name : conf + mountPath: /opt/opencga/conf + - name : sessions + mountPath: /opt/opencga/sessions + - name : variants + mountPath: /opt/opencga/variants + - name: analysisconf + mountPath: /opt/opencga/analysis + - name: opencgascratch + mountPath: /tmp/opencga_scratch + {{ include "additionalVolumeMounts" . | nindent 12 }} - name: dind-daemon image: docker:dind-rootless securityContext: @@ -100,6 +101,7 @@ spec: mountPath: /opt/opencga/analysis - name: opencgascratch mountPath: /tmp/opencga_scratch + {{ include "additionalVolumeMounts" . | nindent 12 }} volumes: - name: conf persistentVolumeClaim: @@ -117,6 +119,7 @@ spec: emptyDir: {} - name: opencgascratch emptyDir: {} + {{- include "additionalVolumes" . | nindent 6 -}} {{- with .Values.rest.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index e0c69f41edb..df01aef49d0 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -127,6 +127,18 @@ blobfuse: nameOverride: "" fullnameOverride: "" +# Mount additional volumes into rest and master. +# User responsability: +# - Ensure that the new volumes are defined in the cluster +# - Add the new volumes to the configuration.yaml so they are present in the k8s jobs +#volumes: +# - name: volume_name +# mountPath: /data/my_volume +# # Source field contains the volume type details. Could be persistentVolumeClaim, azureDisk, azureFile, configMap, ... +# source: +# persistentVolumeClaim: +# claimName: "myVolumeClaim" + rest: name: rest replicaCount: 3 From deebbd7283262ffd7eb4aedee22dc59f198cd57e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 19 May 2021 12:21:55 +0100 Subject: [PATCH 329/412] k8s: Improve NOTES.txt and validate.tpl --- .../charts/opencga/templates/NOTES.txt | 63 ++++++++++++------- .../charts/opencga/templates/validate.tpl | 61 +++++++++++++++++- .../kubernetes/charts/opencga/validate.sh | 57 +++++++++++++++++ opencga-app/app/cloud/kubernetes/setup-k8s.sh | 2 + 4 files changed, 156 insertions(+), 27 deletions(-) create mode 100644 opencga-app/app/cloud/kubernetes/charts/opencga/validate.sh diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt index 31bf60f20ba..44831eccbe9 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/NOTES.txt @@ -1,48 +1,63 @@ -## OpenCGA -Get the application URL by running these commands: +# OpenCGA + {{- if .Values.rest.ingress.enabled }} +REST URLs: {{- $paths := .Values.rest.ingress.paths -}} {{- range $host := .Values.rest.ingress.hosts }} {{- range $path := $paths }} - http{{ if $.Values.rest.ingress.tls }}s{{ end }}://{{ $host | default "EXTERNAL_CLUSTER_IP" }}{{ $path | replace "(/|$)" "" }} + - http{{ if $.Values.rest.ingress.tls }}s{{ end }}://{{ $host | default "EXTERNAL_CLUSTER_IP" }}{{ $path | replace "(/|$)" "" }} {{- end }} {{- end }} {{- end }} -{{- if contains "NodePort" .Values.rest.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "opencga.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.rest.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "opencga.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "opencga.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") - echo http://$SERVICE_IP:{{ .Values.rest.service.port }} -{{- else if contains "ClusterIP" .Values.rest.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "opencga.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80 - - Visit: http://localhost:8080/opencga +Get the application URL by running these commands: + +{{ if contains "NodePort" .Values.rest.service.type }} + export NODE_PORT=$(kubectl get --context {{ .Values.kubeContext }} --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "opencga.fullname" . }}) + export NODE_IP=$(kubectl get nodes --context {{ .Values.kubeContext }} --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{ else if contains "LoadBalancer" .Values.rest.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --context {{ .Values.kubeContext }} --namespace {{ .Release.Namespace }} svc -w {{ include "opencga.fullname" . }}' + + export SERVICE_IP=$(kubectl get svc --context {{ .Values.kubeContext }} --namespace {{ .Release.Namespace }} {{ include "opencga.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.rest.service.port }} +{{ else if contains "ClusterIP" .Values.rest.service.type }} +## Port forward +You can either forward a specific pod port, or forward to the service. + +Then visit: http://localhost:8080/opencga + +### Service port forward + + kubectl --context {{ .Values.kubeContext }} --namespace {{ .Release.Namespace }} port-forward "service/{{ .Values.rest.name }}" 8080:80 + + +### Pod port forward + + export POD_NAME=$(kubectl get pods --context {{ .Values.kubeContext }} --namespace {{ .Release.Namespace }} -l "app={{ .Values.rest.name }},app.kubernetes.io/name={{ include "opencga.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + kubectl --context {{ .Values.kubeContext }} --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:9090 + {{- end }} {{- if .Values.mongodb.deploy.enabled }} -## MongoDB +# MongoDB Connect to MongoDB database running these commands: - export SERVICE_NAME="service/{{ .Values.mongodb.deploy.name }}-svc" - kubectl --namespace {{ .Release.Namespace }} port-forward $SERVICE_NAME 27018:27017 + export SERVICE_NAME="service/{{ .Values.mongodb.deploy.name }}-svc" + kubectl --context {{ .Values.kubeContext }} --namespace {{ .Release.Namespace }} port-forward $SERVICE_NAME 27018:27017 - mongo --host localhost --port 27018 --authenticationDatabase {{ .Values.mongodb.authenticationDatabase }} --authenticationMechanism {{ .Values.mongodb.authenticationMechanism }} --username {{ .Values.mongodb.user }} --password XXXXX + mongo --host localhost --port 27018 --authenticationDatabase {{ .Values.mongodb.authenticationDatabase }} --authenticationMechanism {{ .Values.mongodb.authenticationMechanism }} --username {{ .Values.mongodb.user }} --password XXXXX {{- end }} {{- if .Values.solr.deploy.enabled }} -## Solr +# Solr Connect to Solr database running these commands: - export SERVICE_NAME="service/{{ .Values.solr.deploy.name }}-solrcloud-headless" - kubectl --namespace {{ .Release.Namespace }} port-forward $SERVICE_NAME 18983:8983 + export SERVICE_NAME="service/{{ .Values.solr.deploy.name }}-solrcloud-headless" + kubectl --context {{ .Values.kubeContext }} --namespace {{ .Release.Namespace }} port-forward $SERVICE_NAME 18983:8983 Visit http://127.0.0.1:18983 to access Solr GUI {{- end }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/validate.tpl b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/validate.tpl index 9e3d1e3ba63..6b3d5ce004c 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/validate.tpl +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/validate.tpl @@ -1,5 +1,60 @@ -{{ if eq .Chart.AppVersion "REPLACEME_OPENCGA_VERSION" }} - {{ fail "Wrong Chart.AppVersion. Attempting to execute HELM from opencga/opencga-app/app/cloud/kubernetes" }} -{{ end }} \ No newline at end of file +{{ if not .Values.skipChartAppVersionCheck }} + {{ if eq .Chart.AppVersion "REPLACEME_OPENCGA_VERSION" }} + {{ fail "Wrong Chart.AppVersion. Attempting to execute HELM from opencga/opencga-app/app/cloud/kubernetes" }} + {{ end }} +{{ end }} + + +{{ if .Values.azureStorageAccount.enabled }} + {{ if eq .Values.azureStorageAccount.name "FILL_ME" }} + {{ fail "Empty Values.azureStorageAccount.name" }} + {{ end }} + {{ if eq .Values.azureStorageAccount.key "FILL_ME" }} + {{ fail "Empty Values.azureStorageAccount.key" }} + {{ end }} +{{ end }} + +{{ if eq .Values.mongodb.user "FILL_ME" }} + {{ fail "Empty Values.mongodb.user" }} +{{ end }} +{{ if eq .Values.mongodb.password "FILL_ME" }} + {{ fail "Empty Values.mongodb.password" }} +{{ end }} + +{{ if not .Values.mongodb.deploy.enabled }} + {{ if eq .Values.mongodb.external.hosts "FILL_ME" }} + {{ fail "Empty Values.mongodb.external.hosts" }} + {{ end }} +{{ end }} + + +{{ if not .Values.solr.deploy.enabled }} + {{ if eq .Values.solr.external.hosts "FILL_ME" }} + {{ fail "Empty Values.solr.external.hosts" }} + {{ end }} +{{ end }} + + +{{ if eq .Values.analysis.execution.id "k8s" }} + {{ if eq .Values.analysis.execution.options.k8s.masterNode "FILL_ME" }} + {{ fail "Empty Values.analysis.execution.options.k8s.masterNode" }} + {{ end }} +{{ end }} + + +{{ if eq .Values.hadoop.sshDns "FILL_ME" }} + {{ fail "Empty Values.hadoop.sshDns" }} +{{ end }} +{{ if eq .Values.hadoop.sshUsername "FILL_ME" }} + {{ fail "Empty Values.hadoop.sshUsername" }} +{{ end }} +{{ if eq .Values.hadoop.sshPassword "FILL_ME" }} + {{ fail "Empty Values.hadoop.sshPassword" }} +{{ end }} + + +{{ if eq .Values.opencga.admin.password "FILL_ME" }} + {{ fail "Empty Values.opencga.admin.password" }} +{{ end }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/validate.sh b/opencga-app/app/cloud/kubernetes/charts/opencga/validate.sh new file mode 100644 index 00000000000..21710eb4d39 --- /dev/null +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/validate.sh @@ -0,0 +1,57 @@ +#!/bin/bash + + +function printUsage() { + echo "" + echo "Validates opencga templates" + echo "" + echo "Usage: $(basename $0) " + echo "" + echo "Options:" + echo " -f --values FILE Helm values file" + echo " -h --help FLAG Print this help" + echo "" +} + + +while [[ $# -gt 0 ]]; do + key="$1" + value="$2" + case $key in + -h | --help) + printUsage + exit 0 + ;; + -f | --values) + VALUES=$(realpath "$value") + shift # past argument + shift # past value + ;; + *) # unknown option + echo "Unknown option $key" + printUsage + exit 1 + ;; + esac +done + +cd "$(dirname "$0")" + +set -x +if [[ -z "$VALUES" ]]; then + helm template opencga . --debug --dry-run \ + --set skipChartAppVersionCheck=true \ + --set azureStorageAccount.name=dummy-azurestorageaccount-name \ + --set azureStorageAccount.key=dummy-azurestorageaccount-key \ + --set mongodb.user=dummy-user \ + --set mongodb.password=dummy-password \ + --set mongodb.external.hosts=mongodb_hosts \ + --set solr.external.hosts=solr_hosts \ + --set analysis.execution.options.k8s.masterNode=k8s_masternode \ + --set hadoop.sshDns=dummy_hadoop_sshDns \ + --set hadoop.sshUsername=dummy_hadoop_sshUsername \ + --set hadoop.sshPassword=dummy_hadoop_sshPassword \ + --set opencga.admin.password=dummy_opencga_admin_password +else + helm template opencga . --debug --dry-run --values "$VALUES" +fi \ No newline at end of file diff --git a/opencga-app/app/cloud/kubernetes/setup-k8s.sh b/opencga-app/app/cloud/kubernetes/setup-k8s.sh index a3fdb07e628..4a83697e4c9 100755 --- a/opencga-app/app/cloud/kubernetes/setup-k8s.sh +++ b/opencga-app/app/cloud/kubernetes/setup-k8s.sh @@ -258,10 +258,12 @@ function deployOpenCGA() { fi helm upgrade "${NAME}" "${OPENCGA_CHART}" \ + --set "kubeContext=${K8S_CONTEXT}" \ --values "${HELM_VALUES_FILE}" \ --install --wait --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" --timeout 10m ${HELM_OPTS} if [ $DRY_RUN == "false" ]; then helm get manifest "${NAME}" --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" >"${OUTPUT_DIR}/helm-${NAME}-manifest-${DATE}.yaml" + helm get notes "${NAME}" --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" >"${OUTPUT_DIR}/helm-${NAME}-notes-${DATE}.md" fi } From ad77027f9dbe2eb36ea3a5ce04b71a0c8f3368b5 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 19 May 2021 15:16:13 +0200 Subject: [PATCH 330/412] analysis: change to equalsIgnoreCase --- .../opencga/analysis/rga/IndividualRgaConverter.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java index cc9b4145962..c586289b2bb 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/IndividualRgaConverter.java @@ -422,10 +422,10 @@ private Map> getPopulationFrequenciesOld(KnockoutTranscript if (variant.getPopulationFrequencies() != null) { for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { if (populationFrequency.getPopulation().equals("ALL")) { - if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + if (RgaUtils.THOUSAND_GENOMES_STUDY.equalsIgnoreCase(populationFrequency.getStudy())) { popFreqs.get(thousandGenomeKey).add(populationFrequency.getAltAlleleFreq()); thousandG = true; - } else if (RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + } else if (RgaUtils.GNOMAD_GENOMES_STUDY.equalsIgnoreCase(populationFrequency.getStudy())) { popFreqs.get(gnomadGenomeKey).add(populationFrequency.getAltAlleleFreq()); gnomad = true; } @@ -473,11 +473,11 @@ private Map getPopulationFrequencies(KnockoutVariant variant) th if (variant.getPopulationFrequencies() != null) { for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { if (populationFrequency.getPopulation().equals("ALL")) { - if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + if (RgaUtils.THOUSAND_GENOMES_STUDY.equalsIgnoreCase(populationFrequency.getStudy())) { String encodedPopFrequency = getEncodedPopFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, populationFrequency.getAltAlleleFreq()); variantFreqMap.put(RgaUtils.THOUSAND_GENOMES_STUDY, encodedPopFrequency); - } else if (RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + } else if (RgaUtils.GNOMAD_GENOMES_STUDY.equalsIgnoreCase(populationFrequency.getStudy())) { String encodedPopFrequency = getEncodedPopFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, populationFrequency.getAltAlleleFreq()); variantFreqMap.put(RgaUtils.GNOMAD_GENOMES_STUDY, encodedPopFrequency); @@ -532,12 +532,12 @@ private List> processFilters(KnockoutVariant variant, Set r if (variant.getPopulationFrequencies() != null) { for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { if (populationFrequency.getPopulation().equals("ALL")) { - if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + if (RgaUtils.THOUSAND_GENOMES_STUDY.equalsIgnoreCase(populationFrequency.getStudy())) { String populationFrequencyKey = RgaUtils.getPopulationFrequencyKey(populationFrequency.getAltAlleleFreq()); pf.add(RgaUtils.encode(RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + populationFrequencyKey)); thousandG = true; - } else if (RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + } else if (RgaUtils.GNOMAD_GENOMES_STUDY.equalsIgnoreCase(populationFrequency.getStudy())) { String populationFrequencyKey = RgaUtils.getPopulationFrequencyKey(populationFrequency.getAltAlleleFreq()); pf.add(RgaUtils.encode(RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + populationFrequencyKey)); From d1c2976a81b432b43b3aca7979becea08d6c1d98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 19 May 2021 15:47:52 +0100 Subject: [PATCH 331/412] k8s: Add confMd5 to master and rest deployments --- .../opencga/templates/master-deployment.yaml | 1 + .../charts/opencga/templates/rest-deployment.yaml | 1 + opencga-app/app/cloud/kubernetes/setup-k8s.sh | 14 +++++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml index 7793673e36c..059d7374cb6 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/master-deployment.yaml @@ -14,6 +14,7 @@ spec: metadata: labels: app: {{ .Values.master.name }} + confMd5: {{ .Values.confMd5 | default "NA" | quote }} {{- include "opencga.selectorLabels" . | nindent 8 }} spec: {{- with .Values.master.imagePullSecrets }} diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml index 580236bcba6..f8c8c2d76df 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml @@ -14,6 +14,7 @@ spec: metadata: labels: app: {{ .Values.rest.name }} + confMd5: {{ .Values.confMd5 | default "NA" | quote }} {{- include "opencga.selectorLabels" . | nindent 8 }} spec: {{- with .Values.rest.imagePullSecrets }} diff --git a/opencga-app/app/cloud/kubernetes/setup-k8s.sh b/opencga-app/app/cloud/kubernetes/setup-k8s.sh index 4a83697e4c9..210a2b76475 100755 --- a/opencga-app/app/cloud/kubernetes/setup-k8s.sh +++ b/opencga-app/app/cloud/kubernetes/setup-k8s.sh @@ -143,6 +143,13 @@ OUTPUT_DIR=$(realpath "${OUTPUT_DIR}") if [ -n "${OPENCGA_CONF_DIR}" ]; then requiredDirectory "--opencga-conf-dir" "${OPENCGA_CONF_DIR}" OPENCGA_CONF_DIR=$(realpath "${OPENCGA_CONF_DIR}") + CONF_DIR_FILTER="-not -iname '*.xml' -a -not -iname '*.yml' -a -not -iname '*.yaml' -a -not -iname '*.sh'" + CONF_FILES=$(eval find "$OPENCGA_CONF_DIR" ${CONF_DIR_FILTER} | wc -l) + if [ "$CONF_FILES" -gt 1 ]; then + echo "Unexpected files in opencga configuration directory:" + eval find "$OPENCGA_CONF_DIR" ${CONF_DIR_FILTER} + exit 1 + fi else OPENCGA_CONF_DIR=$(realpath "$(dirname "$0")/../../conf") fi @@ -185,7 +192,7 @@ function deployNginx() { NAME="opencga-nginx${NAME_SUFFIX}" echo "# Deploy NGINX ${NAME}" helm upgrade ${NAME} ingress-nginx/ingress-nginx \ - --kube-context "${K8S_CONTEXT}" --namespace "${K8S_NAMESPACE}" \ + --kube-context "${K8S_CONTEXT}" --namespace "${K8S_NAMESPACE}" \ -f charts/nginx/values.yaml \ --values "${HELM_VALUES_FILE}" \ --install --wait --timeout 10m ${HELM_OPTS} @@ -241,8 +248,11 @@ function deployMongodbOperator() { function deployOpenCGA() { DATE=$(date "+%Y%m%d%H%M%S") + CONF_MD5= if [[ -n "$OPENCGA_CONF_DIR" ]]; then + find "$OPENCGA_CONF_DIR" -iname "*.xml" -o -iname "*.yml" -o -iname "*.yaml" -o -iname "*.sh" NAME="opencga${NAME_SUFFIX}" + CONF_MD5=$(find "$OPENCGA_CONF_DIR" -type f -exec md5sum {} \; | sort -k 2 | md5sum | cut -d " " -f 1 ) echo "# Deploy OpenCGA ${NAME}" OPENCGA_CHART="${OUTPUT_DIR:?}/${NAME}_${DATE}_tmp/" if [ $KEEP_TMP_FILES == "false" ]; then @@ -254,11 +264,13 @@ function deployOpenCGA() { cp -r charts/opencga/* "${OPENCGA_CHART:?}" cp "${OPENCGA_CONF_DIR:?}"/* "$OPENCGA_CHART"/conf else + CONF_MD5="NA" OPENCGA_CHART=charts/opencga/ fi helm upgrade "${NAME}" "${OPENCGA_CHART}" \ --set "kubeContext=${K8S_CONTEXT}" \ + --set "confMd5=${CONF_MD5}" \ --values "${HELM_VALUES_FILE}" \ --install --wait --kube-context "${K8S_CONTEXT}" -n "${K8S_NAMESPACE}" --timeout 10m ${HELM_OPTS} if [ $DRY_RUN == "false" ]; then From a3ee228211aea0789f922edb713e76d7869b1a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 20 May 2021 10:50:05 +0200 Subject: [PATCH 332/412] analysis: rename CircosAnalysis to GenomePlotAnalysis and update code according to biodata#199, #1730 --- .../analysis/sample/qc/SampleQcAnalysis.java | 366 ++++++------------ .../variant/circos/CircosAnalysis.java | 93 ----- .../genomePlot/GenomePlotAnalysis.java | 93 +++++ .../GenomePlotLocalAnalysisExecutor.java} | 135 ++----- .../VariantInternalCommandExecutor.java | 46 +-- .../options/VariantCommandOptions.java | 16 +- .../analysis/VariantCommandExecutor.java | 27 +- .../client/rest/clients/VariantClient.java | 12 +- .../SampleVariantQualityControlMetrics.java | 20 +- .../models/variant/CircosAnalysisParams.java | 119 ------ .../core/models/variant/CircosTrack.java | 55 --- .../variant/GenomePlotAnalysisParams.java | 63 +++ .../variant/SampleQcAnalysisParams.java | 58 +-- .../SampleVariantStatsAnalysisParams.java | 6 +- ...r.java => GenomePlotAnalysisExecutor.java} | 32 +- .../rest/analysis/VariantWebService.java | 176 ++------- 16 files changed, 421 insertions(+), 896 deletions(-) delete mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java rename opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/{circos/CircosLocalAnalysisExecutor.java => genomePlot/GenomePlotLocalAnalysisExecutor.java} (80%) delete mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java delete mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosTrack.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java rename opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/{CircosAnalysisExecutor.java => GenomePlotAnalysisExecutor.java} (53%) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 7fb80f57256..f2638bd4153 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -18,328 +18,188 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.models.clinical.qc.CircosPlot; -import org.opencb.biodata.models.clinical.qc.MutationalSignature; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; -import org.opencb.biodata.models.clinical.qc.Signature; -import org.opencb.biodata.models.variant.metadata.SampleVariantStats; +import org.opencb.commons.datastore.core.Event; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.AnalysisUtils; import org.opencb.opencga.analysis.individual.qc.IndividualQcUtils; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; -import org.opencb.opencga.analysis.variant.circos.CircosAnalysis; +import org.opencb.opencga.analysis.variant.genomePlot.GenomePlotAnalysis; import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis; -import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureLocalAnalysisExecutor; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.sample.Sample; -import org.opencb.opencga.core.models.sample.SampleUpdateParams; -import org.opencb.opencga.core.models.sample.SampleVariantQualityControlMetrics; -import org.opencb.opencga.core.models.study.Study; +import org.opencb.opencga.core.models.variant.GenomePlotAnalysisParams; +import org.opencb.opencga.core.models.variant.MutationalSignatureAnalysisParams; +import org.opencb.opencga.core.models.variant.SampleQcAnalysisParams; +import org.opencb.opencga.core.models.variant.SampleVariantStatsAnalysisParams; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; -import org.opencb.opencga.core.tools.variant.SampleQcAnalysisExecutor; -import org.opencb.opencga.storage.core.exceptions.StorageEngineException; +import org.opencb.opencga.core.tools.annotations.ToolParams; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; -import java.util.stream.Collectors; +import java.util.Collections; +import java.util.Map; -import static org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureLocalAnalysisExecutor.CONTEXT_FILENAME; import static org.opencb.opencga.core.models.study.StudyAclEntry.StudyPermissions.WRITE_SAMPLES; @Tool(id = SampleQcAnalysis.ID, resource = Enums.Resource.SAMPLE, description = SampleQcAnalysis.DESCRIPTION) public class SampleQcAnalysis extends OpenCgaToolScopeStudy { public static final String ID = "sample-qc"; - public static final String DESCRIPTION = "Run quality control (QC) for a given sample. It includes variant stats and Circos plot; and " - + " for somatic samples, mutational signature."; + public static final String DESCRIPTION = "Run quality control (QC) for a given sample. It includes variant stats and genome plot; and " + + " for somatic samples, mutational signature."; - public static final String VARIANT_STATS_STEP = "variant-stats"; - public static final String CIRCOS_PLOT_STEP = "circos-plot"; - public static final String MUTATIONAL_SIGNATURE_STEP = "mutational-signature"; + @ToolParams + protected final SampleQcAnalysisParams analysisParams = new SampleQcAnalysisParams(); - private String studyId; - private String sampleId; - private String variantStatsId; - private String variantStatsDecription; - private Query variantStatsQuery; - private String signatureId; - private Query signatureQuery; -// private Query circosQuery; -// private List signatureQuery; + private Path genomePlotConfigPath; - private Sample sample; - private SampleVariantQualityControlMetrics variantQcMetrics; - private Job variantStatsJob = null; - private Job signatureJob = null; - private Job circosJob = null; + private boolean runVariantStats = true; + private boolean runSignature = true; + private boolean runGenomePlot = true; @Override protected void check() throws Exception { super.check(); - this.studyId = getStudyFqn(); - setUpStorageEngineExecutor(studyId); - if (StringUtils.isEmpty(studyId)) { - throw new ToolException("Missing study ID."); + if (StringUtils.isEmpty(getStudy())) { + throw new ToolException("Missing study"); } // Check permissions try { - Study study = catalogManager.getStudyManager().get(studyId, QueryOptions.empty(), token).first(); + long studyUid = catalogManager.getStudyManager().get(getStudy(), QueryOptions.empty(), token).first().getUid(); String userId = catalogManager.getUserManager().getUserId(token); - catalogManager.getAuthorizationManager().checkStudyPermission(study.getUid(), userId, WRITE_SAMPLES); + catalogManager.getAuthorizationManager().checkStudyPermission(studyUid, userId, WRITE_SAMPLES); } catch (CatalogException e) { throw new ToolException(e); } // Sanity check - if (StringUtils.isEmpty(sampleId)) { + if (StringUtils.isEmpty(analysisParams.getSample())) { throw new ToolException("Missing sample ID."); } - sample = IndividualQcUtils.getValidSampleById(studyId, sampleId, catalogManager, token); + Sample sample = IndividualQcUtils.getValidSampleById(getStudy(), analysisParams.getSample(), catalogManager, token); if (sample == null) { - throw new ToolException("Sample '" + sampleId + "' not found."); + throw new ToolException("Sample '" + analysisParams.getSample() + "' not found."); } - } - - @Override - protected List getSteps() { - return Arrays.asList(VARIANT_STATS_STEP, CIRCOS_PLOT_STEP, MUTATIONAL_SIGNATURE_STEP); - } - - @Override - protected void run() throws ToolException { - // Get job dependencies - try { - OpenCGAResult jobResult = catalogManager.getJobManager().get(studyId, getJobId(), QueryOptions.empty(), token); - Job job = jobResult.first(); - if (CollectionUtils.isNotEmpty(job.getDependsOn())) { - for (Job dependsOnJob : job.getDependsOn()) { - if (dependsOnJob.getId().startsWith(SampleVariantStatsAnalysis.ID)) { - variantStatsJob = catalogManager.getJobManager().get(studyId, dependsOnJob.getId(), QueryOptions.empty(), token) - .first(); - } else if (dependsOnJob.getId().startsWith(MutationalSignatureAnalysis.ID)) { - signatureJob = catalogManager.getJobManager().get(studyId, dependsOnJob.getId(), QueryOptions.empty(), token) - .first(); - } else if (dependsOnJob.getId().startsWith(CircosAnalysis.ID)) { - circosJob = catalogManager.getJobManager().get(studyId, dependsOnJob.getId(), QueryOptions.empty(), token).first(); - } - } - } - } catch (CatalogException e) { - throw new ToolException(e); + // Check variant stats + final String OPENCGA_ALL = "ALL"; + if (OPENCGA_ALL.equals(analysisParams.getVariantStatsId())) { + throw new ToolException("Invalid parameters: " + OPENCGA_ALL + " is a reserved word, you can not use as a" + + " variant stats ID"); } - // Get sample quality control metrics to update - variantQcMetrics = sample.getQualityControl().getVariantMetrics(); - - SampleQcAnalysisExecutor executor = getToolExecutor(SampleQcAnalysisExecutor.class); - - // Set up executor - executor.setStudyId(studyId) - .setSample(sample) - .setVariantStatsId(variantStatsId) - .setVariantStatsDecription(variantStatsDecription) - .setVariantStatsQuery(variantStatsQuery) - .setSignatureId(signatureId) - .setSignatureQuery(signatureQuery); - - // Step by step - step(VARIANT_STATS_STEP, () -> runVariantStats()); - step(CIRCOS_PLOT_STEP, () -> runCircosPlot()); - step(MUTATIONAL_SIGNATURE_STEP, () -> runSignature()); - - // Finally, update sample quality control metrics - try { - sample.getQualityControl().setVariantMetrics(variantQcMetrics); - catalogManager.getSampleManager().update(studyId, getSampleId(), - new SampleUpdateParams().setQualityControl(sample.getQualityControl()), QueryOptions.empty(), token); - } catch (CatalogException e) { - throw new ToolException(e); + if (StringUtils.isEmpty(analysisParams.getVariantStatsId()) && analysisParams.getVariantStatsQuery() != null + && !analysisParams.getVariantStatsQuery().toParams().isEmpty()) { + throw new ToolException("Invalid parameters: if variant stats ID is empty, variant stats query must be empty"); + } + if (StringUtils.isNotEmpty(analysisParams.getVariantStatsId()) + && (analysisParams.getVariantStatsQuery() == null || analysisParams.getVariantStatsQuery().toParams().isEmpty())) { + throw new ToolException("Invalid parameters: if you provide a variant stats ID, variant stats query can not be empty"); + } + if (StringUtils.isEmpty(analysisParams.getVariantStatsId())) { + analysisParams.setVariantStatsId(OPENCGA_ALL); } - } - - private void runVariantStats() throws ToolException { - if (variantStatsJob == null) { - addWarning("Skipping sample variant stats"); - } else { - Path path = Paths.get(variantStatsJob.getOutDir().getUri().getPath()).resolve("sample-variant-stats.json"); - if (path.toFile().exists()) { - if (variantQcMetrics.getVariantStats() == null) { - variantQcMetrics.setVariantStats(new ArrayList<>()); - } - - List stats = new ArrayList<>(); - try { - JacksonUtils.getDefaultObjectMapper() - .readerFor(SampleVariantStats.class) - .readValues(path.toFile()) - .forEachRemaining(stats::add); - } catch (IOException e) { - throw new ToolException(e); - } - // Convert variant stats query to a map, and then add to metrics - Map query = new HashMap<>(); - Iterator iterator = variantStatsQuery.keySet().iterator(); - while (iterator.hasNext()) { - String key = iterator.next(); - query.put(key, variantStatsQuery.getString(key)); + if (sample.getQualityControl() != null && sample.getQualityControl().getVariantMetrics() != null) { + if (CollectionUtils.isNotEmpty(sample.getQualityControl().getVariantMetrics().getVariantStats()) + && OPENCGA_ALL.equals(analysisParams.getVariantStatsId())) { + runVariantStats = false; + } else { + for (SampleQcVariantStats variantStats : sample.getQualityControl().getVariantMetrics().getVariantStats()) { + if (variantStats.getId().equals(analysisParams.getVariantStatsId())) { + throw new ToolException("Invalid parameters: variant stats ID '" + analysisParams.getVariantStatsId() + + "' is already used"); + } } - - variantQcMetrics.getVariantStats().add(new SampleQcVariantStats(variantStatsId, variantStatsDecription, query, stats.get(0))); } } - } - private void runSignature() throws ToolException { + // Check mutational signature if (!sample.isSomatic()) { - addWarning("Skipping mutational signature: sample '" + sampleId + " is not somatic"); - return; + runSignature = false; } - // mutationalSignature/run - if (signatureJob != null) { - Path path = Paths.get(signatureJob.getOutDir().getUri().getPath()).resolve(CONTEXT_FILENAME); - if (path.toFile().exists()) { - Signature.SignatureCount[] signatureCounts = MutationalSignatureAnalysis.parseSignatureCounts(path.toFile()); - - // Add to metrics - variantQcMetrics.getSignatures().add(new Signature("ALL", new HashMap<>(), "SNV", signatureCounts, new ArrayList())); - } - } - - // mutationalSignature/query - if (StringUtils.isNotEmpty(signatureId) && signatureQuery != null && !signatureQuery.isEmpty()) { - // Create signature directory - Path signaturePath = getOutDir().resolve("mutational-signature"); - signaturePath.toFile().mkdir(); - - MutationalSignatureLocalAnalysisExecutor executor = new MutationalSignatureLocalAnalysisExecutor(); - ObjectMap executorParams = new ObjectMap(); - executorParams.put("opencgaHome", getOpencgaHome().toString()); - executorParams.put("token", token); - executorParams.put("fitting", false); - executor.setUp(null, executorParams, signaturePath); - executor.setStudy(studyId); - executor.setSampleName(sampleId); - - try { - signatureQuery.put("study", studyId); - signatureQuery.put("sample", sampleId); - MutationalSignature mutationalSignature = executor.query(signatureQuery, QueryOptions.empty()); - - // Add signature to metrics - Map map = new HashMap<>(); - for (String key : signatureQuery.keySet()) { - map.put(key, signatureQuery.getString(key)); - } - variantQcMetrics.getSignatures().add(new Signature(signatureId, map, "SNV", mutationalSignature.getSignature().getCounts(), - new ArrayList())); - } catch (CatalogException | StorageEngineException | IOException e) { - throw new ToolException("Error computing mutational signature for query '" + signatureId + "'", e); - } + // Check genome plot + if (StringUtils.isEmpty(analysisParams.getGenomePlotConfigFile())) { + runGenomePlot = false; } else { - addWarning("Skipping mutational signature: invalid parameters signature ID ('" + signatureId + "') and signature query('" - + signatureQuery + "')"); + File genomePlotConfFile = AnalysisUtils.getCatalogFile(analysisParams.getGenomePlotConfigFile(), getStudy(), + catalogManager.getFileManager(), getToken()); + genomePlotConfigPath = Paths.get(genomePlotConfFile.getUri().getPath()); + if (!genomePlotConfigPath.toFile().exists()) { + throw new ToolException("Invalid parameters: genome plot configuration file does not exist (" + genomePlotConfigPath + ")"); + } } } - private void runCircosPlot() throws ToolException { - if (circosJob == null) { - addWarning("Skipping Circos plot"); - } else { - + @Override + protected void run() throws ToolException { + step(() -> { try { - List paths = Files.list(Paths.get(circosJob.getOutDir().getUri().getPath())).collect(Collectors.toList()); - for (Path path : paths) { - if (path.getFileName().endsWith(CircosAnalysis.SUFFIX_FILENAME)) { - int index = path.toFile().getAbsolutePath().indexOf("JOBS/"); - String relativeFilePath = (index == -1 - ? path.toFile().getName() - : path.toFile().getAbsolutePath().substring(index)); - CircosPlot circosPlot = new CircosPlot(circosJob.getId(), null, relativeFilePath); - if (variantQcMetrics.getCircosPlots() == null) { - variantQcMetrics.setCircosPlots(new ArrayList<>()); - } - variantQcMetrics.getCircosPlots().add(circosPlot); - break; - } + Map params; + OpenCGAResult variantStatsJobResult; + OpenCGAResult signatureJobResult; + OpenCGAResult genomePlotJobResult; + + if (runVariantStats) { + // Run variant stats + params = new SampleVariantStatsAnalysisParams(Collections.singletonList(analysisParams.getSample()), null, null, true, + false, analysisParams.getVariantStatsId(), analysisParams.getVariantStatsDescription(), null, + analysisParams.getVariantStatsQuery()) + .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudy())); + + variantStatsJobResult = catalogManager.getJobManager() + .submit(getStudy(), SampleVariantStatsAnalysis.ID, Enums.Priority.MEDIUM, params, null, "Job generated by " + + getId() + " - " + getJobId(), Collections.emptyList(), Collections.emptyList(), token); + addEvent(Event.Type.INFO, "Submit job " + variantStatsJobResult.first().getId() + " to compute sample variant stats (" + + SampleVariantStatsAnalysis.ID + ")"); } - } catch (IOException e) { - throw new ToolException(e); - } - } - } - public SampleQcAnalysis setStudyId(String studyId) { - super.setStudy(studyId); - return this; - } + if (runSignature) { + // Run mutational signatures + params = new MutationalSignatureAnalysisParams(analysisParams.getSample(), null) + .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudy())); - public String getSampleId() { - return sampleId; - } - - public SampleQcAnalysis setSampleId(String sampleId) { - this.sampleId = sampleId; - return this; - } - - public String getVariantStatsId() { - return variantStatsId; - } - - public SampleQcAnalysis setVariantStatsId(String variantStatsId) { - this.variantStatsId = variantStatsId; - return this; - } - - public String getVariantStatsDecription() { - return variantStatsDecription; - } - - public SampleQcAnalysis setVariantStatsDecription(String variantStatsDecription) { - this.variantStatsDecription = variantStatsDecription; - return this; - } - - public Query getVariantStatsQuery() { - return variantStatsQuery; - } - - public SampleQcAnalysis setVariantStatsQuery(Query variantStatsQuery) { - this.variantStatsQuery = variantStatsQuery; - return this; - } - - public String getSignatureId() { - return signatureId; - } + signatureJobResult = catalogManager.getJobManager() + .submit(getStudy(), MutationalSignatureAnalysis.ID, Enums.Priority.MEDIUM, params, null, "Job generated by " + + getId() + " - " + getJobId(), Collections.emptyList(), Collections.emptyList(), token); + addEvent(Event.Type.INFO, "Submit job " + signatureJobResult.first().getId() + " to compute the mutational signature (" + + MutationalSignatureAnalysis.ID + ")"); + } - public SampleQcAnalysis setSignatureId(String signatureId) { - this.signatureId = signatureId; - return this; - } + if (runGenomePlot) { + // Run genome plot + params = new GenomePlotAnalysisParams(analysisParams.getGenomePlotConfigFile(), null) + .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudy())); + + genomePlotJobResult = catalogManager.getJobManager() + .submit(getStudy(), GenomePlotAnalysis.ID, Enums.Priority.MEDIUM, params, null, + "Job generated by " + getId() + " - " + getJobId(), Collections.emptyList(), Collections.emptyList(), + token); + addEvent(Event.Type.INFO, "Submit job " + genomePlotJobResult.first().getId() + " to compute genome plot (" + + GenomePlotAnalysis.ID + ")"); + } - public Query getSignatureQuery() { - return signatureQuery; - } - public SampleQcAnalysis setSignatureQuery(Query signatureQuery) { - this.signatureQuery = signatureQuery; - return this; + // Wait for those jobs ??? +// waitFor(variantStatsJobResult.first().getId()); +// waitFor(signatureJobResult.first().getId()); +// waitFor(genomePlotJobResult.first().getId()); + } catch (CatalogException e) { + throw new ToolException(e); + } + }); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosAnalysis.java deleted file mode 100644 index 41b127928de..00000000000 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosAnalysis.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.analysis.variant.circos; - -import org.opencb.opencga.analysis.tools.OpenCgaTool; -import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.variant.CircosAnalysisParams; -import org.opencb.opencga.core.tools.annotations.Tool; -import org.opencb.opencga.core.tools.variant.CircosAnalysisExecutor; - -import java.util.HashMap; -import java.util.Map; - -@Tool(id = CircosAnalysis.ID, resource = Enums.Resource.VARIANT) -public class CircosAnalysis extends OpenCgaTool { - - public static final String ID = "circos"; - public static final String DESCRIPTION = "Generate a Circos plot for a given sample."; - - public final static String SUFFIX_FILENAME = ".genomePlot.png"; - - private String study; - private CircosAnalysisParams circosParams; - - @Override - protected void check() throws Exception { - super.check(); - setUpStorageEngineExecutor(study); - - if (study == null || study.isEmpty()) { - throw new ToolException("Missing study"); - } - -// String sampleName = query.getString(SAMPLE.key()); -// try { -// study = catalogManager.getStudyManager().get(study, null, token).first().getFqn(); -// -// if (StringUtils.isNotEmpty(sampleName)) { -// OpenCGAResult sampleResult = catalogManager.getSampleManager().get(study, sampleName, new QueryOptions(), token); -// if (sampleResult.getNumResults() != 1) { -// throw new ToolException("Unable to compute mutational signature analysis. Sample '" + sampleName + "' not found"); -// } -// } -// } catch (CatalogException e) { -// throw new ToolException(e); -// } -// -// addAttribute("sampleName", sampleName); - } - - @Override - protected void run() throws ToolException { - step(getId(), () -> { - getToolExecutor(CircosAnalysisExecutor.class) - .setStudy(study) - .setCircosParams(circosParams) - .execute(); - }); - } - - public String getStudy() { - return study; - } - - public CircosAnalysis setStudy(String study) { - this.study = study; - return this; - } - - public CircosAnalysisParams getCircosParams() { - return circosParams; - } - - public CircosAnalysis setCircosParams(CircosAnalysisParams circosParams) { - this.circosParams = circosParams; - return this; - } -} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java new file mode 100644 index 00000000000..52b9f33383f --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java @@ -0,0 +1,93 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.variant.genomePlot; + +import org.apache.commons.lang3.StringUtils; +import org.opencb.opencga.analysis.AnalysisUtils; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.variant.GenomePlotAnalysisParams; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; +import org.opencb.opencga.core.tools.variant.GenomePlotAnalysisExecutor; + +import java.nio.file.Paths; + +@Tool(id = GenomePlotAnalysis.ID, resource = Enums.Resource.VARIANT) +public class GenomePlotAnalysis extends OpenCgaToolScopeStudy { + + public static final String ID = "genome-plot"; + public static final String DESCRIPTION = "Generate a genome plot for a given sample."; + + public final static String SUFFIX_FILENAME = ".genomePlot.png"; + + @ToolParams + private GenomePlotAnalysisParams genomePlotParams = new GenomePlotAnalysisParams(); + + private java.io.File configFile; + + @Override + protected void check() throws Exception { + super.check(); + setUpStorageEngineExecutor(study); + + if (StringUtils.isEmpty(getStudy())) { + throw new ToolException("Missing study"); + } + + if (StringUtils.isEmpty(genomePlotParams.getConfigFile())) { + throw new ToolException("Missing Genome plot configuration file"); + } + + File catalogFile = AnalysisUtils.getCatalogFile(genomePlotParams.getConfigFile(), getStudy(), getCatalogManager().getFileManager(), + getToken()); + configFile = Paths.get(catalogFile.getUri().getPath()).toFile(); + if (!configFile.exists()) { + throw new ToolException("Invalid parameters: genome plot configuration file does not exist (" + configFile + ")"); + } + } + + @Override + protected void run() throws ToolException { + step(getId(), () -> { + getToolExecutor(GenomePlotAnalysisExecutor.class) + .setStudy(study) + .setConfigFile(configFile) + .execute(); + }); + } + + public String getStudy() { + return study; + } + + public GenomePlotAnalysis setStudy(String study) { + this.study = study; + return this; + } + + public GenomePlotAnalysisParams getGenomePlotParams() { + return genomePlotParams; + } + + public GenomePlotAnalysis setGenomePlotParams(GenomePlotAnalysisParams genomePlotParams) { + this.genomePlotParams = genomePlotParams; + return this; + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotLocalAnalysisExecutor.java similarity index 80% rename from opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java rename to opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotLocalAnalysisExecutor.java index 60d9bb1f2fd..a26e9dea2df 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotLocalAnalysisExecutor.java @@ -14,12 +14,14 @@ * limitations under the License. */ -package org.opencb.opencga.analysis.variant.circos; +package org.opencb.opencga.analysis.variant.genomePlot; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; +import org.opencb.biodata.models.clinical.qc.GenomePlotConfig; +import org.opencb.biodata.models.clinical.qc.GenomePlotTrack; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.BreakendMate; @@ -31,13 +33,11 @@ import org.opencb.opencga.analysis.StorageToolExecutor; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.core.common.GitRepositoryState; +import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.exceptions.ToolExecutorException; -import org.opencb.opencga.core.models.variant.CircosAnalysisParams; -import org.opencb.opencga.core.models.variant.CircosTrack; import org.opencb.opencga.core.tools.annotations.ToolExecutor; -import org.opencb.opencga.core.tools.variant.CircosAnalysisExecutor; +import org.opencb.opencga.core.tools.variant.GenomePlotAnalysisExecutor; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.slf4j.Logger; @@ -46,19 +46,23 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; -import java.util.*; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import java.util.concurrent.*; import static org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor.DOCKER_INPUT_PATH; import static org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor.DOCKER_OUTPUT_PATH; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.STUDY; -@ToolExecutor(id="opencga-local", tool = CircosAnalysis.ID, +@ToolExecutor(id="opencga-local", tool = GenomePlotAnalysis.ID, framework = ToolExecutor.Framework.LOCAL, source = ToolExecutor.Source.STORAGE) -public class CircosLocalAnalysisExecutor extends CircosAnalysisExecutor implements StorageToolExecutor { +public class GenomePlotLocalAnalysisExecutor extends GenomePlotAnalysisExecutor implements StorageToolExecutor { public final static String R_DOCKER_IMAGE = "opencb/opencga-r:" + GitRepositoryState.get().getBuildVersion(); - private VariantStorageManager storageManager; + + private GenomePlotConfig plotConfig; private File snvsFile; private File rearrsFile; @@ -73,30 +77,15 @@ public class CircosLocalAnalysisExecutor extends CircosAnalysisExecutor implemen private Logger logger = LoggerFactory.getLogger(this.getClass()); - public CircosLocalAnalysisExecutor() { - super(); - } - - public CircosLocalAnalysisExecutor(String study, CircosAnalysisParams params, VariantStorageManager storageManager) { - super(study, params); - this.storageManager = storageManager; - } - - @Override - public VariantStorageManager getVariantStorageManager() throws ToolExecutorException { - if (storageManager == null) { - storageManager = StorageToolExecutor.super.getVariantStorageManager(); - } - return storageManager; - } - @Override public void run() throws ToolException, IOException { + plotConfig = JacksonUtils.getDefaultObjectMapper().readerFor(GenomePlotConfig.class).readValue(getConfigFile()); + // Create query Query query = new Query(); - if (MapUtils.isNotEmpty(getCircosParams().getQuery())) { - query.putAll(getCircosParams().getQuery()); + if (MapUtils.isNotEmpty(plotConfig.getGeneralQuery())) { + query.putAll(plotConfig.getGeneralQuery()); } query.put(STUDY.key(), getStudy()); @@ -143,7 +132,7 @@ public void run() throws ToolException, IOException { + " " + DOCKER_OUTPUT_PATH + "/" + indelsFile.getName() + " " + DOCKER_OUTPUT_PATH + "/" + cnvsFile.getName() + " " + DOCKER_OUTPUT_PATH + "/" + rearrsFile.getName() - + " " + getCircosParams().getTitle(); + + " " + plotConfig.getTitle(); StopWatch stopWatch = StopWatch.createStarted(); String cmdline = DockerUtils.run(R_DOCKER_IMAGE, inputBindings, outputBinding, scriptParams, null); @@ -181,14 +170,9 @@ private boolean snvQuery(Query query, VariantStorageManager storageManager) { pwOut = new PrintWriter(getOutDir().resolve("snvs.discarded").toFile()); - CircosTrack snvTrack = getCircosParams().getCircosTrackByType("SNV"); - if (snvTrack == null) { - throw new ToolException("Missing SNV track"); - } - int threshold; - switch (getCircosParams().getDensity()) { + switch (plotConfig.getDensity()) { case "HIGH": threshold = Integer.MAX_VALUE; break; @@ -201,10 +185,12 @@ private boolean snvQuery(Query query, VariantStorageManager storageManager) { break; } - Map trackQuery = checkTrackQuery(snvTrack); - + GenomePlotTrack track = plotConfig.getTrack("SNV"); Query snvQuery = new Query(query); - snvQuery.putAll(trackQuery); + if (track != null && MapUtils.isNotEmpty(track.getQuery())) { + snvQuery.putAll(track.getQuery()); + } + snvQuery.put("type", "SNV"); QueryOptions queryOptions = new QueryOptions() .append(QueryOptions.INCLUDE, "id") @@ -267,14 +253,14 @@ private boolean copyNumberQuery(Query query, VariantStorageManager storageManage pwOut = new PrintWriter(getOutDir().resolve("cnvs.discarded").toFile()); - CircosTrack copyNumberTrack = getCircosParams().getCircosTrackByType("COPY-NUMBER"); - if (copyNumberTrack != null) { - plotCopynumber = true; - Map trackQuery = checkTrackQuery(copyNumberTrack); + GenomePlotTrack track = plotConfig.getTrack("COPY-NUMBER"); + if (track != null) { + plotCopynumber = true; Query copyNumberQuery = new Query(query); - copyNumberQuery.putAll(trackQuery); + copyNumberQuery.putAll(track.getQuery()); + copyNumberQuery.put("type", "CNV"); QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id,studies"); @@ -343,14 +329,13 @@ private boolean indelQuery(Query query, VariantStorageManager storageManager) { pwOut = new PrintWriter(getOutDir().resolve("indels.discarded").toFile()); - CircosTrack indelTrack = getCircosParams().getCircosTrackByType("INDEL"); - if (indelTrack != null) { + GenomePlotTrack track = plotConfig.getTrack("INDEL"); + if (track != null) { plotIndels = true; - Map trackQuery = checkTrackQuery(indelTrack); - Query indelQuery = new Query(query); - indelQuery.putAll(trackQuery); + indelQuery.putAll(track.getQuery()); + indelQuery.put("type", "INSERTION,DELETION,INDEL"); QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id"); @@ -368,34 +353,11 @@ private boolean indelQuery(Query query, VariantStorageManager storageManager) { } else { pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tDI\tNone"); } - /* - switch (v.getType()) { - case INSERTION: { - pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tI\tNone"); - break; - } - case DELETION: { - pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tD\tNone"); - break; - } - case INDEL: { - pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tDI\tNone"); - break; - } - default: { - // Sanity check - pwOut.println(v.toString() + "\tInvalid type " + v.getType() + ". Valid values: " + VariantType.INSERTION - + ", " + DELETION + ", " + VariantType.INDEL); - break; - } - } - */ } } } catch(Exception e){ errors.put("INDEL", e); return false; -// throw new ToolExecutorException(e); } finally { if (pw != null) { pw.close(); @@ -424,14 +386,13 @@ private boolean rearrangementQuery(Query query, VariantStorageManager storageMan pwOut = new PrintWriter(getOutDir().resolve("rearrs.discarded").toFile()); - CircosTrack rearrangementTrack = getCircosParams().getCircosTrackByType("REARRANGEMENT"); - if (rearrangementTrack != null) { + GenomePlotTrack track = plotConfig.getTrack("REARRANGEMENT"); + if (track != null) { plotRearrangements = true; - Map trackQuery = checkTrackQuery(rearrangementTrack); - Query rearrangementQuery = new Query(query); - rearrangementQuery.putAll(trackQuery); + rearrangementQuery.putAll(track.getQuery()); + rearrangementQuery.put("type", "DELETION,TRANSLOCATION,INVERSION,DUPLICATION,TANDEM_DUPLICATION,BREAKEND"); QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id,sv,studies"); @@ -494,26 +455,4 @@ private Callable getNamedThread(String name, Callable c) { return c.call(); }; } - - private Map checkTrackQuery(CircosTrack track) throws ToolException { - Map query = new HashMap<>(); - - if (MapUtils.isNotEmpty(track.getQuery())) { - query = track.getQuery(); - } - - if ("COPY-NUMBER".equals(track.getType())) { - query.put("type", "CNV"); - } else if ("INDEL".equals(track.getType())) { - query.put("type", "INSERTION,DELETION,INDEL"); - } else if ("REARRANGEMENT".equals(track.getType())) { - query.put("type", "DELETION,TRANSLOCATION,INVERSION,DUPLICATION,TANDEM_DUPLICATION,BREAKEND"); - } else if ("SNV".equals(track.getType())) { - query.put("type", "SNV"); - } else { - throw new ToolException("Unknown Circos track type: '" + track.getType() + "'"); - } - - return query; - } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index c34485eb435..57e4b00f7a9 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -62,6 +62,7 @@ import org.opencb.opencga.core.models.common.GenericRecordAvroJsonMixin; import org.opencb.opencga.core.models.operations.variant.*; import org.opencb.opencga.core.models.variant.*; +import org.opencb.opencga.core.tools.ToolParams; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.exceptions.VariantSearchException; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; @@ -74,7 +75,10 @@ import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.CohortVariantStatsCommandOptions.COHORT_VARIANT_STATS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.FamilyIndexCommandOptions.FAMILY_INDEX_COMMAND; @@ -865,35 +869,23 @@ private void individualQc() throws Exception { private void sampleQc() throws Exception { VariantCommandOptions.SampleQcCommandOptions cliOptions = variantCommandOptions.sampleQcCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.commonOptions.params); // Build variant query from cli options - Query variantStatsQuery = new Query(); - variantStatsQuery.putAll(cliOptions.variantStatsQuery); - - // Build signature query from cli options - Query signatureQuery = new Query(); - signatureQuery.putAll(cliOptions.signatureQuery); - -// // Build list of genes from cli options -// List genesForCoverageStats = StringUtils.isEmpty(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats) -// ? new ArrayList<>() -// : Arrays.asList(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats.split(",")); + AnnotationVariantQueryParams variantStatsQuery = ToolParams.fromParams(AnnotationVariantQueryParams.class, + cliOptions.variantStatsQuery); - SampleQcAnalysis sampleQcAnalysis = new SampleQcAnalysis(); - sampleQcAnalysis.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), - variantCommandOptions.internalJobOptions.jobId, token); - sampleQcAnalysis.setStudyId(cliOptions.study) - .setSampleId(cliOptions.sample) - .setVariantStatsId(cliOptions.variantStatsId) - .setVariantStatsDecription(cliOptions.variantStatsDecription) - .setVariantStatsQuery(variantStatsQuery) - .setSignatureId(cliOptions.signatureId) - .setSignatureQuery(signatureQuery); -// .setGenesForCoverageStats(genesForCoverageStats); - - sampleQcAnalysis.start(); + ObjectMap params = new SampleQcAnalysisParams( + cliOptions.sample, + cliOptions.variantStatsId, + cliOptions.variantStatsDecription, + variantStatsQuery, +// cliOptions.signatureId, +// signatureQuery, + cliOptions.genomePlotConfigFile, + cliOptions.outdir) + .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); + + toolRunner.execute(SampleQcAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } // Wrappers diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index 904b5fee0c6..51473bc6d9d 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1395,14 +1395,14 @@ public class SampleQcCommandOptions { @DynamicParameter(names = {"--vsq", "--variant-stats-query"}, description = "Variant stats query, e.g.:. --vsq gene=\"BRCA2\" --vsq ct=\"missense_variant\"") public Map variantStatsQuery = new HashMap<>(); - @Parameter(names = {"--signature-id"}, description = "Signature ID.") - public String signatureId; - - @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") - public Map signatureQuery = new HashMap<>(); - -// @Parameter(names = {"--genes-for-coverage-stats"}, description = "A comma separated list of genes to compute the coverage stats.") -// public String genesForCoverageStats; +// @Parameter(names = {"--signature-id"}, description = "Signature ID.") +// public String signatureId; +// +// @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") +// public Map signatureQuery = new HashMap<>(); + + @Parameter(names = {"--gpcf", "--genome-plot-config-file"}, description = "Genome plot configuration file in JSON format.") + public String genomePlotConfigFile; @Parameter(names = {"-o", "--outdir"}, description = "Output directory.") public String outdir; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 401ffae5107..9f940acb2b3 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -414,26 +414,19 @@ private RestResponse sampleQc() throws ClientException { AnnotationVariantQueryParams variantStatsQuery = ToolParams.fromParams(AnnotationVariantQueryParams.class, cliOptions.variantStatsQuery); - // Build signature query from cli options - SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, cliOptions.signatureQuery); - -// // Build list of genes from cli options -// List genesForCoverageStats = StringUtils.isEmpty(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats) -// ? new ArrayList<>() -// : Arrays.asList(variantCommandOptions.sampleQcCommandOptions.genesForCoverageStats.split(",")); +// // Build signature query from cli options +// SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, cliOptions.signatureQuery); return openCGAClient.getVariantClient().runSampleQc( new SampleQcAnalysisParams( - variantCommandOptions.sampleQcCommandOptions.sample, - variantCommandOptions.sampleQcCommandOptions.variantStatsId, - variantCommandOptions.sampleQcCommandOptions.variantStatsDecription, + cliOptions.sample, + cliOptions.variantStatsId, + cliOptions.variantStatsDecription, variantStatsQuery, - variantCommandOptions.sampleQcCommandOptions.signatureId, - signatureQuery, - //genesForCoverageStats, - null, - null, - variantCommandOptions.sampleQcCommandOptions.outdir +// cliOptions.signatureId, +// signatureQuery, + cliOptions.genomePlotConfigFile, + cliOptions.outdir ), getParams(variantCommandOptions.sampleQcCommandOptions.study) ); @@ -764,7 +757,7 @@ private RestResponse rvtests() throws ClientException { ObjectMap params = new ObjectMap(FileDBAdaptor.QueryParams.STUDY.key(), cliOptions.study); return openCGAClient.getVariantClient().runRvtests(new RvtestsWrapperParams(cliOptions.command, cliOptions.outdir, - cliOptions.rvtestsParams), params); + cliOptions.rvtestsParams), params); } private ObjectMap getParams(String study) { diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 91b7500fd1c..33008e3ade8 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -144,19 +144,19 @@ public RestResponse queryAnnotation(ObjectMap params) throws } /** - * Generate a Circos plot for a given sample. - * @param data Circos analysis params to customize the plot. These parameters include the title, the plot density (i.e., the number of - * points to display), the general query and the list of tracks. Currently, the supported track types are: COPY-NUMBER, INDEL, - * REARRANGEMENT and SNV. In addition, each track can contain a specific query. + * Generate a genome plot for a given sample. + * @param data Genome plot analysis params to customize the plot. The configuration file include the title, the plot density (i.e., + * the number of points to display), the general query and the list of tracks. Currently, the supported track types are: + * COPY-NUMBER, INDEL, REARRANGEMENT and SNV. In addition, each track can contain a specific query. * @param params Map containing any of the following optional parameters. * study: study. * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse runCircos(CircosAnalysisParams data, ObjectMap params) throws ClientException { + public RestResponse runGenomePlot(GenomePlotAnalysisParams data, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); params.put("body", data); - return execute("analysis", null, "variant/circos", null, "run", params, POST, String.class); + return execute("analysis", null, "variant/genomePlot", null, "run", params, POST, String.class); } /** diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java index d99a1c6240e..b0bc1710dbd 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java @@ -1,6 +1,6 @@ package org.opencb.opencga.core.models.sample; -import org.opencb.biodata.models.clinical.qc.CircosPlot; +import org.opencb.biodata.models.clinical.qc.GenomePlot; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.biodata.models.clinical.qc.Signature; @@ -11,7 +11,7 @@ public class SampleVariantQualityControlMetrics { private List variantStats; private List signatures; - private List circosPlots; + private List genomePlots; private List vcfFileIds; public SampleVariantQualityControlMetrics() { @@ -22,15 +22,15 @@ public SampleVariantQualityControlMetrics(List variantStat List vcfFileIds) { this.variantStats = variantStats; this.signatures = signatures; - this.circosPlots = new ArrayList<>(); + this.genomePlots = new ArrayList<>(); this.vcfFileIds = vcfFileIds; } public SampleVariantQualityControlMetrics(List variantStats, List signatures, - List circosPlots, List vcfFileIds) { + List genomePlots, List vcfFileIds) { this.variantStats = variantStats; this.signatures = signatures; - this.circosPlots = circosPlots; + this.genomePlots = genomePlots; this.vcfFileIds = vcfFileIds; } @@ -39,7 +39,7 @@ public String toString() { final StringBuilder sb = new StringBuilder("SampleVariantQualityControlMetrics{"); sb.append("variantStats=").append(variantStats); sb.append(", signatures=").append(signatures); - sb.append(", circosPlots=").append(circosPlots); + sb.append(", genomePlots=").append(genomePlots); sb.append(", vcfFileIds=").append(vcfFileIds); sb.append('}'); return sb.toString(); @@ -63,12 +63,12 @@ public SampleVariantQualityControlMetrics setSignatures(List signatur return this; } - public List getCircosPlots() { - return circosPlots; + public List getGenomePlots() { + return genomePlots; } - public SampleVariantQualityControlMetrics setCircosPlots(List circosPlots) { - this.circosPlots = circosPlots; + public SampleVariantQualityControlMetrics setGenomePlots(List genomePlots) { + this.genomePlots = genomePlots; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java deleted file mode 100644 index c535547f66a..00000000000 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2015-2020 OpenCB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.opencb.opencga.core.models.variant; - -import org.apache.commons.collections4.CollectionUtils; -import org.opencb.opencga.core.tools.ToolParams; - -import java.util.List; -import java.util.Map; - -public class CircosAnalysisParams extends ToolParams { - public static final String DESCRIPTION = "Circos analysis params to customize the plot. These parameters include the title, the " - + "plot density (i.e., the number of points to display), the general query and the list of tracks. Currently, the supported " - + "track types are: COPY-NUMBER, INDEL, REARRANGEMENT and SNV. In addition, each track can contain a specific query"; - private String title; - private String density; // Density plot: LOW, MEDIUM or HIGH - private Map query; - private List tracks; - - private String outdir; - - public CircosAnalysisParams() { - this(null, "LOW", null, null, null); - } - - public CircosTrack getCircosTrackByType(String type) { - // Sanity check - if (tracks == null || CollectionUtils.isEmpty(tracks)) { - return null; - } - - for (CircosTrack track: tracks) { - if (type.equals(track.getType())) { - // Return the first track - return track; - } - } - return null; - } - - public CircosAnalysisParams(String title, String density, Map query, List tracks, String outdir) { - this.title = title; - this.density = density; - this.query = query; - this.tracks = tracks; - this.outdir = outdir; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("CircosAnalysisParams{"); - sb.append("title='").append(title).append('\''); - sb.append(", density='").append(density).append('\''); - sb.append(", query=").append(query); - sb.append(", tracks=").append(tracks); - sb.append(", outdir='").append(outdir).append('\''); - sb.append('}'); - return sb.toString(); - } - - public String getTitle() { - return title; - } - - public CircosAnalysisParams setTitle(String title) { - this.title = title; - return this; - } - - public String getDensity() { - return density; - } - - public CircosAnalysisParams setDensity(String density) { - this.density = density; - return this; - } - - public Map getQuery() { - return query; - } - - public CircosAnalysisParams setQuery(Map query) { - this.query = query; - return this; - } - - public List getTracks() { - return tracks; - } - - public CircosAnalysisParams setTracks(List tracks) { - this.tracks = tracks; - return this; - } - - public String getOutdir() { - return outdir; - } - - public CircosAnalysisParams setOutdir(String outdir) { - this.outdir = outdir; - return this; - } -} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosTrack.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosTrack.java deleted file mode 100644 index d40a03ce3cd..00000000000 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosTrack.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.opencb.opencga.core.models.variant; - -import java.util.Map; - -public class CircosTrack { - private String id; - private String type; - private Map query; - - public CircosTrack() { - } - - public CircosTrack(String id, String type, Map query) { - this.id = id; - this.type = type; - this.query = query; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("CircosTrack{"); - sb.append("id='").append(id).append('\''); - sb.append(", type='").append(type).append('\''); - sb.append(", query=").append(query); - sb.append('}'); - return sb.toString(); - } - - public String getId() { - return id; - } - - public CircosTrack setId(String id) { - this.id = id; - return this; - } - - public String getType() { - return type; - } - - public CircosTrack setType(String type) { - this.type = type; - return this; - } - - public Map getQuery() { - return query; - } - - public CircosTrack setQuery(Map query) { - this.query = query; - return this; - } -} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java new file mode 100644 index 00000000000..c1c1b283557 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java @@ -0,0 +1,63 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.core.models.variant; + +import org.opencb.opencga.core.tools.ToolParams; + +public class GenomePlotAnalysisParams extends ToolParams { + public static final String DESCRIPTION = "Genome plot analysis params to customize the plot. The configuration file includes the title, " + + " the plot density (i.e., the number of points to display), the general query and the list of tracks. Currently, the supported " + + "track types are: COPY-NUMBER, INDEL, REARRANGEMENT and SNV. In addition, each track can contain a specific query"; + private String configFile; + + private String outdir; + + public GenomePlotAnalysisParams() { + } + + public GenomePlotAnalysisParams(String configFile, String outdir) { + this.configFile = configFile; + this.outdir = outdir; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("GenomePlotAnalysisParams{"); + sb.append("configFile='").append(configFile).append('\''); + sb.append(", outdir='").append(outdir).append('\''); + sb.append('}'); + return sb.toString(); + } + + public String getConfigFile() { + return configFile; + } + + public GenomePlotAnalysisParams setConfigFile(String configFile) { + this.configFile = configFile; + return this; + } + + public String getOutdir() { + return outdir; + } + + public GenomePlotAnalysisParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java index c344412f726..9686eb780da 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java @@ -18,37 +18,25 @@ import org.opencb.opencga.core.tools.ToolParams; -import java.util.List; -import java.util.Map; - public class SampleQcAnalysisParams extends ToolParams { public static final String DESCRIPTION = "Sample QC analysis params"; private String sample; private String variantStatsId; private String variantStatsDescription; private AnnotationVariantQueryParams variantStatsQuery; - private String signatureId; - private SampleQcSignatureQueryParams signatureQuery; - private Map circosQuery; - private List circosTracks; - + private String genomePlotConfigFile; private String outdir; public SampleQcAnalysisParams() { } public SampleQcAnalysisParams(String sample, String variantStatsId, String variantStatsDescription, - AnnotationVariantQueryParams variantStatsQuery, String signatureId, - SampleQcSignatureQueryParams signatureQuery, Map circosQuery, - List circosTracks, String outdir) { + AnnotationVariantQueryParams variantStatsQuery, String genomePlotConfigFile, String outdir) { this.sample = sample; this.variantStatsId = variantStatsId; this.variantStatsDescription = variantStatsDescription; this.variantStatsQuery = variantStatsQuery; - this.signatureId = signatureId; - this.signatureQuery = signatureQuery; - this.circosQuery = circosQuery; - this.circosTracks = circosTracks; + this.genomePlotConfigFile = genomePlotConfigFile; this.outdir = outdir; } @@ -59,10 +47,7 @@ public String toString() { sb.append(", variantStatsId='").append(variantStatsId).append('\''); sb.append(", variantStatsDescription='").append(variantStatsDescription).append('\''); sb.append(", variantStatsQuery=").append(variantStatsQuery); - sb.append(", signatureId='").append(signatureId).append('\''); - sb.append(", signatureQuery=").append(signatureQuery); - sb.append(", circosQuery=").append(circosQuery); - sb.append(", circosTracks=").append(circosTracks); + sb.append(", genomePlotConfigFile='").append(genomePlotConfigFile).append('\''); sb.append(", outdir='").append(outdir).append('\''); sb.append('}'); return sb.toString(); @@ -104,39 +89,12 @@ public SampleQcAnalysisParams setVariantStatsQuery(AnnotationVariantQueryParams return this; } - public String getSignatureId() { - return signatureId; - } - - public SampleQcAnalysisParams setSignatureId(String signatureId) { - this.signatureId = signatureId; - return this; - } - - public SampleQcSignatureQueryParams getSignatureQuery() { - return signatureQuery; - } - - public SampleQcAnalysisParams setSignatureQuery(SampleQcSignatureQueryParams signatureQuery) { - this.signatureQuery = signatureQuery; - return this; - } - - public Map getCircosQuery() { - return circosQuery; - } - - public SampleQcAnalysisParams setCircosQuery(Map circosQuery) { - this.circosQuery = circosQuery; - return this; - } - - public List getCircosTracks() { - return circosTracks; + public String getGenomePlotConfigFile() { + return genomePlotConfigFile; } - public SampleQcAnalysisParams setCircosTracks(List circosTracks) { - this.circosTracks = circosTracks; + public SampleQcAnalysisParams setGenomePlotConfigFile(String genomePlotConfigFile) { + this.genomePlotConfigFile = genomePlotConfigFile; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleVariantStatsAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleVariantStatsAnalysisParams.java index 12f0b3f23bc..6b764398695 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleVariantStatsAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleVariantStatsAnalysisParams.java @@ -71,12 +71,14 @@ public SampleVariantStatsAnalysisParams() { public SampleVariantStatsAnalysisParams(List sample, List individual, String outdir, boolean index, boolean indexOverwrite, String indexId, String indexDescription, Integer batchSize, AnnotationVariantQueryParams variantQuery) { - this(sample, individual, outdir, index, indexOverwrite, indexId, indexDescription, batchSize, new VariantQueryParams(variantQuery.toQuery())); + this(sample, individual, outdir, index, indexOverwrite, indexId, indexDescription, batchSize, + variantQuery == null ? null : new VariantQueryParams(variantQuery.toQuery())); } public SampleVariantStatsAnalysisParams(List sample, List individual, String outdir, boolean index, boolean indexOverwrite, String indexId, String indexDescription, Integer batchSize, Query variantQuery) { - this(sample, individual, outdir, index, indexOverwrite, indexId, indexDescription, batchSize, new VariantQueryParams(variantQuery)); + this(sample, individual, outdir, index, indexOverwrite, indexId, indexDescription, batchSize, + variantQuery == null ? null : new VariantQueryParams(variantQuery)); } public SampleVariantStatsAnalysisParams(List sample, List individual, String outdir, boolean index, diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/CircosAnalysisExecutor.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/GenomePlotAnalysisExecutor.java similarity index 53% rename from opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/CircosAnalysisExecutor.java rename to opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/GenomePlotAnalysisExecutor.java index 89f1b7cc569..2205143c670 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/CircosAnalysisExecutor.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/GenomePlotAnalysisExecutor.java @@ -16,37 +16,47 @@ package org.opencb.opencga.core.tools.variant; -import org.opencb.opencga.core.models.variant.CircosAnalysisParams; import org.opencb.opencga.core.tools.OpenCgaToolExecutor; -public abstract class CircosAnalysisExecutor extends OpenCgaToolExecutor { +import java.io.File; + +public abstract class GenomePlotAnalysisExecutor extends OpenCgaToolExecutor { private String study; - private CircosAnalysisParams circosParams; + private File configFile; - public CircosAnalysisExecutor() { + public GenomePlotAnalysisExecutor() { } - public CircosAnalysisExecutor(String study, CircosAnalysisParams circosParams) { + public GenomePlotAnalysisExecutor(String study, File configFile) { this.study = study; - this.circosParams = circosParams; + this.configFile = configFile; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("GenomePlotAnalysisExecutor{"); + sb.append("study='").append(study).append('\''); + sb.append(", configFile=").append(configFile); + sb.append('}'); + return sb.toString(); } public String getStudy() { return study; } - public CircosAnalysisExecutor setStudy(String study) { + public GenomePlotAnalysisExecutor setStudy(String study) { this.study = study; return this; } - public CircosAnalysisParams getCircosParams() { - return circosParams; + public File getConfigFile() { + return configFile; } - public CircosAnalysisExecutor setCircosParams(CircosAnalysisParams params) { - this.circosParams = params; + public GenomePlotAnalysisExecutor setConfigFile(File configFile) { + this.configFile = configFile; return this; } } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 2978c4a9312..ab89bde6b01 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -18,13 +18,11 @@ import io.swagger.annotations.*; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.opencb.biodata.models.clinical.ClinicalProperty; import org.opencb.biodata.models.clinical.qc.MutationalSignature; -import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; @@ -37,8 +35,7 @@ import org.opencb.opencga.analysis.individual.qc.IndividualQcUtils; import org.opencb.opencga.analysis.sample.qc.SampleQcAnalysis; import org.opencb.opencga.analysis.variant.VariantExportTool; -import org.opencb.opencga.analysis.variant.circos.CircosAnalysis; -import org.opencb.opencga.analysis.variant.circos.CircosLocalAnalysisExecutor; +import org.opencb.opencga.analysis.variant.genomePlot.GenomePlotAnalysis; import org.opencb.opencga.analysis.variant.gwas.GwasAnalysis; import org.opencb.opencga.analysis.variant.inferredSex.InferredSexAnalysis; import org.opencb.opencga.analysis.variant.knockout.KnockoutAnalysis; @@ -1129,115 +1126,7 @@ public Response sampleQcRun( @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, @ApiParam(value = SampleQcAnalysisParams.DESCRIPTION, required = true) SampleQcAnalysisParams params) { - return run(() -> { - final String OPENCGA_ALL = "ALL"; - - List dependsOnList = StringUtils.isEmpty(dependsOn) ? new ArrayList<>() : Arrays.asList(dependsOn.split(",")); - - Sample sample; - sample = IndividualQcUtils.getValidSampleById(study, params.getSample(), catalogManager, token); - if (sample == null) { - throw new ToolException("Sample '" + params.getSample() + "' not found."); - } - - // Check variant stats - if (OPENCGA_ALL.equals(params.getVariantStatsId())) { - throw new ToolException("Invalid parameters: " + OPENCGA_ALL + " is a reserved word, you can not use as a" - + " variant stats ID"); - } - - if (StringUtils.isEmpty(params.getVariantStatsId()) && params.getVariantStatsQuery() != null - && !params.getVariantStatsQuery().toParams().isEmpty()) { - throw new ToolException("Invalid parameters: if variant stats ID is empty, variant stats query must be" - + " empty"); - } - if (StringUtils.isNotEmpty(params.getVariantStatsId()) - && (params.getVariantStatsQuery() == null || params.getVariantStatsQuery().toParams().isEmpty())) { - throw new ToolException("Invalid parameters: if you provide a variant stats ID, variant stats query" - + " can not be empty"); - } - if (StringUtils.isEmpty(params.getVariantStatsId())) { - params.setVariantStatsId(OPENCGA_ALL); - } - - boolean runVariantStats = true; - if (sample.getQualityControl() != null) { - if (CollectionUtils.isNotEmpty(sample.getQualityControl().getVariantMetrics().getVariantStats()) - && OPENCGA_ALL.equals(params.getVariantStatsId())) { - runVariantStats = false; - } else { - for (SampleQcVariantStats variantStats : sample.getQualityControl().getVariantMetrics().getVariantStats()) { - if (variantStats.getId().equals(params.getVariantStatsId())) { - throw new ToolException("Invalid parameters: variant stats ID '" + params.getVariantStatsId() - + "' is already used"); - } - } - } - } - - // Check mutational signature - boolean runSignature = true; - if (!sample.isSomatic()) { - runSignature = false; - } else { - if (OPENCGA_ALL.equals(params.getSignatureId())) { - throw new ToolException("Invalid parameters: " + OPENCGA_ALL + " is a reserved word, you can not use as a" - + " signature ID"); - } - - if (StringUtils.isEmpty(params.getSignatureId()) && params.getSignatureQuery() != null - && !params.getSignatureQuery().toParams().isEmpty()) { - throw new ToolException("Invalid parameters: if signature ID is empty, signature query must be null"); - } - if (StringUtils.isNotEmpty(params.getSignatureId()) - && (params.getSignatureQuery() == null || params.getSignatureQuery().toParams().isEmpty())) { - throw new ToolException("Invalid parameters: if you provide a signature ID, signature query" - + " can not be null"); - } - - if (sample.getQualityControl() != null) { - if (CollectionUtils.isNotEmpty(sample.getQualityControl().getVariantMetrics().getSignatures())) { - runSignature = false; - } - } - } - - // Run variant stats if necessary - if (runVariantStats) { - SampleVariantStatsAnalysisParams sampleVariantStatsParams = new SampleVariantStatsAnalysisParams( - Collections.singletonList(params.getSample()), - null, - params.getOutdir(), true, false, params.getVariantStatsId(), params.getVariantStatsDescription(), null, - params.getVariantStatsQuery() - ); - - DataResult jobResult = submitJobRaw(SampleVariantStatsAnalysis.ID, null, study, - sampleVariantStatsParams, null, null, null, null); - Job sampleStatsJob = jobResult.first(); - dependsOnList.add(sampleStatsJob.getId()); - } - - // Run signature if necessary - if (runSignature) { - MutationalSignatureAnalysisParams mutationalSignatureParams = - new MutationalSignatureAnalysisParams(params.getSample(), params.getOutdir()); - DataResult jobResult = submitJobRaw(MutationalSignatureAnalysis.ID, null, study, mutationalSignatureParams, - null, null, null, null); - Job signatureJob = jobResult.first(); - dependsOnList.add(signatureJob.getId()); - } - - // Run circos if necessary - if (MapUtils.isNotEmpty(params.getCircosQuery()) && CollectionUtils.isNotEmpty(params.getCircosTracks())) { - CircosAnalysisParams circosAnalysisParams = new CircosAnalysisParams(sample.getId(), "MEDIUM", params.getCircosQuery(), - params.getCircosTracks(), params.getOutdir()); - DataResult jobResult = submitJobRaw(CircosAnalysis.ID, null, study, circosAnalysisParams, null, null, null, null); - Job circosJob = jobResult.first(); - dependsOnList.add(circosJob.getId()); - } - - return submitJobRaw(SampleQcAnalysis.ID, null, study, params, jobName, jobDescription, StringUtils.join(dependsOnList, ","), jobTags); - }); + return submitJob(SampleQcAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } @POST @@ -1321,61 +1210,54 @@ public Response knockoutByIndividualQuery( } @POST - @Path("/circos/run") - @ApiOperation(value = CircosAnalysis.DESCRIPTION, response = String.class) - public Response circos( + @Path("/genomePlot/run") + @ApiOperation(value = GenomePlotAnalysis.DESCRIPTION, response = String.class) + public Response genomePlot( @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, - @ApiParam(value = CircosAnalysisParams.DESCRIPTION, required = true) CircosAnalysisParams params) { + @ApiParam(value = GenomePlotAnalysisParams.DESCRIPTION, required = true) GenomePlotAnalysisParams params) { File outDir = null; try { - if (StringUtils.isEmpty(params.getTitle())) { - params.setTitle("UNTITLED"); - } - // Create temporal directory - outDir = Paths.get(configuration.getAnalysis().getScratchDir(), "circos-" + System.nanoTime()).toFile(); + outDir = Paths.get(configuration.getAnalysis().getScratchDir(), "plot-" + System.nanoTime()).toFile(); outDir.mkdir(); if (!outDir.exists()) { - return createErrorResponse(new Exception("Error creating temporal directory for Circos analysis")); + return createErrorResponse(new Exception("Error creating temporal directory for genome plot analysis")); } - // Create and set up Circos executor - CircosLocalAnalysisExecutor executor = new CircosLocalAnalysisExecutor(study, params, variantManager); - - ObjectMap executorParams = new ObjectMap(); - executorParams.put("opencgaHome", opencgaHome); - executorParams.put("token", token); - executor.setUp(null, executorParams, outDir.toPath()); - - // Run Circos executor StopWatch watch = StopWatch.createStarted(); - executor.run(); + + GenomePlotAnalysis genomePlotAnalysis = new GenomePlotAnalysis(); + genomePlotAnalysis.setUp(opencgaHome.toString(), catalogManager, storageEngineFactory, new ObjectMap(), outDir.toPath(), null, + token); + genomePlotAnalysis.setStudy(study) + .setGenomePlotParams(params) + .start(); // Check results by reading the output file - File imgFile = outDir.toPath().resolve(params.getTitle() + CircosAnalysis.SUFFIX_FILENAME).toFile(); - if (imgFile.exists()) { - FileInputStream fileInputStreamReader = new FileInputStream(imgFile); - byte[] bytes = new byte[(int) imgFile.length()]; - fileInputStreamReader.read(bytes); + for (File imgfile : outDir.toPath().toFile().listFiles()) { + if (imgfile.getName().endsWith(GenomePlotAnalysis.SUFFIX_FILENAME)) { + FileInputStream fileInputStreamReader = new FileInputStream(imgfile); + byte[] bytes = new byte[(int) imgfile.length()]; + fileInputStreamReader.read(bytes); - String img = new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); + String img = new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); - watch.stop(); - OpenCGAResult result = new OpenCGAResult<>(((int) watch.getTime()), Collections.emptyList(), 1, - Collections.singletonList(img), 1); + watch.stop(); + OpenCGAResult result = new OpenCGAResult<>(((int) watch.getTime()), Collections.emptyList(), 1, + Collections.singletonList(img), 1); - //System.out.println(result.toString()); - return createOkResponse(result); - } else { - return createErrorResponse(new Exception("Error plotting Circos graph")); + //System.out.println(result.toString()); + return createOkResponse(result); + } } + return createErrorResponse(new Exception("Error plotting Genome graph")); } catch (ToolException | IOException e) { return createErrorResponse(e); } finally { if (outDir != null) { // Delete temporal directory try { - if (outDir.exists() && !params.getTitle().startsWith("no.delete.")) { + if (outDir.exists()) { FileUtils.deleteDirectory(outDir); } } catch (IOException e) { From 92cc5db699b522f294ebbbe2769e03d3e748a151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 20 May 2021 12:01:02 +0100 Subject: [PATCH 333/412] k8s: Simplify rest ingress default paths --- opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index df01aef49d0..50ac1de7d14 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -180,7 +180,7 @@ rest: - "" # Accept access by IP .Testing purposes only. # Accepts /opencga and /opencga/.... paths: - - /opencga(/|$) + - /opencga/ tls: [] # - secretName: chart-example-tls # hosts: From 10342651820721b182f5e2144c6a3c187d6ad002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 20 May 2021 16:36:31 +0200 Subject: [PATCH 334/412] models: remove vcfFileIds in SampleQualityControlMetrics --- .../SampleVariantQualityControlMetrics.java | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java index b0bc1710dbd..de20f89bac5 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleVariantQualityControlMetrics.java @@ -12,26 +12,22 @@ public class SampleVariantQualityControlMetrics { private List variantStats; private List signatures; private List genomePlots; - private List vcfFileIds; public SampleVariantQualityControlMetrics() { - this(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + this(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); } - public SampleVariantQualityControlMetrics(List variantStats, List signatures, - List vcfFileIds) { + public SampleVariantQualityControlMetrics(List variantStats, List signatures) { this.variantStats = variantStats; this.signatures = signatures; this.genomePlots = new ArrayList<>(); - this.vcfFileIds = vcfFileIds; } public SampleVariantQualityControlMetrics(List variantStats, List signatures, - List genomePlots, List vcfFileIds) { + List genomePlots) { this.variantStats = variantStats; this.signatures = signatures; this.genomePlots = genomePlots; - this.vcfFileIds = vcfFileIds; } @Override @@ -40,7 +36,6 @@ public String toString() { sb.append("variantStats=").append(variantStats); sb.append(", signatures=").append(signatures); sb.append(", genomePlots=").append(genomePlots); - sb.append(", vcfFileIds=").append(vcfFileIds); sb.append('}'); return sb.toString(); } @@ -71,13 +66,4 @@ public SampleVariantQualityControlMetrics setGenomePlots(List genome this.genomePlots = genomePlots; return this; } - - public List getVcfFileIds() { - return vcfFileIds; - } - - public SampleVariantQualityControlMetrics setVcfFileIds(List vcfFileIds) { - this.vcfFileIds = vcfFileIds; - return this; - } } From 6de908137debc045e1fe38291a160e47c11fe362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 20 May 2021 17:07:22 +0200 Subject: [PATCH 335/412] models: rename quality control fields --- .../qc/AlignmentFastQcMetricsAnalysis.java | 2 +- .../qc/AlignmentFlagStatsAnalysis.java | 2 +- .../AlignmentGeneCoverageStatsAnalysis.java | 2 +- .../qc/AlignmentHsMetricsAnalysis.java | 2 +- .../alignment/qc/AlignmentStatsAnalysis.java | 2 +- .../catalog/managers/SampleManagerTest.java | 37 +++---------------- .../core/models/file/FileQualityControl.java | 30 +++++++-------- .../models/sample/SampleQualityControl.java | 32 +++++----------- 8 files changed, 34 insertions(+), 75 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java index 9ad97f84950..d5b04515b35 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFastQcMetricsAnalysis.java @@ -127,7 +127,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignmentQualityControl().setFastQcMetrics(fastQcMetrics); + qc.getAlignment().setFastQcMetrics(fastQcMetrics); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java index db7dfc518f4..07c3accda35 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentFlagStatsAnalysis.java @@ -123,7 +123,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignmentQualityControl().setSamtoolsFlagStats(flagStats); + qc.getAlignment().setSamtoolsFlagStats(flagStats); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java index c6f06f8943b..68f594c08c8 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java @@ -115,7 +115,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getCoverageQualityControl().setGeneCoverageStats(geneCoverageStats); + qc.getCoverage().setGeneCoverageStats(geneCoverageStats); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java index ed925ca6b1b..7a7211a74a3 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentHsMetricsAnalysis.java @@ -154,7 +154,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignmentQualityControl().setHsMetrics(hsMetrics); + qc.getAlignment().setHsMetrics(hsMetrics); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java index 32ab34bfd06..26bc67cd75a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java @@ -153,7 +153,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new FileQualityControl(); } - qc.getAlignmentQualityControl().setSamtoolsStats(alignmentStats); + qc.getAlignment().setSamtoolsStats(alignmentStats); catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java index 87d5bec380e..00e181fcd56 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/SampleManagerTest.java @@ -20,8 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.bson.Document; import org.junit.Test; -import org.opencb.biodata.formats.sequence.fastqc.FastQcMetrics; -import org.opencb.biodata.formats.sequence.fastqc.Summary; import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.biodata.models.pedigree.IndividualProperty; @@ -357,7 +355,7 @@ public void updateQualityControlTest1() throws CatalogException { sampleQcVariantStats.add(new SampleQcVariantStats("v2", "", null, sampleVariantStats)); SampleVariantQualityControlMetrics metrics = new SampleVariantQualityControlMetrics(sampleQcVariantStats, null, null); - SampleQualityControl qualityControl = new SampleQualityControl(null, null, null, metrics); + SampleQualityControl qualityControl = new SampleQualityControl(null, null, metrics); OpenCGAResult result = catalogManager.getSampleManager().update(studyFqn, "sample", new SampleUpdateParams().setQualityControl(qualityControl), QueryOptions.empty(), token); @@ -400,7 +398,7 @@ public void updateQualityControlTest1() throws CatalogException { sampleVariantStats.setTiTvRatio((float) 3.5); sampleQcVariantStats.add(new SampleQcVariantStats("v1", "", null, sampleVariantStats)); metrics = new SampleVariantQualityControlMetrics(sampleQcVariantStats, null, null); - qualityControl = new SampleQualityControl(null, null, null, metrics); + qualityControl = new SampleQualityControl(null, null, metrics); // And update sample result = catalogManager.getSampleManager().update(studyFqn, "sample", new SampleUpdateParams().setQualityControl(qualityControl), @@ -475,7 +473,7 @@ public void updateQualityControlTest1() throws CatalogException { assertEquals(1, catalogManager.getSampleManager().count(studyFqn, query, token).getNumMatches()); // Remove SampleQcVariantStats values - qualityControl = new SampleQualityControl(Arrays.asList("file1", "file2"), null, null, null); + qualityControl = new SampleQualityControl(Arrays.asList("file1", "file2"), null, null); // And update sample result = catalogManager.getSampleManager().update(studyFqn, "sample", new SampleUpdateParams().setQualityControl(qualityControl), @@ -531,7 +529,7 @@ public void updateQualityControlTest2() throws CatalogException { sampleQcVariantStats.add(new SampleQcVariantStats("v2", "", null, sampleVariantStats)); SampleVariantQualityControlMetrics metrics = new SampleVariantQualityControlMetrics(sampleQcVariantStats, null, null); - SampleQualityControl qualityControl = new SampleQualityControl(null, null, null, metrics); + SampleQualityControl qualityControl = new SampleQualityControl(null, null, metrics); OpenCGAResult result = catalogManager.getSampleManager().update(studyFqn, "sample", new SampleUpdateParams().setQualityControl(qualityControl), QueryOptions.empty(), token); @@ -565,7 +563,7 @@ public void updateQualityControlTest2() throws CatalogException { sampleVariantStats.setTiTvRatio((float) 3.5); sampleQcVariantStats.add(new SampleQcVariantStats("v1", "", null, sampleVariantStats)); metrics = new SampleVariantQualityControlMetrics(sampleQcVariantStats, null, null); - qualityControl = new SampleQualityControl(null, null, null, metrics); + qualityControl = new SampleQualityControl(null, null, metrics); // And update sample result = catalogManager.getSampleManager().update(studyFqn, "sample", new SampleUpdateParams().setQualityControl(qualityControl), QueryOptions.empty(), token); @@ -652,31 +650,6 @@ public void updateCollectionField() throws CatalogException { assertTrue(testSample.first().getCollection().getAttributes().isEmpty()); } - @Test - public void updateQualityControlField() throws CatalogException { - catalogManager.getSampleManager().create(studyFqn, - new Sample().setId("testSample").setDescription("description"), null, token); - - SampleQualityControl qualityControl = new SampleQualityControl(); - - SampleAlignmentQualityControlMetrics metrics = new SampleAlignmentQualityControlMetrics(); - metrics.setFastQc(new FastQcMetrics().setSummary(new Summary("basicStatistics", "perBaseSeqQuality", "perTileSeqQuality", - "perSeqQualityScores", "perBaseSeqContent", "perSeqGcContent", "perBaseNContent", "seqLengthDistribution", - "seqDuplicationLevels", "overrepresentedSeqs", "adapterContent", "kmerContent"))); - - qualityControl.getAlignmentMetrics().add(metrics); - - catalogManager.getSampleManager().update(studyFqn, "testSample", new SampleUpdateParams().setQualityControl(qualityControl), - new QueryOptions(Constants.INCREMENT_VERSION, true), token); - - DataResult testSample = catalogManager.getSampleManager().get(studyFqn, "testSample", new QueryOptions(), token); - assertEquals("basicStatistics", testSample.first().getQualityControl().getAlignmentMetrics().get(0).getFastQc().getSummary().getBasicStatistics()); - assertEquals("perBaseSeqQuality", testSample.first().getQualityControl().getAlignmentMetrics().get(0).getFastQc().getSummary().getPerBaseSeqQuality()); - assertEquals("perTileSeqQuality", testSample.first().getQualityControl().getAlignmentMetrics().get(0).getFastQc().getSummary().getPerTileSeqQuality()); - assertEquals("perSeqQualityScores", testSample.first().getQualityControl().getAlignmentMetrics().get(0).getFastQc().getSummary().getPerSeqQualityScores()); - assertEquals("perBaseSeqContent", testSample.first().getQualityControl().getAlignmentMetrics().get(0).getFastQc().getSummary().getPerBaseSeqContent()); - } - @Test public void testCreateSample() throws CatalogException { String time = TimeUtils.getTime(); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java index ca67dc0d29f..87a85f0e74e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java @@ -4,42 +4,42 @@ import org.opencb.opencga.core.models.alignment.CoverageQualityControl; public class FileQualityControl { - private AlignmentQualityControl alignmentQualityControl; - private CoverageQualityControl coverageQualityControl; + private AlignmentQualityControl alignment; + private CoverageQualityControl coverage; public FileQualityControl() { this(new AlignmentQualityControl(), new CoverageQualityControl()); } - public FileQualityControl(AlignmentQualityControl alignmentQualityControl, CoverageQualityControl coverageQualityControl) { - this.alignmentQualityControl = alignmentQualityControl; - this.coverageQualityControl = coverageQualityControl; + public FileQualityControl(AlignmentQualityControl alignment, CoverageQualityControl coverage) { + this.alignment = alignment; + this.coverage = coverage; } @Override public String toString() { final StringBuilder sb = new StringBuilder("FileQualityControl{"); - sb.append("alignmentQualityControl=").append(alignmentQualityControl); - sb.append(", coverageQualityControl=").append(coverageQualityControl); + sb.append("alignment=").append(alignment); + sb.append(", coverage=").append(coverage); sb.append('}'); return sb.toString(); } - public AlignmentQualityControl getAlignmentQualityControl() { - return alignmentQualityControl; + public AlignmentQualityControl getAlignment() { + return alignment; } - public FileQualityControl setAlignmentQualityControl(AlignmentQualityControl alignmentQualityControl) { - this.alignmentQualityControl = alignmentQualityControl; + public FileQualityControl setAlignment(AlignmentQualityControl alignment) { + this.alignment = alignment; return this; } - public CoverageQualityControl getCoverageQualityControl() { - return coverageQualityControl; + public CoverageQualityControl getCoverage() { + return coverage; } - public FileQualityControl setCoverageQualityControl(CoverageQualityControl coverageQualityControl) { - this.coverageQualityControl = coverageQualityControl; + public FileQualityControl setCoverage(CoverageQualityControl coverage) { + this.coverage = coverage; return this; } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java index 69b572057b6..0044af3186e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java @@ -24,41 +24,36 @@ public class SampleQualityControl implements Serializable { - private List fileIds; + private List files; private List comments; - private List alignmentMetrics; private SampleVariantQualityControlMetrics variantMetrics; public SampleQualityControl() { - this(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), null); + this(new ArrayList<>(), new ArrayList<>(), null); } - public SampleQualityControl(List fileIds, List comments, - List alignmentMetrics, - SampleVariantQualityControlMetrics variantMetrics) { - this.fileIds = fileIds; + public SampleQualityControl(List files, List comments, SampleVariantQualityControlMetrics variantMetrics) { + this.files = files; this.comments = comments; - this.alignmentMetrics = alignmentMetrics; this.variantMetrics = variantMetrics; } @Override public String toString() { final StringBuilder sb = new StringBuilder("SampleQualityControl{"); - sb.append("fileIds=").append(fileIds); + sb.append("files=").append(files); sb.append(", comments=").append(comments); - sb.append(", alignmentMetrics=").append(alignmentMetrics); sb.append(", variantMetrics=").append(variantMetrics); sb.append('}'); return sb.toString(); } - public List getFileIds() { - return fileIds; + public List getFiles() { + return files; } - public SampleQualityControl setFileIds(List fileIds) { - this.fileIds = fileIds; + public SampleQualityControl setFiles(List files) { + this.files = files; return this; } @@ -71,15 +66,6 @@ public SampleQualityControl setComments(List comments) { return this; } - public List getAlignmentMetrics() { - return alignmentMetrics; - } - - public SampleQualityControl setAlignmentMetrics(List alignmentMetrics) { - this.alignmentMetrics = alignmentMetrics; - return this; - } - public SampleVariantQualityControlMetrics getVariantMetrics() { return variantMetrics; } From a5dd596756304ffb2e7aecc075c7c9c160d10e20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 20 May 2021 17:01:50 +0100 Subject: [PATCH 336/412] docker: Increase opencga-init verbosity. Clarify variable names. --- .../cloud/docker/opencga-init/setup-hadoop.sh | 14 +++++------ .../app/cloud/docker/opencga-init/setup.sh | 24 +++++++++++-------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh b/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh index 0751b0fe535..31e34e4e361 100644 --- a/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh +++ b/opencga-app/app/cloud/docker/opencga-init/setup-hadoop.sh @@ -1,5 +1,8 @@ #!/bin/sh +set -x + +HADOOP_CONF_DIR=${1:-/opt/volume/conf/hadoop} # INIT_HADOOP_SSH_DNS # INIT_HADOOP_SSH_USER # INIT_HADOOP_SSH_PASS @@ -25,7 +28,7 @@ fi HADOOP_USER_HOST="$INIT_HADOOP_SSH_USER@$INIT_HADOOP_SSH_DNS" -HADOOP_CONF_DIR=/opt/volume/conf/hadoop +mkdir -p "$HADOOP_CONF_DIR" #$SSHPASS_CMD ssh ${SSH_OPTS} "$HADOOP_USER_HOST" "sudo sed -i '/hbase.client.keyvalue.maxsize<\/name>/!b;n;c0' /etc/hbase/conf/hbase-site.xml" @@ -33,16 +36,13 @@ HADOOP_CONF_DIR=/opt/volume/conf/hadoop # place these files in /opt/opencga/conf/hadoop, by e.g.: echo "Fetching Hadoop configuration" $SSHPASS_CMD ssh ${SSH_OPTS} "$HADOOP_USER_HOST" hbase classpath | tr ":" "\n" | grep "/conf$" | grep "hadoop\|hbase" | sort | uniq | while read i ; do - $SSHPASS_CMD scp ${SSH_OPTS} -r "$HADOOP_USER_HOST:${i}"/* /opt/opencga/conf/hadoop + $SSHPASS_CMD scp ${SSH_OPTS} -v -r "$HADOOP_USER_HOST:${i}"/* "$HADOOP_CONF_DIR" done # Copy the OpenCGA installation directory to the Hadoop cluster $SSHPASS_CMD ssh ${SSH_OPTS} "$HADOOP_USER_HOST" mkdir -p "$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" echo "Copy jar-with-dependencies to hadoop" -$SSHPASS_CMD scp ${SSH_OPTS} /opt/opencga/*.jar "$HADOOP_USER_HOST":"$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" +$SSHPASS_CMD scp ${SSH_OPTS} -v /opt/opencga/*.jar "$HADOOP_USER_HOST":"$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" echo "Copy other libs" # TODO - Optimize this down to only required jars -$SSHPASS_CMD scp ${SSH_OPTS} -r /opt/opencga/libs "$HADOOP_USER_HOST":"$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" - -mkdir -p "$HADOOP_CONF_DIR" -cp -r /opt/opencga/conf/hadoop/* "$HADOOP_CONF_DIR" +$SSHPASS_CMD scp ${SSH_OPTS} -v -r /opt/opencga/libs "$HADOOP_USER_HOST":"$INIT_HADOOP_SSH_REMOTE_OPENCGA_HOME" diff --git a/opencga-app/app/cloud/docker/opencga-init/setup.sh b/opencga-app/app/cloud/docker/opencga-init/setup.sh index d6ea4c06541..bc4a75c86bd 100644 --- a/opencga-app/app/cloud/docker/opencga-init/setup.sh +++ b/opencga-app/app/cloud/docker/opencga-init/setup.sh @@ -5,17 +5,23 @@ echo "------------ OpenCGA INIT ------------" set -x +PERSISTENT_CONF=/opt/volume/conf/ +DEFAULT_CONF=/opt/opencga/default-conf/ +OPENCGA_CONF=/opt/opencga/conf/ + if find /opt/opencga/libs/opencga-storage-hadoop-deps-* &> /dev/null ; then - /opt/opencga/init/setup-hadoop.sh + /opt/opencga/init/setup-hadoop.sh ${OPENCGA_CONF}/hadoop + cp -r -v ${OPENCGA_CONF}/hadoop/* ${PERSISTENT_CONF}/hadoop/ fi -FILE=/opt/volume/conf/configuration.yml + +FILE="${PERSISTENT_CONF}/configuration.yml" if [ -f "$FILE" ] && [ "${OVERWRITE_CONFIGURATION:-false}" == "false" ]; then echo "$FILE already exists" - cp -r /opt/volume/conf/* /opt/opencga/conf/ + cp -r -v "${PERSISTENT_CONF}/"* "${OPENCGA_CONF}" else - echo "Copying default configs" - cp -r -L -v /opt/opencga/default-conf/* /opt/opencga/conf/ + echo "Copying default configs (if any)" + cp -r -L -v "${DEFAULT_CONF}"/* "${OPENCGA_CONF}" echo "Initialising configs" # Override Yaml configs @@ -23,13 +29,11 @@ else # Copies the config files from our local directory into a # persistent volume to be shared by the other containers. - echo "Initialising volume" - echo "Copying final configs" - #mkdir -p /opt/volume/conf /opt/volume/variants - cp -r /opt/opencga/conf/* /opt/volume/conf + echo "Copy final configs to persistent config volume" + cp -r -v "${OPENCGA_CONF}"/* "${PERSISTENT_CONF}" echo "Copying final analysis folder" - cp -r /opt/opencga/analysis/* /opt/volume/analysis + cp -r -v /opt/opencga/analysis/* /opt/volume/analysis fi From f443929652b56b2fe25ecc78ede1170298397848 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 24 May 2021 11:40:02 +0200 Subject: [PATCH 337/412] catalog: add Panels to ClinicalAnalysis data model, closes #1759 --- .../ClinicalInterpretationManager.java | 8 +- ...TieringInterpretationAnalysisExecutor.java | 5 +- .../manager/VariantCatalogQueryUtils.java | 7 +- .../MutationalSignatureAnalysis.java | 4 - .../file/PostLinkSampleAssociationTest.java | 3 - .../variant/VariantCatalogQueryUtilsTest.java | 3 +- .../migration/v2.1.0/catalog/migration.js | 6 ++ .../db/api/ClinicalAnalysisDBAdaptor.java | 1 + .../ClinicalAnalysisMongoDBAdaptor.java | 38 ++++++++ .../db/mongodb/StudyMongoDBAdaptor.java | 5 +- .../converters/ClinicalAnalysisConverter.java | 29 ++++++ ...linicalAnalysisCatalogMongoDBIterator.java | 89 ++++++++++++++++++- .../managers/ClinicalAnalysisManager.java | 31 ++++++- .../catalog/managers/SampleManager.java | 12 +-- ...dividualToSolrIndividualConverterTest.java | 2 - ...atalogSampleToSolrSampleConverterTest.java | 1 - .../managers/ClinicalAnalysisManagerTest.java | 87 ++++++++++++++++-- .../catalog/managers/FamilyManagerTest.java | 1 - .../stats/solr/CatalogSolrManagerTest.java | 1 - .../client/template/TemplateManager.java | 3 +- .../opencga/core/common/JacksonUtils.java | 5 +- .../models/clinical/ClinicalAnalysis.java | 26 ++++-- .../ClinicalAnalysisCreateParams.java | 32 ++++++- .../ClinicalAnalysisUpdateParams.java | 22 ++++- .../opencga/core/models/panel/Panel.java | 5 ++ .../opencga/core/models/study/Study.java | 9 +- .../variant/SampleQcAnalysisExecutor.java | 1 - 27 files changed, 364 insertions(+), 72 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java index f2f10cfa587..79f61bb5cdc 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java @@ -32,7 +32,6 @@ import org.opencb.biodata.models.variant.avro.ConsequenceType; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import org.opencb.biodata.models.variant.avro.VariantAnnotation; -import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.biodata.tools.clinical.ClinicalVariantCreator; import org.opencb.biodata.tools.clinical.DefaultClinicalVariantCreator; import org.opencb.biodata.tools.pedigree.ModeOfInheritance; @@ -56,7 +55,6 @@ import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.individual.Individual; -import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Group; @@ -271,7 +269,7 @@ public OpenCGAResult get(Query query, QueryOptions queryOptions if (isValidParam(query, PANEL)) { List panels = query.getAsStringList(PANEL.key()); for (String panelId : panels) { - Panel panel = catalogQueryUtils.getPanel(studyId, panelId, token); + org.opencb.opencga.core.models.panel.Panel panel = catalogQueryUtils.getPanel(studyId, panelId, token); for (DiseasePanel.GenePanel genePanel : panel.getGenes()) { if (!genePanelMap.containsKey(genePanel.getName())) { genePanelMap.put(genePanel.getName(), new HashSet<>()); @@ -751,7 +749,7 @@ public List getDiseasePanels(String studyId, List diseaseP throws ToolException { List diseasePanels = new ArrayList<>(); if (CollectionUtils.isNotEmpty(diseasePanelIds)) { - OpenCGAResult queryResults; + OpenCGAResult queryResults; try { queryResults = catalogManager.getPanelManager().get(studyId, diseasePanelIds, QueryOptions.empty(), sessionId); @@ -763,7 +761,7 @@ public List getDiseasePanels(String studyId, List diseaseP throw new ToolException("The number of disease panels retrieved doesn't match the number of disease panels queried"); } - for (Panel panel : queryResults.getResults()) { + for (org.opencb.opencga.core.models.panel.Panel panel : queryResults.getResults()) { diseasePanels.add(panel); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java index eb1778ca8d4..d1f19f9c657 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java @@ -38,7 +38,6 @@ import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.individual.Individual; -import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.response.VariantQueryResult; @@ -591,9 +590,9 @@ private List getTier3GenePanels(Individual proband, List p private void addPanels(Query query, List panels) throws CatalogException { if (query.containsKey(PANEL.key())) { List panelsIds = query.getAsStringList(PANEL.key()); - OpenCGAResult panelQueryResult = clinicalInterpretationManager.getCatalogManager().getPanelManager().get(studyId, + OpenCGAResult panelQueryResult = clinicalInterpretationManager.getCatalogManager().getPanelManager().get(studyId, panelsIds, QueryOptions.empty(), sessionId); - for (Panel panel : panelQueryResult.getResults()) { + for (org.opencb.opencga.core.models.panel.Panel panel : panelQueryResult.getResults()) { panels.add(panel); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantCatalogQueryUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantCatalogQueryUtils.java index ac8adf726d1..28d05744301 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantCatalogQueryUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantCatalogQueryUtils.java @@ -45,7 +45,6 @@ import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.file.FileIndex; import org.opencb.opencga.core.models.individual.Individual; -import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAclEntry; @@ -611,7 +610,7 @@ public Query parseQuery(Query query, QueryOptions queryOptions, String token) th Set variants = new HashSet<>(); List panels = query.getAsStringList(PANEL.key()); for (String panelId : panels) { - Panel panel = getPanel(defaultStudyStr, panelId, token); + org.opencb.opencga.core.models.panel.Panel panel = getPanel(defaultStudyStr, panelId, token); for (GenePanel genePanel : panel.getGenes()) { String gene = genePanel.getName(); if (StringUtils.isEmpty(gene)) { @@ -908,8 +907,8 @@ private String buildMoIGenotypeFilter(Pedigree pedigree, Disorder disorder, Clin * @return The panel * @throws CatalogException if the panel does not exist, or the user does not have permissions to see it. */ - public Panel getPanel(String studyId, String panelId, String sessionId) throws CatalogException { - Panel panel = null; + public org.opencb.opencga.core.models.panel.Panel getPanel(String studyId, String panelId, String sessionId) throws CatalogException { + org.opencb.opencga.core.models.panel.Panel panel = null; if (StringUtils.isNotEmpty(studyId)) { try { panel = catalogManager.getPanelManager().get(studyId, panelId, null, sessionId).first(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java index 64c672fbe72..4b4af63c548 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java @@ -16,19 +16,15 @@ package org.opencb.opencga.analysis.variant.mutationalSignature; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.qc.Signature; -import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.ResourceUtils; import org.opencb.opencga.analysis.tools.OpenCgaTool; -import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociationTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociationTest.java index 46917c8f156..8b38cfa1a04 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociationTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociationTest.java @@ -7,7 +7,6 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.analysis.tools.ToolRunner; import org.opencb.opencga.analysis.variant.OpenCGATestExternalResource; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -15,11 +14,9 @@ import org.opencb.opencga.catalog.managers.CatalogManagerExternalResource; import org.opencb.opencga.catalog.managers.FileManager; import org.opencb.opencga.catalog.managers.SampleManager; -import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.file.FileLinkParams; import org.opencb.opencga.core.models.file.FileStatus; -import org.opencb.opencga.core.models.file.PostLinkToolParams; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.response.OpenCGAResult; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantCatalogQueryUtilsTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantCatalogQueryUtilsTest.java index 9e16ed6f9b2..18418d421a0 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantCatalogQueryUtilsTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantCatalogQueryUtilsTest.java @@ -38,7 +38,6 @@ import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.individual.Individual; -import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.user.Account; import org.opencb.opencga.core.models.user.User; @@ -132,7 +131,7 @@ public static void setUp() throws Exception { catalog.getProjectManager().create("p2", "p2", "", "hsapiens", "Homo Sapiens", "GRCh38", null, sessionId); catalog.getStudyManager().create("p2", "p2s2", "p2s2", "p2s2", null, null, null, null, null, null, sessionId); - Panel panel = new Panel("MyPanel", "MyPanel", 1); + org.opencb.opencga.core.models.panel.Panel panel = new org.opencb.opencga.core.models.panel.Panel("MyPanel", "MyPanel", 1); panel.setGenes( Arrays.asList( new GenePanel().setName("BRCA2"), diff --git a/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js b/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js index 6baa3d15109..4268d7b90aa 100644 --- a/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js +++ b/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js @@ -19,4 +19,10 @@ if (versionNeedsUpdate(20100, 1)) { } }); }, "Check group consistency #1735"); + + runUpdate(function () { + migrateCollection("clinical", {"$or":[{panels:{"$exists":false}}, {panels: null}]}, {panels: 1}, function(bulk, doc) { + bulk.find({"_id": doc._id}).updateOne({"$set": {"panels": []}}); + }); + }, "Initialise panels array in Clinical Analysis #1759"); } \ No newline at end of file diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java index 17ef922794c..555c287ca65 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java @@ -83,6 +83,7 @@ enum QueryParams implements QueryParam { FAMILY_MEMBERS_UID("family.members.uid", INTEGER_ARRAY, ""), FAMILY_MEMBERS_SAMPLES_UID("family.members.samples.uid", INTEGER_ARRAY, ""), FILES("files", TEXT_ARRAY, ""), + PANELS("panels", TEXT_ARRAY, ""), COMMENTS("comments", TEXT_ARRAY, ""), COMMENTS_DATE("comments.date", TEXT, ""), ALERTS("alerts", TEXT_ARRAY, ""), diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ClinicalAnalysisMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ClinicalAnalysisMongoDBAdaptor.java index 0f9460a124e..b8b4296e6f0 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ClinicalAnalysisMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ClinicalAnalysisMongoDBAdaptor.java @@ -50,6 +50,7 @@ import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.common.FlagAnnotation; import org.opencb.opencga.core.models.common.Status; +import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.LoggerFactory; @@ -316,6 +317,29 @@ UpdateDocument parseAndValidateUpdateParams(ObjectMap parameters, List panelParamList = new LinkedList<>(); + for (Object panel : parameters.getAsList(PANELS.key())) { + if (panel instanceof Panel) { + panelParamList.add(new Panel().setId(((Panel) panel).getId())); + } + } + parameters.put(PANELS.key(), panelParamList); + } + @Override public OpenCGAResult unmarkPermissionRule(long studyId, String permissionRuleId) throws CatalogException { return unmarkPermissionRule(clinicalCollection, studyId, permissionRuleId); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java index c781fc5baff..6c489f5ec2e 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java @@ -49,7 +49,6 @@ import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.*; @@ -192,7 +191,7 @@ Study insert(ClientSession clientSession, Project project, Study study) List cohorts = study.getCohorts(); study.setCohorts(Collections.emptyList()); - List panels = study.getPanels(); + List panels = study.getPanels(); study.setPanels(Collections.emptyList()); List families = study.getFamilies(); @@ -230,7 +229,7 @@ Study insert(ClientSession clientSession, Project project, Study study) dbAdaptorFactory.getCatalogCohortDBAdaptor().insert(clientSession, study.getUid(), cohort, Collections.emptyList()); } - for (Panel panel : panels) { + for (org.opencb.opencga.core.models.panel.Panel panel : panels) { dbAdaptorFactory.getCatalogPanelDBAdaptor().insert(clientSession, study.getUid(), panel); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/ClinicalAnalysisConverter.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/ClinicalAnalysisConverter.java index 1f0d8ac2d39..3341113ce70 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/ClinicalAnalysisConverter.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/ClinicalAnalysisConverter.java @@ -21,6 +21,7 @@ import org.opencb.opencga.catalog.db.api.*; import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.common.GenericRecordAvroJsonMixin; +import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.sample.Sample; import java.util.ArrayList; @@ -55,6 +56,7 @@ public void validateDocumentToUpdate(Document document) { validateSecondaryInterpretationsToUpdate(document); validateFamilyToUpdate(document); validateProbandToUpdate(document); + validatePanelsToUpdate(document); } public void validateInterpretationToUpdate(Document document) { @@ -111,6 +113,33 @@ public void validateSamplesToUpdate(Document document) { .collect(Collectors.toList())); } + public void validatePanelsToUpdate(Document document) { + List panels = (List) document.get(ClinicalAnalysisDBAdaptor.QueryParams.PANELS.key()); + if (panels != null) { + // We make sure we don't store duplicates + Map panelMap = new HashMap<>(); + for (Document panel : panels) { + long uid = panel.getInteger(PanelDBAdaptor.QueryParams.UID.key()).longValue(); + int version = panel.getInteger(PanelDBAdaptor.QueryParams.VERSION.key()); + if (uid > 0) { + Panel tmpPanel = new Panel() + .setId(panel.getString(PanelDBAdaptor.QueryParams.ID.key())) + .setVersion(version); + tmpPanel.setUid(uid); + panelMap.put(uid, tmpPanel); + } + } + + document.put(ClinicalAnalysisDBAdaptor.QueryParams.PANELS.key(), + panelMap.entrySet().stream() + .map(entry -> new Document() + .append(PanelDBAdaptor.QueryParams.ID.key(), entry.getValue().getId()) + .append(PanelDBAdaptor.QueryParams.UID.key(), entry.getValue().getUid()) + .append(PanelDBAdaptor.QueryParams.VERSION.key(), entry.getValue().getVersion())) + .collect(Collectors.toList())); + } + } + public void validateProbandToUpdate(Document document) { Document proband = (Document) document.get(ClinicalAnalysisDBAdaptor.QueryParams.PROBAND.key()); if (proband == null) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/ClinicalAnalysisCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/ClinicalAnalysisCatalogMongoDBIterator.java index e9fb83485f1..86114f93856 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/ClinicalAnalysisCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/ClinicalAnalysisCatalogMongoDBIterator.java @@ -16,6 +16,7 @@ package org.opencb.opencga.catalog.db.mongodb.iterators; +import org.apache.commons.collections4.CollectionUtils; import org.bson.Document; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -23,10 +24,7 @@ import org.opencb.commons.datastore.mongodb.MongoDBIterator; import org.opencb.commons.utils.ListUtils; import org.opencb.opencga.catalog.db.DBAdaptorFactory; -import org.opencb.opencga.catalog.db.api.ClinicalAnalysisDBAdaptor; -import org.opencb.opencga.catalog.db.api.FamilyDBAdaptor; -import org.opencb.opencga.catalog.db.api.IndividualDBAdaptor; -import org.opencb.opencga.catalog.db.api.InterpretationDBAdaptor; +import org.opencb.opencga.catalog.db.api.*; import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogParameterException; @@ -46,9 +44,11 @@ public class ClinicalAnalysisCatalogMongoDBIterator extends CatalogMongoDBIte private FamilyDBAdaptor familyDBAdaptor; private IndividualDBAdaptor individualDBAdaptor; private InterpretationDBAdaptor interpretationDBAdaptor; + private PanelDBAdaptor panelDBAdaptor; private QueryOptions familyQueryOptions; private QueryOptions individualQueryOptions; private QueryOptions interpretationQueryOptions; + private QueryOptions panelQueryOptions; private QueryOptions options; @@ -80,9 +80,11 @@ public ClinicalAnalysisCatalogMongoDBIterator(MongoDBIterator mongoCur this.familyDBAdaptor = dbAdaptorFactory.getCatalogFamilyDBAdaptor(); this.individualDBAdaptor = dbAdaptorFactory.getCatalogIndividualDBAdaptor(); this.interpretationDBAdaptor = dbAdaptorFactory.getInterpretationDBAdaptor(); + this.panelDBAdaptor = dbAdaptorFactory.getCatalogPanelDBAdaptor(); this.interpretationQueryOptions = createInnerQueryOptions(INTERPRETATION.key(), false); this.familyQueryOptions = createInnerQueryOptions(FAMILY.key(), false); this.individualQueryOptions = createInnerQueryOptions(PROBAND.key(), false); + this.panelQueryOptions = createInnerQueryOptions(PANELS.key(), false); this.clinicalAnalysisListBuffer = new LinkedList<>(); this.logger = LoggerFactory.getLogger(ClinicalAnalysisCatalogMongoDBIterator.class); @@ -118,6 +120,7 @@ private void fetchNextBatch() { Set interpretationSet = new HashSet<>(); Set familySet = new HashSet<>(); Set individualSet = new HashSet<>(); + Set panelSet = new HashSet<>(); // Get next BUFFER_SIZE documents int counter = 0; @@ -135,6 +138,16 @@ private void fetchNextBatch() { extractFamilyInfo((Document) clinicalDocument.get(FAMILY.key()), familySet); extractIndividualInfo((Document) clinicalDocument.get(PROBAND.key()), individualSet); + // Extract the panels + List panels = clinicalDocument.getList(PANELS.key(), Document.class); + if (CollectionUtils.isNotEmpty(panels)) { + for (Document panel : panels) { + if (panel != null && panel.get(UID, Number.class).longValue() > 0) { + panelSet.add(panel.get(UID) + UID_VERSION_SEP + panel.get(VERSION)); + } + } + } + // Extract the interpretations Document interpretationDoc = (Document) clinicalDocument.get(INTERPRETATION.key()); if (interpretationDoc != null && interpretationDoc.get(UID, Number.class).longValue() > 0) { @@ -153,11 +166,13 @@ private void fetchNextBatch() { Map interpretationMap = fetchInterpretations(interpretationSet); Map familyMap = fetchFamilies(familySet); Map individualMap = fetchIndividuals(individualSet); + Map panelMap = fetchPanels(panelSet); if (!interpretationMap.isEmpty() || !familyMap.isEmpty() || !individualMap.isEmpty()) { // Fill data in clinical analyses clinicalAnalysisListBuffer.forEach(clinicalAnalysis -> { fillInterpretationData(clinicalAnalysis, interpretationMap); + fillPanels(clinicalAnalysis, panelMap); clinicalAnalysis.put(FAMILY.key(), fillFamilyData((Document) clinicalAnalysis.get(FAMILY.key()), familyMap)); clinicalAnalysis.put(PROBAND.key(), fillIndividualData((Document) clinicalAnalysis.get(PROBAND.key()), individualMap)); }); @@ -259,6 +274,24 @@ private void fillInterpretationData(Document clinicalAnalysis, Map panelMap) { + if (panelMap.isEmpty()) { + return; + } + + List sourcePanels = clinicalAnalysis.getList(PANELS.key(), Document.class); + if (sourcePanels != null) { + List targetPanels = new ArrayList<>(sourcePanels.size()); + for (Document panel : sourcePanels) { + String panelKey = panel.get(UID) + UID_VERSION_SEP + panel.get(VERSION); + if (panelMap.containsKey(panelKey)) { + targetPanels.add(panelMap.get(panelKey)); + } + } + clinicalAnalysis.put(PANELS.key(), targetPanels); + } + } + private Map fetchFamilies(Set familySet) { Map familyMap = new HashMap<>(); @@ -351,6 +384,54 @@ private List queryIndividuals(List individualUids, List return individualList; } + private Map fetchPanels(Set panelSet) { + Map panelMap = new HashMap<>(); + + if (panelSet.isEmpty()) { + return panelMap; + } + + // Extract list of uids and versions + List panelUids = new ArrayList<>(panelSet.size()); + List panelUidVersions = new ArrayList<>(panelSet.size()); + for (String panelId : panelSet) { + String[] split = panelId.split(UID_VERSION_SEP); + panelUids.add(Long.parseLong(split[0])); + panelUidVersions.add(Integer.parseInt(split[1])); + } + + // Fill panels with version + List panelList = queryPanels(panelUids, panelUidVersions); + panelList.forEach(panel + -> panelMap.put(panel.get(UID) + UID_VERSION_SEP + panel.get(VERSION), panel)); + + return panelMap; + } + + private List queryPanels(List panelUids, List panelUidVersions) { + List panelList = new LinkedList<>(); + + if (panelUids.isEmpty()) { + return panelList; + } + + // Build query object + Query query = new Query(PanelDBAdaptor.QueryParams.UID.key(), panelUids) + .append(PanelDBAdaptor.QueryParams.VERSION.key(), panelUidVersions); + + try { + if (user != null) { + query.put(PanelDBAdaptor.QueryParams.STUDY_UID.key(), studyUid); + panelList = panelDBAdaptor.nativeGet(studyUid, query, panelQueryOptions, user).getResults(); + } else { + panelList = panelDBAdaptor.nativeGet(query, panelQueryOptions).getResults(); + } + } catch (CatalogDBException | CatalogAuthorizationException | CatalogParameterException e) { + logger.warn("Could not obtain the panels associated to the clinical analyses: {}", e.getMessage(), e); + } + return panelList; + } + private Map fetchInterpretations(Set interpretationSet) { Map interpretationMap = new HashMap<>(); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java index 40743555345..6a85b977cc4 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java @@ -29,7 +29,6 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; @@ -42,6 +41,7 @@ import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.AclParams; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.clinical.*; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.common.FlagAnnotation; @@ -51,6 +51,7 @@ import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.file.FileReferenceParam; import org.opencb.opencga.core.models.individual.Individual; +import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.study.StudyAclEntry; @@ -261,6 +262,7 @@ public OpenCGAResult create(String studyStr, ClinicalAnalysis clinicalAnalysis.setAudit(ParamUtils.defaultObject(clinicalAnalysis.getAudit(), Collections.emptyList())); clinicalAnalysis.setQualityControl(ParamUtils.defaultObject(clinicalAnalysis.getQualityControl(), ClinicalAnalysisQualityControl::new)); + clinicalAnalysis.setPanels(ParamUtils.defaultObject(clinicalAnalysis.getPanels(), Collections.emptyList())); clinicalAnalysis.getQualityControl().setUser(userId); clinicalAnalysis.getQualityControl().setDate(TimeUtils.getDate()); @@ -276,6 +278,19 @@ public OpenCGAResult create(String studyStr, ClinicalAnalysis } } + if (CollectionUtils.isNotEmpty(clinicalAnalysis.getPanels())) { + // Get panels + Set panelIds = clinicalAnalysis.getPanels().stream().map(Panel::getId).collect(Collectors.toSet()); + Query query = new Query(PanelDBAdaptor.QueryParams.ID.key(), panelIds); + OpenCGAResult panelResult = + panelDBAdaptor.get(study.getUid(), query, PanelManager.INCLUDE_PANEL_IDS, userId); + if (panelResult.getNumResults() < panelIds.size()) { + throw new CatalogException("Some panels were not found or user doesn't have permissions to see them"); + } + + clinicalAnalysis.setPanels(panelResult.getResults()); + } + // Analyst QueryOptions userInclude = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList(UserDBAdaptor.QueryParams.ID.key(), UserDBAdaptor.QueryParams.NAME.key(), UserDBAdaptor.QueryParams.EMAIL.key())); @@ -1140,7 +1155,7 @@ private OpenCGAResult update(Study study, ClinicalAnalysis cli authorizationManager.checkClinicalAnalysisPermission(study.getUid(), clinicalAnalysis.getUid(), userId, ClinicalAnalysisAclEntry.ClinicalAnalysisPermissions.WRITE); - ObjectMap parameters = new ObjectMap(); + ObjectMap parameters; if (updateParams != null) { try { parameters = updateParams.getUpdateMap(); @@ -1230,6 +1245,18 @@ private OpenCGAResult update(Study study, ClinicalAnalysis cli parameters.put(ClinicalAnalysisDBAdaptor.QueryParams.FILES.key(), clinicalAnalysis.getFiles()); } + if (CollectionUtils.isNotEmpty(updateParams.getPanels())) { + // Get panels + Query query = new Query(PanelDBAdaptor.QueryParams.ID.key(), updateParams.getPanels()); + OpenCGAResult panelResult = + panelDBAdaptor.get(study.getUid(), query, PanelManager.INCLUDE_PANEL_IDS, userId); + if (panelResult.getNumResults() < updateParams.getPanels().size()) { + throw new CatalogException("Some panels were not found or user doesn't have permissions to see them"); + } + + parameters.put(ClinicalAnalysisDBAdaptor.QueryParams.PANELS.key(), panelResult.getResults()); + } + if (parameters.containsKey(ClinicalAnalysisDBAdaptor.QueryParams.DISORDER.key())) { // Assign the disorder to be updated to the clinicalAnalysis obtained from the DB so it can be checked in context clinicalAnalysis.setDisorder(updateParams.getDisorder().toDisorder()); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java index 51a11815133..6cd1d23573d 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java @@ -669,22 +669,22 @@ public OpenCGAResult updateAnnotationSet(String studyStr, String sampleS } public OpenCGAResult addAnnotationSet(String studyStr, String sampleStr, AnnotationSet annotationSet, QueryOptions options, - String token) throws CatalogException { + String token) throws CatalogException { return addAnnotationSets(studyStr, sampleStr, Collections.singletonList(annotationSet), options, token); } public OpenCGAResult addAnnotationSets(String studyStr, String sampleStr, List annotationSetList, - QueryOptions options, String token) throws CatalogException { + QueryOptions options, String token) throws CatalogException { return updateAnnotationSet(studyStr, sampleStr, annotationSetList, ParamUtils.BasicUpdateAction.ADD, options, token); } public OpenCGAResult removeAnnotationSet(String studyStr, String sampleStr, String annotationSetId, QueryOptions options, - String token) throws CatalogException { + String token) throws CatalogException { return removeAnnotationSets(studyStr, sampleStr, Collections.singletonList(annotationSetId), options, token); } public OpenCGAResult removeAnnotationSets(String studyStr, String sampleStr, List annotationSetIdList, - QueryOptions options, String token) throws CatalogException { + QueryOptions options, String token) throws CatalogException { List annotationSetList = annotationSetIdList .stream() .map(id -> new AnnotationSet().setId(id)) @@ -707,13 +707,13 @@ public OpenCGAResult updateAnnotations(String studyStr, String sampleStr } public OpenCGAResult removeAnnotations(String studyStr, String sampleStr, String annotationSetId, List annotations, - QueryOptions options, String token) throws CatalogException { + QueryOptions options, String token) throws CatalogException { return updateAnnotations(studyStr, sampleStr, annotationSetId, new ObjectMap("remove", StringUtils.join(annotations, ",")), ParamUtils.CompleteUpdateAction.REMOVE, options, token); } public OpenCGAResult resetAnnotations(String studyStr, String sampleStr, String annotationSetId, List annotations, - QueryOptions options, String token) throws CatalogException { + QueryOptions options, String token) throws CatalogException { return updateAnnotations(studyStr, sampleStr, annotationSetId, new ObjectMap("reset", StringUtils.join(annotations, ",")), ParamUtils.CompleteUpdateAction.RESET, options, token); } diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogIndividualToSolrIndividualConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogIndividualToSolrIndividualConverterTest.java index 949a9db3b3a..3f3da266d3d 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogIndividualToSolrIndividualConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogIndividualToSolrIndividualConverterTest.java @@ -18,7 +18,6 @@ import org.junit.Test; import org.opencb.biodata.models.pedigree.IndividualProperty; -import org.opencb.biodata.models.pedigree.Multiples; import org.opencb.opencga.catalog.stats.solr.IndividualSolrModel; import org.opencb.opencga.catalog.stats.solr.converters.CatalogIndividualToSolrIndividualConverter; import org.opencb.opencga.core.common.TimeUtils; @@ -26,7 +25,6 @@ import org.opencb.opencga.core.models.individual.IndividualInternal; import org.opencb.opencga.core.models.individual.IndividualPopulation; import org.opencb.opencga.core.models.sample.Sample; -import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.study.Study; import java.time.LocalDate; diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java index c51b8234914..360e73b262f 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java @@ -18,7 +18,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.collections4.map.HashedMap; import org.junit.Test; import org.opencb.biodata.models.pedigree.IndividualProperty; import org.opencb.opencga.catalog.stats.solr.SampleSolrModel; diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManagerTest.java index 8ef680b98d4..605efeed999 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManagerTest.java @@ -51,15 +51,17 @@ import org.opencb.opencga.core.models.common.StatusValue; import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.individual.Individual; +import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Study; -import org.opencb.opencga.core.models.study.configuration.*; import org.opencb.opencga.core.models.study.configuration.ClinicalConsent; +import org.opencb.opencga.core.models.study.configuration.*; import org.opencb.opencga.core.models.user.Account; import org.opencb.opencga.core.response.OpenCGAResult; import java.io.IOException; import java.util.*; +import java.util.stream.Collectors; import static org.junit.Assert.*; @@ -1983,11 +1985,84 @@ public void checkFamilyMembersOrder() throws CatalogException { DataResult clinicalAnalysisDataResult = catalogManager.getClinicalAnalysisManager().create(STUDY, clinicalAnalysis, QueryOptions.empty(), sessionIdUser); - assertEquals("child1", clinicalAnalysisDataResult.first().getFamily().getMembers().get(0).getId()); - assertEquals("father", clinicalAnalysisDataResult.first().getFamily().getMembers().get(1).getId()); - assertEquals("mother", clinicalAnalysisDataResult.first().getFamily().getMembers().get(2).getId()); - assertEquals("child2", clinicalAnalysisDataResult.first().getFamily().getMembers().get(3).getId()); - assertEquals("child3", clinicalAnalysisDataResult.first().getFamily().getMembers().get(4).getId()); + assertTrue(clinicalAnalysisDataResult.first().getFamily().getMembers().stream().map(Individual::getId).collect(Collectors.toList()) + .containsAll(dummyFamily.first().getMembers().stream().map(Individual::getId).collect(Collectors.toList()))); + assertEquals(5, dummyFamily.first().getMembers().size()); + assertEquals(5, clinicalAnalysisDataResult.first().getFamily().getMembers().size()); + } + + @Test + public void createClinicalAnalysisWithPanels() throws CatalogException { + catalogManager.getPanelManager().importFromSource(STUDY, "cancer-gene-census", "", sessionIdUser); + Panel panel = catalogManager.getPanelManager().search(STUDY, new Query(), QueryOptions.empty(), sessionIdUser).first(); + + DataResult dummyFamily = createDummyFamily(); + // Leave only sample2 for child1 in family + for (Individual member : dummyFamily.first().getMembers()) { + if (member.getId().equals("child1")) { + member.setSamples(Collections.singletonList(new Sample().setId("sample2"))); + } else if (member.getId().equals("child2")) { + member.setSamples(Collections.singletonList(new Sample().setId("sample5"))); + } else if (member.getId().equals("child3")) { + member.setSamples(Collections.singletonList(new Sample().setId("sample7"))); + } else { + member.setSamples(null); + } + } + + ClinicalAnalysis clinicalAnalysis = new ClinicalAnalysis() + .setId("analysis").setDescription("My description").setType(ClinicalAnalysis.Type.FAMILY) + .setDueDate("20180510100000") + .setPanels(Collections.singletonList(new Panel().setId(panel.getId()))) + .setFamily(dummyFamily.first()) + .setProband(new Individual().setId("child1")); + + ClinicalAnalysis ca = catalogManager.getClinicalAnalysisManager().create(STUDY, clinicalAnalysis, QueryOptions.empty(), sessionIdUser).first(); + + assertEquals(1, ca.getPanels().size()); + assertEquals(panel.getId(), ca.getPanels().get(0).getId()); + assertEquals(panel.getName(), ca.getPanels().get(0).getName()); + assertEquals(panel.getVersion(), ca.getPanels().get(0).getVersion()); + assertEquals(panel.getGenes().size(), ca.getPanels().get(0).getGenes().size()); + } + + @Test + public void updatePanelsInClinicalAnalysis() throws CatalogException { + catalogManager.getPanelManager().importFromSource(STUDY, "cancer-gene-census", "", sessionIdUser); + Panel panel = catalogManager.getPanelManager().search(STUDY, new Query(), QueryOptions.empty(), sessionIdUser).first(); + + DataResult dummyFamily = createDummyFamily(); + // Leave only sample2 for child1 in family + for (Individual member : dummyFamily.first().getMembers()) { + if (member.getId().equals("child1")) { + member.setSamples(Collections.singletonList(new Sample().setId("sample2"))); + } else if (member.getId().equals("child2")) { + member.setSamples(Collections.singletonList(new Sample().setId("sample5"))); + } else if (member.getId().equals("child3")) { + member.setSamples(Collections.singletonList(new Sample().setId("sample7"))); + } else { + member.setSamples(null); + } + } + + ClinicalAnalysis clinicalAnalysis = new ClinicalAnalysis() + .setId("analysis").setDescription("My description").setType(ClinicalAnalysis.Type.FAMILY) + .setDueDate("20180510100000") + .setFamily(dummyFamily.first()) + .setProband(new Individual().setId("child1")); + + // Create without a panel and update the panel + catalogManager.getClinicalAnalysisManager().create(STUDY, clinicalAnalysis, QueryOptions.empty(), sessionIdUser).first(); + catalogManager.getClinicalAnalysisManager().update(STUDY, clinicalAnalysis.getId(), + new ClinicalAnalysisUpdateParams().setPanels(Collections.singletonList(panel.getId())), QueryOptions.empty(), sessionIdUser); + + ClinicalAnalysis ca = catalogManager.getClinicalAnalysisManager().get(STUDY, clinicalAnalysis.getId(), QueryOptions.empty(), sessionIdUser).first(); + + assertEquals(1, ca.getPanels().size()); + assertEquals(panel.getId(), ca.getPanels().get(0).getId()); + assertEquals(panel.getName(), ca.getPanels().get(0).getName()); + assertEquals(panel.getVersion(), ca.getPanels().get(0).getVersion()); + assertEquals(panel.getGenes().size(), ca.getPanels().get(0).getGenes().size()); } @Test diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java index 03f54fb82a1..53841ea03eb 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java @@ -37,7 +37,6 @@ import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; -import org.opencb.opencga.core.models.AclParams; import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.clinical.ClinicalAnalysisUpdateParams; import org.opencb.opencga.core.models.family.Family; diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/stats/solr/CatalogSolrManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/stats/solr/CatalogSolrManagerTest.java index 1382c16ef97..4b493687334 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/stats/solr/CatalogSolrManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/stats/solr/CatalogSolrManagerTest.java @@ -30,7 +30,6 @@ import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.stats.solr.converters.*; -import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.common.AnnotationSet; diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java index 213569bbaed..d8323f5df31 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java @@ -49,7 +49,6 @@ import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.VariantAnnotationIndexParams; import org.opencb.opencga.core.models.operations.variant.VariantSecondaryIndexParams; -import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.panel.PanelCreateParams; import org.opencb.opencga.core.models.project.ProjectCreateParams; import org.opencb.opencga.core.models.sample.Sample; @@ -469,7 +468,7 @@ private void createPanels(String fqn, TemplateStudy study) throws ClientExceptio new ObjectMap(params).append(QueryOptions.INCLUDE, "name,id")) .allResults() .stream() - .map(Panel::getId) + .map(org.opencb.opencga.core.models.panel.Panel::getId) .collect(Collectors.toSet()); openCGAClient.setThrowExceptionOnError(true); } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/common/JacksonUtils.java b/opencga-core/src/main/java/org/opencb/opencga/core/common/JacksonUtils.java index 1014c9a6a7a..52c47f13510 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/common/JacksonUtils.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/common/JacksonUtils.java @@ -33,7 +33,6 @@ import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.individual.IndividualMixin; import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.panel.PanelMixin; import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.sample.Sample; @@ -72,7 +71,7 @@ private static ObjectMapper generateUpdateObjectMapper() { objectMapper.addMixIn(Individual.class, IndividualMixin.class); objectMapper.addMixIn(Family.class, FamilyMixin.class); objectMapper.addMixIn(File.class, FileMixin.class); - objectMapper.addMixIn(Panel.class, PanelMixin.class); + objectMapper.addMixIn(org.opencb.opencga.core.models.panel.Panel.class, PanelMixin.class); objectMapper.addMixIn(Project.class, PrivateUidMixin.class); objectMapper.addMixIn(Study.class, PrivateUidMixin.class); objectMapper.addMixIn(Sample.class, PrivateUidMixin.class); @@ -98,7 +97,7 @@ private static ObjectMapper generateOpenCGAObjectMapper() { objectMapper.addMixIn(Individual.class, PrivateUidMixin.class); objectMapper.addMixIn(Family.class, PrivateUidMixin.class); objectMapper.addMixIn(File.class, PrivateUidMixin.class); - objectMapper.addMixIn(Panel.class, PanelMixin.class); + objectMapper.addMixIn(org.opencb.opencga.core.models.panel.Panel.class, PanelMixin.class); objectMapper.addMixIn(Project.class, PrivateUidMixin.class); objectMapper.addMixIn(Study.class, PrivateUidMixin.class); objectMapper.addMixIn(Sample.class, PrivateUidMixin.class); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysis.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysis.java index 2a484573619..bd79125cf5b 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysis.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysis.java @@ -22,12 +22,11 @@ import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.common.Status; import org.opencb.opencga.core.models.PrivateStudyUid; -import org.opencb.opencga.core.models.common.CustomStatus; -import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.common.FlagAnnotation; import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.individual.Individual; +import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.study.configuration.ClinicalConsentAnnotation; import org.opencb.opencga.core.models.study.configuration.ClinicalPriorityAnnotation; @@ -52,6 +51,8 @@ public class ClinicalAnalysis extends PrivateStudyUid { private Individual proband; private Family family; + private List panels; + private boolean locked; private Interpretation interpretation; @@ -86,11 +87,11 @@ public ClinicalAnalysis() { public ClinicalAnalysis(String id, String description, Type type, Disorder disorder, List files, Individual proband, - Family family, boolean locked, Interpretation interpretation, List secondaryInterpretations, - ClinicalConsentAnnotation consent, ClinicalAnalyst analyst, ClinicalPriorityAnnotation priority, - List flags, String creationDate, String modificationDate, String dueDate, int release, - List comments, ClinicalAnalysisQualityControl qualityControl, List audit, - ClinicalAnalysisInternal internal, Map attributes, Status status) { + Family family, List panels, boolean locked, Interpretation interpretation, + List secondaryInterpretations, ClinicalConsentAnnotation consent, ClinicalAnalyst analyst, + ClinicalPriorityAnnotation priority, List flags, String creationDate, String modificationDate, + String dueDate, int release, List comments, ClinicalAnalysisQualityControl qualityControl, + List audit, ClinicalAnalysisInternal internal, Map attributes, Status status) { this.id = id; this.description = description; this.type = type; @@ -98,6 +99,7 @@ public ClinicalAnalysis(String id, String description, Type type, Disorder disor this.files = files; this.proband = proband; this.family = family; + this.panels = panels; this.locked = locked; this.interpretation = interpretation; this.secondaryInterpretations = secondaryInterpretations; @@ -128,6 +130,7 @@ public String toString() { sb.append(", files=").append(files); sb.append(", proband=").append(proband); sb.append(", family=").append(family); + sb.append(", panels=").append(panels); sb.append(", locked=").append(locked); sb.append(", interpretation=").append(interpretation); sb.append(", secondaryInterpretations=").append(secondaryInterpretations); @@ -224,6 +227,15 @@ public ClinicalAnalysis setFamily(Family family) { return this; } + public List getPanels() { + return panels; + } + + public ClinicalAnalysis setPanels(List panels) { + this.panels = panels; + return this; + } + public boolean isLocked() { return locked; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisCreateParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisCreateParams.java index b04c1b4b9a1..dbc98bbc6ec 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisCreateParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisCreateParams.java @@ -17,6 +17,7 @@ package org.opencb.opencga.core.models.clinical; import org.opencb.biodata.models.clinical.ClinicalAnalyst; +import org.opencb.biodata.models.clinical.interpretation.DiseasePanel; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.models.common.EntryParam; import org.opencb.opencga.core.models.common.StatusParam; @@ -42,6 +43,9 @@ public class ClinicalAnalysisCreateParams { private ProbandParam proband; private FamilyParam family; + + private List panels; + private ClinicalAnalystParam analyst; private EntryParam interpretation; private ClinicalAnalysisQualityControlUpdateParam qualityControl; @@ -61,7 +65,7 @@ public ClinicalAnalysisCreateParams() { public ClinicalAnalysisCreateParams(String id, String description, ClinicalAnalysis.Type type, DisorderReferenceParam disorder, List files, ProbandParam proband, FamilyParam family, - ClinicalAnalystParam analyst, EntryParam interpretation, + List panels, ClinicalAnalystParam analyst, EntryParam interpretation, ClinicalConsentAnnotationParam consent, String dueDate, List comments, ClinicalAnalysisQualityControlUpdateParam qualityControl, PriorityParam priority, List flags, Map attributes, StatusParam status) { @@ -72,6 +76,7 @@ public ClinicalAnalysisCreateParams(String id, String description, ClinicalAnaly this.files = files; this.proband = proband; this.family = family; + this.panels = panels; this.analyst = analyst; this.interpretation = interpretation; this.consent = consent; @@ -92,6 +97,9 @@ public static ClinicalAnalysisCreateParams of(ClinicalAnalysis clinicalAnalysis) : null, clinicalAnalysis.getProband() != null ? ProbandParam.of(clinicalAnalysis.getProband()) : null, clinicalAnalysis.getFamily() != null ? FamilyParam.of(clinicalAnalysis.getFamily()) : null, + clinicalAnalysis.getPanels() != null + ? clinicalAnalysis.getPanels().stream().map(DiseasePanel::getId).collect(Collectors.toList()) + : null, clinicalAnalysis.getAnalyst() != null ? ClinicalAnalystParam.of(clinicalAnalysis.getAnalyst()) : null, clinicalAnalysis.getInterpretation() != null ? new EntryParam(clinicalAnalysis.getInterpretation().getId()) @@ -120,6 +128,7 @@ public String toString() { sb.append(", files=").append(files); sb.append(", proband=").append(proband); sb.append(", family=").append(family); + sb.append(", panels=").append(panels); sb.append(", analyst=").append(analyst); sb.append(", interpretation=").append(interpretation); sb.append(", consent=").append(consent); @@ -175,8 +184,16 @@ public ClinicalAnalysis toClinicalAnalysis() { } } - return new ClinicalAnalysis(id, description, type, disorder != null ? disorder.toDisorder() : null, caFiles, individual, f, false, - primaryInterpretation, new LinkedList<>(), consent != null ? consent.toClinicalConsentAnnotation() : null, + List diseasePanelList = panels != null ? new ArrayList<>(panels.size()) : Collections.emptyList(); + if (panels != null) { + for (String panel : panels) { + diseasePanelList.add(new org.opencb.opencga.core.models.panel.Panel().setId(panel)); + } + } + + return new ClinicalAnalysis(id, description, type, disorder != null ? disorder.toDisorder() : null, caFiles, individual, f, + diseasePanelList, false, primaryInterpretation, new LinkedList<>(), + consent != null ? consent.toClinicalConsentAnnotation() : null, new ClinicalAnalyst(assignee, assignee, "", "", TimeUtils.getTime()), priority != null ? priority.toClinicalPriorityAnnotation() : null, flags != null ? flags.stream().map(FlagValueParam::toFlagAnnotation).collect(Collectors.toList()) : null , null, null, @@ -249,6 +266,15 @@ public ClinicalAnalysisCreateParams setFamily(FamilyParam family) { return this; } + public List getPanels() { + return panels; + } + + public ClinicalAnalysisCreateParams setPanels(List panels) { + this.panels = panels; + return this; + } + public ClinicalAnalystParam getAnalyst() { return analyst; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisUpdateParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisUpdateParams.java index 2b5d54c8f64..d1c89bf8976 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisUpdateParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisUpdateParams.java @@ -36,6 +36,8 @@ public class ClinicalAnalysisUpdateParams { private List files; + private List panels; + private Boolean locked; // private ProbandParam proband; // private FamilyParam family @@ -56,14 +58,16 @@ public ClinicalAnalysisUpdateParams() { } public ClinicalAnalysisUpdateParams(String id, String description, DisorderReferenceParam disorder, List files, - Boolean locked, ClinicalAnalystParam analyst, ClinicalConsentAnnotationParam consent, - String dueDate, ClinicalAnalysisQualityControlUpdateParam qualityControl, - List comments, PriorityParam priority, List flags, - Map attributes, StatusParam status) { + List panels, Boolean locked, ClinicalAnalystParam analyst, + ClinicalConsentAnnotationParam consent, String dueDate, + ClinicalAnalysisQualityControlUpdateParam qualityControl, List comments, + PriorityParam priority, List flags, Map attributes, + StatusParam status) { this.id = id; this.description = description; this.disorder = disorder; this.files = files; + this.panels = panels; this.locked = locked; this.analyst = analyst; this.consent = consent; @@ -88,6 +92,7 @@ public String toString() { sb.append(", description='").append(description).append('\''); sb.append(", disorder=").append(disorder); sb.append(", files=").append(files); + sb.append(", panels=").append(panels); sb.append(", locked=").append(locked); sb.append(", analyst=").append(analyst); sb.append(", consent=").append(consent); @@ -154,6 +159,15 @@ public ClinicalAnalysisUpdateParams setFiles(List files) { return this; } + public List getPanels() { + return panels; + } + + public ClinicalAnalysisUpdateParams setPanels(List panels) { + this.panels = panels; + return this; + } + public Boolean getLocked() { return locked; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/panel/Panel.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/panel/Panel.java index ab6caaf3852..c661d8ae408 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/panel/Panel.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/panel/Panel.java @@ -111,6 +111,11 @@ public String toString() { return sb.toString(); } + public Panel setId(String id) { + super.setId(id); + return this; + } + public String getUuid() { return uuid; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/Study.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/Study.java index d4f680a35bf..4bc16252203 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/Study.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/Study.java @@ -28,7 +28,6 @@ import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.job.Job; -import org.opencb.opencga.core.models.panel.Panel; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.configuration.ClinicalAnalysisStudyConfiguration; import org.opencb.opencga.core.models.study.configuration.StudyConfiguration; @@ -59,7 +58,7 @@ public class Study extends PrivateFields { private List families; private List samples; private List cohorts; - private List panels; + private List panels; private List clinicalAnalyses; private List variableSets; private StudyConfiguration configuration; @@ -85,7 +84,7 @@ public Study(String name, String alias, String description, StudyInternal intern public Study(String id, String name, String alias, String creationDate, String description, StudyNotification notification, long size, List groups, List files, List jobs, List individuals, List families, - List samples, List cohorts, List panels, List clinicalAnalyses, + List samples, List cohorts, List panels, List clinicalAnalyses, List variableSets, Map> permissionRules, URI uri, int release, CustomStatus status, StudyInternal internal, StudyConfiguration configuration, Map attributes) { this.id = id; @@ -298,11 +297,11 @@ public Study setCohorts(List cohorts) { return this; } - public List getPanels() { + public List getPanels() { return panels; } - public Study setPanels(List panels) { + public Study setPanels(List panels) { this.panels = panels; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/SampleQcAnalysisExecutor.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/SampleQcAnalysisExecutor.java index c59c03a927a..f87b0e9505b 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/SampleQcAnalysisExecutor.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/SampleQcAnalysisExecutor.java @@ -20,7 +20,6 @@ import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAlignmentQualityControlMetrics; -import org.opencb.opencga.core.models.sample.SampleVariantQualityControlMetrics; import org.opencb.opencga.core.tools.OpenCgaToolExecutor; import java.util.List; From 168cd443beab2bb2de3001d0f5743d0b6ab34669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Mon, 24 May 2021 14:54:35 +0200 Subject: [PATCH 338/412] analysis: rename circos analysis to genome plot analysis, and update sample quality control after running the sample-qc-run, #1730 --- .../main/R/{circos => genome-plot}/circos.R | 0 .../analysis/sample/qc/SampleQcAnalysis.java | 3 +- .../genomePlot/GenomePlotAnalysis.java | 41 +++++++++++++++++++ .../VariantInternalCommandExecutor.java | 1 + .../options/VariantCommandOptions.java | 3 ++ .../analysis/VariantCommandExecutor.java | 1 + .../models/sample/SampleQualityControl.java | 2 +- .../variant/GenomePlotAnalysisParams.java | 30 ++++++++++++-- .../variant/SampleQcAnalysisParams.java | 15 ++++++- 9 files changed, 90 insertions(+), 6 deletions(-) rename opencga-analysis/src/main/R/{circos => genome-plot}/circos.R (100%) diff --git a/opencga-analysis/src/main/R/circos/circos.R b/opencga-analysis/src/main/R/genome-plot/circos.R similarity index 100% rename from opencga-analysis/src/main/R/circos/circos.R rename to opencga-analysis/src/main/R/genome-plot/circos.R diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index f2638bd4153..c7c560f8809 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -181,7 +181,8 @@ protected void run() throws ToolException { if (runGenomePlot) { // Run genome plot - params = new GenomePlotAnalysisParams(analysisParams.getGenomePlotConfigFile(), null) + params = new GenomePlotAnalysisParams(analysisParams.getSample(), analysisParams.getGenomePlotDescription(), + analysisParams.getGenomePlotConfigFile(), null) .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudy())); genomePlotJobResult = catalogManager.getJobManager() diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java index 52b9f33383f..9093babe757 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java @@ -17,12 +17,20 @@ package org.opencb.opencga.analysis.variant.genomePlot; import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.clinical.qc.GenomePlot; +import org.opencb.biodata.models.clinical.qc.GenomePlotConfig; +import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.AnalysisUtils; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; +import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.sample.Sample; +import org.opencb.opencga.core.models.sample.SampleQualityControl; +import org.opencb.opencga.core.models.sample.SampleUpdateParams; import org.opencb.opencga.core.models.variant.GenomePlotAnalysisParams; +import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.tools.annotations.ToolParams; import org.opencb.opencga.core.tools.variant.GenomePlotAnalysisExecutor; @@ -70,6 +78,39 @@ protected void run() throws ToolException { .setStudy(study) .setConfigFile(configFile) .execute(); + + + // Update quality control for the catalog sample + if (StringUtils.isNotEmpty(genomePlotParams.getSample())) { + OpenCGAResult sampleResult = getCatalogManager().getSampleManager().get(getStudy(), genomePlotParams.getSample(), + QueryOptions.empty(), getToken()); + Sample sample = sampleResult.first(); + if (sample != null) { + GenomePlot genomePlot = null; + // Parse configuration file + GenomePlotConfig plotConfig = JacksonUtils.getDefaultObjectMapper().readerFor(GenomePlotConfig.class) + .readValue(configFile); + // Get image file + for (java.io.File imgFile : getOutDir().toFile().listFiles()) { + if (imgFile.getName().endsWith(GenomePlotAnalysis.SUFFIX_FILENAME)) { + int index = imgFile.getAbsolutePath().indexOf("JOBS/"); + String relativeFilePath = (index == -1 ? imgFile.getName() : imgFile.getAbsolutePath().substring(index)); + genomePlot = new GenomePlot("", getGenomePlotParams().getDescription(), plotConfig, relativeFilePath); + break; + } + } + if (genomePlot != null) { + SampleQualityControl qc = sampleResult.first().getQualityControl(); + if (qc == null) { + qc = new SampleQualityControl(); + } + qc.getVariantMetrics().getGenomePlots().add(genomePlot); + + catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), + QueryOptions.empty(), getToken()); + } + } + } }); } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index 57e4b00f7a9..a7b31189d29 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -881,6 +881,7 @@ private void sampleQc() throws Exception { variantStatsQuery, // cliOptions.signatureId, // signatureQuery, + cliOptions.genomePlotDescr, cliOptions.genomePlotConfigFile, cliOptions.outdir) .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index 1c297f4890c..7e7229e1519 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1409,6 +1409,9 @@ public class SampleQcCommandOptions { // @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") // public Map signatureQuery = new HashMap<>(); + @Parameter(names = {"--gpd", "--genome-plot-description"}, description = "Genome plot description.") + public String genomePlotDescr; + @Parameter(names = {"--gpcf", "--genome-plot-config-file"}, description = "Genome plot configuration file in JSON format.") public String genomePlotConfigFile; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 9f940acb2b3..5b060bf02d1 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -425,6 +425,7 @@ private RestResponse sampleQc() throws ClientException { variantStatsQuery, // cliOptions.signatureId, // signatureQuery, + cliOptions.genomePlotDescr, cliOptions.genomePlotConfigFile, cliOptions.outdir ), diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java index 0044af3186e..c3ee5e0fde8 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java @@ -29,7 +29,7 @@ public class SampleQualityControl implements Serializable { private SampleVariantQualityControlMetrics variantMetrics; public SampleQualityControl() { - this(new ArrayList<>(), new ArrayList<>(), null); + this(new ArrayList<>(), new ArrayList<>(), new SampleVariantQualityControlMetrics()); } public SampleQualityControl(List files, List comments, SampleVariantQualityControlMetrics variantMetrics) { diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java index c1c1b283557..39a41a4ae98 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java @@ -22,14 +22,18 @@ public class GenomePlotAnalysisParams extends ToolParams { public static final String DESCRIPTION = "Genome plot analysis params to customize the plot. The configuration file includes the title, " + " the plot density (i.e., the number of points to display), the general query and the list of tracks. Currently, the supported " + "track types are: COPY-NUMBER, INDEL, REARRANGEMENT and SNV. In addition, each track can contain a specific query"; - private String configFile; + private String sample; + private String description; + private String configFile; private String outdir; public GenomePlotAnalysisParams() { } - public GenomePlotAnalysisParams(String configFile, String outdir) { + public GenomePlotAnalysisParams(String sample, String description, String configFile, String outdir) { + this.sample = sample; + this.description = description; this.configFile = configFile; this.outdir = outdir; } @@ -37,12 +41,32 @@ public GenomePlotAnalysisParams(String configFile, String outdir) { @Override public String toString() { final StringBuilder sb = new StringBuilder("GenomePlotAnalysisParams{"); - sb.append("configFile='").append(configFile).append('\''); + sb.append("sample='").append(sample).append('\''); + sb.append(", description='").append(description).append('\''); + sb.append(", configFile='").append(configFile).append('\''); sb.append(", outdir='").append(outdir).append('\''); sb.append('}'); return sb.toString(); } + public String getSample() { + return sample; + } + + public GenomePlotAnalysisParams setSample(String sample) { + this.sample = sample; + return this; + } + + public String getDescription() { + return description; + } + + public GenomePlotAnalysisParams setDescription(String description) { + this.description = description; + return this; + } + public String getConfigFile() { return configFile; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java index 9686eb780da..305d8193887 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java @@ -24,6 +24,7 @@ public class SampleQcAnalysisParams extends ToolParams { private String variantStatsId; private String variantStatsDescription; private AnnotationVariantQueryParams variantStatsQuery; + private String genomePlotDescription; private String genomePlotConfigFile; private String outdir; @@ -31,11 +32,13 @@ public SampleQcAnalysisParams() { } public SampleQcAnalysisParams(String sample, String variantStatsId, String variantStatsDescription, - AnnotationVariantQueryParams variantStatsQuery, String genomePlotConfigFile, String outdir) { + AnnotationVariantQueryParams variantStatsQuery, String genomePlotDescription, String genomePlotConfigFile, + String outdir) { this.sample = sample; this.variantStatsId = variantStatsId; this.variantStatsDescription = variantStatsDescription; this.variantStatsQuery = variantStatsQuery; + this.genomePlotDescription = genomePlotDescription; this.genomePlotConfigFile = genomePlotConfigFile; this.outdir = outdir; } @@ -47,6 +50,7 @@ public String toString() { sb.append(", variantStatsId='").append(variantStatsId).append('\''); sb.append(", variantStatsDescription='").append(variantStatsDescription).append('\''); sb.append(", variantStatsQuery=").append(variantStatsQuery); + sb.append(", genomePlotDescription='").append(genomePlotDescription).append('\''); sb.append(", genomePlotConfigFile='").append(genomePlotConfigFile).append('\''); sb.append(", outdir='").append(outdir).append('\''); sb.append('}'); @@ -89,6 +93,15 @@ public SampleQcAnalysisParams setVariantStatsQuery(AnnotationVariantQueryParams return this; } + public String getGenomePlotDescription() { + return genomePlotDescription; + } + + public SampleQcAnalysisParams setGenomePlotDescription(String genomePlotDescription) { + this.genomePlotDescription = genomePlotDescription; + return this; + } + public String getGenomePlotConfigFile() { return genomePlotConfigFile; } From 9b37eba9ec79a20f97ee1a5aee830f0714cab0f8 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 24 May 2021 15:05:09 +0200 Subject: [PATCH 339/412] catalog: fix family roles, #1763 --- .../catalog/managers/FamilyManager.java | 12 +- .../catalog/managers/IndividualManager.java | 14 +- .../catalog/managers/FamilyManagerTest.java | 120 ++++++++++++++++++ .../opencga/core/models/family/Family.java | 3 + 4 files changed, 135 insertions(+), 14 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java index 991878e44f6..23508c7c37e 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java @@ -1391,7 +1391,7 @@ private void validateFamily(Family family) throws CatalogException { Map membersMap = new HashMap<>(); // individualName|individualId: Individual Map> parentsMap = new HashMap<>(); // motherName||F---fatherName||M: List - Set noParentsSet = new HashSet<>(); // Set with individuals without parents + Set noParentsSet = new HashSet<>(); // Set with individuals without parents // 1. Fill in the objects initialised above for (Individual individual : family.getMembers()) { @@ -1425,7 +1425,7 @@ private void validateFamily(Family family) throws CatalogException { } } if (parentsKey == null) { - noParentsSet.add(individual); + noParentsSet.add(individual.getId()); } else { if (!parentsMap.containsKey(parentsKey)) { parentsMap.put(parentsKey, new ArrayList<>()); @@ -1456,7 +1456,7 @@ private void validateFamily(Family family) throws CatalogException { membersMap.get(name).setSex(sex); // We attempt to remove the individual from the noParentsSet - noParentsSet.remove(membersMap.get(name)); + noParentsSet.remove(membersMap.get(name).getId()); } } } @@ -1465,8 +1465,7 @@ private void validateFamily(Family family) throws CatalogException { if (noParentsSet.size() > 0) { // throw new CatalogException("Some members that are not related to any other have been found: " // + noParentsSet.stream().map(Individual::getName).collect(Collectors.joining(", "))); - logger.warn("Some members that are not related to any other have been found: {}", - noParentsSet.stream().map(Individual::getId).collect(Collectors.joining(", "))); + logger.warn("Some members that are not related to any other have been found: {}", StringUtils.join(noParentsSet, ", ")); } } @@ -1576,10 +1575,9 @@ private void calculateRoles(Study study, Family family, String user) Set individualIds = family.getMembers().stream().map(Individual::getId).collect(Collectors.toSet()); - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, IndividualDBAdaptor.QueryParams.ID.key()); Map> roles = new HashMap<>(); for (Individual member : family.getMembers()) { - List individualList = catalogManager.getIndividualManager().calculateRelationship(study, member, 2, options, user); + List individualList = catalogManager.getIndividualManager().calculateRelationship(study, member, 2, user); Map memberRelation = new HashMap<>(); for (Individual individual : individualList) { if (individualIds.contains(individual.getId())) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java index 1419d257bb1..146465e08eb 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java @@ -517,7 +517,7 @@ public OpenCGAResult relatives(String studyId, String individualId, individualList, individualList.size()); } - individualList.addAll(calculateRelationship(study, proband, degree, queryOptions, userId)); + individualList.addAll(calculateRelationship(study, proband, degree, userId)); auditManager.audit(userId, Enums.Action.RELATIVES, Enums.Resource.INDIVIDUAL, individualId, individualUuid, study.getId(), study.getUuid(), auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); @@ -579,8 +579,10 @@ void addDegreeRelatives(Map> relat } } - List calculateRelationship(Study study, Individual proband, int maxDegree, QueryOptions options, String userId) + List calculateRelationship(Study study, Individual proband, int maxDegree, String userId) throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { + QueryOptions options = fixOptionsForRelatives(new QueryOptions(QueryOptions.INCLUDE, IndividualDBAdaptor.QueryParams.ID.key())); + List individualList = new LinkedList<>(); individualList.add(proband); @@ -648,11 +650,9 @@ List calculateRelationship(Study study, Individual proband, int maxD // Update set of already obtained individuals Set skipIndividuals = individualList.stream().map(Individual::getId).collect(Collectors.toSet()); for (Individual child : children) { - // TODO: Change relations !! - relationMap.put(Family.FamiliarRelationship.SON, Family.FamiliarRelationship.BROTHER); - relationMap.put(Family.FamiliarRelationship.DAUGHTER, Family.FamiliarRelationship.SISTER); - relationMap.put(Family.FamiliarRelationship.CHILD_OF_UNKNOWN_SEX, - Family.FamiliarRelationship.FULL_SIBLING); + relationMap.put(Family.FamiliarRelationship.SON, Family.FamiliarRelationship.GRANDSON); + relationMap.put(Family.FamiliarRelationship.DAUGHTER, Family.FamiliarRelationship.GRANDDAUGHTER); + relationMap.put(Family.FamiliarRelationship.CHILD_OF_UNKNOWN_SEX, Family.FamiliarRelationship.GRANDCHILD); relativeMap = lookForChildren(study, child, skipIndividuals, options, userId); addDegreeRelatives(relativeMap, relationMap, 2, individualList); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java index 53841ea03eb..295b3c9a5f6 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java @@ -140,6 +140,126 @@ public void createFamily() throws CatalogException { assertTrue("Father id not associated to any children", fatherIdUpdated); } + @Test + public void createComplexFamily() throws CatalogException { + Individual paternalGrandfather = new Individual().setId("p_grandfather"); + Individual paternalGrandmother = new Individual().setId("p_grandmother"); + Individual maternalGrandfather = new Individual().setId("m_grandfather"); + Individual maternalGrandmother = new Individual().setId("m_grandmother"); + Individual father = new Individual().setId("father").setFather(paternalGrandfather).setMother(paternalGrandmother); + Individual mother = new Individual().setId("mother").setMother(maternalGrandmother).setFather(maternalGrandfather); + Individual proband = new Individual().setId("proband").setFather(father).setMother(mother); + Individual brother = new Individual().setId("brother").setFather(father).setMother(mother).setSex(IndividualProperty.Sex.MALE); + Individual sister = new Individual().setId("sister").setFather(father).setMother(mother).setSex(IndividualProperty.Sex.FEMALE); + Individual sibling = new Individual().setId("sibling").setFather(father).setMother(mother); + + catalogManager.getFamilyManager().create(STUDY, new Family().setId("family").setMembers( + Arrays.asList(paternalGrandfather, paternalGrandmother, maternalGrandfather, maternalGrandmother, mother, father, proband, + brother, sister, sibling)), QueryOptions.empty(), sessionIdUser); + OpenCGAResult family = catalogManager.getFamilyManager().get(STUDY, "family", QueryOptions.empty(), sessionIdUser); + Map> roles = family.first().getRoles(); + assertEquals(10, family.first().getMembers().size()); + + Map pGrandfather = roles.get("p_grandfather"); + assertEquals(5, pGrandfather.size()); + assertEquals(Family.FamiliarRelationship.SON, pGrandfather.get("father")); + assertEquals(Family.FamiliarRelationship.GRANDCHILD, pGrandfather.get("proband")); + assertEquals(Family.FamiliarRelationship.GRANDCHILD, pGrandfather.get("sibling")); + assertEquals(Family.FamiliarRelationship.GRANDSON, pGrandfather.get("brother")); + assertEquals(Family.FamiliarRelationship.GRANDDAUGHTER, pGrandfather.get("sister")); + + Map pGrandmother = roles.get("p_grandmother"); + assertEquals(5, pGrandmother.size()); + assertEquals(Family.FamiliarRelationship.SON, pGrandmother.get("father")); + assertEquals(Family.FamiliarRelationship.GRANDCHILD, pGrandmother.get("proband")); + assertEquals(Family.FamiliarRelationship.GRANDCHILD, pGrandmother.get("sibling")); + assertEquals(Family.FamiliarRelationship.GRANDSON, pGrandmother.get("brother")); + assertEquals(Family.FamiliarRelationship.GRANDDAUGHTER, pGrandmother.get("sister")); + + Map mGrandfather = roles.get("m_grandfather"); + assertEquals(5, mGrandfather.size()); + assertEquals(Family.FamiliarRelationship.DAUGHTER, mGrandfather.get("mother")); + assertEquals(Family.FamiliarRelationship.GRANDCHILD, mGrandfather.get("proband")); + assertEquals(Family.FamiliarRelationship.GRANDCHILD, mGrandfather.get("sibling")); + assertEquals(Family.FamiliarRelationship.GRANDSON, mGrandfather.get("brother")); + assertEquals(Family.FamiliarRelationship.GRANDDAUGHTER, mGrandfather.get("sister")); + + Map mGrandmother = roles.get("m_grandmother"); + assertEquals(5, mGrandmother.size()); + assertEquals(Family.FamiliarRelationship.DAUGHTER, mGrandmother.get("mother")); + assertEquals(Family.FamiliarRelationship.GRANDCHILD, mGrandmother.get("proband")); + assertEquals(Family.FamiliarRelationship.GRANDCHILD, mGrandmother.get("sibling")); + assertEquals(Family.FamiliarRelationship.GRANDSON, mGrandmother.get("brother")); + assertEquals(Family.FamiliarRelationship.GRANDDAUGHTER, mGrandmother.get("sister")); + + Map motherMap = roles.get("mother"); + assertEquals(6, motherMap.size()); + assertEquals(Family.FamiliarRelationship.MOTHER, motherMap.get("m_grandmother")); + assertEquals(Family.FamiliarRelationship.FATHER, motherMap.get("m_grandfather")); + assertEquals(Family.FamiliarRelationship.CHILD_OF_UNKNOWN_SEX, motherMap.get("proband")); + assertEquals(Family.FamiliarRelationship.CHILD_OF_UNKNOWN_SEX, motherMap.get("sibling")); + assertEquals(Family.FamiliarRelationship.SON, motherMap.get("brother")); + assertEquals(Family.FamiliarRelationship.DAUGHTER, motherMap.get("sister")); + + Map fatherMap = roles.get("father"); + assertEquals(6, fatherMap.size()); + assertEquals(Family.FamiliarRelationship.MOTHER, fatherMap.get("p_grandmother")); + assertEquals(Family.FamiliarRelationship.FATHER, fatherMap.get("p_grandfather")); + assertEquals(Family.FamiliarRelationship.CHILD_OF_UNKNOWN_SEX, fatherMap.get("proband")); + assertEquals(Family.FamiliarRelationship.CHILD_OF_UNKNOWN_SEX, fatherMap.get("sibling")); + assertEquals(Family.FamiliarRelationship.SON, fatherMap.get("brother")); + assertEquals(Family.FamiliarRelationship.DAUGHTER, fatherMap.get("sister")); + + Map probandMap = roles.get("proband"); + assertEquals(9, probandMap.size()); + assertEquals(Family.FamiliarRelationship.MATERNAL_GRANDMOTHER, probandMap.get("m_grandmother")); + assertEquals(Family.FamiliarRelationship.MATERNAL_GRANDFATHER, probandMap.get("m_grandfather")); + assertEquals(Family.FamiliarRelationship.PATERNAL_GRANDMOTHER, probandMap.get("p_grandmother")); + assertEquals(Family.FamiliarRelationship.PATERNAL_GRANDFATHER, probandMap.get("p_grandfather")); + assertEquals(Family.FamiliarRelationship.MOTHER, probandMap.get("mother")); + assertEquals(Family.FamiliarRelationship.FATHER, probandMap.get("father")); + assertEquals(Family.FamiliarRelationship.FULL_SIBLING, probandMap.get("sibling")); + assertEquals(Family.FamiliarRelationship.BROTHER, probandMap.get("brother")); + assertEquals(Family.FamiliarRelationship.SISTER, probandMap.get("sister")); + + Map siblingMap = roles.get("sibling"); + assertEquals(9, siblingMap.size()); + assertEquals(Family.FamiliarRelationship.MATERNAL_GRANDMOTHER, siblingMap.get("m_grandmother")); + assertEquals(Family.FamiliarRelationship.MATERNAL_GRANDFATHER, siblingMap.get("m_grandfather")); + assertEquals(Family.FamiliarRelationship.PATERNAL_GRANDMOTHER, siblingMap.get("p_grandmother")); + assertEquals(Family.FamiliarRelationship.PATERNAL_GRANDFATHER, siblingMap.get("p_grandfather")); + assertEquals(Family.FamiliarRelationship.MOTHER, siblingMap.get("mother")); + assertEquals(Family.FamiliarRelationship.FATHER, siblingMap.get("father")); + assertEquals(Family.FamiliarRelationship.FULL_SIBLING, siblingMap.get("proband")); + assertEquals(Family.FamiliarRelationship.BROTHER, siblingMap.get("brother")); + assertEquals(Family.FamiliarRelationship.SISTER, siblingMap.get("sister")); + + Map brotherMap = roles.get("brother"); + assertEquals(9, brotherMap.size()); + assertEquals(Family.FamiliarRelationship.MATERNAL_GRANDMOTHER, brotherMap.get("m_grandmother")); + assertEquals(Family.FamiliarRelationship.MATERNAL_GRANDFATHER, brotherMap.get("m_grandfather")); + assertEquals(Family.FamiliarRelationship.PATERNAL_GRANDMOTHER, brotherMap.get("p_grandmother")); + assertEquals(Family.FamiliarRelationship.PATERNAL_GRANDFATHER, brotherMap.get("p_grandfather")); + assertEquals(Family.FamiliarRelationship.MOTHER, brotherMap.get("mother")); + assertEquals(Family.FamiliarRelationship.FATHER, brotherMap.get("father")); + assertEquals(Family.FamiliarRelationship.FULL_SIBLING, brotherMap.get("sibling")); + assertEquals(Family.FamiliarRelationship.FULL_SIBLING, brotherMap.get("proband")); + assertEquals(Family.FamiliarRelationship.SISTER, brotherMap.get("sister")); + + Map sisterMap = roles.get("sister"); + assertEquals(9, sisterMap.size()); + assertEquals(Family.FamiliarRelationship.MATERNAL_GRANDMOTHER, sisterMap.get("m_grandmother")); + assertEquals(Family.FamiliarRelationship.MATERNAL_GRANDFATHER, sisterMap.get("m_grandfather")); + assertEquals(Family.FamiliarRelationship.PATERNAL_GRANDMOTHER, sisterMap.get("p_grandmother")); + assertEquals(Family.FamiliarRelationship.PATERNAL_GRANDFATHER, sisterMap.get("p_grandfather")); + assertEquals(Family.FamiliarRelationship.MOTHER, sisterMap.get("mother")); + assertEquals(Family.FamiliarRelationship.FATHER, sisterMap.get("father")); + assertEquals(Family.FamiliarRelationship.FULL_SIBLING, sisterMap.get("sibling")); + assertEquals(Family.FamiliarRelationship.BROTHER, sisterMap.get("brother")); + assertEquals(Family.FamiliarRelationship.FULL_SIBLING, sisterMap.get("proband")); + + } + @Test public void searchFamily() throws CatalogException { createDummyFamily("Martinez-Martinez", true); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/family/Family.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/family/Family.java index 169363154e7..a00254605a5 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/family/Family.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/family/Family.java @@ -84,6 +84,9 @@ public enum FamiliarRelationship { PATERNAL_UNCLE("", "uncle"), NEPHEW("", "nephew"), NIECE("", "niece"), + GRANDSON("", "grandson"), + GRANDCHILD("", "grandchild"), + GRANDDAUGHTER("", "granddaughter"), GRANDFATHER("", "grandfather"), GRANDMOTHER("", "grandmother"), MATERNAL_GRANDMOTHER("", "grandmother"), From dc88e9fbce944af44520cf6c7b7b1c6635c9e28a Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Tue, 25 May 2021 07:51:57 +0100 Subject: [PATCH 340/412] client: create structure of admin notebook --- .../admin-training/pyopencga_admin.ipynb | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb diff --git a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb new file mode 100644 index 00000000000..9bcba24118f --- /dev/null +++ b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb @@ -0,0 +1,158 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# Overview\n", + "------\n", + "This notebook is intended to ....\n", + "\n", + "For guidance on how to loggin and get started with *opencga* you can refer to : [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", + "\n", + "A good first step when start working with OpenCGA is to explore **Catalog**, which holds: information about our user, the projects and studies our user has permission to access and the clinical data from the studies. For guidance you can refer to : [pyopencga_catalog.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", + "\n", + "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", + "- https://ws.opencb.org/opencga-prod/webservices/\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Table of Contents:\n", + "\n", + "This Notebook is organised in the following sections:\n", + "\n", + "* __Grant/edit permissions to groups or individual users__\n", + "* __Asign samples to individuals__\n", + "* __Define phenotypes or diseases for individuals__\n", + "* __Define, add, edit and remove variable sets__\n", + "* __Use Cases__" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup the Client and Login into *pyopencga* \n", + "\n", + "**Configuration and Credentials** \n", + "\n", + "Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)).\n", + "\n", + "You need to provide **at least** a host server URL in the standard configuration format for OpenCGA as a python dictionary or in a json file.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Step 1. Import pyopencga dependecies\n", + "from pyopencga.opencga_config import ClientConfiguration # import configuration module\n", + "from pyopencga.opencga_client import OpencgaClient # import client module\n", + "from pprint import pprint\n", + "from IPython.display import JSON\n", + "# import json\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import datetime\n", + "\n", + "## Step 2. OpenCGA host\n", + "host = 'https://ws.opencb.org/opencga-prod'\n", + "# host = 'http://localhost:1234/opencga'\n", + "\n", + "## Step 3. User credentials\n", + "user = 'demouser'\n", + "passwd = 'demouser' ## you can skip this, see below.\n", + "####################################\n", + "\n", + "## Step 4. Create the ClientConfiguration dict\n", + "config_dict = {'rest': {\n", + " 'host': host \n", + " }\n", + " }\n", + "\n", + "## Step 5. Create the ClientConfiguration and OpenCGA client\n", + "config = ClientConfiguration(config_dict)\n", + "oc = OpencgaClient(config)\n", + "\n", + "## Step 6. Login to OpenCGA using the OpenCGA client \n", + "# Pass the credentials to the client\n", + "# (here we put only the user in order to be asked for the password interactively)\n", + "# oc.login(user)\n", + "\n", + "# or you can pass the user and passwd\n", + "oc.login(user, passwd)\n", + "\n", + "print('Logged succesfuly to {}, your token is: {} well done!'.format(host, oc.token))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup OpenCGA Variables\n", + "\n", + "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Define the OpenCGA variables to query data\n", + "study = 'training:admin'\n", + "\n", + "## You can define list using string with commas\n", + "genes='BRCA2'\n", + "\n", + "## or you can use python lists\n", + "transcripts=['ENST00000530893']\n", + "\n", + "RESULT_SEPARATOR='\\n'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 9bef254b1c53d9210bbd5523e9df50926f664d3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Tue, 25 May 2021 17:38:58 +0200 Subject: [PATCH 341/412] analysis: recover Circos plot analysis for backward compatibility --- .../variant/circos/CircosAnalysis.java | 90 +++ .../circos/CircosLocalAnalysisExecutor.java | 513 ++++++++++++++++++ .../client/rest/clients/VariantClient.java | 16 + .../models/variant/CircosAnalysisParams.java | 119 ++++ .../core/models/variant/CircosTrack.java | 55 ++ .../tools/variant/CircosAnalysisExecutor.java | 52 ++ .../rest/analysis/VariantWebService.java | 67 +++ 7 files changed, 912 insertions(+) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosAnalysis.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosTrack.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/CircosAnalysisExecutor.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosAnalysis.java new file mode 100644 index 00000000000..2ed3cf65913 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosAnalysis.java @@ -0,0 +1,90 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.variant.circos; + +import org.opencb.opencga.analysis.tools.OpenCgaTool; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.variant.CircosAnalysisParams; +import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.variant.CircosAnalysisExecutor; + +@Tool(id = CircosAnalysis.ID, resource = Enums.Resource.VARIANT) +public class CircosAnalysis extends OpenCgaTool { + + public static final String ID = "circos"; + public static final String DESCRIPTION = "Generate a Circos plot for a given sample."; + + public final static String SUFFIX_FILENAME = ".genomePlot.png"; + + private String study; + private CircosAnalysisParams circosParams; + + @Override + protected void check() throws Exception { + super.check(); + setUpStorageEngineExecutor(study); + + if (study == null || study.isEmpty()) { + throw new ToolException("Missing study"); + } + +// String sampleName = query.getString(SAMPLE.key()); +// try { +// study = catalogManager.getStudyManager().get(study, null, token).first().getFqn(); +// +// if (StringUtils.isNotEmpty(sampleName)) { +// OpenCGAResult sampleResult = catalogManager.getSampleManager().get(study, sampleName, new QueryOptions(), token); +// if (sampleResult.getNumResults() != 1) { +// throw new ToolException("Unable to compute mutational signature analysis. Sample '" + sampleName + "' not found"); +// } +// } +// } catch (CatalogException e) { +// throw new ToolException(e); +// } +// +// addAttribute("sampleName", sampleName); + } + + @Override + protected void run() throws ToolException { + step(getId(), () -> { + getToolExecutor(CircosAnalysisExecutor.class) + .setStudy(study) + .setCircosParams(circosParams) + .execute(); + }); + } + + public String getStudy() { + return study; + } + + public CircosAnalysis setStudy(String study) { + this.study = study; + return this; + } + + public CircosAnalysisParams getCircosParams() { + return circosParams; + } + + public CircosAnalysis setCircosParams(CircosAnalysisParams circosParams) { + this.circosParams = circosParams; + return this; + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java new file mode 100644 index 00000000000..e8b4a3878cf --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java @@ -0,0 +1,513 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.analysis.variant.circos; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.StopWatch; +import org.opencb.biodata.models.variant.StudyEntry; +import org.opencb.biodata.models.variant.Variant; +import org.opencb.biodata.models.variant.avro.BreakendMate; +import org.opencb.biodata.models.variant.avro.FileEntry; +import org.opencb.biodata.models.variant.avro.StructuralVariation; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.utils.DockerUtils; +import org.opencb.opencga.analysis.StorageToolExecutor; +import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; +import org.opencb.opencga.core.common.GitRepositoryState; +import org.opencb.opencga.core.common.TimeUtils; +import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.exceptions.ToolExecutorException; +import org.opencb.opencga.core.models.variant.CircosAnalysisParams; +import org.opencb.opencga.core.models.variant.CircosTrack; +import org.opencb.opencga.core.tools.annotations.ToolExecutor; +import org.opencb.opencga.core.tools.variant.CircosAnalysisExecutor; +import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; +import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.*; +import java.util.concurrent.*; + +import static org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor.DOCKER_INPUT_PATH; +import static org.opencb.opencga.analysis.wrappers.executors.DockerWrapperAnalysisExecutor.DOCKER_OUTPUT_PATH; +import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.STUDY; + +@ToolExecutor(id="opencga-local", tool = CircosAnalysis.ID, + framework = ToolExecutor.Framework.LOCAL, source = ToolExecutor.Source.STORAGE) +public class CircosLocalAnalysisExecutor extends CircosAnalysisExecutor implements StorageToolExecutor { + + public final static String R_DOCKER_IMAGE = "opencb/opencga-r:" + GitRepositoryState.get().getBuildVersion(); + private VariantStorageManager storageManager; + + private File snvsFile; + private File rearrsFile; + private File indelsFile; + private File cnvsFile; + + private boolean plotCopynumber = false; + private boolean plotIndels = false; + private boolean plotRearrangements = false; + + private Map errors; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + public CircosLocalAnalysisExecutor() { + super(); + } + + public CircosLocalAnalysisExecutor(String study, CircosAnalysisParams params, VariantStorageManager storageManager) { + super(study, params); + this.storageManager = storageManager; + } + + @Override + public VariantStorageManager getVariantStorageManager() throws ToolExecutorException { + if (storageManager == null) { + storageManager = StorageToolExecutor.super.getVariantStorageManager(); + } + return storageManager; + } + + @Override + public void run() throws ToolException, IOException { + + // Create query + Query query = new Query(); + if (MapUtils.isNotEmpty(getCircosParams().getQuery())) { + query.putAll(getCircosParams().getQuery()); + } + query.put(STUDY.key(), getStudy()); + + // Launch a thread per query + VariantStorageManager storageManager = getVariantStorageManager(); + + ExecutorService threadPool = Executors.newFixedThreadPool(4); + + errors = new HashMap<>(); + List> futureList = new ArrayList<>(4); + futureList.add(threadPool.submit(getNamedThread("SNV", () -> snvQuery(query, storageManager)))); + futureList.add(threadPool.submit(getNamedThread("COPY_NUMBER", () -> copyNumberQuery(query, storageManager)))); + futureList.add(threadPool.submit(getNamedThread("INDEL", () -> indelQuery(query, storageManager)))); + futureList.add(threadPool.submit(getNamedThread("REARRANGEMENT", () -> rearrangementQuery(query, storageManager)))); + + threadPool.shutdown(); + + try { + threadPool.awaitTermination(2, TimeUnit.MINUTES); + if (!threadPool.isTerminated()) { + for (Future future : futureList) { + future.cancel(true); + } + } + } catch (InterruptedException e) { + throw new ToolException("Error launching threads when executing the Circos analysis", e); + } + + + if (MapUtils.isEmpty(errors)) { + // Execute R script + // circos.R ./snvs.tsv ./indels.tsv ./cnvs.tsv ./rearrs.tsv SampleId + String rScriptPath = getExecutorParams().getString("opencgaHome") + "/analysis/R/genome-plot"; + List> inputBindings = new ArrayList<>(); + inputBindings.add(new AbstractMap.SimpleEntry<>(rScriptPath, DOCKER_INPUT_PATH)); + AbstractMap.SimpleEntry outputBinding = new AbstractMap.SimpleEntry<>(getOutDir().toAbsolutePath().toString(), + DOCKER_OUTPUT_PATH); + String scriptParams = "R CMD Rscript --vanilla " + DOCKER_INPUT_PATH + "/circos.R" + + (plotCopynumber ? "" : " --no_copynumber") + + (plotIndels ? "" : " --no_indels") + + (plotRearrangements ? "" : " --no_rearrangements") + + " --out_path " + DOCKER_OUTPUT_PATH + + " " + DOCKER_OUTPUT_PATH + "/" + snvsFile.getName() + + " " + DOCKER_OUTPUT_PATH + "/" + indelsFile.getName() + + " " + DOCKER_OUTPUT_PATH + "/" + cnvsFile.getName() + + " " + DOCKER_OUTPUT_PATH + "/" + rearrsFile.getName() + + " " + getCircosParams().getTitle(); + + StopWatch stopWatch = StopWatch.createStarted(); + String cmdline = DockerUtils.run(R_DOCKER_IMAGE, inputBindings, outputBinding, scriptParams, null); + logger.info("Docker command line: " + cmdline); + logger.info("Execution time: " + TimeUtils.durationToString(stopWatch)); + } else { + StringBuilder msg = new StringBuilder(); + for (Map.Entry error : errors.entrySet()) { + msg.append("Error on track ").append(error.getKey()).append(": ").append(error.getValue()).append(". "); + } + throw new ToolException(msg.toString()); + } + } + + /** + * Create file with SNV variants. + * + * @param query General query + * @param storageManager Variant storage manager + * @return True or false depending on successs + */ + private boolean snvQuery(Query query, VariantStorageManager storageManager) { + PrintWriter pw = null; + PrintWriter pwOut = null; + try { + snvsFile = getOutDir().resolve("snvs.tsv").toFile(); + pw = new PrintWriter(snvsFile); + pw.println("Chromosome\tchromStart\tchromEnd\tref\talt\tlogDistPrev"); + + pwOut = new PrintWriter(getOutDir().resolve("snvs.discarded").toFile()); + + CircosTrack snvTrack = getCircosParams().getCircosTrackByType("SNV"); + if (snvTrack == null) { + throw new ToolException("Missing SNV track"); + } + + int threshold; + + switch (getCircosParams().getDensity()) { + case "HIGH": + threshold = Integer.MAX_VALUE; + break; + case "MEDIUM": + threshold = 250000; + break; + case "LOW": + default: + threshold = 100000; + break; + } + + Map trackQuery = checkTrackQuery(snvTrack); + + Query snvQuery = new Query(query); + snvQuery.putAll(trackQuery); + + QueryOptions queryOptions = new QueryOptions() + .append(QueryOptions.INCLUDE, "id") + .append(QueryOptions.SORT, true); + + logger.info("SNV track, query: " + snvQuery.toJson()); + logger.info("SNV track, query options: " + queryOptions.toJson()); + + VariantDBIterator iterator = storageManager.iterator(snvQuery, queryOptions, getToken()); + + int prevStart = 0; + String currentChrom = ""; + while (iterator.hasNext()) { + Variant v = iterator.next(); + if (v.getStart() > v.getEnd()) { + // Sanity check + pwOut.println(v.toString() + "\tStart (" + v.getStart() + ") is bigger than end (" + v.getEnd() + ")"); + } else { + if (!v.getChromosome().equals(currentChrom)) { + prevStart = 0; + currentChrom = v.getChromosome(); + } + int dist = v.getStart() - prevStart; + if (dist < threshold) { + pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\t" + v.getReference() + "\t" + + v.getAlternate() + "\t" + Math.log10(dist)); + } + prevStart = v.getStart(); + } + } + } catch(Exception e) { + errors.put("SNV", e.getMessage()); + return false; + } finally { + if (pw != null) { + pw.close(); + } + if (pwOut != null) { + pwOut.close(); + } + } + return true; + } + + /** + * Create file with copy-number variants. + * + * @param query General query + * @param storageManager Variant storage manager + * @return True or false depending on successs + */ + private boolean copyNumberQuery(Query query, VariantStorageManager storageManager) { + PrintWriter pw = null; + PrintWriter pwOut = null; + try { + cnvsFile = getOutDir().resolve("cnvs.tsv").toFile(); + + pw = new PrintWriter(cnvsFile); + pw.println("Chromosome\tchromStart\tchromEnd\tlabel\tmajorCopyNumber\tminorCopyNumber"); + + pwOut = new PrintWriter(getOutDir().resolve("cnvs.discarded").toFile()); + + CircosTrack copyNumberTrack = getCircosParams().getCircosTrackByType("COPY-NUMBER"); + if (copyNumberTrack != null) { + plotCopynumber = true; + + Map trackQuery = checkTrackQuery(copyNumberTrack); + + Query copyNumberQuery = new Query(query); + copyNumberQuery.putAll(trackQuery); + + QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id,studies"); + + logger.info("COPY-NUMBER track, query: " + copyNumberQuery.toJson()); + logger.info("COPY-NUMBER track, query options: " + queryOptions.toJson()); + + VariantDBIterator iterator = storageManager.iterator(copyNumberQuery, queryOptions, getToken()); + + while (iterator.hasNext()) { + Variant v = iterator.next(); + + if (CollectionUtils.isEmpty(v.getStudies())) { + pwOut.println(v.toString() + "\tStudies is empty"); + } else { + StudyEntry studyEntry = v.getStudies().get(0); + String strTcn = studyEntry.getSampleData(query.getString(VariantQueryParam.SAMPLE.key()), "TCN"); + String strMcn = studyEntry.getSampleData(query.getString(VariantQueryParam.SAMPLE.key()), "MCN"); + + if (StringUtils.isEmpty(strTcn)) { + pwOut.println(v.toString() + "\tTCN format field is empty"); + } else { + if (StringUtils.isEmpty(strMcn)) { + pwOut.println(v.toString() + "\tMCN format field is empty"); + } else { + try { + int tcn = Integer.parseInt(strTcn); + int mcn = Integer.parseInt(strMcn); + pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tNONE\t" + + (tcn - mcn) + "\t" + mcn); + } catch (NumberFormatException e){ + pwOut.println(v.toString() + "\tError parsing TCN/MCN: " + e.getMessage()); + } + } + } + } + } + } + } catch (Exception e) { + errors.put("COPY-NUMBER", e.getMessage()); + return false; + } finally { + if (pw != null) { + pw.close(); + } + if (pwOut != null) { + pwOut.close(); + } + } + return true; + } + + /** + * Create file with INDEL variants. + * + * @param query General query + * @param storageManager Variant storage manager + * @return True or false depending on successs + */ + private boolean indelQuery(Query query, VariantStorageManager storageManager) { + PrintWriter pw = null; + PrintWriter pwOut = null; + try { + indelsFile = getOutDir().resolve("indels.tsv").toFile(); + pw = new PrintWriter(indelsFile); + pw.println("Chromosome\tchromStart\tchromEnd\ttype\tclassification"); + + pwOut = new PrintWriter(getOutDir().resolve("indels.discarded").toFile()); + + CircosTrack indelTrack = getCircosParams().getCircosTrackByType("INDEL"); + if (indelTrack != null) { + plotIndels = true; + + Map trackQuery = checkTrackQuery(indelTrack); + + Query indelQuery = new Query(query); + indelQuery.putAll(trackQuery); + + QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id"); + + logger.info("INDEL track, query: " + indelQuery.toJson()); + logger.info("INDEL track, query options: " + queryOptions.toJson()); + + VariantDBIterator iterator = storageManager.iterator(indelQuery, queryOptions, getToken()); + + while (iterator.hasNext()) { + Variant v = iterator.next(); + if (StringUtils.isEmpty(v.getReference())) { + pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tI\tNone"); + } else if (StringUtils.isEmpty(v.getAlternate())){ + pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tD\tNone"); + } else { + pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tDI\tNone"); + } + /* + switch (v.getType()) { + case INSERTION: { + pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tI\tNone"); + break; + } + case DELETION: { + pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tD\tNone"); + break; + } + case INDEL: { + pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tDI\tNone"); + break; + } + default: { + // Sanity check + pwOut.println(v.toString() + "\tInvalid type " + v.getType() + ". Valid values: " + VariantType.INSERTION + + ", " + DELETION + ", " + VariantType.INDEL); + break; + } + } + */ + } + } + } catch(Exception e){ + errors.put("INDEL", e.getMessage()); + return false; +// throw new ToolExecutorException(e); + } finally { + if (pw != null) { + pw.close(); + } + if (pwOut != null) { + pwOut.close(); + } + } + return true; + } + + /** + * Create file with rearrangement variants. + * + * @param query General query + * @param storageManager Variant storage manager + * @return True or false depending on successs + */ + private boolean rearrangementQuery(Query query, VariantStorageManager storageManager) { + PrintWriter pw = null; + PrintWriter pwOut = null; + try { + rearrsFile = getOutDir().resolve("rearrs.tsv").toFile(); + pw = new PrintWriter(rearrsFile); + pw.println("Chromosome\tchromStart\tchromEnd\tChromosome.1\tchromStart.1\tchromEnd.1\ttype"); + + pwOut = new PrintWriter(getOutDir().resolve("rearrs.discarded").toFile()); + + CircosTrack rearrangementTrack = getCircosParams().getCircosTrackByType("REARRANGEMENT"); + if (rearrangementTrack != null) { + plotRearrangements = true; + + Map trackQuery = checkTrackQuery(rearrangementTrack); + + Query rearrangementQuery = new Query(query); + rearrangementQuery.putAll(trackQuery); + + QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id,sv,studies"); + + logger.info("REARRANGEMENT track, query: " + rearrangementQuery.toJson()); + logger.info("REARRANGEMENT track, query options: " + queryOptions.toJson()); + + VariantDBIterator iterator = storageManager.iterator(rearrangementQuery, queryOptions, getToken()); + + while (iterator.hasNext()) { + Variant v = iterator.next(); + + String variantType = v.getType() != null ? v.getType().name() : ""; + if (CollectionUtils.isNotEmpty(v.getStudies()) && CollectionUtils.isNotEmpty(v.getStudies().get(0).getFiles())) { + for (FileEntry file : v.getStudies().get(0).getFiles()) { + if (file.getData() != null && file.getData().containsKey("EXT_SVTYPE")) { + variantType = file.getData().get("EXT_SVTYPE"); + break; + } + } + } + + // Check structural variation + StructuralVariation sv = v.getSv(); + if (sv != null) { + if (sv.getBreakend() != null) { + if (sv.getBreakend().getMate() != null) { + BreakendMate mate = sv.getBreakend().getMate(); + pw.println("chr" + v.getChromosome() + "\t" + v.getStart() + "\t" + v.getEnd() + "\tchr" + + mate.getChromosome() + "\t" + mate.getPosition() + "\t" + mate.getPosition() + "\t" + + variantType); + } else { + pwOut.println(v.toString() + "\tBreakend mate is empty (variant type: " + variantType + ")"); + } + } else { + pwOut.println(v.toString() + "\tBreakend is empty (variant type: " + variantType + ")"); + } + } else { + pwOut.println(v.toString() + "\tSV is empty (variant type: " + variantType + ")"); + } + } + } + } catch (Exception e) { + errors.put("REARRANGEMENT", e.getMessage()); + return false; + } finally { + if (pw != null) { + pw.close(); + } + if (pwOut != null) { + pwOut.close(); + } + } + return true; + } + + private Callable getNamedThread(String name, Callable c) { + String parentThreadName = Thread.currentThread().getName(); + return () -> { + Thread.currentThread().setName(parentThreadName + "-" + name); + return c.call(); + }; + } + + private Map checkTrackQuery(CircosTrack track) throws ToolException { + Map query = new HashMap<>(); + + if (MapUtils.isNotEmpty(track.getQuery())) { + query = track.getQuery(); + } + + if ("COPY-NUMBER".equals(track.getType())) { + query.put("type", "CNV"); + } else if ("INDEL".equals(track.getType())) { + query.put("type", "INSERTION,DELETION,INDEL"); + } else if ("REARRANGEMENT".equals(track.getType())) { + query.put("type", "DELETION,TRANSLOCATION,INVERSION,DUPLICATION,TANDEM_DUPLICATION,BREAKEND"); + } else if ("SNV".equals(track.getType())) { + query.put("type", "SNV"); + } else { + throw new ToolException("Unknown Circos track type: '" + track.getType() + "'"); + } + + return query; + } +} diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 33008e3ade8..cf79e090d01 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -159,6 +159,22 @@ public RestResponse runGenomePlot(GenomePlotAnalysisParams data, ObjectM return execute("analysis", null, "variant/genomePlot", null, "run", params, POST, String.class); } + /** + * Generate a Circos plot for a given sample. + * @param data Circos analysis params to customize the plot. These parameters include the title, the plot density (i.e., the number of + * points to display), the general query and the list of tracks. Currently, the supported track types are: COPY-NUMBER, INDEL, + * REARRANGEMENT and SNV. In addition, each track can contain a specific query. + * @param params Map containing any of the following optional parameters. + * study: study. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse runCircos(CircosAnalysisParams data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("analysis", null, "variant/circos", null, "run", params, POST, String.class); + } + /** * Delete cohort variant stats from a cohort. * @param params Map containing any of the following optional parameters. diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java new file mode 100644 index 00000000000..424ea4a8059 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java @@ -0,0 +1,119 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.core.models.variant; + +import org.apache.commons.collections4.CollectionUtils; +import org.opencb.opencga.core.tools.ToolParams; + +import java.util.List; +import java.util.Map; + +public class CircosAnalysisParams extends ToolParams { + public static final String DESCRIPTION = "Circos analysis params to customize the plot. These parameters include the title, the " + + "plot density (i.e., the number of points to display), the general query and the list of tracks. Currently, the supported " + + "track types are: COPY-NUMBER, INDEL, REARRANGEMENT and SNV. In addition, each track can contain a specific query"; + private String title; + private String density; // Density plot: LOW, MEDIUM or HIGH + private Map query; + private List tracks; + + private String outdir; + + public CircosAnalysisParams() { + this(null, "LOW", null, null, null); + } + + public CircosTrack getCircosTrackByType(String type) { + // Sanity check + if (tracks == null || CollectionUtils.isEmpty(tracks)) { + return null; + } + + for (CircosTrack track: tracks) { + if (type.equals(track.getType())) { + // Return the first track + return track; + } + } + return null; + } + + public CircosAnalysisParams(String title, String density, Map query, List tracks, String outdir) { + this.title = title; + this.density = density; + this.query = query; + this.tracks = tracks; + this.outdir = outdir; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("CircosAnalysisParams{"); + sb.append("title='").append(title).append('\''); + sb.append(", density='").append(density).append('\''); + sb.append(", query=").append(query); + sb.append(", tracks=").append(tracks); + sb.append(", outdir='").append(outdir).append('\''); + sb.append('}'); + return sb.toString(); + } + + public String getTitle() { + return title; + } + + public CircosAnalysisParams setTitle(String title) { + this.title = title; + return this; + } + + public String getDensity() { + return density; + } + + public CircosAnalysisParams setDensity(String density) { + this.density = density; + return this; + } + + public Map getQuery() { + return query; + } + + public CircosAnalysisParams setQuery(Map query) { + this.query = query; + return this; + } + + public List getTracks() { + return tracks; + } + + public CircosAnalysisParams setTracks(List tracks) { + this.tracks = tracks; + return this; + } + + public String getOutdir() { + return outdir; + } + + public CircosAnalysisParams setOutdir(String outdir) { + this.outdir = outdir; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosTrack.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosTrack.java new file mode 100644 index 00000000000..d40a03ce3cd --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosTrack.java @@ -0,0 +1,55 @@ +package org.opencb.opencga.core.models.variant; + +import java.util.Map; + +public class CircosTrack { + private String id; + private String type; + private Map query; + + public CircosTrack() { + } + + public CircosTrack(String id, String type, Map query) { + this.id = id; + this.type = type; + this.query = query; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("CircosTrack{"); + sb.append("id='").append(id).append('\''); + sb.append(", type='").append(type).append('\''); + sb.append(", query=").append(query); + sb.append('}'); + return sb.toString(); + } + + public String getId() { + return id; + } + + public CircosTrack setId(String id) { + this.id = id; + return this; + } + + public String getType() { + return type; + } + + public CircosTrack setType(String type) { + this.type = type; + return this; + } + + public Map getQuery() { + return query; + } + + public CircosTrack setQuery(Map query) { + this.query = query; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/CircosAnalysisExecutor.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/CircosAnalysisExecutor.java new file mode 100644 index 00000000000..89f1b7cc569 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/CircosAnalysisExecutor.java @@ -0,0 +1,52 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.core.tools.variant; + +import org.opencb.opencga.core.models.variant.CircosAnalysisParams; +import org.opencb.opencga.core.tools.OpenCgaToolExecutor; + +public abstract class CircosAnalysisExecutor extends OpenCgaToolExecutor { + + private String study; + private CircosAnalysisParams circosParams; + + public CircosAnalysisExecutor() { + } + + public CircosAnalysisExecutor(String study, CircosAnalysisParams circosParams) { + this.study = study; + this.circosParams = circosParams; + } + + public String getStudy() { + return study; + } + + public CircosAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } + + public CircosAnalysisParams getCircosParams() { + return circosParams; + } + + public CircosAnalysisExecutor setCircosParams(CircosAnalysisParams params) { + this.circosParams = params; + return this; + } +} diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index ab89bde6b01..24895b20c88 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -35,6 +35,8 @@ import org.opencb.opencga.analysis.individual.qc.IndividualQcUtils; import org.opencb.opencga.analysis.sample.qc.SampleQcAnalysis; import org.opencb.opencga.analysis.variant.VariantExportTool; +import org.opencb.opencga.analysis.variant.circos.CircosAnalysis; +import org.opencb.opencga.analysis.variant.circos.CircosLocalAnalysisExecutor; import org.opencb.opencga.analysis.variant.genomePlot.GenomePlotAnalysis; import org.opencb.opencga.analysis.variant.gwas.GwasAnalysis; import org.opencb.opencga.analysis.variant.inferredSex.InferredSexAnalysis; @@ -1267,6 +1269,71 @@ public Response genomePlot( } } + @POST + @Path("/circos/run") + @ApiOperation(value = CircosAnalysis.DESCRIPTION, response = String.class) + public Response circos( + @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = CircosAnalysisParams.DESCRIPTION, required = true) CircosAnalysisParams params) { + File outDir = null; + try { + if (StringUtils.isEmpty(params.getTitle())) { + params.setTitle("UNTITLED"); + } + + // Create temporal directory + outDir = Paths.get(configuration.getAnalysis().getScratchDir(), "circos-" + System.nanoTime()).toFile(); + outDir.mkdir(); + if (!outDir.exists()) { + return createErrorResponse(new Exception("Error creating temporal directory for Circos analysis")); + } + + // Create and set up Circos executor + CircosLocalAnalysisExecutor executor = new CircosLocalAnalysisExecutor(study, params, variantManager); + + ObjectMap executorParams = new ObjectMap(); + executorParams.put("opencgaHome", opencgaHome); + executorParams.put("token", token); + executor.setUp(null, executorParams, outDir.toPath()); + + // Run Circos executor + StopWatch watch = StopWatch.createStarted(); + executor.run(); + + // Check results by reading the output file + File imgFile = outDir.toPath().resolve(params.getTitle() + CircosAnalysis.SUFFIX_FILENAME).toFile(); + if (imgFile.exists()) { + FileInputStream fileInputStreamReader = new FileInputStream(imgFile); + byte[] bytes = new byte[(int) imgFile.length()]; + fileInputStreamReader.read(bytes); + + String img = new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); + + watch.stop(); + OpenCGAResult result = new OpenCGAResult<>(((int) watch.getTime()), Collections.emptyList(), 1, + Collections.singletonList(img), 1); + + //System.out.println(result.toString()); + return createOkResponse(result); + } else { + return createErrorResponse(new Exception("Error plotting Circos graph")); + } + } catch (ToolException | IOException e) { + return createErrorResponse(e); + } finally { + if (outDir != null) { + // Delete temporal directory + try { + if (outDir.exists() && !params.getTitle().startsWith("no.delete.")) { + FileUtils.deleteDirectory(outDir); + } + } catch (IOException e) { + logger.warn("Error cleaning scratch directory " + outDir, e); + } + } + } + } + // @POST // @Path("/hw/run") // @ApiOperation(value = PENDING, response = Job.class) From 4dfda539cd0c24e7936fa1675661f7496da32228 Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 27 May 2021 02:38:58 +0000 Subject: [PATCH 342/412] GitBook: [develop] 4 pages modified --- docs/SUMMARY.md | 3 +- .../sharing-and-permissions.md | 74 ------------ .../sharing-and-permissions/README.md | 35 ++++++ .../sharing-and-permissions/permissions.md | 108 ++++++++++++++++++ 4 files changed, 145 insertions(+), 75 deletions(-) delete mode 100644 docs/manual/data-management/sharing-and-permissions.md create mode 100644 docs/manual/data-management/sharing-and-permissions/README.md create mode 100644 docs/manual/data-management/sharing-and-permissions/permissions.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index fd63e845b7c..79d140a32fd 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -50,7 +50,8 @@ * [Data Management](manual/data-management/README.md) * [Projects and Studies](manual/data-management/projects-and-studies.md) * [Working with Files](manual/data-management/working-with-files.md) - * [Sharing and Permissions](manual/data-management/sharing-and-permissions.md) + * [Sharing and Permissions](manual/data-management/sharing-and-permissions/README.md) + * [Permissions](manual/data-management/sharing-and-permissions/permissions.md) * [Adding Custom Metadata](manual/data-management/adding-custom-metadata.md) * [Alignment Engine](manual/alignment-engine/README.md) * [BAM Index](manual/alignment-engine/bam-index.md) diff --git a/docs/manual/data-management/sharing-and-permissions.md b/docs/manual/data-management/sharing-and-permissions.md deleted file mode 100644 index 9752a027238..00000000000 --- a/docs/manual/data-management/sharing-and-permissions.md +++ /dev/null @@ -1,74 +0,0 @@ -# Sharing and Permissions - -[http://docs.opencb.org/display/opencga/Sharing+and+Permissions](http://docs.opencb.org/display/opencga/Sharing+and+Permissions) - -
-

quantity

+

quantity +

String

-

date

+

date +

String

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Category - Permission - -

Users and -

-

Groups -

-
Admins (users in admins group) - Owner -
Study - Delete
Create new admins
Groups
Variable sets
Set permissions (share)
Run analyses (Execution)
- -![Decision Algorithm for granting permissions ](../../.gitbook/assets/image%20%282%29.png) - - - diff --git a/docs/manual/data-management/sharing-and-permissions/README.md b/docs/manual/data-management/sharing-and-permissions/README.md new file mode 100644 index 00000000000..4e2a6d0f811 --- /dev/null +++ b/docs/manual/data-management/sharing-and-permissions/README.md @@ -0,0 +1,35 @@ +# Sharing and Permissions + +## Overview + +OpenCGA provides a powerful mechanism of custom-built and secure permission system defined by a mechanism of **Access Control Lists \(ACLs\). Catalog** is the OpenCGA component that implements the permission mechanism. + +The system enables to define a list of permissions at a member level, being a member either a isolate user or a defined group of users. + +## Users in OpenCGA + +Any study has intrinsically defined three different member levels + +### Owner + +The owner of an study is the user that creates the study. Because of that an study will always have one and only one owner, who will be able to perform any action over the data contained in the study. There are two actions that are only possible for the owner user: _**delete the study**_ and _**assign or remove users to/from admins**_ **groups** _\(see next section\)._ + +### Administrative groups + +OpenCGA defines two reserved groups that will have some special behaviour. + +#### Admins + +Every _Study_ in OpenCGA contains a special group called _**admins**_. This group will contain a list of users that will be able to do most of the administrative work the owner might want other users to do. Users belonging to this group will be able to perform almost any action except for the two ones that are only allowed for the owner of the study. Special operations that only these users will be able to perform are _**create/update/delete groups of** **users**_, _**create/update/delete variable sets**_ and _**assign/remove permissions to other users/groups.**_ + +#### Members + +Apart from _admins,_ there is also an special group called _members_. Any user with any kind of granted access to the study will automatically belong to this group. The main aim of this group is to keep track of the users with any access to the study, but it also has other advantages such as: + +* The _admin_ users might want to predefined some permissions any _member_ of a study will have. In such a case, _admin_ users will just add new users to that group and those users will automatically be granted the permissions the group has. +* If an _admin_ user wants to completely revoke any permission to one user, by removing that user from the _members_ group, OpenCGA will automatically search for any permissions set for that user in any entity and remove it. + +![Decision Algorithm for granting permissions ](../../../.gitbook/assets/image%20%282%29.png) + + + diff --git a/docs/manual/data-management/sharing-and-permissions/permissions.md b/docs/manual/data-management/sharing-and-permissions/permissions.md new file mode 100644 index 00000000000..0b9138ac730 --- /dev/null +++ b/docs/manual/data-management/sharing-and-permissions/permissions.md @@ -0,0 +1,108 @@ +# Permissions + +{% hint style="info" %} +Remember that you can always check the Catalog code that implements OpenCGA's ACLs permission system in our official publicly available [GitHub repository](https://github.com/opencb/opencga/blob/9b00edc7b556898d6b65527a333ecdd62aea3791/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyAclEntry.java). +{% endhint %} + +Here you will find the list of permissions that can be granted to a **member** \(user or group\) in OpenCGA. Thanks to the **ACLs** system, permissions can be assigned to almost any entry level \(except for _User_ and _Project\)._ + +{% tabs %} +{% tab title="SAMPLES" %} +* **VIEW\_SAMPLES** +* **WRITE\_SAMPLES** _\(implies: VIEW\_SAMPLES\)_ +* **DELETE\_SAMPLES** _\(implies:VIEW\_SAMPLES, WRITE\_SAMPLES\)_ +* **VIEW\_SAMPLE\_ANNOTATIONS** _\(implies: VIEW\_SAMPLES\)_ +* **WRITE\_SAMPLE\_ANNOTATIONS** _\(implies: VIEW\_SAMPLES, VIEW\_SAMPLE\_ANNOTATIONS\)_ +* **DELETE\_SAMPLE\_ANNOTATIONS** _\(implies: VIEW\_SAMPLES, VIEW\_SAMPLE\_ANNOTATIONS, WRITE\_SAMPLE\_ANNOTATIONS\)_ +* **VIEW\_AGGREGATED\_VARIANTS** +* **VIEW\_SAMPLE\_VARIANTS** _\(implies: VIEW\_SAMPLES, VIEW\_SAMPLE\_ANNOTATIONS, VIEW\_AGGREGATED\_VARIANTS\)_ +{% endtab %} + +{% tab title="INDIVIDUALS" %} +* **VIEW\_INDIVIDUALS** +* **WRITE\_INDIVIDUALS** _\(implies: VIEW\_INDIVIDUALS\)_ +* **DELETE\_INDIVIDUALS** _\(implies:VIEW\_INDIVIDUALS, WRITE\_INDIVIDUALS\)_ +* **VIEW\_INDIVIDUAL\_ANNOTATIONS** _\(implies: VIEW\_INDIVIDUALS\)_ +* **WRITE\_INDIVIDUAL\_ANNOTATIONS** _\(implies: VIEW\_INDIVIDUALS, VIEW\_INDIVIDUAL\_ANNOTATIONS\)_ +* **DELETE\_INDIVIDUAL\_ANNOTATIONS** _\(implies: VIEW\_INDIVIDUALS, VIEW\_INDIVIDUAL\_ANNOTATIONS, WRITE\_INDIVIDUAL\_ANNOTATIONS\)_ +{% endtab %} + +{% tab title="FILES" %} +* **VIEW\_FILES** +* **VIEW\_FILE\_HEADER** _\(implies: VIEW\_FILES\)_ +* **VIEW\_FILE\_CONTENT** _\(implies: VIEW\_FILES\)_ +* **WRITE\_FILES** \(_implies: VIEW\_FILES_\) +* **DELETE\_FILES** _****\(implies: VIEW\_FILES, WRITE\_FILES\)_ +* **DOWNLOAD\_FILES** _\(implies: VIEW\_FILES\)_ +* **UPLOAD\_FILES** _****\(implies: WRITE\_FILES, VIEW\_FILES\)_ +* **VIEW\_FILE\_ANNOTATIONS** _\(implies: VIEW\_FILES\)_ +* **WRITE\_FILE\_ANNOTATIONS** _\(implies: VIEW\_FILE\_ANNOTATIONS, VIEW\_FILES\)_ +* **DELETE\_FILE\_ANNOTATIONS** _\(implies: WRITE\_FILE\_ANNOTATIONS, VIEW\_FILE\_ANNOTATIONS, VIEW\_FILES\)_ +{% endtab %} + +{% tab title="JOBS" %} +* **EXECUTE\_JOBS** +* **VIEW\_JOBS** +* **WRITE\_JOBS** _\(implies: VIEW\_JOBS\)_ +* **DELETE\_JOBS** _\(implies: VIEW\_JOBS, WRITE\_JOBS\)_ +{% endtab %} + +{% tab title="FAMILIES" %} +* **VIEW\_FAMILIES** +* **WRITE\_FAMILIES** _\(implies: VIEW\_FAMILIES\)_ +* **DELETE\_FAMILIES** _\(implies: VIEW\_FAMILIES, WRITE\_FAMILIES\)_ +* **VIEW\_FAMILY\_ANNOTATIONS** _\(implies: VIEW\_FAMILIES\)_ +* **WRITE\_FAMILY\_ANNOTATIONS** _\(implies:VIEW\_FAMILIES, VIEW\_FAMILY\_ANNOTATIONS\)_ +* **DELETE\_FAMILY\_ANNOTATIONS** _\(implies: VIEW\_FAMILIES, VIEW\_FAMILY\_ANNOTATIONS, WRITE\_FAMILY\_ANNOTATIONS\)_ +{% endtab %} +{% endtabs %} + +```text + + +COHORTS + VIEW_COHORTS(Collections.emptyList(), CohortAclEntry.CohortPermissions.VIEW.name(), COHORT), + WRITE_COHORTS(Collections.singletonList(VIEW_COHORTS), CohortAclEntry.CohortPermissions.WRITE.name(), COHORT), + DELETE_COHORTS(Arrays.asList(VIEW_COHORTS, WRITE_COHORTS), CohortAclEntry.CohortPermissions.DELETE.name(), COHORT), + VIEW_COHORT_ANNOTATIONS(Collections.singletonList(VIEW_COHORTS), CohortAclEntry.CohortPermissions.VIEW_ANNOTATIONS.name(), COHORT), + WRITE_COHORT_ANNOTATIONS(Arrays.asList(VIEW_COHORTS, VIEW_COHORT_ANNOTATIONS), + CohortAclEntry.CohortPermissions.WRITE_ANNOTATIONS.name(), COHORT), + DELETE_COHORT_ANNOTATIONS(Arrays.asList(VIEW_COHORTS, VIEW_COHORT_ANNOTATIONS, WRITE_COHORT_ANNOTATIONS), + CohortAclEntry.CohortPermissions.DELETE_ANNOTATIONS.name(), COHORT), + +DISEASE PANELS + VIEW_PANELS(Collections.emptyList(), PanelAclEntry.PanelPermissions.VIEW.name(), DISEASE_PANEL), + WRITE_PANELS(Collections.singletonList(VIEW_PANELS), PanelAclEntry.PanelPermissions.WRITE.name(), DISEASE_PANEL), + DELETE_PANELS(Arrays.asList(VIEW_PANELS, WRITE_PANELS), PanelAclEntry.PanelPermissions.DELETE.name(), DISEASE_PANEL), + +CLINICAL ANALYSIS + VIEW_CLINICAL_ANALYSIS(Collections.emptyList(), ClinicalAnalysisAclEntry.ClinicalAnalysisPermissions.VIEW.name(), + CLINICAL_ANALYSIS), + WRITE_CLINICAL_ANALYSIS(Collections.singletonList(VIEW_CLINICAL_ANALYSIS), + ClinicalAnalysisAclEntry.ClinicalAnalysisPermissions.WRITE.name(), CLINICAL_ANALYSIS), + DELETE_CLINICAL_ANALYSIS(Arrays.asList(VIEW_CLINICAL_ANALYSIS, WRITE_CLINICAL_ANALYSIS), + ClinicalAnalysisAclEntry.ClinicalAnalysisPermissions.DELETE.name(), CLINICAL_ANALYSIS); +``` + +## Special cases + +Permissions can be given to any concrete entity \(file, sample, cohort...\) to deny or grant access to just one concrete entry. This is always true except for a few exceptions in which we might propagate those same permissions to other entries: + +### Files + +File entry might be of type file or folder. Permissions assigned in folders are propagated to all the children \(files and folders\) recursively. + + All permissions that might have had files and folders under the folder being given permissions will be modified according to the action being performed in the parent folder. In other words, if we are setting new permissions for the folder, any possible permissions the files and folders under the parent folder might have had will be completely replaced by the parent folder's permissions. However, if the action being performed is just adding a new permission to the parent folder, children files and folders will keep their old permissions plus the new one\(s\) added to the parent folder. + +### Individuals/Samples + +Individuals are really strong related with samples. So every time permissions are given to an individual, the same permissions can be applied to all the related samples if the user sets the 'propagate' field to True, and vice-versa. + +## Use cases + +### Give public access to non-existing users + +Catalog has one special user for this purpose represented with _\*_ symbol. Anytime a user tries to fetch anything and no session id is provided, Catalog will treat that user as _\*_. By default, only authorised users will have access to data. However, study managers can still define permissions for non-authenticated users assigning permissions to the "user" _\*._ + + + From 9f753e105fab3fa454145f9c355f9cbd285c03db Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 27 May 2021 03:25:57 +0000 Subject: [PATCH 343/412] GitBook: [develop] 2 pages modified --- .../sharing-and-permissions/README.md | 9 +++ .../sharing-and-permissions/permissions.md | 73 +++++++++++-------- 2 files changed, 50 insertions(+), 32 deletions(-) diff --git a/docs/manual/data-management/sharing-and-permissions/README.md b/docs/manual/data-management/sharing-and-permissions/README.md index 4e2a6d0f811..72ba99214ba 100644 --- a/docs/manual/data-management/sharing-and-permissions/README.md +++ b/docs/manual/data-management/sharing-and-permissions/README.md @@ -29,7 +29,16 @@ Apart from _admins,_ there is also an special group called _members_. Any user w * The _admin_ users might want to predefined some permissions any _member_ of a study will have. In such a case, _admin_ users will just add new users to that group and those users will automatically be granted the permissions the group has. * If an _admin_ user wants to completely revoke any permission to one user, by removing that user from the _members_ group, OpenCGA will automatically search for any permissions set for that user in any entity and remove it. +## Decision Algorithm + +The next schema provides a visual explanation of the algorithm implemented in Catalog for providing a user access to the data in the context of a study. + ![Decision Algorithm for granting permissions ](../../../.gitbook/assets/image%20%282%29.png) +There are two circumstances under which the algorithm behaves as follows: + +* If the user and any of the groups where the user belongs to have permissions defined for one entry, the permissions that will be actually used will be the user's. +* In case the user belongs to more than one group and those groups are assigned different permissions for one concrete entry, the effective permissions that will be used will be the union of the permissions found in all those groups. + diff --git a/docs/manual/data-management/sharing-and-permissions/permissions.md b/docs/manual/data-management/sharing-and-permissions/permissions.md index 0b9138ac730..9fddf883a99 100644 --- a/docs/manual/data-management/sharing-and-permissions/permissions.md +++ b/docs/manual/data-management/sharing-and-permissions/permissions.md @@ -6,6 +6,18 @@ Remember that you can always check the Catalog code that implements OpenCGA's AC Here you will find the list of permissions that can be granted to a **member** \(user or group\) in OpenCGA. Thanks to the **ACLs** system, permissions can be assigned to almost any entry level \(except for _User_ and _Project\)._ +## How it works + +A list of the basic permissions and their explanations can be found in the list below: + +* VIEW_: Give permission to access in read-only mode to the entry \(study, file, sample...\). WRITE: Give permission to create and update that kind of entries within the study. This do not include permissions to modify annotation and/or annotation sets. Those actions will need additional permissions._ +* _DELETE:_ Give permission to delete that kind of entries. +* ANNOTATIONS: In Sample, Individual, Family and Cohort we have three additional permissions to deal with annotations. + + Files deserve a special treatment as they not only exist in the database, but also physically in the file system. The special permissions added for files are the following: + +_VIEW\_FILE\_HEADER_: Give permission to retrieve just the header of a file. DOWNLOAD\_FILES or _DOWNLOAD_: Give permission to download the whole file. + {% tabs %} {% tab title="SAMPLES" %} * **VIEW\_SAMPLES** @@ -55,34 +67,35 @@ Here you will find the list of permissions that can be granted to a **member** \ * **WRITE\_FAMILY\_ANNOTATIONS** _\(implies:VIEW\_FAMILIES, VIEW\_FAMILY\_ANNOTATIONS\)_ * **DELETE\_FAMILY\_ANNOTATIONS** _\(implies: VIEW\_FAMILIES, VIEW\_FAMILY\_ANNOTATIONS, WRITE\_FAMILY\_ANNOTATIONS\)_ {% endtab %} + +{% tab title="COHORTS" %} +* **VIEW\_COHORTS** +* **WRITE\_COHORTS** _\(implies: VIEW\_COHORTS\)_ +* **DELETE\_COHORTS** _\(implies: VIEW\_COHORTS, WRITE\_COHORTS\)_ +* **VIEW\_COHORT\_ANNOTATIONS** _\(implies: VIEW\_COHORTS\)_ +* **WRITE\_COHORT\_ANNOTATIONS** _\(implies: VIEW\_COHORTS, VIEW\_COHORT\_ANNOTATIONS\)_ +* **DELETE\_COHORT\_ANNOTATIONS** _\(implies: VIEW\_COHORTS, VIEW\_COHORT\_ANNOTATIONS, WRITE\_COHORT\_ANNOTATIONS\)_ +{% endtab %} + +{% tab title="PANELS" %} +* **VIEW\_PANELS** +* **WRITE\_PANELS** _\(implies: VIEW\_PANELS\)_ +* **DELETE\_PANELS** _\(implies: VIEW\_PANELS, WRITE\_PANELS\)_ +{% endtab %} + +{% tab title="CLINICAL" %} +* **VIEW\_CLINICAL\_ANALYSIS** +* **WRITE\_CLINICAL\_ANALYSIS** _\(implies: VIEW\_CLINICAL\_ANALYSIS\)_ +* **DELETE\_CLINICAL\_ANALYSIS** _\(implies: VIEW\_CLINICAL\_ANALYSIS, WRITE\_CLINICAL\_ANALYSIS\)_ +{% endtab %} {% endtabs %} -```text - - -COHORTS - VIEW_COHORTS(Collections.emptyList(), CohortAclEntry.CohortPermissions.VIEW.name(), COHORT), - WRITE_COHORTS(Collections.singletonList(VIEW_COHORTS), CohortAclEntry.CohortPermissions.WRITE.name(), COHORT), - DELETE_COHORTS(Arrays.asList(VIEW_COHORTS, WRITE_COHORTS), CohortAclEntry.CohortPermissions.DELETE.name(), COHORT), - VIEW_COHORT_ANNOTATIONS(Collections.singletonList(VIEW_COHORTS), CohortAclEntry.CohortPermissions.VIEW_ANNOTATIONS.name(), COHORT), - WRITE_COHORT_ANNOTATIONS(Arrays.asList(VIEW_COHORTS, VIEW_COHORT_ANNOTATIONS), - CohortAclEntry.CohortPermissions.WRITE_ANNOTATIONS.name(), COHORT), - DELETE_COHORT_ANNOTATIONS(Arrays.asList(VIEW_COHORTS, VIEW_COHORT_ANNOTATIONS, WRITE_COHORT_ANNOTATIONS), - CohortAclEntry.CohortPermissions.DELETE_ANNOTATIONS.name(), COHORT), - -DISEASE PANELS - VIEW_PANELS(Collections.emptyList(), PanelAclEntry.PanelPermissions.VIEW.name(), DISEASE_PANEL), - WRITE_PANELS(Collections.singletonList(VIEW_PANELS), PanelAclEntry.PanelPermissions.WRITE.name(), DISEASE_PANEL), - DELETE_PANELS(Arrays.asList(VIEW_PANELS, WRITE_PANELS), PanelAclEntry.PanelPermissions.DELETE.name(), DISEASE_PANEL), - -CLINICAL ANALYSIS - VIEW_CLINICAL_ANALYSIS(Collections.emptyList(), ClinicalAnalysisAclEntry.ClinicalAnalysisPermissions.VIEW.name(), - CLINICAL_ANALYSIS), - WRITE_CLINICAL_ANALYSIS(Collections.singletonList(VIEW_CLINICAL_ANALYSIS), - ClinicalAnalysisAclEntry.ClinicalAnalysisPermissions.WRITE.name(), CLINICAL_ANALYSIS), - DELETE_CLINICAL_ANALYSIS(Arrays.asList(VIEW_CLINICAL_ANALYSIS, WRITE_CLINICAL_ANALYSIS), - ClinicalAnalysisAclEntry.ClinicalAnalysisPermissions.DELETE.name(), CLINICAL_ANALYSIS); -``` +## Templates + +OpenCGA Catalog implements two sets of predefined roles to assign some generic Study permissions to users/groups: + +* **analyst**: The member \(user or group\) will be given full READ and WRITE \(not DELETE\) permissions for all the entries related to the study. These users will be able to view and do modifications on all the data that is related to the study. +* **view\_only**: The member \(user or group\) will be given full READ permissions. ## Special cases @@ -90,15 +103,11 @@ Permissions can be given to any concrete entity \(file, sample, cohort...\) to d ### Files -File entry might be of type file or folder. Permissions assigned in folders are propagated to all the children \(files and folders\) recursively. - - All permissions that might have had files and folders under the folder being given permissions will be modified according to the action being performed in the parent folder. In other words, if we are setting new permissions for the folder, any possible permissions the files and folders under the parent folder might have had will be completely replaced by the parent folder's permissions. However, if the action being performed is just adding a new permission to the parent folder, children files and folders will keep their old permissions plus the new one\(s\) added to the parent folder. +File entry might be of type file or folder \(directory\). Permissions assigned in folders are propagated to all the children \(files and folders\) recursively. ### Individuals/Samples -Individuals are really strong related with samples. So every time permissions are given to an individual, the same permissions can be applied to all the related samples if the user sets the 'propagate' field to True, and vice-versa. - -## Use cases +Individuals are really strongly related with samples. So every time permissions are given to an individual, the same permissions can be applied to all the related samples if the user sets the 'propagate' field to True, and vice-versa. ### Give public access to non-existing users From 582144149f7588f8aea201e928a6a5a95567700f Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 27 May 2021 13:03:35 +0200 Subject: [PATCH 344/412] catalog: first draft to improve migrations --- .../opencga/catalog/db/DBAdaptorFactory.java | 2 + .../catalog/db/api/MigrationDBAdaptor.java | 80 ++++++++ .../db/mongodb/MigrationMongoDBAdaptor.java | 103 ++++++++++ .../db/mongodb/MongoDBAdaptorFactory.java | 13 ++ .../converters/MigrationConverter.java | 23 +++ .../CatalogAuthorizationException.java | 2 +- .../catalog/managers/CatalogManager.java | 4 + .../opencga/catalog/migration/Migration.java | 37 ++++ .../catalog/migration/MigrationException.java | 16 ++ .../catalog/migration/MigrationManager.java | 182 ++++++++++++++++++ .../catalog/migration/MigrationRun.java | 78 ++++++++ .../catalog/migration/MigrationTool.java | 32 +++ .../catalog/migration/Opencga20003.java | 11 ++ 13 files changed, 582 insertions(+), 1 deletion(-) create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/MigrationConverter.java create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationException.java create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationRun.java create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/DBAdaptorFactory.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/DBAdaptorFactory.java index 4c70ee2b28b..40e708d132b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/DBAdaptorFactory.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/DBAdaptorFactory.java @@ -64,6 +64,8 @@ public interface DBAdaptorFactory { void close(); + MigrationDBAdaptor getMigrationDBAdaptor(); + MetaDBAdaptor getCatalogMetaDBAdaptor(); UserDBAdaptor getCatalogUserDBAdaptor(); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java new file mode 100644 index 00000000000..4afd2f78e4f --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java @@ -0,0 +1,80 @@ +package org.opencb.opencga.catalog.db.api; + +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryParam; +import org.opencb.opencga.catalog.exceptions.CatalogDBException; +import org.opencb.opencga.catalog.migration.MigrationRun; +import org.opencb.opencga.core.response.OpenCGAResult; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.opencb.commons.datastore.core.QueryParam.Type.INTEGER; +import static org.opencb.commons.datastore.core.QueryParam.Type.STRING; + +public interface MigrationDBAdaptor { + + enum QueryParams implements QueryParam { + ID("id", STRING, ""), + DATE("date", QueryParam.Type.DATE, ""), + PATCH("patch", INTEGER, ""), + STATUS("status", STRING, ""); + + private static Map map = new HashMap<>(); + static { + for (QueryParams params : QueryParams.values()) { + map.put(params.key(), params); + } + } + + private final String key; + private Type type; + private String description; + + QueryParams(String key, Type type, String description) { + this.key = key; + this.type = type; + this.description = description; + } + + @Override + public String key() { + return key; + } + + @Override + public Type type() { + return type; + } + + @Override + public String description() { + return description; + } + + public static Map getMap() { + return map; + } + + public static QueryParams getParam(String key) { + return map.get(key); + } + } + + void insert(MigrationRun migrationRun) throws CatalogDBException; + + OpenCGAResult get(Query query) throws CatalogDBException; + + OpenCGAResult get(List migrationRunIds) throws CatalogDBException; + + default OpenCGAResult get(String migrationRunId) throws CatalogDBException{ + return get(Collections.singletonList(migrationRunId)); + } + + void update(String migrationRunId, MigrationRun migrationRun) throws CatalogDBException; + + void delete(String migrationRunId) throws CatalogDBException; + +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java new file mode 100644 index 00000000000..b3215903f09 --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java @@ -0,0 +1,103 @@ +package org.opencb.opencga.catalog.db.mongodb; + +import com.mongodb.client.model.Filters; +import org.apache.commons.lang.NotImplementedException; +import org.bson.Document; +import org.bson.conversions.Bson; +import org.opencb.commons.datastore.core.DataResult; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.datastore.mongodb.MongoDBCollection; +import org.opencb.opencga.catalog.db.api.MigrationDBAdaptor; +import org.opencb.opencga.catalog.db.mongodb.converters.MigrationConverter; +import org.opencb.opencga.catalog.exceptions.CatalogDBException; +import org.opencb.opencga.catalog.migration.MigrationRun; +import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class MigrationMongoDBAdaptor extends MongoDBAdaptor implements MigrationDBAdaptor { + + private final MongoDBCollection migrationCollection; + private final MigrationConverter migrationConverter; + + public MigrationMongoDBAdaptor(MongoDBCollection migrationCollection, Configuration configuration, + MongoDBAdaptorFactory dbAdaptorFactory) { + super(configuration, LoggerFactory.getLogger(MigrationMongoDBAdaptor.class)); + this.dbAdaptorFactory = dbAdaptorFactory; + this.migrationCollection = migrationCollection; + this.migrationConverter = new MigrationConverter(); + } + + @Override + public void insert(MigrationRun migrationRun) throws CatalogDBException { + Document migrationDocument = migrationConverter.convertToStorageType(migrationRun); + DataResult insert = migrationCollection.insert(migrationDocument, QueryOptions.empty()); + if (insert.getNumInserted() == 0) { + throw new CatalogDBException("Could not insert MigrationRun"); + } + } + + @Override + public OpenCGAResult get(Query query) throws CatalogDBException { + Bson bsonQuery = parseQuery(query); + return new OpenCGAResult<>(migrationCollection.find(bsonQuery, migrationConverter, QueryOptions.empty())); + } + + @Override + public OpenCGAResult get(List migrationRunIds) throws CatalogDBException { + Query query = new Query(QueryParams.ID.key(), migrationRunIds); + return get(query); + } + + @Override + public void update(String migrationRunId, MigrationRun migrationRun) throws CatalogDBException { + throw new NotImplementedException("TO DO"); + } + + @Override + public void delete(String migrationRunId) throws CatalogDBException { + throw new NotImplementedException("TO DO"); + } + + private Bson parseQuery(Query query) throws CatalogDBException { + List andBsonList = new ArrayList<>(); + Query queryCopy = new Query(query); + + for (Map.Entry entry : queryCopy.entrySet()) { + String key = entry.getKey().split("\\.")[0]; + MigrationDBAdaptor.QueryParams queryParam = MigrationDBAdaptor.QueryParams.getParam(entry.getKey()) != null + ? MigrationDBAdaptor.QueryParams.getParam(entry.getKey()) + : MigrationDBAdaptor.QueryParams.getParam(key); + if (queryParam == null) { + throw new CatalogDBException("Unexpected parameter " + entry.getKey() + ". The parameter does not exist or cannot be " + + "queried for."); + } + try { + switch (queryParam) { + case ID: + case DATE: + case PATCH: + case STATUS: + addAutoOrQuery(queryParam.key(), queryParam.key(), queryCopy, queryParam.type(), andBsonList); + break; + default: + throw new CatalogDBException("Cannot query by parameter " + queryParam.key()); + } + } catch (Exception e) { + throw new CatalogDBException(e); + } + } + + if (andBsonList.size() > 0) { + return Filters.and(andBsonList); + } else { + return new Document(); + } + } + +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java index 81a97e4fefe..a819c46d67b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java @@ -27,6 +27,7 @@ import org.opencb.commons.datastore.mongodb.MongoDataStore; import org.opencb.commons.datastore.mongodb.MongoDataStoreManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; +import org.opencb.opencga.catalog.db.api.MigrationDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.core.config.Configuration; @@ -66,6 +67,8 @@ public class MongoDBAdaptorFactory implements DBAdaptorFactory { DELETED_FAMILY_COLLECTION, DELETED_CLINICAL_ANALYSIS_COLLECTION, DELETED_INTERPRETATION_COLLECTION, + + MIGRATION_COLLECTION, METADATA_COLLECTION, AUDIT_COLLECTION ); @@ -95,6 +98,7 @@ public class MongoDBAdaptorFactory implements DBAdaptorFactory { public static final String DELETED_INTERPRETATION_COLLECTION = "deleted_interpretation"; public static final String METADATA_COLLECTION = "metadata"; + public static final String MIGRATION_COLLECTION = "migration"; public static final String AUDIT_COLLECTION = "audit"; static final String METADATA_OBJECT_ID = "METADATA"; private final MongoDataStoreManager mongoManager; @@ -118,6 +122,7 @@ public class MongoDBAdaptorFactory implements DBAdaptorFactory { private InterpretationMongoDBAdaptor interpretationDBAdaptor; private AuditMongoDBAdaptor auditDBAdaptor; private MetaMongoDBAdaptor metaDBAdaptor; + private MigrationMongoDBAdaptor migrationDBAdaptor; private Logger logger; @@ -274,6 +279,11 @@ public InterpretationMongoDBAdaptor getInterpretationDBAdaptor() { return interpretationDBAdaptor; } + @Override + public MigrationDBAdaptor getMigrationDBAdaptor() { + return migrationDBAdaptor; + } + @Override public Map getMongoDBCollectionMap() { return collections; @@ -295,6 +305,7 @@ private void connect(Configuration catalogConfiguration) throws CatalogDBExcepti } metaCollection = mongoDataStore.getCollection(METADATA_COLLECTION); + MongoDBCollection migrationCollection = mongoDataStore.getCollection(MIGRATION_COLLECTION); MongoDBCollection userCollection = mongoDataStore.getCollection(USER_COLLECTION); MongoDBCollection studyCollection = mongoDataStore.getCollection(STUDY_COLLECTION); @@ -324,6 +335,7 @@ private void connect(Configuration catalogConfiguration) throws CatalogDBExcepti collections = new HashMap<>(); collections.put(METADATA_COLLECTION, metaCollection); + collections.put(MIGRATION_COLLECTION, migrationCollection); collections.put(USER_COLLECTION, userCollection); collections.put(STUDY_COLLECTION, studyCollection); @@ -366,6 +378,7 @@ private void connect(Configuration catalogConfiguration) throws CatalogDBExcepti catalogConfiguration, this); metaDBAdaptor = new MetaMongoDBAdaptor(metaCollection, catalogConfiguration, this); auditDBAdaptor = new AuditMongoDBAdaptor(auditCollection, catalogConfiguration); + migrationDBAdaptor = new MigrationMongoDBAdaptor(migrationCollection, catalogConfiguration, this); } } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/MigrationConverter.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/MigrationConverter.java new file mode 100644 index 00000000000..ea25a4dd106 --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/MigrationConverter.java @@ -0,0 +1,23 @@ +package org.opencb.opencga.catalog.db.mongodb.converters; + +import org.bson.Document; +import org.opencb.opencga.catalog.migration.MigrationRun; + +public class MigrationConverter extends OpenCgaMongoConverter { + + public MigrationConverter() { + super(MigrationRun.class); + } + + @Override + public MigrationRun convertToDataModelType(Document document) { + return super.convertToDataModelType(document); + } + + @Override + public Document convertToStorageType(MigrationRun object) { + return super.convertToStorageType(object); + } + + +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/exceptions/CatalogAuthorizationException.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/exceptions/CatalogAuthorizationException.java index 487c5311056..ffa1a363813 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/exceptions/CatalogAuthorizationException.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/exceptions/CatalogAuthorizationException.java @@ -49,7 +49,7 @@ public static CatalogAuthorizationException cantExecute(String userId, String re } public static CatalogAuthorizationException adminOnlySupportedOperation() { - return new CatalogAuthorizationException("Operation only support for 'admin' user"); + return new CatalogAuthorizationException("Operation only supported for 'admin' user"); } @Deprecated diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java index 879c49947eb..627987dd56c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java @@ -32,6 +32,7 @@ import org.opencb.opencga.catalog.exceptions.CatalogIOException; import org.opencb.opencga.catalog.io.CatalogIOManager; import org.opencb.opencga.catalog.io.IOManagerFactory; +import org.opencb.opencga.catalog.migration.MigrationManager; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.config.Admin; @@ -77,6 +78,8 @@ public class CatalogManager implements AutoCloseable { private AuditManager auditManager; private AuthorizationManager authorizationManager; + private MigrationManager migrationManager; + private Configuration configuration; public CatalogManager(Configuration configuration) throws CatalogException { @@ -100,6 +103,7 @@ private void configureManagers(Configuration configuration) throws CatalogExcept this.initializeAdmin(configuration); authorizationManager = new CatalogAuthorizationManager(this.catalogDBAdaptorFactory, configuration); auditManager = new AuditManager(authorizationManager, this, this.catalogDBAdaptorFactory, configuration); + migrationManager = new MigrationManager(this, catalogDBAdaptorFactory.getMigrationDBAdaptor()); adminManager = new AdminManager(authorizationManager, auditManager, this, catalogDBAdaptorFactory, catalogIOManager, configuration); userManager = new UserManager(authorizationManager, auditManager, this, catalogDBAdaptorFactory, catalogIOManager, configuration); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java new file mode 100644 index 00000000000..ca4dd9319cf --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java @@ -0,0 +1,37 @@ +package org.opencb.opencga.catalog.migration; + +public @interface Migration { + + String id(); + + String description() default ""; + + /** + * @return OpenCGA Version + */ + String version(); + + MigrationDomain domain() default MigrationDomain.CATALOG; + + MigrationLanguage language() default MigrationLanguage.JAVA; + + String[] requires() default {}; + + int patch() default 1; + + /** + * + * @return whether the migration can be run as is or requires additional parameters that need to be passed by the administrator. + */ + boolean manual() default false; + + enum MigrationDomain { + CATALOG, + STORAGE + } + + enum MigrationLanguage { + JAVA, + JAVASCRIPT + } +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationException.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationException.java new file mode 100644 index 00000000000..e63dd7f2e96 --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationException.java @@ -0,0 +1,16 @@ +package org.opencb.opencga.catalog.migration; + +public class MigrationException extends Exception { + + public MigrationException(String message) { + super(message); + } + + public MigrationException(String message, Throwable cause) { + super(message, cause); + } + + public MigrationException(Throwable cause) { + super(cause); + } +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java new file mode 100644 index 00000000000..8d07b02010c --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java @@ -0,0 +1,182 @@ +package org.opencb.opencga.catalog.migration; + +import org.apache.commons.lang3.StringUtils; +import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.opencga.catalog.db.api.MigrationDBAdaptor; +import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; +import org.opencb.opencga.catalog.exceptions.CatalogDBException; +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.reflections.Reflections; +import org.reflections.scanners.SubTypesScanner; +import org.reflections.scanners.TypeAnnotationsScanner; +import org.reflections.util.ConfigurationBuilder; + +import java.util.*; + +public class MigrationManager { + + private CatalogManager catalogManager; + private MigrationDBAdaptor migrationDBAdaptor; + + public MigrationManager(CatalogManager catalogManager, MigrationDBAdaptor migrationDBAdaptor) { + this.catalogManager = catalogManager; + this.migrationDBAdaptor = migrationDBAdaptor; + } + + public void getMigrationsStatus(String token) throws CatalogException { + validateAdmin(token); + } + + public void updateMigrationsStatus(String token) throws CatalogException { + validateAdmin(token); + } + + public void runMigration(String version, Set domainsFilter, + Set languageFilter, String token) throws CatalogException { + + } + + public void runMigration(String version, Set domainsFilter, + Set languageFilter, ObjectMap params, String token) throws CatalogException { + validateAdmin(token); + + if (domainsFilter == null || domainsFilter.isEmpty()) { + domainsFilter = EnumSet.allOf(Migration.MigrationDomain.class); + } + if (languageFilter == null || languageFilter.isEmpty()) { + languageFilter = EnumSet.allOf(Migration.MigrationLanguage.class); + } + + // Get runnable migrations + List> runnableMigrations = getRunnableMigrations(version, domainsFilter, languageFilter); + + while (!runnableMigrations.isEmpty()) { + for (Class runnableMigration : runnableMigrations) { + run(runnableMigration, params); + } + + // Refresh list of runnable migrations + runnableMigrations = getRunnableMigrations(version, domainsFilter, languageFilter); + } + + // Check that there are no pending migrations + for (Class migration : migrations) { + // check domain + if (!domainsFilter.contains(getMigrationAnnotation(migration).domain())) { + continue; + } + + // Check status and patch + MigrationRun migrationRun = getMigrationRun(migration); + if (migrationRun == null) { + // Cry + } + if (!migrationRun.getStatus().equals(MigrationRun.MigrationStatus.DONE)) { + // Cry + } + if (getMigrationAnnotation(migration).patch() != migrationRun.getPatch()) { + // Cry + } + } + } + + private void validateAdmin(String token) throws CatalogException { + String userId = catalogManager.getUserManager().getUserId(token); + if (!catalogManager.getAuthorizationManager().checkIsAdmin(userId)) { + throw CatalogAuthorizationException.adminOnlySupportedOperation(); + } + } + + private Set> getMigrations() { + Reflections reflections = new Reflections(new ConfigurationBuilder() + .setScanners( + new SubTypesScanner(), + new TypeAnnotationsScanner().filterResultsBy(s -> StringUtils.equals(s, Migration.class.getName())) + ) + .filterInputsBy(input -> input != null && input.endsWith(".class")) + ); + + return reflections.getSubTypesOf(MigrationTool.class); + } + + private List> getRunnableMigrations(String version, Set domainFilter, + Set languageFilter) throws CatalogDBException { + Set> allMigrations = getMigrations(); + Map> migrationMap = new HashMap<>(); + List> filteredMigrations = new LinkedList<>(); + + for (Class migration : allMigrations) { + Migration annotation = migration.getAnnotation(Migration.class); + migrationMap.put(annotation.id(), migration); + + if (StringUtils.isNotEmpty(version) && !annotation.version().equals(version)) { + continue; + } + if (domainFilter != null && !domainFilter.isEmpty() && !domainFilter.contains(annotation.domain())) { + continue; + } + if (languageFilter != null && !languageFilter.isEmpty() && !languageFilter.contains(annotation.language())) { + continue; + } + filteredMigrations.add(migration); + } + + // Check if it has been executed + Iterator> iterator = filteredMigrations.iterator(); + while (iterator.hasNext()) { + Class filteredMigration = iterator.next(); + Migration annotation = filteredMigration.getAnnotation(Migration.class); + OpenCGAResult migrationResult = migrationDBAdaptor.get(annotation.id()); + if (migrationResult.getNumResults() == 1) { + if (annotation.patch() == migrationResult.first().getPatch() + && migrationResult.first().getStatus() == MigrationRun.MigrationStatus.DONE) { + iterator.remove(); + continue; + } + } + + // Check dependencies + if (annotation.requires().length > 0) { + migrationResult = migrationDBAdaptor.get(Arrays.asList(annotation.requires())); + Map + } + + + } + // TODO + // Get those that: + // Match type filter + // Has not been executed yet + // Have dependencies successfully executed + return Collections.emptyList(); + } + + private void run(Class runnableMigration) throws MigrationException { + Migration annotation = runnableMigration.getAnnotation(Migration.class); + if (annotation == null) { + throw new MigrationException("Class " + runnableMigration + " does not have the required java annotation @" + + Migration.class.getSimpleName()); + } + + MigrationTool migrationTool; + try { + migrationTool = runnableMigration.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new MigrationException("Can't instantiate class " + runnableMigration + " from migration '" + annotation.id() + "'", e); + } + + migrationTool.setup(catalogManager); + migrationTool. + } + + private MigrationRun getMigrationRun(Class migration) { + return null; + } + + private Migration getMigrationAnnotation(Class migration) { + return migration.getAnnotation(Migration.class); + } + +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationRun.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationRun.java new file mode 100644 index 00000000000..477f235c411 --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationRun.java @@ -0,0 +1,78 @@ +package org.opencb.opencga.catalog.migration; + +import java.util.Date; + +public class MigrationRun { + + private String id; + + private Date date; + + private int patch; + + private MigrationStatus status; + + enum MigrationStatus { + DONE, +// PENDING, +// RUNNING, + ERROR + } + + public MigrationRun() { + } + + public MigrationRun(Date date, String id, int patch, MigrationStatus status) { + this.date = date; + this.id = id; + this.patch = patch; + this.status = status; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("MigrationRun{"); + sb.append("date=").append(date); + sb.append(", id='").append(id).append('\''); + sb.append(", patch=").append(patch); + sb.append(", status=").append(status); + sb.append('}'); + return sb.toString(); + } + + public Date getDate() { + return date; + } + + public MigrationRun setDate(Date date) { + this.date = date; + return this; + } + + public String id() { + return id; + } + + public MigrationRun setId(String id) { + this.id = id; + return this; + } + + public int getPatch() { + return patch; + } + + public MigrationRun setPatch(int patch) { + this.patch = patch; + return this; + } + + public MigrationStatus getStatus() { + return status; + } + + public MigrationRun setStatus(MigrationStatus status) { + this.status = status; + return this; + } +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java new file mode 100644 index 00000000000..7e3abb2fc95 --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java @@ -0,0 +1,32 @@ +package org.opencb.opencga.catalog.migration; + +import org.opencb.opencga.catalog.managers.CatalogManager; + +public abstract class MigrationTool { + + protected CatalogManager catalogManager; + + public MigrationTool() { + } + + public final String getId() { + return ""; + } + + public final void setup(CatalogManager catalogManager) { + this.catalogManager = catalogManager; + } + + public final void execute() throws MigrationException { + try { + run(); + } catch (MigrationException e) { + throw e; + } catch (Exception e) { + throw new MigrationException("Error running migration '" + getId() + "'"); + } + } + + protected abstract void run() throws MigrationException; + +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java new file mode 100644 index 00000000000..11bad78762a --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java @@ -0,0 +1,11 @@ +package org.opencb.opencga.catalog.migration; + +@Migration(id ="opencga-2.0.3-catalog-java", version = "2.0.3", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA) +public class Opencga20003 extends MigrationTool { + + @Override + protected void run() throws MigrationException { + + } +} From 42a1b0c9ea88747939fe6204545122d3ec97374e Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 27 May 2021 14:05:27 +0100 Subject: [PATCH 345/412] client: add content to admin notebook #1716 --- .../admin-training/pyopencga_admin.ipynb | 345 ++++++++++++++++-- 1 file changed, 317 insertions(+), 28 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb index 9bcba24118f..65cbcaa181c 100644 --- a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb +++ b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb @@ -8,14 +8,16 @@ "source": [ "# Overview\n", "------\n", - "This notebook is intended to ....\n", + "This notebook is intended to provide guidance on performing advanced common administrator actios required for maintaining a OpenCGA installation, from granting permission to other users to updating the metadata for samples or individuals in the database.\n", "\n", - "For guidance on how to loggin and get started with *opencga* you can refer to : [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", + "It is highly recommended to check the documentation about [Sharing and Permissions](https://app.gitbook.com/@opencb/s/opencga/~/drafts/-Magktiifb08PPiPnoYk/manual/data-management/sharing-and-permissions) in OpenCGA before trying to run this notebook.\n", "\n", - "A good first step when start working with OpenCGA is to explore **Catalog**, which holds: information about our user, the projects and studies our user has permission to access and the clinical data from the studies. For guidance you can refer to : [pyopencga_catalog.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", + "**[NOTES]** \n", + "- For guidance on how to loggin and get started with *opencga* you can refer to : [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", "\n", - "**[NOTE]** The server methods used by *pyopencga* client are defined in the following swagger URL:\n", - "- https://ws.opencb.org/opencga-prod/webservices/\n" + "- A good first step when start working with OpenCGA is to explore **Catalog** the OpenCGA component which holds information about our user, the projects and studies our user has permission to access and the clinical data from the studies. For guidance you can refer to : [pyopencga_catalog.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", + "\n", + "- The server methods used by *pyopencga* client are defined in the following swagger URL: https://ws.opencb.org/opencga-prod/webservices/\n" ] }, { @@ -48,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -64,30 +66,59 @@ "\n", "## Step 2. OpenCGA host\n", "host = 'https://ws.opencb.org/opencga-prod'\n", - "# host = 'http://localhost:1234/opencga'\n", - "\n", - "## Step 3. User credentials\n", - "user = 'demouser'\n", - "passwd = 'demouser' ## you can skip this, see below.\n", - "####################################\n", "\n", - "## Step 4. Create the ClientConfiguration dict\n", + "## Step 3. Create the ClientConfiguration dict\n", "config_dict = {'rest': {\n", " 'host': host \n", " }\n", " }\n", "\n", - "## Step 5. Create the ClientConfiguration and OpenCGA client\n", + "## Step 4. Create the ClientConfiguration and OpenCGA client\n", "config = ClientConfiguration(config_dict)\n", - "oc = OpencgaClient(config)\n", + "oc = OpencgaClient(config)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the purpose of the training, we will work with an user that belongs to the @admins group. This means the user has admin priviledges. \n", "\n", + "__[NOTE]__ Working with an admin user is required for follow up with the queries used in this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "## Step 5. Define admin user credentials\n", + "admin_user = 'demo-admin'\n", + "password = 'quBocgIvQ2r83SG'" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWFkbWluIiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjExOTAwNywiZXhwIjoxNjIyMTIyNjA3fQ.pc5XF6cAR75zq2945rGQfYHRGBwfuL5tL34YjRYDELI well done!\n" + ] + } + ], + "source": [ "## Step 6. Login to OpenCGA using the OpenCGA client \n", "# Pass the credentials to the client\n", "# (here we put only the user in order to be asked for the password interactively)\n", - "# oc.login(user)\n", + "#oc.login(admin_user)\n", "\n", "# or you can pass the user and passwd\n", - "oc.login(user, passwd)\n", + "oc.login(admin_user, password)\n", "\n", "print('Logged succesfuly to {}, your token is: {} well done!'.format(host, oc.token))" ] @@ -98,25 +129,257 @@ "source": [ "## Setup OpenCGA Variables\n", "\n", - "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. " + "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. \n", + "\n", + "- For this training we have created a test project and study. As an administrator, we assume that you're familiar with the concept of the `fqn`. If not, please check the documentation [here]().\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "## Define the OpenCGA variables to query data\n", - "study = 'training:admin'\n", + "## Define the study we will work with\n", + "study = 'demo@training:admin'\n", "\n", - "## You can define list using string with commas\n", - "genes='BRCA2'\n", + "## Define the user ids from some NOT admin demo users \n", + "user1 = 'trainee1'\n", + "user2 = 'trainee2'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Permission Management\n", + "------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In OpenCGA all the permissions are establish at the study level. \n", "\n", - "## or you can use python lists\n", - "transcripts=['ENST00000530893']\n", + "All the studys come intrinsically with two administrative groups: `@admins` and `@members`.\n", + "All the users added to a new study belong to the `@members` group. This is useful for keeping track of the users that have access to that specific study. However, `@members` doesn't have any permission defined by default.\n", "\n", - "RESULT_SEPARATOR='\\n'" + "Users belonging to the group `@admins`, on the other hand, have administrator priviledges. The admins can add users to an study and grant them permissions. However, an admin can't provide admin priviledges to other users (only the user `owner` of the study is able to do so)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1. Add/remove users from a Study\n", + "\n", + "## Add users\n", + "\n", + "First, we're going to add the users `trainee1` and `trainee2` to the study. Internally, this means that we are adding those users to the `@members` group of the study." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Add users to study\n", + "oc.studies.update_users(study=study, group='members', data={\"users\": [\"trainee1\",\"trainee2\"]})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Remove users\n", + "\n", + "Inversely, we can remove the users `trainee1` and `trainee2` from the study. Internally, this means that we are removing those users from the `@members` group of the study." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Delete users from study\n", + "oc.studies.update_users(study=study, group='members', action='REMOVE', data={\"users\": [\"trainee1\",\"trainee2\"]})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check users in the Study\n", + "\n", + "In any case, we can always check the current status of the `@members` group i.e check which users has access to the study, as well that of any other group defined for the study.\n", + "\n", + "### Hands-on exercise: \n", + "Run the next cell after adding users `trainee1` and `trainee2`. Then run remove them from the group `@members` and run it again. \n", + "\n", + "Do you notice any difference in the output?" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Groups in Study demo@training:admin\n", + "----------------------------------------\n", + "#id\tuserIds\n", + "@members\tpfurio,wspooner,demo-admin,demo,jcoll,llopez,imedina\n", + "@admins\tpfurio,wspooner,demo-admin,jcoll,llopez,imedina\n" + ] + } + ], + "source": [ + "## Check Study groups\n", + "groups = oc.studies.groups(study=study)\n", + "groups.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Asign samples to individuals\n", + "-------\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenCGA Catalog allows you to create samples entities. Then, you might need to create an individual entity associated with the sample.\n", + "\n", + "**[Important Note:]** When VCFs are ingested into OpenCGA, the pipeline automatically recognises the header of the VCF. If the name of the sample is present, it automatically creates the samples contained in the VCFs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Create samples\n", + "\n", + "First, let's create 3 samples: `sample1`, `sample2.1` and `sample2.2`. The most straight-forward way to create samples is using a loop, as showed in the next cell:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Info about sample \n", + "--------------------------------------------------------------------------------------\n", + "#id\tcollection\tdescription\tsomatic\n", + "sample1\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tgerminal sample\tFalse\n", + "\n", + "\n", + "Info about sample \n", + "--------------------------------------------------------------------------------------\n", + "#id\tcollection\tdescription\tsomatic\n", + "sample2.1\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tgerminal sample\tFalse\n", + "\n", + "\n", + "Info about sample \n", + "--------------------------------------------------------------------------------------\n", + "#id\tcollection\tdescription\tsomatic\n", + "sample2.2\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tgerminal sample\tFalse\n", + "\n", + "\n" + ] + } + ], + "source": [ + "## Create 3 samples\n", + "sample_ids = ['sample1', 'sample2.1', 'sample2.2']\n", + "\n", + "for sample in sample_ids:\n", + " sample_data = {\n", + " \"id\": sample,\n", + " \"description\": \"germinal sample\",\n", + " \"processing\": {\n", + " \"preparationMethod\": \"Illumina\",\n", + " \"extractionMethod\": \"Parafin Embedded\"\n", + " },\n", + " \"collection\": {\n", + " \"tissue\": \"skin\",\n", + " \"organ\": \"skin\",\n", + " \"method\": \"biopsy\"\n", + " },\n", + " \"somatic\":'false'\n", + " }\n", + "\n", + " oc.samples.create(study=study, data=sample_data)\n", + " sample = oc.samples.search(study=study, id=sample)\n", + " sample.print_results(fields='id,collection,description,somatic', metadata=False, title='Info about sample {}'.format(sample))\n", + " print('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Uncomment this to delete the samples\n", + "oc.samples.delete(study=study, samples='sample1,sample2.1,sample2.2')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Create individuals associated with the samples\n", + "\n", + "Remember that OpenCGA `individual` data model allows to have multiple samples assigned to the same individual. A typical use case can be found in cancer genetic screen, where usually two samples are taken from the same individual: one from the tumour (somatic sample), and one germinal.\n", + "\n", + "Bearing that in mind, we can create some individual entities in the database. In this case, let's assume that `sample1` corresponds to `individual1`, whilst `sample2.1` and `sample2.2` correspond to `individual2`." ] }, { @@ -124,7 +387,33 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "## Create Individuals\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Define phenotypes or diseases for individuals\n", + "------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Define, add, edit and remove variable sets\n", + "----------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Use Cases\n", + "------" + ] }, { "cell_type": "code", @@ -155,4 +444,4 @@ }, "nbformat": 4, "nbformat_minor": 1 -} +} \ No newline at end of file From ffd642e478950ea364884b0a27ceb10e971eecb7 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 27 May 2021 16:02:04 +0100 Subject: [PATCH 346/412] client: add more content to admin notebook #1716 --- .../admin-training/pyopencga_admin.ipynb | 160 ++++++++++++++---- 1 file changed, 124 insertions(+), 36 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb index 65cbcaa181c..c05d9432720 100644 --- a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb +++ b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb @@ -50,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 172, "metadata": {}, "outputs": [], "source": [ @@ -59,7 +59,7 @@ "from pyopencga.opencga_client import OpencgaClient # import client module\n", "from pprint import pprint\n", "from IPython.display import JSON\n", - "# import json\n", + "import json\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import datetime\n", @@ -89,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 52, "metadata": {}, "outputs": [], "source": [ @@ -100,14 +100,14 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 173, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWFkbWluIiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjExOTAwNywiZXhwIjoxNjIyMTIyNjA3fQ.pc5XF6cAR75zq2945rGQfYHRGBwfuL5tL34YjRYDELI well done!\n" + "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWFkbWluIiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjEyNzAxNCwiZXhwIjoxNjIyMTMwNjE0fQ.bxglbsexgQ0IC0CMVjonPzN47IEh0AyRvSG8Iqp6UW0 well done!\n" ] } ], @@ -136,7 +136,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 174, "metadata": {}, "outputs": [], "source": [ @@ -181,16 +181,16 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 175, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 14, + "execution_count": 175, "metadata": {}, "output_type": "execute_result" } @@ -290,34 +290,34 @@ "source": [ "## 1. Create samples\n", "\n", - "First, let's create 3 samples: `sample1`, `sample2.1` and `sample2.2`. The most straight-forward way to create samples is using a loop, as showed in the next cell:" + "First, let's create 3 samples: `sample1`, `sample2-germinal` and `sample2-somatic`. The most straight-forward way to create samples is using a loop, as showed in the next cell:" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 207, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Info about sample \n", - "--------------------------------------------------------------------------------------\n", - "#id\tcollection\tdescription\tsomatic\n", - "sample1\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tgerminal sample\tFalse\n", + "Info about sample sample1\n", + "------------------------------\n", + "#id\tcollection\tsomatic\n", + "sample1\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tFalse\n", "\n", "\n", - "Info about sample \n", - "--------------------------------------------------------------------------------------\n", - "#id\tcollection\tdescription\tsomatic\n", - "sample2.1\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tgerminal sample\tFalse\n", + "Info about sample sample2-germinal\n", + "---------------------------------------\n", + "#id\tcollection\tsomatic\n", + "sample2-germinal\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tFalse\n", "\n", "\n", - "Info about sample \n", - "--------------------------------------------------------------------------------------\n", - "#id\tcollection\tdescription\tsomatic\n", - "sample2.2\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tgerminal sample\tFalse\n", + "Info about sample sample2-somatic\n", + "--------------------------------------\n", + "#id\tcollection\tsomatic\n", + "sample2-somatic\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tTrue\n", "\n", "\n" ] @@ -325,9 +325,13 @@ ], "source": [ "## Create 3 samples\n", - "sample_ids = ['sample1', 'sample2.1', 'sample2.2']\n", + "sample_ids = ['sample1', 'sample2-germinal', 'sample2-somatic']\n", "\n", "for sample in sample_ids:\n", + " if 'somatic' in sample:\n", + " somatic=True\n", + " else:\n", + " somatic=False\n", " sample_data = {\n", " \"id\": sample,\n", " \"description\": \"germinal sample\",\n", @@ -340,35 +344,35 @@ " \"organ\": \"skin\",\n", " \"method\": \"biopsy\"\n", " },\n", - " \"somatic\":'false'\n", + " \"somatic\": somatic\n", " }\n", "\n", " oc.samples.create(study=study, data=sample_data)\n", - " sample = oc.samples.search(study=study, id=sample)\n", - " sample.print_results(fields='id,collection,description,somatic', metadata=False, title='Info about sample {}'.format(sample))\n", + " samples = oc.samples.search(study=study, id=sample)\n", + " samples.print_results(fields='id,collection,somatic', metadata=False, title='Info about sample {}'.format(sample))\n", " print('\\n')\n", " " ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 206, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 38, + "execution_count": 206, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Uncomment this to delete the samples\n", - "oc.samples.delete(study=study, samples='sample1,sample2.1,sample2.2')" + "oc.samples.delete(study=study, samples=['sample1,sample2-germinal,sample2-somatic'])" ] }, { @@ -379,16 +383,100 @@ "\n", "Remember that OpenCGA `individual` data model allows to have multiple samples assigned to the same individual. A typical use case can be found in cancer genetic screen, where usually two samples are taken from the same individual: one from the tumour (somatic sample), and one germinal.\n", "\n", - "Bearing that in mind, we can create some individual entities in the database. In this case, let's assume that `sample1` corresponds to `individual1`, whilst `sample2.1` and `sample2.2` correspond to `individual2`." + "Bearing that in mind, we can create some individual entities in the database. In this case, let's assume that `sample1` corresponds to `individual1`, whilst `sample2-germinal` and `sample2-somatic` correspond to `individual2`." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 208, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "individual individual1 created succesfully!\n", + "individual individual2 created succesfully!\n" + ] + } + ], + "source": [ + "## Create 2 individuals associated to the samples\n", + "\n", + "individual_ids = ['individual1', 'individual2']\n", + "sample_dict={'individual1':['sample1'], 'individual2':['sample2-germinal', 'sample2-somatic']}\n", + "\n", + "for individual in individual_ids:\n", + " individual_data= {\n", + " \"id\": individual,\n", + " \"name\": individual,\n", + " \"location\": {\n", + " \"postalCode\": \"CB1\",\n", + " },\n", + " \"sex\": \"MALE\",\n", + " \"ethnicity\": \"black\",\n", + " \"parentalConsanguinity\":'true',\n", + " \"population\": {\n", + " \"name\": \"spanish\"\n", + " },\n", + " \"dateOfBirth\": \"19900587\",\n", + " \"karyotypicSex\": \"XY\",\n", + " \"lifeStatus\": \"ALIVE\"}\n", + " oc.individuals.create(study=study, data=individual_data, samples=sample_dict[individual])\n", + " print('individual {} created succesfully!'.format(individual))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 209, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Info about individual individual1\n", + "--------------------------------------\n", + "#id\tname\tsex\tethnicity\tlifeStatus\n", + "individual1\tindividual1\tMALE\tblack\tALIVE\n", + "\n", + "\n", + "Info about individual individual2\n", + "--------------------------------------\n", + "#id\tname\tsex\tethnicity\tlifeStatus\n", + "individual2\tindividual2\tMALE\tblack\tALIVE\n", + "\n", + "\n" + ] + } + ], "source": [ - "## Create Individuals\n" + "for individual in individual_ids:\n", + " individuals = oc.individuals.search(study=study, id=individual)\n", + " individuals.print_results(fields='id,name,sex,ethnicity,lifeStatus', metadata=False, title='Info about individual {}'.format(individual))\n", + " print('\\n')\n", + " JSON(individuals.get_results())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 205, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Uncomment this to delete the samples\n", + "oc.individuals.delete(study=study, individuals='individual1,individual2')" ] }, { @@ -444,4 +532,4 @@ }, "nbformat": 4, "nbformat_minor": 1 -} \ No newline at end of file +} From 07b29a49c14f09f8d381f607aaf2f68c637230ca Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 27 May 2021 17:15:19 +0200 Subject: [PATCH 347/412] catalog: finish first migration implementation --- .../catalog/db/api/MigrationDBAdaptor.java | 8 +- .../db/mongodb/MigrationMongoDBAdaptor.java | 27 +- .../opencga/catalog/migration/Migration.java | 4 +- .../catalog/migration/MigrationManager.java | 277 ++++++++++++------ .../catalog/migration/MigrationRun.java | 115 +++++++- .../catalog/migration/MigrationTool.java | 5 +- .../catalog/migration/Opencga20003.java | 4 +- 7 files changed, 307 insertions(+), 133 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java index 4afd2f78e4f..4865740ed84 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java @@ -63,18 +63,16 @@ public static QueryParams getParam(String key) { } } - void insert(MigrationRun migrationRun) throws CatalogDBException; + void upsert(MigrationRun migrationRun) throws CatalogDBException; OpenCGAResult get(Query query) throws CatalogDBException; OpenCGAResult get(List migrationRunIds) throws CatalogDBException; - default OpenCGAResult get(String migrationRunId) throws CatalogDBException{ + default OpenCGAResult get(String migrationRunId) throws CatalogDBException { return get(Collections.singletonList(migrationRunId)); } - void update(String migrationRunId, MigrationRun migrationRun) throws CatalogDBException; - - void delete(String migrationRunId) throws CatalogDBException; +// void delete(String migrationRunId) throws CatalogDBException; } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java index b3215903f09..360aa912a28 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java @@ -1,7 +1,6 @@ package org.opencb.opencga.catalog.db.mongodb; import com.mongodb.client.model.Filters; -import org.apache.commons.lang.NotImplementedException; import org.bson.Document; import org.bson.conversions.Bson; import org.opencb.commons.datastore.core.DataResult; @@ -34,11 +33,19 @@ public MigrationMongoDBAdaptor(MongoDBCollection migrationCollection, Configurat } @Override - public void insert(MigrationRun migrationRun) throws CatalogDBException { + public void upsert(MigrationRun migrationRun) throws CatalogDBException { Document migrationDocument = migrationConverter.convertToStorageType(migrationRun); - DataResult insert = migrationCollection.insert(migrationDocument, QueryOptions.empty()); - if (insert.getNumInserted() == 0) { - throw new CatalogDBException("Could not insert MigrationRun"); + if (get(migrationRun.getId()).getNumResults() == 0) { + DataResult insert = migrationCollection.insert(migrationDocument, QueryOptions.empty()); + if (insert.getNumInserted() == 0) { + throw new CatalogDBException("Could not insert MigrationRun"); + } + } else { + Bson bsonQuery = parseQuery(new Query(QueryParams.ID.key(), migrationRun.getId())); + DataResult update = migrationCollection.update(bsonQuery, migrationDocument, QueryOptions.empty()); + if (update.getNumUpdated() == 0) { + throw new CatalogDBException("Could not update MigrationRun"); + } } } @@ -54,16 +61,6 @@ public OpenCGAResult get(List migrationRunIds) throws Cata return get(query); } - @Override - public void update(String migrationRunId, MigrationRun migrationRun) throws CatalogDBException { - throw new NotImplementedException("TO DO"); - } - - @Override - public void delete(String migrationRunId) throws CatalogDBException { - throw new NotImplementedException("TO DO"); - } - private Bson parseQuery(Query query) throws CatalogDBException { List andBsonList = new ArrayList<>(); Query queryCopy = new Query(query); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java index ca4dd9319cf..3990f0a8a9b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java @@ -4,7 +4,7 @@ String id(); - String description() default ""; + String description(); /** * @return OpenCGA Version @@ -15,7 +15,7 @@ MigrationLanguage language() default MigrationLanguage.JAVA; - String[] requires() default {}; + int rank(); int patch() default 1; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java index 8d07b02010c..ff61957f87b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java @@ -3,93 +3,119 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.catalog.db.api.MigrationDBAdaptor; -import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.response.OpenCGAResult; import org.reflections.Reflections; import org.reflections.scanners.SubTypesScanner; import org.reflections.scanners.TypeAnnotationsScanner; import org.reflections.util.ConfigurationBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.*; +import java.util.stream.Collectors; public class MigrationManager { private CatalogManager catalogManager; private MigrationDBAdaptor migrationDBAdaptor; + private final Logger logger; public MigrationManager(CatalogManager catalogManager, MigrationDBAdaptor migrationDBAdaptor) { this.catalogManager = catalogManager; this.migrationDBAdaptor = migrationDBAdaptor; - } - - public void getMigrationsStatus(String token) throws CatalogException { - validateAdmin(token); - } - - public void updateMigrationsStatus(String token) throws CatalogException { - validateAdmin(token); + this.logger = LoggerFactory.getLogger(MigrationManager.class); } public void runMigration(String version, Set domainsFilter, - Set languageFilter, String token) throws CatalogException { - + Set languageFilter, String token) throws CatalogException, MigrationException { + runMigration(version, domainsFilter, languageFilter, new ObjectMap(), token); } public void runMigration(String version, Set domainsFilter, - Set languageFilter, ObjectMap params, String token) throws CatalogException { + Set languageFilter, ObjectMap params, String token) + throws MigrationException, CatalogException { validateAdmin(token); - if (domainsFilter == null || domainsFilter.isEmpty()) { - domainsFilter = EnumSet.allOf(Migration.MigrationDomain.class); - } - if (languageFilter == null || languageFilter.isEmpty()) { - languageFilter = EnumSet.allOf(Migration.MigrationLanguage.class); - } - - // Get runnable migrations + // 1. Fetch required migrations sorted by rank List> runnableMigrations = getRunnableMigrations(version, domainsFilter, languageFilter); - while (!runnableMigrations.isEmpty()) { - for (Class runnableMigration : runnableMigrations) { - run(runnableMigration, params); + // 2. Get pending migrations + List> pendingMigrations = getPendingMigrations(version); + + // 2.1. Check that all pending migrations can be run automatically + for (Class migration : pendingMigrations) { + Migration annotation = getMigrationAnnotation(migration); + if (annotation.manual()) { + throw new MigrationException("Missing previous migration '" + annotation.id() + "' from version '" + annotation.version() + + "' requiring manual interaction"); } + } - // Refresh list of runnable migrations - runnableMigrations = getRunnableMigrations(version, domainsFilter, languageFilter); + // 3. Execute pending migrations + for (Class migration : pendingMigrations) { + run(migration, new ObjectMap()); } - // Check that there are no pending migrations - for (Class migration : migrations) { - // check domain - if (!domainsFilter.contains(getMigrationAnnotation(migration).domain())) { - continue; - } + // 4. Execute target migration + for (Class migration : runnableMigrations) { + run(migration, params); + } + } - // Check status and patch - MigrationRun migrationRun = getMigrationRun(migration); - if (migrationRun == null) { - // Cry - } - if (!migrationRun.getStatus().equals(MigrationRun.MigrationStatus.DONE)) { - // Cry + private List> getPendingMigrations(String version) throws MigrationException { + // 2.1. Get all available migrations sorted to check if previous migrations have been run + List> migrations = getAllSortedAvailableMigrations(); + + // 2.2. Find position of first migration with version "version" + int pos = 0; + for (int i = 0; i < migrations.size(); i++) { + Class migration = migrations.get(i); + Migration annotation = getMigrationAnnotation(migration); + if (annotation == null) { + throw new MigrationException("Class " + migration + " does not have the required java annotation @" + + Migration.class.getSimpleName()); } - if (getMigrationAnnotation(migration).patch() != migrationRun.getPatch()) { - // Cry + if (annotation.version().equalsIgnoreCase(version)) { + pos = i; + break; } } + if (pos == 0) { + throw new MigrationException("Could not find migration for version '" + version + "'"); + } + // Exclude newer migrations + migrations = migrations.subList(0, pos); + + // 2.3. Remove migrations already run from list + List migrationIdList = migrations.stream().map(m -> getMigrationAnnotation(m).id()).collect(Collectors.toList()); + OpenCGAResult migrationResult = null; + try { + migrationResult = migrationDBAdaptor.get(migrationIdList); + } catch (CatalogDBException e) { + throw new MigrationException(e.getMessage(), e); + } + Map migrationResultMap = new HashMap<>(); // id: patch + migrationResult.getResults().stream().map(m -> migrationResultMap.put(m.getId(), m)); + + // Remove migrations if they have been run successfully with the proper patch + migrations.removeIf(m -> { + Migration annotation = getMigrationAnnotation(m); + return annotation.patch() <= migrationResultMap.get(annotation.id()).getPatch() + && migrationResultMap.get(annotation.id()).getStatus() == MigrationRun.MigrationStatus.DONE; + }); + return migrations; } private void validateAdmin(String token) throws CatalogException { String userId = catalogManager.getUserManager().getUserId(token); - if (!catalogManager.getAuthorizationManager().checkIsAdmin(userId)) { - throw CatalogAuthorizationException.adminOnlySupportedOperation(); - } + catalogManager.getAuthorizationManager().checkIsInstallationAdministrator(userId); } - private Set> getMigrations() { + private Set> getAvailableMigrations() { Reflections reflections = new Reflections(new ConfigurationBuilder() .setScanners( new SubTypesScanner(), @@ -101,64 +127,116 @@ private Set> getMigrations() { return reflections.getSubTypesOf(MigrationTool.class); } + private List> getAllSortedAvailableMigrations() { + List> migrations = new ArrayList<>(getAvailableMigrations()); + migrations.sort(this::compareTo); + return migrations; + } + + /** + * Sort MigrationTools by version -> domain -> language -> rank. + * + * @param m1 MigrationTool 1. + * @param m2 MigrationTool 2. + * @return a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. + */ + private int compareTo(Class m1, Class m2) { + Migration m1Annotation = getMigrationAnnotation(m1); + Migration m2Annotation = getMigrationAnnotation(m2); + + String[] m1VersionSplit = m1Annotation.version().split("."); + String[] m2VersionSplit = m2Annotation.version().split("."); + + // 1. Check version + // Check first version number + if (Integer.parseInt(m1VersionSplit[0]) > Integer.parseInt(m2VersionSplit[0])) { + return 1; + } else if (Integer.parseInt(m1VersionSplit[0]) < Integer.parseInt(m2VersionSplit[0])) { + return -1; + } + // Check second version number + if (Integer.parseInt(m1VersionSplit[1]) > Integer.parseInt(m2VersionSplit[1])) { + return 1; + } else if (Integer.parseInt(m1VersionSplit[1]) < Integer.parseInt(m2VersionSplit[1])) { + return -1; + } + m1VersionSplit = m1VersionSplit[2].split("-RC"); + m2VersionSplit = m2VersionSplit[2].split("-RC"); + // Check third version number + if (Integer.parseInt(m1VersionSplit[0]) > Integer.parseInt(m2VersionSplit[0])) { + return 1; + } else if (Integer.parseInt(m1VersionSplit[0]) < Integer.parseInt(m2VersionSplit[0])) { + return -1; + } + // Check for RC's + if (m1VersionSplit.length == 2 && m2VersionSplit.length == 1) { + return -1; + } else if (m1VersionSplit.length == 1 && m2VersionSplit.length == 2) { + return 1; + } else if (m1VersionSplit.length == 2 && m2VersionSplit.length == 2) { + if (Integer.parseInt(m1VersionSplit[1]) > Integer.parseInt(m2VersionSplit[1])) { + return 1; + } else if (Integer.parseInt(m1VersionSplit[1]) < Integer.parseInt(m2VersionSplit[1])) { + return -1; + } + } + + // Domain + int compare = m1Annotation.domain().compareTo(m2Annotation.domain()); + if (compare != 0) { + return compare; + } + + // Language + compare = m1Annotation.language().compareTo(m2Annotation.language()); + if (compare != 0) { + return compare; + } + + // Rank + if (m1Annotation.rank() > m2Annotation.rank()) { + return 1; + } else if (m1Annotation.rank() < m2Annotation.rank()) { + return -1; + } + + return 0; + } + + private List> getRunnableMigrations(String version, Set domainFilter, - Set languageFilter) throws CatalogDBException { - Set> allMigrations = getMigrations(); - Map> migrationMap = new HashMap<>(); + Set languageFilter) { + + if (domainFilter == null || domainFilter.isEmpty()) { + domainFilter = EnumSet.allOf(Migration.MigrationDomain.class); + } + if (languageFilter == null || languageFilter.isEmpty()) { + languageFilter = EnumSet.allOf(Migration.MigrationLanguage.class); + } + + Set> allMigrations = getAvailableMigrations(); List> filteredMigrations = new LinkedList<>(); for (Class migration : allMigrations) { - Migration annotation = migration.getAnnotation(Migration.class); - migrationMap.put(annotation.id(), migration); + Migration annotation = getMigrationAnnotation(migration); if (StringUtils.isNotEmpty(version) && !annotation.version().equals(version)) { continue; } - if (domainFilter != null && !domainFilter.isEmpty() && !domainFilter.contains(annotation.domain())) { + if (!domainFilter.isEmpty() && !domainFilter.contains(annotation.domain())) { continue; } - if (languageFilter != null && !languageFilter.isEmpty() && !languageFilter.contains(annotation.language())) { + if (!languageFilter.isEmpty() && !languageFilter.contains(annotation.language())) { continue; } filteredMigrations.add(migration); } - // Check if it has been executed - Iterator> iterator = filteredMigrations.iterator(); - while (iterator.hasNext()) { - Class filteredMigration = iterator.next(); - Migration annotation = filteredMigration.getAnnotation(Migration.class); - OpenCGAResult migrationResult = migrationDBAdaptor.get(annotation.id()); - if (migrationResult.getNumResults() == 1) { - if (annotation.patch() == migrationResult.first().getPatch() - && migrationResult.first().getStatus() == MigrationRun.MigrationStatus.DONE) { - iterator.remove(); - continue; - } - } - - // Check dependencies - if (annotation.requires().length > 0) { - migrationResult = migrationDBAdaptor.get(Arrays.asList(annotation.requires())); - Map - } - - - } - // TODO - // Get those that: - // Match type filter - // Has not been executed yet - // Have dependencies successfully executed - return Collections.emptyList(); + return filteredMigrations; } - private void run(Class runnableMigration) throws MigrationException { - Migration annotation = runnableMigration.getAnnotation(Migration.class); - if (annotation == null) { - throw new MigrationException("Class " + runnableMigration + " does not have the required java annotation @" - + Migration.class.getSimpleName()); - } + private void run(Class runnableMigration, ObjectMap params) throws MigrationException { + Migration annotation = getMigrationAnnotation(runnableMigration); MigrationTool migrationTool; try { @@ -167,16 +245,31 @@ private void run(Class runnableMigration) throws Migrat throw new MigrationException("Can't instantiate class " + runnableMigration + " from migration '" + annotation.id() + "'", e); } - migrationTool.setup(catalogManager); - migrationTool. - } + migrationTool.setup(catalogManager, params); - private MigrationRun getMigrationRun(Class migration) { - return null; + logger.info("Executing migration '{}' for version '{}': {}", annotation.id(), annotation.version(), annotation.description()); + MigrationRun migrationRun = new MigrationRun(annotation.id(), annotation.description(), annotation.version(), TimeUtils.getDate(), + annotation.patch()); + try { + migrationTool.execute(); + migrationRun.setStatus(MigrationRun.MigrationStatus.DONE); + } catch (MigrationException e) { + migrationRun.setStatus(MigrationRun.MigrationStatus.ERROR); + migrationRun.setException(e.getMessage()); + logger.error("Migration '{}' failed with message: {}", annotation.id(), e.getMessage(), e); + } finally { + migrationRun.setEnd(TimeUtils.getDate()); + try { + migrationDBAdaptor.upsert(migrationRun); + } catch (CatalogDBException e) { + throw new MigrationException("Could not register migration in OpenCGA"); + } + } } - private Migration getMigrationAnnotation(Class migration) { - return migration.getAnnotation(Migration.class); + private Migration getMigrationAnnotation(Class migration) { + Migration annotation = migration.getAnnotation(Migration.class); + return annotation; } } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationRun.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationRun.java index 477f235c411..edda2bb64a7 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationRun.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationRun.java @@ -4,57 +4,131 @@ public class MigrationRun { + /** + * Migration id. + */ private String id; - private Date date; - + /** + * Field describing the migration. + */ + private String description; + + /** + * OpenCGA version where it has to be applied. + */ + private String version; + + /** + * Date when migration started. + */ + private Date start; + + /** + * Date when migration finished. + */ + private Date end; + + /** + * Migration patch. + */ private int patch; + /** + * Migration status. + */ private MigrationStatus status; + /** + * Exception message raised if the migration fails. + */ + private String exception; + enum MigrationStatus { DONE, -// PENDING, -// RUNNING, ERROR } public MigrationRun() { } - public MigrationRun(Date date, String id, int patch, MigrationStatus status) { - this.date = date; + public MigrationRun(String id, String description, String version, Date start, int patch) { + this.id = id; + this.description = description; + this.version = version; + this.start = start; + this.patch = patch; + } + + public MigrationRun(String id, String description, String version, Date start, Date end, int patch, MigrationStatus status, + String exception) { this.id = id; + this.description = description; + this.version = version; + this.start = start; + this.end = end; this.patch = patch; this.status = status; + this.exception = exception; } @Override public String toString() { final StringBuilder sb = new StringBuilder("MigrationRun{"); - sb.append("date=").append(date); - sb.append(", id='").append(id).append('\''); + sb.append("id='").append(id).append('\''); + sb.append(", description='").append(description).append('\''); + sb.append(", version='").append(version).append('\''); + sb.append(", start=").append(start); + sb.append(", end=").append(end); sb.append(", patch=").append(patch); sb.append(", status=").append(status); + sb.append(", exception='").append(exception).append('\''); sb.append('}'); return sb.toString(); } - public Date getDate() { - return date; + public String getId() { + return id; } - public MigrationRun setDate(Date date) { - this.date = date; + public MigrationRun setId(String id) { + this.id = id; return this; } - public String id() { - return id; + public String getDescription() { + return description; } - public MigrationRun setId(String id) { - this.id = id; + public MigrationRun setDescription(String description) { + this.description = description; + return this; + } + + public String getVersion() { + return version; + } + + public MigrationRun setVersion(String version) { + this.version = version; + return this; + } + + public Date getStart() { + return start; + } + + public MigrationRun setStart(Date start) { + this.start = start; + return this; + } + + public Date getEnd() { + return end; + } + + public MigrationRun setEnd(Date end) { + this.end = end; return this; } @@ -75,4 +149,13 @@ public MigrationRun setStatus(MigrationStatus status) { this.status = status; return this; } + + public String getException() { + return exception; + } + + public MigrationRun setException(String exception) { + this.exception = exception; + return this; + } } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java index 7e3abb2fc95..76a8d2bcae6 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java @@ -1,10 +1,12 @@ package org.opencb.opencga.catalog.migration; +import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.catalog.managers.CatalogManager; public abstract class MigrationTool { protected CatalogManager catalogManager; + protected ObjectMap params; public MigrationTool() { } @@ -13,8 +15,9 @@ public final String getId() { return ""; } - public final void setup(CatalogManager catalogManager) { + public final void setup(CatalogManager catalogManager, ObjectMap params) { this.catalogManager = catalogManager; + this.params = params; } public final void execute() throws MigrationException { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java index 11bad78762a..c9a187c677b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java @@ -1,7 +1,7 @@ package org.opencb.opencga.catalog.migration; -@Migration(id ="opencga-2.0.3-catalog-java", version = "2.0.3", domain = Migration.MigrationDomain.CATALOG, - language = Migration.MigrationLanguage.JAVA) +@Migration(id ="opencga-2.0.3-catalog-java", version = "2.0.3", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 1) public class Opencga20003 extends MigrationTool { @Override From 9a60e91b5709b82074c1f53e76ff07f9a315e455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 27 May 2021 17:12:12 +0100 Subject: [PATCH 348/412] storage: Fix NPE annotating from cellbase on skipped annotations --- .../AbstractCellBaseVariantAnnotator.java | 62 ++++++++++--------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java index 22466be089a..1d5dd167481 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java @@ -16,6 +16,7 @@ package org.opencb.opencga.storage.core.variant.annotation.annotators; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.opencb.biodata.models.variant.Variant; @@ -168,7 +169,7 @@ protected List getVariantAnnotationList(List variant for (CellBaseDataResult queryResult : queryResults) { // If the QueryResult is empty, assume that the variant was skipped // Check that the skipped variant matches with the expected variant - if (queryResult.getResults().isEmpty()) { + if (CollectionUtils.isEmpty(queryResult.getResults())) { Variant variant = iterator.next(); if (variantSerializer.apply(variant).equals(queryResult.getId()) || variant.toString().equals(queryResult.getId()) @@ -185,37 +186,38 @@ protected List getVariantAnnotationList(List variant logger.warn("Skip annotation for variant " + variant); } } - } - for (VariantAnnotation variantAnnotation : queryResult.getResults()) { - Variant variant = iterator.next(); - String annotationAlternate = variantAnnotation.getAlternate(); - if (annotationAlternate.equals(VariantBuilder.DUP_ALT) - && variant.getAlternate().equals(VariantBuilder.DUP_TANDEM_ALT)) { - // Annotator might remove the ":TANDEM". Put it back - annotationAlternate = VariantBuilder.DUP_TANDEM_ALT; - } - if (!variant.getChromosome().equals(variantAnnotation.getChromosome()) - || !variant.getStart().equals(variantAnnotation.getStart()) - || !variant.getReference().equals(variantAnnotation.getReference()) - || !variant.getAlternate().equals(annotationAlternate)) { - throw unexpectedVariantOrderException(variant, variantAnnotation.getChromosome() + ':' - + variantAnnotation.getStart() + ':' - + variantAnnotation.getReference() + ':' - + variantAnnotation.getAlternate()); - } - if (variant.isSV() || variant.getSv() != null) { - // Variant annotation class does not have information about Structural Variations. - // Store the original Variant.toString as an additional attribute. - AdditionalAttribute additionalAttribute = - new AdditionalAttribute(Collections.singletonMap(VARIANT_ID.key(), variant.toString())); - if (variantAnnotation.getAdditionalAttributes() == null) { - variantAnnotation - .setAdditionalAttributes(Collections.singletonMap(GROUP_NAME.key(), additionalAttribute)); - } else { - variantAnnotation.getAdditionalAttributes().put(GROUP_NAME.key(), additionalAttribute); + } else { + for (VariantAnnotation variantAnnotation : queryResult.getResults()) { + Variant variant = iterator.next(); + String annotationAlternate = variantAnnotation.getAlternate(); + if (annotationAlternate.equals(VariantBuilder.DUP_ALT) + && variant.getAlternate().equals(VariantBuilder.DUP_TANDEM_ALT)) { + // Annotator might remove the ":TANDEM". Put it back + annotationAlternate = VariantBuilder.DUP_TANDEM_ALT; + } + if (!variant.getChromosome().equals(variantAnnotation.getChromosome()) + || !variant.getStart().equals(variantAnnotation.getStart()) + || !variant.getReference().equals(variantAnnotation.getReference()) + || !variant.getAlternate().equals(annotationAlternate)) { + throw unexpectedVariantOrderException(variant, variantAnnotation.getChromosome() + ':' + + variantAnnotation.getStart() + ':' + + variantAnnotation.getReference() + ':' + + variantAnnotation.getAlternate()); + } + if (variant.isSV() || variant.getSv() != null) { + // Variant annotation class does not have information about Structural Variations. + // Store the original Variant.toString as an additional attribute. + AdditionalAttribute additionalAttribute = + new AdditionalAttribute(Collections.singletonMap(VARIANT_ID.key(), variant.toString())); + if (variantAnnotation.getAdditionalAttributes() == null) { + variantAnnotation + .setAdditionalAttributes(Collections.singletonMap(GROUP_NAME.key(), additionalAttribute)); + } else { + variantAnnotation.getAdditionalAttributes().put(GROUP_NAME.key(), additionalAttribute); + } } + variantAnnotationList.add(variantAnnotation); } - variantAnnotationList.add(variantAnnotation); } } } From 4cd4a2065934985fa983e2bd0f16c7a967015e07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 27 May 2021 17:30:27 +0100 Subject: [PATCH 349/412] analysis: Remove genotype filter from SampleEligibilityAnalysis. #1768 --- .../variant/samples/SampleEligibilityAnalysis.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/samples/SampleEligibilityAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/samples/SampleEligibilityAnalysis.java index 659aac02aae..c26a293d3d0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/samples/SampleEligibilityAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/samples/SampleEligibilityAnalysis.java @@ -643,6 +643,7 @@ private Set resolveQueryDirect(TreeQuery.QueryNode node, Query baseQuery Variant next = iterator.next(); for (SampleEntry sampleEntry : next.getStudies().get(0).getSamples()) { String genotype = sampleEntry.getData().get(0); + // What about genotype NA ? if (GenotypeClass.MAIN_ALT.test(genotype) && genotypeFilter.test(genotype)) { samples.add(sampleEntry.getData().get(1)); } @@ -766,10 +767,8 @@ public List apply(List variants) throws Exception { skip += numSamples; for (SampleEntry sampleEntry : studyEntry.getSamples()) { - if (GenotypeClass.MAIN_ALT.test(sampleEntry.getData().get(0))) { - String sampleId = sampleEntry.getSampleId(); - thisVariantSamples.add(sampleId); - } + String sampleId = sampleEntry.getSampleId(); + thisVariantSamples.add(sampleId); } } while (numSamples == limit); From 03b36145d93a2695dc688c6b74fb968b8af50b44 Mon Sep 17 00:00:00 2001 From: imedina Date: Fri, 28 May 2021 00:28:24 +0100 Subject: [PATCH 350/412] core: add new Variant data model to FileQualityControl to store VCF stats --- .../alignment/AlignmentQualityControl.java | 1 + .../alignment/CoverageQualityControl.java | 1 + .../core/models/file/FileQualityControl.java | 24 +++++++++- .../variant/VariantFileQualityControl.java | 48 +++++++++++++++++++ 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/variant/VariantFileQualityControl.java diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java index 481ddee8691..f1e4f7b1d4e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java @@ -8,6 +8,7 @@ import java.io.Serializable; public class AlignmentQualityControl implements Serializable { + private FastQcMetrics fastQcMetrics; private SamtoolsStats samtoolsStats; private SamtoolsFlagstats samtoolsFlagStats; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/CoverageQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/CoverageQualityControl.java index 40e6f436285..3de41247a14 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/CoverageQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/CoverageQualityControl.java @@ -7,6 +7,7 @@ import java.util.List; public class CoverageQualityControl implements Serializable { + private List geneCoverageStats; public CoverageQualityControl() { diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java index 87a85f0e74e..104968557fd 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/FileQualityControl.java @@ -2,29 +2,49 @@ import org.opencb.opencga.core.models.alignment.AlignmentQualityControl; import org.opencb.opencga.core.models.alignment.CoverageQualityControl; +import org.opencb.opencga.core.models.variant.VariantFileQualityControl; public class FileQualityControl { + + private VariantFileQualityControl variant; private AlignmentQualityControl alignment; private CoverageQualityControl coverage; public FileQualityControl() { - this(new AlignmentQualityControl(), new CoverageQualityControl()); + this(new VariantFileQualityControl(), new AlignmentQualityControl(), new CoverageQualityControl()); } + @Deprecated public FileQualityControl(AlignmentQualityControl alignment, CoverageQualityControl coverage) { this.alignment = alignment; this.coverage = coverage; } + public FileQualityControl(VariantFileQualityControl variant, AlignmentQualityControl alignment, CoverageQualityControl coverage) { + this.variant = variant; + this.alignment = alignment; + this.coverage = coverage; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("FileQualityControl{"); - sb.append("alignment=").append(alignment); + sb.append("variant=").append(variant); + sb.append(", alignment=").append(alignment); sb.append(", coverage=").append(coverage); sb.append('}'); return sb.toString(); } + public VariantFileQualityControl getVariant() { + return variant; + } + + public FileQualityControl setVariant(VariantFileQualityControl variant) { + this.variant = variant; + return this; + } + public AlignmentQualityControl getAlignment() { return alignment; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/VariantFileQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/VariantFileQualityControl.java new file mode 100644 index 00000000000..b5af31e1b38 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/VariantFileQualityControl.java @@ -0,0 +1,48 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.opencga.core.models.variant; + +import org.opencb.biodata.models.variant.metadata.VariantSetStats; + +public class VariantFileQualityControl { + + private VariantSetStats variantSetMetrics; + + public VariantFileQualityControl() { + } + + public VariantFileQualityControl(VariantSetStats variantSetStats) { + this.variantSetMetrics = variantSetStats; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("VariantFileQualityControl{"); + sb.append("variantSetMetrics=").append(variantSetMetrics); + sb.append('}'); + return sb.toString(); + } + + public VariantSetStats getVariantSetMetrics() { + return variantSetMetrics; + } + + public VariantFileQualityControl setVariantSetMetrics(VariantSetStats variantSetMetrics) { + this.variantSetMetrics = variantSetMetrics; + return this; + } +} From e8c39a67f0181952c45ec63e40fc395c7ba75869 Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 28 May 2021 09:17:58 +0000 Subject: [PATCH 351/412] GitBook: [develop] one page modified --- docs/manual/data-management/sharing-and-permissions/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual/data-management/sharing-and-permissions/README.md b/docs/manual/data-management/sharing-and-permissions/README.md index 72ba99214ba..180fd16fc37 100644 --- a/docs/manual/data-management/sharing-and-permissions/README.md +++ b/docs/manual/data-management/sharing-and-permissions/README.md @@ -31,7 +31,7 @@ Apart from _admins,_ there is also an special group called _members_. Any user w ## Decision Algorithm -The next schema provides a visual explanation of the algorithm implemented in Catalog for providing a user access to the data in the context of a study. +The next schema provides a visual explanation of the algorithm implemented in Catalog for deciding whether the user has or not access to the data in the context of a study. ![Decision Algorithm for granting permissions ](../../../.gitbook/assets/image%20%282%29.png) From cf312a01616b58d310a8342a33f8e54d60ddb48a Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 28 May 2021 16:16:35 +0200 Subject: [PATCH 352/412] catalog: improve migration system, #1769 --- .../app/misc/migration/v2.1.0/migration1.js | 4 + .../app/misc/migration/v2.1.0/migration2.js | 18 ++ .../app/misc/migration/v2.1.0/migration3.js | 7 + .../app/cli/admin/AdminCliOptionsParser.java | 1 + .../executors/MigrationCommandExecutor.java | 20 +- .../options/MigrationCommandOptions.java | 14 ++ .../v2_0_3/catalog/java/Migration1.java | 28 +++ .../v2_1_0/catalog/javascript/Migration1.java | 19 ++ .../v2_1_0/catalog/javascript/Migration2.java | 19 ++ .../v2_1_0/catalog/javascript/Migration3.java | 19 ++ .../db/mongodb/MigrationMongoDBAdaptor.java | 4 +- .../catalog/managers/AbstractManager.java | 2 +- .../catalog/managers/CatalogManager.java | 6 +- .../opencga/catalog/migration/Migration.java | 28 ++- .../catalog/migration/MigrationException.java | 4 +- .../catalog/migration/MigrationManager.java | 128 +++++++++---- .../catalog/migration/MigrationTool.java | 84 +++++++- .../catalog/migration/Opencga20003.java | 11 -- .../migration/MigrationManagerTest.java | 179 ++++++++++++++++++ 19 files changed, 539 insertions(+), 56 deletions(-) create mode 100644 opencga-app/app/misc/migration/v2.1.0/migration1.js create mode 100644 opencga-app/app/misc/migration/v2.1.0/migration2.js create mode 100644 opencga-app/app/misc/migration/v2.1.0/migration3.js create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_0_3/catalog/java/Migration1.java create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java delete mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java create mode 100644 opencga-catalog/src/test/java/org/opencb/opencga/catalog/migration/MigrationManagerTest.java diff --git a/opencga-app/app/misc/migration/v2.1.0/migration1.js b/opencga-app/app/misc/migration/v2.1.0/migration1.js new file mode 100644 index 00000000000..6f2e57e1083 --- /dev/null +++ b/opencga-app/app/misc/migration/v2.1.0/migration1.js @@ -0,0 +1,4 @@ +load("../utils/migrateCollection.js"); + +// Add Sample RGA status #1693 +db.sample.createIndex({"internal.rga.status": 1, "studyUid": 1}, {"background": true}); \ No newline at end of file diff --git a/opencga-app/app/misc/migration/v2.1.0/migration2.js b/opencga-app/app/misc/migration/v2.1.0/migration2.js new file mode 100644 index 00000000000..fae7589f029 --- /dev/null +++ b/opencga-app/app/misc/migration/v2.1.0/migration2.js @@ -0,0 +1,18 @@ +load("../utils/migrateCollection.js"); + +// Check group consistency #1735 + +migrateCollection("study", {}, {groups: 1}, function(bulk, doc) { + var groups = doc["groups"]; + var toUpdate = false; + for (var group of groups) { + if (isUndefinedOrNull(group['userIds'])) { + group['userIds'] = []; + toUpdate = true; + } + } + + if (toUpdate) { + bulk.find({"_id": doc._id}).updateOne({"$set": {"groups": doc['groups']}}); + } +}); \ No newline at end of file diff --git a/opencga-app/app/misc/migration/v2.1.0/migration3.js b/opencga-app/app/misc/migration/v2.1.0/migration3.js new file mode 100644 index 00000000000..343784d52fe --- /dev/null +++ b/opencga-app/app/misc/migration/v2.1.0/migration3.js @@ -0,0 +1,7 @@ +load("../utils/migrateCollection.js"); + +// Initialise panels array in Clinical Analysis #1759 + +migrateCollection("clinical", {"$or":[{panels:{"$exists":false}}, {panels: null}]}, {panels: 1}, function(bulk, doc) { + bulk.find({"_id": doc._id}).updateOne({"$set": {"panels": []}}); +}); \ No newline at end of file diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/AdminCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/AdminCliOptionsParser.java index f7a2d513c1f..68c320d1568 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/AdminCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/AdminCliOptionsParser.java @@ -122,6 +122,7 @@ public AdminCliOptionsParser() { migrationSubCommands.addCommand("v2.0.0", this.migrationCommandOptions.getMigrateV200CommandOptions()); migrationSubCommands.addCommand("v2.0.1", this.migrationCommandOptions.getMigrateV201CommandOptions()); migrationSubCommands.addCommand("v2.0.3", this.migrationCommandOptions.getMigrateV203CommandOptions()); + migrationSubCommands.addCommand("v2.1.0", this.migrationCommandOptions.getMigrateV210CommandOptions()); } @Override diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java index 22b413fc131..10136a25bcb 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java @@ -1,7 +1,6 @@ package org.opencb.opencga.app.cli.admin.executors; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.ToStringBuilder; import org.bson.Document; import org.opencb.biodata.models.clinical.interpretation.Software; import org.opencb.commons.datastore.core.ObjectMap; @@ -25,6 +24,8 @@ import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.catalog.migration.MigrationException; +import org.opencb.opencga.catalog.migration.MigrationManager; import org.opencb.opencga.catalog.utils.UuidUtils; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.JacksonUtils; @@ -87,6 +88,9 @@ public void execute() throws Exception { case "v2.0.3": v2_0_3(); break; + case "v2.1.0": + v2_1_0(); + break; default: logger.error("Subcommand '{}' not valid", subCommandString); break; @@ -501,6 +505,20 @@ private void v2_0_3() throws CatalogException { } } + private void v2_1_0() throws CatalogException { + MigrationCommandOptions.MigrateV2_1_0CommandOptions options = migrationCommandOptions.getMigrateV210CommandOptions(); + setCatalogDatabaseCredentials(options, options.commonOptions); + + try (CatalogManager catalogManager = new CatalogManager(configuration)) { + String token = catalogManager.getUserManager().loginAsAdmin(adminPassword).getToken(); + MigrationManager migrationManager = catalogManager.getMigrationManager(); + migrationManager.runMigration("2.1.0", appHome, token); + } catch (Exception e) { + logger.error(e.getMessage()); + } + } + + private boolean needsMigration(MongoDBCollection metaCollection, int version, int release) { fetchUpdateVersionVariables(metaCollection); logger.info("Current version: {}", this.opencgaVersion.getVersion()); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/options/MigrationCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/options/MigrationCommandOptions.java index 597f0c08d4c..a6b1250d554 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/options/MigrationCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/options/MigrationCommandOptions.java @@ -22,6 +22,7 @@ public class MigrationCommandOptions extends GeneralCliOptions { private final MigrateV2_0_0CommandOptions migrateV200CommandOptions; private final MigrateV2_0_1CommandOptions migrateV201CommandOptions; private final MigrateV2_0_3CommandOptions migrateV203CommandOptions; + private final MigrateV2_1_0CommandOptions migrateV210CommandOptions; private final AdminCliOptionsParser.AdminCommonCommandOptions commonOptions; public MigrationCommandOptions(JCommander jCommander, AdminCliOptionsParser.AdminCommonCommandOptions commonOptions) { @@ -32,6 +33,7 @@ public MigrationCommandOptions(JCommander jCommander, AdminCliOptionsParser.Admi this.migrateV200CommandOptions = new MigrateV2_0_0CommandOptions(); this.migrateV201CommandOptions = new MigrateV2_0_1CommandOptions(); this.migrateV203CommandOptions = new MigrateV2_0_3CommandOptions(); + this.migrateV210CommandOptions = new MigrateV2_1_0CommandOptions(); } @Parameters(commandNames = {"v1.3.0"}, commandDescription = "Migrate OpenCGA from version 1.2.x to 1.3.0") @@ -95,6 +97,14 @@ public class MigrateV2_0_3CommandOptions extends AdminCliOptionsParser.CatalogDa } + @Parameters(commandNames = {"v2.1.0"}, commandDescription = "Migrate OpenCGA from version 2.0.x to 2.1.0") + public class MigrateV2_1_0CommandOptions extends AdminCliOptionsParser.CatalogDatabaseCommandOptions { + + @ParametersDelegate + public AdminCliOptionsParser.AdminCommonCommandOptions commonOptions = MigrationCommandOptions.this.commonOptions; + + } + public enum MigrateRC { ALL, RC1, @@ -131,6 +141,10 @@ public MigrateV2_0_3CommandOptions getMigrateV203CommandOptions() { return migrateV203CommandOptions; } + public MigrateV2_1_0CommandOptions getMigrateV210CommandOptions() { + return migrateV210CommandOptions; + } + public AdminCliOptionsParser.AdminCommonCommandOptions getCommonOptions() { return commonOptions; } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_0_3/catalog/java/Migration1.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_0_3/catalog/java/Migration1.java new file mode 100644 index 00000000000..839036b5adc --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_0_3/catalog/java/Migration1.java @@ -0,0 +1,28 @@ +package org.opencb.opencga.app.migrations.v2_0_3.catalog.java; + +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.migration.Migration; +import org.opencb.opencga.catalog.migration.MigrationTool; +import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.models.project.Project; +import org.opencb.opencga.core.models.study.Study; + +@Migration(id="2.0.3-CATALOG-JAVA-1", description = "Recalculate roles from Family #1763", version = "2.0.3", rank = 1) +public class Migration1 extends MigrationTool { + + @Override + protected void run() throws CatalogException { + // Add automatically roles to all the family members + QueryOptions familyUpdateOptions = new QueryOptions(ParamConstants.FAMILY_UPDATE_ROLES_PARAM, true); + for (Project project : catalogManager.getProjectManager().get(new Query(), new QueryOptions(), token).getResults()) { + if (project.getStudies() != null) { + for (Study study : project.getStudies()) { + logger.info("Updating family roles from study {}", study.getFqn()); + catalogManager.getFamilyManager().update(study.getFqn(), new Query(), null, familyUpdateOptions, token); + } + } + } + } +} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java new file mode 100644 index 00000000000..e23092ad346 --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java @@ -0,0 +1,19 @@ +package org.opencb.opencga.app.migrations.v2_1_0.catalog.javascript; + +import org.opencb.opencga.catalog.migration.Migration; +import org.opencb.opencga.catalog.migration.MigrationException; +import org.opencb.opencga.catalog.migration.MigrationTool; + +import java.nio.file.Path; +import java.nio.file.Paths; + +@Migration(id="2.1.0-CATALOG-JS-1", description = "Create index for sample RGA status #1693", version = "2.1.0", + language = Migration.MigrationLanguage.JAVASCRIPT, rank = 1) +public class Migration1 extends MigrationTool { + + @Override + protected void run() throws MigrationException { + Path path = Paths.get(appHome).resolve("misc/migration/v2.1.0/migration1.js"); + runJavascript(path); + } +} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java new file mode 100644 index 00000000000..da85427981d --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java @@ -0,0 +1,19 @@ +package org.opencb.opencga.app.migrations.v2_1_0.catalog.javascript; + +import org.opencb.opencga.catalog.migration.Migration; +import org.opencb.opencga.catalog.migration.MigrationException; +import org.opencb.opencga.catalog.migration.MigrationTool; + +import java.nio.file.Path; +import java.nio.file.Paths; + +@Migration(id="2.1.0-CATALOG-JS-2", description = "Initialise all userIds arrays from groups #1735", version = "2.1.0", + language = Migration.MigrationLanguage.JAVASCRIPT, rank = 2) +public class Migration2 extends MigrationTool { + + @Override + protected void run() throws MigrationException { + Path path = Paths.get(appHome).resolve("misc/migration/v2.1.0/migration2.js"); + runJavascript(path); + } +} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java new file mode 100644 index 00000000000..15f233c7dcf --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java @@ -0,0 +1,19 @@ +package org.opencb.opencga.app.migrations.v2_1_0.catalog.javascript; + +import org.opencb.opencga.catalog.migration.Migration; +import org.opencb.opencga.catalog.migration.MigrationException; +import org.opencb.opencga.catalog.migration.MigrationTool; + +import java.nio.file.Path; +import java.nio.file.Paths; + +@Migration(id="2.1.0-CATALOG-JS-3", description = "Initialise panels array in Clinical Analysis #1759", version = "2.1.0", + language = Migration.MigrationLanguage.JAVASCRIPT, rank = 3) +public class Migration3 extends MigrationTool { + + @Override + protected void run() throws MigrationException { + Path path = Paths.get(appHome).resolve("misc/migration/v2.1.0/migration3.js"); + runJavascript(path); + } +} \ No newline at end of file diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java index 360aa912a28..3a1524ac0a4 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java @@ -37,12 +37,12 @@ public void upsert(MigrationRun migrationRun) throws CatalogDBException { Document migrationDocument = migrationConverter.convertToStorageType(migrationRun); if (get(migrationRun.getId()).getNumResults() == 0) { DataResult insert = migrationCollection.insert(migrationDocument, QueryOptions.empty()); - if (insert.getNumInserted() == 0) { + if (insert.getNumUpdated() == 0) { throw new CatalogDBException("Could not insert MigrationRun"); } } else { Bson bsonQuery = parseQuery(new Query(QueryParams.ID.key(), migrationRun.getId())); - DataResult update = migrationCollection.update(bsonQuery, migrationDocument, QueryOptions.empty()); + DataResult update = migrationCollection.update(bsonQuery, new Document("$set", migrationDocument), QueryOptions.empty()); if (update.getNumUpdated() == 0) { throw new CatalogDBException("Could not update MigrationRun"); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AbstractManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AbstractManager.java index 7280acb06d2..7837ba8cace 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AbstractManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AbstractManager.java @@ -67,7 +67,7 @@ public abstract class AbstractManager { protected final ClinicalAnalysisDBAdaptor clinicalDBAdaptor; protected final InterpretationDBAdaptor interpretationDBAdaptor; - protected static final String OPENCGA = "opencga"; + public static final String OPENCGA = "opencga"; public static final String ANONYMOUS = "*"; public static final int BATCH_OPERATION_SIZE = 100; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java index 627987dd56c..8f0c86e1f9f 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/CatalogManager.java @@ -103,7 +103,7 @@ private void configureManagers(Configuration configuration) throws CatalogExcept this.initializeAdmin(configuration); authorizationManager = new CatalogAuthorizationManager(this.catalogDBAdaptorFactory, configuration); auditManager = new AuditManager(authorizationManager, this, this.catalogDBAdaptorFactory, configuration); - migrationManager = new MigrationManager(this, catalogDBAdaptorFactory.getMigrationDBAdaptor()); + migrationManager = new MigrationManager(this, catalogDBAdaptorFactory.getMigrationDBAdaptor(), configuration); adminManager = new AdminManager(authorizationManager, auditManager, this, catalogDBAdaptorFactory, catalogIOManager, configuration); userManager = new UserManager(authorizationManager, auditManager, this, catalogDBAdaptorFactory, catalogIOManager, configuration); @@ -338,4 +338,8 @@ public AuthorizationManager getAuthorizationManager() { public AuditManager getAuditManager() { return auditManager; } + + public MigrationManager getMigrationManager() { + return migrationManager; + } } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java index 3990f0a8a9b..e0d2de01480 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Migration.java @@ -1,26 +1,50 @@ package org.opencb.opencga.catalog.migration; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) public @interface Migration { + /** + * @return unique id. + */ String id(); + /** + * @return migration description (Ticket that fixes). + */ String description(); /** - * @return OpenCGA Version + * @return OpenCGA Version. Allowed formats: 1.2.3, 1.1.0-RC1 */ String version(); + /** + * @return affected OpenCGA domain. + */ MigrationDomain domain() default MigrationDomain.CATALOG; + /** + * @return language used to run the migration. + */ MigrationLanguage language() default MigrationLanguage.JAVA; + /** + * @return rank to know the execution order. + */ int rank(); + /** + * @return migration patch. + */ int patch() default 1; /** - * * @return whether the migration can be run as is or requires additional parameters that need to be passed by the administrator. */ boolean manual() default false; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationException.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationException.java index e63dd7f2e96..22b38001992 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationException.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationException.java @@ -1,6 +1,8 @@ package org.opencb.opencga.catalog.migration; -public class MigrationException extends Exception { +import org.opencb.opencga.catalog.exceptions.CatalogException; + +public class MigrationException extends CatalogException { public MigrationException(String message) { super(message); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java index ff61957f87b..25b9518eee1 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java @@ -5,73 +5,99 @@ import org.opencb.opencga.catalog.db.api.MigrationDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.managers.AbstractManager; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.common.TimeUtils; +import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.response.OpenCGAResult; import org.reflections.Reflections; import org.reflections.scanners.SubTypesScanner; import org.reflections.scanners.TypeAnnotationsScanner; +import org.reflections.util.ClasspathHelper; import org.reflections.util.ConfigurationBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.net.URL; import java.util.*; import java.util.stream.Collectors; public class MigrationManager { - private CatalogManager catalogManager; - private MigrationDBAdaptor migrationDBAdaptor; + private final CatalogManager catalogManager; + private final Configuration configuration; + private final MigrationDBAdaptor migrationDBAdaptor; + private final Logger logger; - public MigrationManager(CatalogManager catalogManager, MigrationDBAdaptor migrationDBAdaptor) { + public MigrationManager(CatalogManager catalogManager, MigrationDBAdaptor migrationDBAdaptor, Configuration configuration) { this.catalogManager = catalogManager; + this.configuration = configuration; this.migrationDBAdaptor = migrationDBAdaptor; this.logger = LoggerFactory.getLogger(MigrationManager.class); } + public void runMigration(String version, String appHome, String token) throws CatalogException { + runMigration(version, Collections.emptySet(), Collections.emptySet(), appHome, new ObjectMap(), token); + } + public void runMigration(String version, Set domainsFilter, - Set languageFilter, String token) throws CatalogException, MigrationException { - runMigration(version, domainsFilter, languageFilter, new ObjectMap(), token); + Set languageFilter, String appHome, String token) + throws CatalogException { + runMigration(version, domainsFilter, languageFilter, appHome, new ObjectMap(), token); } public void runMigration(String version, Set domainsFilter, - Set languageFilter, ObjectMap params, String token) - throws MigrationException, CatalogException { + Set languageFilter, String appHome, ObjectMap params, String token) + throws CatalogException { validateAdmin(token); + // Extend token life + token = catalogManager.getUserManager().getNonExpiringToken(AbstractManager.OPENCGA, token); + // 1. Fetch required migrations sorted by rank List> runnableMigrations = getRunnableMigrations(version, domainsFilter, languageFilter); // 2. Get pending migrations List> pendingMigrations = getPendingMigrations(version); + if (runnableMigrations.isEmpty() && pendingMigrations.isEmpty()) { + logger.info("Nothing to run. OpenCGA is up to date"); + return; + } + // 2.1. Check that all pending migrations can be run automatically for (Class migration : pendingMigrations) { Migration annotation = getMigrationAnnotation(migration); if (annotation.manual()) { throw new MigrationException("Missing previous migration '" + annotation.id() + "' from version '" + annotation.version() - + "' requiring manual interaction"); + + "'. Please, run this migration manually using the CLI."); } } // 3. Execute pending migrations for (Class migration : pendingMigrations) { - run(migration, new ObjectMap()); + run(migration, appHome, new ObjectMap(), token); } // 4. Execute target migration for (Class migration : runnableMigrations) { - run(migration, params); + run(migration, appHome, params, token); } } + public List> getPendingMigrations(String version, String token) + throws CatalogException, MigrationException { + validateAdmin(token); + return getPendingMigrations(version); + } + private List> getPendingMigrations(String version) throws MigrationException { // 2.1. Get all available migrations sorted to check if previous migrations have been run List> migrations = getAllSortedAvailableMigrations(); // 2.2. Find position of first migration with version "version" - int pos = 0; + int pos = -1; for (int i = 0; i < migrations.size(); i++) { Class migration = migrations.get(i); Migration annotation = getMigrationAnnotation(migration); @@ -84,29 +110,16 @@ private List> getPendingMigrations(String version break; } } - if (pos == 0) { + if (pos == -1) { throw new MigrationException("Could not find migration for version '" + version + "'"); + } else if (pos == 0) { + return Collections.emptyList(); } // Exclude newer migrations migrations = migrations.subList(0, pos); - // 2.3. Remove migrations already run from list - List migrationIdList = migrations.stream().map(m -> getMigrationAnnotation(m).id()).collect(Collectors.toList()); - OpenCGAResult migrationResult = null; - try { - migrationResult = migrationDBAdaptor.get(migrationIdList); - } catch (CatalogDBException e) { - throw new MigrationException(e.getMessage(), e); - } - Map migrationResultMap = new HashMap<>(); // id: patch - migrationResult.getResults().stream().map(m -> migrationResultMap.put(m.getId(), m)); - - // Remove migrations if they have been run successfully with the proper patch - migrations.removeIf(m -> { - Migration annotation = getMigrationAnnotation(m); - return annotation.patch() <= migrationResultMap.get(annotation.id()).getPatch() - && migrationResultMap.get(annotation.id()).getStatus() == MigrationRun.MigrationStatus.DONE; - }); + // Exclude successfully executed migrations + filterOutExecutedMigrations(migrations); return migrations; } @@ -121,12 +134,28 @@ private Set> getAvailableMigrations() { new SubTypesScanner(), new TypeAnnotationsScanner().filterResultsBy(s -> StringUtils.equals(s, Migration.class.getName())) ) + .addUrls(getUrls()) .filterInputsBy(input -> input != null && input.endsWith(".class")) ); return reflections.getSubTypesOf(MigrationTool.class); } + private static Collection getUrls() { + // TODO: What if there are third party libraries that implement Tools? + // Currently they must contain "opencga" in the jar name. + // e.g. acme-rockets-opencga-5.4.0.jar + Collection urls = new LinkedList<>(); + for (URL url : ClasspathHelper.forClassLoader()) { + String name = url.getPath().substring(url.getPath().lastIndexOf('/') + 1); + if (name.isEmpty() || (name.contains("opencga") && !name.contains("opencga-storage-hadoop-deps"))) { + urls.add(url); + } + } + return urls; + } + + private List> getAllSortedAvailableMigrations() { List> migrations = new ArrayList<>(getAvailableMigrations()); migrations.sort(this::compareTo); @@ -144,8 +173,8 @@ private int compareTo(Class m1, Class m1, Class> getRunnableMigrations(String version, Set domainFilter, - Set languageFilter) { + Set languageFilter) throws MigrationException { if (domainFilter == null || domainFilter.isEmpty()) { domainFilter = EnumSet.allOf(Migration.MigrationDomain.class); @@ -232,10 +261,13 @@ private List> getRunnableMigrations(String versio filteredMigrations.add(migration); } + filteredMigrations.sort(this::compareTo); + filterOutExecutedMigrations(filteredMigrations); return filteredMigrations; } - private void run(Class runnableMigration, ObjectMap params) throws MigrationException { + private void run(Class runnableMigration, String appHome, ObjectMap params, String token) + throws MigrationException { Migration annotation = getMigrationAnnotation(runnableMigration); MigrationTool migrationTool; @@ -245,8 +277,9 @@ private void run(Class runnableMigration, ObjectMap par throw new MigrationException("Can't instantiate class " + runnableMigration + " from migration '" + annotation.id() + "'", e); } - migrationTool.setup(catalogManager, params); + migrationTool.setup(configuration, catalogManager, appHome, params, token); + System.out.println(); logger.info("Executing migration '{}' for version '{}': {}", annotation.id(), annotation.version(), annotation.description()); MigrationRun migrationRun = new MigrationRun(annotation.id(), annotation.description(), annotation.version(), TimeUtils.getDate(), annotation.patch()); @@ -262,11 +295,36 @@ private void run(Class runnableMigration, ObjectMap par try { migrationDBAdaptor.upsert(migrationRun); } catch (CatalogDBException e) { - throw new MigrationException("Could not register migration in OpenCGA"); + throw new MigrationException("Could not register migration in OpenCGA", e); } } } + private void filterOutExecutedMigrations(List> migrations) throws MigrationException { + // Remove migrations successfully executed from list + List migrationIdList = migrations.stream().map(m -> getMigrationAnnotation(m).id()).collect(Collectors.toList()); + OpenCGAResult migrationResult; + try { + migrationResult = migrationDBAdaptor.get(migrationIdList); + } catch (CatalogDBException e) { + throw new MigrationException(e.getMessage(), e); + } + Map migrationResultMap = new HashMap<>(); // id: patch + for (MigrationRun result : migrationResult.getResults()) { + migrationResultMap.put(result.getId(), result); + } + + // Remove migrations if they have been run successfully with the proper patch + migrations.removeIf(m -> { + Migration annotation = getMigrationAnnotation(m); + if (!migrationResultMap.containsKey(annotation.id())) { + return false; + } + return annotation.patch() <= migrationResultMap.get(annotation.id()).getPatch() + && migrationResultMap.get(annotation.id()).getStatus() == MigrationRun.MigrationStatus.DONE; + }); + } + private Migration getMigrationAnnotation(Class migration) { Migration annotation = migration.getAnnotation(Migration.class); return annotation; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java index 76a8d2bcae6..044fbc3227a 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java @@ -1,23 +1,44 @@ package org.opencb.opencga.catalog.migration; +import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.commons.datastore.mongodb.MongoDBConfiguration; +import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.core.config.Configuration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Path; public abstract class MigrationTool { + protected Configuration configuration; protected CatalogManager catalogManager; + protected String appHome; + protected String token; + protected ObjectMap params; + protected final Logger logger; + public MigrationTool() { + this.logger = LoggerFactory.getLogger(this.getClass()); } public final String getId() { return ""; } - public final void setup(CatalogManager catalogManager, ObjectMap params) { + public final void setup(Configuration configuration, CatalogManager catalogManager, String appHome, ObjectMap params, String token) { + this.configuration = configuration; this.catalogManager = catalogManager; + this.appHome = appHome; this.params = params; + this.token = token; } public final void execute() throws MigrationException { @@ -30,6 +51,65 @@ public final void execute() throws MigrationException { } } - protected abstract void run() throws MigrationException; + protected abstract void run() throws CatalogException; + + protected final void runJavascript(Path file) throws MigrationException { + String authentication = ""; + if (StringUtils.isNotEmpty(configuration.getCatalog().getDatabase().getUser()) + && StringUtils.isNotEmpty(configuration.getCatalog().getDatabase().getPassword())) { + authentication = "-u " + configuration.getCatalog().getDatabase().getUser() + " -p " + + configuration.getCatalog().getDatabase().getPassword() + " --authenticationDatabase " + + configuration.getCatalog().getDatabase().getOptions().getOrDefault("authenticationDatabase", "admin") + " "; + } + if (configuration.getCatalog().getDatabase().getOptions() != null + && configuration.getCatalog().getDatabase().getOptions().containsKey(MongoDBConfiguration.SSL_ENABLED) + && Boolean.parseBoolean(configuration.getCatalog().getDatabase().getOptions().get(MongoDBConfiguration.SSL_ENABLED))) { + authentication += "--ssl "; + } + if (configuration.getCatalog().getDatabase().getOptions() != null + && configuration.getCatalog().getDatabase().getOptions().containsKey(MongoDBConfiguration.SSL_INVALID_CERTIFICATES_ALLOWED) + && Boolean.parseBoolean(configuration.getCatalog().getDatabase().getOptions() + .get(MongoDBConfiguration.SSL_INVALID_CERTIFICATES_ALLOWED))) { + authentication += "--sslAllowInvalidCertificates "; + } + if (configuration.getCatalog().getDatabase().getOptions() != null + && configuration.getCatalog().getDatabase().getOptions().containsKey(MongoDBConfiguration.SSL_INVALID_HOSTNAME_ALLOWED) + && Boolean.parseBoolean(configuration.getCatalog().getDatabase().getOptions() + .get(MongoDBConfiguration.SSL_INVALID_HOSTNAME_ALLOWED))) { + authentication += "--sslAllowInvalidHostnames "; + } + if (configuration.getCatalog().getDatabase().getOptions() != null && StringUtils.isNotEmpty( + configuration.getCatalog().getDatabase().getOptions().get(MongoDBConfiguration.AUTHENTICATION_MECHANISM))) { + authentication += "--authenticationMechanism " + + configuration.getCatalog().getDatabase().getOptions().get(MongoDBConfiguration.AUTHENTICATION_MECHANISM) + " "; + } + + String catalogCli = "mongo " + authentication + + StringUtils.join(configuration.getCatalog().getDatabase().getHosts(), ",") + "/" + + catalogManager.getCatalogDatabase() + " " + file.getFileName(); + + logger.info("Running Javascript cli {} from {}", catalogCli, file.getParent()); + ProcessBuilder processBuilder = new ProcessBuilder(catalogCli.split(" ")); + processBuilder.directory(file.getParent().toFile()); + Process p; + try { + p = processBuilder.start(); + BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + while ((line = input.readLine()) != null) { + logger.info(line); + } + p.waitFor(); + input.close(); + } catch (IOException | InterruptedException e) { + throw new MigrationException("Error executing cli: " + e.getMessage(), e); + } + + if (p.exitValue() == 0) { + logger.info("Finished Javascript catalog migration"); + } else { + throw new MigrationException("Error with Javascript catalog migrating!"); + } + } } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java deleted file mode 100644 index c9a187c677b..00000000000 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/Opencga20003.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.opencb.opencga.catalog.migration; - -@Migration(id ="opencga-2.0.3-catalog-java", version = "2.0.3", description = "", domain = Migration.MigrationDomain.CATALOG, - language = Migration.MigrationLanguage.JAVA, rank = 1) -public class Opencga20003 extends MigrationTool { - - @Override - protected void run() throws MigrationException { - - } -} diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/migration/MigrationManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/migration/MigrationManagerTest.java new file mode 100644 index 00000000000..14b42947ad0 --- /dev/null +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/migration/MigrationManagerTest.java @@ -0,0 +1,179 @@ +package org.opencb.opencga.catalog.migration; + +import org.junit.Test; +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.managers.AbstractManagerTest; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.*; + +public class MigrationManagerTest extends AbstractManagerTest { + + @Migration(id ="test-1", version = "0.0.1", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 1) + public static class Migration1 extends MigrationTool { + @Override + protected void run() throws MigrationException { + + } + } + + @Migration(id ="test-2", version = "0.0.1", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 2) + public static class Migration2 extends MigrationTool { + @Override + protected void run() throws MigrationException { + + } + } + + @Migration(id ="test2-1", version = "0.1.0", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 1) + public static class Migration3 extends MigrationTool { + @Override + protected void run() throws MigrationException { + + } + } + + @Migration(id ="test2-2", version = "0.1.0", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 2) + public static class Migration4 extends MigrationTool { + @Override + protected void run() throws MigrationException { + + } + } + + @Migration(id ="test3-1", version = "0.2.0", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 1) + public static class Migration5 extends MigrationTool { + @Override + protected void run() throws MigrationException { + + } + } + + @Migration(id ="test3-2", version = "0.2.0", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 2) + public static class Migration6 extends MigrationTool { + @Override + protected void run() throws MigrationException { + + } + } + + @Migration(id ="test4-1-manual", version = "0.2.1", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 1, manual = true) + public static class Migration7 extends MigrationTool { + @Override + protected void run() throws MigrationException { + + } + } + + @Migration(id ="test4-2", version = "0.2.2", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 1) + public static class Migration8 extends MigrationTool { + @Override + protected void run() throws MigrationException { + + } + } + + @Migration(id ="test4-3", version = "0.2.3", description = "", domain = Migration.MigrationDomain.CATALOG, + language = Migration.MigrationLanguage.JAVA, rank = 1) + public static class Migration9 extends MigrationTool { + @Override + protected void run() throws MigrationException { + + } + } + + @Test + public void testMigration() throws MigrationException, CatalogException { + MigrationManager migrationManager = catalogManager.getMigrationManager(); + String token = catalogManager.getUserManager().loginAsAdmin("admin").getToken(); + + List> pendingMigrations = migrationManager.getPendingMigrations("0.0.1", token); + assertEquals(0, pendingMigrations.size()); + + pendingMigrations = migrationManager.getPendingMigrations("0.1.0", token); + assertEquals(2, pendingMigrations.size()); + for (Class pendingMigration : pendingMigrations) { + Migration annotation = pendingMigration.getAnnotation(Migration.class); + assertTrue(Arrays.asList("test-1", "test-2").contains(annotation.id())); + } + // Run migrations up to 0.0.1 + migrationManager.runMigration("0.0.1", Collections.emptySet(), Collections.emptySet(), "", token); + + pendingMigrations = migrationManager.getPendingMigrations("0.1.0", token); + assertEquals(0, pendingMigrations.size()); + + pendingMigrations = migrationManager.getPendingMigrations("0.2.0", token); + assertEquals(2, pendingMigrations.size()); + for (int i = 0; i < pendingMigrations.size(); i++) { + Class pendingMigration = pendingMigrations.get(i); + Migration annotation = pendingMigration.getAnnotation(Migration.class); + switch (i) { + case 0: + assertEquals("test2-1", annotation.id()); + break; + case 1: + assertEquals("test2-2", annotation.id()); + break; + default: + fail(); + } + } + + pendingMigrations = migrationManager.getPendingMigrations("0.2.1", token); + assertEquals(4, pendingMigrations.size()); + for (int i = 0; i < pendingMigrations.size(); i++) { + Class pendingMigration = pendingMigrations.get(i); + Migration annotation = pendingMigration.getAnnotation(Migration.class); + switch (i) { + case 0: + assertEquals("test2-1", annotation.id()); + break; + case 1: + assertEquals("test2-2", annotation.id()); + break; + case 2: + assertEquals("test3-1", annotation.id()); + break; + case 3: + assertEquals("test3-2", annotation.id()); + break; + default: + fail(); + } + } + migrationManager.runMigration("0.2.0", Collections.emptySet(), Collections.emptySet(), "", token); + + pendingMigrations = migrationManager.getPendingMigrations("0.2.3", token); + assertEquals(2, pendingMigrations.size()); + for (int i = 0; i < pendingMigrations.size(); i++) { + Class pendingMigration = pendingMigrations.get(i); + Migration annotation = pendingMigration.getAnnotation(Migration.class); + switch (i) { + case 0: + assertEquals("test4-1-manual", annotation.id()); + break; + case 1: + assertEquals("test4-2", annotation.id()); + break; + default: + fail(); + } + } + + thrown.expectMessage("manual"); + thrown.expect(MigrationException.class); + migrationManager.runMigration("0.2.2", Collections.emptySet(), Collections.emptySet(), "", token); + } + +} From d0d252ee184d7a61611f29ee68d5d1bef1b20f2b Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 31 May 2021 05:53:04 +0000 Subject: [PATCH 353/412] GitBook: [develop] one page modified --- docs/manual/data-management/sharing-and-permissions/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual/data-management/sharing-and-permissions/README.md b/docs/manual/data-management/sharing-and-permissions/README.md index 180fd16fc37..6164acc3fb4 100644 --- a/docs/manual/data-management/sharing-and-permissions/README.md +++ b/docs/manual/data-management/sharing-and-permissions/README.md @@ -8,7 +8,7 @@ The system enables to define a list of permissions at a member level, being a me ## Users in OpenCGA -Any study has intrinsically defined three different member levels +Any study has intrinsically defined three different membership levels: ### Owner @@ -29,7 +29,7 @@ Apart from _admins,_ there is also an special group called _members_. Any user w * The _admin_ users might want to predefined some permissions any _member_ of a study will have. In such a case, _admin_ users will just add new users to that group and those users will automatically be granted the permissions the group has. * If an _admin_ user wants to completely revoke any permission to one user, by removing that user from the _members_ group, OpenCGA will automatically search for any permissions set for that user in any entity and remove it. -## Decision Algorithm +### Decision Algorithm The next schema provides a visual explanation of the algorithm implemented in Catalog for deciding whether the user has or not access to the data in the context of a study. From 73aac9da29f7c82e9c6fc4d24b98f096ebe717ce Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 31 May 2021 05:53:31 +0000 Subject: [PATCH 354/412] GitBook: [develop] 76 pages modified --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index e529eb440ea..8983e0b1a25 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,7 +4,7 @@ description: Welcome to OpenCGA! # Home -{% hint style="warning" %} +{% hint style="info" %} Development version 2.1.0-alpha {% endhint %} From bae4a01a600ca0b1f55bc8c07ee818251fa01905 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 31 May 2021 11:44:44 +0200 Subject: [PATCH 355/412] app: add migration script, #1730 --- .../app/misc/migration/v2.1.0/migration4.js | 40 +++++++++++++++++++ .../v2_1_0/catalog/javascript/Migration4.java | 19 +++++++++ .../opencga/catalog/managers/FileManager.java | 19 ++++----- .../opencb/opencga/core/models/file/File.java | 3 +- 4 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 opencga-app/app/misc/migration/v2.1.0/migration4.js create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java diff --git a/opencga-app/app/misc/migration/v2.1.0/migration4.js b/opencga-app/app/misc/migration/v2.1.0/migration4.js new file mode 100644 index 00000000000..3fb153c3188 --- /dev/null +++ b/opencga-app/app/misc/migration/v2.1.0/migration4.js @@ -0,0 +1,40 @@ +load("../utils/migrateCollection.js"); + +// Add Circos plot result to SampleVariantQualityControlMetrics #1730 + +// Remove alignmentMetrics +db.sample.update({"qualityControl.alignmentMetrics": {"$exists": true}}, + {"$unset": {"qualityControl.alignmentMetrics": ""}}); + + +// Rename fileIds -> files +migrateCollection("sample", {"qualityControl.fileIds": {"$exists": true}}, {qualityControl: 1}, function(bulk, doc) { + // Rename fileIds for files + if (isNotUndefinedOrNull(doc.qualityControl)) { + doc.qualityControl['files'] = doc.qualityControl.fileIds; + delete doc.qualityControl['fileIds']; + bulk.find({"_id": doc._id}).updateOne({"$set": {"qualityControl": doc.qualityControl}}); + } +}); + + +// Remove vcfFileIds +db.sample.update({"qualityControl.variantMetrics.vcfFileIds": {"$exists": true}}, + {"$unset": {"qualityControl.variantMetrics.vcfFileIds": ""}}); + + +// Initialise fileQualityControl +var fileQC = { + "variant": { + }, + "alignment": { + "fastQcMetrics": {}, + "samtoolsStats": {}, + "samtoolsFlagStats": {}, + "hsMetrics": {} + }, + "coverage": { + "geneCoverageStats": [] + } +}; +db.file.update({"qualityControl": {"$exists": false}}, {"$set": fileQC}); \ No newline at end of file diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java new file mode 100644 index 00000000000..88355ca7b28 --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java @@ -0,0 +1,19 @@ +package org.opencb.opencga.app.migrations.v2_1_0.catalog.javascript; + +import org.opencb.opencga.catalog.migration.Migration; +import org.opencb.opencga.catalog.migration.MigrationException; +import org.opencb.opencga.catalog.migration.MigrationTool; + +import java.nio.file.Path; +import java.nio.file.Paths; + +@Migration(id="2.1.0-CATALOG-JS-4", description = "Update QC fields from Sample and File #1730", version = "2.1.0", + language = Migration.MigrationLanguage.JAVASCRIPT, rank = 4) +public class Migration4 extends MigrationTool { + + @Override + protected void run() throws MigrationException { + Path path = Paths.get(appHome).resolve("misc/migration/v2.1.0/migration4.js"); + runJavascript(path); + } +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java index abf83aa2ed4..37e9ef3fe03 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java @@ -27,7 +27,6 @@ import org.opencb.commons.utils.CollectionUtils; import org.opencb.commons.utils.FileUtils; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.DBIterator; @@ -46,6 +45,7 @@ import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.HookConfiguration; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.CustomStatus; import org.opencb.opencga.core.models.common.Enums; @@ -499,7 +499,7 @@ public OpenCGAResult createFolder(String studyStr, String path, boolean pa switch (checkPathExists(path, study.getUid())) { case FREE_PATH: File file = new File(File.Type.DIRECTORY, File.Format.NONE, File.Bioformat.NONE, path, description, - FileInternal.initialize(), 0, null, null, jobId, null, null, null); + FileInternal.initialize(), 0, null, null, jobId, new FileQualityControl(), null, null); fileDataResult = create(studyStr, file, parents, null, options, token); break; case DIRECTORY_EXISTS: @@ -544,7 +544,7 @@ public OpenCGAResult create(String studyStr, File.Type type, File.Format f String description, long size, Map stats, Map attributes, boolean parents, String content, QueryOptions options, String token) throws CatalogException { File file = new File(type, format, bioformat, path, description, FileInternal.initialize(), size, Collections.emptyList(), null, "", - null, stats, attributes); + new FileQualityControl(), stats, attributes); return create(studyStr, file, parents, content, options, token); } @@ -594,6 +594,7 @@ void validateNewFile(Study study, File file, String sessionId, boolean overwrite file.setJobId(ParamUtils.defaultString(file.getJobId(), "")); file.setModificationDate(file.getCreationDate()); file.setTags(ParamUtils.defaultObject(file.getTags(), ArrayList::new)); + file.setQualityControl(ParamUtils.defaultObject(file.getQualityControl(), FileQualityControl::new)); file.setInternal(ParamUtils.defaultObject(file.getInternal(), FileInternal::new)); file.getInternal().setIndex(ParamUtils.defaultObject(file.getInternal().getIndex(), FileIndex.initialize())); file.getInternal().setStatus(ParamUtils.defaultObject(file.getInternal().getStatus(), new FileStatus(FileStatus.READY))); @@ -676,7 +677,7 @@ private OpenCGAResult register(Study study, File file, List existi newParent = true; File parentFile = new File(File.Type.DIRECTORY, File.Format.NONE, File.Bioformat.NONE, parentPath, "", new FileInternal(new FileStatus(FileStatus.READY), new FileIndex(), Collections.emptyMap(), new MissingSamples()), - 0, Collections.emptyList(), null, "", null, Collections.emptyMap(), Collections.emptyMap()); + 0, Collections.emptyList(), null, "", new FileQualityControl(), Collections.emptyMap(), Collections.emptyMap()); validateNewFile(study, parentFile, sessionId, false); parentFileId = register(study, parentFile, existingSamples, nonExistingSamples, parents, options, sessionId) .first().getUid(); @@ -3103,8 +3104,8 @@ private void createParents(Study study, String userId, URI studyURI, Path path, // Create the folder in catalog File folder = new File(path.getFileName().toString(), File.Type.DIRECTORY, File.Format.PLAIN, File.Bioformat.NONE, completeURI, stringPath, null, TimeUtils.getTime(), TimeUtils.getTime(), "", false, 0, null, new FileExperiment(), - Collections.emptyList(), Collections.emptyList(), "", studyManager.getCurrentRelease(study), Collections.emptyList(), null, - null, new CustomStatus(), FileInternal.initialize(), null); + Collections.emptyList(), Collections.emptyList(), "", studyManager.getCurrentRelease(study), Collections.emptyList(), + new FileQualityControl(), null, new CustomStatus(), FileInternal.initialize(), null); folder.setUuid(UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.FILE)); checkHooks(folder, study.getFqn(), HookConfiguration.Stage.CREATE); fileDBAdaptor.insert(study.getUid(), folder, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), @@ -3307,7 +3308,7 @@ public FileVisitResult preVisitDirectory(URI dir, BasicFileAttributes attrs) thr File.Bioformat.NONE, dir, destinyPath, null, TimeUtils.getTime(), TimeUtils.getTime(), params.getDescription(), true, 0, new Software(), new FileExperiment(), Collections.emptyList(), relatedFiles, "", studyManager.getCurrentRelease(study), Collections.emptyList(), - null, Collections.emptyMap(), + new FileQualityControl(), Collections.emptyMap(), params.getStatus() != null ? params.getStatus().toCustomStatus() : new CustomStatus(), FileInternal.initialize(), Collections.emptyMap()); folder.setUuid(UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.FILE)); @@ -3366,7 +3367,7 @@ public FileVisitResult visitFile(URI fileUri, BasicFileAttributes attrs) throws File.Bioformat.NONE, fileUri, destinyPath, null, TimeUtils.getTime(), TimeUtils.getTime(), params.getDescription(), true, size, new Software(), new FileExperiment(), Collections.emptyList(), relatedFiles, "", studyManager.getCurrentRelease(study), Collections.emptyList(), - null, Collections.emptyMap(), + new FileQualityControl(), Collections.emptyMap(), params.getStatus() != null ? params.getStatus().toCustomStatus() : new CustomStatus(), internal, new HashMap<>()); subfile.setUuid(UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.FILE)); @@ -3457,7 +3458,7 @@ OpenCGAResult registerFile(Study study, String filePath, URI fileUri, Stri File subfile = new File(Paths.get(filePath).getFileName().toString(), File.Type.FILE, File.Format.UNKNOWN, File.Bioformat.NONE, fileUri, filePath, "", TimeUtils.getTime(), TimeUtils.getTime(), "", isExternal(study, filePath, fileUri), size, new Software(), new FileExperiment(), Collections.emptyList(), - Collections.emptyList(), jobId, studyManager.getCurrentRelease(study), Collections.emptyList(), null, + Collections.emptyList(), jobId, studyManager.getCurrentRelease(study), Collections.emptyList(), new FileQualityControl(), Collections.emptyMap(), new CustomStatus(), FileInternal.initialize(), Collections.emptyMap()); subfile.setUuid(UuidUtils.generateOpenCgaUuid(UuidUtils.Entity.FILE)); checkHooks(subfile, study.getFqn(), HookConfiguration.Stage.CREATE); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/File.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/File.java index 3604cf512c4..7db301bf885 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/file/File.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/file/File.java @@ -86,7 +86,8 @@ public File(String name, Type type, Format format, Bioformat bioformat, String p long size, int release) { this(name, type, format, bioformat, uri, path, null, TimeUtils.getTime(), TimeUtils.getTime(), description, false, size, new Software(), new FileExperiment(), Collections.emptyList(), Collections.emptyList(), "", release, - Collections.emptyList(), null, Collections.emptyMap(), new CustomStatus(), internal, Collections.emptyMap()); + Collections.emptyList(), new FileQualityControl(), Collections.emptyMap(), new CustomStatus(), internal, + Collections.emptyMap()); } public File(Type type, Format format, Bioformat bioformat, String path, String description, FileInternal internal, long size, From e0769bfdf3df58154f3b6f4c5359ec24f2a98e65 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 31 May 2021 12:30:52 +0200 Subject: [PATCH 356/412] catalog: sort migrations by rank directly --- .../catalog/migration/MigrationManager.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java index 25b9518eee1..1b2b014878e 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java @@ -163,7 +163,7 @@ private List> getAllSortedAvailableMigrations() { } /** - * Sort MigrationTools by version -> domain -> language -> rank. + * Sort MigrationTools by version -> rank. * * @param m1 MigrationTool 1. * @param m2 MigrationTool 2. @@ -210,18 +210,6 @@ private int compareTo(Class m1, Class m2Annotation.rank()) { return 1; From afc258bbfff02578fc03995bcb70b72b0fa65619 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 31 May 2021 13:18:15 +0200 Subject: [PATCH 357/412] app: fix migration ids --- .../opencga/app/migrations/v2_0_3/catalog/java/Migration1.java | 2 +- .../app/migrations/v2_1_0/catalog/javascript/Migration1.java | 2 +- .../app/migrations/v2_1_0/catalog/javascript/Migration2.java | 2 +- .../app/migrations/v2_1_0/catalog/javascript/Migration3.java | 2 +- .../app/migrations/v2_1_0/catalog/javascript/Migration4.java | 2 +- .../org/opencb/opencga/catalog/migration/MigrationManager.java | 3 ++- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_0_3/catalog/java/Migration1.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_0_3/catalog/java/Migration1.java index 839036b5adc..5007ceb9008 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_0_3/catalog/java/Migration1.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_0_3/catalog/java/Migration1.java @@ -9,7 +9,7 @@ import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.study.Study; -@Migration(id="2.0.3-CATALOG-JAVA-1", description = "Recalculate roles from Family #1763", version = "2.0.3", rank = 1) +@Migration(id="recalculate_roles", description = "Recalculate roles from Family #1763", version = "2.0.3", rank = 1) public class Migration1 extends MigrationTool { @Override diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java index e23092ad346..4fda939b5ca 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java @@ -7,7 +7,7 @@ import java.nio.file.Path; import java.nio.file.Paths; -@Migration(id="2.1.0-CATALOG-JS-1", description = "Create index for sample RGA status #1693", version = "2.1.0", +@Migration(id="build_rga_indexes", description = "Create index for sample RGA status #1693", version = "2.1.0", language = Migration.MigrationLanguage.JAVASCRIPT, rank = 1) public class Migration1 extends MigrationTool { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java index da85427981d..f7302b062bf 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java @@ -7,7 +7,7 @@ import java.nio.file.Path; import java.nio.file.Paths; -@Migration(id="2.1.0-CATALOG-JS-2", description = "Initialise all userIds arrays from groups #1735", version = "2.1.0", +@Migration(id="init_userId_group_arrays", description = "Initialise all userIds arrays from groups #1735", version = "2.1.0", language = Migration.MigrationLanguage.JAVASCRIPT, rank = 2) public class Migration2 extends MigrationTool { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java index 15f233c7dcf..8ed04841eda 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java @@ -7,7 +7,7 @@ import java.nio.file.Path; import java.nio.file.Paths; -@Migration(id="2.1.0-CATALOG-JS-3", description = "Initialise panels array in Clinical Analysis #1759", version = "2.1.0", +@Migration(id="init_ca_panel_arrays", description = "Initialise panels array in Clinical Analysis #1759", version = "2.1.0", language = Migration.MigrationLanguage.JAVASCRIPT, rank = 3) public class Migration3 extends MigrationTool { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java index 88355ca7b28..59e1267cc15 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java @@ -7,7 +7,7 @@ import java.nio.file.Path; import java.nio.file.Paths; -@Migration(id="2.1.0-CATALOG-JS-4", description = "Update QC fields from Sample and File #1730", version = "2.1.0", +@Migration(id="update_qc_file_sample_fields", description = "Update QC fields from Sample and File #1730", version = "2.1.0", language = Migration.MigrationLanguage.JAVASCRIPT, rank = 4) public class Migration4 extends MigrationTool { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java index 1b2b014878e..a371f81d5bb 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java @@ -217,7 +217,8 @@ private int compareTo(Class m1, Class Date: Mon, 31 May 2021 13:40:26 +0200 Subject: [PATCH 358/412] app: add new migration patch --- opencga-app/app/misc/migration/v2.1.0/migration4.js | 3 ++- .../app/migrations/v2_1_0/catalog/javascript/Migration4.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/opencga-app/app/misc/migration/v2.1.0/migration4.js b/opencga-app/app/misc/migration/v2.1.0/migration4.js index 3fb153c3188..4da6df224df 100644 --- a/opencga-app/app/misc/migration/v2.1.0/migration4.js +++ b/opencga-app/app/misc/migration/v2.1.0/migration4.js @@ -37,4 +37,5 @@ var fileQC = { "geneCoverageStats": [] } }; -db.file.update({"qualityControl": {"$exists": false}}, {"$set": fileQC}); \ No newline at end of file +db.file.update({"qualityControl": {"$exists": false}}, {"$set": {"qualityControl": fileQC}}, + "$unset": {"variant": "", "alignment": "", "coverage": ""}); \ No newline at end of file diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java index 59e1267cc15..f545adb698f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java @@ -8,7 +8,7 @@ import java.nio.file.Paths; @Migration(id="update_qc_file_sample_fields", description = "Update QC fields from Sample and File #1730", version = "2.1.0", - language = Migration.MigrationLanguage.JAVASCRIPT, rank = 4) + language = Migration.MigrationLanguage.JAVASCRIPT, rank = 4, patch = 2) public class Migration4 extends MigrationTool { @Override From 2e4728feb2a3ee9250d432daa01ccdbba5d22a5c Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 31 May 2021 13:46:07 +0200 Subject: [PATCH 359/412] app: new migration patch --- opencga-app/app/misc/migration/v2.1.0/migration4.js | 4 ++-- .../app/migrations/v2_1_0/catalog/javascript/Migration4.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/opencga-app/app/misc/migration/v2.1.0/migration4.js b/opencga-app/app/misc/migration/v2.1.0/migration4.js index 4da6df224df..870eeaf59d6 100644 --- a/opencga-app/app/misc/migration/v2.1.0/migration4.js +++ b/opencga-app/app/misc/migration/v2.1.0/migration4.js @@ -37,5 +37,5 @@ var fileQC = { "geneCoverageStats": [] } }; -db.file.update({"qualityControl": {"$exists": false}}, {"$set": {"qualityControl": fileQC}}, - "$unset": {"variant": "", "alignment": "", "coverage": ""}); \ No newline at end of file +db.file.update({"qualityControl": {"$exists": false}}, {"$set": {"qualityControl": fileQC}, + "$unset": {"variant": "", "alignment": "", "coverage": ""}}); \ No newline at end of file diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java index f545adb698f..6c7a3cb8e14 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java @@ -8,7 +8,7 @@ import java.nio.file.Paths; @Migration(id="update_qc_file_sample_fields", description = "Update QC fields from Sample and File #1730", version = "2.1.0", - language = Migration.MigrationLanguage.JAVASCRIPT, rank = 4, patch = 2) + language = Migration.MigrationLanguage.JAVASCRIPT, rank = 4, patch = 3) public class Migration4 extends MigrationTool { @Override From 8522db0c4977636c04426b79a1836c8328ec6384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Mon, 31 May 2021 13:57:25 +0200 Subject: [PATCH 360/412] analysis: improve mutational signature analysis, #1765 --- .../analysis/sample/qc/SampleQcAnalysis.java | 8 +- .../MutationalSignatureAnalysis.java | 235 +++++--- ...ationalSignatureLocalAnalysisExecutor.java | 519 +++++++++++------- .../VariantInternalCommandExecutor.java | 31 +- .../options/VariantCommandOptions.java | 31 +- .../analysis/VariantCommandExecutor.java | 17 +- .../MutationalSignatureAnalysisParams.java | 63 ++- .../variant/SampleQcAnalysisParams.java | 41 +- .../MutationalSignatureAnalysisExecutor.java | 221 ++++++-- .../rest/analysis/VariantWebService.java | 35 +- 10 files changed, 835 insertions(+), 366 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index c7c560f8809..56f7c2f5577 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -168,9 +168,13 @@ protected void run() throws ToolException { } if (runSignature) { - // Run mutational signatures - params = new MutationalSignatureAnalysisParams(analysisParams.getSample(), null) + // Run mutational signature + params = new MutationalSignatureAnalysisParams(analysisParams.getMutationalSignatureId(), + analysisParams.getMutationalSignatureDescription(), analysisParams.getSample(), + analysisParams.getMutationalSignatureQuery(), true, null) .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudy())); + // Be sure to update sample quality control + params.put(MutationalSignatureAnalysis.QC_UPDATE_KEYNAME, true); signatureJobResult = catalogManager.getJobManager() .submit(getStudy(), MutationalSignatureAnalysis.ID, Enums.Priority.MEDIUM, params, null, "Job generated by " diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java index 4b4af63c548..32387755a5a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java @@ -18,143 +18,214 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.clinical.qc.MutationalSignature; import org.opencb.biodata.models.clinical.qc.Signature; +import org.opencb.biodata.models.clinical.qc.SignatureFitting; +import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.ResourceUtils; -import org.opencb.opencga.analysis.tools.OpenCgaTool; +import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.sample.Sample; +import org.opencb.opencga.core.models.sample.SampleQualityControl; +import org.opencb.opencga.core.models.sample.SampleUpdateParams; +import org.opencb.opencga.core.models.variant.MutationalSignatureAnalysisParams; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; +import org.opencb.opencga.core.tools.annotations.ToolParams; import org.opencb.opencga.core.tools.variant.MutationalSignatureAnalysisExecutor; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Path; -import java.util.ArrayList; +import java.util.Base64; +import java.util.Collections; import java.util.List; +import java.util.Map; @Tool(id = MutationalSignatureAnalysis.ID, resource = Enums.Resource.VARIANT) -public class MutationalSignatureAnalysis extends OpenCgaTool { +public class MutationalSignatureAnalysis extends OpenCgaToolScopeStudy { public static final String ID = "mutational-signature"; public static final String DESCRIPTION = "Run mutational signature analysis for a given sample."; public final static String SIGNATURES_FILENAME = "signatures_probabilities_v2.txt"; + public final static String GENOME_CONTEXT_FILENAME = "genome_context.txt"; - private String study; - private String sampleName; + public final static String QC_UPDATE_KEYNAME = "qcUpdate"; - private Path refGenomePath; - private Path mutationalSignaturePath; + @ToolParams + private MutationalSignatureAnalysisParams signatureParams = new MutationalSignatureAnalysisParams(); - /** - * Study of the sample. - * @param study Study id - * @return this - */ - public MutationalSignatureAnalysis setStudy(String study) { - this.study = study; - return this; - } - - /** - * Sample. - * @param sampleName Sample name - * @return this - */ - public MutationalSignatureAnalysis setSampleName(String sampleName) { - this.sampleName = sampleName; - return this; - } + private String assembly; @Override protected void check() throws Exception { super.check(); setUpStorageEngineExecutor(study); - if (study == null || study.isEmpty()) { + if (StringUtils.isEmpty(getStudy())) { throw new ToolException("Missing study"); } - try { - study = catalogManager.getStudyManager().get(study, null, token).first().getFqn(); + if (StringUtils.isEmpty(signatureParams.getSample())) { + throw new ToolException("Missing sample"); + } + assembly = ResourceUtils.getAssembly(catalogManager, study, token); + if (StringUtils.isEmpty(assembly)) { + throw new ToolException("Missing assembly for study '" + study + "'"); + } + // TODO: improve this + switch (assembly.toUpperCase()) { + case "GRCH37": + assembly = "GRCh37"; + break; + case "GRCH38": + assembly = "GRCh38"; + break; + default: + break; + } - if (StringUtils.isNotEmpty(sampleName)) { - OpenCGAResult sampleResult = catalogManager.getSampleManager().get(study, sampleName, new QueryOptions(), token); - if (sampleResult.getNumResults() != 1) { - throw new ToolException("Unable to compute mutational signature analysis. Sample '" + sampleName + "' not found"); - } + + try { + study = catalogManager.getStudyManager().get(study, QueryOptions.empty(), token).first().getFqn(); + + OpenCGAResult sampleResult = catalogManager.getSampleManager().get(study, signatureParams.getSample(), + QueryOptions.empty(), token); + if (sampleResult.getNumResults() != 1) { + throw new ToolException("Unable to compute mutational signature analysis. Sample '" + signatureParams.getSample() + + "' not found"); } } catch (CatalogException e) { throw new ToolException(e); } - - addAttribute("sampleName", sampleName); - } - - @Override - protected List getSteps() { - List steps = new ArrayList<>(); - steps.add("download-ref-genomes"); - steps.add("download-mutational-signatures"); - steps.add(getId()); - return steps; } @Override protected void run() throws ToolException { - step("download-ref-genomes", () -> { - String assembly = ResourceUtils.getAssembly(catalogManager, study, token); - ResourceUtils.DownloadedRefGenome refGenome = ResourceUtils.downloadRefGenome(assembly, getScratchDir(), getOpencgaHome()); - - if (refGenome == null) { - throw new ToolException("Something wrong happened accessing reference genome, check local path and public repository"); - } - - refGenomePath = refGenome.getGzFile().toPath(); - }); - - step("download-mutational-signatures", () -> { - File signatureFile = ResourceUtils.downloadAnalysis(MutationalSignatureAnalysis.ID, SIGNATURES_FILENAME, getOutDir(), - getOpencgaHome()); - if (signatureFile == null) { - throw new ToolException("Error downloading mutational signatures file from " + ResourceUtils.URL); - } - - mutationalSignaturePath = signatureFile.toPath(); - }); - step(getId(), () -> { getToolExecutor(MutationalSignatureAnalysisExecutor.class) .setStudy(study) - .setSampleName(sampleName) - .setRefGenomePath(refGenomePath) - .setMutationalSignaturePath(mutationalSignaturePath) - .setOpenCgaHome(getOpencgaHome()) + .setAssembly(assembly) + .setSample(signatureParams.getSample()) + .setQueryId(signatureParams.getId()) + .setQueryDescription(signatureParams.getDescription()) + .setQuery(signatureParams.getQuery()) + .setFitting(signatureParams.isFitting()) .execute(); + + + // Update quality control for the catalog sample + if (params.containsKey(QC_UPDATE_KEYNAME)) { + OpenCGAResult sampleResult = getCatalogManager().getSampleManager().get(getStudy(), signatureParams.getSample(), + QueryOptions.empty(), getToken()); + Sample sample = sampleResult.first(); + if (sample != null) { + Signature signature = null; + // Get genome context file + for (java.io.File imgFile : getOutDir().toFile().listFiles()) { + if (imgFile.getName().equals(GENOME_CONTEXT_FILENAME)) { + Signature.GenomeContextCount[] genomeContextCounts = parseGenomeContextFile(imgFile); + signature = new Signature(signatureParams.getId(), signatureParams.getDescription(), + (ObjectMap) signatureParams.getQuery().toParams(), "SNV", genomeContextCounts, Collections.emptyList()); + break; + } + } + if (signature != null) { + SampleQualityControl qc = sampleResult.first().getQualityControl(); + if (qc == null) { + qc = new SampleQualityControl(); + } + qc.getVariantMetrics().getSignatures().add(signature); + + catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), + QueryOptions.empty(), getToken()); + } + } + } }); } - public static Signature.SignatureCount[] parseSignatureCounts(File contextFile) throws ToolException { - try { - Signature.SignatureCount[] sigCounts = null; - if (contextFile.exists()) { - List lines = FileUtils.readLines(contextFile, Charset.defaultCharset()); - sigCounts = new Signature.SignatureCount[lines.size() - 1]; - for (int i = 1; i < lines.size(); i++) { - String[] fields = lines.get(i).split("\t"); - sigCounts[i - 1] = new Signature.SignatureCount(fields[2], Math.round(Float.parseFloat((fields[3])))); - } + private Signature.GenomeContextCount[] parseGenomeContextFile(File contextFile) throws IOException { + // Genome context counts + if (contextFile.exists()) { + List lines = FileUtils.readLines(contextFile, Charset.defaultCharset()); + Signature.GenomeContextCount[] sigCounts = new Signature.GenomeContextCount[lines.size() - 1]; + for (int i = 1; i < lines.size(); i++) { + String[] fields = lines.get(i).split("\t"); + sigCounts[i - 1] = new Signature.GenomeContextCount(fields[2], Math.round(Float.parseFloat((fields[3])))); } return sigCounts; - } catch (IOException e) { - throw new ToolException(e); } + return null; + } + + public MutationalSignature parse(Path dir) throws IOException { + MutationalSignature result = new MutationalSignature(); + + // Context counts + File contextFile = dir.resolve("context.txt").toFile(); + if (contextFile.exists()) { + List lines = FileUtils.readLines(contextFile, Charset.defaultCharset()); + Signature.GenomeContextCount[] sigCounts = new Signature.GenomeContextCount[lines.size() - 1]; + for (int i = 1; i < lines.size(); i++) { + String[] fields = lines.get(i).split("\t"); + sigCounts[i-1] = new Signature.GenomeContextCount(fields[2], Math.round(Float.parseFloat((fields[3])))); + } + result.setSignature(new Signature(signatureParams.getId(), signatureParams.getDescription(), + signatureParams.getQuery() == null ? null : (ObjectMap) signatureParams.getQuery().toParams(), "SNV", sigCounts, + Collections.emptyList())); + } + + // Signatures coefficients + File coeffsFile = dir.resolve("signature_coefficients.json").toFile(); + if (coeffsFile.exists()) { + SignatureFitting fitting = new SignatureFitting() + .setMethod("GEL") + .setSignatureSource("Cosmic") + .setSignatureVersion("2.0"); + + Map content = JacksonUtils.getDefaultObjectMapper().readValue(coeffsFile, Map.class); + Map coefficients = (Map) content.get("coefficients"); + SignatureFitting.Score[] scores = new SignatureFitting.Score[coefficients.size()]; + int i = 0; + for (Object key : coefficients.keySet()) { + Number coeff = (Number) coefficients.get(key); + scores[i++] = new SignatureFitting.Score((String) key, coeff.doubleValue()); + } + fitting.setScores(scores); + fitting.setCoeff((Double) content.get("rss")); + + // Signature summary image + File imgFile = dir.resolve("signature_summary.png").toFile(); + if (imgFile.exists()) { + FileInputStream fileInputStreamReader = new FileInputStream(imgFile); + byte[] bytes = new byte[(int) imgFile.length()]; + fileInputStreamReader.read(bytes); + + fitting.setImage(new String(Base64.getEncoder().encode(bytes), "UTF-8")); + } + + result.setFitting(fitting); + } + + return result; + } + + public MutationalSignatureAnalysisParams getSignatureParams() { + return signatureParams; + } + + public MutationalSignatureAnalysis setSignatureParams(MutationalSignatureAnalysisParams signatureParams) { + this.signatureParams = signatureParams; + return this; } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java index b2f7d95f04a..f8152fbfedd 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java @@ -20,11 +20,6 @@ import htsjdk.samtools.reference.FastaSequenceIndex; import htsjdk.samtools.reference.ReferenceSequence; import htsjdk.samtools.util.GZIIndex; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.io.FileUtils; -import org.opencb.biodata.models.clinical.qc.MutationalSignature; -import org.opencb.biodata.models.clinical.qc.Signature; -import org.opencb.biodata.models.clinical.qc.SignatureFitting; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.commons.datastore.core.Query; @@ -35,10 +30,10 @@ import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.core.common.GitRepositoryState; -import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.exceptions.ToolExecutorException; import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.response.VariantQueryResult; import org.opencb.opencga.core.tools.annotations.ToolExecutor; import org.opencb.opencga.core.tools.variant.MutationalSignatureAnalysisExecutor; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; @@ -48,11 +43,11 @@ import org.slf4j.LoggerFactory; import java.io.*; -import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import static org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis.GENOME_CONTEXT_FILENAME; import static org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis.SIGNATURES_FILENAME; @ToolExecutor(id="opencga-local", tool = MutationalSignatureAnalysis.ID, @@ -61,247 +56,389 @@ public class MutationalSignatureLocalAnalysisExecutor extends MutationalSignatur public final static String R_DOCKER_IMAGE = "opencb/opencga-r:" + GitRepositoryState.get().getBuildVersion(); - public final static String CONTEXT_FILENAME = "context.txt"; + private Path opencgaHome; private Logger logger = LoggerFactory.getLogger(this.getClass()); - private VariantStorageManager storageManager; - - public MutationalSignatureLocalAnalysisExecutor() { - } - - public MutationalSignatureLocalAnalysisExecutor(VariantStorageManager storageManager) { - this.storageManager = storageManager; - } - @Override - public VariantStorageManager getVariantStorageManager() throws ToolExecutorException { - if (storageManager == null) { - storageManager = StorageToolExecutor.super.getVariantStorageManager(); - } - return storageManager; - } + public void run() throws ToolException, CatalogException, IOException, StorageEngineException { + opencgaHome = Paths.get(getExecutorParams().getString("opencgaHome")); - @Override - public void run() throws ToolException, IOException { - // Context index filename - File indexFile = getOutDir().resolve(getContextIndexFilename(getSampleName())).toFile(); - PrintWriter pw = new PrintWriter(indexFile); - try { - // Compute signature profile: contextual frequencies of each type of base substitution + // Get first variant to check where the genome context is stored + Query query = new Query(); + if (getQuery() != null) { + query.putAll(getQuery().toParams()); + } + query.append(VariantQueryParam.TYPE.key(), VariantType.SNV); - Query query = new Query() - .append(VariantQueryParam.STUDY.key(), getStudy()) - .append(VariantQueryParam.SAMPLE.key(), getSampleName()) - .append(VariantQueryParam.TYPE.key(), VariantType.SNV); + QueryOptions queryOptions = new QueryOptions(); + queryOptions.append(QueryOptions.INCLUDE, "id"); + queryOptions.append(QueryOptions.LIMIT, "1"); + + VariantQueryResult variantQueryResult = getVariantStorageManager().get(query, queryOptions, getToken()); + Variant variant = variantQueryResult.first(); + if (variant == null) { + // Nothing to do + addWarning("None variant found for that mutational signature query"); + return; + } - QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id"); + // Check if genome context is stored in the sample data + if (false) { + // Run mutational analysis taking into account that the genome context is stored in the the sample data + computeFromSampleData(); + } else { + // Run mutational analysis taking into account that the genome context is stored in an index file + computeFromContextFile(); + } + } - // Get variant iterator - VariantDBIterator iterator = getVariantIterator(query, queryOptions); + private void computeFromSampleData() throws ToolExecutorException { + // Get variant iterator + Query query = new Query(); + if (getQuery() != null) { + query.putAll(getQuery().toParams()); + } + query.append(VariantQueryParam.TYPE.key(), VariantType.SNV); - // Read mutation context from reference genome (.gz, .gz.fai and .gz.gzi files) - String base = getRefGenomePath().toAbsolutePath().toString(); - BlockCompressedIndexedFastaSequenceFile indexed = new BlockCompressedIndexedFastaSequenceFile(getRefGenomePath(), - new FastaSequenceIndex(new File(base + ".fai")), GZIIndex.loadIndex(Paths.get(base + ".gzi"))); + QueryOptions queryOptions = new QueryOptions(); + queryOptions.append(QueryOptions.INCLUDE, "id"); + try { + VariantDBIterator iterator = getVariantStorageManager().iterator(query, queryOptions, getToken()); Map> countMap = initFreqMap(); while (iterator.hasNext()) { Variant variant = iterator.next(); - // Accessing to the context sequence and write it into the context index file - ReferenceSequence refSeq = indexed.getSubsequenceAt(variant.getChromosome(), variant.getStart() - 1, - variant.getEnd() + 1); - String sequence = new String(refSeq.getBases()); - - // Write context index - pw.println(variant.toString() + "\t" + sequence); - // Update count map - updateCountMap(variant, sequence, countMap); + String context = ""; + updateCountMap(variant, context, countMap); } // Write context counts - writeCountMap(countMap, getOutDir().resolve(CONTEXT_FILENAME).toFile()); + writeCountMap(countMap, getOutDir().resolve(GENOME_CONTEXT_FILENAME).toFile()); - // Close context index file - pw.close(); + // Run R script + if (isFitting()) { + executeRScript(); + } - // Execute R script in docker - executeRScript(); - } catch (Exception e) { + } catch (CatalogException | StorageEngineException | ToolException | IOException e) { throw new ToolExecutorException(e); } - - // Check output files - if (!new File(getOutDir() + "/signature_summary.png").exists() - || !new File(getOutDir() + "/signature_coefficients.json").exists()) { - String msg = "Something wrong executing mutational signature."; - throw new ToolException(msg); - } } - public MutationalSignature query(Query query, QueryOptions queryOptions) - throws CatalogException, ToolException, StorageEngineException, IOException { - - File signatureFile = ResourceUtils.downloadAnalysis(MutationalSignatureAnalysis.ID, SIGNATURES_FILENAME, getOutDir(), - getOpenCgaHome()); - if (signatureFile == null) { - throw new ToolException("Error downloading mutational signatures file from " + ResourceUtils.URL); - } - setMutationalSignaturePath(signatureFile.toPath()); - - // Get context index filename - String name = getContextIndexFilename(getSampleName()); - Query fileQuery = new Query("name", name); - QueryOptions fileQueryOptions = new QueryOptions("include", "uri"); - OpenCGAResult fileResult = getVariantStorageManager().getCatalogManager() - .getFileManager().search(getStudy(), fileQuery, fileQueryOptions, getToken()); - - if (CollectionUtils.isEmpty(fileResult.getResults())) { - throw new ToolException("Missing mutational signature context index file for sample " + getSampleName() + " in catalog"); - } - + private void computeFromContextFile() throws ToolExecutorException { + // Context index filename File indexFile = null; - long maxSize = 0; - for (org.opencb.opencga.core.models.file.File file : fileResult.getResults()) { - File auxFile = new File(file.getUri().getPath()); - if (auxFile.exists() && auxFile.length() > maxSize) { - maxSize = auxFile.length(); - indexFile = auxFile; + String name = getContextIndexFilename(getSample()); + try { + Query fileQuery = new Query("name", name); + QueryOptions fileQueryOptions = new QueryOptions("include", "uri"); + OpenCGAResult fileResult = getVariantStorageManager().getCatalogManager() + .getFileManager().search(getStudy(), fileQuery, fileQueryOptions, getToken()); + + long maxSize = 0; + for (org.opencb.opencga.core.models.file.File file : fileResult.getResults()) { + File auxFile = new File(file.getUri().getPath()); + if (auxFile.exists() && auxFile.length() > maxSize) { + maxSize = auxFile.length(); + indexFile = auxFile; + } } + } catch (CatalogException e) { + throw new ToolExecutorException(e); } + if (indexFile == null) { - throw new ToolException("Missing mutational signature context index file for sample " + getSampleName()); + // The genome context file does not exist, we have to create it !!! + indexFile = getOutDir().resolve(getContextIndexFilename(getSample())).toFile(); + createGenomeContextFile(indexFile); } - // Read context index - long start = System.currentTimeMillis(); - Map indexMap = new HashMap<>(); - BufferedReader br = new BufferedReader( new FileReader(indexFile)); - String line; - while ( (line = br.readLine()) != null ){ - String[] parts = line.split("\t"); - indexMap.put(parts[0], parts[1]); + if (!indexFile.exists()) { + throw new ToolExecutorException("Could not create the genome context index file for sample " + getSample()); } - // Get variant iterator - query.append(VariantQueryParam.TYPE.key(), VariantType.SNV); - queryOptions.append(QueryOptions.INCLUDE, "id"); - VariantDBIterator iterator = getVariantIterator(query, queryOptions); + try { + // Read context index + Map indexMap = new HashMap<>(); + BufferedReader br = new BufferedReader(new FileReader(indexFile)); + String line; + while ((line = br.readLine()) != null) { + String[] parts = line.split("\t"); + indexMap.put(parts[0], parts[1]); + } - Map> countMap = initFreqMap(); + // Get variant iterator + Query query = new Query(); + if (getQuery() != null) { + query.putAll(getQuery().toParams()); + } + query.append(VariantQueryParam.TYPE.key(), VariantType.SNV); - while (iterator.hasNext()) { - Variant variant = iterator.next(); + QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id"); - // Update count map - updateCountMap(variant, indexMap.get(variant.toString()), countMap); - } + VariantDBIterator iterator = getVariantStorageManager().iterator(query, queryOptions, getToken()); - // Write context counts - writeCountMap(countMap, getOutDir().resolve(CONTEXT_FILENAME).toFile()); + Map> countMap = initFreqMap(); - // Run R script - if (getExecutorParams().getBoolean("fitting")) { - executeRScript(); - } + while (iterator.hasNext()) { + Variant variant = iterator.next(); - return parse(getOutDir()); - } - - private void updateCountMap(Variant variant, String sequence, Map> countMap) { - String k, seq; + // Update count map + updateCountMap(variant, indexMap.get(variant.toString()), countMap); + } - String key = variant.getReference() + ">" + variant.getAlternate(); + // Write context counts + writeCountMap(countMap, getOutDir().resolve(GENOME_CONTEXT_FILENAME).toFile()); - if (countMap.containsKey(key)) { - k = key; - seq = sequence; - } else { - k = MutationalSignatureAnalysisExecutor.complement(key); - seq = MutationalSignatureAnalysisExecutor.reverseComplement(sequence); - } - if (countMap.get(k).containsKey(seq)) { - countMap.get(k).put(seq, countMap.get(k).get(seq) + 1); - } else { - logger.error("Something wrong happened counting mutational signature substitutions: variant = " + variant.toString() - + ", key = " + key + ", k = " + k + ", sequence = " + sequence + ", seq = " + seq); + // Run R script + if (isFitting()) { + executeRScript(); + } + + } catch (IOException | CatalogException | StorageEngineException | ToolException e) { + throw new ToolExecutorException(e); } } - private VariantDBIterator getVariantIterator(Query query, QueryOptions queryOptions) throws ToolExecutorException, CatalogException, - StorageEngineException { - VariantStorageManager storageManager = getVariantStorageManager(); + private void createGenomeContextFile(File indexFile) throws ToolExecutorException { + try { + // First, + ResourceUtils.DownloadedRefGenome refGenome = ResourceUtils.downloadRefGenome(getAssembly(), getOutDir(), opencgaHome); - // Compute signature profile: contextual frequencies of each type of base substitution - return storageManager.iterator(query, queryOptions, getToken()); - } + if (refGenome == null) { + throw new ToolExecutorException("Something wrong happened accessing reference genome, check local path and public repository"); + } - private String executeRScript() throws IOException { - String rScriptPath = getExecutorParams().getString("opencgaHome") + "/analysis/R/" + getToolId(); - List> inputBindings = new ArrayList<>(); - inputBindings.add(new AbstractMap.SimpleEntry<>(rScriptPath, "/data/input")); - AbstractMap.SimpleEntry outputBinding = new AbstractMap.SimpleEntry<>(getOutDir().toAbsolutePath().toString(), - "/data/output"); - String scriptParams = "R CMD Rscript --vanilla /data/input/mutational-signature.r /data/output/" + CONTEXT_FILENAME + " " - + "/data/output/" + SIGNATURES_FILENAME + " /data/output "; + Path refGenomePath = refGenome.getGzFile().toPath(); - String cmdline = DockerUtils.run(R_DOCKER_IMAGE, inputBindings, outputBinding, scriptParams, null); - logger.info("Docker command line: " + cmdline); + // Compute signature profile: contextual frequencies of each type of base substitution - return cmdline; - } + Query query = new Query() + .append(VariantQueryParam.STUDY.key(), getStudy()) + .append(VariantQueryParam.SAMPLE.key(), getSample()) + .append(VariantQueryParam.TYPE.key(), VariantType.SNV); + + QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id"); - private MutationalSignature parse(Path dir) throws IOException { - MutationalSignature result = new MutationalSignature(); - - // Context counts - File contextFile = dir.resolve("context.txt").toFile(); - if (contextFile.exists()) { - List lines = FileUtils.readLines(contextFile, Charset.defaultCharset()); - Signature.SignatureCount[] sigCounts = new Signature.SignatureCount[lines.size() - 1]; - for (int i = 1; i < lines.size(); i++) { - String[] fields = lines.get(i).split("\t"); - sigCounts[i-1] = new Signature.SignatureCount(fields[2], Math.round(Float.parseFloat((fields[3])))); + // Get variant iterator + VariantDBIterator iterator = getVariantStorageManager().iterator(query, queryOptions, getToken()); + + // Read mutation context from reference genome (.gz, .gz.fai and .gz.gzi files) + String base = refGenomePath.toAbsolutePath().toString(); + BlockCompressedIndexedFastaSequenceFile indexed = new BlockCompressedIndexedFastaSequenceFile(refGenomePath, + new FastaSequenceIndex(new File(base + ".fai")), GZIIndex.loadIndex(Paths.get(base + ".gzi"))); + + PrintWriter pw = new PrintWriter(indexFile); + while (iterator.hasNext()) { + Variant variant = iterator.next(); + + // Accessing to the context sequence and write it into the context index file + ReferenceSequence refSeq = indexed.getSubsequenceAt(variant.getChromosome(), variant.getStart() - 1, + variant.getEnd() + 1); + String sequence = new String(refSeq.getBases()); + + // Write context index + pw.println(variant.toString() + "\t" + sequence); } - result.setSignature(new Signature("SNV", sigCounts)); + + // Close context index file + pw.close(); + } catch (IOException | CatalogException | ToolException | StorageEngineException e) { + throw new ToolExecutorException(e); } + } - // Signatures coefficients - File coeffsFile = dir.resolve("signature_coefficients.json").toFile(); - if (coeffsFile.exists()) { - SignatureFitting fitting = new SignatureFitting() - .setMethod("GEL") - .setSignatureSource("Cosmic") - .setSignatureVersion("2.0"); - - Map content = JacksonUtils.getDefaultObjectMapper().readValue(coeffsFile, Map.class); - Map coefficients = (Map) content.get("coefficients"); - SignatureFitting.Score[] scores = new SignatureFitting.Score[coefficients.size()]; - int i = 0; - for (Object key : coefficients.keySet()) { - Number coeff = (Number) coefficients.get(key); - scores[i++] = new SignatureFitting.Score((String) key, coeff.doubleValue()); +// VariantDBIterator iterator = getVariantStorageManager().iterator(query, queryOptions, getToken()); +// +// +// Map> countMap = initFreqMap(); +// +// while (iterator.hasNext()) { +// Variant variant = iterator.next(); +// +// +// +// +// +// +// PrintWriter pw = new PrintWriter(indexFile); +// +// try { +// // Compute signature profile: contextual frequencies of each type of base substitution +// +// Query query = new Query() +// .append(VariantQueryParam.STUDY.key(), getStudy()) +// .append(VariantQueryParam.SAMPLE.key(), getSampleName()) +// .append(VariantQueryParam.TYPE.key(), VariantType.SNV); +// +// QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id"); +// +// // Get variant iterator +// VariantDBIterator iterator = getVariantIterator(query, queryOptions); +// +// // Read mutation context from reference genome (.gz, .gz.fai and .gz.gzi files) +// String base = getRefGenomePath().toAbsolutePath().toString(); +// BlockCompressedIndexedFastaSequenceFile indexed = new BlockCompressedIndexedFastaSequenceFile(getRefGenomePath(), +// new FastaSequenceIndex(new File(base + ".fai")), GZIIndex.loadIndex(Paths.get(base + ".gzi"))); +// +// Map> countMap = initFreqMap(); +// +// while (iterator.hasNext()) { +// Variant variant = iterator.next(); +// +// // Accessing to the context sequence and write it into the context index file +// ReferenceSequence refSeq = indexed.getSubsequenceAt(variant.getChromosome(), variant.getStart() - 1, +// variant.getEnd() + 1); +// String sequence = new String(refSeq.getBases()); +// +// // Write context index +// pw.println(variant.toString() + "\t" + sequence); +// +// // Update count map +// updateCountMap(variant, sequence, countMap); +// } +// +// // Write context counts +// writeCountMap(countMap, getOutDir().resolve(CONTEXT_FILENAME).toFile()); +// +// // Close context index file +// pw.close(); +// +// // Execute R script in docker +// executeRScript(); +// } catch (Exception e) { +// throw new ToolExecutorException(e); +// } +// +// // Check output files +// if (!new File(getOutDir() + "/signature_summary.png").exists() +// || !new File(getOutDir() + "/signature_coefficients.json").exists()) { +// String msg = "Something wrong executing mutational signature."; +// throw new ToolException(msg); +// } +// } +// +// public MutationalSignature query(Query query, QueryOptions queryOptions) +// throws CatalogException, ToolException, StorageEngineException, IOException { +// +// File signatureFile = ResourceUtils.downloadAnalysis(MutationalSignatureAnalysis.ID, SIGNATURES_FILENAME, getOutDir(), +// getOpenCgaHome()); +// if (signatureFile == null) { +// throw new ToolException("Error downloading mutational signatures file from " + ResourceUtils.URL); +// } +// setMutationalSignaturePath(signatureFile.toPath()); +// +// // Get context index filename +// String name = getContextIndexFilename(getSampleName()); +// Query fileQuery = new Query("name", name); +// QueryOptions fileQueryOptions = new QueryOptions("include", "uri"); +// OpenCGAResult fileResult = getVariantStorageManager().getCatalogManager() +// .getFileManager().search(getStudy(), fileQuery, fileQueryOptions, getToken()); +// +// if (CollectionUtils.isEmpty(fileResult.getResults())) { +// throw new ToolException("Missing mutational signature context index file for sample " + getSampleName() + " in catalog"); +// } +// +// File indexFile = null; +// long maxSize = 0; +// for (org.opencb.opencga.core.models.file.File file : fileResult.getResults()) { +// File auxFile = new File(file.getUri().getPath()); +// if (auxFile.exists() && auxFile.length() > maxSize) { +// maxSize = auxFile.length(); +// indexFile = auxFile; +// } +// } +// if (indexFile == null) { +// throw new ToolException("Missing mutational signature context index file for sample " + getSampleName()); +// } +// +// // Read context index +// long start = System.currentTimeMillis(); +// Map indexMap = new HashMap<>(); +// BufferedReader br = new BufferedReader( new FileReader(indexFile)); +// String line; +// while ( (line = br.readLine()) != null ){ +// String[] parts = line.split("\t"); +// indexMap.put(parts[0], parts[1]); +// } +// +// // Get variant iterator +// query.append(VariantQueryParam.TYPE.key(), VariantType.SNV); +// queryOptions.append(QueryOptions.INCLUDE, "id"); +// VariantDBIterator iterator = getVariantIterator(query, queryOptions); +// +// Map> countMap = initFreqMap(); +// +// while (iterator.hasNext()) { +// Variant variant = iterator.next(); +// +// // Update count map +// updateCountMap(variant, indexMap.get(variant.toString()), countMap); +// } +// +// // Write context counts +// writeCountMap(countMap, getOutDir().resolve(CONTEXT_FILENAME).toFile()); +// +// // Run R script +// if (getExecutorParams().getBoolean("fitting")) { +// executeRScript(); +// } +// +// return parse(getOutDir()); +// } + + private void updateCountMap(Variant variant, String sequence, Map> countMap) { + String k, seq; + + String key = variant.getReference() + ">" + variant.getAlternate(); + + if (countMap.containsKey(key)) { + k = key; + seq = sequence; + } else { + k = MutationalSignatureAnalysisExecutor.complement(key); + seq = MutationalSignatureAnalysisExecutor.reverseComplement(sequence); + } + if (countMap.get(k).containsKey(seq)) { + countMap.get(k).put(seq, countMap.get(k).get(seq) + 1); + } else { + logger.error("Something wrong happened counting mutational signature substitutions: variant = " + variant.toString() + + ", key = " + key + ", k = " + k + ", sequence = " + sequence + ", seq = " + seq); } - fitting.setScores(scores); - fitting.setCoeff((Double) content.get("rss")); + } + + private VariantDBIterator getVariantIterator(Query query, QueryOptions queryOptions) throws ToolExecutorException, CatalogException, + StorageEngineException { + VariantStorageManager storageManager = getVariantStorageManager(); - // Signature summary image - File imgFile = dir.resolve("signature_summary.png").toFile(); - if (imgFile.exists()) { - FileInputStream fileInputStreamReader = new FileInputStream(imgFile); - byte[] bytes = new byte[(int) imgFile.length()]; - fileInputStreamReader.read(bytes); + // Compute signature profile: contextual frequencies of each type of base substitution + return storageManager.iterator(query, queryOptions, getToken()); + } - fitting.setImage(new String(Base64.getEncoder().encode(bytes), "UTF-8")); + private String executeRScript() throws IOException, ToolExecutorException { + // Download signature profiles + File signatureFile = ResourceUtils.downloadAnalysis(MutationalSignatureAnalysis.ID, SIGNATURES_FILENAME, getOutDir(), + opencgaHome); + if (signatureFile == null) { + throw new ToolExecutorException("Error downloading mutational signatures file from " + ResourceUtils.URL); } - result.setFitting(fitting); - } + String rScriptPath = opencgaHome + "/analysis/R/" + getToolId(); + List> inputBindings = new ArrayList<>(); + inputBindings.add(new AbstractMap.SimpleEntry<>(rScriptPath, "/data/input")); + AbstractMap.SimpleEntry outputBinding = new AbstractMap.SimpleEntry<>(getOutDir().toAbsolutePath().toString(), + "/data/output"); + String scriptParams = "R CMD Rscript --vanilla /data/input/mutational-signature.r /data/output/" + GENOME_CONTEXT_FILENAME + " " + + "/data/output/" + SIGNATURES_FILENAME + " /data/output "; + + String cmdline = DockerUtils.run(R_DOCKER_IMAGE, inputBindings, outputBinding, scriptParams, null); + logger.info("Docker command line: " + cmdline); - return result; + return cmdline; + } } -} diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index a7b31189d29..eecf8ba9057 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -782,15 +782,21 @@ private void julie() throws Exception { private void mutationalSignature() throws Exception { VariantCommandOptions.MutationalSignatureCommandOptions cliOptions = variantCommandOptions.mutationalSignatureCommandOptions; - ObjectMap params = new ObjectMap(); - params.putAll(cliOptions.commonOptions.params); - MutationalSignatureAnalysis mutationalSignatureAnalysis = new MutationalSignatureAnalysis(); - mutationalSignatureAnalysis.setUp(appHome, catalogManager, storageEngineFactory, params, Paths.get(cliOptions.outdir), - variantCommandOptions.internalJobOptions.jobId, token); - mutationalSignatureAnalysis.setStudy(cliOptions.study) - .setSampleName(cliOptions.sample) - .start(); + // Build signature query from cli options + SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, + variantCommandOptions.mutationalSignatureCommandOptions.signatureQuery); + + ObjectMap params = new MutationalSignatureAnalysisParams( + cliOptions.sample, + cliOptions.signatureId, + cliOptions.signatureDescription, + signatureQuery, + cliOptions.fitting, + cliOptions.outdir) + .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); + + toolRunner.execute(MutationalSignatureAnalysis.class, params, Paths.get(cliOptions.outdir), jobId, token); } private void mendelianError() throws Exception { @@ -874,13 +880,18 @@ private void sampleQc() throws Exception { AnnotationVariantQueryParams variantStatsQuery = ToolParams.fromParams(AnnotationVariantQueryParams.class, cliOptions.variantStatsQuery); + // Build signature query from cli options + SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, + variantCommandOptions.mutationalSignatureCommandOptions.signatureQuery); + ObjectMap params = new SampleQcAnalysisParams( cliOptions.sample, cliOptions.variantStatsId, cliOptions.variantStatsDecription, variantStatsQuery, -// cliOptions.signatureId, -// signatureQuery, + cliOptions.signatureId, + cliOptions.signatureDescription, + signatureQuery, cliOptions.genomePlotDescr, cliOptions.genomePlotConfigFile, cliOptions.outdir) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index 7e7229e1519..b16ba596a41 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1241,9 +1241,21 @@ public class MutationalSignatureCommandOptions { @Parameter(names = {"--study"}, description = "Study where all the samples belong to.") public String study; - @Parameter(names = {"--sample"}, description = "Sample name.") + @Parameter(names = {"--sample"}, description = "Sample name.", required = true) public String sample; + @Parameter(names = {"--si", "--signature-id"}, description = "Signature ID.") + public String signatureId; + + @Parameter(names = {"--sd", "--signature-description"}, description = "Signature description.") + public String signatureDescription; + + @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") + public Map signatureQuery = new HashMap<>(); + + @Parameter(names = {"--fitting"}, description = "Compute the relative proportions of the different mutational signatures demonstrated by the tumour.") + public boolean fitting; + @Parameter(names = {"-o", "--outdir"}, description = "Output directory.", arity = 1, required = false) public String outdir; } @@ -1394,20 +1406,23 @@ public class SampleQcCommandOptions { @Parameter(names = {"--sample"}, description = "Sample ID.", required = true) public String sample; - @Parameter(names = {"--variant-stats-id"}, description = "Variant stats ID.") + @Parameter(names = {"--vsi", "--variant-stats-id"}, description = "Variant stats ID.") public String variantStatsId; - @Parameter(names = {"--variant-stats-description"}, description = "Variant stats description.") + @Parameter(names = {"--vsd", "--variant-stats-description"}, description = "Variant stats description.") public String variantStatsDecription; @DynamicParameter(names = {"--vsq", "--variant-stats-query"}, description = "Variant stats query, e.g.:. --vsq gene=\"BRCA2\" --vsq ct=\"missense_variant\"") public Map variantStatsQuery = new HashMap<>(); -// @Parameter(names = {"--signature-id"}, description = "Signature ID.") -// public String signatureId; -// -// @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") -// public Map signatureQuery = new HashMap<>(); + @Parameter(names = {"--si", "--signature-id"}, description = "Signature ID.") + public String signatureId; + + @Parameter(names = {"--sd", "--signature-description"}, description = "Signature description.") + public String signatureDescription; + + @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") + public Map signatureQuery = new HashMap<>(); @Parameter(names = {"--gpd", "--genome-plot-description"}, description = "Genome plot description.") public String genomePlotDescr; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 5b060bf02d1..b75c3a64e10 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -338,9 +338,17 @@ private RestResponse sampleEligibility() throws ClientException { // } private RestResponse mutationalSignature() throws ClientException { + // Build signature query from cli options + SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, + variantCommandOptions.mutationalSignatureCommandOptions.signatureQuery); + return openCGAClient.getVariantClient().runMutationalSignature( new MutationalSignatureAnalysisParams( variantCommandOptions.mutationalSignatureCommandOptions.sample, + variantCommandOptions.mutationalSignatureCommandOptions.signatureId, + variantCommandOptions.mutationalSignatureCommandOptions.signatureDescription, + signatureQuery, + variantCommandOptions.mutationalSignatureCommandOptions.fitting, variantCommandOptions.mutationalSignatureCommandOptions.outdir ), getParams(variantCommandOptions.mutationalSignatureCommandOptions.study) @@ -414,8 +422,8 @@ private RestResponse sampleQc() throws ClientException { AnnotationVariantQueryParams variantStatsQuery = ToolParams.fromParams(AnnotationVariantQueryParams.class, cliOptions.variantStatsQuery); -// // Build signature query from cli options -// SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, cliOptions.signatureQuery); + // Build signature query from cli options + SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, cliOptions.signatureQuery); return openCGAClient.getVariantClient().runSampleQc( new SampleQcAnalysisParams( @@ -423,8 +431,9 @@ private RestResponse sampleQc() throws ClientException { cliOptions.variantStatsId, cliOptions.variantStatsDecription, variantStatsQuery, -// cliOptions.signatureId, -// signatureQuery, + cliOptions.signatureId, + cliOptions.signatureDescription, + signatureQuery, cliOptions.genomePlotDescr, cliOptions.genomePlotConfigFile, cliOptions.outdir diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java index 4e2820f62e9..beccdfee754 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java @@ -16,21 +16,46 @@ package org.opencb.opencga.core.models.variant; +import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.tools.ToolParams; public class MutationalSignatureAnalysisParams extends ToolParams { public static final String DESCRIPTION = "Mutational signature analysis params"; + private String sample; + private String id; + private String description; + private SampleQcSignatureQueryParams query; + private boolean fitting; + private String outdir; public MutationalSignatureAnalysisParams() { } - public MutationalSignatureAnalysisParams(String sample, String outdir) { + public MutationalSignatureAnalysisParams(String sample, String id, String description, SampleQcSignatureQueryParams query, + boolean fitting, String outdir) { this.sample = sample; + this.id = id; + this.description = description; + this.query = query; + this.fitting = fitting; this.outdir = outdir; } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("MutationalSignatureAnalysisParams{"); + sb.append("sample='").append(sample).append('\''); + sb.append(", id='").append(id).append('\''); + sb.append(", description='").append(description).append('\''); + sb.append(", query=").append(query); + sb.append(", fitting=").append(fitting); + sb.append(", outdir='").append(outdir).append('\''); + sb.append('}'); + return sb.toString(); + } + public String getSample() { return sample; } @@ -40,6 +65,42 @@ public MutationalSignatureAnalysisParams setSample(String sample) { return this; } + public String getId() { + return id; + } + + public MutationalSignatureAnalysisParams setId(String id) { + this.id = id; + return this; + } + + public String getDescription() { + return description; + } + + public MutationalSignatureAnalysisParams setDescription(String description) { + this.description = description; + return this; + } + + public SampleQcSignatureQueryParams getQuery() { + return query; + } + + public MutationalSignatureAnalysisParams setQuery(SampleQcSignatureQueryParams query) { + this.query = query; + return this; + } + + public boolean isFitting() { + return fitting; + } + + public MutationalSignatureAnalysisParams setFitting(boolean fitting) { + this.fitting = fitting; + return this; + } + public String getOutdir() { return outdir; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java index 305d8193887..ecc10637e2e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java @@ -24,6 +24,9 @@ public class SampleQcAnalysisParams extends ToolParams { private String variantStatsId; private String variantStatsDescription; private AnnotationVariantQueryParams variantStatsQuery; + private String mutationalSignatureId; + private String mutationalSignatureDescription; + private SampleQcSignatureQueryParams mutationalSignatureQuery; private String genomePlotDescription; private String genomePlotConfigFile; private String outdir; @@ -32,12 +35,16 @@ public SampleQcAnalysisParams() { } public SampleQcAnalysisParams(String sample, String variantStatsId, String variantStatsDescription, - AnnotationVariantQueryParams variantStatsQuery, String genomePlotDescription, String genomePlotConfigFile, - String outdir) { + AnnotationVariantQueryParams variantStatsQuery, String mutationalSignatureId, + String mutationalSignatureDescription, SampleQcSignatureQueryParams mutationalSignatureQuery, + String genomePlotDescription, String genomePlotConfigFile, String outdir) { this.sample = sample; this.variantStatsId = variantStatsId; this.variantStatsDescription = variantStatsDescription; this.variantStatsQuery = variantStatsQuery; + this.mutationalSignatureId = mutationalSignatureId; + this.mutationalSignatureDescription = mutationalSignatureDescription; + this.mutationalSignatureQuery = mutationalSignatureQuery; this.genomePlotDescription = genomePlotDescription; this.genomePlotConfigFile = genomePlotConfigFile; this.outdir = outdir; @@ -50,6 +57,9 @@ public String toString() { sb.append(", variantStatsId='").append(variantStatsId).append('\''); sb.append(", variantStatsDescription='").append(variantStatsDescription).append('\''); sb.append(", variantStatsQuery=").append(variantStatsQuery); + sb.append(", mutationalSignatureId='").append(mutationalSignatureId).append('\''); + sb.append(", mutationalSignatureDescription='").append(mutationalSignatureDescription).append('\''); + sb.append(", mutationalSignatureQuery=").append(mutationalSignatureQuery); sb.append(", genomePlotDescription='").append(genomePlotDescription).append('\''); sb.append(", genomePlotConfigFile='").append(genomePlotConfigFile).append('\''); sb.append(", outdir='").append(outdir).append('\''); @@ -93,6 +103,33 @@ public SampleQcAnalysisParams setVariantStatsQuery(AnnotationVariantQueryParams return this; } + public String getMutationalSignatureId() { + return mutationalSignatureId; + } + + public SampleQcAnalysisParams setMutationalSignatureId(String mutationalSignatureId) { + this.mutationalSignatureId = mutationalSignatureId; + return this; + } + + public String getMutationalSignatureDescription() { + return mutationalSignatureDescription; + } + + public SampleQcAnalysisParams setMutationalSignatureDescription(String mutationalSignatureDescription) { + this.mutationalSignatureDescription = mutationalSignatureDescription; + return this; + } + + public SampleQcSignatureQueryParams getMutationalSignatureQuery() { + return mutationalSignatureQuery; + } + + public SampleQcAnalysisParams setMutationalSignatureQuery(SampleQcSignatureQueryParams mutationalSignatureQuery) { + this.mutationalSignatureQuery = mutationalSignatureQuery; + return this; + } + public String getGenomePlotDescription() { return genomePlotDescription; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java index cdd69d8b0d8..7c2f86ef8af 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java @@ -17,11 +17,11 @@ package org.opencb.opencga.core.tools.variant; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.variant.SampleQcSignatureQueryParams; import org.opencb.opencga.core.tools.OpenCgaToolExecutor; import java.io.File; import java.io.PrintWriter; -import java.nio.file.Path; import java.util.LinkedHashMap; import java.util.Map; @@ -34,64 +34,70 @@ public abstract class MutationalSignatureAnalysisExecutor extends OpenCgaToolExe "GTT", "TTA", "TTC", "TTG", "TTT"}; private String study; - private String sampleName; - private Path refGenomePath; - private Path mutationalSignaturePath; - private Path openCgaHome; + private String assembly; + private String sample; + private String queryId; + private String queryDescription; + private SampleQcSignatureQueryParams query; + private boolean fitting; - public MutationalSignatureAnalysisExecutor() { - } - - public String getStudy() { - return study; - } - - public MutationalSignatureAnalysisExecutor setStudy(String study) { - this.study = study; - return this; - } - - public String getSampleName() { - return sampleName; - } - - public MutationalSignatureAnalysisExecutor setSampleName(String sampleName) { - this.sampleName = sampleName; - return this; - } - - public Path getRefGenomePath() { - return refGenomePath; - } +// private String sampleName; +// private Path refGenomePath; +// private Path mutationalSignaturePath; +// private Path openCgaHome; - public MutationalSignatureAnalysisExecutor setRefGenomePath(Path refGenomePath) { - this.refGenomePath = refGenomePath; - return this; - } - - public Path getMutationalSignaturePath() { - return mutationalSignaturePath; - } - - public MutationalSignatureAnalysisExecutor setMutationalSignaturePath(Path mutationalSignaturePath) { - this.mutationalSignaturePath = mutationalSignaturePath; - return this; + public MutationalSignatureAnalysisExecutor() { } - public Path getOpenCgaHome() { - return openCgaHome; - } - - public MutationalSignatureAnalysisExecutor setOpenCgaHome(Path openCgaHome) { - this.openCgaHome = openCgaHome; - return this; - } +// public String getStudy() { +// return study; +// } +// +// public MutationalSignatureAnalysisExecutor setStudy(String study) { +// this.study = study; +// return this; +// } +// +// public String getSampleName() { +// return sampleName; +// } +// +// public MutationalSignatureAnalysisExecutor setSampleName(String sampleName) { +// this.sampleName = sampleName; +// return this; +// } +// +// public Path getRefGenomePath() { +// return refGenomePath; +// } +// +// public MutationalSignatureAnalysisExecutor setRefGenomePath(Path refGenomePath) { +// this.refGenomePath = refGenomePath; +// return this; +// } +// +// public Path getMutationalSignaturePath() { +// return mutationalSignaturePath; +// } +// +// public MutationalSignatureAnalysisExecutor setMutationalSignaturePath(Path mutationalSignaturePath) { +// this.mutationalSignaturePath = mutationalSignaturePath; +// return this; +// } +// +// public Path getOpenCgaHome() { +// return openCgaHome; +// } +// +// public MutationalSignatureAnalysisExecutor setOpenCgaHome(Path openCgaHome) { +// this.openCgaHome = openCgaHome; +// return this; +// } public static String getContextIndexFilename(String sampleName) { - return "OPENCGA_" + sampleName + "_mutational_signature_context.csv"; + return "OPENCGA_" + sampleName + "_genome_context.csv"; } - protected static Map> initFreqMap() { Map> map = new LinkedHashMap<>(); for (String firstKey : FIRST_LEVEL_KEYS) { @@ -186,4 +192,117 @@ private static Double sumFreqMap(Map> map) { return sum; } + +// private MutationalSignature parse(Path dir) throws IOException { +// MutationalSignature result = new MutationalSignature(); +// +// // Context counts +// File contextFile = dir.resolve("context.txt").toFile(); +// if (contextFile.exists()) { +// List lines = FileUtils.readLines(contextFile, Charset.defaultCharset()); +// Signature.SignatureCount[] sigCounts = new Signature.SignatureCount[lines.size() - 1]; +// for (int i = 1; i < lines.size(); i++) { +// String[] fields = lines.get(i).split("\t"); +// sigCounts[i-1] = new Signature.SignatureCount(fields[2], Math.round(Float.parseFloat((fields[3])))); +// } +// result.setSignature(new Signature("SNV", sigCounts)); +// } +// +// // Signatures coefficients +// File coeffsFile = dir.resolve("signature_coefficients.json").toFile(); +// if (coeffsFile.exists()) { +// SignatureFitting fitting = new SignatureFitting() +// .setMethod("GEL") +// .setSignatureSource("Cosmic") +// .setSignatureVersion("2.0"); +// +// Map content = JacksonUtils.getDefaultObjectMapper().readValue(coeffsFile, Map.class); +// Map coefficients = (Map) content.get("coefficients"); +// SignatureFitting.Score[] scores = new SignatureFitting.Score[coefficients.size()]; +// int i = 0; +// for (Object key : coefficients.keySet()) { +// Number coeff = (Number) coefficients.get(key); +// scores[i++] = new SignatureFitting.Score((String) key, coeff.doubleValue()); +// } +// fitting.setScores(scores); +// fitting.setCoeff((Double) content.get("rss")); +// +// // Signature summary image +// File imgFile = dir.resolve("signature_summary.png").toFile(); +// if (imgFile.exists()) { +// FileInputStream fileInputStreamReader = new FileInputStream(imgFile); +// byte[] bytes = new byte[(int) imgFile.length()]; +// fileInputStreamReader.read(bytes); +// +// fitting.setImage(new String(Base64.getEncoder().encode(bytes), "UTF-8")); +// } +// +// result.setFitting(fitting); +// } +// +// return result; +// } + + public String getStudy() { + return study; + } + + public MutationalSignatureAnalysisExecutor setStudy(String study) { + this.study = study; + return this; + } + + public String getAssembly() { + return assembly; + } + + public MutationalSignatureAnalysisExecutor setAssembly(String assembly) { + this.assembly = assembly; + return this; + } + + public String getSample() { + return sample; + } + + public MutationalSignatureAnalysisExecutor setSample(String sample) { + this.sample = sample; + return this; + } + + public String getQueryId() { + return queryId; + } + + public MutationalSignatureAnalysisExecutor setQueryId(String queryId) { + this.queryId = queryId; + return this; + } + + public String getQueryDescription() { + return queryDescription; + } + + public MutationalSignatureAnalysisExecutor setQueryDescription(String queryDescription) { + this.queryDescription = queryDescription; + return this; + } + + public SampleQcSignatureQueryParams getQuery() { + return query; + } + + public MutationalSignatureAnalysisExecutor setQuery(SampleQcSignatureQueryParams query) { + this.query = query; + return this; + } + + public boolean isFitting() { + return fitting; + } + + public MutationalSignatureAnalysisExecutor setFitting(boolean fitting) { + this.fitting = fitting; + return this; + } } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 24895b20c88..cc5cb35b237 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -46,7 +46,6 @@ import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.analysis.variant.mendelianError.MendelianErrorAnalysis; import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis; -import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureLocalAnalysisExecutor; import org.opencb.opencga.analysis.variant.operations.VariantFileDeleteOperationTool; import org.opencb.opencga.analysis.variant.operations.VariantIndexOperationTool; import org.opencb.opencga.analysis.variant.relatedness.RelatednessAnalysis; @@ -61,7 +60,6 @@ import org.opencb.opencga.analysis.wrappers.rvtests.RvtestsWrapperAnalysis; import org.opencb.opencga.analysis.wrappers.samtools.SamtoolsWrapperAnalysis; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; -import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.utils.AvroToAnnotationConverter; import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; @@ -80,8 +78,8 @@ import org.opencb.opencga.core.models.variant.*; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.response.RestResponse; +import org.opencb.opencga.core.tools.ToolParams; import org.opencb.opencga.server.WebServiceException; -import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationManager; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; @@ -930,6 +928,10 @@ public Response mutationalSignatureQuery( return createErrorResponse(new Exception("Missing sample name")); } + if (!query.containsKey(STUDY.key())) { + return createErrorResponse(new Exception("Missing study name")); + } + // Create temporal directory outDir = Paths.get(configuration.getAnalysis().getScratchDir(), "mutational-signature-" + System.nanoTime()).toFile(); outDir.mkdir(); @@ -937,24 +939,27 @@ public Response mutationalSignatureQuery( return createErrorResponse(new Exception("Error creating temporal directory for mutational-signature/query analysis")); } - MutationalSignatureLocalAnalysisExecutor executor = new MutationalSignatureLocalAnalysisExecutor(variantManager); - executor.setOpenCgaHome(opencgaHome); + MutationalSignatureAnalysisParams params = new MutationalSignatureAnalysisParams(); + params.setSample(query.getString(SAMPLE.key())) + .setQuery(ToolParams.fromParams(SampleQcSignatureQueryParams.class, query)) + .setFitting(fitting); - ObjectMap executorParams = new ObjectMap(); - executorParams.put("opencgaHome", opencgaHome); - executorParams.put("token", token); - executorParams.put("fitting", fitting); - executor.setUp(null, executorParams, outDir.toPath()); - executor.setStudy(query.getString(STUDY.key())); - executor.setSampleName(query.getString(SAMPLE.key())); + MutationalSignatureAnalysis mutationalSignatureAnalysis = new MutationalSignatureAnalysis(); + mutationalSignatureAnalysis.setUp(opencgaHome.toString(), catalogManager, storageEngineFactory, new ObjectMap(), outDir.toPath(), null, + token); + mutationalSignatureAnalysis.setStudy(query.getString(STUDY.key())); + mutationalSignatureAnalysis.setSignatureParams(params); StopWatch watch = StopWatch.createStarted(); - MutationalSignature signatureResult = executor.query(query, queryOptions); + mutationalSignatureAnalysis.start(); watch.stop(); + + MutationalSignature mutationalSignature = mutationalSignatureAnalysis.parse(outDir.toPath()); + OpenCGAResult result = new OpenCGAResult<>(((int) watch.getTime()), Collections.emptyList(), 1, - Collections.singletonList(signatureResult), 1); + Collections.singletonList(mutationalSignature), 1); return createOkResponse(result); - } catch (CatalogException | ToolException | IOException | StorageEngineException e) { + } catch (ToolException | IOException e) { return createErrorResponse(e); } finally { if (outDir != null) { From fa5f37627d85ffa8aec73ec9369a0e9d6d15cbe4 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 31 May 2021 15:16:37 +0200 Subject: [PATCH 361/412] catalog: validate migration ids are unique within the version --- .../catalog/db/api/MigrationDBAdaptor.java | 4 +- .../db/mongodb/MigrationMongoDBAdaptor.java | 9 ++- .../catalog/migration/MigrationManager.java | 65 +++++++++++++------ 3 files changed, 56 insertions(+), 22 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java index 4865740ed84..d7181c4ff51 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/MigrationDBAdaptor.java @@ -18,7 +18,9 @@ public interface MigrationDBAdaptor { enum QueryParams implements QueryParam { ID("id", STRING, ""), - DATE("date", QueryParam.Type.DATE, ""), + VERSION("version", STRING, ""), + START("date", QueryParam.Type.DATE, ""), + END("date", QueryParam.Type.DATE, ""), PATCH("patch", INTEGER, ""), STATUS("status", STRING, ""); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java index 3a1524ac0a4..04c0ac1463f 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MigrationMongoDBAdaptor.java @@ -41,7 +41,10 @@ public void upsert(MigrationRun migrationRun) throws CatalogDBException { throw new CatalogDBException("Could not insert MigrationRun"); } } else { - Bson bsonQuery = parseQuery(new Query(QueryParams.ID.key(), migrationRun.getId())); + Query query = new Query() + .append(QueryParams.ID.key(), migrationRun.getId()) + .append(QueryParams.VERSION.key(), migrationRun.getVersion()); + Bson bsonQuery = parseQuery(query); DataResult update = migrationCollection.update(bsonQuery, new Document("$set", migrationDocument), QueryOptions.empty()); if (update.getNumUpdated() == 0) { throw new CatalogDBException("Could not update MigrationRun"); @@ -77,7 +80,9 @@ private Bson parseQuery(Query query) throws CatalogDBException { try { switch (queryParam) { case ID: - case DATE: + case VERSION: + case START: + case END: case PATCH: case STATUS: addAutoOrQuery(queryParam.key(), queryParam.key(), queryCopy, queryParam.type(), andBsonList); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java index a371f81d5bb..7b1a57e2ace 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java @@ -55,11 +55,15 @@ public void runMigration(String version, Set domainsF // Extend token life token = catalogManager.getUserManager().getNonExpiringToken(AbstractManager.OPENCGA, token); + // 0. Fetch all migrations + Set> availableMigrations = getAvailableMigrations(); + // 1. Fetch required migrations sorted by rank - List> runnableMigrations = getRunnableMigrations(version, domainsFilter, languageFilter); + List> runnableMigrations = filterRunnableMigrations(version, domainsFilter, languageFilter, + availableMigrations); // 2. Get pending migrations - List> pendingMigrations = getPendingMigrations(version); + List> pendingMigrations = filterPendingMigrations(version, availableMigrations); if (runnableMigrations.isEmpty() && pendingMigrations.isEmpty()) { logger.info("Nothing to run. OpenCGA is up to date"); @@ -86,15 +90,19 @@ public void runMigration(String version, Set domainsF } } - public List> getPendingMigrations(String version, String token) - throws CatalogException, MigrationException { + public List> getPendingMigrations(String version, String token) throws CatalogException { validateAdmin(token); - return getPendingMigrations(version); + Set> availableMigrations = getAvailableMigrations(); + return filterPendingMigrations(version, availableMigrations); } - private List> getPendingMigrations(String version) throws MigrationException { - // 2.1. Get all available migrations sorted to check if previous migrations have been run - List> migrations = getAllSortedAvailableMigrations(); + private List> filterPendingMigrations(String version, + Set> availableMigrations) + throws MigrationException { + + // 2.1. Sort all available migrations to check if previous migrations have been run + List> migrations = new ArrayList<>(availableMigrations); + migrations.sort(this::compareTo); // 2.2. Find position of first migration with version "version" int pos = -1; @@ -138,7 +146,32 @@ private Set> getAvailableMigrations() { .filterInputsBy(input -> input != null && input.endsWith(".class")) ); - return reflections.getSubTypesOf(MigrationTool.class); + Set> migrations = reflections.getSubTypesOf(MigrationTool.class); + + // Validate unique ids and rank + Map> versionIdMap = new HashMap<>(); + Map> versionRankMap = new HashMap<>(); + + for (Class migration : migrations) { + Migration annotation = getMigrationAnnotation(migration); + + if (!versionIdMap.containsKey(annotation.version())) { + versionIdMap.put(annotation.version(), new HashSet<>()); + versionRankMap.put(annotation.version(), new HashSet<>()); + } + if (versionIdMap.get(annotation.version()).contains(annotation.id())) { + throw new IllegalStateException("Found duplicated migration id '" + annotation.id() + "' in version " + + annotation.version()); + } + if (versionRankMap.get(annotation.version()).contains(annotation.rank())) { + throw new IllegalStateException("Found duplicated migration rank " + annotation.rank() + " in version " + + annotation.version()); + } + versionIdMap.get(annotation.version()).add(annotation.id()); + versionRankMap.get(annotation.version()).add(annotation.rank()); + } + + return migrations; } private static Collection getUrls() { @@ -155,13 +188,6 @@ private static Collection getUrls() { return urls; } - - private List> getAllSortedAvailableMigrations() { - List> migrations = new ArrayList<>(getAvailableMigrations()); - migrations.sort(this::compareTo); - return migrations; - } - /** * Sort MigrationTools by version -> rank. * @@ -222,8 +248,10 @@ private int compareTo(Class m1, Class> getRunnableMigrations(String version, Set domainFilter, - Set languageFilter) throws MigrationException { + private List> filterRunnableMigrations(String version, Set domainFilter, + Set languageFilter, + Set> allMigrations) + throws MigrationException { if (domainFilter == null || domainFilter.isEmpty()) { domainFilter = EnumSet.allOf(Migration.MigrationDomain.class); @@ -232,7 +260,6 @@ private List> getRunnableMigrations(String versio languageFilter = EnumSet.allOf(Migration.MigrationLanguage.class); } - Set> allMigrations = getAvailableMigrations(); List> filteredMigrations = new LinkedList<>(); for (Class migration : allMigrations) { From 7eb9df9c1b01969d189ccad207c97f6dd0ff091a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Tue, 1 Jun 2021 11:40:54 +0200 Subject: [PATCH 362/412] analysis: improve mutational signature analysis and sample quality control analysis, #1765 --- .../analysis/sample/qc/SampleQcAnalysis.java | 15 +++--- .../MutationalSignatureAnalysis.java | 39 ++++++++------- ...ationalSignatureLocalAnalysisExecutor.java | 6 +-- .../analysis/tools/ToolExecutorTest.java | 3 -- .../VariantInternalCommandExecutor.java | 16 ++---- .../options/VariantCommandOptions.java | 12 ++--- .../analysis/VariantCommandExecutor.java | 13 ++--- .../MutationalSignatureAnalysisParams.java | 8 +-- .../variant/SampleQcAnalysisParams.java | 49 ++++++++++--------- .../variant/SampleQcSignatureQueryParams.java | 33 ++++--------- .../SampleVariantStatsAnalysisParams.java | 3 +- .../MutationalSignatureAnalysisExecutor.java | 8 +-- .../rest/analysis/VariantWebService.java | 2 +- 13 files changed, 92 insertions(+), 115 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 56f7c2f5577..a5ab9f2da05 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -127,9 +127,9 @@ protected void check() throws Exception { } // Check mutational signature - if (!sample.isSomatic()) { - runSignature = false; - } +// if (!sample.isSomatic()) { +// runSignature = false; +// } // Check genome plot if (StringUtils.isEmpty(analysisParams.getGenomePlotConfigFile())) { @@ -169,12 +169,11 @@ protected void run() throws ToolException { if (runSignature) { // Run mutational signature - params = new MutationalSignatureAnalysisParams(analysisParams.getMutationalSignatureId(), - analysisParams.getMutationalSignatureDescription(), analysisParams.getSample(), - analysisParams.getMutationalSignatureQuery(), true, null) - .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudy())); // Be sure to update sample quality control - params.put(MutationalSignatureAnalysis.QC_UPDATE_KEYNAME, true); + analysisParams.getSignatureQuery().put(MutationalSignatureAnalysis.QC_UPDATE_KEYNAME, "true"); + params = new MutationalSignatureAnalysisParams(analysisParams.getSample(), analysisParams.getSignatureId(), + analysisParams.getSignatureDescription(), analysisParams.getSignatureQuery(), true, null) + .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudy())); signatureJobResult = catalogManager.getJobManager() .submit(getStudy(), MutationalSignatureAnalysis.ID, Enums.Priority.MEDIUM, params, null, "Job generated by " diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java index 32387755a5a..0ae38a66bb9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java @@ -21,7 +21,6 @@ import org.opencb.biodata.models.clinical.qc.MutationalSignature; import org.opencb.biodata.models.clinical.qc.Signature; import org.opencb.biodata.models.clinical.qc.SignatureFitting; -import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.ResourceUtils; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; @@ -73,8 +72,8 @@ protected void check() throws Exception { throw new ToolException("Missing study"); } - if (StringUtils.isEmpty(signatureParams.getSample())) { - throw new ToolException("Missing sample"); + if (signatureParams.getQuery() == null) { + throw new ToolException("Missing signature query"); } assembly = ResourceUtils.getAssembly(catalogManager, study, token); @@ -121,24 +120,29 @@ protected void run() throws ToolException { .setFitting(signatureParams.isFitting()) .execute(); - // Update quality control for the catalog sample - if (params.containsKey(QC_UPDATE_KEYNAME)) { + if (signatureParams.getQuery() != null && signatureParams.getQuery().containsKey(QC_UPDATE_KEYNAME)) { + // Remove quality control update key + signatureParams.getQuery().remove(QC_UPDATE_KEYNAME); + OpenCGAResult sampleResult = getCatalogManager().getSampleManager().get(getStudy(), signatureParams.getSample(), QueryOptions.empty(), getToken()); Sample sample = sampleResult.first(); if (sample != null) { - Signature signature = null; // Get genome context file - for (java.io.File imgFile : getOutDir().toFile().listFiles()) { - if (imgFile.getName().equals(GENOME_CONTEXT_FILENAME)) { - Signature.GenomeContextCount[] genomeContextCounts = parseGenomeContextFile(imgFile); - signature = new Signature(signatureParams.getId(), signatureParams.getDescription(), - (ObjectMap) signatureParams.getQuery().toParams(), "SNV", genomeContextCounts, Collections.emptyList()); - break; + File contextFile = getOutDir().resolve(GENOME_CONTEXT_FILENAME).toFile(); + if (contextFile.exists()) { + Signature.GenomeContextCount[] genomeContextCounts = parseGenomeContextFile(contextFile); + Signature signature = new Signature(signatureParams.getId(), signatureParams.getDescription(), + signatureParams.getQuery(), "SNV", genomeContextCounts, null); + + File imgFile = getOutDir().resolve("signature_summary.png").toFile(); + if (imgFile.exists()) { + int index = imgFile.getAbsolutePath().indexOf("JOBS/"); + String relativeFilePath = (index == -1 ? imgFile.getName() : imgFile.getAbsolutePath().substring(index)); + signature.setFiles(Collections.singletonList(relativeFilePath)); } - } - if (signature != null) { + SampleQualityControl qc = sampleResult.first().getQualityControl(); if (qc == null) { qc = new SampleQualityControl(); @@ -147,6 +151,8 @@ protected void run() throws ToolException { catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); + } else { + throw new ToolException("It could not find the genome context file after running mutational signature"); } } } @@ -179,9 +185,8 @@ public MutationalSignature parse(Path dir) throws IOException { String[] fields = lines.get(i).split("\t"); sigCounts[i-1] = new Signature.GenomeContextCount(fields[2], Math.round(Float.parseFloat((fields[3])))); } - result.setSignature(new Signature(signatureParams.getId(), signatureParams.getDescription(), - signatureParams.getQuery() == null ? null : (ObjectMap) signatureParams.getQuery().toParams(), "SNV", sigCounts, - Collections.emptyList())); + result.setSignature(new Signature(signatureParams.getId(), signatureParams.getDescription(), signatureParams.getQuery(), "SNV", + sigCounts, Collections.emptyList())); } // Signatures coefficients diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java index f8152fbfedd..52de5a7240b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java @@ -68,7 +68,7 @@ public void run() throws ToolException, CatalogException, IOException, StorageEn // Get first variant to check where the genome context is stored Query query = new Query(); if (getQuery() != null) { - query.putAll(getQuery().toParams()); + query.putAll(getQuery()); } query.append(VariantQueryParam.TYPE.key(), VariantType.SNV); @@ -98,7 +98,7 @@ private void computeFromSampleData() throws ToolExecutorException { // Get variant iterator Query query = new Query(); if (getQuery() != null) { - query.putAll(getQuery().toParams()); + query.putAll(getQuery()); } query.append(VariantQueryParam.TYPE.key(), VariantType.SNV); @@ -175,7 +175,7 @@ private void computeFromContextFile() throws ToolExecutorException { // Get variant iterator Query query = new Query(); if (getQuery() != null) { - query.putAll(getQuery().toParams()); + query.putAll(getQuery()); } query.append(VariantQueryParam.TYPE.key(), VariantType.SNV); diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/tools/ToolExecutorTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/tools/ToolExecutorTest.java index 4701f5ba9ea..8a69726c4b9 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/tools/ToolExecutorTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/tools/ToolExecutorTest.java @@ -18,9 +18,6 @@ import org.opencb.commons.test.GenericTest; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - public class ToolExecutorTest extends GenericTest { // public final static String PASSWORD = "asdf"; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index eecf8ba9057..c6d16cdfa1c 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -783,15 +783,11 @@ private void julie() throws Exception { private void mutationalSignature() throws Exception { VariantCommandOptions.MutationalSignatureCommandOptions cliOptions = variantCommandOptions.mutationalSignatureCommandOptions; - // Build signature query from cli options - SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, - variantCommandOptions.mutationalSignatureCommandOptions.signatureQuery); - ObjectMap params = new MutationalSignatureAnalysisParams( cliOptions.sample, - cliOptions.signatureId, - cliOptions.signatureDescription, - signatureQuery, + cliOptions.id, + cliOptions.description, + new ObjectMap(cliOptions.query), cliOptions.fitting, cliOptions.outdir) .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); @@ -880,10 +876,6 @@ private void sampleQc() throws Exception { AnnotationVariantQueryParams variantStatsQuery = ToolParams.fromParams(AnnotationVariantQueryParams.class, cliOptions.variantStatsQuery); - // Build signature query from cli options - SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, - variantCommandOptions.mutationalSignatureCommandOptions.signatureQuery); - ObjectMap params = new SampleQcAnalysisParams( cliOptions.sample, cliOptions.variantStatsId, @@ -891,7 +883,7 @@ private void sampleQc() throws Exception { variantStatsQuery, cliOptions.signatureId, cliOptions.signatureDescription, - signatureQuery, + new ObjectMap(cliOptions.signatureQuery), cliOptions.genomePlotDescr, cliOptions.genomePlotConfigFile, cliOptions.outdir) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index b16ba596a41..a79ec4983f2 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1244,14 +1244,14 @@ public class MutationalSignatureCommandOptions { @Parameter(names = {"--sample"}, description = "Sample name.", required = true) public String sample; - @Parameter(names = {"--si", "--signature-id"}, description = "Signature ID.") - public String signatureId; + @Parameter(names = {"--id"}, description = "Signature ID.") + public String id; - @Parameter(names = {"--sd", "--signature-description"}, description = "Signature description.") - public String signatureDescription; + @Parameter(names = {"--description"}, description = "Signature description.") + public String description; - @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") - public Map signatureQuery = new HashMap<>(); + @DynamicParameter(names = {"-q", "--query"}, description = "Signature query, e.g.:. -q type=\"SNV\" -q ct=\"missense_variant\"") + public Map query = new HashMap<>(); @Parameter(names = {"--fitting"}, description = "Compute the relative proportions of the different mutational signatures demonstrated by the tumour.") public boolean fitting; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index b75c3a64e10..0f9b7bea4dc 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -339,15 +339,13 @@ private RestResponse sampleEligibility() throws ClientException { private RestResponse mutationalSignature() throws ClientException { // Build signature query from cli options - SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, - variantCommandOptions.mutationalSignatureCommandOptions.signatureQuery); return openCGAClient.getVariantClient().runMutationalSignature( new MutationalSignatureAnalysisParams( variantCommandOptions.mutationalSignatureCommandOptions.sample, - variantCommandOptions.mutationalSignatureCommandOptions.signatureId, - variantCommandOptions.mutationalSignatureCommandOptions.signatureDescription, - signatureQuery, + variantCommandOptions.mutationalSignatureCommandOptions.id, + variantCommandOptions.mutationalSignatureCommandOptions.description, + new ObjectMap(variantCommandOptions.mutationalSignatureCommandOptions.query), variantCommandOptions.mutationalSignatureCommandOptions.fitting, variantCommandOptions.mutationalSignatureCommandOptions.outdir ), @@ -422,9 +420,6 @@ private RestResponse sampleQc() throws ClientException { AnnotationVariantQueryParams variantStatsQuery = ToolParams.fromParams(AnnotationVariantQueryParams.class, cliOptions.variantStatsQuery); - // Build signature query from cli options - SampleQcSignatureQueryParams signatureQuery = ToolParams.fromParams(SampleQcSignatureQueryParams.class, cliOptions.signatureQuery); - return openCGAClient.getVariantClient().runSampleQc( new SampleQcAnalysisParams( cliOptions.sample, @@ -433,7 +428,7 @@ private RestResponse sampleQc() throws ClientException { variantStatsQuery, cliOptions.signatureId, cliOptions.signatureDescription, - signatureQuery, + new ObjectMap(cliOptions.signatureQuery), cliOptions.genomePlotDescr, cliOptions.genomePlotConfigFile, cliOptions.outdir diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java index beccdfee754..2d234acc28e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java @@ -25,7 +25,7 @@ public class MutationalSignatureAnalysisParams extends ToolParams { private String sample; private String id; private String description; - private SampleQcSignatureQueryParams query; + private ObjectMap query; private boolean fitting; private String outdir; @@ -33,7 +33,7 @@ public class MutationalSignatureAnalysisParams extends ToolParams { public MutationalSignatureAnalysisParams() { } - public MutationalSignatureAnalysisParams(String sample, String id, String description, SampleQcSignatureQueryParams query, + public MutationalSignatureAnalysisParams(String sample, String id, String description, ObjectMap query, boolean fitting, String outdir) { this.sample = sample; this.id = id; @@ -83,11 +83,11 @@ public MutationalSignatureAnalysisParams setDescription(String description) { return this; } - public SampleQcSignatureQueryParams getQuery() { + public ObjectMap getQuery() { return query; } - public MutationalSignatureAnalysisParams setQuery(SampleQcSignatureQueryParams query) { + public MutationalSignatureAnalysisParams setQuery(ObjectMap query) { this.query = query; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java index ecc10637e2e..6379d41caf9 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java @@ -16,6 +16,7 @@ package org.opencb.opencga.core.models.variant; +import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.tools.ToolParams; public class SampleQcAnalysisParams extends ToolParams { @@ -24,9 +25,9 @@ public class SampleQcAnalysisParams extends ToolParams { private String variantStatsId; private String variantStatsDescription; private AnnotationVariantQueryParams variantStatsQuery; - private String mutationalSignatureId; - private String mutationalSignatureDescription; - private SampleQcSignatureQueryParams mutationalSignatureQuery; + private String signatureId; + private String signatureDescription; + private ObjectMap signatureQuery; private String genomePlotDescription; private String genomePlotConfigFile; private String outdir; @@ -35,16 +36,16 @@ public SampleQcAnalysisParams() { } public SampleQcAnalysisParams(String sample, String variantStatsId, String variantStatsDescription, - AnnotationVariantQueryParams variantStatsQuery, String mutationalSignatureId, - String mutationalSignatureDescription, SampleQcSignatureQueryParams mutationalSignatureQuery, - String genomePlotDescription, String genomePlotConfigFile, String outdir) { + AnnotationVariantQueryParams variantStatsQuery, String signatureId, String signatureDescription, + ObjectMap signatureQuery, String genomePlotDescription, String genomePlotConfigFile, + String outdir) { this.sample = sample; this.variantStatsId = variantStatsId; this.variantStatsDescription = variantStatsDescription; this.variantStatsQuery = variantStatsQuery; - this.mutationalSignatureId = mutationalSignatureId; - this.mutationalSignatureDescription = mutationalSignatureDescription; - this.mutationalSignatureQuery = mutationalSignatureQuery; + this.signatureId = signatureId; + this.signatureDescription = signatureDescription; + this.signatureQuery = signatureQuery; this.genomePlotDescription = genomePlotDescription; this.genomePlotConfigFile = genomePlotConfigFile; this.outdir = outdir; @@ -57,9 +58,9 @@ public String toString() { sb.append(", variantStatsId='").append(variantStatsId).append('\''); sb.append(", variantStatsDescription='").append(variantStatsDescription).append('\''); sb.append(", variantStatsQuery=").append(variantStatsQuery); - sb.append(", mutationalSignatureId='").append(mutationalSignatureId).append('\''); - sb.append(", mutationalSignatureDescription='").append(mutationalSignatureDescription).append('\''); - sb.append(", mutationalSignatureQuery=").append(mutationalSignatureQuery); + sb.append(", signatureId='").append(signatureId).append('\''); + sb.append(", signatureDescription='").append(signatureDescription).append('\''); + sb.append(", signatureQuery=").append(signatureQuery); sb.append(", genomePlotDescription='").append(genomePlotDescription).append('\''); sb.append(", genomePlotConfigFile='").append(genomePlotConfigFile).append('\''); sb.append(", outdir='").append(outdir).append('\''); @@ -103,30 +104,30 @@ public SampleQcAnalysisParams setVariantStatsQuery(AnnotationVariantQueryParams return this; } - public String getMutationalSignatureId() { - return mutationalSignatureId; + public String getSignatureId() { + return signatureId; } - public SampleQcAnalysisParams setMutationalSignatureId(String mutationalSignatureId) { - this.mutationalSignatureId = mutationalSignatureId; + public SampleQcAnalysisParams setSignatureId(String signatureId) { + this.signatureId = signatureId; return this; } - public String getMutationalSignatureDescription() { - return mutationalSignatureDescription; + public String getSignatureDescription() { + return signatureDescription; } - public SampleQcAnalysisParams setMutationalSignatureDescription(String mutationalSignatureDescription) { - this.mutationalSignatureDescription = mutationalSignatureDescription; + public SampleQcAnalysisParams setSignatureDescription(String signatureDescription) { + this.signatureDescription = signatureDescription; return this; } - public SampleQcSignatureQueryParams getMutationalSignatureQuery() { - return mutationalSignatureQuery; + public ObjectMap getSignatureQuery() { + return signatureQuery; } - public SampleQcAnalysisParams setMutationalSignatureQuery(SampleQcSignatureQueryParams mutationalSignatureQuery) { - this.mutationalSignatureQuery = mutationalSignatureQuery; + public SampleQcAnalysisParams setSignatureQuery(ObjectMap signatureQuery) { + this.signatureQuery = signatureQuery; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcSignatureQueryParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcSignatureQueryParams.java index 403682f8edf..1f43b2f3db6 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcSignatureQueryParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcSignatureQueryParams.java @@ -1,5 +1,6 @@ package org.opencb.opencga.core.models.variant; +import org.opencb.commons.datastore.core.Query; import org.opencb.opencga.core.tools.ToolParams; public class SampleQcSignatureQueryParams extends ToolParams { @@ -16,31 +17,17 @@ public class SampleQcSignatureQueryParams extends ToolParams { public SampleQcSignatureQueryParams() { } - public SampleQcSignatureQueryParams(String sample, String ct, String biotype, String filter, String qual, String region, String gene, - String panel) { - this.sample = sample; - this.ct = ct; - this.biotype = biotype; - this.filter = filter; - this.qual = qual; - this.region = region; - this.gene = gene; - this.panel = panel; + public SampleQcSignatureQueryParams(Query query) { + appendQuery(query); + } + + public SampleQcSignatureQueryParams appendQuery(Query query) { + updateParams(query); + return this; } - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("SampleQcSignatureQueryParams{"); - sb.append("sample='").append(sample).append('\''); - sb.append(", ct='").append(ct).append('\''); - sb.append(", biotype='").append(biotype).append('\''); - sb.append(", filter='").append(filter).append('\''); - sb.append(", qual='").append(qual).append('\''); - sb.append(", region='").append(region).append('\''); - sb.append(", gene='").append(gene).append('\''); - sb.append(", panel='").append(panel).append('\''); - sb.append('}'); - return sb.toString(); + public Query toQuery() { + return new Query(toObjectMap()); } public String getSample() { diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleVariantStatsAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleVariantStatsAnalysisParams.java index 6b764398695..aa32124e051 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleVariantStatsAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleVariantStatsAnalysisParams.java @@ -76,7 +76,8 @@ public SampleVariantStatsAnalysisParams(List sample, List indivi } public SampleVariantStatsAnalysisParams(List sample, List individual, String outdir, boolean index, - boolean indexOverwrite, String indexId, String indexDescription, Integer batchSize, Query variantQuery) { + boolean indexOverwrite, String indexId, String indexDescription, Integer batchSize, + Query variantQuery) { this(sample, individual, outdir, index, indexOverwrite, indexId, indexDescription, batchSize, variantQuery == null ? null : new VariantQueryParams(variantQuery)); } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java index 7c2f86ef8af..f68d6c4a1d7 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java @@ -16,8 +16,8 @@ package org.opencb.opencga.core.tools.variant; +import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.variant.SampleQcSignatureQueryParams; import org.opencb.opencga.core.tools.OpenCgaToolExecutor; import java.io.File; @@ -38,7 +38,7 @@ public abstract class MutationalSignatureAnalysisExecutor extends OpenCgaToolExe private String sample; private String queryId; private String queryDescription; - private SampleQcSignatureQueryParams query; + private ObjectMap query; private boolean fitting; // private String sampleName; @@ -288,11 +288,11 @@ public MutationalSignatureAnalysisExecutor setQueryDescription(String queryDescr return this; } - public SampleQcSignatureQueryParams getQuery() { + public ObjectMap getQuery() { return query; } - public MutationalSignatureAnalysisExecutor setQuery(SampleQcSignatureQueryParams query) { + public MutationalSignatureAnalysisExecutor setQuery(ObjectMap query) { this.query = query; return this; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index cc5cb35b237..b667857f246 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -941,7 +941,7 @@ public Response mutationalSignatureQuery( MutationalSignatureAnalysisParams params = new MutationalSignatureAnalysisParams(); params.setSample(query.getString(SAMPLE.key())) - .setQuery(ToolParams.fromParams(SampleQcSignatureQueryParams.class, query)) + .setQuery(query) .setFitting(fitting); MutationalSignatureAnalysis mutationalSignatureAnalysis = new MutationalSignatureAnalysis(); From 49c3b13d26e0f5db1737c3f15aafe1f931bf557c Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Tue, 1 Jun 2021 14:48:54 +0100 Subject: [PATCH 363/412] client: create phenotype/disorder section of admin notebook #1716 --- .../admin-training/pyopencga_admin.ipynb | 648 +- .../pyopencga_variant_query.ipynb | 197099 ++++++++++++++- 2 files changed, 197557 insertions(+), 190 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb index c05d9432720..fea35295891 100644 --- a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb +++ b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb @@ -2,9 +2,7 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "# Overview\n", "------\n", @@ -50,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 172, + "execution_count": 72, "metadata": {}, "outputs": [], "source": [ @@ -82,14 +80,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For the purpose of the training, we will work with an user that belongs to the @admins group. This means the user has admin priviledges. \n", + "For the purpose of the training, we will work with an user that belongs to the `@admins group`. This means the user has admin priviledges. \n", "\n", - "__[NOTE]__ Working with an admin user is required for follow up with the queries used in this notebook." + "__[NOTE]:__ Working with an admin user is required for follow up with the queries used in this notebook." ] }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 73, "metadata": {}, "outputs": [], "source": [ @@ -100,24 +98,25 @@ }, { "cell_type": "code", - "execution_count": 173, + "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWFkbWluIiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjEyNzAxNCwiZXhwIjoxNjIyMTMwNjE0fQ.bxglbsexgQ0IC0CMVjonPzN47IEh0AyRvSG8Iqp6UW0 well done!\n" + "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWFkbWluIiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjU1NDkxNCwiZXhwIjoxNjIyNTU4NTE0fQ.gI1TQQyNk--4UB6XLxgClgOiMBy5UPEvUC5ETFWGWV8 well done!\n" ] } ], "source": [ "## Step 6. Login to OpenCGA using the OpenCGA client \n", "# Pass the credentials to the client\n", + "\n", "# (here we put only the user in order to be asked for the password interactively)\n", "#oc.login(admin_user)\n", "\n", - "# or you can pass the user and passwd\n", + "## or you can pass the user and passwd\n", "oc.login(admin_user, password)\n", "\n", "print('Logged succesfuly to {}, your token is: {} well done!'.format(host, oc.token))" @@ -136,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 174, + "execution_count": 75, "metadata": {}, "outputs": [], "source": [ @@ -145,7 +144,7 @@ "\n", "## Define the user ids from some NOT admin demo users \n", "user1 = 'trainee1'\n", - "user2 = 'trainee2'\n" + "user2 = 'trainee2'" ] }, { @@ -160,12 +159,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In OpenCGA all the permissions are establish at the study level. \n", + "In OpenCGA all the permissions are established at the study level. \n", "\n", - "All the studys come intrinsically with two administrative groups: `@admins` and `@members`.\n", - "All the users added to a new study belong to the `@members` group. This is useful for keeping track of the users that have access to that specific study. However, `@members` doesn't have any permission defined by default.\n", - "\n", - "Users belonging to the group `@admins`, on the other hand, have administrator priviledges. The admins can add users to an study and grant them permissions. However, an admin can't provide admin priviledges to other users (only the user `owner` of the study is able to do so)." + "All the studies come intrinsically with two administrative groups: `@admins` and `@members`.\n", + "- All the users added to a new study belong to the `@members` group. This is useful for keeping track of the users that have access to that specific study. However, `@members` doesn't have any permission defined by default.\n", + "- Users belonging to the group `@admins`, on the other hand, have administrator priviledges. The admins can add users to an study and grant them permissions. However, an admin can't provide admin priviledges to other users (only the user `owner` of the study is able to do so)." ] }, { @@ -181,90 +179,75 @@ }, { "cell_type": "code", - "execution_count": 175, + "execution_count": 7, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 175, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "## Add users to study\n", - "oc.studies.update_users(study=study, group='members', data={\"users\": [\"trainee1\",\"trainee2\"]})" + "update_users = oc.studies.update_users(study=study, group='members', data={\"users\": [\"trainee1\",\"trainee2\"]})\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(update_users.get_results())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Remove users\n", + "## Check users in the Study\n", + "We can always check the current status of the `@members` group i.e check which users has access to the study, as well that of any other group defined for the study.\n", "\n", - "Inversely, we can remove the users `trainee1` and `trainee2` from the study. Internally, this means that we are removing those users from the `@members` group of the study." + "### Hands-on exercise: \n", + "Run the next cell after adding users `trainee1` and `trainee2`. Then remove them from the group `@members` (code cell below) and run it again. \n", + "- Do you notice any difference in the output?" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 56, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Groups in Study demo@training:admin\n", + "----------------------------------------\n", + "#id\tuserIds\n", + "@members\timedina,llopez,jcoll,wspooner,demo-admin,pfurio,demo\n", + "@admins\timedina,llopez,jcoll,wspooner,demo-admin,pfurio\n" + ] } ], "source": [ - "## Delete users from study\n", - "oc.studies.update_users(study=study, group='members', action='REMOVE', data={\"users\": [\"trainee1\",\"trainee2\"]})" + "## Check Study groups\n", + "groups = oc.studies.groups(study=study)\n", + "groups.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(groups.get_results())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Check users in the Study\n", - "\n", - "In any case, we can always check the current status of the `@members` group i.e check which users has access to the study, as well that of any other group defined for the study.\n", - "\n", - "### Hands-on exercise: \n", - "Run the next cell after adding users `trainee1` and `trainee2`. Then run remove them from the group `@members` and run it again. \n", + "## Remove users\n", "\n", - "Do you notice any difference in the output?" + "Inversely, we can remove the users `trainee1` and `trainee2` from the study. Internally, this means that we are removing those users from the `@members` group of the study." ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 76, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Groups in Study demo@training:admin\n", - "----------------------------------------\n", - "#id\tuserIds\n", - "@members\tpfurio,wspooner,demo-admin,demo,jcoll,llopez,imedina\n", - "@admins\tpfurio,wspooner,demo-admin,jcoll,llopez,imedina\n" - ] - } - ], + "outputs": [], "source": [ - "## Check Study groups\n", - "groups = oc.studies.groups(study=study)\n", - "groups.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n" + "## Remove users from members group of study\n", + "remove_users = oc.studies.update_users(study=study, group='members', action='REMOVE', data={\"users\": [\"trainee1\",\"trainee2\"]})\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(remove_users.get_results())" ] }, { @@ -289,42 +272,18 @@ "metadata": {}, "source": [ "## 1. Create samples\n", + "For this section, it is highly recommended to visit our documentation about the `Sample data model` at [**Sample Data Model**](https://app.gitbook.com/@opencb/s/opencga/manual/data-models/sample).\n", "\n", "First, let's create 3 samples: `sample1`, `sample2-germinal` and `sample2-somatic`. The most straight-forward way to create samples is using a loop, as showed in the next cell:" ] }, { "cell_type": "code", - "execution_count": 207, + "execution_count": 78, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Info about sample sample1\n", - "------------------------------\n", - "#id\tcollection\tsomatic\n", - "sample1\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tFalse\n", - "\n", - "\n", - "Info about sample sample2-germinal\n", - "---------------------------------------\n", - "#id\tcollection\tsomatic\n", - "sample2-germinal\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tFalse\n", - "\n", - "\n", - "Info about sample sample2-somatic\n", - "--------------------------------------\n", - "#id\tcollection\tsomatic\n", - "sample2-somatic\t{'tissue': 'skin', 'organ': 'skin', 'method': 'biopsy'}\tTrue\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ - "## Create 3 samples\n", + "## Create 3 samples taking into account if they're somatic or germinal\n", "sample_ids = ['sample1', 'sample2-germinal', 'sample2-somatic']\n", "\n", "for sample in sample_ids:\n", @@ -348,63 +307,76 @@ " }\n", "\n", " oc.samples.create(study=study, data=sample_data)\n", + " print('The sample: {} has been created successfully'.format(sample))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Check information about the created Samples\n", + "\n", + "We can use the `samples.search()` function to look for information about the recently created samples." + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [], + "source": [ + "## Search Samples\n", + "sample_ids = ['sample1', 'sample2-germinal', 'sample2-somatic']\n", + "\n", + "for sample in sample_ids:\n", " samples = oc.samples.search(study=study, id=sample)\n", " samples.print_results(fields='id,collection,somatic', metadata=False, title='Info about sample {}'.format(sample))\n", " print('\\n')\n", - " " + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "samples = oc.samples.search(study=study, id=sample_ids)\n", + "# JSON(samples.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Delete Samples:\n", + "\n", + "__[NOTE]:__ Be aware that if you delete the samples at this stage, you won't be able to associate the `samples` to the correspondent `individuals` in the next subsection." ] }, { "cell_type": "code", - "execution_count": 206, + "execution_count": 77, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 206, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "## Uncomment this to delete the samples\n", - "oc.samples.delete(study=study, samples=['sample1,sample2-germinal,sample2-somatic'])" + "# delete_samples = oc.samples.delete(study=study, samples=['sample1,sample2-germinal,sample2-somatic'])\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(delete_samples.get_results())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 2. Create individuals associated with the samples\n", - "\n", - "Remember that OpenCGA `individual` data model allows to have multiple samples assigned to the same individual. A typical use case can be found in cancer genetic screen, where usually two samples are taken from the same individual: one from the tumour (somatic sample), and one germinal.\n", + "## 2. Create individuals \n", "\n", - "Bearing that in mind, we can create some individual entities in the database. In this case, let's assume that `sample1` corresponds to `individual1`, whilst `sample2-germinal` and `sample2-somatic` correspond to `individual2`." + "Now let's create a couple of `individuals`. For this section, it is highly recommended to visit our documentation about the individual data model at [**Individual Data Model**](https://app.gitbook.com/@opencb/s/opencga/manual/data-models/individual)." ] }, { "cell_type": "code", - "execution_count": 208, + "execution_count": 80, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "individual individual1 created succesfully!\n", - "individual individual2 created succesfully!\n" - ] - } - ], + "outputs": [], "source": [ - "## Create 2 individuals associated to the samples\n", - "\n", + "## Create 2 individuals \n", "individual_ids = ['individual1', 'individual2']\n", - "sample_dict={'individual1':['sample1'], 'individual2':['sample2-germinal', 'sample2-somatic']}\n", "\n", "for individual in individual_ids:\n", " individual_data= {\n", @@ -422,93 +394,435 @@ " \"dateOfBirth\": \"19900587\",\n", " \"karyotypicSex\": \"XY\",\n", " \"lifeStatus\": \"ALIVE\"}\n", - " oc.individuals.create(study=study, data=individual_data, samples=sample_dict[individual])\n", - " print('individual {} created succesfully!'.format(individual))\n" + " oc.individuals.create(study=study, data=individual_data)\n", + " print('The individual {} has been created succesfully'.format(individual))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Check information about the created individuals" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [], + "source": [ + "## Print information about the individuals\n", + "individual_ids = ['individual1', 'individual2']\n", + "for individual in individual_ids:\n", + " individuals = oc.individuals.search(study=study, id=individual)\n", + " individuals.print_results(fields='id,name,sex,ethnicity,lifeStatus,population,dateOfBirth', metadata=False, title='Info about individual {}'.format(individual))\n", + " print('\\n')\n", + " \n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "individuals = oc.individuals.search(study=study, id=individual_ids)\n", + "# JSON(individuals.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Associate samples with individuals\n", + "\n", + "Remember that OpenCGA `individual` data model allows to have multiple samples assigned to the same individual. A typical use case can be found in cancer genetic screen, where usually two samples are taken from the same individual: one from the tumour (somatic sample), and one germinal.\n", + "\n", + "Bearing that in mind, we can create some individual entities in the database. In this case, let's assume that `sample1` corresponds to `individual1`, whilst `sample2-germinal` and `sample2-somatic` correspond to `individual2`." + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "## Define a dictionary with the samples for each individual\n", + "individual_ids = ['individual1', 'individual2']\n", + "sample_dict={'individual1':['sample1'], 'individual2':['sample2-germinal', 'sample2-somatic']}\n", + "\n", + "## Asign Samples to individuals\n", + "for individual in individual_ids:\n", + " samples_associated = sample_dict[individual]\n", + " oc.individuals.update(study=study, individuals=individual, data={'samples':samples_associated})\n", + " print('The individual {} has been updated successfully!'.format(individual))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Check Samples associated to the Individuals" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [], + "source": [ + "## Print information about the individuals with their correspondent samples\n", + "individual_ids = ['individual1', 'individual2']\n", + "for individual in individual_ids:\n", + " individuals = oc.individuals.search(study=study, id=individual)\n", + " individuals.print_results(fields='id,samples.id,samples.somatic,samples.collection.tissue,samples.collection.method', metadata=False, title='Info about individual {} with the samples'.format(individual))\n", + " print('\\n')\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "individuals = oc.individuals.search(study=study, id=individual_ids, include='samples')\n", + "# JSON(individuals.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Delete Individuals" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [], + "source": [ + "## Uncomment this to delete the individuals\n", + "delete_individuals = oc.individuals.delete(study=study, individuals='individual1,individual2')\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(delete_individuals.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Define phenotypes or diseases for individuals\n", + "------\n", + "\n", + "OpenCGA defines a set of rich data models, that can be useful for storing any kind of annotation. The individual entity can be associated with phenotypes and diseases ontologies. We support many ontology sources. Individuals that can be easily queried by its associated phenotypes and diseases once they are annotated.\n", + "\n", + "For this section, it is highly recommended to visit our documentation about the individual data model at [**Individual Data Model**](https://app.gitbook.com/@opencb/s/opencga/manual/data-models/individual)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Update already existing individuals with phenotypes\n", + "\n", + "### - Create new `individuals`\n", + "Lets create a couple of new individuals for this part of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "## Create 2 new individuals\n", + "individual_ids = ['individual_A', 'individual_B'] \n", + "for individual in individual_ids:\n", + " individual_data= {\n", + " \"id\": individual,\n", + " \"name\": individual,\n", + " \"location\": {\n", + " \"postalCode\": \"47400A\",\n", + " },\n", + " \"sex\": \"FEMALE\",\n", + " \"ethnicity\": \"black\",\n", + " \"parentalConsanguinity\":'false',\n", + " \"population\": {\n", + " \"name\": \"british\"\n", + " },\n", + " \"dateOfBirth\": \"19900587\",\n", + " \"karyotypicSex\": \"XX\",\n", + " \"lifeStatus\": \"ALIVE\"}\n", + " oc.individuals.create(study=study, data=individual_data)\n", + " print('The individual {} has been created succesfully'.format(individual))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Assign Phenotypes\n", + "Now we can assign them the desired phenotypes by using `individuals.update()`. \n", + "\n", + "Remember that one individual might have more than one phenotype (`individual_B` in the next example)." ] }, { "cell_type": "code", - "execution_count": 209, + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "## Define a dictionary with the phenotyoes for each individual\n", + "individual_ids = ['individual_A', 'individual_B'] \n", + "phenotype_dict = {\n", + " 'individual_A':[{'id':'HP:0001626',\n", + " 'name':'phenotype_A',\n", + " 'source':'HPO',\n", + " 'ageOfOnset':'15',\n", + " 'status':'OBSERVED'}], \n", + " 'individual_B':[{'id':'HP:0000119',\n", + " 'name':'phenotype_B',\n", + " 'source':'HPO',\n", + " 'status':'OBSERVED'}, \n", + " {'id':'HP:0000478',\n", + " 'name':'phenotype_C',\n", + " 'source':'HPO',\n", + " 'status': 'OBSERVED'}]\n", + " }\n", + "\n", + "\n", + "## Assign Phenotypes to individuals\n", + "for individual in individual_ids:\n", + " phenotypes_associated = phenotype_dict[individual]\n", + " oc.individuals.update(study=study, individuals=individual, data={'phenotypes':phenotypes_associated})\n", + " print('The individual {} has been updated successfully!'.format(individual))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Check Phenotypes of the Individuals" + ] + }, + { + "cell_type": "code", + "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Info about individual individual1\n", - "--------------------------------------\n", - "#id\tname\tsex\tethnicity\tlifeStatus\n", - "individual1\tindividual1\tMALE\tblack\tALIVE\n", + "Info about the phenotypes of individual: individual_A\n", + "----------------------------------------------------------\n", + "#id\tphenotypes.id\tphenotypes.name\tphenotypes.source\tphenotypes.status\n", + "individual_A\tHP:0001626\tphenotype_A\tHPO\tOBSERVED\n", "\n", "\n", - "Info about individual individual2\n", - "--------------------------------------\n", - "#id\tname\tsex\tethnicity\tlifeStatus\n", - "individual2\tindividual2\tMALE\tblack\tALIVE\n", + "Info about the phenotypes of individual: individual_B\n", + "----------------------------------------------------------\n", + "#id\tphenotypes.id\tphenotypes.name\tphenotypes.source\tphenotypes.status\n", + "individual_B\tHP:0000119,HP:0000478\tphenotype_B,phenotype_C\tHPO\tOBSERVED\n", "\n", "\n" ] } ], "source": [ + "## Print information about the individuals with their correspondent samples\n", + "individual_ids = ['individual_A', 'individual_B'] \n", "for individual in individual_ids:\n", " individuals = oc.individuals.search(study=study, id=individual)\n", - " individuals.print_results(fields='id,name,sex,ethnicity,lifeStatus', metadata=False, title='Info about individual {}'.format(individual))\n", + " individuals.print_results(fields='id,phenotypes.id,phenotypes.name,phenotypes.source,phenotypes.status', metadata=False, title='Info about the phenotypes of individual: {}'.format(individual))\n", " print('\\n')\n", - " JSON(individuals.get_results())\n" + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "individuals = oc.individuals.search(study=study, id=individual_ids, include='phenotypes')\n", + "# JSON(individuals.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Assign Disorders\n", + "\n", + "Similarly to phenotypes, we can also update the disorders for an Individual." ] }, { "cell_type": "code", - "execution_count": 205, + "execution_count": 94, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 205, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "## Uncomment this to delete the samples\n", - "oc.individuals.delete(study=study, individuals='individual1,individual2')" + "## Define a dictionary with the Disorders for each Individual\n", + "individual_ids = ['individual_A', 'individual_B'] \n", + "disorders_dict = {\n", + " 'individual_A':[{'id':'OMIM:300600',\n", + " 'name':'disorder_A',\n", + " 'source':'OMIM',\n", + " 'description':'Aland Island Eye Disease'}], \n", + " 'individual_B':[{'id':'OMIM:203450',\n", + " 'name':'disorder_B',\n", + " 'source':'OMIM',\n", + " 'description':'Alexander Disease'}, \n", + " {'id':'OMIM:104300',\n", + " 'name':'disorder_C',\n", + " 'source':'OMIM',\n", + " 'description':'Alzheimer Disease'}]\n", + " }\n", + "\n", + "## Assign Disorders to Individuals\n", + "for individual in individual_ids:\n", + " disorders_associated = disorders_dict[individual]\n", + " oc.individuals.update(study=study, individuals=individual, data={'disorders':disorders_associated})\n", + " print('The individual {} has been updated successfully!'.format(individual))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Define phenotypes or diseases for individuals\n", - "------" + "### - Check Disorders of the Individuals" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [], + "source": [ + "## Print information about the individuals with their correspondent samples\n", + "individual_ids = ['individual_A', 'individual_B'] \n", + "for individual in individual_ids:\n", + " individuals = oc.individuals.search(study=study, id=individual)\n", + " individuals.print_results(fields='id,disorders.id,disorders.name,disorders.source,disorders.description', metadata=False, title='Info about the disorders of individual: {}'.format(individual))\n", + " print('\\n')\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "individuals = oc.individuals.search(study=study, id=individual_ids, include='disorders')\n", + "# JSON(individuals.get_results())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Define, add, edit and remove variable sets\n", - "----------" + "### - Delete Individuals" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [], + "source": [ + "## Uncomment this to delete the individuals\n", + "delete_individuals = oc.individuals.delete(study=study, individuals=individual_ids)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(delete_individuals.get_results())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Use Cases\n", - "------" + "## 2. Create individual with associated phenotypes and disorders\n", + "\n", + "If we have phenotype and disorder information about one individual at the time of creating the entity in OpenCGA Catalog, we cal always create the individual with all the associated information directly.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "## Construct an individual data model\n", + "individual_data = {\n", + " \"id\": \"Individual_with_data\",\n", + " \"name\": \"Jonh\",\n", + " \"location\": {\n", + " \"city\": \"New York\",\n", + " \"country\": \"USA\"\n", + " },\n", + " \"sex\": \"MALE\",\n", + " \"ethnicity\": \"american\",\n", + " \"dateOfBirth\": \"18800722\",\n", + " \"karyotypicSex\": \"XY\",\n", + " \"lifeStatus\": \"ALIVE\",\n", + " \"phenotypes\": [{'id':'HP:0001626',\n", + " 'name':'phenotype_A',\n", + " 'source':'HPO',\n", + " 'ageOfOnset':'15',\n", + " 'status':'OBSERVED'}],\n", + " \"disorders\": [{'id':'OMIM:104300',\n", + " 'name':'disorder_C',\n", + " 'source':'OMIM',\n", + " 'description':'Alzheimer Disease',\n", + " 'evidences':[{\n", + " 'id':'HP:0001626',\n", + " 'name':'phenotype_A',\n", + " 'source':'HPO',\n", + " 'ageOfOnset':'15',\n", + " 'status':'OBSERVED'}]}]\n", + " }\n", + "\n", + "## Create the individual\n", + "Individual_with_data = oc.individuals.create(study=study, data=individual_data)\n", + "print('The individual has been successfully created')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Hands-on Exercise: Check the individual data model\n", + "\n", + "Tun the next cell to display the data from the created individual using the interactive JSON viewer. \n", + "\n", + "Now compare the data with the individual data model at [**Individual Data Model**](https://app.gitbook.com/@opencb/s/opencga/manual/data-models/individual). Can you see the parallelism?" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 98, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "## Display an interactive JSON viewer of the REST response\n", + "individuals = oc.individuals.search(study=study, id='Individual_with_data')\n", + "JSON(individuals.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Delete the individual\n" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [], + "source": [ + "## Uncomment this to delete the individuals\n", + "delete_individuals = oc.individuals.delete(study=study, individuals='Individual_with_data')\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(delete_individuals.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Define, add, edit and remove variable sets\n", + "----------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Use Cases\n", + "------" + ] } ], "metadata": { @@ -531,5 +845,5 @@ } }, "nbformat": 4, - "nbformat_minor": 1 -} + "nbformat_minor": 4 +} \ No newline at end of file diff --git a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb index 15f2e5fe7bf..41cbd0abf53 100644 --- a/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb +++ b/opencga-client/src/main/python/notebooks/user-training/pyopencga_variant_query.ipynb @@ -45,14 +45,14 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MTg0OTM3MDQsImV4cCI6MTYxODQ5NzMwNH0.KtfSt8jD8liZIxlsSAJ7hXBopHMy3_tZ3mAbl9AeUS8 well done!\n" + "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vdXNlciIsImF1ZCI6Ik9wZW5DR0EgdXNlcnMiLCJpYXQiOjE2MjIyMDExNzMsImV4cCI6MTYyMjIwNDc3M30.IAeBLFV-v3hl0Jes2R6kkrOGMenQ2n1p5_nN8BpOh38 well done!\n" ] } ], @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +160,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -169,34 +169,197087 @@ "text": [ "Filter by Region\n", "---------------------\n", - "#Time: 937\n", + "#Time: 1296\n", "#Num matches: 360\n", "#Num results: 360\n", "#Num inserted: 0\n", "#Num updated: 0\n", "#Num deleted: 0\n", "#id\tannotation.consequenceTypes.geneName\tannotation.displayConsequenceType\n", - "15:22830185:T:C\t,TUBGCP5\tupstream_gene_variant\n", - "15:22833202:C:T\t,TUBGCP5\t2KB_upstream_variant\n", - "15:22840279:G:T\t,TUBGCP5\tsynonymous_variant\n", - "15:22849186:T:-\t,TUBGCP5\tnon_coding_transcript_exon_variant\n", - "15:22853997:C:T\t,TUBGCP5\tintron_variant\n", - "15:22862384:C:A\t,TUBGCP5\tintron_variant\n", - "15:22864438:A:G\t,TUBGCP5\tintron_variant\n", - "15:22866621:G:A\t,TUBGCP5\tintron_variant\n", - "15:22867123:-:AAG\t,TUBGCP5\tnon_coding_transcript_exon_variant\n", - "15:22869804:A:G\t,TUBGCP5\tintron_variant\n", + "15:22830185:T:C\tTUBGCP5\tupstream_gene_variant\n", + "15:22833202:C:T\tTUBGCP5\t2KB_upstream_variant\n", + "15:22840279:G:T\tTUBGCP5\tsynonymous_variant\n", + "15:22849186:T:-\tTUBGCP5\tnon_coding_transcript_exon_variant\n", + "15:22853997:C:T\tTUBGCP5\tintron_variant\n", + "15:22862384:C:A\tTUBGCP5\tintron_variant\n", + "15:22864438:A:G\tTUBGCP5\tintron_variant\n", + "15:22866621:G:A\tTUBGCP5\tintron_variant\n", + "15:22867123:-:AAG\tTUBGCP5\tnon_coding_transcript_exon_variant\n", + "15:22869804:A:G\tTUBGCP5\tintron_variant\n", "\n", "\n" ] - } - ], - "source": [ - "## Filter by a small region of chromsome 15\n", - "variants = oc.variants.query(study=study, region='15:21242091-23226874', exclude='studies', limit=500)\n", - "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Region', limit=10) # metadata=False\n", - "print(RESULT_SEPARATOR)\n", - "#JSON(variants.get_results())" + }, + { + "data": { + "application/json": [ + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.04399999976158142, + "source": "phastCons" + }, + { + "score": -2.075000047683716, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "upstream_gene_variant", + "functionalScore": [ + { + "score": 0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 3.5399999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [], + "id": "rs112594533", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.3795492, + "altHomGenotypeFreq": 0.18010753, + "hetGenotypeFreq": 0.39888337, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6204508, + "refHomGenotypeFreq": 0.4210091, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36309522, + "altHomGenotypeFreq": 0.15773809, + "hetGenotypeFreq": 0.4107143, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6369048, + "refHomGenotypeFreq": 0.4315476, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24121405, + "altHomGenotypeFreq": 0.12779553, + "hetGenotypeFreq": 0.22683705, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.75878596, + "refHomGenotypeFreq": 0.6453674, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26357827, + "altHomGenotypeFreq": 0.092651755, + "hetGenotypeFreq": 0.34185302, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7364217, + "refHomGenotypeFreq": 0.5654952, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42727274, + "altHomGenotypeFreq": 0.2090909, + "hetGenotypeFreq": 0.43636364, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.57272726, + "refHomGenotypeFreq": 0.35454544, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4566193, + "altHomGenotypeFreq": 0.23635004, + "hetGenotypeFreq": 0.44053853, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.5433807, + "refHomGenotypeFreq": 0.32311144, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31390354, + "altHomGenotypeFreq": 0.12595196, + "hetGenotypeFreq": 0.37590313, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.6860965, + "refHomGenotypeFreq": 0.4981449, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52567697, + "altHomGenotypeFreq": 0.29691878, + "hetGenotypeFreq": 0.45751634, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.47432306, + "refHomGenotypeFreq": 0.2455649, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37553728, + "altHomGenotypeFreq": 0.18090077, + "hetGenotypeFreq": 0.38927305, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6244627, + "refHomGenotypeFreq": 0.4298262, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38451746, + "altHomGenotypeFreq": 0.1791252, + "hetGenotypeFreq": 0.41078454, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.6154825, + "refHomGenotypeFreq": 0.41009027, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3717435, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6282565, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2578125, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.265625, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.7421875, + "refHomGenotypeFreq": 0.609375, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36102235, + "altHomGenotypeFreq": 0.20047924, + "hetGenotypeFreq": 0.32108626, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.63897765, + "refHomGenotypeFreq": 0.4784345, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4805726, + "altHomGenotypeFreq": 0.25357872, + "hetGenotypeFreq": 0.45398772, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.5194274, + "refHomGenotypeFreq": 0.29243353, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28723404, + "altHomGenotypeFreq": 0.095744684, + "hetGenotypeFreq": 0.38297874, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.71276593, + "refHomGenotypeFreq": 0.5212766, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47549018, + "altHomGenotypeFreq": 0.2254902, + "hetGenotypeFreq": 0.5, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.5245098, + "refHomGenotypeFreq": 0.27450982, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48335856, + "altHomGenotypeFreq": 0.34341908, + "hetGenotypeFreq": 0.27987897, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.51664144, + "refHomGenotypeFreq": 0.37670198, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12857144, + "altHomGenotypeFreq": 0.04761905, + "hetGenotypeFreq": 0.16190477, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.87142855, + "refHomGenotypeFreq": 0.7904762, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1923077, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.25, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.8076923, + "refHomGenotypeFreq": 0.6826923, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5324074, + "altHomGenotypeFreq": 0.37962964, + "hetGenotypeFreq": 0.30555555, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.4675926, + "refHomGenotypeFreq": 0.3148148, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5052083, + "altHomGenotypeFreq": 0.28125, + "hetGenotypeFreq": 0.44791666, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.49479166, + "refHomGenotypeFreq": 0.27083334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50884956, + "altHomGenotypeFreq": 0.36283186, + "hetGenotypeFreq": 0.2920354, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.49115044, + "refHomGenotypeFreq": 0.34513274, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49509802, + "altHomGenotypeFreq": 0.2647059, + "hetGenotypeFreq": 0.46078432, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.50490195, + "refHomGenotypeFreq": 0.27450982, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3021978, + "altHomGenotypeFreq": 0.12087912, + "hetGenotypeFreq": 0.36263737, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.6978022, + "refHomGenotypeFreq": 0.51648355, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2311828, + "altHomGenotypeFreq": 0.15053764, + "hetGenotypeFreq": 0.16129032, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.7688172, + "refHomGenotypeFreq": 0.68817204, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18686868, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.1919192, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.81313133, + "refHomGenotypeFreq": 0.7171717, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42523363, + "altHomGenotypeFreq": 0.22429906, + "hetGenotypeFreq": 0.40186918, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.57476634, + "refHomGenotypeFreq": 0.37383178, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4651163, + "altHomGenotypeFreq": 0.25581396, + "hetGenotypeFreq": 0.41860467, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.53488374, + "refHomGenotypeFreq": 0.3255814, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41145834, + "altHomGenotypeFreq": 0.26041666, + "hetGenotypeFreq": 0.3020833, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.5885417, + "refHomGenotypeFreq": 0.4375, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42424244, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.24242425, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.57575756, + "refHomGenotypeFreq": 0.45454547, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5050505, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.24242423, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.4949495, + "refHomGenotypeFreq": 0.37373737, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3469185, + "altHomGenotypeFreq": 0.15506959, + "hetGenotypeFreq": 0.3836978, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.65308154, + "refHomGenotypeFreq": 0.4612326, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47540984, + "altHomGenotypeFreq": 0.3442623, + "hetGenotypeFreq": 0.26229507, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.52459013, + "refHomGenotypeFreq": 0.39344263, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25504324, + "altHomGenotypeFreq": 0.09221902, + "hetGenotypeFreq": 0.32564843, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7449568, + "refHomGenotypeFreq": 0.5821326, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5176471, + "altHomGenotypeFreq": 0.3647059, + "hetGenotypeFreq": 0.30588236, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.48235294, + "refHomGenotypeFreq": 0.32941177, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46116504, + "altHomGenotypeFreq": 0.24271844, + "hetGenotypeFreq": 0.4368932, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.5388349, + "refHomGenotypeFreq": 0.32038835, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34343433, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.3838384, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.65656567, + "refHomGenotypeFreq": 0.46464646, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3598131, + "altHomGenotypeFreq": 0.1682243, + "hetGenotypeFreq": 0.38317758, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.6401869, + "refHomGenotypeFreq": 0.44859812, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31730768, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.3846154, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.6826923, + "refHomGenotypeFreq": 0.4903846, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2929293, + "altHomGenotypeFreq": 0.1010101, + "hetGenotypeFreq": 0.3838384, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.7070707, + "refHomGenotypeFreq": 0.5151515, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14117648, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.23529413, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.85882354, + "refHomGenotypeFreq": 0.7411765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17162699, + "altHomGenotypeFreq": 0.08134921, + "hetGenotypeFreq": 0.18055555, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.828373, + "refHomGenotypeFreq": 0.7380952, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1262136, + "altHomGenotypeFreq": 0.058252428, + "hetGenotypeFreq": 0.13592233, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.8737864, + "refHomGenotypeFreq": 0.80582523, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 36, + "copyNumber": 281.7, + "end": 22832932, + "percentageMatch": 0.76, + "period": 36, + "score": 8156, + "sequence": "CCAGGTGGGGTTATGAAGTCCCCCCAGCACCTCTGG", + "source": "trf", + "start": 22822520 + }, + { + "chromosome": "15", + "consensusSize": 251, + "copyNumber": 40, + "end": 22832874, + "percentageMatch": 0.83, + "period": 262, + "score": 10182, + "sequence": "CCAGGTGGGGTTATGATATCCCCCAGCACCTCTGGCCAGGTGAGGTTATGATGTCCCCCCAGCACCTCTGGCCAGGTGGGGTTATGAAGTCCCCCCAGCACCTCTGGCCAGGTGGGGTTATGAAGTCCCCCCAGCACCTCTGGCCAGGTGGGGTTATGAAGTCCCCCCCAGCACCTCTGGCCAGGTGGGGTTATGATGGCCCCCCAGCACCTCTGGCCAGGTGGGTTATGATGTCCCCCCAGCACCTCTGG", + "source": "trf", + "start": 22822520 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22832518, + "id": "9220", + "percentageMatch": 0.936749, + "source": "genomicSuperDup", + "start": 22826647 + } + ], + "start": 22830185, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22830185, + "id": "15:22830185:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22830185, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558664", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.1600000858306885, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -2.385999917984009, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.18000030517578125, + "source": "cadd_raw" + }, + { + "score": 4.550000190734863, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [], + "id": "rs62009502", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.1329987, + "altHomGenotypeFreq": 0.025323834, + "hetGenotypeFreq": 0.21541451, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8669689, + "refHomGenotypeFreq": 0.75926167, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.090631366, + "altHomGenotypeFreq": 0.014256619, + "hetGenotypeFreq": 0.1527495, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.90936863, + "refHomGenotypeFreq": 0.83299387, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47201493, + "altHomGenotypeFreq": 0.23134328, + "hetGenotypeFreq": 0.48258707, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5273632, + "refHomGenotypeFreq": 0.28606966, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.05966587, + "altHomGenotypeFreq": 0.00477327, + "hetGenotypeFreq": 0.1097852, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.94033414, + "refHomGenotypeFreq": 0.88544154, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10927153, + "altHomGenotypeFreq": 0.013245033, + "hetGenotypeFreq": 0.19205298, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.8907285, + "refHomGenotypeFreq": 0.794702, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09044076, + "altHomGenotypeFreq": 0.007441328, + "hetGenotypeFreq": 0.16599886, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.90955925, + "refHomGenotypeFreq": 0.82655984, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09460182, + "altHomGenotypeFreq": 0.010154997, + "hetGenotypeFreq": 0.16889364, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.9053982, + "refHomGenotypeFreq": 0.82095134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16620626, + "altHomGenotypeFreq": 0.02417127, + "hetGenotypeFreq": 0.28407, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.83379376, + "refHomGenotypeFreq": 0.69175875, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14074768, + "altHomGenotypeFreq": 0.029766787, + "hetGenotypeFreq": 0.222079, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.85919374, + "refHomGenotypeFreq": 0.7481542, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12342551, + "altHomGenotypeFreq": 0.01983495, + "hetGenotypeFreq": 0.20718113, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.8765745, + "refHomGenotypeFreq": 0.7729839, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.081162326, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.91883767, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0546875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.109375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.9453125, + "refHomGenotypeFreq": 0.890625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17991214, + "altHomGenotypeFreq": 0.051517572, + "hetGenotypeFreq": 0.25678915, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.82008785, + "refHomGenotypeFreq": 0.6916933, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06237219, + "altHomGenotypeFreq": 0.0020449897, + "hetGenotypeFreq": 0.1206544, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.9376278, + "refHomGenotypeFreq": 0.8773006, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06382979, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12765957, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.9361702, + "refHomGenotypeFreq": 0.87234044, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.014705882, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.029411767, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.9852941, + "refHomGenotypeFreq": 0.9705882, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19742814, + "altHomGenotypeFreq": 0.04236006, + "hetGenotypeFreq": 0.31013614, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.80257183, + "refHomGenotypeFreq": 0.6475038, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50476193, + "altHomGenotypeFreq": 0.23809524, + "hetGenotypeFreq": 0.53333336, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.4952381, + "refHomGenotypeFreq": 0.22857143, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4278846, + "altHomGenotypeFreq": 0.21153846, + "hetGenotypeFreq": 0.43269232, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.57211536, + "refHomGenotypeFreq": 0.35576922, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18055555, + "altHomGenotypeFreq": 0.037037037, + "hetGenotypeFreq": 0.28703704, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.8194444, + "refHomGenotypeFreq": 0.6759259, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.072916664, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14583333, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.9270833, + "refHomGenotypeFreq": 0.8541667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26106194, + "altHomGenotypeFreq": 0.07964602, + "hetGenotypeFreq": 0.36283186, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.73893803, + "refHomGenotypeFreq": 0.5575221, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.068627454, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13725491, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.9313725, + "refHomGenotypeFreq": 0.8627451, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.093406595, + "altHomGenotypeFreq": 0.010989011, + "hetGenotypeFreq": 0.16483517, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.9065934, + "refHomGenotypeFreq": 0.82417583, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4784946, + "altHomGenotypeFreq": 0.17204301, + "hetGenotypeFreq": 0.61290324, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.52150536, + "refHomGenotypeFreq": 0.21505377, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.4949495, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.37373737, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.093457945, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18691589, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.90654206, + "refHomGenotypeFreq": 0.8130841, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06395349, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12790698, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.93604654, + "refHomGenotypeFreq": 0.872093, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.125, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.22916667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.875, + "refHomGenotypeFreq": 0.7604167, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17676768, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.2929293, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.82323235, + "refHomGenotypeFreq": 0.67676765, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26767677, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.41414142, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.7323232, + "refHomGenotypeFreq": 0.5252525, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08747515, + "altHomGenotypeFreq": 0.01192843, + "hetGenotypeFreq": 0.15109344, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.9125249, + "refHomGenotypeFreq": 0.83697814, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1557377, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.8442623, + "refHomGenotypeFreq": 0.72131145, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.05331412, + "altHomGenotypeFreq": 0.0028818443, + "hetGenotypeFreq": 0.10086456, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.94668585, + "refHomGenotypeFreq": 0.8962536, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1882353, + "altHomGenotypeFreq": 0.03529412, + "hetGenotypeFreq": 0.30588236, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.8117647, + "refHomGenotypeFreq": 0.65882355, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09223301, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.16504854, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.907767, + "refHomGenotypeFreq": 0.8252427, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10606061, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.1919192, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.8939394, + "refHomGenotypeFreq": 0.7979798, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06542056, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.11214953, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.93457943, + "refHomGenotypeFreq": 0.8785047, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.072115384, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.125, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.92788464, + "refHomGenotypeFreq": 0.86538464, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08080808, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.1010101, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.9191919, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.01764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03529412, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.9823529, + "refHomGenotypeFreq": 0.9647059, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45039684, + "altHomGenotypeFreq": 0.1845238, + "hetGenotypeFreq": 0.53174603, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.54960316, + "refHomGenotypeFreq": 0.28373015, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46116504, + "altHomGenotypeFreq": 0.16504854, + "hetGenotypeFreq": 0.592233, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5388349, + "refHomGenotypeFreq": 0.24271844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09587411, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.90412587, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.093452714, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.9065473, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09859886, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.90140116, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09304207, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.9069579, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22833202, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22833202, + "id": "15:22833202:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22833202, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "cdnaPosition": 475, + "cdsPosition": 345, + "codon": "ctG/ctT", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "exonOverlap": [ + { + "number": "4/23", + "percentage": 1.0309278 + } + ], + "geneName": "TUBGCP5", + "proteinVariantAnnotation": { + "alternate": "LEU", + "position": 115, + "reference": "LEU" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 374, + "cdsPosition": 345, + "codon": "ctG/ctT", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "exonOverlap": [ + { + "number": "4/22", + "percentage": 1.0309278 + } + ], + "geneName": "TUBGCP5", + "proteinVariantAnnotation": { + "alternate": "LEU", + "position": 115, + "reference": "LEU" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 88, + "cdsPosition": 90, + "codon": "ctG/ctT", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558664", + "exonOverlap": [ + { + "number": "2/6", + "percentage": 1.0309278 + } + ], + "geneName": "TUBGCP5", + "proteinVariantAnnotation": { + "alternate": "LEU", + "position": 30, + "reference": "LEU" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.6069999933242798, + "source": "gerp" + }, + { + "score": 0.9959999918937683, + "source": "phastCons" + }, + { + "score": 0.5910000205039978, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": 1.390000343322754, + "source": "cadd_raw" + }, + { + "score": 12.779999732971191, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.345G>T", + "ENSP00000283645:p.Leu115=", + "ENST00000453949(ENSG00000153575):c.345G>T", + "ENSP00000409217:p.Leu115=", + "ENST00000558664(ENSG00000153575):c.88G>T", + "ENSP00000453810:p.Leu30=" + ], + "id": "rs61744212", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.100928485, + "altHomGenotypeFreq": 0.020573502, + "hetGenotypeFreq": 0.1641907, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8973311, + "refHomGenotypeFreq": 0.8152358, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08375934, + "altHomGenotypeFreq": 0.011010617, + "hetGenotypeFreq": 0.15139599, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.9132914, + "refHomGenotypeFreq": 0.8375934, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45361167, + "altHomGenotypeFreq": 0.20516899, + "hetGenotypeFreq": 0.49688536, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5463883, + "refHomGenotypeFreq": 0.29794565, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.029993113, + "altHomGenotypeFreq": 0.0013085399, + "hetGenotypeFreq": 0.059917357, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9687328, + "refHomGenotypeFreq": 0.9387741, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.116550855, + "altHomGenotypeFreq": 0.015371657, + "hetGenotypeFreq": 0.2023584, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.88344914, + "refHomGenotypeFreq": 0.78226995, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08466788, + "altHomGenotypeFreq": 0.008735213, + "hetGenotypeFreq": 0.15241128, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.91505915, + "refHomGenotypeFreq": 0.8388535, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08875244, + "altHomGenotypeFreq": 0.009500313, + "hetGenotypeFreq": 0.16474575, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.90812683, + "refHomGenotypeFreq": 0.8257539, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.040933695, + "altHomGenotypeFreq": 0.001623816, + "hetGenotypeFreq": 0.07943166, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.95866036, + "refHomGenotypeFreq": 0.91894454, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10118889, + "altHomGenotypeFreq": 0.019731166, + "hetGenotypeFreq": 0.16650721, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.8970152, + "refHomGenotypeFreq": 0.81376165, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10060935, + "altHomGenotypeFreq": 0.021605827, + "hetGenotypeFreq": 0.16135171, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.8977183, + "refHomGenotypeFreq": 0.81704247, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09744554, + "altHomGenotypeFreq": 0.019061204, + "hetGenotypeFreq": 0.15981586, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.90103084, + "refHomGenotypeFreq": 0.82112294, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.086065575, + "altHomGenotypeFreq": 0.014344262, + "hetGenotypeFreq": 0.1454918, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.91290987, + "refHomGenotypeFreq": 0.84016395, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47619048, + "altHomGenotypeFreq": 0.23433584, + "hetGenotypeFreq": 0.48370928, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.52380955, + "refHomGenotypeFreq": 0.28195488, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04436451, + "altHomGenotypeFreq": 0.0023980816, + "hetGenotypeFreq": 0.083932854, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9556355, + "refHomGenotypeFreq": 0.91366905, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10927153, + "altHomGenotypeFreq": 0.013245033, + "hetGenotypeFreq": 0.19205298, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8907285, + "refHomGenotypeFreq": 0.794702, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09064831, + "altHomGenotypeFreq": 0.007458405, + "hetGenotypeFreq": 0.16695353, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.9090648, + "refHomGenotypeFreq": 0.82558805, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09449873, + "altHomGenotypeFreq": 0.010440369, + "hetGenotypeFreq": 0.17306921, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.90302503, + "refHomGenotypeFreq": 0.8164904, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04178145, + "altHomGenotypeFreq": 0.0013774105, + "hetGenotypeFreq": 0.08264463, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.95730025, + "refHomGenotypeFreq": 0.91597795, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10309641, + "altHomGenotypeFreq": 0.022519354, + "hetGenotypeFreq": 0.16385175, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.8955548, + "refHomGenotypeFreq": 0.8136289, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.090461, + "altHomGenotypeFreq": 0.014786895, + "hetGenotypeFreq": 0.15482748, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.90779936, + "refHomGenotypeFreq": 0.8303856, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.047208354, + "altHomGenotypeFreq": 0.0018157059, + "hetGenotypeFreq": 0.090785295, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.95279163, + "refHomGenotypeFreq": 0.907399, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08103952, + "altHomGenotypeFreq": 0.007842534, + "hetGenotypeFreq": 0.14639397, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.91896045, + "refHomGenotypeFreq": 0.8457635, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.098372094, + "altHomGenotypeFreq": 0.010930233, + "hetGenotypeFreq": 0.17488372, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.9016279, + "refHomGenotypeFreq": 0.81418604, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10690618, + "altHomGenotypeFreq": 0.022871874, + "hetGenotypeFreq": 0.17160517, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.89132553, + "refHomGenotypeFreq": 0.805523, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07615894, + "altHomGenotypeFreq": 0.011037528, + "hetGenotypeFreq": 0.13465783, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.92163354, + "refHomGenotypeFreq": 0.8543046, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07696553, + "altHomGenotypeFreq": 0.0066233287, + "hetGenotypeFreq": 0.14068441, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.9230345, + "refHomGenotypeFreq": 0.85269225, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46866328, + "altHomGenotypeFreq": 0.2166975, + "hetGenotypeFreq": 0.5039315, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5313367, + "refHomGenotypeFreq": 0.27937096, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.033431236, + "altHomGenotypeFreq": 0.0017277126, + "hetGenotypeFreq": 0.06634416, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9651002, + "refHomGenotypeFreq": 0.9319281, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09661324, + "altHomGenotypeFreq": 0.011793166, + "hetGenotypeFreq": 0.16994254, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.90323555, + "refHomGenotypeFreq": 0.8182643, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.091369264, + "altHomGenotypeFreq": 0.00982336, + "hetGenotypeFreq": 0.16876952, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.9057919, + "refHomGenotypeFreq": 0.82140714, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04347826, + "altHomGenotypeFreq": 0.0023085803, + "hetGenotypeFreq": 0.08330127, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9560408, + "refHomGenotypeFreq": 0.91439015, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.046875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09375, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.953125, + "refHomGenotypeFreq": 0.90625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13558307, + "altHomGenotypeFreq": 0.040734824, + "hetGenotypeFreq": 0.19129393, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8636182, + "refHomGenotypeFreq": 0.7679712, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06237219, + "altHomGenotypeFreq": 0.0020449897, + "hetGenotypeFreq": 0.1206544, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.9376278, + "refHomGenotypeFreq": 0.8773006, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.047872342, + "altHomGenotypeFreq": 0.010638298, + "hetGenotypeFreq": 0.08510638, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.9468085, + "refHomGenotypeFreq": 0.90425533, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.014705882, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.029411767, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.9852941, + "refHomGenotypeFreq": 0.9705882, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.036308624, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07261725, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.96369135, + "refHomGenotypeFreq": 0.92738277, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50476193, + "altHomGenotypeFreq": 0.23809524, + "hetGenotypeFreq": 0.53333336, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.4952381, + "refHomGenotypeFreq": 0.22857143, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4278846, + "altHomGenotypeFreq": 0.21153846, + "hetGenotypeFreq": 0.43269232, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.57211536, + "refHomGenotypeFreq": 0.35576922, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.041666668, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08333333, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.9583333, + "refHomGenotypeFreq": 0.9166667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.072916664, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14583333, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.9270833, + "refHomGenotypeFreq": 0.8541667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.044247787, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.088495575, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.9557522, + "refHomGenotypeFreq": 0.91150445, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.068627454, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13725491, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.9313725, + "refHomGenotypeFreq": 0.8627451, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.093406595, + "altHomGenotypeFreq": 0.010989011, + "hetGenotypeFreq": 0.17582418, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.9010989, + "refHomGenotypeFreq": 0.8131868, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4784946, + "altHomGenotypeFreq": 0.17204301, + "hetGenotypeFreq": 0.61290324, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.52150536, + "refHomGenotypeFreq": 0.21505377, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.4949495, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.37373737, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.098130845, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.20560749, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.89719623, + "refHomGenotypeFreq": 0.7943925, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06395349, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12790698, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.93604654, + "refHomGenotypeFreq": 0.872093, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.036458332, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07291667, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.9635417, + "refHomGenotypeFreq": 0.9270833, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.025252525, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05050505, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.9747475, + "refHomGenotypeFreq": 0.94949496, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.045454547, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09090909, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.95454544, + "refHomGenotypeFreq": 0.90909094, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.088469185, + "altHomGenotypeFreq": 0.01192843, + "hetGenotypeFreq": 0.15904573, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.9085487, + "refHomGenotypeFreq": 0.82902586, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.024590164, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.049180325, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.97540987, + "refHomGenotypeFreq": 0.9508197, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.038904898, + "altHomGenotypeFreq": 0.0057636886, + "hetGenotypeFreq": 0.06916427, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.95965415, + "refHomGenotypeFreq": 0.9250721, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.029411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05882353, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.9705882, + "refHomGenotypeFreq": 0.9411765, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09223301, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.16504854, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.907767, + "refHomGenotypeFreq": 0.8252427, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10606061, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.1919192, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.8939394, + "refHomGenotypeFreq": 0.7979798, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06542056, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.12149532, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.92990655, + "refHomGenotypeFreq": 0.86915886, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.048076924, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.07692308, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.9519231, + "refHomGenotypeFreq": 0.91346157, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08080808, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.1010101, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.9191919, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.011764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.023529412, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.9882353, + "refHomGenotypeFreq": 0.9764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45039684, + "altHomGenotypeFreq": 0.1845238, + "hetGenotypeFreq": 0.53174603, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.54960316, + "refHomGenotypeFreq": 0.28373015, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46116504, + "altHomGenotypeFreq": 0.16504854, + "hetGenotypeFreq": 0.592233, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.5388349, + "refHomGenotypeFreq": 0.24271844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07865169, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.1423221, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.92134833, + "refHomGenotypeFreq": 0.85018724, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0933236, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9066764, + "study": "DISCOVEHR" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.095080666, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9049193, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.093172915, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.9068271, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.097301506, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.9026985, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09277239, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.90722764, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22840279, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "TUBGCP5" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "18600" + } + } + ], + "heritableTraits": [], + "id": "COSM3999471", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "TUBGCP5" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "18600" + } + } + ], + "heritableTraits": [], + "id": "COSM3999471", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "TUBGCP5_ENST00000453949" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "18600" + } + } + ], + "heritableTraits": [], + "id": "COSM7223051", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "TUBGCP5" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "18600" + } + } + ], + "heritableTraits": [], + "id": "COSM3999471", + "somaticInformation": { + "histologySubtype": "squamous cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "oesophagus", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "TUBGCP5" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "18600" + } + } + ], + "heritableTraits": [], + "id": "COSM3999471", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "breast", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "TUBGCP5", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM3999471", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "TUBGCP5", + "histologySubtype": "", + "mutationId": "COSM3999471", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "TUBGCP5_ENST00000453949", + "histologySubtype": "", + "mutationId": "COSM7223051", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "TUBGCP5", + "histologySubtype": "squamous cell carcinoma", + "mutationId": "COSM3999471", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "oesophagus", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "TUBGCP5", + "histologySubtype": "", + "mutationId": "COSM3999471", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "breast", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + } + ] + } + }, + "chromosome": "15", + "end": 22840279, + "id": "15:22840279:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22840279, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558664", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "processed_transcript", + "cdnaPosition": 495, + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559846", + "exonOverlap": [ + { + "number": "1/6", + "percentage": 0.07668712 + } + ], + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 3.3299999237060547, + "source": "gerp" + }, + { + "score": 0.004999999888241291, + "source": "phastCons" + }, + { + "score": 0.4819999933242798, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.1168+69delT", + "ENST00000453949(ENSG00000153575):c.1168+69delT", + "ENST00000559846(ENSG00000153575):n.499delT" + ], + "id": "rs540532484", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 1.6147784E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 3.229557E-4, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.99983853, + "refHomGenotypeFreq": 0.99967706, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.0011933175, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.002386635, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.99880666, + "refHomGenotypeFreq": 0.9976134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 1.9989339E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 3.9978678E-4, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.9998001, + "refHomGenotypeFreq": 0.99960023, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 1.1462632E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 2.2925263E-4, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9998854, + "refHomGenotypeFreq": 0.99977076, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 1.16904375E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 2.3380875E-4, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.9998831, + "refHomGenotypeFreq": 0.9997662, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 2.1651271E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 4.3302542E-4, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.9997835, + "refHomGenotypeFreq": 0.999567, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.0017971246, + "altHomGenotypeFreq": 3.9936102E-4, + "hetGenotypeFreq": 0.0027955272, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.99820286, + "refHomGenotypeFreq": 0.99680513, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.009202454, + "altHomGenotypeFreq": 0.0020449897, + "hetGenotypeFreq": 0.014314928, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.9907975, + "refHomGenotypeFreq": 0.9836401, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.04368932, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.067961164, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.9563107, + "refHomGenotypeFreq": 0.9223301, + "study": "1kG_phase3" + } + ], + "reference": "T", + "start": 22849186, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22849186, + "id": "15:22849186:T:-", + "length": 1, + "names": [], + "reference": "T", + "start": 22849186, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559846", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.5350000262260437, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": -2.4089999198913574, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.14999961853027344, + "source": "cadd_raw" + }, + { + "score": 1.409999966621399, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.1487+148C>T", + "ENST00000453949(ENSG00000153575):c.1487+148C>T", + "ENST00000559846(ENSG00000153575):n.1669+148C>T" + ], + "id": "rs1544285", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.72514546, + "altHomGenotypeFreq": 0.54143506, + "hetGenotypeFreq": 0.36742082, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.27485457, + "refHomGenotypeFreq": 0.09114415, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6451943, + "altHomGenotypeFreq": 0.41308793, + "hetGenotypeFreq": 0.4642127, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.35480574, + "refHomGenotypeFreq": 0.12269939, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.78615576, + "altHomGenotypeFreq": 0.631644, + "hetGenotypeFreq": 0.3090235, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.21384425, + "refHomGenotypeFreq": 0.05933251, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.53818613, + "altHomGenotypeFreq": 0.2935561, + "hetGenotypeFreq": 0.48926014, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.46181384, + "refHomGenotypeFreq": 0.21718377, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.69205296, + "altHomGenotypeFreq": 0.49668875, + "hetGenotypeFreq": 0.39072847, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.307947, + "refHomGenotypeFreq": 0.11258278, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6356078, + "altHomGenotypeFreq": 0.4042431, + "hetGenotypeFreq": 0.46272936, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.3643922, + "refHomGenotypeFreq": 0.13302752, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6438484, + "altHomGenotypeFreq": 0.41206297, + "hetGenotypeFreq": 0.46357086, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.35615158, + "refHomGenotypeFreq": 0.12436616, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.91727775, + "altHomGenotypeFreq": 0.8414299, + "hetGenotypeFreq": 0.1516957, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.08272228, + "refHomGenotypeFreq": 0.006874427, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7275757, + "altHomGenotypeFreq": 0.5467197, + "hetGenotypeFreq": 0.36171207, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.27242428, + "refHomGenotypeFreq": 0.09156824, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7221419, + "altHomGenotypeFreq": 0.5349039, + "hetGenotypeFreq": 0.37447608, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.27785808, + "refHomGenotypeFreq": 0.09062003, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6132264, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.38677356, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.546875, + "altHomGenotypeFreq": 0.328125, + "hetGenotypeFreq": 0.4375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.453125, + "refHomGenotypeFreq": 0.234375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7378195, + "altHomGenotypeFreq": 0.5706869, + "hetGenotypeFreq": 0.33426517, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.2621805, + "refHomGenotypeFreq": 0.09504792, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67177916, + "altHomGenotypeFreq": 0.46216768, + "hetGenotypeFreq": 0.4192229, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.32822084, + "refHomGenotypeFreq": 0.118609406, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6755319, + "altHomGenotypeFreq": 0.4574468, + "hetGenotypeFreq": 0.43617022, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.32446808, + "refHomGenotypeFreq": 0.10638298, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.64215684, + "altHomGenotypeFreq": 0.44117647, + "hetGenotypeFreq": 0.4019608, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.35784313, + "refHomGenotypeFreq": 0.15686275, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9644478, + "altHomGenotypeFreq": 0.9288956, + "hetGenotypeFreq": 0.07110439, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.035552192, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.74761903, + "altHomGenotypeFreq": 0.53333336, + "hetGenotypeFreq": 0.42857146, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.25238097, + "refHomGenotypeFreq": 0.03809524, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7307692, + "altHomGenotypeFreq": 0.5480769, + "hetGenotypeFreq": 0.3653846, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.26923078, + "refHomGenotypeFreq": 0.086538464, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9953704, + "altHomGenotypeFreq": 0.9907407, + "hetGenotypeFreq": 0.009259259, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.0046296297, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7239583, + "altHomGenotypeFreq": 0.5416667, + "hetGenotypeFreq": 0.3645833, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.27604166, + "refHomGenotypeFreq": 0.09375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.94690263, + "altHomGenotypeFreq": 0.8938053, + "hetGenotypeFreq": 0.10619469, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.053097345, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.64215684, + "altHomGenotypeFreq": 0.42156863, + "hetGenotypeFreq": 0.44117647, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.35784313, + "refHomGenotypeFreq": 0.13725491, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6098901, + "altHomGenotypeFreq": 0.42857143, + "hetGenotypeFreq": 0.36263737, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.3901099, + "refHomGenotypeFreq": 0.20879121, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.79569894, + "altHomGenotypeFreq": 0.6344086, + "hetGenotypeFreq": 0.32258064, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.20430107, + "refHomGenotypeFreq": 0.043010753, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7373737, + "altHomGenotypeFreq": 0.53535354, + "hetGenotypeFreq": 0.4040404, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.26262626, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6635514, + "altHomGenotypeFreq": 0.45794392, + "hetGenotypeFreq": 0.41121495, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.3364486, + "refHomGenotypeFreq": 0.13084112, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6686047, + "altHomGenotypeFreq": 0.45348838, + "hetGenotypeFreq": 0.43023255, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.33139536, + "refHomGenotypeFreq": 0.11627907, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9010417, + "altHomGenotypeFreq": 0.8020833, + "hetGenotypeFreq": 0.19791667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.098958336, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6212724, + "altHomGenotypeFreq": 0.3976143, + "hetGenotypeFreq": 0.4473161, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.37872764, + "refHomGenotypeFreq": 0.15506959, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.91803277, + "altHomGenotypeFreq": 0.8360656, + "hetGenotypeFreq": 0.16393442, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.08196721, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5518732, + "altHomGenotypeFreq": 0.31412104, + "hetGenotypeFreq": 0.4755043, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.4481268, + "refHomGenotypeFreq": 0.21037464, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9764706, + "altHomGenotypeFreq": 0.9529412, + "hetGenotypeFreq": 0.047058824, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.023529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.684466, + "altHomGenotypeFreq": 0.4563107, + "hetGenotypeFreq": 0.4563107, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.31553397, + "refHomGenotypeFreq": 0.08737864, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6111111, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.5555556, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.3888889, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.60280377, + "altHomGenotypeFreq": 0.38317758, + "hetGenotypeFreq": 0.43925232, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.39719626, + "refHomGenotypeFreq": 0.17757009, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.58653843, + "altHomGenotypeFreq": 0.32692307, + "hetGenotypeFreq": 0.5192308, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.41346154, + "refHomGenotypeFreq": 0.15384616, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.61616164, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.46464646, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.3838384, + "refHomGenotypeFreq": 0.15151516, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3764706, + "altHomGenotypeFreq": 0.12941177, + "hetGenotypeFreq": 0.49411768, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.62352943, + "refHomGenotypeFreq": 0.3764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.74900794, + "altHomGenotypeFreq": 0.5555556, + "hetGenotypeFreq": 0.38690478, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.25099206, + "refHomGenotypeFreq": 0.057539683, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7378641, + "altHomGenotypeFreq": 0.5339806, + "hetGenotypeFreq": 0.407767, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.26213592, + "refHomGenotypeFreq": 0.058252428, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40074906, + "altHomGenotypeFreq": 0.20973782, + "hetGenotypeFreq": 0.38202247, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5992509, + "refHomGenotypeFreq": 0.4082397, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.63012433, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.3698757, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6197538, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.38024622, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6401142, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.35988584, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6197411, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.3802589, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22853997, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22853997, + "id": "15:22853997:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22853997, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559846", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000561214", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559534", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.4700000286102295, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": -0.45899999141693115, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.020000457763671875, + "source": "cadd_raw" + }, + { + "score": 2.8399999141693115, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.1955+449C>A", + "ENST00000453949(ENSG00000153575):c.1955+449C>A", + "ENST00000559846(ENSG00000153575):n.2137+449C>A" + ], + "reference": "C", + "start": 22862384, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22862384, + "id": "15:22862384:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 22862384, + "strand": "+", + "studies": [], + "type": "SNV" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559846", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000561214", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559534", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558915", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.109999895095825, + "source": "gerp" + }, + { + "score": 0.09399999678134918, + "source": "phastCons" + }, + { + "score": 0.382999986410141, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.3299999237060547, + "source": "cadd_raw" + }, + { + "score": 5.989999771118164, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.2327+69A>G", + "ENST00000453949(ENSG00000153575):c.2327+69A>G", + "ENST00000561214(ENSG00000153575):c.184-65A>G", + "ENST00000559534(ENSG00000153575):n.99+69A>G" + ], + "id": "rs35914296", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.09720696, + "altHomGenotypeFreq": 0.01868494, + "hetGenotypeFreq": 0.1591776, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.90172625, + "refHomGenotypeFreq": 0.8221375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08588957, + "altHomGenotypeFreq": 0.012269938, + "hetGenotypeFreq": 0.14928426, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.91308796, + "refHomGenotypeFreq": 0.8384458, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47191012, + "altHomGenotypeFreq": 0.22971286, + "hetGenotypeFreq": 0.48439452, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5280899, + "refHomGenotypeFreq": 0.28589264, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.044152744, + "altHomGenotypeFreq": 0.002386635, + "hetGenotypeFreq": 0.08353222, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.95584726, + "refHomGenotypeFreq": 0.91408116, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10927153, + "altHomGenotypeFreq": 0.013245033, + "hetGenotypeFreq": 0.19205298, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.8907285, + "refHomGenotypeFreq": 0.794702, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.090309635, + "altHomGenotypeFreq": 0.0074541285, + "hetGenotypeFreq": 0.16571102, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.9096904, + "refHomGenotypeFreq": 0.82683486, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09456217, + "altHomGenotypeFreq": 0.010129281, + "hetGenotypeFreq": 0.16886579, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.9054378, + "refHomGenotypeFreq": 0.8210049, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04162844, + "altHomGenotypeFreq": 0.0016055045, + "hetGenotypeFreq": 0.08738533, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.95470184, + "refHomGenotypeFreq": 0.9110092, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10280866, + "altHomGenotypeFreq": 0.022118198, + "hetGenotypeFreq": 0.16418958, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.895787, + "refHomGenotypeFreq": 0.8136922, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09029182, + "altHomGenotypeFreq": 0.014446692, + "hetGenotypeFreq": 0.15299046, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.9090581, + "refHomGenotypeFreq": 0.83256286, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08216433, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.91783565, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.046875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.953125, + "refHomGenotypeFreq": 0.90625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13638179, + "altHomGenotypeFreq": 0.04033546, + "hetGenotypeFreq": 0.19488819, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.86222047, + "refHomGenotypeFreq": 0.76477635, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.06748466, + "altHomGenotypeFreq": 0.0020449897, + "hetGenotypeFreq": 0.13087934, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.9325153, + "refHomGenotypeFreq": 0.8670757, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.047872342, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.095744684, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.95212764, + "refHomGenotypeFreq": 0.90425533, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.029411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.058823533, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.9705882, + "refHomGenotypeFreq": 0.9411765, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.036308624, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.083207265, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9583964, + "refHomGenotypeFreq": 0.91679275, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.23809524, + "hetGenotypeFreq": 0.52380955, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.23809524, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4278846, + "altHomGenotypeFreq": 0.21153846, + "hetGenotypeFreq": 0.43269232, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.57211536, + "refHomGenotypeFreq": 0.35576922, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.041666668, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08333333, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.9583333, + "refHomGenotypeFreq": 0.9166667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.072916664, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14583333, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.9270833, + "refHomGenotypeFreq": 0.8541667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.044247787, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10619469, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.94690263, + "refHomGenotypeFreq": 0.8938053, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.073529415, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14705883, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.9264706, + "refHomGenotypeFreq": 0.85294116, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.093406595, + "altHomGenotypeFreq": 0.010989011, + "hetGenotypeFreq": 0.16483517, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.9065934, + "refHomGenotypeFreq": 0.82417583, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4784946, + "altHomGenotypeFreq": 0.17204301, + "hetGenotypeFreq": 0.61290324, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.52150536, + "refHomGenotypeFreq": 0.21505377, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.4949495, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.37373737, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.098130845, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19626169, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.9018692, + "refHomGenotypeFreq": 0.8037383, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.069767445, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13953489, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.9302326, + "refHomGenotypeFreq": 0.8604651, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.036458332, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.083333336, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.9583333, + "refHomGenotypeFreq": 0.9166667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.025252525, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05050505, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.9747475, + "refHomGenotypeFreq": 0.94949496, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.045454547, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09090909, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.95454544, + "refHomGenotypeFreq": 0.90909094, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.088469185, + "altHomGenotypeFreq": 0.01192843, + "hetGenotypeFreq": 0.1530815, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.9115308, + "refHomGenotypeFreq": 0.8349901, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.024590164, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.049180325, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.97540987, + "refHomGenotypeFreq": 0.9508197, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.038904898, + "altHomGenotypeFreq": 0.0028818443, + "hetGenotypeFreq": 0.072046116, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.9610951, + "refHomGenotypeFreq": 0.9250721, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.029411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.105882354, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.9470588, + "refHomGenotypeFreq": 0.89411765, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09223301, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.16504854, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.907767, + "refHomGenotypeFreq": 0.8252427, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10606061, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.1919192, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.8939394, + "refHomGenotypeFreq": 0.7979798, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.06542056, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.11214953, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.93457943, + "refHomGenotypeFreq": 0.8785047, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.048076924, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.07692308, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.9519231, + "refHomGenotypeFreq": 0.91346157, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08080808, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.1010101, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.9191919, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.011764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.023529412, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.9882353, + "refHomGenotypeFreq": 0.9764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44940478, + "altHomGenotypeFreq": 0.1845238, + "hetGenotypeFreq": 0.5297619, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5505952, + "refHomGenotypeFreq": 0.2857143, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46116504, + "altHomGenotypeFreq": 0.16504854, + "hetGenotypeFreq": 0.592233, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.5388349, + "refHomGenotypeFreq": 0.24271844, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.07677902, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.13857678, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.923221, + "refHomGenotypeFreq": 0.85393256, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09574187, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.90425813, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.093452714, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.9065473, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09833939, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.9016606, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09304207, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.9069579, + "study": "UK10K" + } + ], + "reference": "A", + "start": 22864438, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22864438, + "id": "15:22864438:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22864438, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559846", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000561214", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559534", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558915", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.6600000262260437, + "source": "gerp" + }, + { + "score": 0.29100000858306885, + "source": "phastCons" + }, + { + "score": 0.31299999356269836, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.5699996948242188, + "source": "cadd_raw" + }, + { + "score": 8.010000228881836, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.2328-95G>A", + "ENST00000453949(ENSG00000153575):c.2328-95G>A", + "ENST00000561214(ENSG00000153575):c.292-95G>A", + "ENST00000559534(ENSG00000153575):n.100-95G>A" + ], + "id": "rs11632888", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.2145863, + "altHomGenotypeFreq": 0.05425353, + "hetGenotypeFreq": 0.32066554, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7854137, + "refHomGenotypeFreq": 0.62508094, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26530612, + "altHomGenotypeFreq": 0.06938776, + "hetGenotypeFreq": 0.39183673, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7346939, + "refHomGenotypeFreq": 0.5387755, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.035846725, + "altHomGenotypeFreq": 0.0024721879, + "hetGenotypeFreq": 0.06674907, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.9641533, + "refHomGenotypeFreq": 0.93077874, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14783654, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.25721154, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.85216343, + "refHomGenotypeFreq": 0.7235577, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.295302, + "altHomGenotypeFreq": 0.08053691, + "hetGenotypeFreq": 0.4295302, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.70469797, + "refHomGenotypeFreq": 0.4899329, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3227377, + "altHomGenotypeFreq": 0.104811, + "hetGenotypeFreq": 0.4358534, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6772623, + "refHomGenotypeFreq": 0.45933563, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2685012, + "altHomGenotypeFreq": 0.072668985, + "hetGenotypeFreq": 0.39166445, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7314988, + "refHomGenotypeFreq": 0.5356666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10954023, + "altHomGenotypeFreq": 0.012643678, + "hetGenotypeFreq": 0.1937931, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8904598, + "refHomGenotypeFreq": 0.79356325, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20722145, + "altHomGenotypeFreq": 0.051381085, + "hetGenotypeFreq": 0.3116807, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.79277855, + "refHomGenotypeFreq": 0.6369382, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22370328, + "altHomGenotypeFreq": 0.05780933, + "hetGenotypeFreq": 0.33178788, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.77629673, + "refHomGenotypeFreq": 0.61040276, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.248497, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.751503, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1171875, + "altHomGenotypeFreq": 0.046875, + "hetGenotypeFreq": 0.140625, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.8828125, + "refHomGenotypeFreq": 0.8125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16573483, + "altHomGenotypeFreq": 0.033546325, + "hetGenotypeFreq": 0.264377, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8342652, + "refHomGenotypeFreq": 0.7020767, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2822086, + "altHomGenotypeFreq": 0.075664625, + "hetGenotypeFreq": 0.41308793, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.71779144, + "refHomGenotypeFreq": 0.51124746, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20744681, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.7925532, + "refHomGenotypeFreq": 0.5851064, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28431374, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.4509804, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.71568626, + "refHomGenotypeFreq": 0.49019608, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.075642966, + "altHomGenotypeFreq": 0.0075642965, + "hetGenotypeFreq": 0.13615733, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.92435706, + "refHomGenotypeFreq": 0.85627836, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.042857144, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08571429, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.95714283, + "refHomGenotypeFreq": 0.9142857, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09615385, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.15384616, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.90384614, + "refHomGenotypeFreq": 0.8269231, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.083333336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16666666, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.9166667, + "refHomGenotypeFreq": 0.8333333, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.328125, + "altHomGenotypeFreq": 0.104166664, + "hetGenotypeFreq": 0.4479167, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.671875, + "refHomGenotypeFreq": 0.44791666, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.061946902, + "altHomGenotypeFreq": 0.017699115, + "hetGenotypeFreq": 0.088495575, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.9380531, + "refHomGenotypeFreq": 0.8938053, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2990196, + "altHomGenotypeFreq": 0.09803922, + "hetGenotypeFreq": 0.4019608, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.70098037, + "refHomGenotypeFreq": 0.5, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24175824, + "altHomGenotypeFreq": 0.054945055, + "hetGenotypeFreq": 0.37362638, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.7582418, + "refHomGenotypeFreq": 0.5714286, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.06451613, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12903225, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.9354839, + "refHomGenotypeFreq": 0.87096775, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.060606062, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.121212125, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.93939394, + "refHomGenotypeFreq": 0.8787879, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3317757, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.53271025, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.6682243, + "refHomGenotypeFreq": 0.40186915, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23255815, + "altHomGenotypeFreq": 0.08139535, + "hetGenotypeFreq": 0.30232558, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.76744187, + "refHomGenotypeFreq": 0.61627907, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.078125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15625, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.921875, + "refHomGenotypeFreq": 0.84375, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.065656565, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13131313, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.93434346, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11111111, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.8888889, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28031808, + "altHomGenotypeFreq": 0.059642147, + "hetGenotypeFreq": 0.4413519, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.7196819, + "refHomGenotypeFreq": 0.49900597, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1557377, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.8442623, + "refHomGenotypeFreq": 0.72131145, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16570605, + "altHomGenotypeFreq": 0.028818443, + "hetGenotypeFreq": 0.27377522, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.83429396, + "refHomGenotypeFreq": 0.69740635, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.05882353, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.09411765, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.9411765, + "refHomGenotypeFreq": 0.89411765, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26213592, + "altHomGenotypeFreq": 0.03883495, + "hetGenotypeFreq": 0.44660193, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.7378641, + "refHomGenotypeFreq": 0.5145631, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.47474748, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.46464646, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30373833, + "altHomGenotypeFreq": 0.08411215, + "hetGenotypeFreq": 0.43925232, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.6962617, + "refHomGenotypeFreq": 0.47663552, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21634616, + "altHomGenotypeFreq": 0.057692308, + "hetGenotypeFreq": 0.31730768, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.78365386, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21717171, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.3737374, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.7828283, + "refHomGenotypeFreq": 0.5959596, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09411765, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.16470589, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.90588236, + "refHomGenotypeFreq": 0.8235294, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.05654762, + "altHomGenotypeFreq": 0.003968254, + "hetGenotypeFreq": 0.10515873, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.94345236, + "refHomGenotypeFreq": 0.890873, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.019417476, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03883495, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.98058254, + "refHomGenotypeFreq": 0.9611651, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.016853932, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.026217228, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9831461, + "refHomGenotypeFreq": 0.97003746, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25614917, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7438508, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24678232, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.7532177, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26517904, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.73482096, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24676375, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.75323623, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22866621, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22866621, + "id": "15:22866621:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22866621, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "AAG", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "AAG", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559846", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000561214", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "retained_intron", + "cdnaPosition": 411, + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559534", + "exonOverlap": [ + { + "number": "3/3", + "percentage": -1 + } + ], + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558915", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -5.300000190734863, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -2.8259999752044678, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.2533+107_2533+109dupAAG", + "ENST00000453949(ENSG00000153575):c.2533+107_2533+109dupAAG", + "ENST00000561214(ENSG00000153575):c.497+107_497+109dupAAG", + "ENST00000559534(ENSG00000153575):n.412_414dupAAG" + ], + "id": "rs536225972", + "populationFrequencies": [ + { + "altAllele": "AAG", + "altAlleleFreq": 0.49274465, + "altHomGenotypeFreq": 0.2798294, + "hetGenotypeFreq": 0.4629668, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.48868716, + "refHomGenotypeFreq": 0.25720376, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.42809734, + "altHomGenotypeFreq": 0.19911505, + "hetGenotypeFreq": 0.4756637, + "population": "OTH", + "refAllele": "", + "refAlleleFreq": 0.5630531, + "refHomGenotypeFreq": 0.32522124, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.5964691, + "altHomGenotypeFreq": 0.37200505, + "hetGenotypeFreq": 0.47288775, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.39155108, + "refHomGenotypeFreq": 0.15510719, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.27099237, + "altHomGenotypeFreq": 0.06870229, + "hetGenotypeFreq": 0.4173028, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.7226463, + "refHomGenotypeFreq": 0.51399493, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.49285713, + "altHomGenotypeFreq": 0.22857143, + "hetGenotypeFreq": 0.5285714, + "population": "ASJ", + "refAllele": "", + "refAlleleFreq": 0.50714284, + "refHomGenotypeFreq": 0.24285714, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.4398907, + "altHomGenotypeFreq": 0.23975408, + "hetGenotypeFreq": 0.47199455, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.52424866, + "refHomGenotypeFreq": 0.28825137, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.41815874, + "altHomGenotypeFreq": 0.17763993, + "hetGenotypeFreq": 0.4832934, + "population": "NFE", + "refAllele": "", + "refAlleleFreq": 0.5807134, + "refHomGenotypeFreq": 0.33906668, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.6450309, + "altHomGenotypeFreq": 0.47883976, + "hetGenotypeFreq": 0.42439374, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.3089634, + "refHomGenotypeFreq": 0.096766524, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.49727184, + "altHomGenotypeFreq": 0.28658232, + "hetGenotypeFreq": 0.4580853, + "population": "MALE", + "refAllele": "", + "refAlleleFreq": 0.484375, + "refHomGenotypeFreq": 0.25533235, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.48710823, + "altHomGenotypeFreq": 0.27142197, + "hetGenotypeFreq": 0.4690443, + "population": "FEMALE", + "refAllele": "", + "refAlleleFreq": 0.4940559, + "refHomGenotypeFreq": 0.25953373, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.28125, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.328125, + "population": "MXL", + "refAllele": "", + "refAlleleFreq": 0.7109375, + "refHomGenotypeFreq": 0.546875, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.44748402, + "altHomGenotypeFreq": 0.30990416, + "hetGenotypeFreq": 0.46166134, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.45926517, + "refHomGenotypeFreq": 0.2284345, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.4406953, + "altHomGenotypeFreq": 0.26993868, + "hetGenotypeFreq": 0.49079755, + "population": "SAS", + "refAllele": "", + "refAlleleFreq": 0.48466256, + "refHomGenotypeFreq": 0.2392638, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.32978722, + "altHomGenotypeFreq": 0.11702127, + "hetGenotypeFreq": 0.5, + "population": "CLM", + "refAllele": "", + "refAlleleFreq": 0.63297874, + "refHomGenotypeFreq": 0.38297874, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.42156863, + "altHomGenotypeFreq": 0.2254902, + "hetGenotypeFreq": 0.51960784, + "population": "ITU", + "refAllele": "", + "refAlleleFreq": 0.5147059, + "refHomGenotypeFreq": 0.25490198, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.54765505, + "altHomGenotypeFreq": 0.5128593, + "hetGenotypeFreq": 0.40998486, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.28214827, + "refHomGenotypeFreq": 0.07715582, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.4904762, + "altHomGenotypeFreq": 0.35238096, + "hetGenotypeFreq": 0.5619048, + "population": "CHS", + "refAllele": "", + "refAlleleFreq": 0.36666667, + "refHomGenotypeFreq": 0.08571429, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.4903846, + "altHomGenotypeFreq": 0.33653846, + "hetGenotypeFreq": 0.50961536, + "population": "JPT", + "refAllele": "", + "refAlleleFreq": 0.40865386, + "refHomGenotypeFreq": 0.15384616, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.5509259, + "altHomGenotypeFreq": 0.5555556, + "hetGenotypeFreq": 0.3796296, + "population": "YRI", + "refAllele": "", + "refAlleleFreq": 0.25462964, + "refHomGenotypeFreq": 0.06481481, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.44270834, + "altHomGenotypeFreq": 0.3020833, + "hetGenotypeFreq": 0.46874997, + "population": "PJL", + "refAllele": "", + "refAlleleFreq": 0.46354166, + "refHomGenotypeFreq": 0.22916667, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.5221239, + "altHomGenotypeFreq": 0.52212393, + "hetGenotypeFreq": 0.40707964, + "population": "GWD", + "refAllele": "", + "refAlleleFreq": 0.27433628, + "refHomGenotypeFreq": 0.07079646, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.44607842, + "altHomGenotypeFreq": 0.2647059, + "hetGenotypeFreq": 0.5, + "population": "STU", + "refAllele": "", + "refAlleleFreq": 0.4852941, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.36263737, + "altHomGenotypeFreq": 0.16483517, + "hetGenotypeFreq": 0.43956044, + "population": "GBR", + "refAllele": "", + "refAlleleFreq": 0.61538464, + "refHomGenotypeFreq": 0.3956044, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.5268817, + "altHomGenotypeFreq": 0.4193548, + "hetGenotypeFreq": 0.47311828, + "population": "CDX", + "refAllele": "", + "refAlleleFreq": 0.34408602, + "refHomGenotypeFreq": 0.10752688, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.43939394, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.45454544, + "population": "KHV", + "refAllele": "", + "refAlleleFreq": 0.46969697, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.44392523, + "altHomGenotypeFreq": 0.25233644, + "hetGenotypeFreq": 0.49532712, + "population": "IBS", + "refAllele": "", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.25233644, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.4127907, + "altHomGenotypeFreq": 0.27906975, + "hetGenotypeFreq": 0.46511626, + "population": "BEB", + "refAllele": "", + "refAlleleFreq": 0.4883721, + "refHomGenotypeFreq": 0.25581396, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.515625, + "altHomGenotypeFreq": 0.375, + "hetGenotypeFreq": 0.5104166, + "population": "ACB", + "refAllele": "", + "refAlleleFreq": 0.36979166, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.5050505, + "altHomGenotypeFreq": 0.5555555, + "hetGenotypeFreq": 0.35353535, + "population": "ESN", + "refAllele": "", + "refAlleleFreq": 0.26767677, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.68686867, + "altHomGenotypeFreq": 0.5656566, + "hetGenotypeFreq": 0.3939394, + "population": "LWK", + "refAllele": "", + "refAlleleFreq": 0.23737374, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.40159047, + "altHomGenotypeFreq": 0.19284293, + "hetGenotypeFreq": 0.4831014, + "population": "EUR", + "refAllele": "", + "refAlleleFreq": 0.56560636, + "refHomGenotypeFreq": 0.32405567, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.5327869, + "altHomGenotypeFreq": 0.45901638, + "hetGenotypeFreq": 0.4262295, + "population": "ASW", + "refAllele": "", + "refAlleleFreq": 0.32786885, + "refHomGenotypeFreq": 0.114754096, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.28242075, + "altHomGenotypeFreq": 0.10662824, + "hetGenotypeFreq": 0.4121038, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.6873199, + "refHomGenotypeFreq": 0.48126802, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.5117647, + "altHomGenotypeFreq": 0.5294118, + "hetGenotypeFreq": 0.4117647, + "population": "MSL", + "refAllele": "", + "refAlleleFreq": 0.2647059, + "refHomGenotypeFreq": 0.05882353, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.47572815, + "altHomGenotypeFreq": 0.28155342, + "hetGenotypeFreq": 0.49514562, + "population": "GIH", + "refAllele": "", + "refAlleleFreq": 0.47087377, + "refHomGenotypeFreq": 0.22330096, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.44444445, + "altHomGenotypeFreq": 0.19191918, + "hetGenotypeFreq": 0.5757576, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.52020204, + "refHomGenotypeFreq": 0.23232323, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.39719626, + "altHomGenotypeFreq": 0.21495326, + "hetGenotypeFreq": 0.43925235, + "population": "TSI", + "refAllele": "", + "refAlleleFreq": 0.56542057, + "refHomGenotypeFreq": 0.34579438, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.35096154, + "altHomGenotypeFreq": 0.15384616, + "hetGenotypeFreq": 0.5, + "population": "PUR", + "refAllele": "", + "refAlleleFreq": 0.59615386, + "refHomGenotypeFreq": 0.34615386, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.35353535, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.46464646, + "population": "CEU", + "refAllele": "", + "refAlleleFreq": 0.6363636, + "refHomGenotypeFreq": 0.4040404, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.14705883, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.27058825, + "population": "PEL", + "refAllele": "", + "refAlleleFreq": 0.84117645, + "refHomGenotypeFreq": 0.7058824, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.48214287, + "altHomGenotypeFreq": 0.33928573, + "hetGenotypeFreq": 0.51388884, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.40376985, + "refHomGenotypeFreq": 0.1468254, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.46601942, + "altHomGenotypeFreq": 0.29126212, + "hetGenotypeFreq": 0.5631069, + "population": "CHB", + "refAllele": "", + "refAlleleFreq": 0.42718446, + "refHomGenotypeFreq": 0.14563107, + "study": "1kG_phase3" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.3919598, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.6080402, + "study": "UK10K" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.3830442, + "population": "TWINSUK_NODUP", + "refAllele": "", + "refAlleleFreq": 0.61695576, + "study": "UK10K" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.40114167, + "population": "ALSPAC", + "refAllele": "", + "refAlleleFreq": 0.59885836, + "study": "UK10K" + }, + { + "altAllele": "AAG", + "altAlleleFreq": 0.3824164, + "population": "TWINSUK", + "refAllele": "", + "refAlleleFreq": 0.61758363, + "study": "UK10K" + } + ], + "reference": "", + "start": 22867123, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22867122, + "id": "15:22867123:-:AAG", + "length": 3, + "names": [], + "reference": "", + "start": 22867123, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000561214", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559534", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558915", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.2599999904632568, + "source": "gerp" + }, + { + "score": 0.006000000052154064, + "source": "phastCons" + }, + { + "score": 0.5329999923706055, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.2200002670288086, + "source": "cadd_raw" + }, + { + "score": 4.989999771118164, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.2839-111A>G", + "ENST00000453949(ENSG00000153575):c.2839-111A>G", + "ENST00000558915(ENSG00000153575):n.470-111A>G" + ], + "id": "rs2251602", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.2995016, + "altHomGenotypeFreq": 0.0965111, + "hetGenotypeFreq": 0.40598097, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7004984, + "refHomGenotypeFreq": 0.49750793, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3384458, + "altHomGenotypeFreq": 0.116564415, + "hetGenotypeFreq": 0.44376278, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6615542, + "refHomGenotypeFreq": 0.4396728, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.088998765, + "altHomGenotypeFreq": 0.014833127, + "hetGenotypeFreq": 0.14833127, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.91100127, + "refHomGenotypeFreq": 0.8368356, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21223022, + "altHomGenotypeFreq": 0.038369305, + "hetGenotypeFreq": 0.34772182, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.7877698, + "refHomGenotypeFreq": 0.6139089, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39403972, + "altHomGenotypeFreq": 0.13245033, + "hetGenotypeFreq": 0.5231788, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.60596025, + "refHomGenotypeFreq": 0.34437087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40292096, + "altHomGenotypeFreq": 0.1626575, + "hetGenotypeFreq": 0.48052692, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.59707904, + "refHomGenotypeFreq": 0.35681558, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33037147, + "altHomGenotypeFreq": 0.113041155, + "hetGenotypeFreq": 0.4346606, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.66962856, + "refHomGenotypeFreq": 0.45229822, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24477372, + "altHomGenotypeFreq": 0.058810014, + "hetGenotypeFreq": 0.3719274, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.75522625, + "refHomGenotypeFreq": 0.56926256, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2927015, + "altHomGenotypeFreq": 0.093837865, + "hetGenotypeFreq": 0.39772728, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.7072985, + "refHomGenotypeFreq": 0.5084349, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30789816, + "altHomGenotypeFreq": 0.09981195, + "hetGenotypeFreq": 0.41617242, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.69210184, + "refHomGenotypeFreq": 0.4840156, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30761522, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6923848, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1953125, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.265625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.8046875, + "refHomGenotypeFreq": 0.671875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24680512, + "altHomGenotypeFreq": 0.07228435, + "hetGenotypeFreq": 0.34904152, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.75319487, + "refHomGenotypeFreq": 0.57867414, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38445807, + "altHomGenotypeFreq": 0.1411043, + "hetGenotypeFreq": 0.48670757, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.61554193, + "refHomGenotypeFreq": 0.37218815, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2393617, + "altHomGenotypeFreq": 0.010638298, + "hetGenotypeFreq": 0.4574468, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.7606383, + "refHomGenotypeFreq": 0.5319149, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3970588, + "altHomGenotypeFreq": 0.14705883, + "hetGenotypeFreq": 0.5, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.60294116, + "refHomGenotypeFreq": 0.3529412, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20801815, + "altHomGenotypeFreq": 0.051437218, + "hetGenotypeFreq": 0.31316185, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7919818, + "refHomGenotypeFreq": 0.6354009, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10952381, + "altHomGenotypeFreq": 0.01904762, + "hetGenotypeFreq": 0.18095239, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.89047617, + "refHomGenotypeFreq": 0.8, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.11057692, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.18269232, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.8894231, + "refHomGenotypeFreq": 0.7980769, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25462964, + "altHomGenotypeFreq": 0.074074075, + "hetGenotypeFreq": 0.3611111, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.7453704, + "refHomGenotypeFreq": 0.5648148, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40625, + "altHomGenotypeFreq": 0.14583333, + "hetGenotypeFreq": 0.5208334, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.59375, + "refHomGenotypeFreq": 0.33333334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16814159, + "altHomGenotypeFreq": 0.03539823, + "hetGenotypeFreq": 0.26548672, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.8318584, + "refHomGenotypeFreq": 0.69911504, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4019608, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.47058827, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.5980392, + "refHomGenotypeFreq": 0.3627451, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2912088, + "altHomGenotypeFreq": 0.08791209, + "hetGenotypeFreq": 0.4065934, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.7087912, + "refHomGenotypeFreq": 0.50549453, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10215054, + "altHomGenotypeFreq": 0.021505376, + "hetGenotypeFreq": 0.16129032, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.89784944, + "refHomGenotypeFreq": 0.8172043, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.11111111, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22222222, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.8888889, + "refHomGenotypeFreq": 0.7777778, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39252338, + "altHomGenotypeFreq": 0.13084112, + "hetGenotypeFreq": 0.5233645, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.60747665, + "refHomGenotypeFreq": 0.34579438, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3488372, + "altHomGenotypeFreq": 0.13953489, + "hetGenotypeFreq": 0.41860467, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.6511628, + "refHomGenotypeFreq": 0.44186047, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20833333, + "altHomGenotypeFreq": 0.052083332, + "hetGenotypeFreq": 0.3125, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.7916667, + "refHomGenotypeFreq": 0.6354167, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18181819, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.26262626, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.8181818, + "refHomGenotypeFreq": 0.68686867, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21212122, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.32323232, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.7878788, + "refHomGenotypeFreq": 0.6262626, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33697814, + "altHomGenotypeFreq": 0.11133201, + "hetGenotypeFreq": 0.45129225, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.66302186, + "refHomGenotypeFreq": 0.43737575, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22950819, + "altHomGenotypeFreq": 0.04918033, + "hetGenotypeFreq": 0.36065573, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.7704918, + "refHomGenotypeFreq": 0.59016395, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21613833, + "altHomGenotypeFreq": 0.043227665, + "hetGenotypeFreq": 0.34582132, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.7838617, + "refHomGenotypeFreq": 0.610951, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21176471, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.32941177, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.7882353, + "refHomGenotypeFreq": 0.62352943, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36407766, + "altHomGenotypeFreq": 0.106796116, + "hetGenotypeFreq": 0.5145631, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.6359223, + "refHomGenotypeFreq": 0.37864077, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35353535, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.48484847, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.64646465, + "refHomGenotypeFreq": 0.4040404, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35514018, + "altHomGenotypeFreq": 0.14018692, + "hetGenotypeFreq": 0.42990655, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.6448598, + "refHomGenotypeFreq": 0.42990655, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27884614, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.40384614, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.72115386, + "refHomGenotypeFreq": 0.5192308, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28282827, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.4040404, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.7171717, + "refHomGenotypeFreq": 0.5151515, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12941177, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.21176471, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.87058824, + "refHomGenotypeFreq": 0.7647059, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0952381, + "altHomGenotypeFreq": 0.013888889, + "hetGenotypeFreq": 0.16269842, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.9047619, + "refHomGenotypeFreq": 0.8234127, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04368932, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.067961164, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.9563107, + "refHomGenotypeFreq": 0.9223301, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32397005, + "altHomGenotypeFreq": 0.11985019, + "hetGenotypeFreq": 0.4082397, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.67603, + "refHomGenotypeFreq": 0.47191012, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3119545, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6880455, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.304141, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.69585896, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31966788, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.6803321, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30393744, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.69606256, + "study": "UK10K" + } + ], + "reference": "A", + "start": 22869804, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22869804, + "id": "15:22869804:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22869804, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000561214", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000559534", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558915", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.4199999570846558, + "source": "gerp" + }, + { + "score": 0.07699999958276749, + "source": "phastCons" + }, + { + "score": 0.6549999713897705, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 3.619999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.2839-55G>T", + "ENST00000453949(ENSG00000153575):c.2839-55G>T", + "ENST00000558915(ENSG00000153575):n.470-55G>T" + ], + "id": "rs2289815", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.1341976, + "altHomGenotypeFreq": 0.023082891, + "hetGenotypeFreq": 0.2222294, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8658024, + "refHomGenotypeFreq": 0.7546877, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19199179, + "altHomGenotypeFreq": 0.028747434, + "hetGenotypeFreq": 0.3264887, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.8080082, + "refHomGenotypeFreq": 0.6447639, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.03699137, + "altHomGenotypeFreq": 0.003699137, + "hetGenotypeFreq": 0.06658446, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.96300864, + "refHomGenotypeFreq": 0.9297164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08830549, + "altHomGenotypeFreq": 0.00954654, + "hetGenotypeFreq": 0.1575179, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9116945, + "refHomGenotypeFreq": 0.8329356, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13245033, + "altHomGenotypeFreq": 0.01986755, + "hetGenotypeFreq": 0.22516556, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.86754966, + "refHomGenotypeFreq": 0.7549669, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2624642, + "altHomGenotypeFreq": 0.067621775, + "hetGenotypeFreq": 0.38968483, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.73753583, + "refHomGenotypeFreq": 0.54269344, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17351842, + "altHomGenotypeFreq": 0.027896423, + "hetGenotypeFreq": 0.291244, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.8264816, + "refHomGenotypeFreq": 0.68085957, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.031414814, + "altHomGenotypeFreq": 0.0013758312, + "hetGenotypeFreq": 0.060077965, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9685852, + "refHomGenotypeFreq": 0.9385462, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12755758, + "altHomGenotypeFreq": 0.021045247, + "hetGenotypeFreq": 0.21302468, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.8724424, + "refHomGenotypeFreq": 0.76593006, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14241284, + "altHomGenotypeFreq": 0.025603935, + "hetGenotypeFreq": 0.23361783, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.85758716, + "refHomGenotypeFreq": 0.74077827, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.03034682, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06069364, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.9696532, + "refHomGenotypeFreq": 0.9393064, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12680684, + "altHomGenotypeFreq": 0.023215069, + "hetGenotypeFreq": 0.20718352, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.87319314, + "refHomGenotypeFreq": 0.7696014, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16876179, + "altHomGenotypeFreq": 0.03331238, + "hetGenotypeFreq": 0.27089882, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.8312382, + "refHomGenotypeFreq": 0.6957888, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16733468, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8326653, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0703125, + "altHomGenotypeFreq": 0.015625, + "hetGenotypeFreq": 0.109375, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.9296875, + "refHomGenotypeFreq": 0.875, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10802716, + "altHomGenotypeFreq": 0.017571885, + "hetGenotypeFreq": 0.18091054, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.89197284, + "refHomGenotypeFreq": 0.80151755, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23210634, + "altHomGenotypeFreq": 0.061349694, + "hetGenotypeFreq": 0.34151328, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.7678937, + "refHomGenotypeFreq": 0.59713703, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12765957, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.25531915, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.87234044, + "refHomGenotypeFreq": 0.7446808, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25490198, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.39215687, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.74509805, + "refHomGenotypeFreq": 0.54901963, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.006051437, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.012102874, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9939486, + "refHomGenotypeFreq": 0.9878971, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.052380953, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.104761906, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.947619, + "refHomGenotypeFreq": 0.8952381, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09615385, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.15384616, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.90384614, + "refHomGenotypeFreq": 0.8269231, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21354167, + "altHomGenotypeFreq": 0.052083332, + "hetGenotypeFreq": 0.3229167, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.7864583, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0044247787, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0088495575, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.99557525, + "refHomGenotypeFreq": 0.99115044, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27941176, + "altHomGenotypeFreq": 0.09803922, + "hetGenotypeFreq": 0.3627451, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.7205882, + "refHomGenotypeFreq": 0.5392157, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17582418, + "altHomGenotypeFreq": 0.021978023, + "hetGenotypeFreq": 0.30769232, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.82417583, + "refHomGenotypeFreq": 0.6703297, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.048387095, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0967742, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.9516129, + "refHomGenotypeFreq": 0.9032258, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.060606062, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.121212125, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.93939394, + "refHomGenotypeFreq": 0.8787879, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1635514, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.30841124, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.8364486, + "refHomGenotypeFreq": 0.682243, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20348836, + "altHomGenotypeFreq": 0.069767445, + "hetGenotypeFreq": 0.26744187, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.79651165, + "refHomGenotypeFreq": 0.6627907, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.010416667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.020833334, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.9895833, + "refHomGenotypeFreq": 0.9791667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18489066, + "altHomGenotypeFreq": 0.017892644, + "hetGenotypeFreq": 0.33399603, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.8151094, + "refHomGenotypeFreq": 0.64811134, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.032786883, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06557377, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.9672131, + "refHomGenotypeFreq": 0.93442625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09221902, + "altHomGenotypeFreq": 0.008645534, + "hetGenotypeFreq": 0.16714698, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.907781, + "refHomGenotypeFreq": 0.8242075, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2038835, + "altHomGenotypeFreq": 0.029126214, + "hetGenotypeFreq": 0.34951454, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.79611653, + "refHomGenotypeFreq": 0.6213592, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25757575, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.43434343, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.74242425, + "refHomGenotypeFreq": 0.5252525, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18691589, + "altHomGenotypeFreq": 0.018691588, + "hetGenotypeFreq": 0.3364486, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.8130841, + "refHomGenotypeFreq": 0.6448598, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11057692, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.1826923, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.8894231, + "refHomGenotypeFreq": 0.7980769, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14141414, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.28282827, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.85858583, + "refHomGenotypeFreq": 0.7171717, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.047058824, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09411765, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.9529412, + "refHomGenotypeFreq": 0.90588236, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0.003968254, + "hetGenotypeFreq": 0.103174604, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.89285713, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.019417476, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03883495, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.98058254, + "refHomGenotypeFreq": 0.9611651, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1741573, + "altHomGenotypeFreq": 0.04494382, + "hetGenotypeFreq": 0.25842696, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8258427, + "refHomGenotypeFreq": 0.6966292, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16556467, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.83443534, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15528819, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.8447118, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17566165, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.8243383, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15507013, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.8449299, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22869860, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22869860, + "id": "15:22869860:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22869860, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558915", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.9350000023841858, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -1.7339999675750732, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.5500001907348633, + "source": "cadd_raw" + }, + { + "score": 0.1599999964237213, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.3029-210G>T" + ], + "id": "rs11631470", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.4899403, + "altHomGenotypeFreq": 0.24591121, + "hetGenotypeFreq": 0.48805815, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5100597, + "refHomGenotypeFreq": 0.26603064, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45379877, + "altHomGenotypeFreq": 0.2073922, + "hetGenotypeFreq": 0.49281314, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5462012, + "refHomGenotypeFreq": 0.29979467, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6131841, + "altHomGenotypeFreq": 0.37810946, + "hetGenotypeFreq": 0.47014925, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.3868159, + "refHomGenotypeFreq": 0.1517413, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29256594, + "altHomGenotypeFreq": 0.083932854, + "hetGenotypeFreq": 0.4172662, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.70743406, + "refHomGenotypeFreq": 0.49880096, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.51655626, + "altHomGenotypeFreq": 0.26490065, + "hetGenotypeFreq": 0.5033113, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.4834437, + "refHomGenotypeFreq": 0.23178808, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5083047, + "altHomGenotypeFreq": 0.2600229, + "hetGenotypeFreq": 0.49656358, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.4916953, + "refHomGenotypeFreq": 0.24341352, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43281585, + "altHomGenotypeFreq": 0.18857066, + "hetGenotypeFreq": 0.48849037, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.56718415, + "refHomGenotypeFreq": 0.32293898, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.58035094, + "altHomGenotypeFreq": 0.33387208, + "hetGenotypeFreq": 0.49295774, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.41964903, + "refHomGenotypeFreq": 0.17317016, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4917263, + "altHomGenotypeFreq": 0.25079215, + "hetGenotypeFreq": 0.48186833, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.50827366, + "refHomGenotypeFreq": 0.26733953, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4877305, + "altHomGenotypeFreq": 0.23987222, + "hetGenotypeFreq": 0.49571657, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.5122695, + "refHomGenotypeFreq": 0.2644112, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3977956, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.60220444, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2890625, + "altHomGenotypeFreq": 0.140625, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.7109375, + "refHomGenotypeFreq": 0.5625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50539136, + "altHomGenotypeFreq": 0.2663738, + "hetGenotypeFreq": 0.47803515, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.49460864, + "refHomGenotypeFreq": 0.25559106, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5194274, + "altHomGenotypeFreq": 0.2781186, + "hetGenotypeFreq": 0.48261756, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.4805726, + "refHomGenotypeFreq": 0.2392638, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35638297, + "altHomGenotypeFreq": 0.12765957, + "hetGenotypeFreq": 0.4574468, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.64361703, + "refHomGenotypeFreq": 0.41489363, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49019608, + "altHomGenotypeFreq": 0.23529412, + "hetGenotypeFreq": 0.50980395, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.50980395, + "refHomGenotypeFreq": 0.25490198, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5900151, + "altHomGenotypeFreq": 0.3494705, + "hetGenotypeFreq": 0.48108926, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.40998486, + "refHomGenotypeFreq": 0.16944024, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6333333, + "altHomGenotypeFreq": 0.35238096, + "hetGenotypeFreq": 0.5619048, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.36666667, + "refHomGenotypeFreq": 0.08571429, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.59134614, + "altHomGenotypeFreq": 0.33653846, + "hetGenotypeFreq": 0.50961536, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.40865386, + "refHomGenotypeFreq": 0.15384616, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6388889, + "altHomGenotypeFreq": 0.39814815, + "hetGenotypeFreq": 0.4814815, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.3611111, + "refHomGenotypeFreq": 0.12037037, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5364583, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.46875, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.46354166, + "refHomGenotypeFreq": 0.22916667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5663717, + "altHomGenotypeFreq": 0.30088496, + "hetGenotypeFreq": 0.53097343, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.43362832, + "refHomGenotypeFreq": 0.16814159, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5294118, + "altHomGenotypeFreq": 0.29411766, + "hetGenotypeFreq": 0.47058827, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.47058824, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3846154, + "altHomGenotypeFreq": 0.16483517, + "hetGenotypeFreq": 0.43956044, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.61538464, + "refHomGenotypeFreq": 0.3956044, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.63978493, + "altHomGenotypeFreq": 0.38709676, + "hetGenotypeFreq": 0.50537634, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.36021507, + "refHomGenotypeFreq": 0.10752688, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.530303, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.45454544, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.46969697, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.25233644, + "hetGenotypeFreq": 0.49532712, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.25233644, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50581396, + "altHomGenotypeFreq": 0.26744187, + "hetGenotypeFreq": 0.47674417, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.49418604, + "refHomGenotypeFreq": 0.25581396, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5572917, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.5104167, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.44270834, + "refHomGenotypeFreq": 0.1875, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6060606, + "altHomGenotypeFreq": 0.3939394, + "hetGenotypeFreq": 0.42424244, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.3939394, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.56060606, + "altHomGenotypeFreq": 0.35353535, + "hetGenotypeFreq": 0.41414142, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.43939394, + "refHomGenotypeFreq": 0.23232323, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43439364, + "altHomGenotypeFreq": 0.19284295, + "hetGenotypeFreq": 0.48310137, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.56560636, + "refHomGenotypeFreq": 0.32405567, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.57377046, + "altHomGenotypeFreq": 0.29508197, + "hetGenotypeFreq": 0.55737704, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.4262295, + "refHomGenotypeFreq": 0.14754099, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30259365, + "altHomGenotypeFreq": 0.10662824, + "hetGenotypeFreq": 0.39193082, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.69740635, + "refHomGenotypeFreq": 0.50144094, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.62352943, + "altHomGenotypeFreq": 0.3882353, + "hetGenotypeFreq": 0.47058827, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.3764706, + "refHomGenotypeFreq": 0.14117648, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5339806, + "altHomGenotypeFreq": 0.29126215, + "hetGenotypeFreq": 0.48543692, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.46601942, + "refHomGenotypeFreq": 0.22330096, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.479798, + "altHomGenotypeFreq": 0.1919192, + "hetGenotypeFreq": 0.57575756, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.52020204, + "refHomGenotypeFreq": 0.23232323, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43457943, + "altHomGenotypeFreq": 0.21495327, + "hetGenotypeFreq": 0.43925235, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.56542057, + "refHomGenotypeFreq": 0.34579438, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3846154, + "altHomGenotypeFreq": 0.13461539, + "hetGenotypeFreq": 0.5, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.61538464, + "refHomGenotypeFreq": 0.3653846, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36363637, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.46464646, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.6363636, + "refHomGenotypeFreq": 0.4040404, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15294118, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.25882354, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.84705883, + "refHomGenotypeFreq": 0.7176471, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.59126985, + "altHomGenotypeFreq": 0.32936507, + "hetGenotypeFreq": 0.5238095, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.40873015, + "refHomGenotypeFreq": 0.1468254, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5631068, + "altHomGenotypeFreq": 0.27184466, + "hetGenotypeFreq": 0.5825243, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.4368932, + "refHomGenotypeFreq": 0.14563107, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41695318, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5830468, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40822607, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.5917739, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42553192, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.5744681, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40803668, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.5919633, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22872992, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22872992, + "id": "15:22872992:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22872992, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "cdnaPosition": 3282, + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000283645", + "exonOverlap": [ + { + "number": "23/23", + "percentage": 0.1447178 + } + ], + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000453949", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000153575", + "ensemblTranscriptId": "ENST00000558915", + "geneName": "TUBGCP5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.2100000381469727, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -0.9620000123977661, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "3_prime_UTR_variant", + "functionalScore": [ + { + "score": 0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 4.079999923706055, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.0028060817, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0233715", + "name": "speech impairment", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0600104", + "name": "Compulsive Behavior", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000283645(ENSG00000153575):c.*77A>G" + ], + "id": "rs1046860", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.14323153, + "altHomGenotypeFreq": 0.02898926, + "hetGenotypeFreq": 0.22848454, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8567685, + "refHomGenotypeFreq": 0.74252623, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09674134, + "altHomGenotypeFreq": 0.014256619, + "hetGenotypeFreq": 0.16496944, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.9032587, + "refHomGenotypeFreq": 0.82077396, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4732587, + "altHomGenotypeFreq": 0.23258707, + "hetGenotypeFreq": 0.48134327, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.52674127, + "refHomGenotypeFreq": 0.28606966, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.052505966, + "altHomGenotypeFreq": 0.00477327, + "hetGenotypeFreq": 0.09546539, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.94749403, + "refHomGenotypeFreq": 0.8997613, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.11589404, + "altHomGenotypeFreq": 0.01986755, + "hetGenotypeFreq": 0.19205298, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.884106, + "refHomGenotypeFreq": 0.78807944, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1043578, + "altHomGenotypeFreq": 0.009747706, + "hetGenotypeFreq": 0.18922019, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.8956422, + "refHomGenotypeFreq": 0.8010321, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.100200266, + "altHomGenotypeFreq": 0.010814419, + "hetGenotypeFreq": 0.17877169, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.8997997, + "refHomGenotypeFreq": 0.8104139, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18679678, + "altHomGenotypeFreq": 0.03467279, + "hetGenotypeFreq": 0.304248, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.8132032, + "refHomGenotypeFreq": 0.6610792, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14916901, + "altHomGenotypeFreq": 0.03312266, + "hetGenotypeFreq": 0.2320927, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.850831, + "refHomGenotypeFreq": 0.73478466, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13589002, + "altHomGenotypeFreq": 0.023878437, + "hetGenotypeFreq": 0.22402315, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.86411, + "refHomGenotypeFreq": 0.7520984, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20303468, + "altHomGenotypeFreq": 0.0433526, + "hetGenotypeFreq": 0.31936416, + "population": "AA", + "refAllele": "A", + "refAlleleFreq": 0.7969653, + "refHomGenotypeFreq": 0.63728327, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13096802, + "altHomGenotypeFreq": 0.021462988, + "hetGenotypeFreq": 0.21901007, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.86903197, + "refHomGenotypeFreq": 0.75952697, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.099622875, + "altHomGenotypeFreq": 0.011942174, + "hetGenotypeFreq": 0.17536141, + "population": "EA", + "refAllele": "A", + "refAlleleFreq": 0.9003771, + "refHomGenotypeFreq": 0.8126964, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08717435, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.91282564, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0546875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.109375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.9453125, + "refHomGenotypeFreq": 0.890625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17891374, + "altHomGenotypeFreq": 0.051916935, + "hetGenotypeFreq": 0.2539936, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8210863, + "refHomGenotypeFreq": 0.6940895, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.064417176, + "altHomGenotypeFreq": 0.0020449897, + "hetGenotypeFreq": 0.12474437, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.9355828, + "refHomGenotypeFreq": 0.8732106, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.05319149, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10638298, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.9468085, + "refHomGenotypeFreq": 0.89361703, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.014705882, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.029411767, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.9852941, + "refHomGenotypeFreq": 0.9705882, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19288956, + "altHomGenotypeFreq": 0.04387292, + "hetGenotypeFreq": 0.2980333, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.8071104, + "refHomGenotypeFreq": 0.6580938, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.23809524, + "hetGenotypeFreq": 0.52380955, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.23809524, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4278846, + "altHomGenotypeFreq": 0.21153846, + "hetGenotypeFreq": 0.43269232, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.57211536, + "refHomGenotypeFreq": 0.35576922, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16203703, + "altHomGenotypeFreq": 0.027777778, + "hetGenotypeFreq": 0.2685185, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.837963, + "refHomGenotypeFreq": 0.7037037, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.078125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15625, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.921875, + "refHomGenotypeFreq": 0.84375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19469027, + "altHomGenotypeFreq": 0.053097345, + "hetGenotypeFreq": 0.28318584, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.8053097, + "refHomGenotypeFreq": 0.6637168, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.073529415, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14705883, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.9264706, + "refHomGenotypeFreq": 0.85294116, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.093406595, + "altHomGenotypeFreq": 0.010989011, + "hetGenotypeFreq": 0.16483517, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.9065934, + "refHomGenotypeFreq": 0.82417583, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4784946, + "altHomGenotypeFreq": 0.17204301, + "hetGenotypeFreq": 0.61290324, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.52150536, + "refHomGenotypeFreq": 0.21505377, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.4949495, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.37373737, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.098130845, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19626169, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.9018692, + "refHomGenotypeFreq": 0.8037383, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.06395349, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12790698, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.93604654, + "refHomGenotypeFreq": 0.872093, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1875, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.3333333, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.8125, + "refHomGenotypeFreq": 0.6458333, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24242425, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.34343433, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.75757575, + "refHomGenotypeFreq": 0.5858586, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14141414, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.22222222, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.85858583, + "refHomGenotypeFreq": 0.74747473, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09343936, + "altHomGenotypeFreq": 0.01192843, + "hetGenotypeFreq": 0.16302186, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.90656066, + "refHomGenotypeFreq": 0.8250497, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17213115, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.3114754, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.8278689, + "refHomGenotypeFreq": 0.6721311, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04466859, + "altHomGenotypeFreq": 0.0028818443, + "hetGenotypeFreq": 0.08357349, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.9553314, + "refHomGenotypeFreq": 0.91354465, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2529412, + "altHomGenotypeFreq": 0.08235294, + "hetGenotypeFreq": 0.34117648, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.7470588, + "refHomGenotypeFreq": 0.5764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09223301, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.16504854, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.907767, + "refHomGenotypeFreq": 0.8252427, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12626262, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.23232323, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.8737374, + "refHomGenotypeFreq": 0.75757575, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.07009346, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.12149532, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.92990655, + "refHomGenotypeFreq": 0.86915886, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.057692308, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.09615385, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.9423077, + "refHomGenotypeFreq": 0.8942308, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08080808, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.1010101, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.9191919, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.011764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.023529412, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.9882353, + "refHomGenotypeFreq": 0.9764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44940478, + "altHomGenotypeFreq": 0.1845238, + "hetGenotypeFreq": 0.5297619, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5505952, + "refHomGenotypeFreq": 0.2857143, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46116504, + "altHomGenotypeFreq": 0.16504854, + "hetGenotypeFreq": 0.592233, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.5388349, + "refHomGenotypeFreq": 0.24271844, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08052435, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.14606741, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9194757, + "refHomGenotypeFreq": 0.8464419, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10169268, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8983073, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10016788, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.8998321, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10326933, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.89673066, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.100053936, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.8999461, + "study": "UK10K" + } + ], + "reference": "A", + "start": 22873325, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22873325, + "id": "15:22873325:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22873325, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.5130000114440918, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -2.8269999027252197, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.8900003433227539, + "source": "cadd_raw" + }, + { + "score": 0.019999999552965164, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.-7+3134G>C", + "ENST00000313077(ENSG00000068793):c.-7+2412G>C", + "ENST00000561274(ENSG00000068793):c.-34+2412G>C", + "ENST00000560848(ENSG00000068793):c.-126+2412G>C", + "ENST00000558430(ENSG00000068793):c.-34+2412G>C" + ], + "id": "rs11263673", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.37990513, + "altHomGenotypeFreq": 0.14734927, + "hetGenotypeFreq": 0.4651767, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.62006235, + "refHomGenotypeFreq": 0.387474, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31893003, + "altHomGenotypeFreq": 0.10699589, + "hetGenotypeFreq": 0.4238683, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.68106997, + "refHomGenotypeFreq": 0.4691358, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42288557, + "altHomGenotypeFreq": 0.16044776, + "hetGenotypeFreq": 0.52487564, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5771144, + "refHomGenotypeFreq": 0.3146766, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2284689, + "altHomGenotypeFreq": 0.059808612, + "hetGenotypeFreq": 0.33732057, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.7715311, + "refHomGenotypeFreq": 0.6028708, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32781458, + "altHomGenotypeFreq": 0.08609272, + "hetGenotypeFreq": 0.4834437, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.6721854, + "refHomGenotypeFreq": 0.43046358, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36616886, + "altHomGenotypeFreq": 0.1378518, + "hetGenotypeFreq": 0.4566341, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.63383114, + "refHomGenotypeFreq": 0.40551406, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35596403, + "altHomGenotypeFreq": 0.1266604, + "hetGenotypeFreq": 0.4586073, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.64403594, + "refHomGenotypeFreq": 0.41473234, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44180688, + "altHomGenotypeFreq": 0.1993547, + "hetGenotypeFreq": 0.4851348, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5580779, + "refHomGenotypeFreq": 0.31551048, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38389602, + "altHomGenotypeFreq": 0.15186448, + "hetGenotypeFreq": 0.46406305, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.616104, + "refHomGenotypeFreq": 0.38407245, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37498185, + "altHomGenotypeFreq": 0.14177914, + "hetGenotypeFreq": 0.46655056, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6249456, + "refHomGenotypeFreq": 0.3916703, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.33166334, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.66833663, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15625, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.25, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.84375, + "refHomGenotypeFreq": 0.71875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36222044, + "altHomGenotypeFreq": 0.13817891, + "hetGenotypeFreq": 0.44808307, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.63777953, + "refHomGenotypeFreq": 0.413738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28936607, + "altHomGenotypeFreq": 0.0797546, + "hetGenotypeFreq": 0.4192229, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.71063393, + "refHomGenotypeFreq": 0.5010225, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29787233, + "altHomGenotypeFreq": 0.06382979, + "hetGenotypeFreq": 0.4680851, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.70212764, + "refHomGenotypeFreq": 0.4680851, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28431374, + "altHomGenotypeFreq": 0.09803922, + "hetGenotypeFreq": 0.37254903, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.71568626, + "refHomGenotypeFreq": 0.5294118, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4742814, + "altHomGenotypeFreq": 0.22995462, + "hetGenotypeFreq": 0.48865354, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5257186, + "refHomGenotypeFreq": 0.28139183, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3904762, + "altHomGenotypeFreq": 0.13333334, + "hetGenotypeFreq": 0.51428574, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.60952383, + "refHomGenotypeFreq": 0.35238096, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.2596154, + "hetGenotypeFreq": 0.48076922, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.2596154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4722222, + "altHomGenotypeFreq": 0.23148148, + "hetGenotypeFreq": 0.4814815, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.5277778, + "refHomGenotypeFreq": 0.28703704, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26041666, + "altHomGenotypeFreq": 0.072916664, + "hetGenotypeFreq": 0.375, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.7395833, + "refHomGenotypeFreq": 0.5520833, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54867256, + "altHomGenotypeFreq": 0.31858408, + "hetGenotypeFreq": 0.460177, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.45132744, + "refHomGenotypeFreq": 0.22123894, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31862745, + "altHomGenotypeFreq": 0.11764706, + "hetGenotypeFreq": 0.4019608, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.6813725, + "refHomGenotypeFreq": 0.48039216, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35164836, + "altHomGenotypeFreq": 0.12087912, + "hetGenotypeFreq": 0.4615385, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.64835167, + "refHomGenotypeFreq": 0.41758242, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26881722, + "altHomGenotypeFreq": 0.05376344, + "hetGenotypeFreq": 0.43010753, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.7311828, + "refHomGenotypeFreq": 0.516129, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25757575, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.3939394, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.74242425, + "refHomGenotypeFreq": 0.54545456, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43925235, + "altHomGenotypeFreq": 0.19626169, + "hetGenotypeFreq": 0.48598132, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.5607477, + "refHomGenotypeFreq": 0.317757, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29651162, + "altHomGenotypeFreq": 0.023255814, + "hetGenotypeFreq": 0.54651165, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.70348835, + "refHomGenotypeFreq": 0.43023255, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4375, + "altHomGenotypeFreq": 0.19791667, + "hetGenotypeFreq": 0.47916666, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.5625, + "refHomGenotypeFreq": 0.32291666, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3939394, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.5050505, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.6060606, + "refHomGenotypeFreq": 0.35353535, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44444445, + "altHomGenotypeFreq": 0.21212122, + "hetGenotypeFreq": 0.46464646, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.5555556, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35586482, + "altHomGenotypeFreq": 0.119284295, + "hetGenotypeFreq": 0.47316104, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.6441352, + "refHomGenotypeFreq": 0.4075547, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45901638, + "altHomGenotypeFreq": 0.19672132, + "hetGenotypeFreq": 0.52459013, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.5409836, + "refHomGenotypeFreq": 0.27868852, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23487031, + "altHomGenotypeFreq": 0.0518732, + "hetGenotypeFreq": 0.36599422, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.7651297, + "refHomGenotypeFreq": 0.5821326, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5588235, + "altHomGenotypeFreq": 0.29411766, + "hetGenotypeFreq": 0.5294118, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.44117647, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28640777, + "altHomGenotypeFreq": 0.0776699, + "hetGenotypeFreq": 0.41747573, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.71359223, + "refHomGenotypeFreq": 0.5048544, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34848484, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.47474748, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6515151, + "refHomGenotypeFreq": 0.41414142, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3224299, + "altHomGenotypeFreq": 0.08411215, + "hetGenotypeFreq": 0.47663552, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.6775701, + "refHomGenotypeFreq": 0.43925235, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3221154, + "altHomGenotypeFreq": 0.09615385, + "hetGenotypeFreq": 0.45192307, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.67788464, + "refHomGenotypeFreq": 0.45192307, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3131313, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.46464646, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.68686867, + "refHomGenotypeFreq": 0.45454547, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23529412, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.88235295, + "refHomGenotypeFreq": 0.7647059, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37996033, + "altHomGenotypeFreq": 0.15277778, + "hetGenotypeFreq": 0.45436507, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6200397, + "refHomGenotypeFreq": 0.39285713, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46601942, + "altHomGenotypeFreq": 0.24271844, + "hetGenotypeFreq": 0.44660193, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.5339806, + "refHomGenotypeFreq": 0.3106796, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35493255, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.64506745, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3452714, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.6547286, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3645563, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.6354437, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34492987, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.6550701, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22895193, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22895193, + "id": "15:22895193:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22895193, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.12800000607967377, + "source": "gerp" + }, + { + "score": 0.02800000086426735, + "source": "phastCons" + }, + { + "score": 0.23999999463558197, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.19999980926513672, + "source": "cadd_raw" + }, + { + "score": 4.75, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.-7+8806T>A", + "ENST00000313077(ENSG00000068793):c.-7+8084T>A", + "ENST00000561274(ENSG00000068793):c.-34+8084T>A", + "ENST00000560848(ENSG00000068793):c.-126+8084T>A", + "ENST00000558430(ENSG00000068793):c.-34+8084T>A" + ], + "reference": "T", + "start": 22900865, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22900865, + "id": "15:22900865:T:A", + "length": 1, + "names": [], + "reference": "T", + "start": 22900865, + "strand": "+", + "studies": [], + "type": "SNV" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.7789999842643738, + "source": "gerp" + }, + { + "score": 0.11999999731779099, + "source": "phastCons" + }, + { + "score": -1.9500000476837158, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.07999992370605469, + "source": "cadd_raw" + }, + { + "score": 3.4700000286102295, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.-7+9984C>T", + "ENST00000313077(ENSG00000068793):c.-7+9262C>T", + "ENST00000561274(ENSG00000068793):c.-34+9262C>T", + "ENST00000560848(ENSG00000068793):c.-126+9262C>T", + "ENST00000558430(ENSG00000068793):c.-34+9262C>T" + ], + "id": "rs12324368", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.22803375, + "altHomGenotypeFreq": 0.057884492, + "hetGenotypeFreq": 0.3402985, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7719663, + "refHomGenotypeFreq": 0.601817, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1724846, + "altHomGenotypeFreq": 0.036960986, + "hetGenotypeFreq": 0.27104723, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.8275154, + "refHomGenotypeFreq": 0.6919918, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.042027194, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08405439, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.9579728, + "refHomGenotypeFreq": 0.9159456, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1471292, + "altHomGenotypeFreq": 0.021531101, + "hetGenotypeFreq": 0.25119618, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8528708, + "refHomGenotypeFreq": 0.72727275, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14238411, + "altHomGenotypeFreq": 0.013245033, + "hetGenotypeFreq": 0.25827813, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.8576159, + "refHomGenotypeFreq": 0.7284768, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2287844, + "altHomGenotypeFreq": 0.057912845, + "hetGenotypeFreq": 0.3417431, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7712156, + "refHomGenotypeFreq": 0.60034406, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20123258, + "altHomGenotypeFreq": 0.04086281, + "hetGenotypeFreq": 0.32073954, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7987674, + "refHomGenotypeFreq": 0.63839763, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32557067, + "altHomGenotypeFreq": 0.10537238, + "hetGenotypeFreq": 0.44039658, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.67442936, + "refHomGenotypeFreq": 0.45423102, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22403474, + "altHomGenotypeFreq": 0.056800846, + "hetGenotypeFreq": 0.3344678, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7759653, + "refHomGenotypeFreq": 0.6087314, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23298012, + "altHomGenotypeFreq": 0.05922485, + "hetGenotypeFreq": 0.34751052, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.76701987, + "refHomGenotypeFreq": 0.59326464, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16833667, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8316633, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.109375, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.890625, + "refHomGenotypeFreq": 0.78125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18310703, + "altHomGenotypeFreq": 0.04592652, + "hetGenotypeFreq": 0.274361, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.816893, + "refHomGenotypeFreq": 0.6797125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09304704, + "altHomGenotypeFreq": 0.008179959, + "hetGenotypeFreq": 0.16973415, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.906953, + "refHomGenotypeFreq": 0.8220859, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19148937, + "altHomGenotypeFreq": 0.021276595, + "hetGenotypeFreq": 0.34042555, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.80851066, + "refHomGenotypeFreq": 0.63829786, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04901961, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09803922, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.95098037, + "refHomGenotypeFreq": 0.9019608, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3441755, + "altHomGenotypeFreq": 0.12708019, + "hetGenotypeFreq": 0.43419063, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.6558245, + "refHomGenotypeFreq": 0.4387292, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04761905, + "altHomGenotypeFreq": 0.00952381, + "hetGenotypeFreq": 0.07619048, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.95238096, + "refHomGenotypeFreq": 0.9142857, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.03846154, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07692308, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.96153843, + "refHomGenotypeFreq": 0.9230769, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3935185, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.4537037, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.6064815, + "refHomGenotypeFreq": 0.37962964, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09375, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.16666667, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.90625, + "refHomGenotypeFreq": 0.8229167, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38938054, + "altHomGenotypeFreq": 0.15044248, + "hetGenotypeFreq": 0.47787613, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.6106195, + "refHomGenotypeFreq": 0.37168142, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0882353, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.15686275, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.9117647, + "refHomGenotypeFreq": 0.8333333, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17582418, + "altHomGenotypeFreq": 0.021978023, + "hetGenotypeFreq": 0.30769232, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.82417583, + "refHomGenotypeFreq": 0.6703297, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.05376344, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.086021505, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.94623655, + "refHomGenotypeFreq": 0.9032258, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04040404, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08080808, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.959596, + "refHomGenotypeFreq": 0.9191919, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29439253, + "altHomGenotypeFreq": 0.093457945, + "hetGenotypeFreq": 0.40186918, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.7056075, + "refHomGenotypeFreq": 0.5046729, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11046512, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22093023, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.8895349, + "refHomGenotypeFreq": 0.7790698, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3125, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.375, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.6875, + "refHomGenotypeFreq": 0.5, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3181818, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.37373737, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.6818182, + "refHomGenotypeFreq": 0.4949495, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27272728, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.42424244, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.72727275, + "refHomGenotypeFreq": 0.5151515, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21172962, + "altHomGenotypeFreq": 0.03976143, + "hetGenotypeFreq": 0.34393638, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.78827035, + "refHomGenotypeFreq": 0.6163022, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31967214, + "altHomGenotypeFreq": 0.06557377, + "hetGenotypeFreq": 0.5081967, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.6803279, + "refHomGenotypeFreq": 0.4262295, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15417868, + "altHomGenotypeFreq": 0.014409222, + "hetGenotypeFreq": 0.2795389, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8458213, + "refHomGenotypeFreq": 0.7060519, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3882353, + "altHomGenotypeFreq": 0.16470589, + "hetGenotypeFreq": 0.44705883, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.6117647, + "refHomGenotypeFreq": 0.3882353, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1262136, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.21359223, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.8737864, + "refHomGenotypeFreq": 0.7669903, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21717171, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.3737374, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7828283, + "refHomGenotypeFreq": 0.5959596, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20560747, + "altHomGenotypeFreq": 0.037383176, + "hetGenotypeFreq": 0.3364486, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.7943925, + "refHomGenotypeFreq": 0.62616825, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20192307, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.34615386, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.7980769, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15656565, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.2929293, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.84343433, + "refHomGenotypeFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1764706, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.9117647, + "refHomGenotypeFreq": 0.8235294, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.05059524, + "altHomGenotypeFreq": 0.003968254, + "hetGenotypeFreq": 0.09325397, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.9494048, + "refHomGenotypeFreq": 0.9027778, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07281554, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14563107, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.92718446, + "refHomGenotypeFreq": 0.8543689, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18950014, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.81049985, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1751539, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.8248461, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20134924, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.79865074, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17718446, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.82281554, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22902043, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22902043, + "id": "15:22902043:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22902043, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.25, + "source": "gerp" + }, + { + "score": 0.006000000052154064, + "source": "phastCons" + }, + { + "score": 0.4620000123977661, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 4.840000152587891, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.-6-9546G>A", + "ENST00000313077(ENSG00000068793):c.-6-9546G>A", + "ENST00000561274(ENSG00000068793):c.-33-9519G>A", + "ENST00000560848(ENSG00000068793):c.-125-8808G>A", + "ENST00000558430(ENSG00000068793):c.-33-9519G>A" + ], + "id": "rs28510215", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.17352219, + "altHomGenotypeFreq": 0.034859657, + "hetGenotypeFreq": 0.27732506, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8264778, + "refHomGenotypeFreq": 0.6878153, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18711656, + "altHomGenotypeFreq": 0.036809817, + "hetGenotypeFreq": 0.3006135, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.81288344, + "refHomGenotypeFreq": 0.6625767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49628714, + "altHomGenotypeFreq": 0.22277227, + "hetGenotypeFreq": 0.5470297, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5037129, + "refHomGenotypeFreq": 0.23019803, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17427884, + "altHomGenotypeFreq": 0.03846154, + "hetGenotypeFreq": 0.2716346, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.82572114, + "refHomGenotypeFreq": 0.68990386, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29801324, + "altHomGenotypeFreq": 0.09271523, + "hetGenotypeFreq": 0.410596, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.70198673, + "refHomGenotypeFreq": 0.49668875, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12084765, + "altHomGenotypeFreq": 0.013172966, + "hetGenotypeFreq": 0.21534938, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.87915236, + "refHomGenotypeFreq": 0.77147764, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17262541, + "altHomGenotypeFreq": 0.028815368, + "hetGenotypeFreq": 0.28762007, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.8273746, + "refHomGenotypeFreq": 0.68356454, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13039486, + "altHomGenotypeFreq": 0.016528925, + "hetGenotypeFreq": 0.22773187, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8696051, + "refHomGenotypeFreq": 0.7557392, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18187669, + "altHomGenotypeFreq": 0.03931204, + "hetGenotypeFreq": 0.28512928, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.81812334, + "refHomGenotypeFreq": 0.6755587, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16319595, + "altHomGenotypeFreq": 0.029356472, + "hetGenotypeFreq": 0.26767895, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.83680403, + "refHomGenotypeFreq": 0.70296454, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1783567, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8216433, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1484375, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.8515625, + "refHomGenotypeFreq": 0.703125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28454474, + "altHomGenotypeFreq": 0.111821085, + "hetGenotypeFreq": 0.34544727, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7154553, + "refHomGenotypeFreq": 0.54273164, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4202454, + "altHomGenotypeFreq": 0.18404908, + "hetGenotypeFreq": 0.47239262, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.5797546, + "refHomGenotypeFreq": 0.34355828, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23404256, + "altHomGenotypeFreq": 0.06382979, + "hetGenotypeFreq": 0.34042555, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.7659575, + "refHomGenotypeFreq": 0.59574467, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4019608, + "altHomGenotypeFreq": 0.13725491, + "hetGenotypeFreq": 0.5294118, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.5980392, + "refHomGenotypeFreq": 0.33333334, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11951589, + "altHomGenotypeFreq": 0.013615734, + "hetGenotypeFreq": 0.2118003, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8804841, + "refHomGenotypeFreq": 0.77458394, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53333336, + "altHomGenotypeFreq": 0.2761905, + "hetGenotypeFreq": 0.51428574, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.46666667, + "refHomGenotypeFreq": 0.20952381, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5192308, + "altHomGenotypeFreq": 0.2596154, + "hetGenotypeFreq": 0.5192308, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.48076922, + "refHomGenotypeFreq": 0.22115384, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11111111, + "altHomGenotypeFreq": 0.009259259, + "hetGenotypeFreq": 0.2037037, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.8888889, + "refHomGenotypeFreq": 0.787037, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34895834, + "altHomGenotypeFreq": 0.14583333, + "hetGenotypeFreq": 0.40625, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.6510417, + "refHomGenotypeFreq": 0.44791666, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10619469, + "altHomGenotypeFreq": 0.0088495575, + "hetGenotypeFreq": 0.19469027, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.8938053, + "refHomGenotypeFreq": 0.79646015, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47549018, + "altHomGenotypeFreq": 0.24509804, + "hetGenotypeFreq": 0.46078432, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.5245098, + "refHomGenotypeFreq": 0.29411766, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17582418, + "altHomGenotypeFreq": 0.032967035, + "hetGenotypeFreq": 0.2857143, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.82417583, + "refHomGenotypeFreq": 0.6813187, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6451613, + "altHomGenotypeFreq": 0.41935483, + "hetGenotypeFreq": 0.4516129, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.3548387, + "refHomGenotypeFreq": 0.12903225, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43939394, + "altHomGenotypeFreq": 0.1919192, + "hetGenotypeFreq": 0.4949495, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.56060606, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24299066, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.39252338, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.7570093, + "refHomGenotypeFreq": 0.5607477, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4883721, + "altHomGenotypeFreq": 0.23255815, + "hetGenotypeFreq": 0.5116279, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.5116279, + "refHomGenotypeFreq": 0.25581396, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16145833, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.26041666, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.8385417, + "refHomGenotypeFreq": 0.7083333, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09090909, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.16161616, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.90909094, + "refHomGenotypeFreq": 0.82828283, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0959596, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.17171717, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.9040404, + "refHomGenotypeFreq": 0.8181818, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1749503, + "altHomGenotypeFreq": 0.031809144, + "hetGenotypeFreq": 0.2862823, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.8250497, + "refHomGenotypeFreq": 0.68190855, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.114754096, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22950819, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.8852459, + "refHomGenotypeFreq": 0.7704918, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2074928, + "altHomGenotypeFreq": 0.0518732, + "hetGenotypeFreq": 0.31123918, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.79250723, + "refHomGenotypeFreq": 0.6368876, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16470589, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.28235295, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.8352941, + "refHomGenotypeFreq": 0.69411767, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39320388, + "altHomGenotypeFreq": 0.16504854, + "hetGenotypeFreq": 0.4563107, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.60679615, + "refHomGenotypeFreq": 0.37864077, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.08585858, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.15151516, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.9141414, + "refHomGenotypeFreq": 0.83838385, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18224299, + "altHomGenotypeFreq": 0.037383176, + "hetGenotypeFreq": 0.28971964, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.817757, + "refHomGenotypeFreq": 0.6728972, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22596154, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.3173077, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.77403843, + "refHomGenotypeFreq": 0.61538464, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18181819, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.3030303, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.8181818, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.28235295, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.8, + "refHomGenotypeFreq": 0.65882355, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53174603, + "altHomGenotypeFreq": 0.29166666, + "hetGenotypeFreq": 0.48015872, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.46825397, + "refHomGenotypeFreq": 0.2281746, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5291262, + "altHomGenotypeFreq": 0.32038835, + "hetGenotypeFreq": 0.41747573, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.47087377, + "refHomGenotypeFreq": 0.26213592, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17177995, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.82822007, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16675994, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.83324003, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17592113, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.82407886, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16747573, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.8325243, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22916231, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22916231, + "id": "15:22916231:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22916231, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.4800000190734863, + "source": "gerp" + }, + { + "score": 0.017000000923871994, + "source": "phastCons" + }, + { + "score": -1.6890000104904175, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.7399997711181641, + "source": "cadd_raw" + }, + { + "score": 0.05999999865889549, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.-6-9218A>T", + "ENST00000313077(ENSG00000068793):c.-6-9218A>T", + "ENST00000561274(ENSG00000068793):c.-33-9191A>T", + "ENST00000560848(ENSG00000068793):c.-125-8480A>T", + "ENST00000558430(ENSG00000068793):c.-33-9191A>T" + ], + "id": "rs28446119", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.6282758, + "altHomGenotypeFreq": 0.39497924, + "hetGenotypeFreq": 0.46659315, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.3717242, + "refHomGenotypeFreq": 0.1384276, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6482618, + "altHomGenotypeFreq": 0.41308793, + "hetGenotypeFreq": 0.47034764, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.35173824, + "refHomGenotypeFreq": 0.116564415, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.735732, + "altHomGenotypeFreq": 0.53846157, + "hetGenotypeFreq": 0.39454094, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.26426798, + "refHomGenotypeFreq": 0.06699752, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6079137, + "altHomGenotypeFreq": 0.3788969, + "hetGenotypeFreq": 0.45803356, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.39208633, + "refHomGenotypeFreq": 0.16306955, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6589404, + "altHomGenotypeFreq": 0.45695364, + "hetGenotypeFreq": 0.40397352, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.3410596, + "refHomGenotypeFreq": 0.13907285, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.61646587, + "altHomGenotypeFreq": 0.3786575, + "hetGenotypeFreq": 0.47561675, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.38353413, + "refHomGenotypeFreq": 0.14572576, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.64101017, + "altHomGenotypeFreq": 0.4119775, + "hetGenotypeFreq": 0.4580654, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.3589898, + "refHomGenotypeFreq": 0.12995712, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.58985275, + "altHomGenotypeFreq": 0.34307408, + "hetGenotypeFreq": 0.4935573, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.41014725, + "refHomGenotypeFreq": 0.16336861, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.63188165, + "altHomGenotypeFreq": 0.3973471, + "hetGenotypeFreq": 0.46906915, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.36811832, + "refHomGenotypeFreq": 0.13358375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.623822, + "altHomGenotypeFreq": 0.39205453, + "hetGenotypeFreq": 0.46353486, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.37617806, + "refHomGenotypeFreq": 0.14441061, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67635274, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.3236473, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6953125, + "altHomGenotypeFreq": 0.5, + "hetGenotypeFreq": 0.390625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.3046875, + "refHomGenotypeFreq": 0.109375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.63977635, + "altHomGenotypeFreq": 0.4213259, + "hetGenotypeFreq": 0.43690097, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.36022365, + "refHomGenotypeFreq": 0.14177316, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6441718, + "altHomGenotypeFreq": 0.4192229, + "hetGenotypeFreq": 0.44989777, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.35582823, + "refHomGenotypeFreq": 0.13087934, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.65957445, + "altHomGenotypeFreq": 0.41489363, + "hetGenotypeFreq": 0.4893617, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.34042552, + "refHomGenotypeFreq": 0.095744684, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6127451, + "altHomGenotypeFreq": 0.3529412, + "hetGenotypeFreq": 0.51960784, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.3872549, + "refHomGenotypeFreq": 0.12745099, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.57564294, + "altHomGenotypeFreq": 0.34341908, + "hetGenotypeFreq": 0.4644478, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.42435703, + "refHomGenotypeFreq": 0.19213313, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.73333335, + "altHomGenotypeFreq": 0.53333336, + "hetGenotypeFreq": 0.4, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.26666668, + "refHomGenotypeFreq": 0.06666667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5817308, + "altHomGenotypeFreq": 0.3846154, + "hetGenotypeFreq": 0.39423078, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.41826922, + "refHomGenotypeFreq": 0.22115384, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5787037, + "altHomGenotypeFreq": 0.3425926, + "hetGenotypeFreq": 0.4722222, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.4212963, + "refHomGenotypeFreq": 0.18518518, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6666667, + "altHomGenotypeFreq": 0.44791666, + "hetGenotypeFreq": 0.4375, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5176991, + "altHomGenotypeFreq": 0.24778761, + "hetGenotypeFreq": 0.539823, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.48230088, + "refHomGenotypeFreq": 0.21238938, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6519608, + "altHomGenotypeFreq": 0.48039216, + "hetGenotypeFreq": 0.34313726, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.3480392, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6703297, + "altHomGenotypeFreq": 0.4065934, + "hetGenotypeFreq": 0.52747256, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.32967034, + "refHomGenotypeFreq": 0.06593407, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.77956986, + "altHomGenotypeFreq": 0.6236559, + "hetGenotypeFreq": 0.31182796, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.2204301, + "refHomGenotypeFreq": 0.06451613, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7929293, + "altHomGenotypeFreq": 0.6363636, + "hetGenotypeFreq": 0.31313133, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.20707071, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.682243, + "altHomGenotypeFreq": 0.44859812, + "hetGenotypeFreq": 0.46728972, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.317757, + "refHomGenotypeFreq": 0.08411215, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.64534885, + "altHomGenotypeFreq": 0.39534885, + "hetGenotypeFreq": 0.5, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.35465115, + "refHomGenotypeFreq": 0.10465116, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5208333, + "altHomGenotypeFreq": 0.3125, + "hetGenotypeFreq": 0.41666666, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.47916666, + "refHomGenotypeFreq": 0.27083334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5959596, + "altHomGenotypeFreq": 0.36363637, + "hetGenotypeFreq": 0.46464646, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.4040404, + "refHomGenotypeFreq": 0.17171717, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6060606, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.44444445, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.3939394, + "refHomGenotypeFreq": 0.17171717, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.65407556, + "altHomGenotypeFreq": 0.42345923, + "hetGenotypeFreq": 0.4612326, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.34592447, + "refHomGenotypeFreq": 0.11530815, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6557377, + "altHomGenotypeFreq": 0.4262295, + "hetGenotypeFreq": 0.45901638, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.3442623, + "refHomGenotypeFreq": 0.114754096, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6181556, + "altHomGenotypeFreq": 0.39769453, + "hetGenotypeFreq": 0.4409222, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.38184437, + "refHomGenotypeFreq": 0.16138329, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.59411764, + "altHomGenotypeFreq": 0.3764706, + "hetGenotypeFreq": 0.43529415, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.40588236, + "refHomGenotypeFreq": 0.1882353, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6456311, + "altHomGenotypeFreq": 0.41747573, + "hetGenotypeFreq": 0.4563107, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.35436893, + "refHomGenotypeFreq": 0.1262136, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5707071, + "altHomGenotypeFreq": 0.32323232, + "hetGenotypeFreq": 0.4949495, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.42929292, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6775701, + "altHomGenotypeFreq": 0.44859812, + "hetGenotypeFreq": 0.45794392, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.3224299, + "refHomGenotypeFreq": 0.093457945, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6394231, + "altHomGenotypeFreq": 0.43269232, + "hetGenotypeFreq": 0.41346154, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.36057693, + "refHomGenotypeFreq": 0.15384616, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6666667, + "altHomGenotypeFreq": 0.4848485, + "hetGenotypeFreq": 0.36363637, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.15151516, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4882353, + "altHomGenotypeFreq": 0.25882354, + "hetGenotypeFreq": 0.45882353, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.5117647, + "refHomGenotypeFreq": 0.28235295, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7202381, + "altHomGenotypeFreq": 0.53968257, + "hetGenotypeFreq": 0.3611111, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.2797619, + "refHomGenotypeFreq": 0.09920635, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.723301, + "altHomGenotypeFreq": 0.5339806, + "hetGenotypeFreq": 0.37864077, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.27669904, + "refHomGenotypeFreq": 0.08737864, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6687384, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.33126158, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6695579, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.33044207, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6670991, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.33290088, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6704423, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.32955772, + "study": "UK10K" + } + ], + "reference": "A", + "start": 22916559, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22916559, + "id": "15:22916559:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 22916559, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.6100000143051147, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.6570000052452087, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.15999984741210938, + "source": "cadd_raw" + }, + { + "score": 1.3200000524520874, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.-6-8214C>T", + "ENST00000313077(ENSG00000068793):c.-6-8214C>T", + "ENST00000561274(ENSG00000068793):c.-33-8187C>T", + "ENST00000560848(ENSG00000068793):c.-125-7476C>T", + "ENST00000558430(ENSG00000068793):c.-33-8187C>T" + ], + "id": "rs66817559", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.16675308, + "altHomGenotypeFreq": 0.03609851, + "hetGenotypeFreq": 0.26130915, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.83324695, + "refHomGenotypeFreq": 0.7025924, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19057377, + "altHomGenotypeFreq": 0.036885247, + "hetGenotypeFreq": 0.30737704, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.80942625, + "refHomGenotypeFreq": 0.6557377, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.56397516, + "altHomGenotypeFreq": 0.30062112, + "hetGenotypeFreq": 0.52670807, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.43602484, + "refHomGenotypeFreq": 0.17267081, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17822966, + "altHomGenotypeFreq": 0.03827751, + "hetGenotypeFreq": 0.2799043, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8217703, + "refHomGenotypeFreq": 0.6818182, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30463576, + "altHomGenotypeFreq": 0.09271523, + "hetGenotypeFreq": 0.42384106, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.69536424, + "refHomGenotypeFreq": 0.4834437, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12049227, + "altHomGenotypeFreq": 0.013737836, + "hetGenotypeFreq": 0.21350887, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.8795077, + "refHomGenotypeFreq": 0.7727533, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17097682, + "altHomGenotypeFreq": 0.02787083, + "hetGenotypeFreq": 0.28621197, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.8290232, + "refHomGenotypeFreq": 0.6859172, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09614502, + "altHomGenotypeFreq": 0.008031207, + "hetGenotypeFreq": 0.17622763, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.90385497, + "refHomGenotypeFreq": 0.8157412, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17497069, + "altHomGenotypeFreq": 0.040679954, + "hetGenotypeFreq": 0.26858148, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.8250293, + "refHomGenotypeFreq": 0.69073856, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1565942, + "altHomGenotypeFreq": 0.030434782, + "hetGenotypeFreq": 0.25231883, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.8434058, + "refHomGenotypeFreq": 0.71724635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17735471, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8226453, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1484375, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.8515625, + "refHomGenotypeFreq": 0.703125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29153356, + "altHomGenotypeFreq": 0.13099042, + "hetGenotypeFreq": 0.32108626, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7084665, + "refHomGenotypeFreq": 0.5479233, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4243354, + "altHomGenotypeFreq": 0.19018404, + "hetGenotypeFreq": 0.46830267, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.57566464, + "refHomGenotypeFreq": 0.3415133, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2393617, + "altHomGenotypeFreq": 0.06382979, + "hetGenotypeFreq": 0.35106385, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.7606383, + "refHomGenotypeFreq": 0.5851064, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4019608, + "altHomGenotypeFreq": 0.13725491, + "hetGenotypeFreq": 0.5294118, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.5980392, + "refHomGenotypeFreq": 0.33333334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09001513, + "altHomGenotypeFreq": 0.0075642965, + "hetGenotypeFreq": 0.16490167, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9099849, + "refHomGenotypeFreq": 0.827534, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.60952383, + "altHomGenotypeFreq": 0.3904762, + "hetGenotypeFreq": 0.43809527, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.3904762, + "refHomGenotypeFreq": 0.17142858, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5625, + "altHomGenotypeFreq": 0.33653846, + "hetGenotypeFreq": 0.45192307, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.4375, + "refHomGenotypeFreq": 0.21153846, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06481481, + "altHomGenotypeFreq": 0.009259259, + "hetGenotypeFreq": 0.11111111, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.9351852, + "refHomGenotypeFreq": 0.8796296, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34895834, + "altHomGenotypeFreq": 0.14583333, + "hetGenotypeFreq": 0.40625, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.6510417, + "refHomGenotypeFreq": 0.44791666, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.061946902, + "altHomGenotypeFreq": 0.0088495575, + "hetGenotypeFreq": 0.10619469, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.9380531, + "refHomGenotypeFreq": 0.88495576, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47549018, + "altHomGenotypeFreq": 0.24509804, + "hetGenotypeFreq": 0.46078432, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.5245098, + "refHomGenotypeFreq": 0.29411766, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17582418, + "altHomGenotypeFreq": 0.032967035, + "hetGenotypeFreq": 0.2857143, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.82417583, + "refHomGenotypeFreq": 0.6813187, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.72043014, + "altHomGenotypeFreq": 0.53763443, + "hetGenotypeFreq": 0.3655914, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.2795699, + "refHomGenotypeFreq": 0.09677419, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.45454544, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.27272728, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23831776, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.38317758, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.7616823, + "refHomGenotypeFreq": 0.57009345, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.51744187, + "altHomGenotypeFreq": 0.26744187, + "hetGenotypeFreq": 0.5, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.48255813, + "refHomGenotypeFreq": 0.23255815, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13020833, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.23958334, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.8697917, + "refHomGenotypeFreq": 0.75, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07575758, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15151516, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.92424244, + "refHomGenotypeFreq": 0.8484849, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.060606062, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12121212, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.93939394, + "refHomGenotypeFreq": 0.8787879, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17395626, + "altHomGenotypeFreq": 0.031809144, + "hetGenotypeFreq": 0.28429425, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.8260437, + "refHomGenotypeFreq": 0.6838966, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10655738, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21311474, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.89344263, + "refHomGenotypeFreq": 0.78688526, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20893371, + "altHomGenotypeFreq": 0.0518732, + "hetGenotypeFreq": 0.31412104, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7910663, + "refHomGenotypeFreq": 0.6340058, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15294118, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.25882354, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.84705883, + "refHomGenotypeFreq": 0.7176471, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3883495, + "altHomGenotypeFreq": 0.16504854, + "hetGenotypeFreq": 0.44660193, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.61165047, + "refHomGenotypeFreq": 0.3883495, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08585858, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.15151516, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.9141414, + "refHomGenotypeFreq": 0.83838385, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17757009, + "altHomGenotypeFreq": 0.037383176, + "hetGenotypeFreq": 0.2803738, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.8224299, + "refHomGenotypeFreq": 0.682243, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22115384, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.30769232, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.77884614, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18686868, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.3131313, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.81313133, + "refHomGenotypeFreq": 0.65656567, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20588236, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.29411766, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.7941176, + "refHomGenotypeFreq": 0.64705884, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.60119045, + "altHomGenotypeFreq": 0.3888889, + "hetGenotypeFreq": 0.42460316, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.39880952, + "refHomGenotypeFreq": 0.18650794, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6213592, + "altHomGenotypeFreq": 0.41747573, + "hetGenotypeFreq": 0.407767, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.37864077, + "refHomGenotypeFreq": 0.17475729, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.171251, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.828749, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16703974, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.83296025, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17488323, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.82511675, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16747573, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.8325243, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22917563, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22917563, + "id": "15:22917563:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22917563, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.25, + "source": "gerp" + }, + { + "score": 0.05900000035762787, + "source": "phastCons" + }, + { + "score": -1.7410000562667847, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.05000019073486328, + "source": "cadd_raw" + }, + { + "score": 2.200000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.-6-8181A>G", + "ENST00000313077(ENSG00000068793):c.-6-8181A>G", + "ENST00000561274(ENSG00000068793):c.-33-8154A>G", + "ENST00000560848(ENSG00000068793):c.-125-7443A>G", + "ENST00000558430(ENSG00000068793):c.-33-8154A>G" + ], + "id": "rs6606803", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.66816884, + "altHomGenotypeFreq": 0.44767216, + "hetGenotypeFreq": 0.4409934, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.33183116, + "refHomGenotypeFreq": 0.11133446, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.66563785, + "altHomGenotypeFreq": 0.4341564, + "hetGenotypeFreq": 0.46296296, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.33436215, + "refHomGenotypeFreq": 0.10288066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8277778, + "altHomGenotypeFreq": 0.67407405, + "hetGenotypeFreq": 0.3074074, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.17222223, + "refHomGenotypeFreq": 0.018518519, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67865705, + "altHomGenotypeFreq": 0.47482014, + "hetGenotypeFreq": 0.40767387, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.32134292, + "refHomGenotypeFreq": 0.117506, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.678808, + "altHomGenotypeFreq": 0.49006623, + "hetGenotypeFreq": 0.37748346, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.32119206, + "refHomGenotypeFreq": 0.13245033, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6222795, + "altHomGenotypeFreq": 0.38946164, + "hetGenotypeFreq": 0.46563575, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.3777205, + "refHomGenotypeFreq": 0.14490263, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6449819, + "altHomGenotypeFreq": 0.4168565, + "hetGenotypeFreq": 0.45625085, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.35501808, + "refHomGenotypeFreq": 0.12689267, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6955622, + "altHomGenotypeFreq": 0.47919062, + "hetGenotypeFreq": 0.43274316, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.30443782, + "refHomGenotypeFreq": 0.08806622, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6738391, + "altHomGenotypeFreq": 0.45391652, + "hetGenotypeFreq": 0.4398452, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.32616088, + "refHomGenotypeFreq": 0.106238276, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6611546, + "altHomGenotypeFreq": 0.43994778, + "hetGenotypeFreq": 0.4424137, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.33884537, + "refHomGenotypeFreq": 0.11763853, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6773547, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.32264528, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7734375, + "altHomGenotypeFreq": 0.59375, + "hetGenotypeFreq": 0.359375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.2265625, + "refHomGenotypeFreq": 0.046875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7202476, + "altHomGenotypeFreq": 0.52276355, + "hetGenotypeFreq": 0.39496803, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.2797524, + "refHomGenotypeFreq": 0.08226837, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.69018406, + "altHomGenotypeFreq": 0.47648263, + "hetGenotypeFreq": 0.42740285, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.30981594, + "refHomGenotypeFreq": 0.096114516, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7287234, + "altHomGenotypeFreq": 0.5106383, + "hetGenotypeFreq": 0.43617022, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.2712766, + "refHomGenotypeFreq": 0.05319149, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6519608, + "altHomGenotypeFreq": 0.38235295, + "hetGenotypeFreq": 0.5392157, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.3480392, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.71482605, + "altHomGenotypeFreq": 0.50226927, + "hetGenotypeFreq": 0.42511344, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.28517398, + "refHomGenotypeFreq": 0.07261725, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8333333, + "altHomGenotypeFreq": 0.7047619, + "hetGenotypeFreq": 0.25714287, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.16666667, + "refHomGenotypeFreq": 0.03809524, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.72596157, + "altHomGenotypeFreq": 0.5480769, + "hetGenotypeFreq": 0.35576922, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.27403846, + "refHomGenotypeFreq": 0.09615385, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6898148, + "altHomGenotypeFreq": 0.41666666, + "hetGenotypeFreq": 0.5462963, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.3101852, + "refHomGenotypeFreq": 0.037037037, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6979167, + "altHomGenotypeFreq": 0.47916666, + "hetGenotypeFreq": 0.4375, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.30208334, + "refHomGenotypeFreq": 0.083333336, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.70353985, + "altHomGenotypeFreq": 0.50442475, + "hetGenotypeFreq": 0.39823008, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.29646018, + "refHomGenotypeFreq": 0.097345136, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7058824, + "altHomGenotypeFreq": 0.5392157, + "hetGenotypeFreq": 0.33333334, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.29411766, + "refHomGenotypeFreq": 0.12745099, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67582417, + "altHomGenotypeFreq": 0.41758242, + "hetGenotypeFreq": 0.51648355, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.32417583, + "refHomGenotypeFreq": 0.06593407, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8817204, + "altHomGenotypeFreq": 0.78494626, + "hetGenotypeFreq": 0.19354838, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.11827957, + "refHomGenotypeFreq": 0.021505376, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.82828283, + "altHomGenotypeFreq": 0.67676765, + "hetGenotypeFreq": 0.3030303, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.17171717, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6962617, + "altHomGenotypeFreq": 0.48598132, + "hetGenotypeFreq": 0.42056075, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.30373833, + "refHomGenotypeFreq": 0.093457945, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7267442, + "altHomGenotypeFreq": 0.53488374, + "hetGenotypeFreq": 0.38372093, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.27325583, + "refHomGenotypeFreq": 0.08139535, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6510417, + "altHomGenotypeFreq": 0.41666666, + "hetGenotypeFreq": 0.46875, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.34895834, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7121212, + "altHomGenotypeFreq": 0.5050505, + "hetGenotypeFreq": 0.41414142, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.28787878, + "refHomGenotypeFreq": 0.08080808, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.72727275, + "altHomGenotypeFreq": 0.54545456, + "hetGenotypeFreq": 0.36363637, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.27272728, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6610338, + "altHomGenotypeFreq": 0.4393638, + "hetGenotypeFreq": 0.44333994, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.3389662, + "refHomGenotypeFreq": 0.11729623, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.73770493, + "altHomGenotypeFreq": 0.55737704, + "hetGenotypeFreq": 0.36065573, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.26229507, + "refHomGenotypeFreq": 0.08196721, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7161383, + "altHomGenotypeFreq": 0.5129683, + "hetGenotypeFreq": 0.40634006, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.28386167, + "refHomGenotypeFreq": 0.08069164, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.80588233, + "altHomGenotypeFreq": 0.6117647, + "hetGenotypeFreq": 0.3882353, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.19411765, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6747573, + "altHomGenotypeFreq": 0.4563107, + "hetGenotypeFreq": 0.4368932, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.32524273, + "refHomGenotypeFreq": 0.106796116, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5707071, + "altHomGenotypeFreq": 0.32323232, + "hetGenotypeFreq": 0.4949495, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.42929292, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6775701, + "altHomGenotypeFreq": 0.44859812, + "hetGenotypeFreq": 0.45794392, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.3224299, + "refHomGenotypeFreq": 0.093457945, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7355769, + "altHomGenotypeFreq": 0.52884614, + "hetGenotypeFreq": 0.41346154, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.26442307, + "refHomGenotypeFreq": 0.057692308, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6818182, + "altHomGenotypeFreq": 0.5151515, + "hetGenotypeFreq": 0.33333334, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.3181818, + "refHomGenotypeFreq": 0.15151516, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.63529414, + "altHomGenotypeFreq": 0.43529412, + "hetGenotypeFreq": 0.4, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.3647059, + "refHomGenotypeFreq": 0.16470589, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.81845236, + "altHomGenotypeFreq": 0.6845238, + "hetGenotypeFreq": 0.26785713, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.18154761, + "refHomGenotypeFreq": 0.04761905, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8300971, + "altHomGenotypeFreq": 0.7184466, + "hetGenotypeFreq": 0.22330096, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.1699029, + "refHomGenotypeFreq": 0.058252428, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6724411, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.32755885, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6745943, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.32540572, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.66943437, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.33056563, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6755663, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.32443365, + "study": "UK10K" + } + ], + "reference": "A", + "start": 22917596, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22917596, + "id": "15:22917596:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22917596, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -6.150000095367432, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.45899999141693115, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 1.2699999809265137, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.-6-172C>T", + "ENST00000313077(ENSG00000068793):c.-6-172C>T", + "ENST00000561274(ENSG00000068793):c.-33-145C>T", + "ENST00000560848(ENSG00000068793):c.-6-172C>T", + "ENST00000558430(ENSG00000068793):c.-33-145C>T" + ], + "id": "rs12592624", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.23797469, + "altHomGenotypeFreq": 0.05972087, + "hetGenotypeFreq": 0.35650763, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7620253, + "refHomGenotypeFreq": 0.5837715, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25255623, + "altHomGenotypeFreq": 0.061349694, + "hetGenotypeFreq": 0.3824131, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.74744374, + "refHomGenotypeFreq": 0.5562372, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45031056, + "altHomGenotypeFreq": 0.18509316, + "hetGenotypeFreq": 0.5304348, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5496894, + "refHomGenotypeFreq": 0.28447205, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26196173, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.34210527, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7380383, + "refHomGenotypeFreq": 0.56698567, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35099337, + "altHomGenotypeFreq": 0.119205296, + "hetGenotypeFreq": 0.46357617, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.6490066, + "refHomGenotypeFreq": 0.41721854, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23337156, + "altHomGenotypeFreq": 0.053325687, + "hetGenotypeFreq": 0.36009175, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.76662844, + "refHomGenotypeFreq": 0.58658254, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25573593, + "altHomGenotypeFreq": 0.06480612, + "hetGenotypeFreq": 0.38185966, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.74426407, + "refHomGenotypeFreq": 0.55333424, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16214038, + "altHomGenotypeFreq": 0.025086306, + "hetGenotypeFreq": 0.27410817, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.83785963, + "refHomGenotypeFreq": 0.70080554, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24233525, + "altHomGenotypeFreq": 0.06237519, + "hetGenotypeFreq": 0.3599201, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.75766474, + "refHomGenotypeFreq": 0.57770467, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23258851, + "altHomGenotypeFreq": 0.056442253, + "hetGenotypeFreq": 0.3522925, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7674115, + "refHomGenotypeFreq": 0.59126526, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25350702, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.746493, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.203125, + "altHomGenotypeFreq": 0.046875, + "hetGenotypeFreq": 0.3125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.796875, + "refHomGenotypeFreq": 0.640625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3214856, + "altHomGenotypeFreq": 0.12899362, + "hetGenotypeFreq": 0.38498402, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.67851436, + "refHomGenotypeFreq": 0.48602235, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4795501, + "altHomGenotypeFreq": 0.23517382, + "hetGenotypeFreq": 0.48875254, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.5204499, + "refHomGenotypeFreq": 0.2760736, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30319148, + "altHomGenotypeFreq": 0.08510638, + "hetGenotypeFreq": 0.43617022, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.6968085, + "refHomGenotypeFreq": 0.4787234, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46078432, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.5686275, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.5392157, + "refHomGenotypeFreq": 0.25490198, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14750378, + "altHomGenotypeFreq": 0.015128593, + "hetGenotypeFreq": 0.26475036, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8524962, + "refHomGenotypeFreq": 0.720121, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4857143, + "altHomGenotypeFreq": 0.25714287, + "hetGenotypeFreq": 0.45714286, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.51428574, + "refHomGenotypeFreq": 0.2857143, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5144231, + "altHomGenotypeFreq": 0.26923078, + "hetGenotypeFreq": 0.4903846, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.48557693, + "refHomGenotypeFreq": 0.24038461, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1712963, + "altHomGenotypeFreq": 0.009259259, + "hetGenotypeFreq": 0.3240741, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.8287037, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44791666, + "altHomGenotypeFreq": 0.22916667, + "hetGenotypeFreq": 0.4375, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.5520833, + "refHomGenotypeFreq": 0.33333334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.119469024, + "altHomGenotypeFreq": 0.017699115, + "hetGenotypeFreq": 0.20353982, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.88053095, + "refHomGenotypeFreq": 0.7787611, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5294118, + "altHomGenotypeFreq": 0.30392158, + "hetGenotypeFreq": 0.4509804, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.47058824, + "refHomGenotypeFreq": 0.24509804, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23626374, + "altHomGenotypeFreq": 0.06593407, + "hetGenotypeFreq": 0.34065935, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.76373625, + "refHomGenotypeFreq": 0.5934066, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.56989247, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.47311828, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.43010753, + "refHomGenotypeFreq": 0.19354838, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4848485, + "altHomGenotypeFreq": 0.22222222, + "hetGenotypeFreq": 0.5252525, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.5151515, + "refHomGenotypeFreq": 0.25252524, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29439253, + "altHomGenotypeFreq": 0.10280374, + "hetGenotypeFreq": 0.38317758, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.7056075, + "refHomGenotypeFreq": 0.5140187, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5116279, + "altHomGenotypeFreq": 0.23255815, + "hetGenotypeFreq": 0.55813956, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.4883721, + "refHomGenotypeFreq": 0.20930232, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18229167, + "altHomGenotypeFreq": 0.041666668, + "hetGenotypeFreq": 0.28125, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.8177083, + "refHomGenotypeFreq": 0.6770833, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13131313, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.24242425, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.86868685, + "refHomGenotypeFreq": 0.74747473, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13131313, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.24242425, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.86868685, + "refHomGenotypeFreq": 0.74747473, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2524851, + "altHomGenotypeFreq": 0.07554672, + "hetGenotypeFreq": 0.35387674, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.7475149, + "refHomGenotypeFreq": 0.57057655, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1557377, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.27868852, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.8442623, + "refHomGenotypeFreq": 0.704918, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2723343, + "altHomGenotypeFreq": 0.08357349, + "hetGenotypeFreq": 0.37752163, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7276657, + "refHomGenotypeFreq": 0.5389049, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14705883, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.29411766, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.85294116, + "refHomGenotypeFreq": 0.7058824, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4514563, + "altHomGenotypeFreq": 0.23300971, + "hetGenotypeFreq": 0.4368932, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.5485437, + "refHomGenotypeFreq": 0.33009708, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22727273, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.3333333, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.77272725, + "refHomGenotypeFreq": 0.6060606, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25700936, + "altHomGenotypeFreq": 0.10280374, + "hetGenotypeFreq": 0.3084112, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.7429907, + "refHomGenotypeFreq": 0.58878505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.057692308, + "hetGenotypeFreq": 0.38461536, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.5576923, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24242425, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.4040404, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.75757575, + "refHomGenotypeFreq": 0.5555556, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31764707, + "altHomGenotypeFreq": 0.14117648, + "hetGenotypeFreq": 0.3529412, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.68235296, + "refHomGenotypeFreq": 0.5058824, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49900794, + "altHomGenotypeFreq": 0.25992063, + "hetGenotypeFreq": 0.47817463, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.50099206, + "refHomGenotypeFreq": 0.26190478, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44660193, + "altHomGenotypeFreq": 0.22330096, + "hetGenotypeFreq": 0.44660193, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5533981, + "refHomGenotypeFreq": 0.33009708, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.123595506, + "altHomGenotypeFreq": 0.029962547, + "hetGenotypeFreq": 0.18726592, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8764045, + "refHomGenotypeFreq": 0.7827715, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24266067, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.75733936, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23866816, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.76133186, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24494033, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.75505966, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24029127, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.75970876, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22925605, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22925605, + "id": "15:22925605:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22925605, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.4800000190734863, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -1.2910000085830688, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.15999984741210938, + "source": "cadd_raw" + }, + { + "score": 1.3600000143051147, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.-6-153G>A", + "ENST00000313077(ENSG00000068793):c.-6-153G>A", + "ENST00000561274(ENSG00000068793):c.-33-126G>A", + "ENST00000560848(ENSG00000068793):c.-6-153G>A", + "ENST00000558430(ENSG00000068793):c.-33-126G>A" + ], + "id": "rs17841096", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.22238089, + "altHomGenotypeFreq": 0.053031288, + "hetGenotypeFreq": 0.33869922, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7776191, + "refHomGenotypeFreq": 0.6082695, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24642126, + "altHomGenotypeFreq": 0.073619634, + "hetGenotypeFreq": 0.34560326, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7535787, + "refHomGenotypeFreq": 0.5807771, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3312655, + "altHomGenotypeFreq": 0.10918114, + "hetGenotypeFreq": 0.44416875, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6687345, + "refHomGenotypeFreq": 0.44665012, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37200958, + "altHomGenotypeFreq": 0.14114833, + "hetGenotypeFreq": 0.4617225, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6279904, + "refHomGenotypeFreq": 0.39712918, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16887417, + "altHomGenotypeFreq": 0.01986755, + "hetGenotypeFreq": 0.29801324, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.83112586, + "refHomGenotypeFreq": 0.6821192, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25774083, + "altHomGenotypeFreq": 0.06479358, + "hetGenotypeFreq": 0.3858945, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.74225914, + "refHomGenotypeFreq": 0.54931194, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25821596, + "altHomGenotypeFreq": 0.06224011, + "hetGenotypeFreq": 0.3919517, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.74178404, + "refHomGenotypeFreq": 0.5458082, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.111213446, + "altHomGenotypeFreq": 0.012433802, + "hetGenotypeFreq": 0.1975593, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.88878655, + "refHomGenotypeFreq": 0.79000694, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21795775, + "altHomGenotypeFreq": 0.050469484, + "hetGenotypeFreq": 0.33497652, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.78204226, + "refHomGenotypeFreq": 0.614554, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22785361, + "altHomGenotypeFreq": 0.05620099, + "hetGenotypeFreq": 0.34330526, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7721464, + "refHomGenotypeFreq": 0.6004937, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26653308, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7334669, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.484375, + "altHomGenotypeFreq": 0.21875, + "hetGenotypeFreq": 0.53125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.515625, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20746805, + "altHomGenotypeFreq": 0.05031949, + "hetGenotypeFreq": 0.31429714, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.79253197, + "refHomGenotypeFreq": 0.63538337, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1400818, + "altHomGenotypeFreq": 0.008179959, + "hetGenotypeFreq": 0.2638037, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.8599182, + "refHomGenotypeFreq": 0.7280164, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2925532, + "altHomGenotypeFreq": 0.08510638, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.7074468, + "refHomGenotypeFreq": 0.5, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15196079, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30392158, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.8480392, + "refHomGenotypeFreq": 0.6960784, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09152799, + "altHomGenotypeFreq": 0.0075642965, + "hetGenotypeFreq": 0.16792738, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.908472, + "refHomGenotypeFreq": 0.8245083, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2857143, + "altHomGenotypeFreq": 0.07619048, + "hetGenotypeFreq": 0.41904762, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.71428573, + "refHomGenotypeFreq": 0.50476193, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19711539, + "altHomGenotypeFreq": 0.03846154, + "hetGenotypeFreq": 0.3173077, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.80288464, + "refHomGenotypeFreq": 0.6442308, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.023148147, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0462963, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.9768519, + "refHomGenotypeFreq": 0.9537037, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15104167, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.2604167, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.8489583, + "refHomGenotypeFreq": 0.71875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.092920355, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18584071, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.90707964, + "refHomGenotypeFreq": 0.8141593, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13235295, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2647059, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.86764705, + "refHomGenotypeFreq": 0.7352941, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25824177, + "altHomGenotypeFreq": 0.032967035, + "hetGenotypeFreq": 0.45054945, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.7417582, + "refHomGenotypeFreq": 0.51648355, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2204301, + "altHomGenotypeFreq": 0.07526882, + "hetGenotypeFreq": 0.29032257, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.77956986, + "refHomGenotypeFreq": 0.6344086, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3838384, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.54545456, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.61616164, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26168224, + "altHomGenotypeFreq": 0.08411215, + "hetGenotypeFreq": 0.3551402, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.7383177, + "refHomGenotypeFreq": 0.5607477, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11627907, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23255815, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.88372093, + "refHomGenotypeFreq": 0.76744187, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.125, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.9375, + "refHomGenotypeFreq": 0.875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.08080808, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.12121212, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.9191919, + "refHomGenotypeFreq": 0.85858583, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.2929293, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.68686867, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26242545, + "altHomGenotypeFreq": 0.06560636, + "hetGenotypeFreq": 0.3936382, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.7375746, + "refHomGenotypeFreq": 0.54075545, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14754099, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.26229507, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.852459, + "refHomGenotypeFreq": 0.72131145, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3429395, + "altHomGenotypeFreq": 0.12680115, + "hetGenotypeFreq": 0.43227667, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6570605, + "refHomGenotypeFreq": 0.4409222, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1882353, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.90588236, + "refHomGenotypeFreq": 0.8117647, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14563107, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.2524272, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.8543689, + "refHomGenotypeFreq": 0.7281553, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26262626, + "altHomGenotypeFreq": 0.1010101, + "hetGenotypeFreq": 0.32323232, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7373737, + "refHomGenotypeFreq": 0.57575756, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2897196, + "altHomGenotypeFreq": 0.07476635, + "hetGenotypeFreq": 0.42990655, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.71028036, + "refHomGenotypeFreq": 0.49532712, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27884614, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.40384614, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.72115386, + "refHomGenotypeFreq": 0.5192308, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23737374, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.41414142, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.7626263, + "refHomGenotypeFreq": 0.5555556, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37058824, + "altHomGenotypeFreq": 0.16470589, + "hetGenotypeFreq": 0.4117647, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.62941176, + "refHomGenotypeFreq": 0.42352942, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2767857, + "altHomGenotypeFreq": 0.07936508, + "hetGenotypeFreq": 0.39484125, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.72321427, + "refHomGenotypeFreq": 0.5257937, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2961165, + "altHomGenotypeFreq": 0.097087376, + "hetGenotypeFreq": 0.39805824, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.70388347, + "refHomGenotypeFreq": 0.5048544, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.252809, + "altHomGenotypeFreq": 0.08239701, + "hetGenotypeFreq": 0.34082398, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.747191, + "refHomGenotypeFreq": 0.576779, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2763819, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7236181, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27700055, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.72299945, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2760768, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.7239232, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27669904, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.72330093, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22925624, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22925624, + "id": "15:22925624:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22925624, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "cdnaPosition": 304, + "cdsPosition": 209, + "codon": "tGt/tAt", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "exonOverlap": [ + { + "number": "4/6", + "percentage": 0.75757575 + } + ], + "geneName": "CYFIP1", + "proteinVariantAnnotation": { + "alternate": "TYR", + "position": 70, + "reference": "CYS", + "substitutionScores": [] + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001583", + "name": "missense_variant" + }, + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 149, + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "exonOverlap": [ + { + "number": "1/4", + "percentage": 0.35842294 + } + ], + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.1399999856948853, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -3.0999999046325684, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": -0.43000030517578125, + "source": "cadd_raw" + }, + { + "score": 0.33000001311302185, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.207+164G>A", + "ENST00000313077(ENSG00000068793):c.207+164G>A", + "ENST00000561274(ENSG00000068793):c.207+164G>A", + "ENST00000560848(ENSG00000068793):c.207+164G>A", + "ENST00000558430(ENSG00000068793):c.209G>A", + "ENSP00000454091:p.Cys70Tyr", + "ENST00000559393(ENSG00000068793):n.149G>A" + ], + "id": "rs2289824", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.90326655, + "altHomGenotypeFreq": 0.81713104, + "hetGenotypeFreq": 0.17227109, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.09673343, + "refHomGenotypeFreq": 0.0105978865, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.91154057, + "altHomGenotypeFreq": 0.8301579, + "hetGenotypeFreq": 0.16276538, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.08845945, + "refHomGenotypeFreq": 0.0070767556, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.88373697, + "altHomGenotypeFreq": 0.78164995, + "hetGenotypeFreq": 0.20417406, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.11626305, + "refHomGenotypeFreq": 0.014176019, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.95230913, + "altHomGenotypeFreq": 0.9069651, + "hetGenotypeFreq": 0.090688124, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.04769089, + "refHomGenotypeFreq": 0.0023468276, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.84125805, + "altHomGenotypeFreq": 0.7060426, + "hetGenotypeFreq": 0.2704309, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.15874195, + "refHomGenotypeFreq": 0.023526499, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.92921937, + "altHomGenotypeFreq": 0.8632132, + "hetGenotypeFreq": 0.13201241, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.07078061, + "refHomGenotypeFreq": 0.0047744093, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8865746, + "altHomGenotypeFreq": 0.7852797, + "hetGenotypeFreq": 0.2025899, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.11342538, + "refHomGenotypeFreq": 0.012130432, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9651329, + "altHomGenotypeFreq": 0.9311232, + "hetGenotypeFreq": 0.068019435, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.034867104, + "refHomGenotypeFreq": 8.5738784E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.900366, + "altHomGenotypeFreq": 0.81168497, + "hetGenotypeFreq": 0.17736207, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.099634, + "refHomGenotypeFreq": 0.010952962, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9067436, + "altHomGenotypeFreq": 0.8236594, + "hetGenotypeFreq": 0.16616835, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.09325642, + "refHomGenotypeFreq": 0.010172246, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.91402966, + "altHomGenotypeFreq": 0.8360836, + "hetGenotypeFreq": 0.15589206, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.085970365, + "refHomGenotypeFreq": 0.008024332, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8957055, + "altHomGenotypeFreq": 0.799591, + "hetGenotypeFreq": 0.19222903, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.10429448, + "refHomGenotypeFreq": 0.008179959, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8793532, + "altHomGenotypeFreq": 0.7624378, + "hetGenotypeFreq": 0.23383084, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.12064677, + "refHomGenotypeFreq": 0.0037313432, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.94736844, + "altHomGenotypeFreq": 0.8971292, + "hetGenotypeFreq": 0.10047847, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.05263158, + "refHomGenotypeFreq": 0.0023923444, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8543046, + "altHomGenotypeFreq": 0.7350993, + "hetGenotypeFreq": 0.23841059, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.14569536, + "refHomGenotypeFreq": 0.026490066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.92153496, + "altHomGenotypeFreq": 0.84879726, + "hetGenotypeFreq": 0.14547537, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.07846506, + "refHomGenotypeFreq": 0.005727377, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8908192, + "altHomGenotypeFreq": 0.7943338, + "hetGenotypeFreq": 0.19297074, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.10918081, + "refHomGenotypeFreq": 0.012695443, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9581614, + "altHomGenotypeFreq": 0.91792756, + "hetGenotypeFreq": 0.08046768, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.041838605, + "refHomGenotypeFreq": 0.0016047684, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.912756, + "altHomGenotypeFreq": 0.83253366, + "hetGenotypeFreq": 0.1604447, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.087244004, + "refHomGenotypeFreq": 0.00702165, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.91560507, + "altHomGenotypeFreq": 0.8404748, + "hetGenotypeFreq": 0.15026057, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.0843949, + "refHomGenotypeFreq": 0.009264621, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.87374747, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.1262525, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8882461, + "altHomGenotypeFreq": 0.78795415, + "hetGenotypeFreq": 0.2005839, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.111753896, + "refHomGenotypeFreq": 0.011461938, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8888889, + "altHomGenotypeFreq": 0.7878788, + "hetGenotypeFreq": 0.2020202, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.11111111, + "refHomGenotypeFreq": 0.01010101, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.88793105, + "altHomGenotypeFreq": 0.7906047, + "hetGenotypeFreq": 0.19465268, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.112068966, + "refHomGenotypeFreq": 0.014742629, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8894737, + "altHomGenotypeFreq": 0.78245616, + "hetGenotypeFreq": 0.2140351, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.110526316, + "refHomGenotypeFreq": 0.003508772, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.94736844, + "altHomGenotypeFreq": 0.8947368, + "hetGenotypeFreq": 0.10526316, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.05263158, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9217687, + "altHomGenotypeFreq": 0.8435374, + "hetGenotypeFreq": 0.15646258, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.07823129, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.86995995, + "altHomGenotypeFreq": 0.7516689, + "hetGenotypeFreq": 0.23658212, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.13004005, + "refHomGenotypeFreq": 0.011748998, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.956636, + "altHomGenotypeFreq": 0.91458607, + "hetGenotypeFreq": 0.08409987, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.043363996, + "refHomGenotypeFreq": 0.0013140604, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9375, + "altHomGenotypeFreq": 0.875, + "hetGenotypeFreq": 0.125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.0625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9191294, + "altHomGenotypeFreq": 0.84664536, + "hetGenotypeFreq": 0.14496806, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.080870606, + "refHomGenotypeFreq": 0.008386581, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.87832314, + "altHomGenotypeFreq": 0.76687115, + "hetGenotypeFreq": 0.22290388, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.12167689, + "refHomGenotypeFreq": 0.010224949, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.95212764, + "altHomGenotypeFreq": 0.90425533, + "hetGenotypeFreq": 0.095744684, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.047872342, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.85294116, + "altHomGenotypeFreq": 0.71568626, + "hetGenotypeFreq": 0.27450982, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.14705883, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9704992, + "altHomGenotypeFreq": 0.9409985, + "hetGenotypeFreq": 0.059001513, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.029500756, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8857143, + "altHomGenotypeFreq": 0.8, + "hetGenotypeFreq": 0.17142858, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.114285715, + "refHomGenotypeFreq": 0.028571429, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8605769, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.22115386, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.13942307, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9814815, + "altHomGenotypeFreq": 0.962963, + "hetGenotypeFreq": 0.037037037, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.018518519, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8802083, + "altHomGenotypeFreq": 0.7708333, + "hetGenotypeFreq": 0.21875, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.119791664, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9734513, + "altHomGenotypeFreq": 0.94690263, + "hetGenotypeFreq": 0.053097345, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.026548672, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8480392, + "altHomGenotypeFreq": 0.7254902, + "hetGenotypeFreq": 0.24509805, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.15196079, + "refHomGenotypeFreq": 0.029411765, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8901099, + "altHomGenotypeFreq": 0.7912088, + "hetGenotypeFreq": 0.1978022, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.10989011, + "refHomGenotypeFreq": 0.010989011, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.88709676, + "altHomGenotypeFreq": 0.8064516, + "hetGenotypeFreq": 0.16129032, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.11290322, + "refHomGenotypeFreq": 0.032258064, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9040404, + "altHomGenotypeFreq": 0.8080808, + "hetGenotypeFreq": 0.1919192, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.0959596, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.92523366, + "altHomGenotypeFreq": 0.85046726, + "hetGenotypeFreq": 0.1495327, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.07476635, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9244186, + "altHomGenotypeFreq": 0.8488372, + "hetGenotypeFreq": 0.1511628, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.075581394, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.953125, + "altHomGenotypeFreq": 0.90625, + "hetGenotypeFreq": 0.09375, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.046875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.95454544, + "altHomGenotypeFreq": 0.90909094, + "hetGenotypeFreq": 0.09090909, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.045454547, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9747475, + "altHomGenotypeFreq": 0.94949496, + "hetGenotypeFreq": 0.05050505, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.025252525, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.91053677, + "altHomGenotypeFreq": 0.82703775, + "hetGenotypeFreq": 0.16699801, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.08946322, + "refHomGenotypeFreq": 0.005964215, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9836066, + "altHomGenotypeFreq": 0.9672131, + "hetGenotypeFreq": 0.032786883, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.016393442, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9481268, + "altHomGenotypeFreq": 0.8991355, + "hetGenotypeFreq": 0.097982705, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.0518732, + "refHomGenotypeFreq": 0.0028818443, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9764706, + "altHomGenotypeFreq": 0.9529412, + "hetGenotypeFreq": 0.047058824, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.023529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.89320385, + "altHomGenotypeFreq": 0.78640777, + "hetGenotypeFreq": 0.21359223, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.106796116, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9292929, + "altHomGenotypeFreq": 0.85858583, + "hetGenotypeFreq": 0.14141414, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.07070707, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.91121495, + "altHomGenotypeFreq": 0.8317757, + "hetGenotypeFreq": 0.1588785, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.088785045, + "refHomGenotypeFreq": 0.009345794, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.92788464, + "altHomGenotypeFreq": 0.86538464, + "hetGenotypeFreq": 0.125, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.072115384, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8939394, + "altHomGenotypeFreq": 0.7979798, + "hetGenotypeFreq": 0.1919192, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.10606061, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9764706, + "altHomGenotypeFreq": 0.9529412, + "hetGenotypeFreq": 0.047058824, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.023529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8799603, + "altHomGenotypeFreq": 0.78373015, + "hetGenotypeFreq": 0.19246033, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.12003968, + "refHomGenotypeFreq": 0.023809524, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8640777, + "altHomGenotypeFreq": 0.75728154, + "hetGenotypeFreq": 0.21359223, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.13592233, + "refHomGenotypeFreq": 0.029126214, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.88733137, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.1126686, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8858422, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.1141578, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8876492, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.11235081, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8870011, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.11299892, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22926229, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22926229, + "id": "15:22926229:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22926229, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.5299999713897705, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -0.37400001287460327, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.1099996566772461, + "source": "cadd_raw" + }, + { + "score": 3.759999990463257, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.208-315T>C", + "ENST00000313077(ENSG00000068793):c.208-315T>C", + "ENST00000561274(ENSG00000068793):c.208-315T>C", + "ENST00000560848(ENSG00000068793):c.208-315T>C", + "ENST00000558430(ENSG00000068793):c.*106-315T>C", + "ENST00000559393(ENSG00000068793):n.280-315T>C" + ], + "id": "rs61388954", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.23743035, + "altHomGenotypeFreq": 0.060580537, + "hetGenotypeFreq": 0.35369962, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.76256967, + "refHomGenotypeFreq": 0.5857198, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26844263, + "altHomGenotypeFreq": 0.079918034, + "hetGenotypeFreq": 0.37704918, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.73155737, + "refHomGenotypeFreq": 0.54303277, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3289638, + "altHomGenotypeFreq": 0.10486891, + "hetGenotypeFreq": 0.44818977, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.6710362, + "refHomGenotypeFreq": 0.44694132, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3705036, + "altHomGenotypeFreq": 0.1438849, + "hetGenotypeFreq": 0.4532374, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.6294964, + "refHomGenotypeFreq": 0.4028777, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.205298, + "altHomGenotypeFreq": 0.026490066, + "hetGenotypeFreq": 0.3576159, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.794702, + "refHomGenotypeFreq": 0.615894, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27348223, + "altHomGenotypeFreq": 0.0744559, + "hetGenotypeFreq": 0.3980527, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.72651774, + "refHomGenotypeFreq": 0.5274914, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28278306, + "altHomGenotypeFreq": 0.07565834, + "hetGenotypeFreq": 0.41424942, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.71721697, + "refHomGenotypeFreq": 0.51009226, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11298851, + "altHomGenotypeFreq": 0.011954023, + "hetGenotypeFreq": 0.20206897, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.88701147, + "refHomGenotypeFreq": 0.785977, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23347786, + "altHomGenotypeFreq": 0.057651747, + "hetGenotypeFreq": 0.3516522, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.76652217, + "refHomGenotypeFreq": 0.59069604, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24231884, + "altHomGenotypeFreq": 0.0642029, + "hetGenotypeFreq": 0.3562319, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.75768113, + "refHomGenotypeFreq": 0.5795652, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29258516, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.70741487, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.484375, + "altHomGenotypeFreq": 0.21875, + "hetGenotypeFreq": 0.53125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.515625, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21246007, + "altHomGenotypeFreq": 0.053115018, + "hetGenotypeFreq": 0.3186901, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.78753996, + "refHomGenotypeFreq": 0.62819487, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14928426, + "altHomGenotypeFreq": 0.010224949, + "hetGenotypeFreq": 0.2781186, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.85071576, + "refHomGenotypeFreq": 0.71165645, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30851063, + "altHomGenotypeFreq": 0.095744684, + "hetGenotypeFreq": 0.42553192, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.69148934, + "refHomGenotypeFreq": 0.4787234, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15686275, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3137255, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.84313726, + "refHomGenotypeFreq": 0.6862745, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08850227, + "altHomGenotypeFreq": 0.006051437, + "hetGenotypeFreq": 0.16490167, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9114977, + "refHomGenotypeFreq": 0.8290469, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2809524, + "altHomGenotypeFreq": 0.07619048, + "hetGenotypeFreq": 0.40952381, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.7190476, + "refHomGenotypeFreq": 0.51428574, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19711539, + "altHomGenotypeFreq": 0.03846154, + "hetGenotypeFreq": 0.3173077, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.80288464, + "refHomGenotypeFreq": 0.6442308, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.023148147, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0462963, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.9768519, + "refHomGenotypeFreq": 0.9537037, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16145833, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.26041666, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.8385417, + "refHomGenotypeFreq": 0.7083333, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07522124, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15044248, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.92477876, + "refHomGenotypeFreq": 0.8495575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14215687, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.28431374, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.85784316, + "refHomGenotypeFreq": 0.71568626, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2912088, + "altHomGenotypeFreq": 0.054945055, + "hetGenotypeFreq": 0.4725275, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.7087912, + "refHomGenotypeFreq": 0.47252747, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2204301, + "altHomGenotypeFreq": 0.07526882, + "hetGenotypeFreq": 0.29032257, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.77956986, + "refHomGenotypeFreq": 0.6344086, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.53535354, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.35353535, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26635513, + "altHomGenotypeFreq": 0.093457945, + "hetGenotypeFreq": 0.34579438, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.73364484, + "refHomGenotypeFreq": 0.5607477, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13953489, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.27906975, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.8604651, + "refHomGenotypeFreq": 0.7209302, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.067708336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13541666, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.9322917, + "refHomGenotypeFreq": 0.8645833, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07575758, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.111111104, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.92424244, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.32323232, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27833003, + "altHomGenotypeFreq": 0.07554672, + "hetGenotypeFreq": 0.4055666, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.72167, + "refHomGenotypeFreq": 0.5188867, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13934426, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.8606557, + "refHomGenotypeFreq": 0.73770493, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3501441, + "altHomGenotypeFreq": 0.13256484, + "hetGenotypeFreq": 0.4351585, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.6498559, + "refHomGenotypeFreq": 0.43227667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1882353, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.90588236, + "refHomGenotypeFreq": 0.8117647, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14563107, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.2524272, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.8543689, + "refHomGenotypeFreq": 0.7281553, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.3333333, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.5555556, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3084112, + "altHomGenotypeFreq": 0.07476635, + "hetGenotypeFreq": 0.46728975, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.69158876, + "refHomGenotypeFreq": 0.45794392, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28365386, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.41346154, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.71634614, + "refHomGenotypeFreq": 0.50961536, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24747474, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.41414142, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.75252527, + "refHomGenotypeFreq": 0.54545456, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3764706, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.4, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.62352943, + "refHomGenotypeFreq": 0.42352942, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27579364, + "altHomGenotypeFreq": 0.07936508, + "hetGenotypeFreq": 0.39285713, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.7242063, + "refHomGenotypeFreq": 0.5277778, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30097088, + "altHomGenotypeFreq": 0.097087376, + "hetGenotypeFreq": 0.407767, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.69902915, + "refHomGenotypeFreq": 0.49514562, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29687914, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7031208, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29518747, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.7048125, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29865074, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.70134926, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29503775, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.70496225, + "study": "UK10K" + } + ], + "reference": "T", + "start": 22927814, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22927814, + "id": "15:22927814:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22927814, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.08299999684095383, + "source": "phastCons" + }, + { + "score": 0, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.3100004196166992, + "source": "cadd_raw" + }, + { + "score": 0.6299999952316284, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.387+27G>C", + "ENST00000313077(ENSG00000068793):c.387+27G>C", + "ENST00000561274(ENSG00000068793):c.387+27G>C", + "ENST00000560848(ENSG00000068793):c.387+27G>C", + "ENST00000559393(ENSG00000068793):n.459+27G>C" + ], + "id": "rs79791617", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.2784403, + "altHomGenotypeFreq": 0.085322976, + "hetGenotypeFreq": 0.38733262, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7210107, + "refHomGenotypeFreq": 0.5273444, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29035962, + "altHomGenotypeFreq": 0.084162205, + "hetGenotypeFreq": 0.41392502, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7088753, + "refHomGenotypeFreq": 0.5019128, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25448194, + "altHomGenotypeFreq": 0.067986034, + "hetGenotypeFreq": 0.38393483, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.74004656, + "refHomGenotypeFreq": 0.54807913, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42484793, + "altHomGenotypeFreq": 0.18333334, + "hetGenotypeFreq": 0.48339415, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5749696, + "refHomGenotypeFreq": 0.33327252, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22317791, + "altHomGenotypeFreq": 0.0488909, + "hetGenotypeFreq": 0.348574, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7768221, + "refHomGenotypeFreq": 0.60253507, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27145943, + "altHomGenotypeFreq": 0.07409842, + "hetGenotypeFreq": 0.394722, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7285406, + "refHomGenotypeFreq": 0.53117955, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2973928, + "altHomGenotypeFreq": 0.08854401, + "hetGenotypeFreq": 0.41777253, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7025697, + "refHomGenotypeFreq": 0.49368346, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10408136, + "altHomGenotypeFreq": 0.010962885, + "hetGenotypeFreq": 0.18689738, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.89558846, + "refHomGenotypeFreq": 0.80213976, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27109018, + "altHomGenotypeFreq": 0.08069348, + "hetGenotypeFreq": 0.38180768, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7284027, + "refHomGenotypeFreq": 0.53749883, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28726053, + "altHomGenotypeFreq": 0.09087845, + "hetGenotypeFreq": 0.39396265, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7121402, + "refHomGenotypeFreq": 0.5151589, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2333959, + "altHomGenotypeFreq": 0.058972035, + "hetGenotypeFreq": 0.349754, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.76615095, + "refHomGenotypeFreq": 0.59127396, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26891616, + "altHomGenotypeFreq": 0.08179959, + "hetGenotypeFreq": 0.37423313, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.73108387, + "refHomGenotypeFreq": 0.5439673, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2682776, + "altHomGenotypeFreq": 0.07682776, + "hetGenotypeFreq": 0.3952912, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.72552663, + "refHomGenotypeFreq": 0.527881, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37320575, + "altHomGenotypeFreq": 0.14593302, + "hetGenotypeFreq": 0.45454547, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6267943, + "refHomGenotypeFreq": 0.39952153, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.205298, + "altHomGenotypeFreq": 0.026490066, + "hetGenotypeFreq": 0.3576159, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.794702, + "refHomGenotypeFreq": 0.615894, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2733257, + "altHomGenotypeFreq": 0.07441328, + "hetGenotypeFreq": 0.39782485, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7266743, + "refHomGenotypeFreq": 0.5277619, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28202727, + "altHomGenotypeFreq": 0.07555496, + "hetGenotypeFreq": 0.4132121, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.717839, + "refHomGenotypeFreq": 0.511233, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11106012, + "altHomGenotypeFreq": 0.01124369, + "hetGenotypeFreq": 0.20009178, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.88871044, + "refHomGenotypeFreq": 0.7886645, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22829525, + "altHomGenotypeFreq": 0.055536028, + "hetGenotypeFreq": 0.34669012, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.77111894, + "refHomGenotypeFreq": 0.59777385, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23969333, + "altHomGenotypeFreq": 0.063214235, + "hetGenotypeFreq": 0.3535368, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.76001734, + "refHomGenotypeFreq": 0.583249, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10394916, + "altHomGenotypeFreq": 0.012709941, + "hetGenotypeFreq": 0.18247844, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.8960508, + "refHomGenotypeFreq": 0.8048116, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21565913, + "altHomGenotypeFreq": 0.05937548, + "hetGenotypeFreq": 0.3125673, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.78434086, + "refHomGenotypeFreq": 0.62805724, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27291763, + "altHomGenotypeFreq": 0.083294556, + "hetGenotypeFreq": 0.37924618, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.7270824, + "refHomGenotypeFreq": 0.53745925, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29258516, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.70741487, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27235624, + "altHomGenotypeFreq": 0.08205954, + "hetGenotypeFreq": 0.38145992, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7272105, + "refHomGenotypeFreq": 0.53648055, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29672897, + "altHomGenotypeFreq": 0.10046729, + "hetGenotypeFreq": 0.39252338, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.70327103, + "refHomGenotypeFreq": 0.5070093, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17247494, + "altHomGenotypeFreq": 0.030069392, + "hetGenotypeFreq": 0.28558213, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.82713956, + "refHomGenotypeFreq": 0.6843485, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24970706, + "altHomGenotypeFreq": 0.06679166, + "hetGenotypeFreq": 0.37403327, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7461917, + "refHomGenotypeFreq": 0.5591751, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44103238, + "altHomGenotypeFreq": 0.20069993, + "hetGenotypeFreq": 0.4808399, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.55888015, + "refHomGenotypeFreq": 0.3184602, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2552257, + "altHomGenotypeFreq": 0.06816116, + "hetGenotypeFreq": 0.37412906, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7447743, + "refHomGenotypeFreq": 0.5577098, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29277837, + "altHomGenotypeFreq": 0.08574157, + "hetGenotypeFreq": 0.4141968, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.70716, + "refHomGenotypeFreq": 0.50006163, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10667591, + "altHomGenotypeFreq": 0.0112916, + "hetGenotypeFreq": 0.19175912, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8928288, + "refHomGenotypeFreq": 0.79694927, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.484375, + "altHomGenotypeFreq": 0.21875, + "hetGenotypeFreq": 0.53125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.515625, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19948083, + "altHomGenotypeFreq": 0.047923323, + "hetGenotypeFreq": 0.3051118, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7995208, + "refHomGenotypeFreq": 0.64696485, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14519428, + "altHomGenotypeFreq": 0.010224949, + "hetGenotypeFreq": 0.26993865, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.8548057, + "refHomGenotypeFreq": 0.7198364, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30851063, + "altHomGenotypeFreq": 0.095744684, + "hetGenotypeFreq": 0.42553192, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.69148934, + "refHomGenotypeFreq": 0.4787234, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15196079, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30392158, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.8480392, + "refHomGenotypeFreq": 0.6960784, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08850227, + "altHomGenotypeFreq": 0.006051437, + "hetGenotypeFreq": 0.16490167, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9114977, + "refHomGenotypeFreq": 0.8290469, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23809524, + "altHomGenotypeFreq": 0.04761905, + "hetGenotypeFreq": 0.3904762, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.75714284, + "refHomGenotypeFreq": 0.5619048, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17788461, + "altHomGenotypeFreq": 0.03846154, + "hetGenotypeFreq": 0.28846154, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.8173077, + "refHomGenotypeFreq": 0.6730769, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.023148147, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0462963, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.9768519, + "refHomGenotypeFreq": 0.9537037, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16145833, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.26041666, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.8385417, + "refHomGenotypeFreq": 0.7083333, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07522124, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15044248, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.92477876, + "refHomGenotypeFreq": 0.8495575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14215687, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.28431374, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.85784316, + "refHomGenotypeFreq": 0.71568626, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2912088, + "altHomGenotypeFreq": 0.054945055, + "hetGenotypeFreq": 0.4725275, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.7087912, + "refHomGenotypeFreq": 0.47252747, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12903225, + "altHomGenotypeFreq": 0.043010753, + "hetGenotypeFreq": 0.1827957, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.8655914, + "refHomGenotypeFreq": 0.7741935, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22727273, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.37373737, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.77272725, + "refHomGenotypeFreq": 0.5858586, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26635513, + "altHomGenotypeFreq": 0.093457945, + "hetGenotypeFreq": 0.34579438, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.73364484, + "refHomGenotypeFreq": 0.5607477, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13372093, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.26744187, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.86627907, + "refHomGenotypeFreq": 0.73255813, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.067708336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13541666, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.9322917, + "refHomGenotypeFreq": 0.8645833, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07575758, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.111111104, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.92424244, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.32323232, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27833003, + "altHomGenotypeFreq": 0.07554672, + "hetGenotypeFreq": 0.4055666, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.72167, + "refHomGenotypeFreq": 0.5188867, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13934426, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.8606557, + "refHomGenotypeFreq": 0.73770493, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3501441, + "altHomGenotypeFreq": 0.13256484, + "hetGenotypeFreq": 0.4351585, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6498559, + "refHomGenotypeFreq": 0.43227667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1882353, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.90588236, + "refHomGenotypeFreq": 0.8117647, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13592233, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.23300973, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.8640777, + "refHomGenotypeFreq": 0.74757284, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.3333333, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.5555556, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3084112, + "altHomGenotypeFreq": 0.07476635, + "hetGenotypeFreq": 0.46728975, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.69158876, + "refHomGenotypeFreq": 0.45794392, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28365386, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.41346154, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.71634614, + "refHomGenotypeFreq": 0.50961536, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24747474, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.41414142, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.75252527, + "refHomGenotypeFreq": 0.54545456, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3764706, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.4, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.62352943, + "refHomGenotypeFreq": 0.42352942, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21527778, + "altHomGenotypeFreq": 0.05357143, + "hetGenotypeFreq": 0.33333334, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7797619, + "refHomGenotypeFreq": 0.6130952, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2961165, + "altHomGenotypeFreq": 0.097087376, + "hetGenotypeFreq": 0.4174757, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.69417477, + "refHomGenotypeFreq": 0.4854369, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30149812, + "altHomGenotypeFreq": 0.09737828, + "hetGenotypeFreq": 0.4082397, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6985019, + "refHomGenotypeFreq": 0.49438202, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29793707, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.70206296, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29630667, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.70369333, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29968864, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.70031136, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2961165, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.7038835, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22928537, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22928537, + "id": "15:22928537:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22928537, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.559999942779541, + "source": "gerp" + }, + { + "score": 0.006000000052154064, + "source": "phastCons" + }, + { + "score": 0.5550000071525574, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 3.5399999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000561185(ENSG00000068793):c.387+64C>G", + "ENST00000313077(ENSG00000068793):c.387+64C>G", + "ENST00000561274(ENSG00000068793):c.387+64C>G", + "ENST00000560848(ENSG00000068793):c.387+64C>G", + "ENST00000559393(ENSG00000068793):n.459+64C>G" + ], + "id": "rs572498395", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.0014863642, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0029727283, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.99851364, + "refHomGenotypeFreq": 0.9970273, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0010204081, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0020408162, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.99897957, + "refHomGenotypeFreq": 0.9979592, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0011933175, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.002386635, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.99880666, + "refHomGenotypeFreq": 0.9976134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 2.8653294E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 5.730659E-4, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.9997135, + "refHomGenotypeFreq": 0.99942696, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0025346852, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0050693704, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.9974653, + "refHomGenotypeFreq": 0.9949306, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 5.731316E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0011462632, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.99942684, + "refHomGenotypeFreq": 0.99885374, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.001460963, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.002921926, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.99853903, + "refHomGenotypeFreq": 0.99707806, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0015177797, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0030355593, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.9984822, + "refHomGenotypeFreq": 0.99696445, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 5.990415E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.001198083, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.999401, + "refHomGenotypeFreq": 0.99880195, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0015128592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0030257185, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9984871, + "refHomGenotypeFreq": 0.9969743, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.004672897, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009345794, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.9953271, + "refHomGenotypeFreq": 0.99065423, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0052083335, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010416667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.9947917, + "refHomGenotypeFreq": 0.9895833, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 9.940357E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0019880715, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.999006, + "refHomGenotypeFreq": 0.99801195, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.008196721, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.016393442, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.9918033, + "refHomGenotypeFreq": 0.9836066, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0037453184, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.007490637, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9962547, + "refHomGenotypeFreq": 0.99250937, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0043639247, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.99563605, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0033575825, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.9966424, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.004929943, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.99507004, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0037756204, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.9962244, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22928574, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22928574, + "id": "15:22928574:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22928574, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -7.710000038146973, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -1.1679999828338623, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.06999969482421875, + "source": "cadd_raw" + }, + { + "score": 1.9800000190734863, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.569+10C>G", + "ENST00000560848(ENSG00000068793):c.569+10C>G" + ], + "id": "rs2305094", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.4696525, + "altHomGenotypeFreq": 0.22688884, + "hetGenotypeFreq": 0.48554373, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5303393, + "refHomGenotypeFreq": 0.28756744, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48511577, + "altHomGenotypeFreq": 0.23741272, + "hetGenotypeFreq": 0.4954061, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.51488423, + "refHomGenotypeFreq": 0.2671812, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35576025, + "altHomGenotypeFreq": 0.12418377, + "hetGenotypeFreq": 0.46315297, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6442397, + "refHomGenotypeFreq": 0.41266325, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5871741, + "altHomGenotypeFreq": 0.34546, + "hetGenotypeFreq": 0.48342824, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.41282588, + "refHomGenotypeFreq": 0.17111178, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4063969, + "altHomGenotypeFreq": 0.17044757, + "hetGenotypeFreq": 0.47189865, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.59360313, + "refHomGenotypeFreq": 0.3576538, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4908927, + "altHomGenotypeFreq": 0.23976555, + "hetGenotypeFreq": 0.5022543, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5091073, + "refHomGenotypeFreq": 0.25798017, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49213544, + "altHomGenotypeFreq": 0.24098662, + "hetGenotypeFreq": 0.50231576, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.5078555, + "refHomGenotypeFreq": 0.2566976, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48212174, + "altHomGenotypeFreq": 0.2355725, + "hetGenotypeFreq": 0.49322993, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.51781255, + "refHomGenotypeFreq": 0.2711976, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4601931, + "altHomGenotypeFreq": 0.218141, + "hetGenotypeFreq": 0.4841341, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.53979194, + "refHomGenotypeFreq": 0.2977249, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48111308, + "altHomGenotypeFreq": 0.2374873, + "hetGenotypeFreq": 0.48725155, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.5188869, + "refHomGenotypeFreq": 0.27526113, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47554806, + "altHomGenotypeFreq": 0.22376443, + "hetGenotypeFreq": 0.5035673, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5244519, + "refHomGenotypeFreq": 0.2726683, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48155737, + "altHomGenotypeFreq": 0.22131148, + "hetGenotypeFreq": 0.5204918, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.51844263, + "refHomGenotypeFreq": 0.2581967, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36476427, + "altHomGenotypeFreq": 0.1414392, + "hetGenotypeFreq": 0.44665012, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6352357, + "refHomGenotypeFreq": 0.41191068, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5608592, + "altHomGenotypeFreq": 0.3293556, + "hetGenotypeFreq": 0.46300715, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.4391408, + "refHomGenotypeFreq": 0.20763724, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41666666, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.5, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.5833333, + "refHomGenotypeFreq": 0.33333334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49198627, + "altHomGenotypeFreq": 0.24155696, + "hetGenotypeFreq": 0.5008586, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5080137, + "refHomGenotypeFreq": 0.25758442, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47018227, + "altHomGenotypeFreq": 0.21803805, + "hetGenotypeFreq": 0.5042884, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.52981776, + "refHomGenotypeFreq": 0.27767354, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49183157, + "altHomGenotypeFreq": 0.2337782, + "hetGenotypeFreq": 0.5161068, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.50816846, + "refHomGenotypeFreq": 0.25011504, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4724308, + "altHomGenotypeFreq": 0.22278273, + "hetGenotypeFreq": 0.4992961, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.52756923, + "refHomGenotypeFreq": 0.27792117, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4794024, + "altHomGenotypeFreq": 0.22497824, + "hetGenotypeFreq": 0.50884825, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.52059764, + "refHomGenotypeFreq": 0.26617348, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47503406, + "altHomGenotypeFreq": 0.23104857, + "hetGenotypeFreq": 0.48797095, + "population": "AA", + "refAllele": "C", + "refAlleleFreq": 0.52496594, + "refHomGenotypeFreq": 0.28098047, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4640935, + "altHomGenotypeFreq": 0.23158543, + "hetGenotypeFreq": 0.46501616, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5359065, + "refHomGenotypeFreq": 0.30339843, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45848837, + "altHomGenotypeFreq": 0.23186046, + "hetGenotypeFreq": 0.4532558, + "population": "EA", + "refAllele": "C", + "refAlleleFreq": 0.54151165, + "refHomGenotypeFreq": 0.3148837, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49298596, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.50701404, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46522567, + "altHomGenotypeFreq": 0.22143835, + "hetGenotypeFreq": 0.487608, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5347577, + "refHomGenotypeFreq": 0.29095367, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4722838, + "altHomGenotypeFreq": 0.22616407, + "hetGenotypeFreq": 0.49223948, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.52771616, + "refHomGenotypeFreq": 0.28159645, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31996566, + "altHomGenotypeFreq": 0.10522443, + "hetGenotypeFreq": 0.42948246, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.68003434, + "refHomGenotypeFreq": 0.4652931, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3489352, + "altHomGenotypeFreq": 0.12239644, + "hetGenotypeFreq": 0.45307747, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6510648, + "refHomGenotypeFreq": 0.4245261, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.58592516, + "altHomGenotypeFreq": 0.34299773, + "hetGenotypeFreq": 0.48585486, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.41407487, + "refHomGenotypeFreq": 0.17114742, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4900642, + "altHomGenotypeFreq": 0.2405992, + "hetGenotypeFreq": 0.49892998, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5099358, + "refHomGenotypeFreq": 0.2604708, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4904733, + "altHomGenotypeFreq": 0.2385012, + "hetGenotypeFreq": 0.5039745, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.50951153, + "refHomGenotypeFreq": 0.25752428, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48032182, + "altHomGenotypeFreq": 0.23148508, + "hetGenotypeFreq": 0.49786738, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.51958126, + "refHomGenotypeFreq": 0.27064753, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6875, + "altHomGenotypeFreq": 0.46875, + "hetGenotypeFreq": 0.4375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.3125, + "refHomGenotypeFreq": 0.09375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42511982, + "altHomGenotypeFreq": 0.19369009, + "hetGenotypeFreq": 0.46285942, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5748802, + "refHomGenotypeFreq": 0.3434505, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29243353, + "altHomGenotypeFreq": 0.08384458, + "hetGenotypeFreq": 0.41717792, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.70756644, + "refHomGenotypeFreq": 0.4989775, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5212766, + "altHomGenotypeFreq": 0.24468085, + "hetGenotypeFreq": 0.5531915, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.4787234, + "refHomGenotypeFreq": 0.20212767, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27450982, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.4117647, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.7254902, + "refHomGenotypeFreq": 0.51960784, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48184568, + "altHomGenotypeFreq": 0.23600605, + "hetGenotypeFreq": 0.49167928, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5181543, + "refHomGenotypeFreq": 0.27231467, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35714287, + "altHomGenotypeFreq": 0.123809524, + "hetGenotypeFreq": 0.46666667, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.64285713, + "refHomGenotypeFreq": 0.40952381, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31730768, + "altHomGenotypeFreq": 0.086538464, + "hetGenotypeFreq": 0.46153846, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.6826923, + "refHomGenotypeFreq": 0.45192307, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4861111, + "altHomGenotypeFreq": 0.23148148, + "hetGenotypeFreq": 0.5092593, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.5138889, + "refHomGenotypeFreq": 0.25925925, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.359375, + "altHomGenotypeFreq": 0.14583333, + "hetGenotypeFreq": 0.4270833, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.640625, + "refHomGenotypeFreq": 0.42708334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43362832, + "altHomGenotypeFreq": 0.17699115, + "hetGenotypeFreq": 0.5132743, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.5663717, + "refHomGenotypeFreq": 0.30973452, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24509804, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.4117647, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.75490195, + "refHomGenotypeFreq": 0.54901963, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.53846157, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.23076923, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2311828, + "altHomGenotypeFreq": 0.09677419, + "hetGenotypeFreq": 0.2688172, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.7688172, + "refHomGenotypeFreq": 0.6344086, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26262626, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.3838384, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.7373737, + "refHomGenotypeFreq": 0.54545456, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45794392, + "altHomGenotypeFreq": 0.22429906, + "hetGenotypeFreq": 0.46728972, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.5420561, + "refHomGenotypeFreq": 0.3084112, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29069766, + "altHomGenotypeFreq": 0.069767445, + "hetGenotypeFreq": 0.44186047, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.7093023, + "refHomGenotypeFreq": 0.4883721, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39583334, + "altHomGenotypeFreq": 0.19791667, + "hetGenotypeFreq": 0.3958333, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.6041667, + "refHomGenotypeFreq": 0.40625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.52020204, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.53535354, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.479798, + "refHomGenotypeFreq": 0.21212122, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5151515, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.5252525, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.4848485, + "refHomGenotypeFreq": 0.22222222, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48707753, + "altHomGenotypeFreq": 0.2306163, + "hetGenotypeFreq": 0.51292247, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.51292247, + "refHomGenotypeFreq": 0.25646123, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5327869, + "altHomGenotypeFreq": 0.26229507, + "hetGenotypeFreq": 0.54098356, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.46721312, + "refHomGenotypeFreq": 0.19672132, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57348704, + "altHomGenotypeFreq": 0.32564843, + "hetGenotypeFreq": 0.49567723, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.42651296, + "refHomGenotypeFreq": 0.17867436, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5176471, + "altHomGenotypeFreq": 0.30588236, + "hetGenotypeFreq": 0.42352942, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.48235294, + "refHomGenotypeFreq": 0.27058825, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2961165, + "altHomGenotypeFreq": 0.097087376, + "hetGenotypeFreq": 0.39805824, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.70388347, + "refHomGenotypeFreq": 0.5048544, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.479798, + "altHomGenotypeFreq": 0.2020202, + "hetGenotypeFreq": 0.5555556, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.52020204, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5046729, + "altHomGenotypeFreq": 0.27102804, + "hetGenotypeFreq": 0.46728975, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.49532712, + "refHomGenotypeFreq": 0.26168224, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5673077, + "altHomGenotypeFreq": 0.29807693, + "hetGenotypeFreq": 0.53846157, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.43269232, + "refHomGenotypeFreq": 0.16346154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4949495, + "altHomGenotypeFreq": 0.22222222, + "hetGenotypeFreq": 0.5454545, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.5050505, + "refHomGenotypeFreq": 0.23232323, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5529412, + "altHomGenotypeFreq": 0.34117648, + "hetGenotypeFreq": 0.42352942, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.44705883, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31547618, + "altHomGenotypeFreq": 0.11706349, + "hetGenotypeFreq": 0.39682537, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6845238, + "refHomGenotypeFreq": 0.4861111, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39805827, + "altHomGenotypeFreq": 0.2038835, + "hetGenotypeFreq": 0.38834953, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.60194176, + "refHomGenotypeFreq": 0.407767, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47940075, + "altHomGenotypeFreq": 0.23970038, + "hetGenotypeFreq": 0.47940075, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.52059925, + "refHomGenotypeFreq": 0.28089887, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.484709, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.515291, + "study": "DISCOVEHR" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49788415, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.50211585, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5033576, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.4966424, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49247536, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.5075246, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50350595, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.49649405, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22929905, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22929905, + "id": "15:22929905:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22929905, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558430", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -7.28000020980835, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -1.1629999876022339, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.35000038146972656, + "source": "cadd_raw" + }, + { + "score": 6.170000076293945, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.569+11A>G", + "ENST00000560848(ENSG00000068793):c.569+11A>G" + ], + "id": "rs2305093", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.78388697, + "altHomGenotypeFreq": 0.62020886, + "hetGenotypeFreq": 0.32735613, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.21611305, + "refHomGenotypeFreq": 0.052434977, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.78542584, + "altHomGenotypeFreq": 0.6182085, + "hetGenotypeFreq": 0.33443466, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.21457416, + "refHomGenotypeFreq": 0.04735683, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.87716746, + "altHomGenotypeFreq": 0.76969624, + "hetGenotypeFreq": 0.2149424, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.12283254, + "refHomGenotypeFreq": 0.015361341, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.87415534, + "altHomGenotypeFreq": 0.7662501, + "hetGenotypeFreq": 0.21581057, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.12584464, + "refHomGenotypeFreq": 0.017939365, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7492336, + "altHomGenotypeFreq": 0.5642755, + "hetGenotypeFreq": 0.3699162, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.2507664, + "refHomGenotypeFreq": 0.065808296, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7322185, + "altHomGenotypeFreq": 0.53934914, + "hetGenotypeFreq": 0.38573876, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.2677815, + "refHomGenotypeFreq": 0.07491211, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7420746, + "altHomGenotypeFreq": 0.5508933, + "hetGenotypeFreq": 0.38236254, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.25792542, + "refHomGenotypeFreq": 0.066744134, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.92690593, + "altHomGenotypeFreq": 0.85957557, + "hetGenotypeFreq": 0.13466074, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.073094055, + "refHomGenotypeFreq": 0.0057636886, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.77756006, + "altHomGenotypeFreq": 0.6103599, + "hetGenotypeFreq": 0.33440033, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.22243994, + "refHomGenotypeFreq": 0.055239778, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7915467, + "altHomGenotypeFreq": 0.6321327, + "hetGenotypeFreq": 0.318828, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.20845331, + "refHomGenotypeFreq": 0.049039315, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7942968, + "altHomGenotypeFreq": 0.6383668, + "hetGenotypeFreq": 0.31186002, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.20570317, + "refHomGenotypeFreq": 0.049773168, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7556237, + "altHomGenotypeFreq": 0.5521472, + "hetGenotypeFreq": 0.40695298, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.24437627, + "refHomGenotypeFreq": 0.040899795, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8754647, + "altHomGenotypeFreq": 0.7583643, + "hetGenotypeFreq": 0.23420075, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.124535315, + "refHomGenotypeFreq": 0.007434944, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8448687, + "altHomGenotypeFreq": 0.725537, + "hetGenotypeFreq": 0.23866348, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.15513127, + "refHomGenotypeFreq": 0.035799522, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.77516776, + "altHomGenotypeFreq": 0.6107383, + "hetGenotypeFreq": 0.32885906, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.22483222, + "refHomGenotypeFreq": 0.060402684, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7246709, + "altHomGenotypeFreq": 0.52604467, + "hetGenotypeFreq": 0.39725244, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.27532914, + "refHomGenotypeFreq": 0.07670292, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.72944015, + "altHomGenotypeFreq": 0.5334851, + "hetGenotypeFreq": 0.39191, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.27055988, + "refHomGenotypeFreq": 0.07460488, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.91856194, + "altHomGenotypeFreq": 0.84332645, + "hetGenotypeFreq": 0.15047094, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.08143809, + "refHomGenotypeFreq": 0.006202619, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.79814684, + "altHomGenotypeFreq": 0.64062864, + "hetGenotypeFreq": 0.31503636, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.20185316, + "refHomGenotypeFreq": 0.044334974, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7895423, + "altHomGenotypeFreq": 0.63557357, + "hetGenotypeFreq": 0.3079374, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.21045771, + "refHomGenotypeFreq": 0.05648899, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.91806626, + "altHomGenotypeFreq": 0.8452111, + "hetGenotypeFreq": 0.1457104, + "population": "AA", + "refAllele": "A", + "refAlleleFreq": 0.08193373, + "refHomGenotypeFreq": 0.00907853, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7962479, + "altHomGenotypeFreq": 0.6510841, + "hetGenotypeFreq": 0.29032755, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.20375212, + "refHomGenotypeFreq": 0.058588345, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7338372, + "altHomGenotypeFreq": 0.55162793, + "hetGenotypeFreq": 0.3644186, + "population": "EA", + "refAllele": "A", + "refAlleleFreq": 0.26616278, + "refHomGenotypeFreq": 0.083953485, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.753507, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.24649298, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7832481, + "altHomGenotypeFreq": 0.6178778, + "hetGenotypeFreq": 0.33074066, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.21675189, + "refHomGenotypeFreq": 0.051381554, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7903587, + "altHomGenotypeFreq": 0.6255605, + "hetGenotypeFreq": 0.3295964, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.20964126, + "refHomGenotypeFreq": 0.044843048, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7641509, + "altHomGenotypeFreq": 0.58625335, + "hetGenotypeFreq": 0.35579515, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.23584905, + "refHomGenotypeFreq": 0.057951484, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.87342805, + "altHomGenotypeFreq": 0.76199347, + "hetGenotypeFreq": 0.22286911, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.12657197, + "refHomGenotypeFreq": 0.015137401, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.88388956, + "altHomGenotypeFreq": 0.78507775, + "hetGenotypeFreq": 0.19762363, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.11611043, + "refHomGenotypeFreq": 0.01729862, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.723138, + "altHomGenotypeFreq": 0.52716726, + "hetGenotypeFreq": 0.3919414, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.27686203, + "refHomGenotypeFreq": 0.08089133, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7431506, + "altHomGenotypeFreq": 0.5507449, + "hetGenotypeFreq": 0.38481143, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.2568494, + "refHomGenotypeFreq": 0.0644437, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.91989964, + "altHomGenotypeFreq": 0.84732676, + "hetGenotypeFreq": 0.14514573, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.080100365, + "refHomGenotypeFreq": 0.007527504, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.90625, + "altHomGenotypeFreq": 0.8125, + "hetGenotypeFreq": 0.1875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.09375, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.85023963, + "altHomGenotypeFreq": 0.7320288, + "hetGenotypeFreq": 0.23642172, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.14976038, + "refHomGenotypeFreq": 0.03154952, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7811861, + "altHomGenotypeFreq": 0.605317, + "hetGenotypeFreq": 0.3517382, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.21881391, + "refHomGenotypeFreq": 0.042944785, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.85106385, + "altHomGenotypeFreq": 0.7234042, + "hetGenotypeFreq": 0.25531915, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.14893617, + "refHomGenotypeFreq": 0.021276595, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7352941, + "altHomGenotypeFreq": 0.5, + "hetGenotypeFreq": 0.47058827, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.2647059, + "refHomGenotypeFreq": 0.029411765, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.95234495, + "altHomGenotypeFreq": 0.90620273, + "hetGenotypeFreq": 0.09228442, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.04765507, + "refHomGenotypeFreq": 0.0015128592, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.88095236, + "altHomGenotypeFreq": 0.7904762, + "hetGenotypeFreq": 0.18095239, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.11904762, + "refHomGenotypeFreq": 0.028571429, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.84615386, + "altHomGenotypeFreq": 0.7307692, + "hetGenotypeFreq": 0.23076923, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.15384616, + "refHomGenotypeFreq": 0.03846154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9675926, + "altHomGenotypeFreq": 0.9351852, + "hetGenotypeFreq": 0.06481481, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.032407407, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8125, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.29166666, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.1875, + "refHomGenotypeFreq": 0.041666668, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9557522, + "altHomGenotypeFreq": 0.920354, + "hetGenotypeFreq": 0.07079646, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.044247787, + "refHomGenotypeFreq": 0.0088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7892157, + "altHomGenotypeFreq": 0.65686274, + "hetGenotypeFreq": 0.2647059, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.21078432, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7417582, + "altHomGenotypeFreq": 0.51648355, + "hetGenotypeFreq": 0.45054945, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.25824177, + "refHomGenotypeFreq": 0.032967035, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.88709676, + "altHomGenotypeFreq": 0.8064516, + "hetGenotypeFreq": 0.16129032, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.11290322, + "refHomGenotypeFreq": 0.032258064, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9040404, + "altHomGenotypeFreq": 0.8080808, + "hetGenotypeFreq": 0.1919192, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.0959596, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7616823, + "altHomGenotypeFreq": 0.58878505, + "hetGenotypeFreq": 0.34579438, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.23831776, + "refHomGenotypeFreq": 0.06542056, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.81395346, + "altHomGenotypeFreq": 0.6511628, + "hetGenotypeFreq": 0.3255814, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.18604651, + "refHomGenotypeFreq": 0.023255814, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9270833, + "altHomGenotypeFreq": 0.8541667, + "hetGenotypeFreq": 0.14583333, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.072916664, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.93939394, + "altHomGenotypeFreq": 0.8787879, + "hetGenotypeFreq": 0.121212125, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.060606062, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7425447, + "altHomGenotypeFreq": 0.55666006, + "hetGenotypeFreq": 0.37176937, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.25745526, + "refHomGenotypeFreq": 0.071570575, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9590164, + "altHomGenotypeFreq": 0.91803277, + "hetGenotypeFreq": 0.08196721, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.040983606, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.87463975, + "altHomGenotypeFreq": 0.76945245, + "hetGenotypeFreq": 0.21037464, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.12536024, + "refHomGenotypeFreq": 0.02017291, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9764706, + "altHomGenotypeFreq": 0.9529412, + "hetGenotypeFreq": 0.047058824, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.023529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7621359, + "altHomGenotypeFreq": 0.5631068, + "hetGenotypeFreq": 0.39805824, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.23786408, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7070707, + "altHomGenotypeFreq": 0.5050505, + "hetGenotypeFreq": 0.4040404, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.2929293, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7616823, + "altHomGenotypeFreq": 0.5794392, + "hetGenotypeFreq": 0.36448598, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.23831776, + "refHomGenotypeFreq": 0.056074765, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8605769, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.22115386, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.13942307, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7373737, + "altHomGenotypeFreq": 0.5858586, + "hetGenotypeFreq": 0.3030303, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.26262626, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.89411765, + "altHomGenotypeFreq": 0.8117647, + "hetGenotypeFreq": 0.16470589, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.105882354, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.87400794, + "altHomGenotypeFreq": 0.7757937, + "hetGenotypeFreq": 0.19642857, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.12599206, + "refHomGenotypeFreq": 0.027777778, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8543689, + "altHomGenotypeFreq": 0.74757284, + "hetGenotypeFreq": 0.21359223, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.14563107, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7565543, + "altHomGenotypeFreq": 0.5805243, + "hetGenotypeFreq": 0.35205993, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.2434457, + "refHomGenotypeFreq": 0.06741573, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.749042, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.25095803, + "study": "DISCOVEHR" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74398303, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.25601694, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74622273, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.25377727, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74026984, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.25973016, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7478425, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.2521575, + "study": "UK10K" + } + ], + "reference": "A", + "start": 22929906, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22929906, + "id": "15:22929906:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22929906, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.3200000524520874, + "source": "gerp" + }, + { + "score": 0.012000000104308128, + "source": "phastCons" + }, + { + "score": 0.6499999761581421, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.2200002670288086, + "source": "cadd_raw" + }, + { + "score": 4.980000019073486, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.570-33G>A", + "ENST00000560848(ENSG00000068793):c.570-33G>A" + ], + "id": "rs2084063", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.21406285, + "altHomGenotypeFreq": 0.070202805, + "hetGenotypeFreq": 0.28773183, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7859313, + "refHomGenotypeFreq": 0.6420654, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23228143, + "altHomGenotypeFreq": 0.06828763, + "hetGenotypeFreq": 0.32798758, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.76771855, + "refHomGenotypeFreq": 0.6037248, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2399684, + "altHomGenotypeFreq": 0.07409163, + "hetGenotypeFreq": 0.33175355, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7600316, + "refHomGenotypeFreq": 0.59415483, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3629064, + "altHomGenotypeFreq": 0.15339902, + "hetGenotypeFreq": 0.41901478, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6370936, + "refHomGenotypeFreq": 0.4275862, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1628692, + "altHomGenotypeFreq": 0.041631505, + "hetGenotypeFreq": 0.24247539, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8371308, + "refHomGenotypeFreq": 0.7158931, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22615851, + "altHomGenotypeFreq": 0.066067465, + "hetGenotypeFreq": 0.32018209, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7738415, + "refHomGenotypeFreq": 0.61375046, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2224912, + "altHomGenotypeFreq": 0.074318066, + "hetGenotypeFreq": 0.29634628, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7775088, + "refHomGenotypeFreq": 0.62933564, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07432212, + "altHomGenotypeFreq": 0.008820646, + "hetGenotypeFreq": 0.13116628, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.92559624, + "refHomGenotypeFreq": 0.86001307, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20370011, + "altHomGenotypeFreq": 0.06660194, + "hetGenotypeFreq": 0.2742179, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7962891, + "refHomGenotypeFreq": 0.65918016, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22640927, + "altHomGenotypeFreq": 0.07449297, + "hetGenotypeFreq": 0.30383262, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.77359074, + "refHomGenotypeFreq": 0.6216744, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24534759, + "altHomGenotypeFreq": 0.059827745, + "hetGenotypeFreq": 0.3710397, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.75465244, + "refHomGenotypeFreq": 0.56913257, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28076923, + "altHomGenotypeFreq": 0.07948718, + "hetGenotypeFreq": 0.4025641, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7192308, + "refHomGenotypeFreq": 0.51794875, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31707317, + "altHomGenotypeFreq": 0.10298103, + "hetGenotypeFreq": 0.42818427, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.68292683, + "refHomGenotypeFreq": 0.4688347, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36438355, + "altHomGenotypeFreq": 0.13424657, + "hetGenotypeFreq": 0.46027398, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6356164, + "refHomGenotypeFreq": 0.40547946, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20220588, + "altHomGenotypeFreq": 0.022058824, + "hetGenotypeFreq": 0.3602941, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7977941, + "refHomGenotypeFreq": 0.61764705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30787978, + "altHomGenotypeFreq": 0.08367181, + "hetGenotypeFreq": 0.44841594, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.69212025, + "refHomGenotypeFreq": 0.46791226, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29088804, + "altHomGenotypeFreq": 0.07320464, + "hetGenotypeFreq": 0.4353668, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.709112, + "refHomGenotypeFreq": 0.49142858, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11556283, + "altHomGenotypeFreq": 0.011447261, + "hetGenotypeFreq": 0.20823112, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8844372, + "refHomGenotypeFreq": 0.7803216, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24243467, + "altHomGenotypeFreq": 0.05763411, + "hetGenotypeFreq": 0.3696011, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7575653, + "refHomGenotypeFreq": 0.5727648, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24904081, + "altHomGenotypeFreq": 0.062609, + "hetGenotypeFreq": 0.37286362, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7509592, + "refHomGenotypeFreq": 0.5645274, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.110077165, + "altHomGenotypeFreq": 0.012709941, + "hetGenotypeFreq": 0.19473445, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.88992286, + "refHomGenotypeFreq": 0.79255563, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22282024, + "altHomGenotypeFreq": 0.05997232, + "hetGenotypeFreq": 0.32569584, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7771798, + "refHomGenotypeFreq": 0.61433184, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28058138, + "altHomGenotypeFreq": 0.08418605, + "hetGenotypeFreq": 0.3927907, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.7194186, + "refHomGenotypeFreq": 0.52302325, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29058117, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.70941883, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30705568, + "altHomGenotypeFreq": 0.08158305, + "hetGenotypeFreq": 0.45097086, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.69293153, + "refHomGenotypeFreq": 0.4674461, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31543624, + "altHomGenotypeFreq": 0.08389262, + "hetGenotypeFreq": 0.46308726, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.68456376, + "refHomGenotypeFreq": 0.45302013, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1826742, + "altHomGenotypeFreq": 0.03081664, + "hetGenotypeFreq": 0.3037151, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.8173258, + "refHomGenotypeFreq": 0.6654682, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33614036, + "altHomGenotypeFreq": 0.09263158, + "hetGenotypeFreq": 0.48701754, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.66385967, + "refHomGenotypeFreq": 0.42035088, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4989657, + "altHomGenotypeFreq": 0.20508274, + "hetGenotypeFreq": 0.58776593, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.50103426, + "refHomGenotypeFreq": 0.2071513, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27880076, + "altHomGenotypeFreq": 0.06751653, + "hetGenotypeFreq": 0.42256847, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7211993, + "refHomGenotypeFreq": 0.509915, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33500725, + "altHomGenotypeFreq": 0.08618676, + "hetGenotypeFreq": 0.49764097, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.66499275, + "refHomGenotypeFreq": 0.41617227, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13569415, + "altHomGenotypeFreq": 0.011908493, + "hetGenotypeFreq": 0.24788468, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.86414915, + "refHomGenotypeFreq": 0.74020684, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4765625, + "altHomGenotypeFreq": 0.203125, + "hetGenotypeFreq": 0.546875, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.5234375, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21226038, + "altHomGenotypeFreq": 0.052316293, + "hetGenotypeFreq": 0.31988817, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.78773963, + "refHomGenotypeFreq": 0.6277955, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14928426, + "altHomGenotypeFreq": 0.010224949, + "hetGenotypeFreq": 0.2781186, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.85071576, + "refHomGenotypeFreq": 0.71165645, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30319148, + "altHomGenotypeFreq": 0.095744684, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.6968085, + "refHomGenotypeFreq": 0.4893617, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15196079, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30392158, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.8480392, + "refHomGenotypeFreq": 0.6960784, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09001513, + "altHomGenotypeFreq": 0.006051437, + "hetGenotypeFreq": 0.16792738, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9099849, + "refHomGenotypeFreq": 0.8260212, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2809524, + "altHomGenotypeFreq": 0.07619048, + "hetGenotypeFreq": 0.40952381, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.7190476, + "refHomGenotypeFreq": 0.51428574, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19711539, + "altHomGenotypeFreq": 0.03846154, + "hetGenotypeFreq": 0.3173077, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.80288464, + "refHomGenotypeFreq": 0.6442308, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.027777778, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.055555556, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.9722222, + "refHomGenotypeFreq": 0.9444444, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.2708333, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.6979167, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07964602, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15929204, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.920354, + "refHomGenotypeFreq": 0.84070796, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14215687, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.28431374, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.85784316, + "refHomGenotypeFreq": 0.71568626, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2857143, + "altHomGenotypeFreq": 0.043956045, + "hetGenotypeFreq": 0.4835165, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.71428573, + "refHomGenotypeFreq": 0.47252747, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21505377, + "altHomGenotypeFreq": 0.07526882, + "hetGenotypeFreq": 0.2795699, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.78494626, + "refHomGenotypeFreq": 0.6451613, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.53535354, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.35353535, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26635513, + "altHomGenotypeFreq": 0.093457945, + "hetGenotypeFreq": 0.34579438, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.73364484, + "refHomGenotypeFreq": 0.5607477, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13953489, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.27906975, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.8604651, + "refHomGenotypeFreq": 0.7209302, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.067708336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13541666, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.9322917, + "refHomGenotypeFreq": 0.8645833, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07575758, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.111111104, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.92424244, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.32323232, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27833003, + "altHomGenotypeFreq": 0.07355865, + "hetGenotypeFreq": 0.40954274, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.72167, + "refHomGenotypeFreq": 0.51689863, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13934426, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.8606557, + "refHomGenotypeFreq": 0.73770493, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34726223, + "altHomGenotypeFreq": 0.129683, + "hetGenotypeFreq": 0.4351585, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.65273774, + "refHomGenotypeFreq": 0.4351585, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1882353, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.90588236, + "refHomGenotypeFreq": 0.8117647, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14563107, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.2524272, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.8543689, + "refHomGenotypeFreq": 0.7281553, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.3333333, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.5555556, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3084112, + "altHomGenotypeFreq": 0.07476635, + "hetGenotypeFreq": 0.46728975, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.69158876, + "refHomGenotypeFreq": 0.45794392, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28365386, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.41346154, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.71634614, + "refHomGenotypeFreq": 0.50961536, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25252524, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.42424244, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.74747473, + "refHomGenotypeFreq": 0.53535354, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3764706, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.4, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.62352943, + "refHomGenotypeFreq": 0.42352942, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27480158, + "altHomGenotypeFreq": 0.07936508, + "hetGenotypeFreq": 0.39087301, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7251984, + "refHomGenotypeFreq": 0.5297619, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30097088, + "altHomGenotypeFreq": 0.097087376, + "hetGenotypeFreq": 0.407767, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.69902915, + "refHomGenotypeFreq": 0.49514562, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30149812, + "altHomGenotypeFreq": 0.09737828, + "hetGenotypeFreq": 0.4082397, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6985019, + "refHomGenotypeFreq": 0.49438202, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29727584, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.70272416, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29574707, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.70425296, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29891023, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.70108974, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29557714, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.70442283, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22933528, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22933528, + "id": "15:22933528:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22933528, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561185", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561274", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000559393", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.6549999713897705, + "source": "gerp" + }, + { + "score": 0.012000000104308128, + "source": "phastCons" + }, + { + "score": 0.48399999737739563, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 5.769999980926514, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.666+34G>A", + "ENST00000560848(ENSG00000068793):c.666+34G>A" + ], + "id": "rs1109036", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.27878553, + "altHomGenotypeFreq": 0.08580016, + "hetGenotypeFreq": 0.38597888, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7212104, + "refHomGenotypeFreq": 0.52822095, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28993437, + "altHomGenotypeFreq": 0.08315098, + "hetGenotypeFreq": 0.41356674, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.71006566, + "refHomGenotypeFreq": 0.50328225, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30209905, + "altHomGenotypeFreq": 0.092891105, + "hetGenotypeFreq": 0.41841587, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.69790095, + "refHomGenotypeFreq": 0.48869303, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4221375, + "altHomGenotypeFreq": 0.18211605, + "hetGenotypeFreq": 0.4800429, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5778625, + "refHomGenotypeFreq": 0.33784106, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21948, + "altHomGenotypeFreq": 0.048344504, + "hetGenotypeFreq": 0.34227097, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.78052, + "refHomGenotypeFreq": 0.60938454, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27027634, + "altHomGenotypeFreq": 0.07365871, + "hetGenotypeFreq": 0.39323524, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7297237, + "refHomGenotypeFreq": 0.533106, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2947887, + "altHomGenotypeFreq": 0.08767908, + "hetGenotypeFreq": 0.4142192, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.70521134, + "refHomGenotypeFreq": 0.4981017, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10549019, + "altHomGenotypeFreq": 0.010588235, + "hetGenotypeFreq": 0.18980393, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8945098, + "refHomGenotypeFreq": 0.7996078, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2707388, + "altHomGenotypeFreq": 0.08092357, + "hetGenotypeFreq": 0.37963045, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7292612, + "refHomGenotypeFreq": 0.539446, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2885334, + "altHomGenotypeFreq": 0.091707684, + "hetGenotypeFreq": 0.3936694, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7114576, + "refHomGenotypeFreq": 0.5146229, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23640916, + "altHomGenotypeFreq": 0.060085837, + "hetGenotypeFreq": 0.35264665, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7635909, + "refHomGenotypeFreq": 0.5872675, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26694044, + "altHomGenotypeFreq": 0.08008213, + "hetGenotypeFreq": 0.37371662, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7330595, + "refHomGenotypeFreq": 0.5462012, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32793018, + "altHomGenotypeFreq": 0.10598504, + "hetGenotypeFreq": 0.44389027, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.67206985, + "refHomGenotypeFreq": 0.45012468, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36842105, + "altHomGenotypeFreq": 0.14593302, + "hetGenotypeFreq": 0.4449761, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6315789, + "refHomGenotypeFreq": 0.4090909, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.205298, + "altHomGenotypeFreq": 0.026490066, + "hetGenotypeFreq": 0.3576159, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.794702, + "refHomGenotypeFreq": 0.615894, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27330264, + "altHomGenotypeFreq": 0.07479862, + "hetGenotypeFreq": 0.39700806, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7266973, + "refHomGenotypeFreq": 0.52819335, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2813466, + "altHomGenotypeFreq": 0.074183576, + "hetGenotypeFreq": 0.41432604, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7186534, + "refHomGenotypeFreq": 0.5114904, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.112646855, + "altHomGenotypeFreq": 0.012209169, + "hetGenotypeFreq": 0.20087537, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8873531, + "refHomGenotypeFreq": 0.7869155, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23213026, + "altHomGenotypeFreq": 0.057018574, + "hetGenotypeFreq": 0.35022336, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7678697, + "refHomGenotypeFreq": 0.59275806, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24170548, + "altHomGenotypeFreq": 0.06388242, + "hetGenotypeFreq": 0.3556461, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7582945, + "refHomGenotypeFreq": 0.58047146, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11030413, + "altHomGenotypeFreq": 0.012709941, + "hetGenotypeFreq": 0.19518837, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.8896959, + "refHomGenotypeFreq": 0.7921017, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22274335, + "altHomGenotypeFreq": 0.059510995, + "hetGenotypeFreq": 0.3264647, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.77725667, + "refHomGenotypeFreq": 0.6140243, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28034884, + "altHomGenotypeFreq": 0.083488375, + "hetGenotypeFreq": 0.39372092, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.71965116, + "refHomGenotypeFreq": 0.5227907, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28857717, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7114228, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26788127, + "altHomGenotypeFreq": 0.081133194, + "hetGenotypeFreq": 0.37351266, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7321105, + "refHomGenotypeFreq": 0.5453542, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29359823, + "altHomGenotypeFreq": 0.10154525, + "hetGenotypeFreq": 0.38410595, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.70640177, + "refHomGenotypeFreq": 0.5143488, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15715843, + "altHomGenotypeFreq": 0.028343024, + "hetGenotypeFreq": 0.25775194, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.842781, + "refHomGenotypeFreq": 0.71390504, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29550198, + "altHomGenotypeFreq": 0.0920473, + "hetGenotypeFreq": 0.40690935, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.70449805, + "refHomGenotypeFreq": 0.5010434, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43613896, + "altHomGenotypeFreq": 0.1975458, + "hetGenotypeFreq": 0.47718632, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5638611, + "refHomGenotypeFreq": 0.32526788, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25461143, + "altHomGenotypeFreq": 0.068037495, + "hetGenotypeFreq": 0.37314788, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.74538857, + "refHomGenotypeFreq": 0.55881464, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28849325, + "altHomGenotypeFreq": 0.08458472, + "hetGenotypeFreq": 0.40781704, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7115068, + "refHomGenotypeFreq": 0.5075982, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1075, + "altHomGenotypeFreq": 0.01076923, + "hetGenotypeFreq": 0.19346154, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8925, + "refHomGenotypeFreq": 0.7957692, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4765625, + "altHomGenotypeFreq": 0.203125, + "hetGenotypeFreq": 0.546875, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.5234375, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2120607, + "altHomGenotypeFreq": 0.052316293, + "hetGenotypeFreq": 0.31948882, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7879393, + "refHomGenotypeFreq": 0.62819487, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14928426, + "altHomGenotypeFreq": 0.010224949, + "hetGenotypeFreq": 0.2781186, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.85071576, + "refHomGenotypeFreq": 0.71165645, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30319148, + "altHomGenotypeFreq": 0.095744684, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.6968085, + "refHomGenotypeFreq": 0.4893617, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15196079, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30392158, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.8480392, + "refHomGenotypeFreq": 0.6960784, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0892587, + "altHomGenotypeFreq": 0.006051437, + "hetGenotypeFreq": 0.16641453, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9107413, + "refHomGenotypeFreq": 0.827534, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2809524, + "altHomGenotypeFreq": 0.07619048, + "hetGenotypeFreq": 0.40952381, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.7190476, + "refHomGenotypeFreq": 0.51428574, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19711539, + "altHomGenotypeFreq": 0.03846154, + "hetGenotypeFreq": 0.3173077, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.80288464, + "refHomGenotypeFreq": 0.6442308, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.027777778, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.055555556, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.9722222, + "refHomGenotypeFreq": 0.9444444, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.2708333, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.6979167, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07964602, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15929204, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.920354, + "refHomGenotypeFreq": 0.84070796, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14215687, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.28431374, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.85784316, + "refHomGenotypeFreq": 0.71568626, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2857143, + "altHomGenotypeFreq": 0.043956045, + "hetGenotypeFreq": 0.4835165, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.71428573, + "refHomGenotypeFreq": 0.47252747, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21505377, + "altHomGenotypeFreq": 0.07526882, + "hetGenotypeFreq": 0.2795699, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.78494626, + "refHomGenotypeFreq": 0.6451613, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.53535354, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.35353535, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26635513, + "altHomGenotypeFreq": 0.093457945, + "hetGenotypeFreq": 0.34579438, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.73364484, + "refHomGenotypeFreq": 0.5607477, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13953489, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.27906975, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.8604651, + "refHomGenotypeFreq": 0.7209302, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.125, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.9375, + "refHomGenotypeFreq": 0.875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07575758, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.111111104, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.92424244, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.32323232, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27833003, + "altHomGenotypeFreq": 0.07355865, + "hetGenotypeFreq": 0.40954274, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.72167, + "refHomGenotypeFreq": 0.51689863, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13934426, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.8606557, + "refHomGenotypeFreq": 0.73770493, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34726223, + "altHomGenotypeFreq": 0.129683, + "hetGenotypeFreq": 0.4351585, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.65273774, + "refHomGenotypeFreq": 0.4351585, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1882353, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.90588236, + "refHomGenotypeFreq": 0.8117647, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14563107, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.2524272, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.8543689, + "refHomGenotypeFreq": 0.7281553, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.3333333, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.5555556, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3084112, + "altHomGenotypeFreq": 0.07476635, + "hetGenotypeFreq": 0.46728975, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.69158876, + "refHomGenotypeFreq": 0.45794392, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28365386, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.41346154, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.71634614, + "refHomGenotypeFreq": 0.50961536, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25252524, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.42424244, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.74747473, + "refHomGenotypeFreq": 0.53535354, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3764706, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.4, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.62352943, + "refHomGenotypeFreq": 0.42352942, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27480158, + "altHomGenotypeFreq": 0.07936508, + "hetGenotypeFreq": 0.39087301, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7251984, + "refHomGenotypeFreq": 0.5297619, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30097088, + "altHomGenotypeFreq": 0.097087376, + "hetGenotypeFreq": 0.407767, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.69902915, + "refHomGenotypeFreq": 0.49514562, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30337077, + "altHomGenotypeFreq": 0.09737828, + "hetGenotypeFreq": 0.411985, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6966292, + "refHomGenotypeFreq": 0.4906367, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29661465, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.70338535, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29490766, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.7050923, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29865074, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.70134926, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29449838, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.7055016, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22933691, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22933691, + "id": "15:22933691:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22933691, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.309999942779541, + "source": "gerp" + }, + { + "score": 0.006000000052154064, + "source": "phastCons" + }, + { + "score": -1.2979999780654907, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 1.8700000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.901-1530G>A", + "ENST00000560848(ENSG00000068793):c.901-1530G>A" + ], + "id": "rs6606806", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.99993545, + "altHomGenotypeFreq": 0.9998709, + "hetGenotypeFreq": 1.2912389E-4, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 6.4561944E-5, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9998668, + "altHomGenotypeFreq": 0.99973357, + "hetGenotypeFreq": 2.664535E-4, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 1.3322676E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9998832, + "altHomGenotypeFreq": 0.99976635, + "hetGenotypeFreq": 2.3364487E-4, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 1.1682243E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.99973553, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 2.644803E-4, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9997202, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 2.7979855E-4, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.99974054, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 2.594707E-4, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9997303, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 2.6968715E-4, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22937645, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22937645, + "id": "15:22937645:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22937645, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "cdnaPosition": 1043, + "cdsPosition": 918, + "codon": "ccG/ccA", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "exonOverlap": [ + { + "number": "10/31", + "percentage": 1.0869565 + } + ], + "geneName": "CYFIP1", + "proteinVariantAnnotation": { + "alternate": "PRO", + "position": 306, + "reference": "PRO" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 1109, + "cdsPosition": 918, + "codon": "ccG/ccA", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "exonOverlap": [ + { + "number": "11/32", + "percentage": 1.0869565 + } + ], + "geneName": "CYFIP1", + "proteinVariantAnnotation": { + "alternate": "PRO", + "position": 306, + "reference": "PRO" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": -11.300000190734863, + "source": "gerp" + }, + { + "score": 0.3490000069141388, + "source": "phastCons" + }, + { + "score": -1.9149999618530273, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": 0.5200004577636719, + "source": "cadd_raw" + }, + { + "score": 7.599999904632568, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.918G>A", + "ENSP00000324549:p.Pro306=", + "ENST00000560848(ENSG00000068793):c.918G>A", + "ENSP00000454199:p.Pro306=" + ], + "id": "rs11633474", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.44064867, + "altHomGenotypeFreq": 0.20982333, + "hetGenotypeFreq": 0.46165067, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5593513, + "refHomGenotypeFreq": 0.32852602, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46790853, + "altHomGenotypeFreq": 0.22021395, + "hetGenotypeFreq": 0.49538916, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5320915, + "refHomGenotypeFreq": 0.2843969, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11507473, + "altHomGenotypeFreq": 0.01366184, + "hetGenotypeFreq": 0.20282578, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.88492525, + "refHomGenotypeFreq": 0.78351235, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5143843, + "altHomGenotypeFreq": 0.26233813, + "hetGenotypeFreq": 0.50409234, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.48561567, + "refHomGenotypeFreq": 0.2335695, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4244744, + "altHomGenotypeFreq": 0.18432333, + "hetGenotypeFreq": 0.4803021, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.57552564, + "refHomGenotypeFreq": 0.33537456, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50063086, + "altHomGenotypeFreq": 0.25171232, + "hetGenotypeFreq": 0.49783707, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.49936914, + "refHomGenotypeFreq": 0.2504506, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.51379, + "altHomGenotypeFreq": 0.26400575, + "hetGenotypeFreq": 0.4995685, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.48621, + "refHomGenotypeFreq": 0.23642574, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3429189, + "altHomGenotypeFreq": 0.1234115, + "hetGenotypeFreq": 0.4390148, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.65708107, + "refHomGenotypeFreq": 0.4375737, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43677706, + "altHomGenotypeFreq": 0.20608543, + "hetGenotypeFreq": 0.46138325, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.56322294, + "refHomGenotypeFreq": 0.3325313, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4453485, + "altHomGenotypeFreq": 0.21436088, + "hetGenotypeFreq": 0.46197525, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.5546515, + "refHomGenotypeFreq": 0.32366386, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43511176, + "altHomGenotypeFreq": 0.19645178, + "hetGenotypeFreq": 0.47732, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.56488824, + "refHomGenotypeFreq": 0.32622823, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47535935, + "altHomGenotypeFreq": 0.21971253, + "hetGenotypeFreq": 0.51129365, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5246407, + "refHomGenotypeFreq": 0.26899385, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12577447, + "altHomGenotypeFreq": 0.019826518, + "hetGenotypeFreq": 0.21189591, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.8742255, + "refHomGenotypeFreq": 0.7682776, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50119615, + "altHomGenotypeFreq": 0.2631579, + "hetGenotypeFreq": 0.47607654, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.49880382, + "refHomGenotypeFreq": 0.26076555, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4205298, + "altHomGenotypeFreq": 0.16556291, + "hetGenotypeFreq": 0.50993377, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5794702, + "refHomGenotypeFreq": 0.3245033, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5005777, + "altHomGenotypeFreq": 0.24783362, + "hetGenotypeFreq": 0.50548816, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.4994223, + "refHomGenotypeFreq": 0.24667822, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4934228, + "altHomGenotypeFreq": 0.24013422, + "hetGenotypeFreq": 0.5065772, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5065772, + "refHomGenotypeFreq": 0.2532886, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3561234, + "altHomGenotypeFreq": 0.12592082, + "hetGenotypeFreq": 0.46040517, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.6438766, + "refHomGenotypeFreq": 0.41367403, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42826086, + "altHomGenotypeFreq": 0.19224443, + "hetGenotypeFreq": 0.4720329, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.57173914, + "refHomGenotypeFreq": 0.33572268, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44358826, + "altHomGenotypeFreq": 0.20165746, + "hetGenotypeFreq": 0.4838616, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.55641174, + "refHomGenotypeFreq": 0.31448096, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35020426, + "altHomGenotypeFreq": 0.11938266, + "hetGenotypeFreq": 0.46164322, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.6497957, + "refHomGenotypeFreq": 0.41897413, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44602492, + "altHomGenotypeFreq": 0.20698139, + "hetGenotypeFreq": 0.47808704, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5539751, + "refHomGenotypeFreq": 0.31493157, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4951163, + "altHomGenotypeFreq": 0.25186047, + "hetGenotypeFreq": 0.48651162, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.5048837, + "refHomGenotypeFreq": 0.2616279, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5160321, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.48396793, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4370787, + "altHomGenotypeFreq": 0.20784785, + "hetGenotypeFreq": 0.45846173, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5629213, + "refHomGenotypeFreq": 0.3336904, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46145374, + "altHomGenotypeFreq": 0.21806167, + "hetGenotypeFreq": 0.48678413, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.53854626, + "refHomGenotypeFreq": 0.29515418, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28264293, + "altHomGenotypeFreq": 0.08430233, + "hetGenotypeFreq": 0.3966812, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.7173571, + "refHomGenotypeFreq": 0.51901644, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11202312, + "altHomGenotypeFreq": 0.013410404, + "hetGenotypeFreq": 0.19722544, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.8879769, + "refHomGenotypeFreq": 0.78936416, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5189152, + "altHomGenotypeFreq": 0.2706858, + "hetGenotypeFreq": 0.4964588, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.48108482, + "refHomGenotypeFreq": 0.23285541, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49848807, + "altHomGenotypeFreq": 0.25400665, + "hetGenotypeFreq": 0.4889628, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.50151193, + "refHomGenotypeFreq": 0.25703055, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.51106113, + "altHomGenotypeFreq": 0.2613609, + "hetGenotypeFreq": 0.49940047, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.48893884, + "refHomGenotypeFreq": 0.2392386, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34550887, + "altHomGenotypeFreq": 0.12201234, + "hetGenotypeFreq": 0.44699305, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.6544911, + "refHomGenotypeFreq": 0.4309946, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5859375, + "altHomGenotypeFreq": 0.328125, + "hetGenotypeFreq": 0.515625, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.4140625, + "refHomGenotypeFreq": 0.15625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3300719, + "altHomGenotypeFreq": 0.13099042, + "hetGenotypeFreq": 0.39816296, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.66992813, + "refHomGenotypeFreq": 0.47084665, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24948876, + "altHomGenotypeFreq": 0.06748466, + "hetGenotypeFreq": 0.3640082, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.7505112, + "refHomGenotypeFreq": 0.56850713, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45212767, + "altHomGenotypeFreq": 0.19148937, + "hetGenotypeFreq": 0.5212766, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.54787236, + "refHomGenotypeFreq": 0.28723404, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.04901961, + "hetGenotypeFreq": 0.4019608, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.54901963, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34568834, + "altHomGenotypeFreq": 0.12708019, + "hetGenotypeFreq": 0.43721634, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.65431166, + "refHomGenotypeFreq": 0.4357035, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.123809524, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24761906, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.8761905, + "refHomGenotypeFreq": 0.75238097, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.125, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.9375, + "refHomGenotypeFreq": 0.875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32407406, + "altHomGenotypeFreq": 0.10185185, + "hetGenotypeFreq": 0.44444448, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.6759259, + "refHomGenotypeFreq": 0.4537037, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35416666, + "altHomGenotypeFreq": 0.15625, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.6458333, + "refHomGenotypeFreq": 0.44791666, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30088496, + "altHomGenotypeFreq": 0.07964602, + "hetGenotypeFreq": 0.44247788, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.69911504, + "refHomGenotypeFreq": 0.4778761, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17156863, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.2647059, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.82843137, + "refHomGenotypeFreq": 0.6960784, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53296703, + "altHomGenotypeFreq": 0.2967033, + "hetGenotypeFreq": 0.4725275, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.46703297, + "refHomGenotypeFreq": 0.23076923, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.086021505, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.15053764, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.9139785, + "refHomGenotypeFreq": 0.83870965, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12626262, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.21212122, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.8737374, + "refHomGenotypeFreq": 0.7676768, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44392523, + "altHomGenotypeFreq": 0.20560747, + "hetGenotypeFreq": 0.47663552, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.55607474, + "refHomGenotypeFreq": 0.317757, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18604651, + "altHomGenotypeFreq": 0.011627907, + "hetGenotypeFreq": 0.3488372, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.81395346, + "refHomGenotypeFreq": 0.6395349, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27083334, + "altHomGenotypeFreq": 0.083333336, + "hetGenotypeFreq": 0.375, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.7291667, + "refHomGenotypeFreq": 0.5416667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3989899, + "altHomGenotypeFreq": 0.1919192, + "hetGenotypeFreq": 0.41414142, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.6010101, + "refHomGenotypeFreq": 0.3939394, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3888889, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.43434343, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.6111111, + "refHomGenotypeFreq": 0.3939394, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5049702, + "altHomGenotypeFreq": 0.2524851, + "hetGenotypeFreq": 0.5049702, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.4950298, + "refHomGenotypeFreq": 0.24254473, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3852459, + "altHomGenotypeFreq": 0.114754096, + "hetGenotypeFreq": 0.5409836, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.6147541, + "refHomGenotypeFreq": 0.3442623, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4740634, + "altHomGenotypeFreq": 0.23054755, + "hetGenotypeFreq": 0.4870317, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5259366, + "refHomGenotypeFreq": 0.28242075, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3764706, + "altHomGenotypeFreq": 0.15294118, + "hetGenotypeFreq": 0.44705883, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.62352943, + "refHomGenotypeFreq": 0.4, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2815534, + "altHomGenotypeFreq": 0.0776699, + "hetGenotypeFreq": 0.407767, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.7184466, + "refHomGenotypeFreq": 0.5145631, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5050505, + "altHomGenotypeFreq": 0.22222222, + "hetGenotypeFreq": 0.56565654, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.4949495, + "refHomGenotypeFreq": 0.21212122, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5233645, + "altHomGenotypeFreq": 0.2897196, + "hetGenotypeFreq": 0.46728972, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.47663552, + "refHomGenotypeFreq": 0.24299066, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47596154, + "altHomGenotypeFreq": 0.24038461, + "hetGenotypeFreq": 0.47115386, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.52403843, + "refHomGenotypeFreq": 0.28846154, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5252525, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.5454545, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.47474748, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4117647, + "altHomGenotypeFreq": 0.1882353, + "hetGenotypeFreq": 0.44705883, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.5882353, + "refHomGenotypeFreq": 0.3647059, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1140873, + "altHomGenotypeFreq": 0.007936508, + "hetGenotypeFreq": 0.21230158, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.8859127, + "refHomGenotypeFreq": 0.7797619, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1699029, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.32038835, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.8300971, + "refHomGenotypeFreq": 0.6699029, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.51498127, + "altHomGenotypeFreq": 0.25468165, + "hetGenotypeFreq": 0.52059925, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.48501873, + "refHomGenotypeFreq": 0.2247191, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.504436, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.49556398, + "study": "DISCOVEHR" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52314204, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.47685796, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52770007, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.47229993, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5197198, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.48028022, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52669907, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.47330096, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22939192, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM6352335", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM6352335", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM6352335", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM6352335", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM6352335", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "breast", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "CYFIP1", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM6352335", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "", + "mutationId": "COSM6352335", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "", + "mutationId": "COSM6352335", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "primary" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "", + "mutationId": "COSM6352335", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "", + "mutationId": "COSM6352335", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "breast", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + } + ] + } + }, + "chromosome": "15", + "end": 22939192, + "id": "15:22939192:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22939192, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.16599999368190765, + "source": "gerp" + }, + { + "score": 0.007000000216066837, + "source": "phastCons" + }, + { + "score": 0.6549999713897705, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 4.820000171661377, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.993-58C>T", + "ENST00000560848(ENSG00000068793):c.993-58C>T" + ], + "id": "rs3751566", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.25200516, + "altHomGenotypeFreq": 0.07141009, + "hetGenotypeFreq": 0.36119017, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.74799484, + "refHomGenotypeFreq": 0.56739974, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2887755, + "altHomGenotypeFreq": 0.093877554, + "hetGenotypeFreq": 0.38979593, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7112245, + "refHomGenotypeFreq": 0.51632655, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12933168, + "altHomGenotypeFreq": 0.021039603, + "hetGenotypeFreq": 0.21658416, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.8706683, + "refHomGenotypeFreq": 0.76237625, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39712918, + "altHomGenotypeFreq": 0.15789473, + "hetGenotypeFreq": 0.4784689, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6028708, + "refHomGenotypeFreq": 0.36363637, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24172185, + "altHomGenotypeFreq": 0.0397351, + "hetGenotypeFreq": 0.40397352, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.75827813, + "refHomGenotypeFreq": 0.5562914, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2970807, + "altHomGenotypeFreq": 0.08643389, + "hetGenotypeFreq": 0.42129365, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7029193, + "refHomGenotypeFreq": 0.49227247, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32642695, + "altHomGenotypeFreq": 0.10172437, + "hetGenotypeFreq": 0.44940516, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.6735731, + "refHomGenotypeFreq": 0.44887048, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.111454755, + "altHomGenotypeFreq": 0.013058419, + "hetGenotypeFreq": 0.19679266, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8885453, + "refHomGenotypeFreq": 0.7901489, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24646075, + "altHomGenotypeFreq": 0.06797707, + "hetGenotypeFreq": 0.35696736, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.75353926, + "refHomGenotypeFreq": 0.5750556, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2588601, + "altHomGenotypeFreq": 0.07565457, + "hetGenotypeFreq": 0.36641112, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7411399, + "refHomGenotypeFreq": 0.55793434, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3266533, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6733467, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4765625, + "altHomGenotypeFreq": 0.203125, + "hetGenotypeFreq": 0.546875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.5234375, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18989617, + "altHomGenotypeFreq": 0.049121406, + "hetGenotypeFreq": 0.2815495, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.81010383, + "refHomGenotypeFreq": 0.66932905, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14621677, + "altHomGenotypeFreq": 0.018404908, + "hetGenotypeFreq": 0.25562373, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.85378325, + "refHomGenotypeFreq": 0.72597134, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30851063, + "altHomGenotypeFreq": 0.10638298, + "hetGenotypeFreq": 0.40425533, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.69148934, + "refHomGenotypeFreq": 0.4893617, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14705883, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.27450982, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.85294116, + "refHomGenotypeFreq": 0.71568626, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.090771556, + "altHomGenotypeFreq": 0.010590015, + "hetGenotypeFreq": 0.16036308, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.90922844, + "refHomGenotypeFreq": 0.8290469, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.114285715, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22857143, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.8857143, + "refHomGenotypeFreq": 0.7714286, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.125, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.9375, + "refHomGenotypeFreq": 0.875, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.027777778, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.055555556, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.9722222, + "refHomGenotypeFreq": 0.9444444, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.203125, + "altHomGenotypeFreq": 0.052083332, + "hetGenotypeFreq": 0.3020833, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.796875, + "refHomGenotypeFreq": 0.6458333, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07522124, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15044248, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.92477876, + "refHomGenotypeFreq": 0.8495575, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1127451, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.20588236, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.8872549, + "refHomGenotypeFreq": 0.78431374, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36813188, + "altHomGenotypeFreq": 0.15384616, + "hetGenotypeFreq": 0.42857143, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.6318681, + "refHomGenotypeFreq": 0.41758242, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.086021505, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.15053764, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.9139785, + "refHomGenotypeFreq": 0.83870965, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12626262, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.21212122, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.8737374, + "refHomGenotypeFreq": 0.7676768, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2897196, + "altHomGenotypeFreq": 0.11214953, + "hetGenotypeFreq": 0.35514018, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.71028036, + "refHomGenotypeFreq": 0.53271025, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11046512, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22093023, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.8895349, + "refHomGenotypeFreq": 0.7790698, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.072916664, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14583333, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.9270833, + "refHomGenotypeFreq": 0.8541667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.09090909, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.8989899, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.26262626, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32902583, + "altHomGenotypeFreq": 0.11332008, + "hetGenotypeFreq": 0.43141153, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.67097414, + "refHomGenotypeFreq": 0.45526838, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1557377, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.8442623, + "refHomGenotypeFreq": 0.72131145, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.351585, + "altHomGenotypeFreq": 0.13256484, + "hetGenotypeFreq": 0.43804035, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.64841497, + "refHomGenotypeFreq": 0.4293948, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11176471, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22352941, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.8882353, + "refHomGenotypeFreq": 0.7764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1553398, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.27184466, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.8446602, + "refHomGenotypeFreq": 0.70873785, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3181818, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.3939394, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6818182, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35514018, + "altHomGenotypeFreq": 0.12149533, + "hetGenotypeFreq": 0.46728975, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.6448598, + "refHomGenotypeFreq": 0.41121495, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29326922, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.4326923, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.7067308, + "refHomGenotypeFreq": 0.4903846, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3181818, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.5151515, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.6818182, + "refHomGenotypeFreq": 0.42424244, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3764706, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.4, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.62352943, + "refHomGenotypeFreq": 0.42352942, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11210317, + "altHomGenotypeFreq": 0.007936508, + "hetGenotypeFreq": 0.20833334, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.88789684, + "refHomGenotypeFreq": 0.78373015, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1699029, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.32038835, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.8300971, + "refHomGenotypeFreq": 0.6699029, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2659176, + "altHomGenotypeFreq": 0.101123594, + "hetGenotypeFreq": 0.32958803, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7340824, + "refHomGenotypeFreq": 0.5692884, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34752712, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.65247285, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3466704, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.6533296, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3487286, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.6512714, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3462783, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.6537217, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22940670, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22940670, + "id": "15:22940670:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22940670, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.1500000953674316, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": 0.6549999713897705, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.36999988555908203, + "source": "cadd_raw" + }, + { + "score": 6.429999828338623, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.1110+21C>T", + "ENST00000560848(ENSG00000068793):c.1110+21C>T" + ], + "id": "rs45464395", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.30654147, + "altHomGenotypeFreq": 0.102263585, + "hetGenotypeFreq": 0.40855578, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6934585, + "refHomGenotypeFreq": 0.48918062, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30414012, + "altHomGenotypeFreq": 0.099920385, + "hetGenotypeFreq": 0.4084395, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.69585985, + "refHomGenotypeFreq": 0.49164012, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.520025, + "altHomGenotypeFreq": 0.26708385, + "hetGenotypeFreq": 0.5058824, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.47997496, + "refHomGenotypeFreq": 0.2270338, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28486285, + "altHomGenotypeFreq": 0.08161192, + "hetGenotypeFreq": 0.40650186, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7151371, + "refHomGenotypeFreq": 0.51188624, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3584041, + "altHomGenotypeFreq": 0.12561466, + "hetGenotypeFreq": 0.4655789, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.6415959, + "refHomGenotypeFreq": 0.40880644, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24208103, + "altHomGenotypeFreq": 0.05598527, + "hetGenotypeFreq": 0.37219152, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.75791895, + "refHomGenotypeFreq": 0.5718232, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26254156, + "altHomGenotypeFreq": 0.06914237, + "hetGenotypeFreq": 0.38679835, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.73745847, + "refHomGenotypeFreq": 0.5440593, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.218518, + "altHomGenotypeFreq": 0.049628817, + "hetGenotypeFreq": 0.3377784, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.781482, + "refHomGenotypeFreq": 0.6125928, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31279695, + "altHomGenotypeFreq": 0.10693003, + "hetGenotypeFreq": 0.41173387, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.68720305, + "refHomGenotypeFreq": 0.48133612, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29888332, + "altHomGenotypeFreq": 0.096550785, + "hetGenotypeFreq": 0.40466508, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7011167, + "refHomGenotypeFreq": 0.49878412, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2669146, + "altHomGenotypeFreq": 0.074450195, + "hetGenotypeFreq": 0.38492885, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7330854, + "refHomGenotypeFreq": 0.540621, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26229507, + "altHomGenotypeFreq": 0.06967213, + "hetGenotypeFreq": 0.3852459, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.73770493, + "refHomGenotypeFreq": 0.545082, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.51175743, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.52351487, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.48824257, + "refHomGenotypeFreq": 0.22648515, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27804297, + "altHomGenotypeFreq": 0.100238666, + "hetGenotypeFreq": 0.35560858, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.721957, + "refHomGenotypeFreq": 0.54415274, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37086093, + "altHomGenotypeFreq": 0.15231788, + "hetGenotypeFreq": 0.4370861, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.62913907, + "refHomGenotypeFreq": 0.410596, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23868194, + "altHomGenotypeFreq": 0.054441262, + "hetGenotypeFreq": 0.36848137, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.761318, + "refHomGenotypeFreq": 0.5770774, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27159834, + "altHomGenotypeFreq": 0.072773404, + "hetGenotypeFreq": 0.39764988, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.72840166, + "refHomGenotypeFreq": 0.5295767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22064221, + "altHomGenotypeFreq": 0.04816514, + "hetGenotypeFreq": 0.34495413, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7793578, + "refHomGenotypeFreq": 0.6068807, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27269536, + "altHomGenotypeFreq": 0.078497894, + "hetGenotypeFreq": 0.38839495, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.72730464, + "refHomGenotypeFreq": 0.53310716, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25976562, + "altHomGenotypeFreq": 0.06944445, + "hetGenotypeFreq": 0.38064235, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7402344, + "refHomGenotypeFreq": 0.54991317, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22355878, + "altHomGenotypeFreq": 0.050839763, + "hetGenotypeFreq": 0.34543803, + "population": "AA", + "refAllele": "C", + "refAlleleFreq": 0.7764412, + "refHomGenotypeFreq": 0.6037222, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2628018, + "altHomGenotypeFreq": 0.07396586, + "hetGenotypeFreq": 0.37767184, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.73719823, + "refHomGenotypeFreq": 0.5483623, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28290698, + "altHomGenotypeFreq": 0.085813954, + "hetGenotypeFreq": 0.39418605, + "population": "EA", + "refAllele": "C", + "refAlleleFreq": 0.71709305, + "refHomGenotypeFreq": 0.52, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28256512, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7174349, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.309035, + "altHomGenotypeFreq": 0.104884714, + "hetGenotypeFreq": 0.4083006, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.690965, + "refHomGenotypeFreq": 0.48681468, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32051283, + "altHomGenotypeFreq": 0.11188811, + "hetGenotypeFreq": 0.4172494, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.67948717, + "refHomGenotypeFreq": 0.47086248, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46980134, + "altHomGenotypeFreq": 0.22503312, + "hetGenotypeFreq": 0.48953643, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.5301987, + "refHomGenotypeFreq": 0.28543046, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5246899, + "altHomGenotypeFreq": 0.27428037, + "hetGenotypeFreq": 0.5008191, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.4753101, + "refHomGenotypeFreq": 0.22490054, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29810727, + "altHomGenotypeFreq": 0.09288468, + "hetGenotypeFreq": 0.41044515, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.70189273, + "refHomGenotypeFreq": 0.4966702, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2377743, + "altHomGenotypeFreq": 0.050783698, + "hetGenotypeFreq": 0.37398118, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7622257, + "refHomGenotypeFreq": 0.5752351, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26552662, + "altHomGenotypeFreq": 0.07034819, + "hetGenotypeFreq": 0.39035684, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7344734, + "refHomGenotypeFreq": 0.53929496, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22093488, + "altHomGenotypeFreq": 0.050139833, + "hetGenotypeFreq": 0.3415901, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.77906513, + "refHomGenotypeFreq": 0.60827005, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2109375, + "altHomGenotypeFreq": 0.046875, + "hetGenotypeFreq": 0.328125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.7890625, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35363418, + "altHomGenotypeFreq": 0.15255591, + "hetGenotypeFreq": 0.40215653, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6463658, + "refHomGenotypeFreq": 0.44528753, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4989775, + "altHomGenotypeFreq": 0.25357872, + "hetGenotypeFreq": 0.49079755, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.5010225, + "refHomGenotypeFreq": 0.25562373, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32978722, + "altHomGenotypeFreq": 0.10638298, + "hetGenotypeFreq": 0.44680852, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.67021275, + "refHomGenotypeFreq": 0.44680852, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48039216, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.60784316, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.51960784, + "refHomGenotypeFreq": 0.21568628, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20045386, + "altHomGenotypeFreq": 0.0408472, + "hetGenotypeFreq": 0.31921333, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7995461, + "refHomGenotypeFreq": 0.6399395, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.52380955, + "altHomGenotypeFreq": 0.25714287, + "hetGenotypeFreq": 0.53333336, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.47619048, + "refHomGenotypeFreq": 0.20952381, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.53365386, + "altHomGenotypeFreq": 0.30769232, + "hetGenotypeFreq": 0.45192307, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.46634614, + "refHomGenotypeFreq": 0.24038461, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22222222, + "altHomGenotypeFreq": 0.037037037, + "hetGenotypeFreq": 0.3703704, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.7777778, + "refHomGenotypeFreq": 0.5925926, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46354166, + "altHomGenotypeFreq": 0.23958333, + "hetGenotypeFreq": 0.44791666, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.5364583, + "refHomGenotypeFreq": 0.3125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15486726, + "altHomGenotypeFreq": 0.044247787, + "hetGenotypeFreq": 0.22123894, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.84513277, + "refHomGenotypeFreq": 0.7345133, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5588235, + "altHomGenotypeFreq": 0.34313726, + "hetGenotypeFreq": 0.43137255, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.44117647, + "refHomGenotypeFreq": 0.2254902, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24725275, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.34065935, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.75274724, + "refHomGenotypeFreq": 0.5824176, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6505376, + "altHomGenotypeFreq": 0.43010753, + "hetGenotypeFreq": 0.4408602, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.34946236, + "refHomGenotypeFreq": 0.12903225, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.64141417, + "altHomGenotypeFreq": 0.41414142, + "hetGenotypeFreq": 0.45454544, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.35858586, + "refHomGenotypeFreq": 0.13131313, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31308413, + "altHomGenotypeFreq": 0.11214953, + "hetGenotypeFreq": 0.40186918, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.6869159, + "refHomGenotypeFreq": 0.48598132, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.51744187, + "altHomGenotypeFreq": 0.24418604, + "hetGenotypeFreq": 0.54651165, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.48255813, + "refHomGenotypeFreq": 0.20930232, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21875, + "altHomGenotypeFreq": 0.072916664, + "hetGenotypeFreq": 0.2916667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.78125, + "refHomGenotypeFreq": 0.6354167, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18181819, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.3030303, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.8181818, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20707071, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.35353535, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.7929293, + "refHomGenotypeFreq": 0.61616164, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25745526, + "altHomGenotypeFreq": 0.07554672, + "hetGenotypeFreq": 0.3638171, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.7425447, + "refHomGenotypeFreq": 0.56063616, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19672132, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.32786885, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.8032787, + "refHomGenotypeFreq": 0.6393443, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28530258, + "altHomGenotypeFreq": 0.08645533, + "hetGenotypeFreq": 0.39769453, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7146974, + "refHomGenotypeFreq": 0.5158501, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22941177, + "altHomGenotypeFreq": 0.03529412, + "hetGenotypeFreq": 0.3882353, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.7705882, + "refHomGenotypeFreq": 0.5764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47572815, + "altHomGenotypeFreq": 0.26213592, + "hetGenotypeFreq": 0.42718446, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.52427185, + "refHomGenotypeFreq": 0.3106796, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22727273, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.3333333, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.77272725, + "refHomGenotypeFreq": 0.6060606, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25233644, + "altHomGenotypeFreq": 0.08411215, + "hetGenotypeFreq": 0.33644858, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.74766356, + "refHomGenotypeFreq": 0.5794392, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26442307, + "altHomGenotypeFreq": 0.048076924, + "hetGenotypeFreq": 0.4326923, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.7355769, + "refHomGenotypeFreq": 0.5192308, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24242425, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.4040404, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.75757575, + "refHomGenotypeFreq": 0.5555556, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31764707, + "altHomGenotypeFreq": 0.14117648, + "hetGenotypeFreq": 0.3529412, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.68235296, + "refHomGenotypeFreq": 0.5058824, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.55654764, + "altHomGenotypeFreq": 0.3234127, + "hetGenotypeFreq": 0.46626985, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.4434524, + "refHomGenotypeFreq": 0.21031746, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44660193, + "altHomGenotypeFreq": 0.22330096, + "hetGenotypeFreq": 0.44660193, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5533981, + "refHomGenotypeFreq": 0.33009708, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.026217228, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.037453182, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9737828, + "refHomGenotypeFreq": 0.9550562, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.272926, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.727074, + "study": "DISCOVEHR" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26130652, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7386935, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25853387, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.74146616, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26232487, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.73767513, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26024812, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.7397519, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22940866, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22940866, + "id": "15:22940866:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22940866, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.4580000042915344, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": 0.48399999737739563, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 1.7999999523162842, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.1111-480G>T", + "ENST00000560848(ENSG00000068793):c.1111-480G>T" + ], + "id": "rs2881453", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.25586292, + "altHomGenotypeFreq": 0.07255766, + "hetGenotypeFreq": 0.36661053, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7441371, + "refHomGenotypeFreq": 0.56083184, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2897959, + "altHomGenotypeFreq": 0.093877554, + "hetGenotypeFreq": 0.39183673, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.71020406, + "refHomGenotypeFreq": 0.51428574, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17592593, + "altHomGenotypeFreq": 0.039506175, + "hetGenotypeFreq": 0.27283952, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.8240741, + "refHomGenotypeFreq": 0.6876543, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39518073, + "altHomGenotypeFreq": 0.15421687, + "hetGenotypeFreq": 0.48192772, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6048193, + "refHomGenotypeFreq": 0.36385542, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24172185, + "altHomGenotypeFreq": 0.0397351, + "hetGenotypeFreq": 0.40397352, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.75827813, + "refHomGenotypeFreq": 0.5562914, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2994203, + "altHomGenotypeFreq": 0.08695652, + "hetGenotypeFreq": 0.42492753, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7005797, + "refHomGenotypeFreq": 0.48811594, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3277036, + "altHomGenotypeFreq": 0.10200267, + "hetGenotypeFreq": 0.45140186, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.6722964, + "refHomGenotypeFreq": 0.44659546, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.113318026, + "altHomGenotypeFreq": 0.0133180255, + "hetGenotypeFreq": 0.2, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.886682, + "refHomGenotypeFreq": 0.78668195, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25038096, + "altHomGenotypeFreq": 0.0695112, + "hetGenotypeFreq": 0.36173955, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.749619, + "refHomGenotypeFreq": 0.56874925, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26263577, + "altHomGenotypeFreq": 0.076321505, + "hetGenotypeFreq": 0.37262854, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.73736423, + "refHomGenotypeFreq": 0.55104995, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33166334, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.66833663, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4765625, + "altHomGenotypeFreq": 0.203125, + "hetGenotypeFreq": 0.546875, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.5234375, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20227636, + "altHomGenotypeFreq": 0.0543131, + "hetGenotypeFreq": 0.2959265, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.79772365, + "refHomGenotypeFreq": 0.64976037, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15848671, + "altHomGenotypeFreq": 0.022494888, + "hetGenotypeFreq": 0.27198365, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.8415133, + "refHomGenotypeFreq": 0.70552146, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31382978, + "altHomGenotypeFreq": 0.10638298, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.6861702, + "refHomGenotypeFreq": 0.4787234, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17156863, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.32352942, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.82843137, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.090771556, + "altHomGenotypeFreq": 0.010590015, + "hetGenotypeFreq": 0.16036308, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.90922844, + "refHomGenotypeFreq": 0.8290469, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14285715, + "altHomGenotypeFreq": 0.01904762, + "hetGenotypeFreq": 0.24761906, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.85714287, + "refHomGenotypeFreq": 0.73333335, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08173077, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.14423077, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.9182692, + "refHomGenotypeFreq": 0.84615386, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.027777778, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.055555556, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.9722222, + "refHomGenotypeFreq": 0.9444444, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20833333, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.2916667, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.7916667, + "refHomGenotypeFreq": 0.6458333, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07522124, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15044248, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.92477876, + "refHomGenotypeFreq": 0.8495575, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12745099, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.23529413, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.872549, + "refHomGenotypeFreq": 0.75490195, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36813188, + "altHomGenotypeFreq": 0.15384616, + "hetGenotypeFreq": 0.42857143, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.6318681, + "refHomGenotypeFreq": 0.41758242, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15053764, + "altHomGenotypeFreq": 0.032258064, + "hetGenotypeFreq": 0.23655915, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.8494624, + "refHomGenotypeFreq": 0.7311828, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26262626, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.3838384, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.7373737, + "refHomGenotypeFreq": 0.54545456, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2897196, + "altHomGenotypeFreq": 0.11214953, + "hetGenotypeFreq": 0.35514018, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.71028036, + "refHomGenotypeFreq": 0.53271025, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11627907, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23255815, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.88372093, + "refHomGenotypeFreq": 0.76744187, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.072916664, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14583333, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.9270833, + "refHomGenotypeFreq": 0.8541667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.09090909, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.8989899, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.26262626, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3300199, + "altHomGenotypeFreq": 0.11332008, + "hetGenotypeFreq": 0.43339962, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.6699801, + "refHomGenotypeFreq": 0.45328033, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1557377, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.8442623, + "refHomGenotypeFreq": 0.72131145, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35446686, + "altHomGenotypeFreq": 0.13544668, + "hetGenotypeFreq": 0.43804035, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.64553314, + "refHomGenotypeFreq": 0.42651296, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11176471, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22352943, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.8882353, + "refHomGenotypeFreq": 0.7764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16504854, + "altHomGenotypeFreq": 0.029126214, + "hetGenotypeFreq": 0.27184466, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.83495146, + "refHomGenotypeFreq": 0.69902915, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3181818, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.3939394, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6818182, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35514018, + "altHomGenotypeFreq": 0.12149533, + "hetGenotypeFreq": 0.46728975, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.6448598, + "refHomGenotypeFreq": 0.41121495, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29326922, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.4326923, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.7067308, + "refHomGenotypeFreq": 0.4903846, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32323232, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.5252525, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.67676765, + "refHomGenotypeFreq": 0.41414142, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38235295, + "altHomGenotypeFreq": 0.1882353, + "hetGenotypeFreq": 0.3882353, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.61764705, + "refHomGenotypeFreq": 0.42352942, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15873016, + "altHomGenotypeFreq": 0.027777778, + "hetGenotypeFreq": 0.26190478, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.84126985, + "refHomGenotypeFreq": 0.71031743, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16019417, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.30097085, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.83980584, + "refHomGenotypeFreq": 0.6893204, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34858504, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.651415, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34723, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.65277004, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3502854, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.6497146, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3468177, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.65318227, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22944560, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22944560, + "id": "15:22944560:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22944560, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.559999942779541, + "source": "gerp" + }, + { + "score": 0.10599999874830246, + "source": "phastCons" + }, + { + "score": -0.7210000157356262, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.23999977111816406, + "source": "cadd_raw" + }, + { + "score": 5.119999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.1233+152C>T", + "ENST00000560848(ENSG00000068793):c.1233+152C>T" + ], + "id": "rs8029108", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.6331432, + "altHomGenotypeFreq": 0.4109678, + "hetGenotypeFreq": 0.4443508, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.3668568, + "refHomGenotypeFreq": 0.14468141, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5838446, + "altHomGenotypeFreq": 0.34560326, + "hetGenotypeFreq": 0.47648263, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.41615543, + "refHomGenotypeFreq": 0.17791411, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7125935, + "altHomGenotypeFreq": 0.4937656, + "hetGenotypeFreq": 0.43765587, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.28740647, + "refHomGenotypeFreq": 0.068578556, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.56594723, + "altHomGenotypeFreq": 0.31654677, + "hetGenotypeFreq": 0.49880096, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.43405277, + "refHomGenotypeFreq": 0.18465228, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.58278143, + "altHomGenotypeFreq": 0.35099337, + "hetGenotypeFreq": 0.46357617, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.41721854, + "refHomGenotypeFreq": 0.18543047, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.61216295, + "altHomGenotypeFreq": 0.39013195, + "hetGenotypeFreq": 0.44406196, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.38783705, + "refHomGenotypeFreq": 0.16580608, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5649177, + "altHomGenotypeFreq": 0.32097444, + "hetGenotypeFreq": 0.4878865, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.43508232, + "refHomGenotypeFreq": 0.19113907, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.75769407, + "altHomGenotypeFreq": 0.5769407, + "hetGenotypeFreq": 0.36150667, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.24230592, + "refHomGenotypeFreq": 0.061552595, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6344779, + "altHomGenotypeFreq": 0.41052386, + "hetGenotypeFreq": 0.44790813, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.3655221, + "refHomGenotypeFreq": 0.14156803, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6314911, + "altHomGenotypeFreq": 0.41151726, + "hetGenotypeFreq": 0.43994778, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.36850885, + "refHomGenotypeFreq": 0.14853495, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5390781, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.46092185, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.453125, + "altHomGenotypeFreq": 0.15625, + "hetGenotypeFreq": 0.59375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.546875, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.692492, + "altHomGenotypeFreq": 0.49041533, + "hetGenotypeFreq": 0.40415335, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.307508, + "refHomGenotypeFreq": 0.10543131, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7137014, + "altHomGenotypeFreq": 0.5153374, + "hetGenotypeFreq": 0.396728, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.28629857, + "refHomGenotypeFreq": 0.08793456, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.65425533, + "altHomGenotypeFreq": 0.4574468, + "hetGenotypeFreq": 0.39361703, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.34574467, + "refHomGenotypeFreq": 0.14893617, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.70098037, + "altHomGenotypeFreq": 0.51960784, + "hetGenotypeFreq": 0.3627451, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.2990196, + "refHomGenotypeFreq": 0.11764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.78139186, + "altHomGenotypeFreq": 0.61875945, + "hetGenotypeFreq": 0.32526475, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.21860817, + "refHomGenotypeFreq": 0.055975795, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.75714284, + "altHomGenotypeFreq": 0.5809524, + "hetGenotypeFreq": 0.35238096, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.24285714, + "refHomGenotypeFreq": 0.06666667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7980769, + "altHomGenotypeFreq": 0.63461536, + "hetGenotypeFreq": 0.32692307, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.20192307, + "refHomGenotypeFreq": 0.03846154, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8240741, + "altHomGenotypeFreq": 0.6944444, + "hetGenotypeFreq": 0.25925928, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.17592593, + "refHomGenotypeFreq": 0.046296295, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6197917, + "altHomGenotypeFreq": 0.40625, + "hetGenotypeFreq": 0.4270833, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.38020834, + "refHomGenotypeFreq": 0.16666667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8097345, + "altHomGenotypeFreq": 0.67256635, + "hetGenotypeFreq": 0.27433628, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.19026549, + "refHomGenotypeFreq": 0.053097345, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7352941, + "altHomGenotypeFreq": 0.5588235, + "hetGenotypeFreq": 0.3529412, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.2647059, + "refHomGenotypeFreq": 0.0882353, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.52747256, + "altHomGenotypeFreq": 0.26373628, + "hetGenotypeFreq": 0.52747256, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.47252747, + "refHomGenotypeFreq": 0.20879121, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.76344085, + "altHomGenotypeFreq": 0.58064514, + "hetGenotypeFreq": 0.3655914, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.23655914, + "refHomGenotypeFreq": 0.05376344, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67171717, + "altHomGenotypeFreq": 0.45454547, + "hetGenotypeFreq": 0.43434343, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.32828283, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6542056, + "altHomGenotypeFreq": 0.43925235, + "hetGenotypeFreq": 0.42990655, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.34579438, + "refHomGenotypeFreq": 0.13084112, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7616279, + "altHomGenotypeFreq": 0.54651165, + "hetGenotypeFreq": 0.43023255, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.23837209, + "refHomGenotypeFreq": 0.023255814, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8125, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.29166666, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.1875, + "refHomGenotypeFreq": 0.041666668, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8030303, + "altHomGenotypeFreq": 0.65656567, + "hetGenotypeFreq": 0.2929293, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.1969697, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67171717, + "altHomGenotypeFreq": 0.45454547, + "hetGenotypeFreq": 0.43434343, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.32828283, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5775348, + "altHomGenotypeFreq": 0.33399603, + "hetGenotypeFreq": 0.48707753, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.4224652, + "refHomGenotypeFreq": 0.17892644, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.795082, + "altHomGenotypeFreq": 0.6229508, + "hetGenotypeFreq": 0.3442623, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.20491803, + "refHomGenotypeFreq": 0.032786883, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.59365994, + "altHomGenotypeFreq": 0.36023054, + "hetGenotypeFreq": 0.4668588, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.40634006, + "refHomGenotypeFreq": 0.17291066, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7470588, + "altHomGenotypeFreq": 0.5411765, + "hetGenotypeFreq": 0.41176474, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.2529412, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.75242716, + "altHomGenotypeFreq": 0.5436893, + "hetGenotypeFreq": 0.41747573, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.24757281, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.63131315, + "altHomGenotypeFreq": 0.36363637, + "hetGenotypeFreq": 0.53535354, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.36868685, + "refHomGenotypeFreq": 0.1010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.56542057, + "altHomGenotypeFreq": 0.317757, + "hetGenotypeFreq": 0.49532712, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.43457943, + "refHomGenotypeFreq": 0.18691589, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6201923, + "altHomGenotypeFreq": 0.3846154, + "hetGenotypeFreq": 0.47115386, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.37980768, + "refHomGenotypeFreq": 0.14423077, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.45454544, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.27272728, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6, + "altHomGenotypeFreq": 0.3764706, + "hetGenotypeFreq": 0.44705883, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.4, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7380952, + "altHomGenotypeFreq": 0.5436508, + "hetGenotypeFreq": 0.3888889, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.26190478, + "refHomGenotypeFreq": 0.06746032, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.69902915, + "altHomGenotypeFreq": 0.46601942, + "hetGenotypeFreq": 0.46601942, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.30097088, + "refHomGenotypeFreq": 0.067961164, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3127341, + "altHomGenotypeFreq": 0.19475655, + "hetGenotypeFreq": 0.23595506, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.68726593, + "refHomGenotypeFreq": 0.5692884, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.54760647, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.45239353, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.54448795, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.45551202, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5467047, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.4532953, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5485437, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.4514563, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22945314, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22945314, + "id": "15:22945314:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22945314, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.37299999594688416, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -0.8169999718666077, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.039999961853027344, + "source": "cadd_raw" + }, + { + "score": 2.259999990463257, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.1234-335G>A", + "ENST00000560848(ENSG00000068793):c.1234-335G>A" + ], + "id": "rs6606809", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.49757078, + "altHomGenotypeFreq": 0.26203278, + "hetGenotypeFreq": 0.47107598, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.50242925, + "refHomGenotypeFreq": 0.26689124, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43737167, + "altHomGenotypeFreq": 0.21149898, + "hetGenotypeFreq": 0.4517454, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5626283, + "refHomGenotypeFreq": 0.33675563, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6943069, + "altHomGenotypeFreq": 0.4740099, + "hetGenotypeFreq": 0.44059405, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.30569306, + "refHomGenotypeFreq": 0.08539604, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46291867, + "altHomGenotypeFreq": 0.20574163, + "hetGenotypeFreq": 0.51435405, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.53708136, + "refHomGenotypeFreq": 0.2799043, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4493243, + "altHomGenotypeFreq": 0.19594595, + "hetGenotypeFreq": 0.5067568, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5506757, + "refHomGenotypeFreq": 0.2972973, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4165711, + "altHomGenotypeFreq": 0.17488532, + "hetGenotypeFreq": 0.48337156, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5834289, + "refHomGenotypeFreq": 0.3417431, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4046664, + "altHomGenotypeFreq": 0.16325712, + "hetGenotypeFreq": 0.48281854, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5953336, + "refHomGenotypeFreq": 0.35392433, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.66482884, + "altHomGenotypeFreq": 0.44061565, + "hetGenotypeFreq": 0.44842637, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.33517113, + "refHomGenotypeFreq": 0.11095796, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5034543, + "altHomGenotypeFreq": 0.26697892, + "hetGenotypeFreq": 0.47295082, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.49654567, + "refHomGenotypeFreq": 0.26007026, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49028563, + "altHomGenotypeFreq": 0.25590837, + "hetGenotypeFreq": 0.46875453, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.50971437, + "refHomGenotypeFreq": 0.2753371, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36673346, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.63326657, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34375, + "altHomGenotypeFreq": 0.09375, + "hetGenotypeFreq": 0.5, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.65625, + "refHomGenotypeFreq": 0.40625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6024361, + "altHomGenotypeFreq": 0.3853834, + "hetGenotypeFreq": 0.43410543, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.3975639, + "refHomGenotypeFreq": 0.18051118, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.64621675, + "altHomGenotypeFreq": 0.41308793, + "hetGenotypeFreq": 0.4662577, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.35378322, + "refHomGenotypeFreq": 0.1206544, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5212766, + "altHomGenotypeFreq": 0.28723404, + "hetGenotypeFreq": 0.4680851, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.4787234, + "refHomGenotypeFreq": 0.24468085, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6372549, + "altHomGenotypeFreq": 0.42156863, + "hetGenotypeFreq": 0.43137255, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.3627451, + "refHomGenotypeFreq": 0.14705883, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.69742817, + "altHomGenotypeFreq": 0.4977307, + "hetGenotypeFreq": 0.39939487, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.30257186, + "refHomGenotypeFreq": 0.102874435, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.73333335, + "altHomGenotypeFreq": 0.552381, + "hetGenotypeFreq": 0.36190477, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.26666668, + "refHomGenotypeFreq": 0.08571429, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.80288464, + "altHomGenotypeFreq": 0.6442308, + "hetGenotypeFreq": 0.31730768, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.19711539, + "refHomGenotypeFreq": 0.03846154, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7314815, + "altHomGenotypeFreq": 0.5648148, + "hetGenotypeFreq": 0.33333334, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.2685185, + "refHomGenotypeFreq": 0.10185185, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5520833, + "altHomGenotypeFreq": 0.34375, + "hetGenotypeFreq": 0.41666666, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.44791666, + "refHomGenotypeFreq": 0.23958333, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7522124, + "altHomGenotypeFreq": 0.57522124, + "hetGenotypeFreq": 0.3539823, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.24778761, + "refHomGenotypeFreq": 0.07079646, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6764706, + "altHomGenotypeFreq": 0.46078432, + "hetGenotypeFreq": 0.43137258, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.32352942, + "refHomGenotypeFreq": 0.10784314, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34615386, + "altHomGenotypeFreq": 0.14285715, + "hetGenotypeFreq": 0.4065934, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.65384614, + "refHomGenotypeFreq": 0.45054945, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7419355, + "altHomGenotypeFreq": 0.5268817, + "hetGenotypeFreq": 0.43010753, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.2580645, + "refHomGenotypeFreq": 0.043010753, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.66161615, + "altHomGenotypeFreq": 0.44444445, + "hetGenotypeFreq": 0.43434343, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.33838382, + "refHomGenotypeFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46728972, + "altHomGenotypeFreq": 0.22429906, + "hetGenotypeFreq": 0.4859813, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.53271025, + "refHomGenotypeFreq": 0.2897196, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7267442, + "altHomGenotypeFreq": 0.47674417, + "hetGenotypeFreq": 0.5, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.27325583, + "refHomGenotypeFreq": 0.023255814, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7083333, + "altHomGenotypeFreq": 0.5208333, + "hetGenotypeFreq": 0.375, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.29166666, + "refHomGenotypeFreq": 0.104166664, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7373737, + "altHomGenotypeFreq": 0.56565654, + "hetGenotypeFreq": 0.34343433, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.26262626, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.61616164, + "altHomGenotypeFreq": 0.37373737, + "hetGenotypeFreq": 0.48484847, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.3838384, + "refHomGenotypeFreq": 0.14141414, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3976143, + "altHomGenotypeFreq": 0.16500995, + "hetGenotypeFreq": 0.46520877, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.6023857, + "refHomGenotypeFreq": 0.36978132, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6885246, + "altHomGenotypeFreq": 0.45901638, + "hetGenotypeFreq": 0.45901638, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.3114754, + "refHomGenotypeFreq": 0.08196721, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47982708, + "altHomGenotypeFreq": 0.25072047, + "hetGenotypeFreq": 0.45821327, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5201729, + "refHomGenotypeFreq": 0.2910663, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.62352943, + "altHomGenotypeFreq": 0.3764706, + "hetGenotypeFreq": 0.49411768, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.3764706, + "refHomGenotypeFreq": 0.12941177, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6456311, + "altHomGenotypeFreq": 0.36893204, + "hetGenotypeFreq": 0.5533981, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.35436893, + "refHomGenotypeFreq": 0.0776699, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42424244, + "altHomGenotypeFreq": 0.16161616, + "hetGenotypeFreq": 0.5252525, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.57575756, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39719626, + "altHomGenotypeFreq": 0.17757009, + "hetGenotypeFreq": 0.43925232, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.60280377, + "refHomGenotypeFreq": 0.38317758, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45673078, + "altHomGenotypeFreq": 0.22115384, + "hetGenotypeFreq": 0.47115386, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.5432692, + "refHomGenotypeFreq": 0.30769232, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34343433, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.46464646, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.65656567, + "refHomGenotypeFreq": 0.42424244, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5647059, + "altHomGenotypeFreq": 0.3647059, + "hetGenotypeFreq": 0.4, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.43529412, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7242063, + "altHomGenotypeFreq": 0.52380955, + "hetGenotypeFreq": 0.40079367, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.27579364, + "refHomGenotypeFreq": 0.07539683, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6796116, + "altHomGenotypeFreq": 0.44660193, + "hetGenotypeFreq": 0.46601942, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.32038835, + "refHomGenotypeFreq": 0.08737864, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.375562, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.624438, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37101287, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.62898713, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37752983, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.62247014, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3735167, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.6264833, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22946626, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22946626, + "id": "15:22946626:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22946626, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558549", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558826", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.609999895095825, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": -0.460999995470047, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.18000030517578125, + "source": "cadd_raw" + }, + { + "score": 1.2300000190734863, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.1360-232A>G", + "ENST00000560848(ENSG00000068793):c.1360-232A>G", + "ENST00000557859(ENSG00000068793):c.35-232A>G" + ], + "reference": "A", + "start": 22953978, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22953978, + "id": "15:22953978:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22953978, + "strand": "+", + "studies": [], + "type": "SNV" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558549", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558826", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.1200000047683716, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -3.9730000495910645, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.38000011444091797, + "source": "cadd_raw" + }, + { + "score": 0.4399999976158142, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.1527-120T>G", + "ENST00000560848(ENSG00000068793):c.1527-120T>G", + "ENST00000557859(ENSG00000068793):c.202-120T>G" + ], + "id": "rs2289816", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.8295874, + "altHomGenotypeFreq": 0.6911717, + "hetGenotypeFreq": 0.2768314, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.17041259, + "refHomGenotypeFreq": 0.03199689, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.83572894, + "altHomGenotypeFreq": 0.7063655, + "hetGenotypeFreq": 0.2587269, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.16427104, + "refHomGenotypeFreq": 0.034907598, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7852723, + "altHomGenotypeFreq": 0.605198, + "hetGenotypeFreq": 0.36014852, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.21472773, + "refHomGenotypeFreq": 0.034653466, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.82100236, + "altHomGenotypeFreq": 0.6610978, + "hetGenotypeFreq": 0.31980908, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.1789976, + "refHomGenotypeFreq": 0.01909308, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8774834, + "altHomGenotypeFreq": 0.7549669, + "hetGenotypeFreq": 0.24503312, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.12251656, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8055556, + "altHomGenotypeFreq": 0.6586483, + "hetGenotypeFreq": 0.29381442, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.19444445, + "refHomGenotypeFreq": 0.047537226, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.79147714, + "altHomGenotypeFreq": 0.62603694, + "hetGenotypeFreq": 0.33088037, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.20852289, + "refHomGenotypeFreq": 0.043082688, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9113459, + "altHomGenotypeFreq": 0.83096004, + "hetGenotypeFreq": 0.1607717, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.08865411, + "refHomGenotypeFreq": 0.0082682595, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.83182883, + "altHomGenotypeFreq": 0.69237983, + "hetGenotypeFreq": 0.278898, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.16817117, + "refHomGenotypeFreq": 0.028722158, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8268201, + "altHomGenotypeFreq": 0.6896801, + "hetGenotypeFreq": 0.27427992, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.17317991, + "refHomGenotypeFreq": 0.03603995, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.77955914, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.22044088, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8046875, + "altHomGenotypeFreq": 0.640625, + "hetGenotypeFreq": 0.328125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.1953125, + "refHomGenotypeFreq": 0.03125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.84584665, + "altHomGenotypeFreq": 0.72284347, + "hetGenotypeFreq": 0.24600638, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.15415336, + "refHomGenotypeFreq": 0.03115016, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.84458077, + "altHomGenotypeFreq": 0.71779144, + "hetGenotypeFreq": 0.25357872, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.15541922, + "refHomGenotypeFreq": 0.028629856, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7765958, + "altHomGenotypeFreq": 0.5851064, + "hetGenotypeFreq": 0.38297874, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.22340426, + "refHomGenotypeFreq": 0.031914894, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8382353, + "altHomGenotypeFreq": 0.6960784, + "hetGenotypeFreq": 0.28431374, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.16176471, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.94478065, + "altHomGenotypeFreq": 0.892587, + "hetGenotypeFreq": 0.10438729, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.055219363, + "refHomGenotypeFreq": 0.0030257185, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7952381, + "altHomGenotypeFreq": 0.63809526, + "hetGenotypeFreq": 0.31428573, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.20476191, + "refHomGenotypeFreq": 0.04761905, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6875, + "altHomGenotypeFreq": 0.47115386, + "hetGenotypeFreq": 0.4326923, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.3125, + "refHomGenotypeFreq": 0.09615385, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9537037, + "altHomGenotypeFreq": 0.9074074, + "hetGenotypeFreq": 0.09259259, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.046296295, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8854167, + "altHomGenotypeFreq": 0.78125, + "hetGenotypeFreq": 0.20833334, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.114583336, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.94690263, + "altHomGenotypeFreq": 0.8938053, + "hetGenotypeFreq": 0.10619469, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.053097345, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7941176, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.25490198, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.20588236, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.78571427, + "altHomGenotypeFreq": 0.63736266, + "hetGenotypeFreq": 0.2967033, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.21428572, + "refHomGenotypeFreq": 0.06593407, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8548387, + "altHomGenotypeFreq": 0.72043014, + "hetGenotypeFreq": 0.2688172, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.14516129, + "refHomGenotypeFreq": 0.010752688, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.84343433, + "altHomGenotypeFreq": 0.7171717, + "hetGenotypeFreq": 0.25252527, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.15656565, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7990654, + "altHomGenotypeFreq": 0.6448598, + "hetGenotypeFreq": 0.3084112, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.20093457, + "refHomGenotypeFreq": 0.046728972, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8488372, + "altHomGenotypeFreq": 0.7093023, + "hetGenotypeFreq": 0.27906978, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.15116279, + "refHomGenotypeFreq": 0.011627907, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9322917, + "altHomGenotypeFreq": 0.8645833, + "hetGenotypeFreq": 0.13541666, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.067708336, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8989899, + "hetGenotypeFreq": 0.09090909, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.93939394, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.1010101, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.060606062, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.80417496, + "altHomGenotypeFreq": 0.6560636, + "hetGenotypeFreq": 0.29622266, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.19582506, + "refHomGenotypeFreq": 0.04771372, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.92622954, + "altHomGenotypeFreq": 0.852459, + "hetGenotypeFreq": 0.14754099, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.07377049, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8112392, + "altHomGenotypeFreq": 0.6570605, + "hetGenotypeFreq": 0.30835736, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.1887608, + "refHomGenotypeFreq": 0.034582134, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9647059, + "altHomGenotypeFreq": 0.92941177, + "hetGenotypeFreq": 0.07058824, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.03529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8592233, + "altHomGenotypeFreq": 0.7378641, + "hetGenotypeFreq": 0.24271846, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.1407767, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.84343433, + "altHomGenotypeFreq": 0.7171717, + "hetGenotypeFreq": 0.25252527, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.15656565, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.80841124, + "altHomGenotypeFreq": 0.6542056, + "hetGenotypeFreq": 0.3084112, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.19158879, + "refHomGenotypeFreq": 0.037383176, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.86538464, + "altHomGenotypeFreq": 0.75961536, + "hetGenotypeFreq": 0.21153846, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.13461539, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7828283, + "altHomGenotypeFreq": 0.6262626, + "hetGenotypeFreq": 0.31313133, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.21717171, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7882353, + "altHomGenotypeFreq": 0.62352943, + "hetGenotypeFreq": 0.32941177, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.21176471, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7827381, + "altHomGenotypeFreq": 0.61706346, + "hetGenotypeFreq": 0.3313492, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.21726191, + "refHomGenotypeFreq": 0.051587302, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74271846, + "altHomGenotypeFreq": 0.5533981, + "hetGenotypeFreq": 0.37864077, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.25728154, + "refHomGenotypeFreq": 0.067961164, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4213483, + "altHomGenotypeFreq": 0.36329588, + "hetGenotypeFreq": 0.11610487, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.57865167, + "refHomGenotypeFreq": 0.52059925, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7878868, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.2121132, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7909905, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.20900951, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7830825, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.21691748, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.79288024, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.20711975, + "study": "UK10K" + } + ], + "reference": "T", + "start": 22955013, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22955013, + "id": "15:22955013:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 22955013, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "cdnaPosition": 150, + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558549", + "exonOverlap": [ + { + "number": "1/3", + "percentage": 0.34843206 + } + ], + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + }, + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558826", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.3700000047683716, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -0.13600000739097595, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "3_prime_UTR_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.1674+30delC", + "ENST00000560848(ENSG00000068793):c.1674+30delC", + "ENST00000557859(ENSG00000068793):c.349+30delC", + "ENST00000558549(ENSG00000068793):c.*15delC" + ], + "id": "rs3217548", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.56836474, + "altHomGenotypeFreq": 0.33784413, + "hetGenotypeFreq": 0.4610412, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.43163526, + "refHomGenotypeFreq": 0.20111467, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6192619, + "altHomGenotypeFreq": 0.38838884, + "hetGenotypeFreq": 0.4617462, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.38073808, + "refHomGenotypeFreq": 0.14986499, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.48202276, + "altHomGenotypeFreq": 0.23409209, + "hetGenotypeFreq": 0.49586135, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.51797724, + "refHomGenotypeFreq": 0.27004656, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.34619334, + "altHomGenotypeFreq": 0.13302752, + "hetGenotypeFreq": 0.42633164, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6538066, + "refHomGenotypeFreq": 0.44064084, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6888889, + "altHomGenotypeFreq": 0.47824726, + "hetGenotypeFreq": 0.42128325, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.31111112, + "refHomGenotypeFreq": 0.100469485, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5972601, + "altHomGenotypeFreq": 0.35790113, + "hetGenotypeFreq": 0.478718, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.40273985, + "refHomGenotypeFreq": 0.16338085, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6346639, + "altHomGenotypeFreq": 0.40213302, + "hetGenotypeFreq": 0.46506172, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.36533612, + "refHomGenotypeFreq": 0.13280524, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.43633288, + "altHomGenotypeFreq": 0.18453169, + "hetGenotypeFreq": 0.5036024, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5636671, + "refHomGenotypeFreq": 0.3118659, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.58491117, + "altHomGenotypeFreq": 0.3553015, + "hetGenotypeFreq": 0.45921934, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.41508883, + "refHomGenotypeFreq": 0.18547918, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.548645, + "altHomGenotypeFreq": 0.31703877, + "hetGenotypeFreq": 0.4632125, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.45135498, + "refHomGenotypeFreq": 0.21974875, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5540734, + "altHomGenotypeFreq": 0.31428942, + "hetGenotypeFreq": 0.47956795, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.4459266, + "refHomGenotypeFreq": 0.20614263, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.642418, + "altHomGenotypeFreq": 0.42008197, + "hetGenotypeFreq": 0.44467214, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.35758197, + "refHomGenotypeFreq": 0.1352459, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.47091585, + "altHomGenotypeFreq": 0.22153465, + "hetGenotypeFreq": 0.49876237, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.52908415, + "refHomGenotypeFreq": 0.27970296, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.39328536, + "altHomGenotypeFreq": 0.15347722, + "hetGenotypeFreq": 0.4796163, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6067146, + "refHomGenotypeFreq": 0.36690646, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.72516555, + "altHomGenotypeFreq": 0.49668875, + "hetGenotypeFreq": 0.45695364, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.27483442, + "refHomGenotypeFreq": 0.046357617, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6133754, + "altHomGenotypeFreq": 0.38059703, + "hetGenotypeFreq": 0.46555683, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.38662457, + "refHomGenotypeFreq": 0.15384616, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.61571026, + "altHomGenotypeFreq": 0.37723425, + "hetGenotypeFreq": 0.47695202, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.38428974, + "refHomGenotypeFreq": 0.14581373, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.43913445, + "altHomGenotypeFreq": 0.19370516, + "hetGenotypeFreq": 0.49085858, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5608655, + "refHomGenotypeFreq": 0.31543624, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5496763, + "altHomGenotypeFreq": 0.30924073, + "hetGenotypeFreq": 0.4808711, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.45032373, + "refHomGenotypeFreq": 0.20988818, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5595082, + "altHomGenotypeFreq": 0.3205296, + "hetGenotypeFreq": 0.47795722, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.44049177, + "refHomGenotypeFreq": 0.20151317, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.44311237, + "altHomGenotypeFreq": 0.2054537, + "hetGenotypeFreq": 0.47531736, + "population": "AA", + "refAllele": "C", + "refAlleleFreq": 0.5568876, + "refHomGenotypeFreq": 0.31922895, + "study": "ESP6500" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5577877, + "altHomGenotypeFreq": 0.3267168, + "hetGenotypeFreq": 0.46214184, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.44221225, + "refHomGenotypeFreq": 0.21114135, + "study": "ESP6500" + }, + { + "altAllele": "", + "altAlleleFreq": 0.61699027, + "altHomGenotypeFreq": 0.38932037, + "hetGenotypeFreq": 0.45533982, + "population": "EA", + "refAllele": "C", + "refAlleleFreq": 0.3830097, + "refHomGenotypeFreq": 0.1553398, + "study": "ESP6500" + }, + { + "altAllele": "", + "altAlleleFreq": 0.62625253, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.3737475, + "study": "GONL" + }, + { + "altAllele": "", + "altAlleleFreq": 0.58364105, + "altHomGenotypeFreq": 0.34816098, + "hetGenotypeFreq": 0.47096017, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.41635892, + "refHomGenotypeFreq": 0.18087885, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.66062176, + "altHomGenotypeFreq": 0.44818652, + "hetGenotypeFreq": 0.42487046, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.33937824, + "refHomGenotypeFreq": 0.126943, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6715823, + "altHomGenotypeFreq": 0.45130774, + "hetGenotypeFreq": 0.44054908, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.32841772, + "refHomGenotypeFreq": 0.1081432, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4846827, + "altHomGenotypeFreq": 0.22635546, + "hetGenotypeFreq": 0.5166545, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.51531726, + "refHomGenotypeFreq": 0.25699005, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.34629896, + "altHomGenotypeFreq": 0.12756018, + "hetGenotypeFreq": 0.43747753, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.65370107, + "refHomGenotypeFreq": 0.43496227, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.59905064, + "altHomGenotypeFreq": 0.35791138, + "hetGenotypeFreq": 0.48227847, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.40094936, + "refHomGenotypeFreq": 0.15981013, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.64205515, + "altHomGenotypeFreq": 0.4075837, + "hetGenotypeFreq": 0.46894288, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.35794485, + "refHomGenotypeFreq": 0.123473406, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4506608, + "altHomGenotypeFreq": 0.192511, + "hetGenotypeFreq": 0.51629955, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.54933923, + "refHomGenotypeFreq": 0.29118943, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3515625, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.6484375, + "refHomGenotypeFreq": 0.421875, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5263578, + "altHomGenotypeFreq": 0.2959265, + "hetGenotypeFreq": 0.4608626, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.47364217, + "refHomGenotypeFreq": 0.24321087, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6595092, + "altHomGenotypeFreq": 0.45194274, + "hetGenotypeFreq": 0.4151329, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.3404908, + "refHomGenotypeFreq": 0.13292433, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.44680852, + "altHomGenotypeFreq": 0.21276596, + "hetGenotypeFreq": 0.4680851, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.5531915, + "refHomGenotypeFreq": 0.31914893, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6617647, + "altHomGenotypeFreq": 0.42156863, + "hetGenotypeFreq": 0.48039216, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.3382353, + "refHomGenotypeFreq": 0.09803922, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.42889562, + "altHomGenotypeFreq": 0.18154311, + "hetGenotypeFreq": 0.494705, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5711044, + "refHomGenotypeFreq": 0.3237519, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.53809524, + "altHomGenotypeFreq": 0.31428573, + "hetGenotypeFreq": 0.44761905, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.46190476, + "refHomGenotypeFreq": 0.23809524, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.1826923, + "hetGenotypeFreq": 0.5192308, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.29807693, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4537037, + "altHomGenotypeFreq": 0.2685185, + "hetGenotypeFreq": 0.37037036, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.5462963, + "refHomGenotypeFreq": 0.3611111, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.7083333, + "altHomGenotypeFreq": 0.5208333, + "hetGenotypeFreq": 0.375, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.29166666, + "refHomGenotypeFreq": 0.104166664, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4159292, + "altHomGenotypeFreq": 0.14159292, + "hetGenotypeFreq": 0.54867256, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.5840708, + "refHomGenotypeFreq": 0.30973452, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.63235295, + "altHomGenotypeFreq": 0.43137255, + "hetGenotypeFreq": 0.4019608, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.36764705, + "refHomGenotypeFreq": 0.16666667, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.64285713, + "altHomGenotypeFreq": 0.3956044, + "hetGenotypeFreq": 0.49450552, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.35714287, + "refHomGenotypeFreq": 0.10989011, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5913978, + "altHomGenotypeFreq": 0.3655914, + "hetGenotypeFreq": 0.4516129, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.40860215, + "refHomGenotypeFreq": 0.1827957, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5050505, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.50505054, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.4949495, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.635514, + "altHomGenotypeFreq": 0.40186915, + "hetGenotypeFreq": 0.46728972, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.36448598, + "refHomGenotypeFreq": 0.13084112, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.64534885, + "altHomGenotypeFreq": 0.39534885, + "hetGenotypeFreq": 0.5, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.35465115, + "refHomGenotypeFreq": 0.10465116, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.421875, + "altHomGenotypeFreq": 0.1875, + "hetGenotypeFreq": 0.46875, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.578125, + "refHomGenotypeFreq": 0.34375, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.42929292, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.5151515, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.5707071, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.47474748, + "altHomGenotypeFreq": 0.1919192, + "hetGenotypeFreq": 0.56565654, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.5252525, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6411531, + "altHomGenotypeFreq": 0.4075547, + "hetGenotypeFreq": 0.46719682, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.35884693, + "refHomGenotypeFreq": 0.1252485, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4180328, + "altHomGenotypeFreq": 0.19672132, + "hetGenotypeFreq": 0.44262296, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.58196723, + "refHomGenotypeFreq": 0.36065573, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.389049, + "altHomGenotypeFreq": 0.16714698, + "hetGenotypeFreq": 0.44380406, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.610951, + "refHomGenotypeFreq": 0.389049, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3764706, + "altHomGenotypeFreq": 0.105882354, + "hetGenotypeFreq": 0.5411765, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.62352943, + "refHomGenotypeFreq": 0.3529412, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.65048546, + "altHomGenotypeFreq": 0.4854369, + "hetGenotypeFreq": 0.33009708, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.34951457, + "refHomGenotypeFreq": 0.18446602, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6363636, + "altHomGenotypeFreq": 0.3939394, + "hetGenotypeFreq": 0.4848485, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.36363637, + "refHomGenotypeFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6542056, + "altHomGenotypeFreq": 0.42990655, + "hetGenotypeFreq": 0.44859815, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.34579438, + "refHomGenotypeFreq": 0.12149533, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.52403843, + "altHomGenotypeFreq": 0.26923078, + "hetGenotypeFreq": 0.50961536, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.47596154, + "refHomGenotypeFreq": 0.22115384, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6363636, + "altHomGenotypeFreq": 0.41414142, + "hetGenotypeFreq": 0.44444445, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.36363637, + "refHomGenotypeFreq": 0.14141414, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.1882353, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.32941177, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.8117647, + "refHomGenotypeFreq": 0.64705884, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5049603, + "altHomGenotypeFreq": 0.2718254, + "hetGenotypeFreq": 0.46626985, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.49503967, + "refHomGenotypeFreq": 0.26190478, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4563107, + "altHomGenotypeFreq": 0.2524272, + "hetGenotypeFreq": 0.407767, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5436893, + "refHomGenotypeFreq": 0.3398058, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6399101, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.36008993, + "study": "UK10K" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6491326, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.35086736, + "study": "UK10K" + }, + { + "altAllele": "", + "altAlleleFreq": 0.62921643, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.3707836, + "study": "UK10K" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6510248, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.34897518, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22955308, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22955308, + "id": "15:22955308:C:-", + "length": 1, + "names": [], + "reference": "C", + "start": 22955308, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558549", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558826", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 17, + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561296", + "exonOverlap": [ + { + "number": "1/4", + "percentage": 0.4854369 + } + ], + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.399999976158142, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": 0.5329999923706055, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.11999988555908203, + "source": "cadd_raw" + }, + { + "score": 3.8399999141693115, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.1986-93A>G", + "ENST00000560848(ENSG00000068793):c.1986-93A>G", + "ENST00000435939(ENSG00000068793):c.693-93A>G", + "ENST00000558826(ENSG00000068793):n.379-93A>G", + "ENST00000561296(ENSG00000068793):n.17A>G" + ], + "id": "rs2289817", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.18661015, + "altHomGenotypeFreq": 0.037147295, + "hetGenotypeFreq": 0.2989257, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.81338984, + "refHomGenotypeFreq": 0.663927, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12269939, + "altHomGenotypeFreq": 0.030674847, + "hetGenotypeFreq": 0.18404908, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.8773006, + "refHomGenotypeFreq": 0.78527606, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2158809, + "altHomGenotypeFreq": 0.03101737, + "hetGenotypeFreq": 0.36972705, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.7841191, + "refHomGenotypeFreq": 0.59925556, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18615752, + "altHomGenotypeFreq": 0.040572792, + "hetGenotypeFreq": 0.29116946, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.8138425, + "refHomGenotypeFreq": 0.6682578, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08940397, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17880794, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.910596, + "refHomGenotypeFreq": 0.821192, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10246136, + "altHomGenotypeFreq": 0.009730968, + "hetGenotypeFreq": 0.18546079, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.89753866, + "refHomGenotypeFreq": 0.80480826, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1558745, + "altHomGenotypeFreq": 0.02283044, + "hetGenotypeFreq": 0.26608813, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.8441255, + "refHomGenotypeFreq": 0.71108145, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27850574, + "altHomGenotypeFreq": 0.075632185, + "hetGenotypeFreq": 0.40574712, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.72149426, + "refHomGenotypeFreq": 0.51862067, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.189417, + "altHomGenotypeFreq": 0.03699368, + "hetGenotypeFreq": 0.30484664, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.810583, + "refHomGenotypeFreq": 0.6581597, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18314038, + "altHomGenotypeFreq": 0.03733719, + "hetGenotypeFreq": 0.29160637, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.8168596, + "refHomGenotypeFreq": 0.67105645, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18136272, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.81863725, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1953125, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.265625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.8046875, + "refHomGenotypeFreq": 0.671875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20507188, + "altHomGenotypeFreq": 0.04672524, + "hetGenotypeFreq": 0.3166933, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.79492813, + "refHomGenotypeFreq": 0.6365815, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13496932, + "altHomGenotypeFreq": 0.024539877, + "hetGenotypeFreq": 0.2208589, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.86503065, + "refHomGenotypeFreq": 0.75460124, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22340426, + "altHomGenotypeFreq": 0.06382979, + "hetGenotypeFreq": 0.31914893, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.7765958, + "refHomGenotypeFreq": 0.61702126, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16176471, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.28431374, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.8382353, + "refHomGenotypeFreq": 0.6960784, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3192133, + "altHomGenotypeFreq": 0.0816944, + "hetGenotypeFreq": 0.4750378, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.68078667, + "refHomGenotypeFreq": 0.44326776, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17142858, + "altHomGenotypeFreq": 0.04761905, + "hetGenotypeFreq": 0.24761906, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.82857144, + "refHomGenotypeFreq": 0.7047619, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3028846, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.47115386, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.69711536, + "refHomGenotypeFreq": 0.46153846, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.09259259, + "hetGenotypeFreq": 0.4814815, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.42592594, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.098958336, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.15625, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.9010417, + "refHomGenotypeFreq": 0.8229167, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32743362, + "altHomGenotypeFreq": 0.07079646, + "hetGenotypeFreq": 0.5132743, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.67256635, + "refHomGenotypeFreq": 0.4159292, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.25490198, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.7058824, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15934066, + "altHomGenotypeFreq": 0.021978023, + "hetGenotypeFreq": 0.2747253, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.8406593, + "refHomGenotypeFreq": 0.7032967, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12903225, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.23655914, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.87096775, + "refHomGenotypeFreq": 0.75268817, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.24242423, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.7070707, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13084112, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.24299064, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.86915886, + "refHomGenotypeFreq": 0.74766356, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.11046512, + "altHomGenotypeFreq": 0.023255814, + "hetGenotypeFreq": 0.1744186, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.8895349, + "refHomGenotypeFreq": 0.8023256, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34375, + "altHomGenotypeFreq": 0.083333336, + "hetGenotypeFreq": 0.5208334, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.65625, + "refHomGenotypeFreq": 0.39583334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2929293, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.44444442, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.7070707, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26767677, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.39393938, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.7323232, + "refHomGenotypeFreq": 0.53535354, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13021868, + "altHomGenotypeFreq": 0.019880716, + "hetGenotypeFreq": 0.22067595, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.8697813, + "refHomGenotypeFreq": 0.75944334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26229507, + "altHomGenotypeFreq": 0.06557377, + "hetGenotypeFreq": 0.39344263, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.73770493, + "refHomGenotypeFreq": 0.5409836, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19308357, + "altHomGenotypeFreq": 0.04610951, + "hetGenotypeFreq": 0.2939481, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.8069164, + "refHomGenotypeFreq": 0.6599424, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39411765, + "altHomGenotypeFreq": 0.11764706, + "hetGenotypeFreq": 0.5529412, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.60588235, + "refHomGenotypeFreq": 0.32941177, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13106796, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.22330096, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.86893207, + "refHomGenotypeFreq": 0.75728154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10606061, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.1919192, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.8939394, + "refHomGenotypeFreq": 0.7979798, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08411215, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.1495327, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.91588783, + "refHomGenotypeFreq": 0.8411215, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13942307, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.22115386, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.8605769, + "refHomGenotypeFreq": 0.75, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17676768, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.25252524, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.82323235, + "refHomGenotypeFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22352941, + "altHomGenotypeFreq": 0.03529412, + "hetGenotypeFreq": 0.3764706, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.7764706, + "refHomGenotypeFreq": 0.5882353, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20634921, + "altHomGenotypeFreq": 0.049603175, + "hetGenotypeFreq": 0.31349206, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.7936508, + "refHomGenotypeFreq": 0.6369048, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24757281, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.3592233, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.75242716, + "refHomGenotypeFreq": 0.57281554, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12734082, + "altHomGenotypeFreq": 0.033707865, + "hetGenotypeFreq": 0.18726592, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.87265915, + "refHomGenotypeFreq": 0.7790262, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14625761, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.85374236, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14045887, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.8595411, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15256876, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.84743124, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13969795, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.86030203, + "study": "UK10K" + } + ], + "reference": "A", + "start": 22960700, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22960700, + "id": "15:22960700:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22960700, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "cdnaPosition": 2186, + "cdsPosition": 2061, + "codon": "ctG/ctC", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "exonOverlap": [ + { + "number": "18/31", + "percentage": 1.0309278 + } + ], + "geneName": "CYFIP1", + "proteinVariantAnnotation": { + "alternate": "LEU", + "position": 687, + "reference": "LEU" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 2252, + "cdsPosition": 2061, + "codon": "ctG/ctC", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "exonOverlap": [ + { + "number": "19/32", + "percentage": 1.0309278 + } + ], + "geneName": "CYFIP1", + "proteinVariantAnnotation": { + "alternate": "LEU", + "position": 687, + "reference": "LEU" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558549", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 1070, + "cdsPosition": 768, + "codon": "ctG/ctC", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "exonOverlap": [ + { + "number": "3/16", + "percentage": 1.0309278 + } + ], + "geneName": "CYFIP1", + "proteinVariantAnnotation": { + "alternate": "LEU", + "position": 256, + "reference": "LEU" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "cdnaPosition": 454, + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558826", + "exonOverlap": [ + { + "number": "2/6", + "percentage": 1.0309278 + } + ], + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 185, + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561296", + "exonOverlap": [ + { + "number": "1/4", + "percentage": 0.4854369 + } + ], + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 3.559999942779541, + "source": "gerp" + }, + { + "score": 0.9639999866485596, + "source": "phastCons" + }, + { + "score": -0.11999999731779099, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": 1.119999885559082, + "source": "cadd_raw" + }, + { + "score": 11.369999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.2061G>C", + "ENSP00000324549:p.Leu687=", + "ENST00000560848(ENSG00000068793):c.2061G>C", + "ENSP00000454199:p.Leu687=", + "ENST00000435939(ENSG00000068793):c.768G>C", + "ENSP00000405956:p.Leu256=", + "ENST00000558826(ENSG00000068793):n.454G>C", + "ENST00000561296(ENSG00000068793):n.185G>C" + ], + "id": "rs2289818", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.39013147, + "altHomGenotypeFreq": 0.1659309, + "hetGenotypeFreq": 0.44840112, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6098685, + "refHomGenotypeFreq": 0.38566798, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35505125, + "altHomGenotypeFreq": 0.12005857, + "hetGenotypeFreq": 0.46998537, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.6449488, + "refHomGenotypeFreq": 0.40995607, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44991273, + "altHomGenotypeFreq": 0.20325771, + "hetGenotypeFreq": 0.49331006, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5500873, + "refHomGenotypeFreq": 0.30343223, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5637903, + "altHomGenotypeFreq": 0.32625216, + "hetGenotypeFreq": 0.4750763, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.43620968, + "refHomGenotypeFreq": 0.19867153, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35595286, + "altHomGenotypeFreq": 0.13084112, + "hetGenotypeFreq": 0.45022348, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.64404714, + "refHomGenotypeFreq": 0.4189354, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.323881, + "altHomGenotypeFreq": 0.11001258, + "hetGenotypeFreq": 0.42773682, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.676119, + "refHomGenotypeFreq": 0.4622506, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32501435, + "altHomGenotypeFreq": 0.107027434, + "hetGenotypeFreq": 0.43597385, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.67498565, + "refHomGenotypeFreq": 0.4569987, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6450177, + "altHomGenotypeFreq": 0.41495353, + "hetGenotypeFreq": 0.46012834, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.35498232, + "refHomGenotypeFreq": 0.12491816, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3749517, + "altHomGenotypeFreq": 0.15124439, + "hetGenotypeFreq": 0.44741458, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.62504834, + "refHomGenotypeFreq": 0.40134102, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40852427, + "altHomGenotypeFreq": 0.18372604, + "hetGenotypeFreq": 0.4495965, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.5914757, + "refHomGenotypeFreq": 0.36667746, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42924163, + "altHomGenotypeFreq": 0.20273069, + "hetGenotypeFreq": 0.45302188, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5707584, + "refHomGenotypeFreq": 0.34424743, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31632653, + "altHomGenotypeFreq": 0.11632653, + "hetGenotypeFreq": 0.4, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.68367344, + "refHomGenotypeFreq": 0.48367348, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48760843, + "altHomGenotypeFreq": 0.2354399, + "hetGenotypeFreq": 0.5043371, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.51239157, + "refHomGenotypeFreq": 0.26022306, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53818613, + "altHomGenotypeFreq": 0.3078759, + "hetGenotypeFreq": 0.46062052, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.46181384, + "refHomGenotypeFreq": 0.23150358, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34768212, + "altHomGenotypeFreq": 0.0794702, + "hetGenotypeFreq": 0.53642386, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.6523179, + "refHomGenotypeFreq": 0.38410595, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3028048, + "altHomGenotypeFreq": 0.08643389, + "hetGenotypeFreq": 0.43274185, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6971952, + "refHomGenotypeFreq": 0.48082426, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34269887, + "altHomGenotypeFreq": 0.11879338, + "hetGenotypeFreq": 0.447811, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.6573011, + "refHomGenotypeFreq": 0.43339562, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6233901, + "altHomGenotypeFreq": 0.39190432, + "hetGenotypeFreq": 0.46297148, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.37660992, + "refHomGenotypeFreq": 0.1451242, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43535542, + "altHomGenotypeFreq": 0.20892376, + "hetGenotypeFreq": 0.45286334, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.5646446, + "refHomGenotypeFreq": 0.3382129, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42169198, + "altHomGenotypeFreq": 0.19508316, + "hetGenotypeFreq": 0.45321766, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.57830805, + "refHomGenotypeFreq": 0.3516992, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6266455, + "altHomGenotypeFreq": 0.3894689, + "hetGenotypeFreq": 0.47435316, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.37335452, + "refHomGenotypeFreq": 0.13617794, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4331078, + "altHomGenotypeFreq": 0.20805782, + "hetGenotypeFreq": 0.45009995, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5668922, + "refHomGenotypeFreq": 0.34184223, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3339535, + "altHomGenotypeFreq": 0.115116276, + "hetGenotypeFreq": 0.43767443, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.6660465, + "refHomGenotypeFreq": 0.4472093, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34268537, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.65731466, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3893771, + "altHomGenotypeFreq": 0.16539238, + "hetGenotypeFreq": 0.4479694, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6106229, + "refHomGenotypeFreq": 0.3866382, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34181416, + "altHomGenotypeFreq": 0.117256634, + "hetGenotypeFreq": 0.44911504, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.65818584, + "refHomGenotypeFreq": 0.43362832, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34149155, + "altHomGenotypeFreq": 0.12194826, + "hetGenotypeFreq": 0.43908662, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.6585084, + "refHomGenotypeFreq": 0.43896514, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45683035, + "altHomGenotypeFreq": 0.21154293, + "hetGenotypeFreq": 0.4905748, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5431697, + "refHomGenotypeFreq": 0.29788223, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.58413005, + "altHomGenotypeFreq": 0.34468973, + "hetGenotypeFreq": 0.47888058, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.41586998, + "refHomGenotypeFreq": 0.17642969, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32313547, + "altHomGenotypeFreq": 0.10167427, + "hetGenotypeFreq": 0.44292238, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.67686456, + "refHomGenotypeFreq": 0.45540336, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3270406, + "altHomGenotypeFreq": 0.10863216, + "hetGenotypeFreq": 0.4368169, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.6729594, + "refHomGenotypeFreq": 0.45455092, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6384556, + "altHomGenotypeFreq": 0.40496823, + "hetGenotypeFreq": 0.46697477, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.3615444, + "refHomGenotypeFreq": 0.128057, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.578125, + "altHomGenotypeFreq": 0.390625, + "hetGenotypeFreq": 0.375, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.421875, + "refHomGenotypeFreq": 0.234375, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45646966, + "altHomGenotypeFreq": 0.23682109, + "hetGenotypeFreq": 0.43929714, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.54353034, + "refHomGenotypeFreq": 0.32388178, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29856852, + "altHomGenotypeFreq": 0.09406953, + "hetGenotypeFreq": 0.40899795, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.7014315, + "refHomGenotypeFreq": 0.4969325, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5106383, + "altHomGenotypeFreq": 0.26595744, + "hetGenotypeFreq": 0.4893617, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.4893617, + "refHomGenotypeFreq": 0.24468085, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3137255, + "altHomGenotypeFreq": 0.078431375, + "hetGenotypeFreq": 0.47058827, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.6862745, + "refHomGenotypeFreq": 0.4509804, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65733737, + "altHomGenotypeFreq": 0.43267778, + "hetGenotypeFreq": 0.4493192, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.34266263, + "refHomGenotypeFreq": 0.118003026, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40952381, + "altHomGenotypeFreq": 0.20952381, + "hetGenotypeFreq": 0.4, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.5904762, + "refHomGenotypeFreq": 0.3904762, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5048077, + "altHomGenotypeFreq": 0.24038461, + "hetGenotypeFreq": 0.52884614, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.49519232, + "refHomGenotypeFreq": 0.23076923, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6944444, + "altHomGenotypeFreq": 0.49074075, + "hetGenotypeFreq": 0.4074074, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.30555555, + "refHomGenotypeFreq": 0.10185185, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.4166667, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.45833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6902655, + "altHomGenotypeFreq": 0.5221239, + "hetGenotypeFreq": 0.33628318, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.30973452, + "refHomGenotypeFreq": 0.14159292, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25490198, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.29411766, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.74509805, + "refHomGenotypeFreq": 0.5980392, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32417583, + "altHomGenotypeFreq": 0.08791209, + "hetGenotypeFreq": 0.4725275, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.67582417, + "refHomGenotypeFreq": 0.43956044, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34946236, + "altHomGenotypeFreq": 0.10752688, + "hetGenotypeFreq": 0.48387095, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.6505376, + "refHomGenotypeFreq": 0.40860215, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43939394, + "altHomGenotypeFreq": 0.23232323, + "hetGenotypeFreq": 0.41414142, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.56060606, + "refHomGenotypeFreq": 0.35353535, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3084112, + "altHomGenotypeFreq": 0.08411215, + "hetGenotypeFreq": 0.44859815, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.69158876, + "refHomGenotypeFreq": 0.46728972, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24418604, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.39534885, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.75581396, + "refHomGenotypeFreq": 0.55813956, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65625, + "altHomGenotypeFreq": 0.42708334, + "hetGenotypeFreq": 0.4583333, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.34375, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64141417, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.5151515, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.35858586, + "refHomGenotypeFreq": 0.1010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5707071, + "altHomGenotypeFreq": 0.28282827, + "hetGenotypeFreq": 0.5757576, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.42929292, + "refHomGenotypeFreq": 0.14141414, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32007954, + "altHomGenotypeFreq": 0.10934394, + "hetGenotypeFreq": 0.42147118, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.6799205, + "refHomGenotypeFreq": 0.4691849, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.56557375, + "altHomGenotypeFreq": 0.32786885, + "hetGenotypeFreq": 0.47540984, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.43442622, + "refHomGenotypeFreq": 0.19672132, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5201729, + "altHomGenotypeFreq": 0.2939481, + "hetGenotypeFreq": 0.45244956, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.47982708, + "refHomGenotypeFreq": 0.2536023, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7529412, + "altHomGenotypeFreq": 0.5529412, + "hetGenotypeFreq": 0.4, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.24705882, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3398058, + "altHomGenotypeFreq": 0.106796116, + "hetGenotypeFreq": 0.46601942, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.66019416, + "refHomGenotypeFreq": 0.42718446, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30808082, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.3939394, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6919192, + "refHomGenotypeFreq": 0.4949495, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2897196, + "altHomGenotypeFreq": 0.12149533, + "hetGenotypeFreq": 0.3364486, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.71028036, + "refHomGenotypeFreq": 0.5420561, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37019232, + "altHomGenotypeFreq": 0.13461539, + "hetGenotypeFreq": 0.47115386, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.6298077, + "refHomGenotypeFreq": 0.39423078, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37373737, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.46464646, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.6262626, + "refHomGenotypeFreq": 0.3939394, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67058825, + "altHomGenotypeFreq": 0.44705883, + "hetGenotypeFreq": 0.44705883, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.32941177, + "refHomGenotypeFreq": 0.105882354, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43849206, + "altHomGenotypeFreq": 0.20634921, + "hetGenotypeFreq": 0.46428573, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.56150794, + "refHomGenotypeFreq": 0.32936507, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48058254, + "altHomGenotypeFreq": 0.23300971, + "hetGenotypeFreq": 0.49514565, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.51941746, + "refHomGenotypeFreq": 0.27184466, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.33707866, + "altHomGenotypeFreq": 0.13483146, + "hetGenotypeFreq": 0.40449437, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.66292137, + "refHomGenotypeFreq": 0.46067417, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.335881, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.664119, + "study": "DISCOVEHR" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30759057, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6924094, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3080582, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.6919418, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30799168, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.6920083, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30717367, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.69282633, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22960868, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754244", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25496518" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754244", + "somaticInformation": { + "primaryHistology": "osteosarcoma", + "primarySite": "bone", + "sampleSource": "surgery - NOS", + "siteSubtype": "femur", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1_ENST00000435939" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754245", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754244", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25496518" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1_ENST00000435939" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754245", + "somaticInformation": { + "primaryHistology": "osteosarcoma", + "primarySite": "bone", + "sampleSource": "surgery - NOS", + "siteSubtype": "femur", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1_ENST00000435939" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754245", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754244", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1_ENST00000435939" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754245", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754244", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1_ENST00000435939" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM3754245", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "CYFIP1", + "histologySubtype": "", + "mutationId": "COSM3754244", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "", + "mutationId": "COSM3754244", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "osteosarcoma", + "primarySite": "bone", + "sampleSource": "surgery - NOS", + "siteSubtype": "femur", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1_ENST00000435939", + "histologySubtype": "", + "mutationId": "COSM3754245", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM3754244", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1_ENST00000435939", + "histologySubtype": "", + "mutationId": "COSM3754245", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "osteosarcoma", + "primarySite": "bone", + "sampleSource": "surgery - NOS", + "siteSubtype": "femur", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1_ENST00000435939", + "histologySubtype": "", + "mutationId": "COSM3754245", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "", + "mutationId": "COSM3754244", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1_ENST00000435939", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM3754245", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM3754244", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "CYFIP1_ENST00000435939", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM3754245", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 22960868, + "id": "15:22960868:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22960868, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558826", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561296", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.490000009536743, + "source": "gerp" + }, + { + "score": 0.027000000700354576, + "source": "phastCons" + }, + { + "score": -0.734000027179718, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.2200002670288086, + "source": "cadd_raw" + }, + { + "score": 1.0299999713897705, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.2083-341G>A", + "ENST00000560848(ENSG00000068793):c.2083-341G>A", + "ENST00000435939(ENSG00000068793):c.790-341G>A", + "ENST00000558826(ENSG00000068793):n.476-341G>A", + "ENST00000561296(ENSG00000068793):n.207-341G>A" + ], + "id": "rs113991879", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.012175377, + "altHomGenotypeFreq": 3.8857586E-4, + "hetGenotypeFreq": 0.023573603, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9878246, + "refHomGenotypeFreq": 0.9760378, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.023517383, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.047034767, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.9764826, + "refHomGenotypeFreq": 0.95296526, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 6.195787E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0012391574, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.9993804, + "refHomGenotypeFreq": 0.9987608, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.004784689, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009569378, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9952153, + "refHomGenotypeFreq": 0.9904306, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0033112583, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0066225166, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.9966887, + "refHomGenotypeFreq": 0.9933775, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.024956971, + "altHomGenotypeFreq": 5.7372346E-4, + "hetGenotypeFreq": 0.048766494, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.97504306, + "refHomGenotypeFreq": 0.9506598, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.01658641, + "altHomGenotypeFreq": 6.6880684E-4, + "hetGenotypeFreq": 0.031835206, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.9834136, + "refHomGenotypeFreq": 0.967496, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0013770943, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0027541886, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9986229, + "refHomGenotypeFreq": 0.9972458, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.011715089, + "altHomGenotypeFreq": 4.6860357E-4, + "hetGenotypeFreq": 0.022492971, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.9882849, + "refHomGenotypeFreq": 0.97703844, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.012744389, + "altHomGenotypeFreq": 2.896452E-4, + "hetGenotypeFreq": 0.024909485, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.98725563, + "refHomGenotypeFreq": 0.9748009, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.019038076, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9809619, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0078125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.015625, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.9921875, + "refHomGenotypeFreq": 0.984375, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0071884985, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.014376997, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9928115, + "refHomGenotypeFreq": 0.985623, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0030674846, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.006134969, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.9969325, + "refHomGenotypeFreq": 0.993865, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.021276595, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04255319, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.9787234, + "refHomGenotypeFreq": 0.9574468, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.032967035, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06593407, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.96703297, + "refHomGenotypeFreq": 0.93406594, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.03271028, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06542056, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.96728975, + "refHomGenotypeFreq": 0.93457943, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.017441861, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.034883723, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.98255813, + "refHomGenotypeFreq": 0.96511626, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.02385686, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04771372, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.9761431, + "refHomGenotypeFreq": 0.9522863, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0129683, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0259366, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9870317, + "refHomGenotypeFreq": 0.9740634, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.04040404, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08080808, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.959596, + "refHomGenotypeFreq": 0.9191919, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.009345794, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.018691588, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.99065423, + "refHomGenotypeFreq": 0.9813084, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.009615385, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01923077, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.99038464, + "refHomGenotypeFreq": 0.9807692, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.011764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.023529412, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.9882353, + "refHomGenotypeFreq": 0.9764706, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0137529755, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.986247, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.012311136, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.98768884, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.015049299, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.9849507, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.01240561, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.98759437, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22961914, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22961914, + "id": "15:22961914:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22961914, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557859", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558826", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561296", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -4.579999923706055, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -0.3310000002384186, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.18999958038330078, + "source": "cadd_raw" + }, + { + "score": 4.590000152587891, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.2083-71T>A", + "ENST00000560848(ENSG00000068793):c.2083-71T>A", + "ENST00000435939(ENSG00000068793):c.790-71T>A", + "ENST00000558826(ENSG00000068793):n.476-71T>A", + "ENST00000561296(ENSG00000068793):n.207-71T>A" + ], + "id": "rs7359217", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.1871362, + "altHomGenotypeFreq": 0.03686457, + "hetGenotypeFreq": 0.30054328, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.81286377, + "refHomGenotypeFreq": 0.6625922, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12192623, + "altHomGenotypeFreq": 0.028688524, + "hetGenotypeFreq": 0.18647541, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.87807375, + "refHomGenotypeFreq": 0.78483605, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21747212, + "altHomGenotypeFreq": 0.030978935, + "hetGenotypeFreq": 0.37298638, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.78252786, + "refHomGenotypeFreq": 0.5960347, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18660288, + "altHomGenotypeFreq": 0.035885166, + "hetGenotypeFreq": 0.3014354, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.8133971, + "refHomGenotypeFreq": 0.66267943, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09602649, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19205298, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.9039735, + "refHomGenotypeFreq": 0.80794704, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10732684, + "altHomGenotypeFreq": 0.010303377, + "hetGenotypeFreq": 0.19404694, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.89267313, + "refHomGenotypeFreq": 0.7956497, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1595546, + "altHomGenotypeFreq": 0.0240032, + "hetGenotypeFreq": 0.27110282, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.8404454, + "refHomGenotypeFreq": 0.704894, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27159926, + "altHomGenotypeFreq": 0.073069856, + "hetGenotypeFreq": 0.3970588, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.7284007, + "refHomGenotypeFreq": 0.52987134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19027843, + "altHomGenotypeFreq": 0.03673374, + "hetGenotypeFreq": 0.3070894, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.8097216, + "refHomGenotypeFreq": 0.65617687, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18325138, + "altHomGenotypeFreq": 0.037026323, + "hetGenotypeFreq": 0.2924501, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.8167486, + "refHomGenotypeFreq": 0.6705236, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19338678, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8066132, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1953125, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.265625, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.8046875, + "refHomGenotypeFreq": 0.671875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20127796, + "altHomGenotypeFreq": 0.044329073, + "hetGenotypeFreq": 0.31389776, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.798722, + "refHomGenotypeFreq": 0.64177316, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12781186, + "altHomGenotypeFreq": 0.024539877, + "hetGenotypeFreq": 0.20654397, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.87218815, + "refHomGenotypeFreq": 0.76891613, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21276596, + "altHomGenotypeFreq": 0.05319149, + "hetGenotypeFreq": 0.31914893, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.78723407, + "refHomGenotypeFreq": 0.62765956, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14215687, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.24509805, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.85784316, + "refHomGenotypeFreq": 0.7352941, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30408472, + "altHomGenotypeFreq": 0.0741301, + "hetGenotypeFreq": 0.45990923, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.6959153, + "refHomGenotypeFreq": 0.46596065, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17619048, + "altHomGenotypeFreq": 0.04761905, + "hetGenotypeFreq": 0.25714287, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.8238095, + "refHomGenotypeFreq": 0.6952381, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3028846, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.47115386, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.69711536, + "refHomGenotypeFreq": 0.46153846, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3287037, + "altHomGenotypeFreq": 0.083333336, + "hetGenotypeFreq": 0.49074072, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.6712963, + "refHomGenotypeFreq": 0.42592594, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09375, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.16666666, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.90625, + "refHomGenotypeFreq": 0.8229167, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29646018, + "altHomGenotypeFreq": 0.061946902, + "hetGenotypeFreq": 0.46902657, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.70353985, + "refHomGenotypeFreq": 0.46902654, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16176471, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.24509805, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.8382353, + "refHomGenotypeFreq": 0.71568626, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17032968, + "altHomGenotypeFreq": 0.032967035, + "hetGenotypeFreq": 0.2747253, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.8296703, + "refHomGenotypeFreq": 0.6923077, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12903225, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.23655914, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.87096775, + "refHomGenotypeFreq": 0.75268817, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.24242423, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.7070707, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13551402, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.25233644, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.864486, + "refHomGenotypeFreq": 0.7383177, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11046512, + "altHomGenotypeFreq": 0.023255814, + "hetGenotypeFreq": 0.1744186, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.8895349, + "refHomGenotypeFreq": 0.8023256, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33854166, + "altHomGenotypeFreq": 0.083333336, + "hetGenotypeFreq": 0.5104167, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.6614583, + "refHomGenotypeFreq": 0.40625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2929293, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.44444442, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.7070707, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25252524, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.36363637, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.74747473, + "refHomGenotypeFreq": 0.56565654, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14015904, + "altHomGenotypeFreq": 0.021868788, + "hetGenotypeFreq": 0.23658052, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.8598409, + "refHomGenotypeFreq": 0.7415507, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25409836, + "altHomGenotypeFreq": 0.06557377, + "hetGenotypeFreq": 0.37704918, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.74590164, + "refHomGenotypeFreq": 0.55737704, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19020173, + "altHomGenotypeFreq": 0.04034582, + "hetGenotypeFreq": 0.29971182, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.8097983, + "refHomGenotypeFreq": 0.6599424, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3529412, + "altHomGenotypeFreq": 0.08235294, + "hetGenotypeFreq": 0.5411765, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.64705884, + "refHomGenotypeFreq": 0.3764706, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1262136, + "altHomGenotypeFreq": 0.029126214, + "hetGenotypeFreq": 0.19417475, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.8737864, + "refHomGenotypeFreq": 0.776699, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10606061, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.19191918, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.8939394, + "refHomGenotypeFreq": 0.7979798, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.088785045, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.1588785, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.91121495, + "refHomGenotypeFreq": 0.8317757, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13942307, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.24038461, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.8605769, + "refHomGenotypeFreq": 0.74038464, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20707071, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.31313133, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.7929293, + "refHomGenotypeFreq": 0.6363636, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22352941, + "altHomGenotypeFreq": 0.03529412, + "hetGenotypeFreq": 0.3764706, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.7764706, + "refHomGenotypeFreq": 0.5882353, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20634921, + "altHomGenotypeFreq": 0.049603175, + "hetGenotypeFreq": 0.31349206, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.7936508, + "refHomGenotypeFreq": 0.6369048, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24271844, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.34951454, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.75728154, + "refHomGenotypeFreq": 0.5825243, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15168539, + "altHomGenotypeFreq": 0.037453182, + "hetGenotypeFreq": 0.22846442, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8483146, + "refHomGenotypeFreq": 0.7340824, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16053954, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8394605, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15864578, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.84135425, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16346653, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.8365335, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1574973, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.8425027, + "study": "UK10K" + } + ], + "reference": "T", + "start": 22962184, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22962184, + "id": "15:22962184:T:A", + "length": 1, + "names": [], + "reference": "T", + "start": 22962184, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "cdnaPosition": 2583, + "cdsPosition": 2458, + "codon": "Ggc/Agc", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "exonOverlap": [ + { + "number": "22/31", + "percentage": 0.5 + } + ], + "geneName": "CYFIP1", + "proteinVariantAnnotation": { + "alternate": "SER", + "position": 820, + "reference": "GLY", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.83, + "source": "sift" + }, + { + "description": "benign", + "score": 0.001, + "source": "polyphen" + } + ] + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 2649, + "cdsPosition": 2458, + "codon": "Ggc/Agc", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "exonOverlap": [ + { + "number": "23/32", + "percentage": 0.5 + } + ], + "geneName": "CYFIP1", + "proteinVariantAnnotation": { + "alternate": "SER", + "position": 820, + "reference": "GLY", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.83, + "source": "sift" + }, + { + "description": "benign", + "score": 0.001, + "source": "polyphen" + } + ] + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 1467, + "cdsPosition": 1165, + "codon": "Ggc/Agc", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "exonOverlap": [ + { + "number": "7/16", + "percentage": 0.5 + } + ], + "geneName": "CYFIP1", + "proteinVariantAnnotation": { + "alternate": "SER", + "position": 389, + "reference": "GLY", + "substitutionScores": [ + { + "description": "tolerated", + "score": 1, + "source": "sift" + }, + { + "description": "benign", + "score": 0.001, + "source": "polyphen" + } + ] + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "cdnaPosition": 851, + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000558826", + "exonOverlap": [ + { + "number": "6/6", + "percentage": 0.6756757 + } + ], + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 1605, + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561020", + "exonOverlap": [ + { + "number": "1/10", + "percentage": 0.057636887 + } + ], + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 5.409999847412109, + "source": "gerp" + }, + { + "score": 0.7879999876022339, + "source": "phastCons" + }, + { + "score": -0.3610000014305115, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 2.479999542236328, + "source": "cadd_raw" + }, + { + "score": 19.3700008392334, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.2458G>A", + "ENSP00000324549:p.Gly820Ser", + "ENST00000560848(ENSG00000068793):c.2458G>A", + "ENSP00000454199:p.Gly820Ser", + "ENST00000435939(ENSG00000068793):c.1165G>A", + "ENSP00000405956:p.Gly389Ser", + "ENST00000558826(ENSG00000068793):n.851G>A", + "ENST00000561020(ENSG00000068793):n.1605G>A" + ], + "id": "rs7170637", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.17687808, + "altHomGenotypeFreq": 0.04800715, + "hetGenotypeFreq": 0.25774184, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8231219, + "refHomGenotypeFreq": 0.694251, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1810219, + "altHomGenotypeFreq": 0.037956204, + "hetGenotypeFreq": 0.28613138, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.81897813, + "refHomGenotypeFreq": 0.6759124, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 6.95975E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.00139195, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.999304, + "refHomGenotypeFreq": 0.99860805, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09989278, + "altHomGenotypeFreq": 0.013283297, + "hetGenotypeFreq": 0.17321897, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9001072, + "refHomGenotypeFreq": 0.8134977, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1510258, + "altHomGenotypeFreq": 0.022953484, + "hetGenotypeFreq": 0.2561446, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8489742, + "refHomGenotypeFreq": 0.7209019, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2360201, + "altHomGenotypeFreq": 0.05636837, + "hetGenotypeFreq": 0.35930347, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7639799, + "refHomGenotypeFreq": 0.5843282, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16955438, + "altHomGenotypeFreq": 0.029868664, + "hetGenotypeFreq": 0.27937144, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.8304456, + "refHomGenotypeFreq": 0.6907599, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6182852, + "altHomGenotypeFreq": 0.3783819, + "hetGenotypeFreq": 0.47980657, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.38171482, + "refHomGenotypeFreq": 0.14181153, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17193177, + "altHomGenotypeFreq": 0.042343345, + "hetGenotypeFreq": 0.25917685, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.8280682, + "refHomGenotypeFreq": 0.6984798, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18287203, + "altHomGenotypeFreq": 0.054870598, + "hetGenotypeFreq": 0.25600287, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.81712794, + "refHomGenotypeFreq": 0.68912655, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28551522, + "altHomGenotypeFreq": 0.12799741, + "hetGenotypeFreq": 0.31503564, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.71448475, + "refHomGenotypeFreq": 0.55696696, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18340164, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.3012295, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.81659836, + "refHomGenotypeFreq": 0.6659836, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12679426, + "altHomGenotypeFreq": 0.023923445, + "hetGenotypeFreq": 0.20574163, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.8732057, + "refHomGenotypeFreq": 0.7703349, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12251656, + "altHomGenotypeFreq": 0.01986755, + "hetGenotypeFreq": 0.205298, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8774834, + "refHomGenotypeFreq": 0.77483445, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23924269, + "altHomGenotypeFreq": 0.063109584, + "hetGenotypeFreq": 0.35226622, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7607573, + "refHomGenotypeFreq": 0.58462423, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15500869, + "altHomGenotypeFreq": 0.025946235, + "hetGenotypeFreq": 0.25812492, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.8449913, + "refHomGenotypeFreq": 0.71592885, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6142956, + "altHomGenotypeFreq": 0.37799263, + "hetGenotypeFreq": 0.47260588, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.38570443, + "refHomGenotypeFreq": 0.14940147, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28671125, + "altHomGenotypeFreq": 0.1312456, + "hetGenotypeFreq": 0.31093127, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7132888, + "refHomGenotypeFreq": 0.5578231, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28403825, + "altHomGenotypeFreq": 0.123986095, + "hetGenotypeFreq": 0.3201043, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.71596175, + "refHomGenotypeFreq": 0.55590963, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.59577847, + "altHomGenotypeFreq": 0.35724014, + "hetGenotypeFreq": 0.4770767, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.4042215, + "refHomGenotypeFreq": 0.16568317, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31001076, + "altHomGenotypeFreq": 0.14008918, + "hetGenotypeFreq": 0.33984315, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6899892, + "refHomGenotypeFreq": 0.52006763, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16360465, + "altHomGenotypeFreq": 0.02883721, + "hetGenotypeFreq": 0.2695349, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.8363953, + "refHomGenotypeFreq": 0.7016279, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18136272, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.81863725, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1885661, + "altHomGenotypeFreq": 0.05567653, + "hetGenotypeFreq": 0.26577914, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8114339, + "refHomGenotypeFreq": 0.67854434, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.205298, + "altHomGenotypeFreq": 0.03532009, + "hetGenotypeFreq": 0.33995584, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.794702, + "refHomGenotypeFreq": 0.6247241, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13187546, + "altHomGenotypeFreq": 0.019748, + "hetGenotypeFreq": 0.2242549, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.86812454, + "refHomGenotypeFreq": 0.7559971, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0010411846, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0020823693, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.9989588, + "refHomGenotypeFreq": 0.99791765, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09135781, + "altHomGenotypeFreq": 0.013162453, + "hetGenotypeFreq": 0.15639071, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9086422, + "refHomGenotypeFreq": 0.83044684, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2227438, + "altHomGenotypeFreq": 0.05027256, + "hetGenotypeFreq": 0.34494245, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7772562, + "refHomGenotypeFreq": 0.60478497, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17486642, + "altHomGenotypeFreq": 0.03178844, + "hetGenotypeFreq": 0.28615597, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.82513356, + "refHomGenotypeFreq": 0.6820556, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6070398, + "altHomGenotypeFreq": 0.36449316, + "hetGenotypeFreq": 0.4850933, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.3929602, + "refHomGenotypeFreq": 0.15041354, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.109375, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.15625, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.890625, + "refHomGenotypeFreq": 0.8125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26577476, + "altHomGenotypeFreq": 0.13538338, + "hetGenotypeFreq": 0.26078275, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7342252, + "refHomGenotypeFreq": 0.60383385, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13599183, + "altHomGenotypeFreq": 0.016359918, + "hetGenotypeFreq": 0.2392638, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.8640082, + "refHomGenotypeFreq": 0.7443763, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13829787, + "altHomGenotypeFreq": 0.031914894, + "hetGenotypeFreq": 0.21276596, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.86170214, + "refHomGenotypeFreq": 0.7553192, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11764706, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.21568629, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.88235295, + "refHomGenotypeFreq": 0.7745098, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.69062024, + "altHomGenotypeFreq": 0.45688352, + "hetGenotypeFreq": 0.4674735, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.30937973, + "refHomGenotypeFreq": 0.075642966, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.00952381, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01904762, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.9904762, + "refHomGenotypeFreq": 0.9809524, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7083333, + "altHomGenotypeFreq": 0.5, + "hetGenotypeFreq": 0.4166667, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.29166666, + "refHomGenotypeFreq": 0.083333336, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.375, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.8125, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7300885, + "altHomGenotypeFreq": 0.48672566, + "hetGenotypeFreq": 0.48672566, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.2699115, + "refHomGenotypeFreq": 0.026548672, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17156863, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.2647059, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.82843137, + "refHomGenotypeFreq": 0.6960784, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.104395606, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.20879123, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.8956044, + "refHomGenotypeFreq": 0.7912088, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1635514, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3271028, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.8364486, + "refHomGenotypeFreq": 0.6728972, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.075581394, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1511628, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.9244186, + "refHomGenotypeFreq": 0.8488372, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5989583, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.53125, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.40104166, + "refHomGenotypeFreq": 0.13541667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.75252527, + "altHomGenotypeFreq": 0.54545456, + "hetGenotypeFreq": 0.41414142, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.24747474, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7323232, + "altHomGenotypeFreq": 0.53535354, + "hetGenotypeFreq": 0.39393938, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.26767677, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17693837, + "altHomGenotypeFreq": 0.02385686, + "hetGenotypeFreq": 0.306163, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.82306165, + "refHomGenotypeFreq": 0.6699801, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5327869, + "altHomGenotypeFreq": 0.24590164, + "hetGenotypeFreq": 0.5737705, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.46721312, + "refHomGenotypeFreq": 0.18032786, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14841498, + "altHomGenotypeFreq": 0.048991356, + "hetGenotypeFreq": 0.19884726, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.85158503, + "refHomGenotypeFreq": 0.7521614, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7117647, + "altHomGenotypeFreq": 0.45882353, + "hetGenotypeFreq": 0.5058824, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.2882353, + "refHomGenotypeFreq": 0.03529412, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12135922, + "altHomGenotypeFreq": 0.029126214, + "hetGenotypeFreq": 0.18446602, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.8786408, + "refHomGenotypeFreq": 0.78640777, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21212122, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.34343433, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7878788, + "refHomGenotypeFreq": 0.61616164, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25700936, + "altHomGenotypeFreq": 0.056074765, + "hetGenotypeFreq": 0.40186918, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.7429907, + "refHomGenotypeFreq": 0.5420561, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27403846, + "altHomGenotypeFreq": 0.115384616, + "hetGenotypeFreq": 0.3173077, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.72596157, + "refHomGenotypeFreq": 0.5673077, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13636364, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.23232323, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.8636364, + "refHomGenotypeFreq": 0.74747473, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.03529412, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07058824, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.9647059, + "refHomGenotypeFreq": 0.92941177, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.003968254, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.007936508, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.99603176, + "refHomGenotypeFreq": 0.99206346, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.004854369, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009708738, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.9951456, + "refHomGenotypeFreq": 0.99029124, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13670412, + "altHomGenotypeFreq": 0.02247191, + "hetGenotypeFreq": 0.22846442, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.86329585, + "refHomGenotypeFreq": 0.7490637, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.173546, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.826454, + "study": "DISCOVEHR" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16939963, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8306004, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17991047, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.8200895, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15905553, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.84094447, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18015103, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.81984895, + "study": "UK10K" + } + ], + "reference": "G", + "start": 22969232, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25189356" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1_ENST00000435939" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM1372039", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "prostate", + "sampleSource": "surgery - NOS", + "tumourOrigin": "metastasis" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM1372038", + "somaticInformation": { + "histologySubtype": "neoplasm", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1_ENST00000435939" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM1372039", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM1372038", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM1372038", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25189356" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM1372038", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "prostate", + "sampleSource": "surgery - NOS", + "tumourOrigin": "metastasis" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1_ENST00000435939" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM1372039", + "somaticInformation": { + "histologySubtype": "neoplasm", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "CYFIP1_ENST00000435939" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "13759" + } + } + ], + "heritableTraits": [], + "id": "COSM1372039", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "CYFIP1_ENST00000435939", + "histologySubtype": "", + "mutationId": "COSM1372039", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "prostate", + "sampleSource": "surgery - NOS", + "siteSubtype": "", + "tumourOrigin": "metastasis" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "neoplasm", + "mutationId": "COSM1372038", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1_ENST00000435939", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM1372039", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM1372038", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "", + "mutationId": "COSM1372038", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "CYFIP1", + "histologySubtype": "", + "mutationId": "COSM1372038", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "prostate", + "sampleSource": "surgery - NOS", + "siteSubtype": "", + "tumourOrigin": "metastasis" + }, + { + "geneName": "CYFIP1_ENST00000435939", + "histologySubtype": "neoplasm", + "mutationId": "COSM1372039", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "CYFIP1_ENST00000435939", + "histologySubtype": "", + "mutationId": "COSM1372039", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + } + ] + } + }, + "chromosome": "15", + "end": 22969232, + "id": "15:22969232:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22969232, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561020", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.9570000171661377, + "source": "gerp" + }, + { + "score": 0.023000000044703484, + "source": "phastCons" + }, + { + "score": 0.46000000834465027, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.18000030517578125, + "source": "cadd_raw" + }, + { + "score": 4.489999771118164, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.2820+145T>G", + "ENST00000560848(ENSG00000068793):c.2820+145T>G", + "ENST00000435939(ENSG00000068793):c.1527+145T>G", + "ENST00000561020(ENSG00000068793):n.1967+145T>G" + ], + "id": "rs12913456", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.53335494, + "altHomGenotypeFreq": 0.33426166, + "hetGenotypeFreq": 0.3982513, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.4666127, + "refHomGenotypeFreq": 0.26748705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6639344, + "altHomGenotypeFreq": 0.44467214, + "hetGenotypeFreq": 0.4385246, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.33606556, + "refHomGenotypeFreq": 0.11680328, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31164807, + "altHomGenotypeFreq": 0.09789343, + "hetGenotypeFreq": 0.4275093, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.6883519, + "refHomGenotypeFreq": 0.47459728, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74880385, + "altHomGenotypeFreq": 0.5598086, + "hetGenotypeFreq": 0.37799042, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.25119618, + "refHomGenotypeFreq": 0.062200956, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5231788, + "altHomGenotypeFreq": 0.29139072, + "hetGenotypeFreq": 0.46357617, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.47682118, + "refHomGenotypeFreq": 0.24503312, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7646048, + "altHomGenotypeFreq": 0.5882016, + "hetGenotypeFreq": 0.35280642, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.2353952, + "refHomGenotypeFreq": 0.058991984, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67337525, + "altHomGenotypeFreq": 0.45119014, + "hetGenotypeFreq": 0.44450387, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.3265579, + "refHomGenotypeFreq": 0.10430597, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20611213, + "altHomGenotypeFreq": 0.04273897, + "hetGenotypeFreq": 0.3267463, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.79388785, + "refHomGenotypeFreq": 0.6305147, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.518627, + "altHomGenotypeFreq": 0.32005623, + "hetGenotypeFreq": 0.39714152, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.481373, + "refHomGenotypeFreq": 0.28280225, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55156434, + "altHomGenotypeFreq": 0.35182503, + "hetGenotypeFreq": 0.3996234, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.44836327, + "refHomGenotypeFreq": 0.24855156, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7134268, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.28657314, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8046875, + "altHomGenotypeFreq": 0.65625, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.1953125, + "refHomGenotypeFreq": 0.046875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45607027, + "altHomGenotypeFreq": 0.26876998, + "hetGenotypeFreq": 0.37460065, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5439297, + "refHomGenotypeFreq": 0.3566294, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6329243, + "altHomGenotypeFreq": 0.402863, + "hetGenotypeFreq": 0.4601227, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.36707565, + "refHomGenotypeFreq": 0.13701431, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65957445, + "altHomGenotypeFreq": 0.4574468, + "hetGenotypeFreq": 0.40425533, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.34042552, + "refHomGenotypeFreq": 0.13829787, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.622549, + "altHomGenotypeFreq": 0.39215687, + "hetGenotypeFreq": 0.46078432, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.37745097, + "refHomGenotypeFreq": 0.14705883, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14674735, + "altHomGenotypeFreq": 0.022692889, + "hetGenotypeFreq": 0.24810892, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.85325265, + "refHomGenotypeFreq": 0.72919816, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.13333334, + "hetGenotypeFreq": 0.4, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.46666667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27884614, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.40384614, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.72115386, + "refHomGenotypeFreq": 0.5192308, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12962963, + "altHomGenotypeFreq": 0.009259259, + "hetGenotypeFreq": 0.24074075, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.8703704, + "refHomGenotypeFreq": 0.75, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6666667, + "altHomGenotypeFreq": 0.47916666, + "hetGenotypeFreq": 0.375, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.14583333, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1460177, + "altHomGenotypeFreq": 0.0088495575, + "hetGenotypeFreq": 0.27433628, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.8539823, + "refHomGenotypeFreq": 0.71681416, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65686274, + "altHomGenotypeFreq": 0.42156863, + "hetGenotypeFreq": 0.47058824, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.34313726, + "refHomGenotypeFreq": 0.10784314, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6703297, + "altHomGenotypeFreq": 0.45054945, + "hetGenotypeFreq": 0.43956044, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.32967034, + "refHomGenotypeFreq": 0.10989011, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26344085, + "altHomGenotypeFreq": 0.086021505, + "hetGenotypeFreq": 0.3548387, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.73655915, + "refHomGenotypeFreq": 0.5591398, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3131313, + "altHomGenotypeFreq": 0.1010101, + "hetGenotypeFreq": 0.42424244, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.68686867, + "refHomGenotypeFreq": 0.47474748, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57476634, + "altHomGenotypeFreq": 0.3271028, + "hetGenotypeFreq": 0.49532712, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.42523363, + "refHomGenotypeFreq": 0.17757009, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6104651, + "altHomGenotypeFreq": 0.3488372, + "hetGenotypeFreq": 0.5232558, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.3895349, + "refHomGenotypeFreq": 0.12790698, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19270833, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.32291666, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.8072917, + "refHomGenotypeFreq": 0.6458333, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.07070707, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14141414, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.9292929, + "refHomGenotypeFreq": 0.85858583, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15656565, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.25252527, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.84343433, + "refHomGenotypeFreq": 0.7171717, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6550696, + "altHomGenotypeFreq": 0.43538767, + "hetGenotypeFreq": 0.43936384, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.3449304, + "refHomGenotypeFreq": 0.1252485, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25409836, + "altHomGenotypeFreq": 0.09836066, + "hetGenotypeFreq": 0.3114754, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.74590164, + "refHomGenotypeFreq": 0.59016395, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7276657, + "altHomGenotypeFreq": 0.55331415, + "hetGenotypeFreq": 0.34870318, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.2723343, + "refHomGenotypeFreq": 0.09798271, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.11764706, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.21176471, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.88235295, + "refHomGenotypeFreq": 0.7764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.60679615, + "altHomGenotypeFreq": 0.36893204, + "hetGenotypeFreq": 0.47572815, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.39320388, + "refHomGenotypeFreq": 0.1553398, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7979798, + "altHomGenotypeFreq": 0.6262626, + "hetGenotypeFreq": 0.34343433, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.2020202, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5607477, + "altHomGenotypeFreq": 0.3084112, + "hetGenotypeFreq": 0.5046729, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.43925235, + "refHomGenotypeFreq": 0.18691589, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.59134614, + "altHomGenotypeFreq": 0.34615386, + "hetGenotypeFreq": 0.49038464, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.40865386, + "refHomGenotypeFreq": 0.16346154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.68686867, + "altHomGenotypeFreq": 0.4848485, + "hetGenotypeFreq": 0.4040404, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.3131313, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9117647, + "altHomGenotypeFreq": 0.8352941, + "hetGenotypeFreq": 0.15294118, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.0882353, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3045635, + "altHomGenotypeFreq": 0.09920635, + "hetGenotypeFreq": 0.41071427, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.69543654, + "refHomGenotypeFreq": 0.49007937, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33009708, + "altHomGenotypeFreq": 0.097087376, + "hetGenotypeFreq": 0.4660194, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.6699029, + "refHomGenotypeFreq": 0.4368932, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2977528, + "altHomGenotypeFreq": 0.2247191, + "hetGenotypeFreq": 0.14606741, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7022472, + "refHomGenotypeFreq": 0.6292135, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6705898, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.3294102, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6566872, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.3433128, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.68137, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.31862998, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6593851, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.34061489, + "study": "UK10K" + } + ], + "reference": "T", + "start": 22990345, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22990345, + "id": "15:22990345:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 22990345, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561020", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557890", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561263", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.8600000143051147, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -0.2919999957084656, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.010000228881835938, + "source": "cadd_raw" + }, + { + "score": 2.759999990463257, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.3042+1440T>G", + "ENST00000560848(ENSG00000068793):c.3042+1440T>G", + "ENST00000435939(ENSG00000068793):c.1749+1440T>G", + "ENST00000561020(ENSG00000068793):n.2189+1440T>G" + ], + "id": "rs7182576", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.73991424, + "altHomGenotypeFreq": 0.5537582, + "hetGenotypeFreq": 0.3723121, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.26008576, + "refHomGenotypeFreq": 0.073929705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7873211, + "altHomGenotypeFreq": 0.61349696, + "hetGenotypeFreq": 0.34764826, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.21267894, + "refHomGenotypeFreq": 0.038854804, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5826033, + "altHomGenotypeFreq": 0.34668335, + "hetGenotypeFreq": 0.4718398, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.41739675, + "refHomGenotypeFreq": 0.18147685, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8552632, + "altHomGenotypeFreq": 0.7248804, + "hetGenotypeFreq": 0.26076555, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.14473684, + "refHomGenotypeFreq": 0.014354067, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.71854305, + "altHomGenotypeFreq": 0.54966885, + "hetGenotypeFreq": 0.33774835, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.28145695, + "refHomGenotypeFreq": 0.11258278, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.83974725, + "altHomGenotypeFreq": 0.70936245, + "hetGenotypeFreq": 0.26076967, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.16025274, + "refHomGenotypeFreq": 0.029867891, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7727334, + "altHomGenotypeFreq": 0.5977736, + "hetGenotypeFreq": 0.34991953, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.22726662, + "refHomGenotypeFreq": 0.052306868, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65671813, + "altHomGenotypeFreq": 0.4307444, + "hetGenotypeFreq": 0.45194745, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.34328187, + "refHomGenotypeFreq": 0.11730813, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7356916, + "altHomGenotypeFreq": 0.5470678, + "hetGenotypeFreq": 0.37724763, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.2643084, + "refHomGenotypeFreq": 0.07568457, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74513364, + "altHomGenotypeFreq": 0.5620279, + "hetGenotypeFreq": 0.3662115, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.25486636, + "refHomGenotypeFreq": 0.0717606, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.78156316, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.21843687, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8671875, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.234375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.1328125, + "refHomGenotypeFreq": 0.015625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7284345, + "altHomGenotypeFreq": 0.5347444, + "hetGenotypeFreq": 0.38738018, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.2715655, + "refHomGenotypeFreq": 0.0778754, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8578732, + "altHomGenotypeFreq": 0.73619634, + "hetGenotypeFreq": 0.24335378, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.14212678, + "refHomGenotypeFreq": 0.020449897, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7925532, + "altHomGenotypeFreq": 0.62765956, + "hetGenotypeFreq": 0.32978725, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.20744681, + "refHomGenotypeFreq": 0.04255319, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.877451, + "altHomGenotypeFreq": 0.7745098, + "hetGenotypeFreq": 0.20588236, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.12254902, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6565809, + "altHomGenotypeFreq": 0.4160363, + "hetGenotypeFreq": 0.48108923, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.34341908, + "refHomGenotypeFreq": 0.102874435, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54285717, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.41904765, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.45714286, + "refHomGenotypeFreq": 0.24761905, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53846157, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.61538464, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.46153846, + "refHomGenotypeFreq": 0.15384616, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6898148, + "altHomGenotypeFreq": 0.4814815, + "hetGenotypeFreq": 0.41666666, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.3101852, + "refHomGenotypeFreq": 0.10185185, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.875, + "altHomGenotypeFreq": 0.7708333, + "hetGenotypeFreq": 0.20833333, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.125, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6415929, + "altHomGenotypeFreq": 0.39823008, + "hetGenotypeFreq": 0.48672566, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.35840708, + "refHomGenotypeFreq": 0.11504425, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8627451, + "altHomGenotypeFreq": 0.7352941, + "hetGenotypeFreq": 0.25490198, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.13725491, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.78571427, + "altHomGenotypeFreq": 0.62637365, + "hetGenotypeFreq": 0.31868133, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.21428572, + "refHomGenotypeFreq": 0.054945055, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.56989247, + "altHomGenotypeFreq": 0.32258064, + "hetGenotypeFreq": 0.49462366, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.43010753, + "refHomGenotypeFreq": 0.1827957, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57575756, + "altHomGenotypeFreq": 0.3131313, + "hetGenotypeFreq": 0.5252525, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.42424244, + "refHomGenotypeFreq": 0.16161616, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.75233644, + "altHomGenotypeFreq": 0.57009345, + "hetGenotypeFreq": 0.36448598, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.24766356, + "refHomGenotypeFreq": 0.06542056, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8488372, + "altHomGenotypeFreq": 0.7093023, + "hetGenotypeFreq": 0.27906978, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.15116279, + "refHomGenotypeFreq": 0.011627907, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6927083, + "altHomGenotypeFreq": 0.4375, + "hetGenotypeFreq": 0.5104166, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.30729166, + "refHomGenotypeFreq": 0.052083332, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.63131315, + "altHomGenotypeFreq": 0.4040404, + "hetGenotypeFreq": 0.45454544, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.36868685, + "refHomGenotypeFreq": 0.14141414, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6515151, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.53535354, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.34848484, + "refHomGenotypeFreq": 0.08080808, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.77932405, + "altHomGenotypeFreq": 0.6083499, + "hetGenotypeFreq": 0.34194833, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.22067595, + "refHomGenotypeFreq": 0.049701788, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74590164, + "altHomGenotypeFreq": 0.5081967, + "hetGenotypeFreq": 0.47540984, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.25409836, + "refHomGenotypeFreq": 0.016393442, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8400576, + "altHomGenotypeFreq": 0.69740635, + "hetGenotypeFreq": 0.2853026, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.15994236, + "refHomGenotypeFreq": 0.017291067, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5647059, + "altHomGenotypeFreq": 0.31764707, + "hetGenotypeFreq": 0.49411765, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.43529412, + "refHomGenotypeFreq": 0.1882353, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8252427, + "altHomGenotypeFreq": 0.6893204, + "hetGenotypeFreq": 0.27184466, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.17475729, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.85858583, + "altHomGenotypeFreq": 0.72727275, + "hetGenotypeFreq": 0.26262626, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.14141414, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.72897196, + "altHomGenotypeFreq": 0.5233645, + "hetGenotypeFreq": 0.41121495, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.27102804, + "refHomGenotypeFreq": 0.06542056, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.78365386, + "altHomGenotypeFreq": 0.5769231, + "hetGenotypeFreq": 0.41346157, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.21634616, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7777778, + "altHomGenotypeFreq": 0.6060606, + "hetGenotypeFreq": 0.34343433, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.22222222, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9411765, + "altHomGenotypeFreq": 0.88235295, + "hetGenotypeFreq": 0.11764706, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.05882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5694444, + "altHomGenotypeFreq": 0.30952382, + "hetGenotypeFreq": 0.51984125, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.43055555, + "refHomGenotypeFreq": 0.17063493, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6213592, + "altHomGenotypeFreq": 0.34951457, + "hetGenotypeFreq": 0.5436893, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.37864077, + "refHomGenotypeFreq": 0.106796116, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.76897645, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.23102354, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7576945, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.24230555, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.77841204, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.22158796, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.75916934, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.24083063, + "study": "UK10K" + } + ], + "reference": "T", + "start": 22994595, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22994595, + "id": "15:22994595:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 22994595, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561020", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557890", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561263", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2799999713897705, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": -1.3049999475479126, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.13000011444091797, + "source": "cadd_raw" + }, + { + "score": 4.010000228881836, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.3450-218C>T", + "ENST00000560848(ENSG00000068793):c.3450-218C>T", + "ENST00000435939(ENSG00000068793):c.2157-218C>T", + "ENST00000561020(ENSG00000068793):n.2597-218C>T", + "ENST00000561263(ENSG00000068793):c.372-218C>T" + ], + "id": "rs1529795", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.84195364, + "altHomGenotypeFreq": 0.7105127, + "hetGenotypeFreq": 0.26288193, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.15804635, + "refHomGenotypeFreq": 0.026605386, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8241309, + "altHomGenotypeFreq": 0.6768916, + "hetGenotypeFreq": 0.29447854, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.17586912, + "refHomGenotypeFreq": 0.028629856, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.94437575, + "altHomGenotypeFreq": 0.8924598, + "hetGenotypeFreq": 0.103831895, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.055624228, + "refHomGenotypeFreq": 0.0037082818, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9045346, + "altHomGenotypeFreq": 0.81145585, + "hetGenotypeFreq": 0.18615752, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.09546539, + "refHomGenotypeFreq": 0.002386635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7913907, + "altHomGenotypeFreq": 0.6357616, + "hetGenotypeFreq": 0.3112583, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.20860927, + "refHomGenotypeFreq": 0.052980132, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8717802, + "altHomGenotypeFreq": 0.76531196, + "hetGenotypeFreq": 0.21293646, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.1282198, + "refHomGenotypeFreq": 0.021751573, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8095938, + "altHomGenotypeFreq": 0.65593266, + "hetGenotypeFreq": 0.3073223, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.1904062, + "refHomGenotypeFreq": 0.036745057, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8643366, + "altHomGenotypeFreq": 0.74522877, + "hetGenotypeFreq": 0.23821568, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.13566338, + "refHomGenotypeFreq": 0.01655553, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.844646, + "altHomGenotypeFreq": 0.71433586, + "hetGenotypeFreq": 0.26062024, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.15535401, + "refHomGenotypeFreq": 0.025043886, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8386209, + "altHomGenotypeFreq": 0.7057801, + "hetGenotypeFreq": 0.2656816, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.16137911, + "refHomGenotypeFreq": 0.028538316, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8156313, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.18436874, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90625, + "altHomGenotypeFreq": 0.828125, + "hetGenotypeFreq": 0.15625, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.09375, + "refHomGenotypeFreq": 0.015625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8851837, + "altHomGenotypeFreq": 0.7851438, + "hetGenotypeFreq": 0.20007987, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.11481629, + "refHomGenotypeFreq": 0.014776357, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.91820043, + "altHomGenotypeFreq": 0.84662575, + "hetGenotypeFreq": 0.14314929, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.08179959, + "refHomGenotypeFreq": 0.010224949, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.84042555, + "altHomGenotypeFreq": 0.71276593, + "hetGenotypeFreq": 0.25531915, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.15957446, + "refHomGenotypeFreq": 0.031914894, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9362745, + "altHomGenotypeFreq": 0.88235295, + "hetGenotypeFreq": 0.10784314, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.063725494, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.88426626, + "altHomGenotypeFreq": 0.7806354, + "hetGenotypeFreq": 0.20726173, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.115733735, + "refHomGenotypeFreq": 0.012102874, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.95238096, + "altHomGenotypeFreq": 0.9047619, + "hetGenotypeFreq": 0.0952381, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.04761905, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8942308, + "altHomGenotypeFreq": 0.78846157, + "hetGenotypeFreq": 0.21153846, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.10576923, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9027778, + "altHomGenotypeFreq": 0.8333333, + "hetGenotypeFreq": 0.1388889, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.097222224, + "refHomGenotypeFreq": 0.027777778, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9114583, + "altHomGenotypeFreq": 0.8333333, + "hetGenotypeFreq": 0.15625, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.088541664, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8982301, + "altHomGenotypeFreq": 0.8053097, + "hetGenotypeFreq": 0.18584071, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.10176991, + "refHomGenotypeFreq": 0.0088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9558824, + "altHomGenotypeFreq": 0.9117647, + "hetGenotypeFreq": 0.0882353, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.04411765, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8131868, + "altHomGenotypeFreq": 0.64835167, + "hetGenotypeFreq": 0.32967034, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.18681319, + "refHomGenotypeFreq": 0.021978023, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9086022, + "altHomGenotypeFreq": 0.8172043, + "hetGenotypeFreq": 0.1827957, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.09139785, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.93434346, + "altHomGenotypeFreq": 0.8787879, + "hetGenotypeFreq": 0.11111111, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.065656565, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.78504676, + "altHomGenotypeFreq": 0.6168224, + "hetGenotypeFreq": 0.3364486, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.21495327, + "refHomGenotypeFreq": 0.046728972, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9186047, + "altHomGenotypeFreq": 0.8372093, + "hetGenotypeFreq": 0.1627907, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.08139535, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.875, + "altHomGenotypeFreq": 0.7708333, + "hetGenotypeFreq": 0.20833333, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.125, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8636364, + "altHomGenotypeFreq": 0.7373737, + "hetGenotypeFreq": 0.25252527, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.13636364, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8888889, + "altHomGenotypeFreq": 0.7777778, + "hetGenotypeFreq": 0.22222222, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.11111111, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.81809145, + "altHomGenotypeFreq": 0.67196816, + "hetGenotypeFreq": 0.29224652, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.18190855, + "refHomGenotypeFreq": 0.035785288, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8770492, + "altHomGenotypeFreq": 0.75409836, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.12295082, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8847262, + "altHomGenotypeFreq": 0.7838617, + "hetGenotypeFreq": 0.2017291, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.11527377, + "refHomGenotypeFreq": 0.014409222, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.87647057, + "altHomGenotypeFreq": 0.7647059, + "hetGenotypeFreq": 0.22352941, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.12352941, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86893207, + "altHomGenotypeFreq": 0.7669903, + "hetGenotypeFreq": 0.2038835, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.13106796, + "refHomGenotypeFreq": 0.029126214, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8989899, + "altHomGenotypeFreq": 0.7979798, + "hetGenotypeFreq": 0.2020202, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.1010101, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7803738, + "altHomGenotypeFreq": 0.62616825, + "hetGenotypeFreq": 0.3084112, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.21962617, + "refHomGenotypeFreq": 0.06542056, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.85096157, + "altHomGenotypeFreq": 0.71153843, + "hetGenotypeFreq": 0.27884614, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.14903846, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8181818, + "altHomGenotypeFreq": 0.67676765, + "hetGenotypeFreq": 0.28282827, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.18181819, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9588235, + "altHomGenotypeFreq": 0.91764706, + "hetGenotypeFreq": 0.08235294, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.04117647, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.921627, + "altHomGenotypeFreq": 0.8452381, + "hetGenotypeFreq": 0.15277779, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.078373015, + "refHomGenotypeFreq": 0.001984127, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9174757, + "altHomGenotypeFreq": 0.83495146, + "hetGenotypeFreq": 0.16504854, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.08252427, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0056179776, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.0037453184, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.994382, + "refHomGenotypeFreq": 0.99250937, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8028299, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.19717006, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7929491, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.20705092, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8105864, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.18941359, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7947681, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.20523193, + "study": "UK10K" + } + ], + "reference": "C", + "start": 22999878, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22999878, + "id": "15:22999878:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22999878, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561020", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557890", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 548, + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561263", + "exonOverlap": [ + { + "number": "4/4", + "percentage": 0.29761904 + } + ], + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -6.03000020980835, + "source": "gerp" + }, + { + "score": 0.041999999433755875, + "source": "phastCons" + }, + { + "score": -1.9980000257492065, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "3_prime_UTR_variant", + "functionalScore": [ + { + "score": -0.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 1.2899999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.3597+29A>G", + "ENST00000560848(ENSG00000068793):c.3597+29A>G", + "ENST00000435939(ENSG00000068793):c.2304+29A>G", + "ENST00000561020(ENSG00000068793):n.2744+29A>G", + "ENST00000561263(ENSG00000068793):c.*17A>G" + ], + "id": "rs999842", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.5533189, + "altHomGenotypeFreq": 0.3128435, + "hetGenotypeFreq": 0.48095083, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.44668108, + "refHomGenotypeFreq": 0.20620567, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54573727, + "altHomGenotypeFreq": 0.30150017, + "hetGenotypeFreq": 0.4884742, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.4542627, + "refHomGenotypeFreq": 0.21002561, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.64775234, + "altHomGenotypeFreq": 0.4231618, + "hetGenotypeFreq": 0.44918108, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.35224766, + "refHomGenotypeFreq": 0.1276571, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48702618, + "altHomGenotypeFreq": 0.23675714, + "hetGenotypeFreq": 0.5005381, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5129738, + "refHomGenotypeFreq": 0.26270476, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41494793, + "altHomGenotypeFreq": 0.16989994, + "hetGenotypeFreq": 0.49009597, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5850521, + "refHomGenotypeFreq": 0.3400041, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6603493, + "altHomGenotypeFreq": 0.4381021, + "hetGenotypeFreq": 0.44449446, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.33965066, + "refHomGenotypeFreq": 0.11740344, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5672978, + "altHomGenotypeFreq": 0.3245401, + "hetGenotypeFreq": 0.48551545, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.43270215, + "refHomGenotypeFreq": 0.18994443, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38845247, + "altHomGenotypeFreq": 0.1501702, + "hetGenotypeFreq": 0.47656456, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6115475, + "refHomGenotypeFreq": 0.37326527, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5567348, + "altHomGenotypeFreq": 0.3157887, + "hetGenotypeFreq": 0.4818922, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.4432652, + "refHomGenotypeFreq": 0.20231912, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5491803, + "altHomGenotypeFreq": 0.30927518, + "hetGenotypeFreq": 0.47981027, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.45081967, + "refHomGenotypeFreq": 0.21091454, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.523882, + "altHomGenotypeFreq": 0.28360623, + "hetGenotypeFreq": 0.48055142, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.47611806, + "refHomGenotypeFreq": 0.23584235, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5714286, + "altHomGenotypeFreq": 0.33061224, + "hetGenotypeFreq": 0.48163265, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.42857143, + "refHomGenotypeFreq": 0.18775511, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.66024846, + "altHomGenotypeFreq": 0.45093167, + "hetGenotypeFreq": 0.41863355, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.33975154, + "refHomGenotypeFreq": 0.13043478, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49282297, + "altHomGenotypeFreq": 0.23205742, + "hetGenotypeFreq": 0.5215311, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.50717705, + "refHomGenotypeFreq": 0.24641149, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4271523, + "altHomGenotypeFreq": 0.1589404, + "hetGenotypeFreq": 0.53642386, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.57284766, + "refHomGenotypeFreq": 0.30463576, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65873927, + "altHomGenotypeFreq": 0.44126076, + "hetGenotypeFreq": 0.43495703, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.34126073, + "refHomGenotypeFreq": 0.12378223, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55100816, + "altHomGenotypeFreq": 0.3024436, + "hetGenotypeFreq": 0.4971291, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.44899186, + "refHomGenotypeFreq": 0.2004273, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3989203, + "altHomGenotypeFreq": 0.16103837, + "hetGenotypeFreq": 0.47576383, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6010797, + "refHomGenotypeFreq": 0.3631978, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5168658, + "altHomGenotypeFreq": 0.2743031, + "hetGenotypeFreq": 0.48512533, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.4831342, + "refHomGenotypeFreq": 0.24057156, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53254735, + "altHomGenotypeFreq": 0.2950962, + "hetGenotypeFreq": 0.47490236, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.46745262, + "refHomGenotypeFreq": 0.23000145, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39105764, + "altHomGenotypeFreq": 0.1579664, + "hetGenotypeFreq": 0.46618247, + "population": "AA", + "refAllele": "A", + "refAlleleFreq": 0.60894233, + "refHomGenotypeFreq": 0.37585112, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.500692, + "altHomGenotypeFreq": 0.2577272, + "hetGenotypeFreq": 0.48592958, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.49930802, + "refHomGenotypeFreq": 0.25634322, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55686045, + "altHomGenotypeFreq": 0.3088372, + "hetGenotypeFreq": 0.4960465, + "population": "EA", + "refAllele": "A", + "refAlleleFreq": 0.44313952, + "refHomGenotypeFreq": 0.19511628, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.63326657, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.36673346, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5549067, + "altHomGenotypeFreq": 0.31428665, + "hetGenotypeFreq": 0.48124006, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.4450933, + "refHomGenotypeFreq": 0.20447327, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.59444445, + "altHomGenotypeFreq": 0.34888887, + "hetGenotypeFreq": 0.4911111, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.40555555, + "refHomGenotypeFreq": 0.16, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57744414, + "altHomGenotypeFreq": 0.33382156, + "hetGenotypeFreq": 0.4872452, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.42255583, + "refHomGenotypeFreq": 0.17893323, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6499768, + "altHomGenotypeFreq": 0.42443207, + "hetGenotypeFreq": 0.45108947, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.35002318, + "refHomGenotypeFreq": 0.124478444, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48561275, + "altHomGenotypeFreq": 0.23834287, + "hetGenotypeFreq": 0.49453977, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.51438725, + "refHomGenotypeFreq": 0.26711735, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6566101, + "altHomGenotypeFreq": 0.43662825, + "hetGenotypeFreq": 0.4399636, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.34338993, + "refHomGenotypeFreq": 0.123408124, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5638861, + "altHomGenotypeFreq": 0.32066444, + "hetGenotypeFreq": 0.48644337, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.43611386, + "refHomGenotypeFreq": 0.19289218, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3918737, + "altHomGenotypeFreq": 0.1548238, + "hetGenotypeFreq": 0.47409976, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.60812634, + "refHomGenotypeFreq": 0.37107643, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.515625, + "altHomGenotypeFreq": 0.296875, + "hetGenotypeFreq": 0.4375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.484375, + "refHomGenotypeFreq": 0.265625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.528754, + "altHomGenotypeFreq": 0.2859425, + "hetGenotypeFreq": 0.485623, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.471246, + "refHomGenotypeFreq": 0.2284345, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.61042947, + "altHomGenotypeFreq": 0.36809817, + "hetGenotypeFreq": 0.4846626, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.38957056, + "refHomGenotypeFreq": 0.14723927, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47340426, + "altHomGenotypeFreq": 0.27659574, + "hetGenotypeFreq": 0.39361703, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.5265958, + "refHomGenotypeFreq": 0.32978722, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5735294, + "altHomGenotypeFreq": 0.37254903, + "hetGenotypeFreq": 0.4019608, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.42647058, + "refHomGenotypeFreq": 0.2254902, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37821484, + "altHomGenotypeFreq": 0.12556732, + "hetGenotypeFreq": 0.50529504, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.62178516, + "refHomGenotypeFreq": 0.36913767, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74285716, + "altHomGenotypeFreq": 0.5714286, + "hetGenotypeFreq": 0.34285715, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.25714287, + "refHomGenotypeFreq": 0.08571429, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55288464, + "altHomGenotypeFreq": 0.2596154, + "hetGenotypeFreq": 0.58653843, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.4471154, + "refHomGenotypeFreq": 0.15384616, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3935185, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.4537037, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.6064815, + "refHomGenotypeFreq": 0.37962964, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5833333, + "altHomGenotypeFreq": 0.34375, + "hetGenotypeFreq": 0.47916666, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.41666666, + "refHomGenotypeFreq": 0.17708333, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3761062, + "altHomGenotypeFreq": 0.123893805, + "hetGenotypeFreq": 0.50442475, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.6238938, + "refHomGenotypeFreq": 0.37168142, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6862745, + "altHomGenotypeFreq": 0.43137255, + "hetGenotypeFreq": 0.50980395, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.3137255, + "refHomGenotypeFreq": 0.05882353, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53296703, + "altHomGenotypeFreq": 0.2747253, + "hetGenotypeFreq": 0.51648355, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.46703297, + "refHomGenotypeFreq": 0.20879121, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6075269, + "altHomGenotypeFreq": 0.32258064, + "hetGenotypeFreq": 0.56989247, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.39247313, + "refHomGenotypeFreq": 0.10752688, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65656567, + "altHomGenotypeFreq": 0.42424244, + "hetGenotypeFreq": 0.46464646, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.34343433, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4813084, + "altHomGenotypeFreq": 0.25233644, + "hetGenotypeFreq": 0.45794392, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.5186916, + "refHomGenotypeFreq": 0.2897196, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.627907, + "altHomGenotypeFreq": 0.3604651, + "hetGenotypeFreq": 0.53488374, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.37209302, + "refHomGenotypeFreq": 0.10465116, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39583334, + "altHomGenotypeFreq": 0.114583336, + "hetGenotypeFreq": 0.5625, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.6041667, + "refHomGenotypeFreq": 0.32291666, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30808082, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.47474748, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.6919192, + "refHomGenotypeFreq": 0.45454547, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.53535354, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.35353535, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5586481, + "altHomGenotypeFreq": 0.31610337, + "hetGenotypeFreq": 0.48508948, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.4413519, + "refHomGenotypeFreq": 0.19880715, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3852459, + "altHomGenotypeFreq": 0.16393442, + "hetGenotypeFreq": 0.44262296, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.6147541, + "refHomGenotypeFreq": 0.39344263, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5057637, + "altHomGenotypeFreq": 0.27377522, + "hetGenotypeFreq": 0.46397692, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.49423632, + "refHomGenotypeFreq": 0.26224783, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41764706, + "altHomGenotypeFreq": 0.14117648, + "hetGenotypeFreq": 0.5529412, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.58235294, + "refHomGenotypeFreq": 0.30588236, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5825243, + "altHomGenotypeFreq": 0.33009708, + "hetGenotypeFreq": 0.5048544, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.41747573, + "refHomGenotypeFreq": 0.16504854, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7121212, + "altHomGenotypeFreq": 0.4848485, + "hetGenotypeFreq": 0.45454544, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.28787878, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49532712, + "altHomGenotypeFreq": 0.25233644, + "hetGenotypeFreq": 0.48598132, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.5046729, + "refHomGenotypeFreq": 0.26168224, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5432692, + "altHomGenotypeFreq": 0.31730768, + "hetGenotypeFreq": 0.45192307, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.45673078, + "refHomGenotypeFreq": 0.23076923, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5808081, + "altHomGenotypeFreq": 0.32323232, + "hetGenotypeFreq": 0.5151515, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.41919193, + "refHomGenotypeFreq": 0.16161616, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4882353, + "altHomGenotypeFreq": 0.2, + "hetGenotypeFreq": 0.5764706, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.5117647, + "refHomGenotypeFreq": 0.22352941, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.63293654, + "altHomGenotypeFreq": 0.39484128, + "hetGenotypeFreq": 0.47619045, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.3670635, + "refHomGenotypeFreq": 0.12896825, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.60194176, + "altHomGenotypeFreq": 0.3883495, + "hetGenotypeFreq": 0.42718446, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.39805827, + "refHomGenotypeFreq": 0.18446602, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5374532, + "altHomGenotypeFreq": 0.30337077, + "hetGenotypeFreq": 0.4681648, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.46254683, + "refHomGenotypeFreq": 0.22846442, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5691616, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.4308384, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55735874, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.4426413, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57784116, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.4221588, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.56014025, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.43985975, + "study": "UK10K" + } + ], + "reference": "A", + "start": 23000272, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23000272, + "id": "15:23000272:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23000272, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561020", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557890", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561263", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398013", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000539711", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000359727", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.5799999237060547, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -1.6349999904632568, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.3598-138dupA", + "ENST00000560848(ENSG00000068793):c.3598-138dupA", + "ENST00000435939(ENSG00000068793):c.2305-138dupA", + "ENST00000561020(ENSG00000068793):n.2745-138dupA" + ], + "id": "rs11435642", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.51702213, + "altHomGenotypeFreq": 0.41789722, + "hetGenotypeFreq": 0.43498772, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.36460897, + "refHomGenotypeFreq": 0.14711513, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.57127196, + "altHomGenotypeFreq": 0.48026317, + "hetGenotypeFreq": 0.4232456, + "population": "OTH", + "refAllele": "", + "refAlleleFreq": 0.30811402, + "refHomGenotypeFreq": 0.096491225, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29301745, + "altHomGenotypeFreq": 0.09600998, + "hetGenotypeFreq": 0.43142143, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.68827933, + "refHomGenotypeFreq": 0.47256857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5051414, + "altHomGenotypeFreq": 0.61696655, + "hetGenotypeFreq": 0.34190232, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.21208227, + "refHomGenotypeFreq": 0.041131105, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47297296, + "altHomGenotypeFreq": 0.36486486, + "hetGenotypeFreq": 0.45945945, + "population": "ASJ", + "refAllele": "", + "refAlleleFreq": 0.4054054, + "refHomGenotypeFreq": 0.17567568, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.65477747, + "altHomGenotypeFreq": 0.5778796, + "hetGenotypeFreq": 0.3684555, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.23789267, + "refHomGenotypeFreq": 0.053664923, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5801019, + "altHomGenotypeFreq": 0.5056609, + "hetGenotypeFreq": 0.41763374, + "population": "NFE", + "refAllele": "", + "refAlleleFreq": 0.28552222, + "refHomGenotypeFreq": 0.07670535, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40139183, + "altHomGenotypeFreq": 0.2517103, + "hetGenotypeFreq": 0.49752298, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.4995282, + "refHomGenotypeFreq": 0.2507667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50622535, + "altHomGenotypeFreq": 0.4039694, + "hetGenotypeFreq": 0.43910256, + "population": "MALE", + "refAllele": "", + "refAlleleFreq": 0.3764793, + "refHomGenotypeFreq": 0.156928, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53046346, + "altHomGenotypeFreq": 0.4352364, + "hetGenotypeFreq": 0.42986497, + "population": "FEMALE", + "refAllele": "", + "refAlleleFreq": 0.3498312, + "refHomGenotypeFreq": 0.1348987, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5994446, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.4005554, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.58421934, + "population": "TWINSUK_NODUP", + "refAllele": "", + "refAlleleFreq": 0.41578063, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6120913, + "population": "ALSPAC", + "refAllele": "", + "refAlleleFreq": 0.38790867, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5862999, + "population": "TWINSUK", + "refAllele": "", + "refAlleleFreq": 0.4137001, + "study": "UK10K" + } + ], + "reference": "", + "start": 23002730, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23002729, + "id": "15:23002730:-:A", + "length": 1, + "names": [], + "reference": "", + "start": 23002730, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "AA", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "AA", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561020", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000557890", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561263", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398013", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000539711", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000359727", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.5799999237060547, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -1.6349999904632568, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000313077(ENSG00000068793):c.3598-139_3598-138dupAA", + "ENST00000560848(ENSG00000068793):c.3598-139_3598-138dupAA", + "ENST00000435939(ENSG00000068793):c.2305-139_2305-138dupAA", + "ENST00000561020(ENSG00000068793):n.2745-139_2745-138dupAA" + ], + "id": "rs11435642", + "populationFrequencies": [ + { + "altAllele": "AA", + "altAlleleFreq": 0.11785617, + "altHomGenotypeFreq": 0.41789722, + "hetGenotypeFreq": 0.4349877, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.36460897, + "refHomGenotypeFreq": 0.14711513, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.11951754, + "altHomGenotypeFreq": 0.48026317, + "hetGenotypeFreq": 0.42324564, + "population": "OTH", + "refAllele": "", + "refAlleleFreq": 0.30811402, + "refHomGenotypeFreq": 0.096491225, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.016832918, + "altHomGenotypeFreq": 0.09600998, + "hetGenotypeFreq": 0.43142143, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.68827933, + "refHomGenotypeFreq": 0.47256857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.281491, + "altHomGenotypeFreq": 0.61696655, + "hetGenotypeFreq": 0.34190232, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.21208227, + "refHomGenotypeFreq": 0.041131105, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.12162162, + "altHomGenotypeFreq": 0.36486486, + "hetGenotypeFreq": 0.45945945, + "population": "ASJ", + "refAllele": "", + "refAlleleFreq": 0.4054054, + "refHomGenotypeFreq": 0.17567568, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.107329845, + "altHomGenotypeFreq": 0.5778796, + "hetGenotypeFreq": 0.3684555, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.23789267, + "refHomGenotypeFreq": 0.053664923, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.1341636, + "altHomGenotypeFreq": 0.5056609, + "hetGenotypeFreq": 0.41763374, + "population": "NFE", + "refAllele": "", + "refAlleleFreq": 0.28552222, + "refHomGenotypeFreq": 0.07670535, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.09825431, + "altHomGenotypeFreq": 0.25171033, + "hetGenotypeFreq": 0.497523, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.4995282, + "refHomGenotypeFreq": 0.2507667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.11686391, + "altHomGenotypeFreq": 0.4039694, + "hetGenotypeFreq": 0.43910256, + "population": "MALE", + "refAllele": "", + "refAlleleFreq": 0.3764793, + "refHomGenotypeFreq": 0.156928, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.119091466, + "altHomGenotypeFreq": 0.43523636, + "hetGenotypeFreq": 0.42986494, + "population": "FEMALE", + "refAllele": "", + "refAlleleFreq": 0.3498312, + "refHomGenotypeFreq": 0.1348987, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.11557789, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.8844221, + "study": "UK10K" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.120872974, + "population": "TWINSUK_NODUP", + "refAllele": "", + "refAlleleFreq": 0.879127, + "study": "UK10K" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.11079398, + "population": "ALSPAC", + "refAllele": "", + "refAlleleFreq": 0.88920605, + "study": "UK10K" + }, + { + "altAllele": "AA", + "altAlleleFreq": 0.12055016, + "population": "TWINSUK", + "refAllele": "", + "refAlleleFreq": 0.87944984, + "study": "UK10K" + } + ], + "reference": "", + "start": 23002730, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23002729, + "id": "15:23002730:-:AA", + "length": 2, + "names": [], + "reference": "", + "start": 23002730, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561020", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 1698, + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "exonOverlap": [ + { + "number": "8/8", + "percentage": 0.18416207 + } + ], + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 1595, + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.18416207 + } + ], + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 1413, + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398013", + "exonOverlap": [ + { + "number": "6/6", + "percentage": 0.26595744 + } + ], + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 1345, + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000539711", + "exonOverlap": [ + { + "number": "5/5", + "percentage": 0.5681818 + } + ], + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000359727", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.9330000281333923, + "source": "gerp" + }, + { + "score": 2.2799999713897705, + "source": "gerp" + }, + { + "score": 2.1500000953674316, + "source": "gerp" + }, + { + "score": 4.860000133514404, + "source": "gerp" + }, + { + "score": 0.17499999701976776, + "source": "phastCons" + }, + { + "score": 0.25099998712539673, + "source": "phastCons" + }, + { + "score": 0.6800000071525574, + "source": "phastCons" + }, + { + "score": 0.718999981880188, + "source": "phastCons" + }, + { + "score": -0.13600000739097595, + "source": "phylop" + }, + { + "score": 0.5329999923706055, + "source": "phylop" + }, + { + "score": 0.5329999923706055, + "source": "phylop" + }, + { + "score": 0.5329999923706055, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "3_prime_UTR_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337451(ENSG00000140157):c.*2_*5delAAAG", + "ENST00000398014(ENSG00000140157):c.*2_*5delAAAG", + "ENST00000398013(ENSG00000140157):c.*2_*5delAAAG", + "ENST00000539711(ENSG00000140157):c.*2_*5delAAAG" + ], + "id": "rs78803812", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.2382947, + "altHomGenotypeFreq": 0.06104508, + "hetGenotypeFreq": 0.35449925, + "population": "ALL", + "refAllele": "CTTT", + "refAlleleFreq": 0.7617053, + "refHomGenotypeFreq": 0.58445567, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25511023, + "altHomGenotypeFreq": 0.06533066, + "hetGenotypeFreq": 0.37955913, + "population": "OTH", + "refAllele": "CTTT", + "refAlleleFreq": 0.7448898, + "refHomGenotypeFreq": 0.5551102, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.22018349, + "altHomGenotypeFreq": 0.0445437, + "hetGenotypeFreq": 0.3512796, + "population": "EAS", + "refAllele": "CTTT", + "refAlleleFreq": 0.7798165, + "refHomGenotypeFreq": 0.6041767, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.14147106, + "altHomGenotypeFreq": 0.020872233, + "hetGenotypeFreq": 0.24119765, + "population": "AMR", + "refAllele": "CTTT", + "refAlleleFreq": 0.8585289, + "refHomGenotypeFreq": 0.7379301, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.30612484, + "altHomGenotypeFreq": 0.09245459, + "hetGenotypeFreq": 0.42734048, + "population": "ASJ", + "refAllele": "CTTT", + "refAlleleFreq": 0.6938752, + "refHomGenotypeFreq": 0.48020494, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3074024, + "altHomGenotypeFreq": 0.09480093, + "hetGenotypeFreq": 0.42520294, + "population": "FIN", + "refAllele": "CTTT", + "refAlleleFreq": 0.6925976, + "refHomGenotypeFreq": 0.47999614, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27398425, + "altHomGenotypeFreq": 0.07481914, + "hetGenotypeFreq": 0.3983302, + "population": "NFE", + "refAllele": "CTTT", + "refAlleleFreq": 0.72601575, + "refHomGenotypeFreq": 0.52685064, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.070216775, + "altHomGenotypeFreq": 0.004847179, + "hetGenotypeFreq": 0.1307392, + "population": "AFR", + "refAllele": "CTTT", + "refAlleleFreq": 0.9297832, + "refHomGenotypeFreq": 0.8644136, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.24617909, + "altHomGenotypeFreq": 0.063949935, + "hetGenotypeFreq": 0.36445832, + "population": "MALE", + "refAllele": "CTTT", + "refAlleleFreq": 0.7538209, + "refHomGenotypeFreq": 0.57159173, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.22879599, + "altHomGenotypeFreq": 0.05754545, + "hetGenotypeFreq": 0.34250107, + "population": "FEMALE", + "refAllele": "CTTT", + "refAlleleFreq": 0.771204, + "refHomGenotypeFreq": 0.5999535, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.20859532, + "altHomGenotypeFreq": 0.05159785, + "hetGenotypeFreq": 0.31399494, + "population": "ALL", + "refAllele": "CTTT", + "refAlleleFreq": 0.79140466, + "refHomGenotypeFreq": 0.6344072, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25975358, + "altHomGenotypeFreq": 0.069815196, + "hetGenotypeFreq": 0.3798768, + "population": "OTH", + "refAllele": "CTTT", + "refAlleleFreq": 0.7402464, + "refHomGenotypeFreq": 0.550308, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.24004975, + "altHomGenotypeFreq": 0.05721393, + "hetGenotypeFreq": 0.36567163, + "population": "EAS", + "refAllele": "CTTT", + "refAlleleFreq": 0.7599502, + "refHomGenotypeFreq": 0.5771144, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.16945107, + "altHomGenotypeFreq": 0.03341289, + "hetGenotypeFreq": 0.27207637, + "population": "AMR", + "refAllele": "CTTT", + "refAlleleFreq": 0.83054894, + "refHomGenotypeFreq": 0.69451076, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.38, + "altHomGenotypeFreq": 0.11333334, + "hetGenotypeFreq": 0.53333336, + "population": "ASJ", + "refAllele": "CTTT", + "refAlleleFreq": 0.62, + "refHomGenotypeFreq": 0.35333332, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3207114, + "altHomGenotypeFreq": 0.10958118, + "hetGenotypeFreq": 0.42226046, + "population": "FIN", + "refAllele": "CTTT", + "refAlleleFreq": 0.67928857, + "refHomGenotypeFreq": 0.46815833, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2502343, + "altHomGenotypeFreq": 0.061989557, + "hetGenotypeFreq": 0.3764895, + "population": "NFE", + "refAllele": "CTTT", + "refAlleleFreq": 0.7497657, + "refHomGenotypeFreq": 0.56152093, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.07864524, + "altHomGenotypeFreq": 0.007118255, + "hetGenotypeFreq": 0.14305396, + "population": "AFR", + "refAllele": "CTTT", + "refAlleleFreq": 0.9213548, + "refHomGenotypeFreq": 0.84982777, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.20340176, + "altHomGenotypeFreq": 0.047272727, + "hetGenotypeFreq": 0.31225806, + "population": "MALE", + "refAllele": "CTTT", + "refAlleleFreq": 0.79659826, + "refHomGenotypeFreq": 0.6404692, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.21501014, + "altHomGenotypeFreq": 0.05694002, + "hetGenotypeFreq": 0.31614023, + "population": "FEMALE", + "refAllele": "CTTT", + "refAlleleFreq": 0.78498983, + "refHomGenotypeFreq": 0.62691975, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.07363977, + "altHomGenotypeFreq": 0.0075046904, + "hetGenotypeFreq": 0.13227017, + "population": "AA", + "refAllele": "CTTT", + "refAlleleFreq": 0.92636025, + "refHomGenotypeFreq": 0.86022514, + "study": "ESP6500" + }, + { + "altAllele": "", + "altAlleleFreq": 0.19736, + "altHomGenotypeFreq": 0.05296, + "hetGenotypeFreq": 0.2888, + "population": "ALL", + "refAllele": "CTTT", + "refAlleleFreq": 0.80264, + "refHomGenotypeFreq": 0.65824, + "study": "ESP6500" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2614133, + "altHomGenotypeFreq": 0.07649344, + "hetGenotypeFreq": 0.36983973, + "population": "EA", + "refAllele": "CTTT", + "refAlleleFreq": 0.73858666, + "refHomGenotypeFreq": 0.55366683, + "study": "ESP6500" + }, + { + "altAllele": "", + "altAlleleFreq": 0.28456914, + "population": "ALL", + "refAllele": "CTTT", + "refAlleleFreq": 0.71543086, + "study": "GONL" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2439173, + "altHomGenotypeFreq": 0.06196771, + "hetGenotypeFreq": 0.3638992, + "population": "ALL", + "refAllele": "CTTT", + "refAlleleFreq": 0.7560827, + "refHomGenotypeFreq": 0.5741331, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.29976302, + "altHomGenotypeFreq": 0.08293839, + "hetGenotypeFreq": 0.4336493, + "population": "OTH", + "refAllele": "CTTT", + "refAlleleFreq": 0.700237, + "refHomGenotypeFreq": 0.48341233, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27757153, + "altHomGenotypeFreq": 0.06635731, + "hetGenotypeFreq": 0.42242846, + "population": "SAS", + "refAllele": "CTTT", + "refAlleleFreq": 0.72242844, + "refHomGenotypeFreq": 0.51121426, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.22350606, + "altHomGenotypeFreq": 0.04901961, + "hetGenotypeFreq": 0.34897292, + "population": "EAS", + "refAllele": "CTTT", + "refAlleleFreq": 0.7764939, + "refHomGenotypeFreq": 0.60200745, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.12447735, + "altHomGenotypeFreq": 0.019337978, + "hetGenotypeFreq": 0.21027875, + "population": "AMR", + "refAllele": "CTTT", + "refAlleleFreq": 0.8755227, + "refHomGenotypeFreq": 0.7703833, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.30015153, + "altHomGenotypeFreq": 0.083030306, + "hetGenotypeFreq": 0.43424243, + "population": "FIN", + "refAllele": "CTTT", + "refAlleleFreq": 0.6998485, + "refHomGenotypeFreq": 0.48272726, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27938816, + "altHomGenotypeFreq": 0.07618695, + "hetGenotypeFreq": 0.4064024, + "population": "NFE", + "refAllele": "CTTT", + "refAlleleFreq": 0.7206119, + "refHomGenotypeFreq": 0.51741064, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.07709892, + "altHomGenotypeFreq": 0.006442228, + "hetGenotypeFreq": 0.14131339, + "population": "AFR", + "refAllele": "CTTT", + "refAlleleFreq": 0.9229011, + "refHomGenotypeFreq": 0.8522444, + "study": "EXAC" + }, + { + "altAllele": "", + "altAlleleFreq": 0.0703125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.140625, + "population": "MXL", + "refAllele": "CTTT", + "refAlleleFreq": 0.9296875, + "refHomGenotypeFreq": 0.859375, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.18690096, + "altHomGenotypeFreq": 0.04952077, + "hetGenotypeFreq": 0.2747604, + "population": "ALL", + "refAllele": "CTTT", + "refAlleleFreq": 0.813099, + "refHomGenotypeFreq": 0.67571884, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2638037, + "altHomGenotypeFreq": 0.08997955, + "hetGenotypeFreq": 0.34764826, + "population": "SAS", + "refAllele": "CTTT", + "refAlleleFreq": 0.73619634, + "refHomGenotypeFreq": 0.5623722, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.19148937, + "altHomGenotypeFreq": 0.05319149, + "hetGenotypeFreq": 0.27659574, + "population": "CLM", + "refAllele": "CTTT", + "refAlleleFreq": 0.80851066, + "refHomGenotypeFreq": 0.67021275, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2647059, + "altHomGenotypeFreq": 0.11764706, + "hetGenotypeFreq": 0.29411766, + "population": "ITU", + "refAllele": "CTTT", + "refAlleleFreq": 0.7352941, + "refHomGenotypeFreq": 0.5882353, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.052950077, + "altHomGenotypeFreq": 0.0030257185, + "hetGenotypeFreq": 0.09984872, + "population": "AFR", + "refAllele": "CTTT", + "refAlleleFreq": 0.9470499, + "refHomGenotypeFreq": 0.89712554, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25238097, + "altHomGenotypeFreq": 0.104761906, + "hetGenotypeFreq": 0.2952381, + "population": "CHS", + "refAllele": "CTTT", + "refAlleleFreq": 0.74761903, + "refHomGenotypeFreq": 0.6, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.44230768, + "population": "JPT", + "refAllele": "CTTT", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.52884614, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.060185187, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.120370366, + "population": "YRI", + "refAllele": "CTTT", + "refAlleleFreq": 0.9398148, + "refHomGenotypeFreq": 0.8796296, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27604166, + "altHomGenotypeFreq": 0.083333336, + "hetGenotypeFreq": 0.38541666, + "population": "PJL", + "refAllele": "CTTT", + "refAlleleFreq": 0.7239583, + "refHomGenotypeFreq": 0.53125, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.048672568, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09734513, + "population": "GWD", + "refAllele": "CTTT", + "refAlleleFreq": 0.95132744, + "refHomGenotypeFreq": 0.9026549, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2990196, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.38235295, + "population": "STU", + "refAllele": "CTTT", + "refAlleleFreq": 0.70098037, + "refHomGenotypeFreq": 0.50980395, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25824177, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.36263737, + "population": "GBR", + "refAllele": "CTTT", + "refAlleleFreq": 0.7417582, + "refHomGenotypeFreq": 0.5604396, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.1827957, + "altHomGenotypeFreq": 0.05376344, + "hetGenotypeFreq": 0.2580645, + "population": "CDX", + "refAllele": "CTTT", + "refAlleleFreq": 0.8172043, + "refHomGenotypeFreq": 0.68817204, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25252524, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.3838384, + "population": "KHV", + "refAllele": "CTTT", + "refAlleleFreq": 0.74747473, + "refHomGenotypeFreq": 0.5555556, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.21962617, + "altHomGenotypeFreq": 0.056074765, + "hetGenotypeFreq": 0.3271028, + "population": "IBS", + "refAllele": "CTTT", + "refAlleleFreq": 0.7803738, + "refHomGenotypeFreq": 0.6168224, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.19767442, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.30232558, + "population": "BEB", + "refAllele": "CTTT", + "refAlleleFreq": 0.8023256, + "refHomGenotypeFreq": 0.6511628, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.046875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09375, + "population": "ACB", + "refAllele": "CTTT", + "refAlleleFreq": 0.953125, + "refHomGenotypeFreq": 0.90625, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.035353534, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07070707, + "population": "ESN", + "refAllele": "CTTT", + "refAlleleFreq": 0.96464646, + "refHomGenotypeFreq": 0.9292929, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.07070707, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.1010101, + "population": "LWK", + "refAllele": "CTTT", + "refAlleleFreq": 0.9292929, + "refHomGenotypeFreq": 0.8787879, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.28031808, + "altHomGenotypeFreq": 0.07355865, + "hetGenotypeFreq": 0.4135189, + "population": "EUR", + "refAllele": "CTTT", + "refAlleleFreq": 0.7196819, + "refHomGenotypeFreq": 0.51292247, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.06557377, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13114753, + "population": "ASW", + "refAllele": "CTTT", + "refAlleleFreq": 0.93442625, + "refHomGenotypeFreq": 0.86885244, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.13544668, + "altHomGenotypeFreq": 0.0259366, + "hetGenotypeFreq": 0.21902017, + "population": "AMR", + "refAllele": "CTTT", + "refAlleleFreq": 0.86455333, + "refHomGenotypeFreq": 0.7550432, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.047058824, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09411765, + "population": "MSL", + "refAllele": "CTTT", + "refAlleleFreq": 0.9529412, + "refHomGenotypeFreq": 0.90588236, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27184466, + "altHomGenotypeFreq": 0.08737864, + "hetGenotypeFreq": 0.36893204, + "population": "GIH", + "refAllele": "CTTT", + "refAlleleFreq": 0.7281553, + "refHomGenotypeFreq": 0.5436893, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.49494952, + "population": "FIN", + "refAllele": "CTTT", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.45454547, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.317757, + "altHomGenotypeFreq": 0.11214953, + "hetGenotypeFreq": 0.41121495, + "population": "TSI", + "refAllele": "CTTT", + "refAlleleFreq": 0.682243, + "refHomGenotypeFreq": 0.47663552, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.1826923, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.3076923, + "population": "PUR", + "refAllele": "CTTT", + "refAlleleFreq": 0.8173077, + "refHomGenotypeFreq": 0.66346157, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.30808082, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.47474748, + "population": "CEU", + "refAllele": "CTTT", + "refAlleleFreq": 0.6919192, + "refHomGenotypeFreq": 0.45454547, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.064705886, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.105882354, + "population": "PEL", + "refAllele": "CTTT", + "refAlleleFreq": 0.9352941, + "refHomGenotypeFreq": 0.88235295, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.23015873, + "altHomGenotypeFreq": 0.06349207, + "hetGenotypeFreq": 0.33333334, + "population": "EAS", + "refAllele": "CTTT", + "refAlleleFreq": 0.76984125, + "refHomGenotypeFreq": 0.6031746, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.20873787, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.2815534, + "population": "CHB", + "refAllele": "CTTT", + "refAlleleFreq": 0.79126215, + "refHomGenotypeFreq": 0.65048546, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.264277, + "population": "ALL", + "refAllele": "CTTT", + "refAlleleFreq": 0.735723, + "study": "DISCOVEHR" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27955568, + "population": "ALL", + "refAllele": "CTTT", + "refAlleleFreq": 0.7204443, + "study": "UK10K" + }, + { + "altAllele": "", + "altAlleleFreq": 0.28035814, + "population": "TWINSUK_NODUP", + "refAllele": "CTTT", + "refAlleleFreq": 0.71964186, + "study": "UK10K" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27763364, + "population": "ALSPAC", + "refAllele": "CTTT", + "refAlleleFreq": 0.72236633, + "study": "UK10K" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2815534, + "population": "TWINSUK", + "refAllele": "CTTT", + "refAlleleFreq": 0.7184466, + "study": "UK10K" + } + ], + "reference": "CTTT", + "start": 23006216, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23006219, + "id": "15:23006216:CTTT:-", + "length": 4, + "names": [], + "reference": "CTTT", + "start": 23006216, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000313077", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000560848", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000435939", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000068793", + "ensemblTranscriptId": "ENST00000561020", + "geneName": "CYFIP1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398013", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000539711", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000359727", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -6.75, + "source": "gerp" + }, + { + "score": 0.04600000008940697, + "source": "phastCons" + }, + { + "score": -0.32600000500679016, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.940000057220459, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression, Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 3, + "score": 0.0030895863, + "source": "disgenet", + "sources": [ + "BeFree", + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C2240399", + "name": "Encounter for body mass index [BMI]", + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1861922", + "name": "Campomelic Dysplasia", + "numberOfPubmeds": 5, + "score": 0.0014175229, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 3, + "score": 8.505137E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0036341", + "name": "Schizophrenia", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0795693", + "name": "skeletal malformation", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2745900", + "name": "promyelocytic leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023348", + "name": "Leprosy, Lepromatous", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0265509", + "name": "Congenital anomaly of skeletal bone", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1562908", + "name": "Leprosy, Paucibacillary", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0006111", + "name": "Brain Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027765", + "name": "Nervous System Diseases", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008073", + "name": "Developmental Disabilities", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0018817", + "name": "Heart Septal Defects, Atrial", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023418", + "name": "Leukemia", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0023487", + "name": "Leukemia, Promyelocytic, Acute", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337451(ENSG00000140157):c.449-129A>C", + "ENST00000398014(ENSG00000140157):c.449-129A>C", + "ENST00000398013(ENSG00000140157):c.449-129A>C", + "ENST00000539711(ENSG00000140157):c.392-129A>C", + "ENST00000359727(ENSG00000140157):c.392-129A>C" + ], + "id": "rs17806422", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.13992502, + "altHomGenotypeFreq": 0.021526925, + "hetGenotypeFreq": 0.23679617, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.860075, + "refHomGenotypeFreq": 0.7416769, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14417177, + "altHomGenotypeFreq": 0.020449897, + "hetGenotypeFreq": 0.24744377, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.8558282, + "refHomGenotypeFreq": 0.7321063, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.017879162, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.035758324, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.9821208, + "refHomGenotypeFreq": 0.9642417, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30861244, + "altHomGenotypeFreq": 0.086124405, + "hetGenotypeFreq": 0.4449761, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.69138753, + "refHomGenotypeFreq": 0.46889952, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17549668, + "altHomGenotypeFreq": 0.013245033, + "hetGenotypeFreq": 0.3245033, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.8245033, + "refHomGenotypeFreq": 0.66225165, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14899713, + "altHomGenotypeFreq": 0.022922637, + "hetGenotypeFreq": 0.252149, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.8510029, + "refHomGenotypeFreq": 0.7249284, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15832666, + "altHomGenotypeFreq": 0.025220176, + "hetGenotypeFreq": 0.26621297, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.8416733, + "refHomGenotypeFreq": 0.70856684, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10949323, + "altHomGenotypeFreq": 0.0128410915, + "hetGenotypeFreq": 0.19330429, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.89050674, + "refHomGenotypeFreq": 0.7938546, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13871345, + "altHomGenotypeFreq": 0.021052632, + "hetGenotypeFreq": 0.23532164, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.8612865, + "refHomGenotypeFreq": 0.74362576, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14142217, + "altHomGenotypeFreq": 0.022113021, + "hetGenotypeFreq": 0.2386183, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.85857785, + "refHomGenotypeFreq": 0.73926866, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09018036, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.90981966, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3203125, + "altHomGenotypeFreq": 0.171875, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.6796875, + "refHomGenotypeFreq": 0.53125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1269968, + "altHomGenotypeFreq": 0.024361022, + "hetGenotypeFreq": 0.20527157, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8730032, + "refHomGenotypeFreq": 0.7703674, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13190185, + "altHomGenotypeFreq": 0.016359918, + "hetGenotypeFreq": 0.23108384, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.86809814, + "refHomGenotypeFreq": 0.75255626, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2606383, + "altHomGenotypeFreq": 0.06382979, + "hetGenotypeFreq": 0.39361703, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.7393617, + "refHomGenotypeFreq": 0.5425532, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1764706, + "altHomGenotypeFreq": 0.029411765, + "hetGenotypeFreq": 0.29411766, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.8235294, + "refHomGenotypeFreq": 0.6764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10514372, + "altHomGenotypeFreq": 0.010590015, + "hetGenotypeFreq": 0.18910742, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.8948563, + "refHomGenotypeFreq": 0.80030257, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.014285714, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02857143, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.98571426, + "refHomGenotypeFreq": 0.9714286, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.014423077, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.028846154, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.9855769, + "refHomGenotypeFreq": 0.97115386, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12037037, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24074075, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.8796296, + "refHomGenotypeFreq": 0.7592593, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.125, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.20833334, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.875, + "refHomGenotypeFreq": 0.7708333, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10619469, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.15929204, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.8938053, + "refHomGenotypeFreq": 0.8141593, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12254902, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.2254902, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.877451, + "refHomGenotypeFreq": 0.7647059, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14835165, + "altHomGenotypeFreq": 0.021978023, + "hetGenotypeFreq": 0.25274727, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.85164833, + "refHomGenotypeFreq": 0.72527474, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.005376344, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010752688, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.99462366, + "refHomGenotypeFreq": 0.9892473, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.025252525, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05050505, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.9747475, + "refHomGenotypeFreq": 0.94949496, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1635514, + "altHomGenotypeFreq": 0.028037382, + "hetGenotypeFreq": 0.27102804, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.8364486, + "refHomGenotypeFreq": 0.7009346, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13953489, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.27906978, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.8604651, + "refHomGenotypeFreq": 0.7209302, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.119791664, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.17708333, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.8802083, + "refHomGenotypeFreq": 0.7916667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.07575758, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.13131313, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.92424244, + "refHomGenotypeFreq": 0.85858583, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10606061, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21212122, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.8939394, + "refHomGenotypeFreq": 0.7878788, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15109344, + "altHomGenotypeFreq": 0.02584493, + "hetGenotypeFreq": 0.250497, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.8489066, + "refHomGenotypeFreq": 0.723658, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13114753, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.26229507, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.86885244, + "refHomGenotypeFreq": 0.73770493, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28674352, + "altHomGenotypeFreq": 0.095100865, + "hetGenotypeFreq": 0.38328528, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7132565, + "refHomGenotypeFreq": 0.52161384, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08235294, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16470589, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.91764706, + "refHomGenotypeFreq": 0.8352941, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.097087376, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.1553398, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.9029126, + "refHomGenotypeFreq": 0.8252427, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13636364, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.1919192, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.8636364, + "refHomGenotypeFreq": 0.7676768, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1682243, + "altHomGenotypeFreq": 0.028037382, + "hetGenotypeFreq": 0.28037384, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.8317757, + "refHomGenotypeFreq": 0.69158876, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16346154, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.3076923, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.83653843, + "refHomGenotypeFreq": 0.6826923, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13636364, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.25252524, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.8636364, + "refHomGenotypeFreq": 0.7373737, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44117647, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.5294118, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.5588235, + "refHomGenotypeFreq": 0.29411766, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.01686508, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03373016, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.9831349, + "refHomGenotypeFreq": 0.96626985, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.024271844, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04854369, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.97572815, + "refHomGenotypeFreq": 0.9514563, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13224015, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8677598, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1337437, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.8662563, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13155164, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.8684484, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13295577, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.8670442, + "study": "UK10K" + } + ], + "reference": "T", + "start": 23006984, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23006984, + "id": "15:23006984:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 23006984, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -2.25, + "source": "gerp" + }, + { + "score": 0.0689999982714653, + "source": "phastCons" + }, + { + "score": -1.1440000534057617, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.11999988555908203, + "source": "cadd_raw" + }, + { + "score": 1.649999976158142, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+7674T>C", + "ENST00000560625(ENSG00000259176):n.486+6965T>C", + "ENST00000560193(ENSG00000259176):n.339+7674T>C", + "ENST00000557855(ENSG00000259176):n.110+7674T>C" + ], + "id": "rs2435191", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.9939934, + "altHomGenotypeFreq": 0.9879868, + "hetGenotypeFreq": 0.0120131755, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.0060065878, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99898165, + "altHomGenotypeFreq": 0.99796337, + "hetGenotypeFreq": 0.00203666, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.00101833, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99880666, + "altHomGenotypeFreq": 0.9976134, + "hetGenotypeFreq": 0.002386635, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.0011933175, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.98344374, + "altHomGenotypeFreq": 0.9668874, + "hetGenotypeFreq": 0.03311258, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.01655629, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99966705, + "altHomGenotypeFreq": 0.99933416, + "hetGenotypeFreq": 6.6586764E-4, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 3.3293382E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.98005956, + "altHomGenotypeFreq": 0.9601192, + "hetGenotypeFreq": 0.039880816, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.019940408, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9940386, + "altHomGenotypeFreq": 0.98807716, + "hetGenotypeFreq": 0.011922852, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.005961426, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9939377, + "altHomGenotypeFreq": 0.9878753, + "hetGenotypeFreq": 0.012124712, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.006062356, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.998998, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.001002004, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99620605, + "altHomGenotypeFreq": 0.99241215, + "hetGenotypeFreq": 0.0075878594, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.0037939297, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9946808, + "altHomGenotypeFreq": 0.9893617, + "hetGenotypeFreq": 0.010638298, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.005319149, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.98865354, + "altHomGenotypeFreq": 0.9773071, + "hetGenotypeFreq": 0.022692889, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.0113464445, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9907407, + "altHomGenotypeFreq": 0.9814815, + "hetGenotypeFreq": 0.018518519, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.009259259, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9734513, + "altHomGenotypeFreq": 0.94690263, + "hetGenotypeFreq": 0.053097345, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.026548672, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.989899, + "altHomGenotypeFreq": 0.97979796, + "hetGenotypeFreq": 0.02020202, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.01010101, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9918033, + "altHomGenotypeFreq": 0.9836066, + "hetGenotypeFreq": 0.016393442, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.008196721, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9942363, + "altHomGenotypeFreq": 0.98847264, + "hetGenotypeFreq": 0.011527378, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.0057636886, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9941176, + "altHomGenotypeFreq": 0.9882353, + "hetGenotypeFreq": 0.011764706, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.005882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.056179777, + "altHomGenotypeFreq": 0.04494382, + "hetGenotypeFreq": 0.02247191, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.94382024, + "refHomGenotypeFreq": 0.9325843, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9996033, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 3.9672045E-4, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99944043, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 5.595971E-4, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9991909, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 8.090615E-4, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22297399, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22297399, + "id": "15:22297399:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22297399, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 1.8799999952316284, + "source": "gerp" + }, + { + "score": 0.4359999895095825, + "source": "phastCons" + }, + { + "score": 0.5509999990463257, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 1.25, + "source": "cadd_raw" + }, + { + "score": 12.029999732971191, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+7741G>C", + "ENST00000560625(ENSG00000259176):n.486+7032G>C", + "ENST00000560193(ENSG00000259176):n.339+7741G>C", + "ENST00000557855(ENSG00000259176):n.110+7741G>C" + ], + "id": "rs3910010", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.6224157, + "altHomGenotypeFreq": 0.30200094, + "hetGenotypeFreq": 0.6408296, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.37758425, + "refHomGenotypeFreq": 0.05716945, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.66907215, + "altHomGenotypeFreq": 0.36082473, + "hetGenotypeFreq": 0.61649483, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.33092785, + "refHomGenotypeFreq": 0.022680413, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.56153846, + "altHomGenotypeFreq": 0.17820513, + "hetGenotypeFreq": 0.76666665, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.43846154, + "refHomGenotypeFreq": 0.055128206, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77845037, + "altHomGenotypeFreq": 0.5690073, + "hetGenotypeFreq": 0.41888618, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.22154963, + "refHomGenotypeFreq": 0.012106538, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.69, + "altHomGenotypeFreq": 0.4, + "hetGenotypeFreq": 0.58, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.31, + "refHomGenotypeFreq": 0.02, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6968641, + "altHomGenotypeFreq": 0.40650406, + "hetGenotypeFreq": 0.58072007, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.3031359, + "refHomGenotypeFreq": 0.012775842, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.690066, + "altHomGenotypeFreq": 0.3976309, + "hetGenotypeFreq": 0.5848701, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.30993405, + "refHomGenotypeFreq": 0.01749899, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45497048, + "altHomGenotypeFreq": 0.068897635, + "hetGenotypeFreq": 0.7721457, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5450295, + "refHomGenotypeFreq": 0.15895669, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.62051743, + "altHomGenotypeFreq": 0.300361, + "hetGenotypeFreq": 0.64031285, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.37948254, + "refHomGenotypeFreq": 0.059326112, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.62475866, + "altHomGenotypeFreq": 0.30402496, + "hetGenotypeFreq": 0.6414674, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.37524134, + "refHomGenotypeFreq": 0.05450765, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6385768, + "altHomGenotypeFreq": 0.36329588, + "hetGenotypeFreq": 0.5505618, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.36142322, + "refHomGenotypeFreq": 0.086142324, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22297466, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22297466, + "id": "15:22297466:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22297466, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 619, + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10183299 + } + ], + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.440000057220459, + "source": "gerp" + }, + { + "score": 0.01600000075995922, + "source": "phastCons" + }, + { + "score": 0.5789999961853027, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.25, + "source": "cadd_raw" + }, + { + "score": 0.8700000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8137G>C", + "ENST00000560625(ENSG00000259176):n.486+7428G>C", + "ENST00000560193(ENSG00000259176):n.339+8137G>C", + "ENST00000557855(ENSG00000259176):n.110+8137G>C", + "ENST00000554547(ENSG00000258721):n.619C>G" + ], + "id": "rs8025192", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.37577403, + "altHomGenotypeFreq": 0.04501496, + "hetGenotypeFreq": 0.6615181, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.624226, + "refHomGenotypeFreq": 0.29346693, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40752688, + "altHomGenotypeFreq": 0.055913977, + "hetGenotypeFreq": 0.7032258, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5924731, + "refHomGenotypeFreq": 0.24086021, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36760753, + "altHomGenotypeFreq": 0.045698926, + "hetGenotypeFreq": 0.6438172, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.63239247, + "refHomGenotypeFreq": 0.31048387, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53990024, + "altHomGenotypeFreq": 0.18453865, + "hetGenotypeFreq": 0.7107232, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.46009976, + "refHomGenotypeFreq": 0.10473815, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42957747, + "altHomGenotypeFreq": 0.07746479, + "hetGenotypeFreq": 0.70422536, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.57042253, + "refHomGenotypeFreq": 0.21830986, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43123472, + "altHomGenotypeFreq": 0.04828851, + "hetGenotypeFreq": 0.76589245, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5687653, + "refHomGenotypeFreq": 0.18581907, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42084694, + "altHomGenotypeFreq": 0.054284498, + "hetGenotypeFreq": 0.7331249, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.57915306, + "refHomGenotypeFreq": 0.21259059, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2516464, + "altHomGenotypeFreq": 0.010385005, + "hetGenotypeFreq": 0.4825228, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7483536, + "refHomGenotypeFreq": 0.5070922, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37226415, + "altHomGenotypeFreq": 0.045408804, + "hetGenotypeFreq": 0.65371066, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.62773585, + "refHomGenotypeFreq": 0.3008805, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3801183, + "altHomGenotypeFreq": 0.04452748, + "hetGenotypeFreq": 0.6711817, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6198817, + "refHomGenotypeFreq": 0.28429082, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39138576, + "altHomGenotypeFreq": 0.056179777, + "hetGenotypeFreq": 0.670412, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6086142, + "refHomGenotypeFreq": 0.27340823, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22297862, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22297862, + "id": "15:22297862:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22297862, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 601, + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10183299 + } + ], + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2599999904632568, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.5080000162124634, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.4399995803833008, + "source": "cadd_raw" + }, + { + "score": 0.3199999928474426, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8155A>G", + "ENST00000560625(ENSG00000259176):n.486+7446A>G", + "ENST00000560193(ENSG00000259176):n.339+8155A>G", + "ENST00000557855(ENSG00000259176):n.110+8155A>G", + "ENST00000554547(ENSG00000258721):n.601T>C" + ], + "id": "rs11853641", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.3349391, + "altHomGenotypeFreq": 0.027320901, + "hetGenotypeFreq": 0.61599344, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6646824, + "refHomGenotypeFreq": 0.3566857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3118162, + "altHomGenotypeFreq": 0.01750547, + "hetGenotypeFreq": 0.58862144, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6881838, + "refHomGenotypeFreq": 0.3938731, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33892617, + "altHomGenotypeFreq": 0.024161074, + "hetGenotypeFreq": 0.6295302, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6610738, + "refHomGenotypeFreq": 0.34630874, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18486352, + "altHomGenotypeFreq": 0.009925558, + "hetGenotypeFreq": 0.34987593, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.8151365, + "refHomGenotypeFreq": 0.6401985, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2789855, + "altHomGenotypeFreq": 0.014492754, + "hetGenotypeFreq": 0.5289855, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7210145, + "refHomGenotypeFreq": 0.45652175, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2895717, + "altHomGenotypeFreq": 0.013656114, + "hetGenotypeFreq": 0.5518312, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7104283, + "refHomGenotypeFreq": 0.43451273, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29833004, + "altHomGenotypeFreq": 0.018114917, + "hetGenotypeFreq": 0.5604302, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.70167, + "refHomGenotypeFreq": 0.42145485, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4340793, + "altHomGenotypeFreq": 0.052298713, + "hetGenotypeFreq": 0.7662369, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5645828, + "refHomGenotypeFreq": 0.18146436, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33515394, + "altHomGenotypeFreq": 0.028301887, + "hetGenotypeFreq": 0.61444885, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.6644737, + "refHomGenotypeFreq": 0.35724926, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33467183, + "altHomGenotypeFreq": 0.026100386, + "hetGenotypeFreq": 0.61791503, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6649421, + "refHomGenotypeFreq": 0.35598457, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29400748, + "altHomGenotypeFreq": 0.018726591, + "hetGenotypeFreq": 0.5505618, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7059925, + "refHomGenotypeFreq": 0.4307116, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22297880, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22297880, + "id": "15:22297880:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22297880, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 317, + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10183299 + } + ], + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.1399999856948853, + "source": "gerp" + }, + { + "score": 0.028999999165534973, + "source": "phastCons" + }, + { + "score": 0.4779999852180481, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.22999954223632812, + "source": "cadd_raw" + }, + { + "score": 0.9700000286102295, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8439G>T", + "ENST00000560625(ENSG00000259176):n.486+7730G>T", + "ENST00000560193(ENSG00000259176):n.339+8439G>T", + "ENST00000557855(ENSG00000259176):n.110+8439G>T", + "ENST00000554547(ENSG00000258721):n.317C>A" + ], + "id": "rs1816291", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.34961316, + "altHomGenotypeFreq": 0.040411714, + "hetGenotypeFreq": 0.6187483, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.65021414, + "refHomGenotypeFreq": 0.34084, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40471092, + "altHomGenotypeFreq": 0.059957173, + "hetGenotypeFreq": 0.6895075, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.59528905, + "refHomGenotypeFreq": 0.25053534, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33176944, + "altHomGenotypeFreq": 0.017426273, + "hetGenotypeFreq": 0.6286863, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.66823053, + "refHomGenotypeFreq": 0.3538874, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31311882, + "altHomGenotypeFreq": 0.024752475, + "hetGenotypeFreq": 0.5767327, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6868812, + "refHomGenotypeFreq": 0.39851484, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4027778, + "altHomGenotypeFreq": 0.027777778, + "hetGenotypeFreq": 0.75, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5972222, + "refHomGenotypeFreq": 0.22222222, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4102091, + "altHomGenotypeFreq": 0.058425583, + "hetGenotypeFreq": 0.703567, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5897909, + "refHomGenotypeFreq": 0.23800738, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4089758, + "altHomGenotypeFreq": 0.05500844, + "hetGenotypeFreq": 0.70849746, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5907428, + "refHomGenotypeFreq": 0.2364941, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21753329, + "altHomGenotypeFreq": 0.0110524995, + "hetGenotypeFreq": 0.41321278, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7823411, + "refHomGenotypeFreq": 0.57573473, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34681648, + "altHomGenotypeFreq": 0.041323345, + "hetGenotypeFreq": 0.611236, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.65305865, + "refHomGenotypeFreq": 0.3474407, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35307765, + "altHomGenotypeFreq": 0.0392824, + "hetGenotypeFreq": 0.62805444, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.64669037, + "refHomGenotypeFreq": 0.33266315, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.02247191, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.029962547, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9775281, + "refHomGenotypeFreq": 0.9625468, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22298164, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22298164, + "id": "15:22298164:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22298164, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 251, + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10183299 + } + ], + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.2699999809265137, + "source": "gerp" + }, + { + "score": 0.013000000268220901, + "source": "phastCons" + }, + { + "score": 0.47200000286102295, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.020000457763671875, + "source": "cadd_raw" + }, + { + "score": 2.430000066757202, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8505A>T", + "ENST00000560625(ENSG00000259176):n.486+7796A>T", + "ENST00000560193(ENSG00000259176):n.339+8505A>T", + "ENST00000557855(ENSG00000259176):n.110+8505A>T", + "ENST00000554547(ENSG00000258721):n.251T>A" + ], + "id": "rs8036276", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.36995766, + "altHomGenotypeFreq": 0.044782337, + "hetGenotypeFreq": 0.65035063, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6300424, + "refHomGenotypeFreq": 0.30486703, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40528634, + "altHomGenotypeFreq": 0.057268724, + "hetGenotypeFreq": 0.69603527, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.5947136, + "refHomGenotypeFreq": 0.24669604, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3723404, + "altHomGenotypeFreq": 0.045212764, + "hetGenotypeFreq": 0.65425533, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.62765956, + "refHomGenotypeFreq": 0.30053192, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5395062, + "altHomGenotypeFreq": 0.18518518, + "hetGenotypeFreq": 0.70864195, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.46049383, + "refHomGenotypeFreq": 0.10617284, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43103448, + "altHomGenotypeFreq": 0.07586207, + "hetGenotypeFreq": 0.71034485, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5689655, + "refHomGenotypeFreq": 0.2137931, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43137848, + "altHomGenotypeFreq": 0.047762997, + "hetGenotypeFreq": 0.7672309, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5686215, + "refHomGenotypeFreq": 0.18500605, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42125142, + "altHomGenotypeFreq": 0.054304447, + "hetGenotypeFreq": 0.73389393, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.5787486, + "refHomGenotypeFreq": 0.2118016, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2299472, + "altHomGenotypeFreq": 0.009806387, + "hetGenotypeFreq": 0.44028163, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7700528, + "refHomGenotypeFreq": 0.549912, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3668925, + "altHomGenotypeFreq": 0.045540083, + "hetGenotypeFreq": 0.6427048, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.63310754, + "refHomGenotypeFreq": 0.31175512, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37375623, + "altHomGenotypeFreq": 0.043843284, + "hetGenotypeFreq": 0.65982586, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.62624377, + "refHomGenotypeFreq": 0.29633084, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30337077, + "altHomGenotypeFreq": 0.041198503, + "hetGenotypeFreq": 0.52434456, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6966292, + "refHomGenotypeFreq": 0.4344569, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22298230, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22298230, + "id": "15:22298230:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 22298230, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 202, + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10183299 + } + ], + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.159999966621399, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -3.13700008392334, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.5299997329711914, + "source": "cadd_raw" + }, + { + "score": 0.1899999976158142, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8554G>A", + "ENST00000560625(ENSG00000259176):n.486+7845G>A", + "ENST00000560193(ENSG00000259176):n.339+8554G>A", + "ENST00000557855(ENSG00000259176):n.110+8554G>A", + "ENST00000554547(ENSG00000258721):n.202C>T" + ], + "id": "rs11856712", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.28899688, + "altHomGenotypeFreq": 0.014022909, + "hetGenotypeFreq": 0.5499479, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7110031, + "refHomGenotypeFreq": 0.43602917, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29456523, + "altHomGenotypeFreq": 0.010869565, + "hetGenotypeFreq": 0.5673913, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7054348, + "refHomGenotypeFreq": 0.42173913, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23493151, + "altHomGenotypeFreq": 0.006849315, + "hetGenotypeFreq": 0.4561644, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7650685, + "refHomGenotypeFreq": 0.5369863, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15298508, + "altHomGenotypeFreq": 0.0074626864, + "hetGenotypeFreq": 0.29104477, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.8470149, + "refHomGenotypeFreq": 0.70149255, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27659574, + "altHomGenotypeFreq": 0.014184397, + "hetGenotypeFreq": 0.5248227, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7234042, + "refHomGenotypeFreq": 0.4609929, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2751388, + "altHomGenotypeFreq": 0.011721159, + "hetGenotypeFreq": 0.52683526, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7248612, + "refHomGenotypeFreq": 0.46144354, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28621858, + "altHomGenotypeFreq": 0.016097147, + "hetGenotypeFreq": 0.54024285, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7137814, + "refHomGenotypeFreq": 0.44366, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32312927, + "altHomGenotypeFreq": 0.013605442, + "hetGenotypeFreq": 0.61904764, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.67687076, + "refHomGenotypeFreq": 0.36734694, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2865112, + "altHomGenotypeFreq": 0.013413564, + "hetGenotypeFreq": 0.5461953, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.71348876, + "refHomGenotypeFreq": 0.44039112, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2920815, + "altHomGenotypeFreq": 0.014779092, + "hetGenotypeFreq": 0.5546048, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.70791847, + "refHomGenotypeFreq": 0.43061605, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1640625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.328125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.8359375, + "refHomGenotypeFreq": 0.671875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29173324, + "altHomGenotypeFreq": 0.013178914, + "hetGenotypeFreq": 0.55710864, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7082668, + "refHomGenotypeFreq": 0.42971247, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30981594, + "altHomGenotypeFreq": 0.018404908, + "hetGenotypeFreq": 0.5828221, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.69018406, + "refHomGenotypeFreq": 0.398773, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25531915, + "altHomGenotypeFreq": 0.021276595, + "hetGenotypeFreq": 0.4680851, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.7446808, + "refHomGenotypeFreq": 0.5106383, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.627451, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.3529412, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3472012, + "altHomGenotypeFreq": 0.013615734, + "hetGenotypeFreq": 0.66717094, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.6527988, + "refHomGenotypeFreq": 0.3192133, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27142859, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.54285717, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.7285714, + "refHomGenotypeFreq": 0.45714286, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26923078, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.5192308, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.7307692, + "refHomGenotypeFreq": 0.47115386, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3425926, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6851852, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.6574074, + "refHomGenotypeFreq": 0.3148148, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21875, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.78125, + "refHomGenotypeFreq": 0.5833333, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3539823, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.6548673, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.6460177, + "refHomGenotypeFreq": 0.31858408, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3480392, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.61764705, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.6519608, + "refHomGenotypeFreq": 0.34313726, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31868133, + "altHomGenotypeFreq": 0.021978023, + "hetGenotypeFreq": 0.5934066, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.6813187, + "refHomGenotypeFreq": 0.3846154, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28494623, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.54838705, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.71505374, + "refHomGenotypeFreq": 0.4408602, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28282827, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.56565654, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.7171717, + "refHomGenotypeFreq": 0.43434343, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29439253, + "altHomGenotypeFreq": 0.018691588, + "hetGenotypeFreq": 0.55140185, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.7056075, + "refHomGenotypeFreq": 0.42990655, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3372093, + "altHomGenotypeFreq": 0.011627907, + "hetGenotypeFreq": 0.6511628, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.6627907, + "refHomGenotypeFreq": 0.3372093, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30729166, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.59375, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.6927083, + "refHomGenotypeFreq": 0.39583334, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.71717167, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.26262626, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.64646465, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2862823, + "altHomGenotypeFreq": 0.019880716, + "hetGenotypeFreq": 0.5328032, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.7137177, + "refHomGenotypeFreq": 0.4473161, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36885247, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.6721311, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.63114756, + "refHomGenotypeFreq": 0.29508197, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1945245, + "altHomGenotypeFreq": 0.008645534, + "hetGenotypeFreq": 0.37175792, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.80547553, + "refHomGenotypeFreq": 0.61959654, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3529412, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7058824, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.64705884, + "refHomGenotypeFreq": 0.29411766, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3106796, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6213592, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.6893204, + "refHomGenotypeFreq": 0.37864077, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.4949495, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.47474748, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25233644, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.4859813, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.74766356, + "refHomGenotypeFreq": 0.5046729, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26442307, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.50961536, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.7355769, + "refHomGenotypeFreq": 0.48076922, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2929293, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.5454545, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.7070707, + "refHomGenotypeFreq": 0.43434343, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.064705886, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12941177, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.9352941, + "refHomGenotypeFreq": 0.87058824, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27380952, + "altHomGenotypeFreq": 0.003968254, + "hetGenotypeFreq": 0.5396825, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.72619045, + "refHomGenotypeFreq": 0.4563492, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26213592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.52427185, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.7378641, + "refHomGenotypeFreq": 0.47572815, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.099250935, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.19101124, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9007491, + "refHomGenotypeFreq": 0.80524343, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22298279, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22298279, + "id": "15:22298279:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22298279, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 148, + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10183299 + } + ], + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.2699999809265137, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": 0.47200000286102295, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.18000030517578125, + "source": "cadd_raw" + }, + { + "score": 1.2100000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8608A>T", + "ENST00000560625(ENSG00000259176):n.486+7899A>T", + "ENST00000560193(ENSG00000259176):n.339+8608A>T", + "ENST00000557855(ENSG00000259176):n.110+8608A>T", + "ENST00000554547(ENSG00000258721):n.148T>A" + ], + "id": "rs1816290", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.6072648, + "altHomGenotypeFreq": 0.30023435, + "hetGenotypeFreq": 0.61406094, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.39273518, + "refHomGenotypeFreq": 0.08570472, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6635417, + "altHomGenotypeFreq": 0.35416666, + "hetGenotypeFreq": 0.61875, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.33645833, + "refHomGenotypeFreq": 0.027083334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5669192, + "altHomGenotypeFreq": 0.18560606, + "hetGenotypeFreq": 0.7626263, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.43308082, + "refHomGenotypeFreq": 0.051767677, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.76876515, + "altHomGenotypeFreq": 0.55932206, + "hetGenotypeFreq": 0.41888618, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.23123486, + "refHomGenotypeFreq": 0.021791767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.69, + "altHomGenotypeFreq": 0.4, + "hetGenotypeFreq": 0.58, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.31, + "refHomGenotypeFreq": 0.02, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6971098, + "altHomGenotypeFreq": 0.4069364, + "hetGenotypeFreq": 0.5803468, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.30289018, + "refHomGenotypeFreq": 0.012716763, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6897692, + "altHomGenotypeFreq": 0.39735457, + "hetGenotypeFreq": 0.5848293, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.3102308, + "refHomGenotypeFreq": 0.01781617, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39497602, + "altHomGenotypeFreq": 0.057561222, + "hetGenotypeFreq": 0.6748296, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.605024, + "refHomGenotypeFreq": 0.26760918, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6059466, + "altHomGenotypeFreq": 0.29975727, + "hetGenotypeFreq": 0.61237866, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.3940534, + "refHomGenotypeFreq": 0.08786408, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.60888726, + "altHomGenotypeFreq": 0.3008215, + "hetGenotypeFreq": 0.6161314, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.39111277, + "refHomGenotypeFreq": 0.08304705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.670412, + "altHomGenotypeFreq": 0.36329588, + "hetGenotypeFreq": 0.6142322, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.32958803, + "refHomGenotypeFreq": 0.02247191, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22298333, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22298333, + "id": "15:22298333:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 22298333, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.6549999713897705, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": -0.3790000081062317, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 0.6899999976158142, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8770G>C", + "ENST00000560625(ENSG00000259176):n.486+8061G>C", + "ENST00000560193(ENSG00000259176):n.339+8770G>C", + "ENST00000557855(ENSG00000259176):n.110+8770G>C" + ], + "id": "rs2115633", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.5301069, + "altHomGenotypeFreq": 0.15800305, + "hetGenotypeFreq": 0.7442077, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.46989313, + "refHomGenotypeFreq": 0.09778929, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5209205, + "altHomGenotypeFreq": 0.14435147, + "hetGenotypeFreq": 0.75313807, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.47907948, + "refHomGenotypeFreq": 0.10251046, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.61509436, + "altHomGenotypeFreq": 0.2616352, + "hetGenotypeFreq": 0.70691824, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.38490567, + "refHomGenotypeFreq": 0.031446543, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5085784, + "altHomGenotypeFreq": 0.15931372, + "hetGenotypeFreq": 0.6985294, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.49142158, + "refHomGenotypeFreq": 0.14215687, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5133333, + "altHomGenotypeFreq": 0.11333334, + "hetGenotypeFreq": 0.8, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.48666668, + "refHomGenotypeFreq": 0.086666666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49496147, + "altHomGenotypeFreq": 0.12092472, + "hetGenotypeFreq": 0.7480735, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.50503856, + "refHomGenotypeFreq": 0.13100179, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50096536, + "altHomGenotypeFreq": 0.13018894, + "hetGenotypeFreq": 0.7415529, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.4990346, + "refHomGenotypeFreq": 0.12825817, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5810433, + "altHomGenotypeFreq": 0.20330694, + "hetGenotypeFreq": 0.7554728, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.4189567, + "refHomGenotypeFreq": 0.041220307, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.528623, + "altHomGenotypeFreq": 0.15706554, + "hetGenotypeFreq": 0.7431148, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.47137702, + "refHomGenotypeFreq": 0.0998196, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5319354, + "altHomGenotypeFreq": 0.15915827, + "hetGenotypeFreq": 0.7455542, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.4680646, + "refHomGenotypeFreq": 0.095287494, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53125, + "altHomGenotypeFreq": 0.203125, + "hetGenotypeFreq": 0.65625, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.46875, + "refHomGenotypeFreq": 0.140625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5513179, + "altHomGenotypeFreq": 0.17771566, + "hetGenotypeFreq": 0.7472045, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4486821, + "refHomGenotypeFreq": 0.07507987, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5153374, + "altHomGenotypeFreq": 0.112474434, + "hetGenotypeFreq": 0.80572593, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.48466256, + "refHomGenotypeFreq": 0.08179959, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53723407, + "altHomGenotypeFreq": 0.18085106, + "hetGenotypeFreq": 0.71276593, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.46276596, + "refHomGenotypeFreq": 0.10638298, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50980395, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.8039216, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.49019608, + "refHomGenotypeFreq": 0.0882353, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.602118, + "altHomGenotypeFreq": 0.22844176, + "hetGenotypeFreq": 0.7473525, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.39788198, + "refHomGenotypeFreq": 0.024205748, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6142857, + "altHomGenotypeFreq": 0.22857143, + "hetGenotypeFreq": 0.7714286, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.3857143, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6298077, + "altHomGenotypeFreq": 0.30769232, + "hetGenotypeFreq": 0.6442307, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.37019232, + "refHomGenotypeFreq": 0.048076924, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5972222, + "altHomGenotypeFreq": 0.22222222, + "hetGenotypeFreq": 0.75, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.4027778, + "refHomGenotypeFreq": 0.027777778, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5260417, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.71875, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.47395834, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6061947, + "altHomGenotypeFreq": 0.22123894, + "hetGenotypeFreq": 0.7699115, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.3938053, + "refHomGenotypeFreq": 0.0088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53431374, + "altHomGenotypeFreq": 0.14705883, + "hetGenotypeFreq": 0.7745098, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.46568626, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46703297, + "altHomGenotypeFreq": 0.054945055, + "hetGenotypeFreq": 0.82417583, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.53296703, + "refHomGenotypeFreq": 0.12087912, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55376345, + "altHomGenotypeFreq": 0.13978495, + "hetGenotypeFreq": 0.827957, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.44623655, + "refHomGenotypeFreq": 0.032258064, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54545456, + "altHomGenotypeFreq": 0.16161616, + "hetGenotypeFreq": 0.7676768, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.45454547, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5233645, + "altHomGenotypeFreq": 0.17757009, + "hetGenotypeFreq": 0.69158876, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.47663552, + "refHomGenotypeFreq": 0.13084112, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49418604, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.89534885, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.50581396, + "refHomGenotypeFreq": 0.058139537, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.59375, + "altHomGenotypeFreq": 0.20833333, + "hetGenotypeFreq": 0.7708333, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.40625, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6363636, + "altHomGenotypeFreq": 0.28282827, + "hetGenotypeFreq": 0.7070707, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.36363637, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.57575756, + "altHomGenotypeFreq": 0.21212122, + "hetGenotypeFreq": 0.72727275, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.42424244, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49105367, + "altHomGenotypeFreq": 0.11133201, + "hetGenotypeFreq": 0.7594433, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.5089463, + "refHomGenotypeFreq": 0.12922466, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6557377, + "altHomGenotypeFreq": 0.32786885, + "hetGenotypeFreq": 0.6557377, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.3442623, + "refHomGenotypeFreq": 0.016393442, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.518732, + "altHomGenotypeFreq": 0.1815562, + "hetGenotypeFreq": 0.6743516, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.48126802, + "refHomGenotypeFreq": 0.14409222, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5647059, + "altHomGenotypeFreq": 0.15294118, + "hetGenotypeFreq": 0.8235294, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.43529412, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50970876, + "altHomGenotypeFreq": 0.08737864, + "hetGenotypeFreq": 0.84466016, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.49029127, + "refHomGenotypeFreq": 0.067961164, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4949495, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.7070707, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5050505, + "refHomGenotypeFreq": 0.15151516, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46728972, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.80373836, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.53271025, + "refHomGenotypeFreq": 0.13084112, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5144231, + "altHomGenotypeFreq": 0.16346154, + "hetGenotypeFreq": 0.7019231, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.48557693, + "refHomGenotypeFreq": 0.13461539, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.7777778, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49411765, + "altHomGenotypeFreq": 0.1882353, + "hetGenotypeFreq": 0.6117647, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.5058824, + "refHomGenotypeFreq": 0.2, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60218257, + "altHomGenotypeFreq": 0.23809524, + "hetGenotypeFreq": 0.72817457, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.39781746, + "refHomGenotypeFreq": 0.03373016, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.66019416, + "altHomGenotypeFreq": 0.3398058, + "hetGenotypeFreq": 0.6407767, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.3398058, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49625468, + "altHomGenotypeFreq": 0.16479401, + "hetGenotypeFreq": 0.66292137, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5037453, + "refHomGenotypeFreq": 0.17228465, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22298495, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22298495, + "id": "15:22298495:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22298495, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.7200000286102295, + "source": "gerp" + }, + { + "score": 0.02199999988079071, + "source": "phastCons" + }, + { + "score": -0.6959999799728394, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.48999977111816406, + "source": "cadd_raw" + }, + { + "score": 0.23000000417232513, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8853G>T", + "ENST00000560625(ENSG00000259176):n.486+8144G>T", + "ENST00000560193(ENSG00000259176):n.339+8853G>T", + "ENST00000557855(ENSG00000259176):n.110+8853G>T" + ], + "id": "rs66476406", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.36931065, + "altHomGenotypeFreq": 0.044887435, + "hetGenotypeFreq": 0.64884645, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6306893, + "refHomGenotypeFreq": 0.30626613, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4059081, + "altHomGenotypeFreq": 0.05689278, + "hetGenotypeFreq": 0.69803065, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5940919, + "refHomGenotypeFreq": 0.24507658, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3690958, + "altHomGenotypeFreq": 0.04723347, + "hetGenotypeFreq": 0.6437247, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6309042, + "refHomGenotypeFreq": 0.30904183, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5389447, + "altHomGenotypeFreq": 0.18341708, + "hetGenotypeFreq": 0.7110553, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.46105528, + "refHomGenotypeFreq": 0.10552764, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43006992, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.7062937, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5699301, + "refHomGenotypeFreq": 0.21678321, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42967305, + "altHomGenotypeFreq": 0.04873535, + "hetGenotypeFreq": 0.7618754, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.570327, + "refHomGenotypeFreq": 0.18938926, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42146522, + "altHomGenotypeFreq": 0.054446977, + "hetGenotypeFreq": 0.7340365, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5785348, + "refHomGenotypeFreq": 0.21151653, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22916143, + "altHomGenotypeFreq": 0.009569378, + "hetGenotypeFreq": 0.4391841, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.77083856, + "refHomGenotypeFreq": 0.5512465, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36572328, + "altHomGenotypeFreq": 0.045031447, + "hetGenotypeFreq": 0.64138365, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.63427675, + "refHomGenotypeFreq": 0.3135849, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37376896, + "altHomGenotypeFreq": 0.044708457, + "hetGenotypeFreq": 0.658121, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6262311, + "refHomGenotypeFreq": 0.29717055, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26029962, + "altHomGenotypeFreq": 0.052434456, + "hetGenotypeFreq": 0.41573033, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7397004, + "refHomGenotypeFreq": 0.5318352, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22298578, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22298578, + "id": "15:22298578:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22298578, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.550000011920929, + "source": "gerp" + }, + { + "score": 0.35100001096725464, + "source": "phastCons" + }, + { + "score": 0.45399999618530273, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.75, + "source": "cadd_raw" + }, + { + "score": 9.15999984741211, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8865C>G", + "ENST00000560625(ENSG00000259176):n.486+8156C>G", + "ENST00000560193(ENSG00000259176):n.339+8865C>G", + "ENST00000557855(ENSG00000259176):n.110+8865C>G" + ], + "id": "rs1816289", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.61395615, + "altHomGenotypeFreq": 0.30092686, + "hetGenotypeFreq": 0.6260585, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.38604388, + "refHomGenotypeFreq": 0.0730146, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6646091, + "altHomGenotypeFreq": 0.35390946, + "hetGenotypeFreq": 0.62139916, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.33539096, + "refHomGenotypeFreq": 0.024691358, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5680101, + "altHomGenotypeFreq": 0.18765743, + "hetGenotypeFreq": 0.7607053, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.43198994, + "refHomGenotypeFreq": 0.05163728, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7706311, + "altHomGenotypeFreq": 0.55825245, + "hetGenotypeFreq": 0.42475727, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.22936893, + "refHomGenotypeFreq": 0.016990291, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6925676, + "altHomGenotypeFreq": 0.4054054, + "hetGenotypeFreq": 0.5743243, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.30743244, + "refHomGenotypeFreq": 0.02027027, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6963563, + "altHomGenotypeFreq": 0.40543666, + "hetGenotypeFreq": 0.5818392, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.30364373, + "refHomGenotypeFreq": 0.012724118, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6897899, + "altHomGenotypeFreq": 0.3972252, + "hetGenotypeFreq": 0.5851293, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.31021014, + "refHomGenotypeFreq": 0.017645475, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4217033, + "altHomGenotypeFreq": 0.062937066, + "hetGenotypeFreq": 0.71753246, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5782967, + "refHomGenotypeFreq": 0.21953046, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.61280596, + "altHomGenotypeFreq": 0.2996503, + "hetGenotypeFreq": 0.62631136, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.387194, + "refHomGenotypeFreq": 0.07403835, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.61537886, + "altHomGenotypeFreq": 0.30250597, + "hetGenotypeFreq": 0.62574583, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.3846211, + "refHomGenotypeFreq": 0.07174821, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5898876, + "altHomGenotypeFreq": 0.32958803, + "hetGenotypeFreq": 0.52059925, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.41011235, + "refHomGenotypeFreq": 0.14981273, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22298590, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22298590, + "id": "15:22298590:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22298590, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.4700000286102295, + "source": "gerp" + }, + { + "score": 0.19300000369548798, + "source": "phastCons" + }, + { + "score": 0.3720000088214874, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.3400001525878906, + "source": "cadd_raw" + }, + { + "score": 6.090000152587891, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+8885A>G", + "ENST00000560625(ENSG00000259176):n.486+8176A>G", + "ENST00000560193(ENSG00000259176):n.339+8885A>G", + "ENST00000557855(ENSG00000259176):n.110+8885A>G" + ], + "id": "rs1816288", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.34517348, + "altHomGenotypeFreq": 0.03806252, + "hetGenotypeFreq": 0.61422193, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6548265, + "refHomGenotypeFreq": 0.34771556, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40298507, + "altHomGenotypeFreq": 0.057569295, + "hetGenotypeFreq": 0.69083154, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.5970149, + "refHomGenotypeFreq": 0.25159913, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33355525, + "altHomGenotypeFreq": 0.01864181, + "hetGenotypeFreq": 0.6298269, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6664447, + "refHomGenotypeFreq": 0.3515313, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31358024, + "altHomGenotypeFreq": 0.022222223, + "hetGenotypeFreq": 0.58271605, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6864197, + "refHomGenotypeFreq": 0.39506173, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38652483, + "altHomGenotypeFreq": 0.014184397, + "hetGenotypeFreq": 0.7446808, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.6134752, + "refHomGenotypeFreq": 0.24113475, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41117826, + "altHomGenotypeFreq": 0.056797583, + "hetGenotypeFreq": 0.70876133, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.58882177, + "refHomGenotypeFreq": 0.23444109, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40812474, + "altHomGenotypeFreq": 0.05230038, + "hetGenotypeFreq": 0.7116487, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.59187526, + "refHomGenotypeFreq": 0.2360509, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2018579, + "altHomGenotypeFreq": 0.008536279, + "hetGenotypeFreq": 0.38664323, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7981421, + "refHomGenotypeFreq": 0.6048205, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34214446, + "altHomGenotypeFreq": 0.039091587, + "hetGenotypeFreq": 0.60610574, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.6578556, + "refHomGenotypeFreq": 0.35480267, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34893027, + "altHomGenotypeFreq": 0.03678621, + "hetGenotypeFreq": 0.62428814, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6510697, + "refHomGenotypeFreq": 0.33892566, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30898875, + "altHomGenotypeFreq": 0.04868914, + "hetGenotypeFreq": 0.52059925, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.69101125, + "refHomGenotypeFreq": 0.4307116, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22298610, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22298610, + "id": "15:22298610:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22298610, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.7929999828338623, + "source": "gerp" + }, + { + "score": 0.04500000178813934, + "source": "phastCons" + }, + { + "score": 0.44699999690055847, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.22999954223632812, + "source": "cadd_raw" + }, + { + "score": 5.019999980926514, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+9059G>A", + "ENST00000560625(ENSG00000259176):n.486+8350G>A", + "ENST00000560193(ENSG00000259176):n.339+9059G>A", + "ENST00000557855(ENSG00000259176):n.110+9059G>A" + ], + "id": "rs68004392", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.36947274, + "altHomGenotypeFreq": 0.04449714, + "hetGenotypeFreq": 0.64995116, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.63052726, + "refHomGenotypeFreq": 0.30555168, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4074074, + "altHomGenotypeFreq": 0.05664488, + "hetGenotypeFreq": 0.70152503, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5925926, + "refHomGenotypeFreq": 0.24183007, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37127373, + "altHomGenotypeFreq": 0.044715445, + "hetGenotypeFreq": 0.6531165, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6287263, + "refHomGenotypeFreq": 0.302168, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5374065, + "altHomGenotypeFreq": 0.1820449, + "hetGenotypeFreq": 0.7107232, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.46259353, + "refHomGenotypeFreq": 0.10723192, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43006992, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.7062937, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5699301, + "refHomGenotypeFreq": 0.21678321, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42910448, + "altHomGenotypeFreq": 0.049129352, + "hetGenotypeFreq": 0.7599502, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5708955, + "refHomGenotypeFreq": 0.1909204, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42151287, + "altHomGenotypeFreq": 0.053746622, + "hetGenotypeFreq": 0.73553246, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.57848716, + "refHomGenotypeFreq": 0.21072088, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22876643, + "altHomGenotypeFreq": 0.009605662, + "hetGenotypeFreq": 0.43832153, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.77123356, + "refHomGenotypeFreq": 0.5520728, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36616257, + "altHomGenotypeFreq": 0.044990547, + "hetGenotypeFreq": 0.64234406, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.6338374, + "refHomGenotypeFreq": 0.3126654, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37357488, + "altHomGenotypeFreq": 0.043885678, + "hetGenotypeFreq": 0.6593784, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6264251, + "refHomGenotypeFreq": 0.2967359, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22298784, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22298784, + "id": "15:22298784:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22298784, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258721", + "ensemblTranscriptId": "ENST00000554547", + "geneName": "OR11H3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.14399999380111694, + "source": "gerp" + }, + { + "score": 0.006000000052154064, + "source": "phastCons" + }, + { + "score": -1.1979999542236328, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 4.869999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+12339C>T", + "ENST00000560625(ENSG00000259176):n.486+11630C>T", + "ENST00000560193(ENSG00000259176):n.339+12339C>T", + "ENST00000557855(ENSG00000259176):n.110+12339C>T" + ], + "id": "rs1835187", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.4484522, + "altHomGenotypeFreq": 0.07062942, + "hetGenotypeFreq": 0.7556456, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5515478, + "refHomGenotypeFreq": 0.17372504, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44301075, + "altHomGenotypeFreq": 0.077419356, + "hetGenotypeFreq": 0.7311828, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.55698925, + "refHomGenotypeFreq": 0.19139785, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47225893, + "altHomGenotypeFreq": 0.10171731, + "hetGenotypeFreq": 0.7410832, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5277411, + "refHomGenotypeFreq": 0.15719947, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5707317, + "altHomGenotypeFreq": 0.22682928, + "hetGenotypeFreq": 0.6878049, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.4292683, + "refHomGenotypeFreq": 0.085365854, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4527027, + "altHomGenotypeFreq": 0.08108108, + "hetGenotypeFreq": 0.7432432, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.5472973, + "refHomGenotypeFreq": 0.17567568, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4685063, + "altHomGenotypeFreq": 0.067186564, + "hetGenotypeFreq": 0.8026395, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5314937, + "refHomGenotypeFreq": 0.13017397, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45072812, + "altHomGenotypeFreq": 0.07182242, + "hetGenotypeFreq": 0.75781137, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.5492719, + "refHomGenotypeFreq": 0.17036618, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41985676, + "altHomGenotypeFreq": 0.04717214, + "hetGenotypeFreq": 0.74536926, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5801433, + "refHomGenotypeFreq": 0.20745863, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44699317, + "altHomGenotypeFreq": 0.07241166, + "hetGenotypeFreq": 0.74916303, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.5530068, + "refHomGenotypeFreq": 0.1784253, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45026138, + "altHomGenotypeFreq": 0.068419434, + "hetGenotypeFreq": 0.7636839, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.54973865, + "refHomGenotypeFreq": 0.16789667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5859375, + "altHomGenotypeFreq": 0.28125, + "hetGenotypeFreq": 0.609375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.4140625, + "refHomGenotypeFreq": 0.109375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42691693, + "altHomGenotypeFreq": 0.09384984, + "hetGenotypeFreq": 0.6661342, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.57308304, + "refHomGenotypeFreq": 0.24001597, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42842537, + "altHomGenotypeFreq": 0.08997955, + "hetGenotypeFreq": 0.6768916, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.5715746, + "refHomGenotypeFreq": 0.23312883, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4680851, + "altHomGenotypeFreq": 0.14893617, + "hetGenotypeFreq": 0.63829786, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.5319149, + "refHomGenotypeFreq": 0.21276596, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44117647, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.7647059, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.5588235, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35098335, + "altHomGenotypeFreq": 0.031770047, + "hetGenotypeFreq": 0.63842666, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.6490166, + "refHomGenotypeFreq": 0.32980332, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46190476, + "altHomGenotypeFreq": 0.114285715, + "hetGenotypeFreq": 0.6952381, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.53809524, + "refHomGenotypeFreq": 0.1904762, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49519232, + "altHomGenotypeFreq": 0.16346154, + "hetGenotypeFreq": 0.66346157, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.5048077, + "refHomGenotypeFreq": 0.17307693, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3101852, + "altHomGenotypeFreq": 0.009259259, + "hetGenotypeFreq": 0.6018518, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.6898148, + "refHomGenotypeFreq": 0.3888889, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5052083, + "altHomGenotypeFreq": 0.19791667, + "hetGenotypeFreq": 0.6145834, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.49479166, + "refHomGenotypeFreq": 0.1875, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36283186, + "altHomGenotypeFreq": 0.061946902, + "hetGenotypeFreq": 0.6017699, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.63716817, + "refHomGenotypeFreq": 0.33628318, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38235295, + "altHomGenotypeFreq": 0.078431375, + "hetGenotypeFreq": 0.60784316, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.61764705, + "refHomGenotypeFreq": 0.3137255, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3791209, + "altHomGenotypeFreq": 0.054945055, + "hetGenotypeFreq": 0.64835167, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.6208791, + "refHomGenotypeFreq": 0.2967033, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40860215, + "altHomGenotypeFreq": 0.086021505, + "hetGenotypeFreq": 0.6451613, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.5913978, + "refHomGenotypeFreq": 0.26881722, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4040404, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.74747473, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.5959596, + "refHomGenotypeFreq": 0.22222222, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42990655, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.76635516, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.57009345, + "refHomGenotypeFreq": 0.18691589, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40697673, + "altHomGenotypeFreq": 0.093023255, + "hetGenotypeFreq": 0.627907, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.59302324, + "refHomGenotypeFreq": 0.27906978, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.375, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.7083333, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.625, + "refHomGenotypeFreq": 0.27083334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34343433, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.62626266, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.65656567, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35858586, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.6363636, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.64141417, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41252485, + "altHomGenotypeFreq": 0.055666003, + "hetGenotypeFreq": 0.7137177, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.5874751, + "refHomGenotypeFreq": 0.2306163, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3442623, + "altHomGenotypeFreq": 0.04918033, + "hetGenotypeFreq": 0.59016395, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.6557377, + "refHomGenotypeFreq": 0.36065573, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.55043226, + "altHomGenotypeFreq": 0.25072047, + "hetGenotypeFreq": 0.59942365, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.44956774, + "refHomGenotypeFreq": 0.14985591, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3647059, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.7058824, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.63529414, + "refHomGenotypeFreq": 0.28235295, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.407767, + "altHomGenotypeFreq": 0.029126214, + "hetGenotypeFreq": 0.75728154, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.592233, + "refHomGenotypeFreq": 0.21359223, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43939394, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.7171717, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.56060606, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40654206, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.7196262, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.59345794, + "refHomGenotypeFreq": 0.23364486, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45673078, + "altHomGenotypeFreq": 0.115384616, + "hetGenotypeFreq": 0.6826923, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.5432692, + "refHomGenotypeFreq": 0.20192307, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4040404, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.7070707, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.5959596, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7294118, + "altHomGenotypeFreq": 0.5058824, + "hetGenotypeFreq": 0.44705883, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.27058825, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45436507, + "altHomGenotypeFreq": 0.109126985, + "hetGenotypeFreq": 0.6904762, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5456349, + "refHomGenotypeFreq": 0.20039682, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49514562, + "altHomGenotypeFreq": 0.14563107, + "hetGenotypeFreq": 0.6990291, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5048544, + "refHomGenotypeFreq": 0.1553398, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22302064, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22302064, + "id": "15:22302064:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22302064, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.3630000054836273, + "source": "gerp" + }, + { + "score": 0.004999999888241291, + "source": "phastCons" + }, + { + "score": -0.531000018119812, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.05000019073486328, + "source": "cadd_raw" + }, + { + "score": 2.130000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.599+13855T>G", + "ENST00000560625(ENSG00000259176):n.486+13146T>G", + "ENST00000560193(ENSG00000259176):n.339+13855T>G", + "ENST00000557855(ENSG00000259176):n.110+13855T>G", + "ENST00000559392(ENSG00000259176):n.100+298T>G", + "ENST00000558896(ENSG00000259176):n.99+298T>G", + "ENST00000557817(ENSG00000259176):n.71+298T>G", + "ENST00000558312(ENSG00000259176):n.71+298T>G", + "ENST00000558798(ENSG00000259176):n.71+298T>G" + ], + "id": "rs11852599", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.3711943, + "altHomGenotypeFreq": 0.044699695, + "hetGenotypeFreq": 0.6529892, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6288057, + "refHomGenotypeFreq": 0.3023111, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40528634, + "altHomGenotypeFreq": 0.057268724, + "hetGenotypeFreq": 0.69603527, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.5947136, + "refHomGenotypeFreq": 0.24669604, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3707941, + "altHomGenotypeFreq": 0.04576043, + "hetGenotypeFreq": 0.65006727, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.62920594, + "refHomGenotypeFreq": 0.30417228, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5389447, + "altHomGenotypeFreq": 0.18341708, + "hetGenotypeFreq": 0.7110553, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.46105528, + "refHomGenotypeFreq": 0.10552764, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43150684, + "altHomGenotypeFreq": 0.07534247, + "hetGenotypeFreq": 0.7123288, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.5684931, + "refHomGenotypeFreq": 0.21232876, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4323995, + "altHomGenotypeFreq": 0.047503047, + "hetGenotypeFreq": 0.7697929, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.5676005, + "refHomGenotypeFreq": 0.18270402, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4233814, + "altHomGenotypeFreq": 0.054566015, + "hetGenotypeFreq": 0.7376308, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.5766186, + "refHomGenotypeFreq": 0.20780322, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23091364, + "altHomGenotypeFreq": 0.00951189, + "hetGenotypeFreq": 0.4428035, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.76908636, + "refHomGenotypeFreq": 0.5476846, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36758646, + "altHomGenotypeFreq": 0.044824574, + "hetGenotypeFreq": 0.6455238, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6324135, + "refHomGenotypeFreq": 0.30965164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37567905, + "altHomGenotypeFreq": 0.044544466, + "hetGenotypeFreq": 0.6622691, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.624321, + "refHomGenotypeFreq": 0.2931864, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8417", + "percentageMatch": 0.952539, + "source": "genomicSuperDup", + "start": 22292374 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "10642", + "percentageMatch": 0.952837, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22308960, + "id": "8401", + "percentageMatch": 0.951726, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22303580, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22303580, + "id": "15:22303580:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 22303580, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.3709999918937683, + "source": "gerp" + }, + { + "score": 0.023000000044703484, + "source": "phastCons" + }, + { + "score": 0.16200000047683716, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 1.7699999809265137, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.600-8560G>A", + "ENST00000560625(ENSG00000259176):n.487-7977G>A", + "ENST00000560193(ENSG00000259176):n.340-8560G>A", + "ENST00000557855(ENSG00000259176):n.110+20592G>A", + "ENST00000559392(ENSG00000259176):n.100+7035G>A", + "ENST00000558896(ENSG00000259176):n.99+7035G>A", + "ENST00000557817(ENSG00000259176):n.71+7035G>A", + "ENST00000558312(ENSG00000259176):n.71+7035G>A", + "ENST00000558798(ENSG00000259176):n.71+7035G>A" + ], + "id": "rs7167083", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.508498, + "altHomGenotypeFreq": 0.13401228, + "hetGenotypeFreq": 0.74897146, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.491502, + "refHomGenotypeFreq": 0.117016256, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5220126, + "altHomGenotypeFreq": 0.14884695, + "hetGenotypeFreq": 0.7463312, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.4779874, + "refHomGenotypeFreq": 0.1048218, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47463283, + "altHomGenotypeFreq": 0.10146862, + "hetGenotypeFreq": 0.7463284, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.52536714, + "refHomGenotypeFreq": 0.15220293, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.61916465, + "altHomGenotypeFreq": 0.2800983, + "hetGenotypeFreq": 0.67813265, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.38083538, + "refHomGenotypeFreq": 0.041769043, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52, + "altHomGenotypeFreq": 0.13333334, + "hetGenotypeFreq": 0.7733333, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.48, + "refHomGenotypeFreq": 0.093333334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56537104, + "altHomGenotypeFreq": 0.18904594, + "hetGenotypeFreq": 0.7526502, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.43462896, + "refHomGenotypeFreq": 0.058303885, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.54657537, + "altHomGenotypeFreq": 0.16205479, + "hetGenotypeFreq": 0.7690411, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.45342466, + "refHomGenotypeFreq": 0.06890411, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40904596, + "altHomGenotypeFreq": 0.049925853, + "hetGenotypeFreq": 0.71824026, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.590954, + "refHomGenotypeFreq": 0.2318339, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5050641, + "altHomGenotypeFreq": 0.13483831, + "hetGenotypeFreq": 0.7404515, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.49493593, + "refHomGenotypeFreq": 0.12471019, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.51274127, + "altHomGenotypeFreq": 0.13299155, + "hetGenotypeFreq": 0.7594994, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.48725873, + "refHomGenotypeFreq": 0.10750905, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22310317, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22310317, + "id": "15:22310317:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22310317, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259324", + "ensemblTranscriptId": "ENST00000558299", + "geneName": "OR11K1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.13099999725818634, + "source": "gerp" + }, + { + "score": 0.020999999716877937, + "source": "phastCons" + }, + { + "score": 0.17399999499320984, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.38000011444091797, + "source": "cadd_raw" + }, + { + "score": 0.4399999976158142, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.600-3696G>C", + "ENST00000560625(ENSG00000259176):n.487-3113G>C", + "ENST00000560193(ENSG00000259176):n.340-3696G>C", + "ENST00000557855(ENSG00000259176):n.110+25456G>C", + "ENST00000559392(ENSG00000259176):n.101-3696G>C", + "ENST00000558896(ENSG00000259176):n.100-3696G>C", + "ENST00000557817(ENSG00000259176):n.72-3696G>C", + "ENST00000558312(ENSG00000259176):n.72-3696G>C", + "ENST00000558798(ENSG00000259176):n.72-3696G>C" + ], + "id": "rs12050738", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.24752162, + "altHomGenotypeFreq": 0.010616607, + "hetGenotypeFreq": 0.47381002, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.75247836, + "refHomGenotypeFreq": 0.5155734, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24387528, + "altHomGenotypeFreq": 0.004454343, + "hetGenotypeFreq": 0.47884187, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.75612473, + "refHomGenotypeFreq": 0.5167038, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4537037, + "altHomGenotypeFreq": 0.06878307, + "hetGenotypeFreq": 0.76984125, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5462963, + "refHomGenotypeFreq": 0.16137566, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15632755, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3126551, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.84367245, + "refHomGenotypeFreq": 0.6873449, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.225, + "altHomGenotypeFreq": 0.042857144, + "hetGenotypeFreq": 0.3642857, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.775, + "refHomGenotypeFreq": 0.5928571, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21292308, + "altHomGenotypeFreq": 0.0067692306, + "hetGenotypeFreq": 0.41230768, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.78707695, + "refHomGenotypeFreq": 0.5809231, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23071367, + "altHomGenotypeFreq": 0.0078012133, + "hetGenotypeFreq": 0.4458249, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.76928633, + "refHomGenotypeFreq": 0.5463739, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26234725, + "altHomGenotypeFreq": 0.0066191447, + "hetGenotypeFreq": 0.5114562, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7376528, + "refHomGenotypeFreq": 0.48192465, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2485707, + "altHomGenotypeFreq": 0.011307331, + "hetGenotypeFreq": 0.47452673, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7514293, + "refHomGenotypeFreq": 0.51416594, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24622166, + "altHomGenotypeFreq": 0.009760706, + "hetGenotypeFreq": 0.4729219, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.75377834, + "refHomGenotypeFreq": 0.51731735, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22315181, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22315181, + "id": "15:22315181:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22315181, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560625", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259324", + "ensemblTranscriptId": "ENST00000558299", + "geneName": "OR11K1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.13099999725818634, + "source": "gerp" + }, + { + "score": 0.09200000017881393, + "source": "phastCons" + }, + { + "score": -1.38100004196167, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.06999969482421875, + "source": "cadd_raw" + }, + { + "score": 3.2899999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.600-3133T>C", + "ENST00000560625(ENSG00000259176):n.487-2550T>C", + "ENST00000560193(ENSG00000259176):n.340-3133T>C", + "ENST00000557855(ENSG00000259176):n.110+26019T>C", + "ENST00000559392(ENSG00000259176):n.101-3133T>C", + "ENST00000558896(ENSG00000259176):n.100-3133T>C", + "ENST00000557817(ENSG00000259176):n.72-3133T>C", + "ENST00000558312(ENSG00000259176):n.72-3133T>C", + "ENST00000558798(ENSG00000259176):n.72-3133T>C" + ], + "id": "rs1594179", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.71640915, + "altHomGenotypeFreq": 0.4444879, + "hetGenotypeFreq": 0.5438425, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.28359085, + "refHomGenotypeFreq": 0.0116696, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6923868, + "altHomGenotypeFreq": 0.39506173, + "hetGenotypeFreq": 0.5946502, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.30761316, + "refHomGenotypeFreq": 0.010288066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83819795, + "altHomGenotypeFreq": 0.680203, + "hetGenotypeFreq": 0.31598985, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.16180202, + "refHomGenotypeFreq": 0.0038071065, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7236842, + "altHomGenotypeFreq": 0.4569378, + "hetGenotypeFreq": 0.5334928, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.27631578, + "refHomGenotypeFreq": 0.009569378, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.69463086, + "altHomGenotypeFreq": 0.40268457, + "hetGenotypeFreq": 0.58389264, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.30536914, + "refHomGenotypeFreq": 0.013422819, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70086956, + "altHomGenotypeFreq": 0.41797101, + "hetGenotypeFreq": 0.5657971, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.29913044, + "refHomGenotypeFreq": 0.016231883, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6967499, + "altHomGenotypeFreq": 0.4081386, + "hetGenotypeFreq": 0.57722265, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.30325007, + "refHomGenotypeFreq": 0.014638732, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7370002, + "altHomGenotypeFreq": 0.48047146, + "hetGenotypeFreq": 0.51305753, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.26299977, + "refHomGenotypeFreq": 0.006470996, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7175888, + "altHomGenotypeFreq": 0.44779992, + "hetGenotypeFreq": 0.53957766, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.28241122, + "refHomGenotypeFreq": 0.01262239, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71495193, + "altHomGenotypeFreq": 0.4403964, + "hetGenotypeFreq": 0.54911107, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.2850481, + "refHomGenotypeFreq": 0.010492568, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78125, + "altHomGenotypeFreq": 0.5625, + "hetGenotypeFreq": 0.4375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.21875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.76896966, + "altHomGenotypeFreq": 0.54552716, + "hetGenotypeFreq": 0.446885, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.23103034, + "refHomGenotypeFreq": 0.0075878594, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7372188, + "altHomGenotypeFreq": 0.4805726, + "hetGenotypeFreq": 0.51329243, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.26278117, + "refHomGenotypeFreq": 0.006134969, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7606383, + "altHomGenotypeFreq": 0.5425532, + "hetGenotypeFreq": 0.43617022, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.2393617, + "refHomGenotypeFreq": 0.021276595, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.74509805, + "altHomGenotypeFreq": 0.49019608, + "hetGenotypeFreq": 0.50980395, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.25490198, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.779879, + "altHomGenotypeFreq": 0.56732225, + "hetGenotypeFreq": 0.42511347, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.22012103, + "refHomGenotypeFreq": 0.0075642965, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84761906, + "altHomGenotypeFreq": 0.6952381, + "hetGenotypeFreq": 0.30476192, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.15238096, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8269231, + "altHomGenotypeFreq": 0.65384614, + "hetGenotypeFreq": 0.34615386, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.17307693, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7453704, + "altHomGenotypeFreq": 0.5, + "hetGenotypeFreq": 0.49074072, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.25462964, + "refHomGenotypeFreq": 0.009259259, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7864583, + "altHomGenotypeFreq": 0.5833333, + "hetGenotypeFreq": 0.40625, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.21354167, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8053097, + "altHomGenotypeFreq": 0.6106195, + "hetGenotypeFreq": 0.3893805, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.19469027, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71568626, + "altHomGenotypeFreq": 0.43137255, + "hetGenotypeFreq": 0.5686275, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.28431374, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.66483516, + "altHomGenotypeFreq": 0.35164836, + "hetGenotypeFreq": 0.62637365, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.33516484, + "refHomGenotypeFreq": 0.021978023, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81182796, + "altHomGenotypeFreq": 0.6236559, + "hetGenotypeFreq": 0.37634408, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.18817204, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8333333, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.33333334, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.16666667, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7383177, + "altHomGenotypeFreq": 0.49532712, + "hetGenotypeFreq": 0.48598132, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.26168224, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7267442, + "altHomGenotypeFreq": 0.4651163, + "hetGenotypeFreq": 0.5232558, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.27325583, + "refHomGenotypeFreq": 0.011627907, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8125, + "altHomGenotypeFreq": 0.6354167, + "hetGenotypeFreq": 0.35416666, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.1875, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7373737, + "altHomGenotypeFreq": 0.4848485, + "hetGenotypeFreq": 0.50505054, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.26262626, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8030303, + "altHomGenotypeFreq": 0.61616164, + "hetGenotypeFreq": 0.37373737, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.1969697, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71073556, + "altHomGenotypeFreq": 0.43538767, + "hetGenotypeFreq": 0.55069584, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.2892644, + "refHomGenotypeFreq": 0.013916501, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8114754, + "altHomGenotypeFreq": 0.6229508, + "hetGenotypeFreq": 0.37704918, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.18852459, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7838617, + "altHomGenotypeFreq": 0.5792507, + "hetGenotypeFreq": 0.4092219, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.21613833, + "refHomGenotypeFreq": 0.011527377, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7529412, + "altHomGenotypeFreq": 0.5176471, + "hetGenotypeFreq": 0.47058824, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.24705882, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71359223, + "altHomGenotypeFreq": 0.4368932, + "hetGenotypeFreq": 0.5533981, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.28640777, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7323232, + "altHomGenotypeFreq": 0.46464646, + "hetGenotypeFreq": 0.53535354, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.26767677, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71495324, + "altHomGenotypeFreq": 0.42990655, + "hetGenotypeFreq": 0.57009345, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.28504673, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75961536, + "altHomGenotypeFreq": 0.52884614, + "hetGenotypeFreq": 0.46153846, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.24038461, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6969697, + "altHomGenotypeFreq": 0.42424244, + "hetGenotypeFreq": 0.5454545, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.3030303, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84117645, + "altHomGenotypeFreq": 0.69411767, + "hetGenotypeFreq": 0.29411766, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.15882353, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8333333, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.33333334, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.16666667, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8446602, + "altHomGenotypeFreq": 0.6893204, + "hetGenotypeFreq": 0.3106796, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.1553398, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22315744, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22315744, + "id": "15:22315744:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22315744, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259324", + "ensemblTranscriptId": "ENST00000558299", + "geneName": "OR11K1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 4.440000057220459, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.694+5058C>T", + "ENST00000560193(ENSG00000259176):n.434+5058C>T", + "ENST00000557855(ENSG00000259176):n.111-22643C>T", + "ENST00000559392(ENSG00000259176):n.195+5058C>T", + "ENST00000558896(ENSG00000259176):n.194+5058C>T", + "ENST00000557817(ENSG00000259176):n.166+5058C>T", + "ENST00000558312(ENSG00000259176):n.166+5058C>T", + "ENST00000558798(ENSG00000259176):n.166+5058C>T" + ], + "id": "rs199883958", + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 4, + "copyNumber": 89.2, + "end": 22324204, + "percentageMatch": 0.81, + "period": 4, + "score": 271, + "sequence": "TTTC", + "source": "trf", + "start": 22323842 + }, + { + "chromosome": "15", + "consensusSize": 110, + "copyNumber": 2.7, + "end": 22324171, + "percentageMatch": 0.83, + "period": 110, + "score": 351, + "sequence": "TTTCTTTTCTTTCTTTCTTTCTTTTCTTTCTTTCTTTCTTTCTTCCTTTCTTTCTTTCTTTCTTTCTTCTCTCTTTTCCTTCCCTCTCTCCTTCCCTTCCCTTCCCTTCC", + "source": "trf", + "start": 22323872 + }, + { + "chromosome": "15", + "consensusSize": 112, + "copyNumber": 2.8, + "end": 22324185, + "percentageMatch": 0.8, + "period": 114, + "score": 333, + "sequence": "TTTCTTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTCTCTTTCTTCCTCTCTCTCCTTCCCTTCCCTTCCCTTCCTTC", + "source": "trf", + "start": 22323872 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22324029, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22324029, + "id": "15:22324029:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22324029, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259324", + "ensemblTranscriptId": "ENST00000558299", + "geneName": "OR11K1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 3.5899999141693115, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.694+5149C>T", + "ENST00000560193(ENSG00000259176):n.434+5149C>T", + "ENST00000557855(ENSG00000259176):n.111-22552C>T", + "ENST00000559392(ENSG00000259176):n.195+5149C>T", + "ENST00000558896(ENSG00000259176):n.194+5149C>T", + "ENST00000557817(ENSG00000259176):n.166+5149C>T", + "ENST00000558312(ENSG00000259176):n.166+5149C>T", + "ENST00000558798(ENSG00000259176):n.166+5149C>T" + ], + "id": "rs201078990", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.34569463, + "altHomGenotypeFreq": 0.039435595, + "hetGenotypeFreq": 0.6172214, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6519537, + "refHomGenotypeFreq": 0.343343, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3881579, + "altHomGenotypeFreq": 0.05263158, + "hetGenotypeFreq": 0.68421054, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.6052632, + "refHomGenotypeFreq": 0.2631579, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2920792, + "altHomGenotypeFreq": 0.04950495, + "hetGenotypeFreq": 0.48514852, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.7079208, + "refHomGenotypeFreq": 0.46534654, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44512194, + "altHomGenotypeFreq": 0.07317073, + "hetGenotypeFreq": 0.74390244, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.55487806, + "refHomGenotypeFreq": 0.18292683, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48, + "altHomGenotypeFreq": 0.04, + "hetGenotypeFreq": 0.88, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.52, + "refHomGenotypeFreq": 0.08, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38073394, + "altHomGenotypeFreq": 0.050458714, + "hetGenotypeFreq": 0.6605505, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.61926603, + "refHomGenotypeFreq": 0.28899083, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41538462, + "altHomGenotypeFreq": 0.05034965, + "hetGenotypeFreq": 0.73356646, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.58286715, + "refHomGenotypeFreq": 0.21608391, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20552884, + "altHomGenotypeFreq": 0.012019231, + "hetGenotypeFreq": 0.3954327, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7902644, + "refHomGenotypeFreq": 0.5925481, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34536424, + "altHomGenotypeFreq": 0.037086096, + "hetGenotypeFreq": 0.6218543, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.6519868, + "refHomGenotypeFreq": 0.3410596, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3460925, + "altHomGenotypeFreq": 0.042264752, + "hetGenotypeFreq": 0.6116428, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.6519139, + "refHomGenotypeFreq": 0.3460925, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 4, + "copyNumber": 89.2, + "end": 22324204, + "percentageMatch": 0.81, + "period": 4, + "score": 271, + "sequence": "TTTC", + "source": "trf", + "start": 22323842 + }, + { + "chromosome": "15", + "consensusSize": 110, + "copyNumber": 2.7, + "end": 22324171, + "percentageMatch": 0.83, + "period": 110, + "score": 351, + "sequence": "TTTCTTTTCTTTCTTTCTTTCTTTTCTTTCTTTCTTTCTTTCTTCCTTTCTTTCTTTCTTTCTTTCTTCTCTCTTTTCCTTCCCTCTCTCCTTCCCTTCCCTTCCCTTCC", + "source": "trf", + "start": 22323872 + }, + { + "chromosome": "15", + "consensusSize": 112, + "copyNumber": 2.8, + "end": 22324185, + "percentageMatch": 0.8, + "period": 114, + "score": 333, + "sequence": "TTTCTTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTCTCTTTCTTCCTCTCTCTCCTTCCCTTCCCTTCCCTTCCTTC", + "source": "trf", + "start": 22323872 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22324120, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22324120, + "id": "15:22324120:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22324120, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259324", + "ensemblTranscriptId": "ENST00000558299", + "geneName": "OR11K1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.25, + "source": "cadd_raw" + }, + { + "score": 0.8600000143051147, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.694+5151G>C", + "ENST00000560193(ENSG00000259176):n.434+5151G>C", + "ENST00000557855(ENSG00000259176):n.111-22550G>C", + "ENST00000559392(ENSG00000259176):n.195+5151G>C", + "ENST00000558896(ENSG00000259176):n.194+5151G>C", + "ENST00000557817(ENSG00000259176):n.166+5151G>C", + "ENST00000558312(ENSG00000259176):n.166+5151G>C", + "ENST00000558798(ENSG00000259176):n.166+5151G>C" + ], + "id": "rs112247075", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.14569932, + "altHomGenotypeFreq": 0.10052355, + "hetGenotypeFreq": 0.6237846, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.58758414, + "refHomGenotypeFreq": 0.27569184, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1436464, + "altHomGenotypeFreq": 0.060773484, + "hetGenotypeFreq": 0.6353591, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.621547, + "refHomGenotypeFreq": 0.3038674, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19456068, + "altHomGenotypeFreq": 0.0753138, + "hetGenotypeFreq": 0.45188284, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6987448, + "refHomGenotypeFreq": 0.47280335, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21787709, + "altHomGenotypeFreq": 0.10055866, + "hetGenotypeFreq": 0.5363128, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6312849, + "refHomGenotypeFreq": 0.36312848, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1923077, + "altHomGenotypeFreq": 0.15384616, + "hetGenotypeFreq": 0.53846157, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5769231, + "refHomGenotypeFreq": 0.30769232, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15774378, + "altHomGenotypeFreq": 0.093690254, + "hetGenotypeFreq": 0.51434034, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6491396, + "refHomGenotypeFreq": 0.3919694, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18454662, + "altHomGenotypeFreq": 0.08429119, + "hetGenotypeFreq": 0.61430395, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.6085568, + "refHomGenotypeFreq": 0.30140486, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08070618, + "altHomGenotypeFreq": 0.12778477, + "hetGenotypeFreq": 0.6851618, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5296343, + "refHomGenotypeFreq": 0.18705338, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14336044, + "altHomGenotypeFreq": 0.104336046, + "hetGenotypeFreq": 0.6249322, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.58319783, + "refHomGenotypeFreq": 0.27073172, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14858097, + "altHomGenotypeFreq": 0.09582639, + "hetGenotypeFreq": 0.6223706, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.5929883, + "refHomGenotypeFreq": 0.281803, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.076434806, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9235652, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07918299, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.920817, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0734302, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.9265698, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07955771, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.9204423, + "study": "UK10K" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 4, + "copyNumber": 89.2, + "end": 22324204, + "percentageMatch": 0.81, + "period": 4, + "score": 271, + "sequence": "TTTC", + "source": "trf", + "start": 22323842 + }, + { + "chromosome": "15", + "consensusSize": 110, + "copyNumber": 2.7, + "end": 22324171, + "percentageMatch": 0.83, + "period": 110, + "score": 351, + "sequence": "TTTCTTTTCTTTCTTTCTTTCTTTTCTTTCTTTCTTTCTTTCTTCCTTTCTTTCTTTCTTTCTTTCTTCTCTCTTTTCCTTCCCTCTCTCCTTCCCTTCCCTTCCCTTCC", + "source": "trf", + "start": 22323872 + }, + { + "chromosome": "15", + "consensusSize": 112, + "copyNumber": 2.8, + "end": 22324185, + "percentageMatch": 0.8, + "period": 114, + "score": 333, + "sequence": "TTTCTTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTCTCTTTCTTCCTCTCTCTCCTTCCCTTCCCTTCCCTTCCTTC", + "source": "trf", + "start": 22323872 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22324122, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22324122, + "id": "15:22324122:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22324122, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259324", + "ensemblTranscriptId": "ENST00000558299", + "geneName": "OR11K1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.05000019073486328, + "source": "cadd_raw" + }, + { + "score": 3.140000104904175, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.694+5155T>G", + "ENST00000560193(ENSG00000259176):n.434+5155T>G", + "ENST00000557855(ENSG00000259176):n.111-22546T>G", + "ENST00000559392(ENSG00000259176):n.195+5155T>G", + "ENST00000558896(ENSG00000259176):n.194+5155T>G", + "ENST00000557817(ENSG00000259176):n.166+5155T>G", + "ENST00000558312(ENSG00000259176):n.166+5155T>G", + "ENST00000558798(ENSG00000259176):n.166+5155T>G" + ], + "id": "rs200148863", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.18304546, + "altHomGenotypeFreq": 0.030573754, + "hetGenotypeFreq": 0.4635696, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.73764145, + "refHomGenotypeFreq": 0.50585663, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17515923, + "altHomGenotypeFreq": 0.031847134, + "hetGenotypeFreq": 0.4522293, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.7420382, + "refHomGenotypeFreq": 0.51592356, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13636364, + "altHomGenotypeFreq": 0.033492822, + "hetGenotypeFreq": 0.36842105, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.78229666, + "refHomGenotypeFreq": 0.5980861, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21597633, + "altHomGenotypeFreq": 0.04733728, + "hetGenotypeFreq": 0.4556213, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7248521, + "refHomGenotypeFreq": 0.49704143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1981132, + "altHomGenotypeFreq": 0.018867925, + "hetGenotypeFreq": 0.4528302, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.754717, + "refHomGenotypeFreq": 0.5283019, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17274678, + "altHomGenotypeFreq": 0.034334764, + "hetGenotypeFreq": 0.4828326, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.72424895, + "refHomGenotypeFreq": 0.4828326, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20038368, + "altHomGenotypeFreq": 0.035926055, + "hetGenotypeFreq": 0.5148239, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.706662, + "refHomGenotypeFreq": 0.4492501, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1469534, + "altHomGenotypeFreq": 0.012544802, + "hetGenotypeFreq": 0.34498212, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.8149642, + "refHomGenotypeFreq": 0.6424731, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18091272, + "altHomGenotypeFreq": 0.027888447, + "hetGenotypeFreq": 0.46287578, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.74067366, + "refHomGenotypeFreq": 0.5092358, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18563269, + "altHomGenotypeFreq": 0.03383128, + "hetGenotypeFreq": 0.46441126, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.7339631, + "refHomGenotypeFreq": 0.50175744, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 4, + "copyNumber": 89.2, + "end": 22324204, + "percentageMatch": 0.81, + "period": 4, + "score": 271, + "sequence": "TTTC", + "source": "trf", + "start": 22323842 + }, + { + "chromosome": "15", + "consensusSize": 110, + "copyNumber": 2.7, + "end": 22324171, + "percentageMatch": 0.83, + "period": 110, + "score": 351, + "sequence": "TTTCTTTTCTTTCTTTCTTTCTTTTCTTTCTTTCTTTCTTTCTTCCTTTCTTTCTTTCTTTCTTTCTTCTCTCTTTTCCTTCCCTCTCTCCTTCCCTTCCCTTCCCTTCC", + "source": "trf", + "start": 22323872 + }, + { + "chromosome": "15", + "consensusSize": 112, + "copyNumber": 2.8, + "end": 22324185, + "percentageMatch": 0.8, + "period": 114, + "score": 333, + "sequence": "TTTCTTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTCTCTTTCTTCCTCTCTCTCCTTCCCTTCCCTTCCCTTCCTTC", + "source": "trf", + "start": 22323872 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22324126, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22324126, + "id": "15:22324126:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 22324126, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259324", + "ensemblTranscriptId": "ENST00000558299", + "geneName": "OR11K1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.026000000536441803, + "source": "phastCons" + }, + { + "score": 0.16200000047683716, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 1.2599999904632568, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.694+5245G>A", + "ENST00000560193(ENSG00000259176):n.434+5245G>A", + "ENST00000557855(ENSG00000259176):n.111-22456G>A", + "ENST00000559392(ENSG00000259176):n.195+5245G>A", + "ENST00000558896(ENSG00000259176):n.194+5245G>A", + "ENST00000557817(ENSG00000259176):n.166+5245G>A", + "ENST00000558312(ENSG00000259176):n.166+5245G>A", + "ENST00000558798(ENSG00000259176):n.166+5245G>A" + ], + "id": "rs368819368", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.006243358, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.012486716, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.99375665, + "refHomGenotypeFreq": 0.9875133, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0052083335, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010416667, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.9947917, + "refHomGenotypeFreq": 0.9895833, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.010075566, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.020151133, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.98992443, + "refHomGenotypeFreq": 0.97984886, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0033052885, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.006610577, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.9966947, + "refHomGenotypeFreq": 0.9933894, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.00665038, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01330076, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.9933496, + "refHomGenotypeFreq": 0.9866992, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.007857143, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.015714286, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.99214286, + "refHomGenotypeFreq": 0.9842857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.006005285, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01201057, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.9939947, + "refHomGenotypeFreq": 0.9879894, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.00653789, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01307578, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.9934621, + "refHomGenotypeFreq": 0.98692423, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22324216, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22324216, + "id": "15:22324216:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22324216, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259324", + "ensemblTranscriptId": "ENST00000558299", + "geneName": "OR11K1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.04100000113248825, + "source": "phastCons" + }, + { + "score": 0.13600000739097595, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.05000019073486328, + "source": "cadd_raw" + }, + { + "score": 2.1500000953674316, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.694+5536A>G", + "ENST00000560193(ENSG00000259176):n.434+5536A>G", + "ENST00000557855(ENSG00000259176):n.111-22165A>G", + "ENST00000559392(ENSG00000259176):n.195+5536A>G", + "ENST00000558896(ENSG00000259176):n.194+5536A>G", + "ENST00000557817(ENSG00000259176):n.166+5536A>G", + "ENST00000558312(ENSG00000259176):n.166+5536A>G", + "ENST00000558798(ENSG00000259176):n.166+5536A>G" + ], + "id": "rs7496522", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.37433043, + "altHomGenotypeFreq": 0.045913044, + "hetGenotypeFreq": 0.65690434, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6256348, + "refHomGenotypeFreq": 0.29718262, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4095982, + "altHomGenotypeFreq": 0.06026786, + "hetGenotypeFreq": 0.69866073, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.59040177, + "refHomGenotypeFreq": 0.24107143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37213996, + "altHomGenotypeFreq": 0.044414535, + "hetGenotypeFreq": 0.6554509, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.62786, + "refHomGenotypeFreq": 0.3001346, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5371287, + "altHomGenotypeFreq": 0.18069308, + "hetGenotypeFreq": 0.7128713, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.46287128, + "refHomGenotypeFreq": 0.10643564, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4319728, + "altHomGenotypeFreq": 0.07482993, + "hetGenotypeFreq": 0.71428573, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5680272, + "refHomGenotypeFreq": 0.21088435, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43250775, + "altHomGenotypeFreq": 0.049535602, + "hetGenotypeFreq": 0.7659443, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.56749225, + "refHomGenotypeFreq": 0.18452013, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42421007, + "altHomGenotypeFreq": 0.055650443, + "hetGenotypeFreq": 0.73711926, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.5757899, + "refHomGenotypeFreq": 0.20723028, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2408567, + "altHomGenotypeFreq": 0.011272545, + "hetGenotypeFreq": 0.45941883, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.75901806, + "refHomGenotypeFreq": 0.5293086, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37128526, + "altHomGenotypeFreq": 0.04677116, + "hetGenotypeFreq": 0.64902824, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.62871474, + "refHomGenotypeFreq": 0.30420062, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.378125, + "altHomGenotypeFreq": 0.04484375, + "hetGenotypeFreq": 0.6667187, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.62179685, + "refHomGenotypeFreq": 0.2884375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.546875, + "altHomGenotypeFreq": 0.265625, + "hetGenotypeFreq": 0.5625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.453125, + "refHomGenotypeFreq": 0.171875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34265175, + "altHomGenotypeFreq": 0.07907348, + "hetGenotypeFreq": 0.5271566, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6573482, + "refHomGenotypeFreq": 0.39376998, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41104296, + "altHomGenotypeFreq": 0.08793456, + "hetGenotypeFreq": 0.64621675, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.5889571, + "refHomGenotypeFreq": 0.26584867, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4680851, + "altHomGenotypeFreq": 0.11702128, + "hetGenotypeFreq": 0.7021277, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.5319149, + "refHomGenotypeFreq": 0.18085106, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4117647, + "altHomGenotypeFreq": 0.04901961, + "hetGenotypeFreq": 0.7254902, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.5882353, + "refHomGenotypeFreq": 0.2254902, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17776097, + "altHomGenotypeFreq": 0.006051437, + "hetGenotypeFreq": 0.34341908, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.82223904, + "refHomGenotypeFreq": 0.6505295, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32380953, + "altHomGenotypeFreq": 0.03809524, + "hetGenotypeFreq": 0.5714286, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.6761905, + "refHomGenotypeFreq": 0.3904762, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3028846, + "altHomGenotypeFreq": 0.057692308, + "hetGenotypeFreq": 0.4903846, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.69711536, + "refHomGenotypeFreq": 0.45192307, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15277778, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30555558, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.8472222, + "refHomGenotypeFreq": 0.6944444, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47916666, + "altHomGenotypeFreq": 0.19791667, + "hetGenotypeFreq": 0.5625, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.5208333, + "refHomGenotypeFreq": 0.23958333, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19026549, + "altHomGenotypeFreq": 0.017699115, + "hetGenotypeFreq": 0.34513274, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.8097345, + "refHomGenotypeFreq": 0.63716817, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38235295, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.627451, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.61764705, + "refHomGenotypeFreq": 0.30392158, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3846154, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.61538464, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.61538464, + "refHomGenotypeFreq": 0.30769232, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3172043, + "altHomGenotypeFreq": 0.043010753, + "hetGenotypeFreq": 0.5483871, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.6827957, + "refHomGenotypeFreq": 0.40860215, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34343433, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.5858586, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.65656567, + "refHomGenotypeFreq": 0.36363637, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3598131, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.58878505, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.6401869, + "refHomGenotypeFreq": 0.34579438, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3604651, + "altHomGenotypeFreq": 0.034883723, + "hetGenotypeFreq": 0.65116274, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.6395349, + "refHomGenotypeFreq": 0.3139535, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22916667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4583333, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.7708333, + "refHomGenotypeFreq": 0.5416667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14646465, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2929293, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.85353535, + "refHomGenotypeFreq": 0.7070707, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.34343433, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.65656567, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3856859, + "altHomGenotypeFreq": 0.07952286, + "hetGenotypeFreq": 0.612326, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.61431414, + "refHomGenotypeFreq": 0.3081511, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16393442, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.26229507, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.8360656, + "refHomGenotypeFreq": 0.704918, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.52449566, + "altHomGenotypeFreq": 0.24207492, + "hetGenotypeFreq": 0.5648415, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.4755043, + "refHomGenotypeFreq": 0.19308357, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3764706, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.8117647, + "refHomGenotypeFreq": 0.62352943, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41747573, + "altHomGenotypeFreq": 0.08737864, + "hetGenotypeFreq": 0.66019416, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.5825243, + "refHomGenotypeFreq": 0.2524272, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3939394, + "altHomGenotypeFreq": 0.1010101, + "hetGenotypeFreq": 0.5858586, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.6060606, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41121495, + "altHomGenotypeFreq": 0.08411215, + "hetGenotypeFreq": 0.6542056, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.58878505, + "refHomGenotypeFreq": 0.26168224, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39903846, + "altHomGenotypeFreq": 0.13461539, + "hetGenotypeFreq": 0.52884614, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.60096157, + "refHomGenotypeFreq": 0.33653846, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.6161616, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7235294, + "altHomGenotypeFreq": 0.49411765, + "hetGenotypeFreq": 0.45882356, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.2764706, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32440478, + "altHomGenotypeFreq": 0.05357143, + "hetGenotypeFreq": 0.5416666, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6755952, + "refHomGenotypeFreq": 0.4047619, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33495146, + "altHomGenotypeFreq": 0.0776699, + "hetGenotypeFreq": 0.5145631, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.66504854, + "refHomGenotypeFreq": 0.407767, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22324507, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22324507, + "id": "15:22324507:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22324507, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.6699999570846558, + "source": "gerp" + }, + { + "score": 0.004999999888241291, + "source": "phastCons" + }, + { + "score": 0.4580000042915344, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 4.420000076293945, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.695-823A>G", + "ENST00000560193(ENSG00000259176):n.434+12594A>G", + "ENST00000557855(ENSG00000259176):n.111-15107A>G", + "ENST00000559392(ENSG00000259176):n.195+12594A>G", + "ENST00000558896(ENSG00000259176):n.195-823A>G", + "ENST00000557817(ENSG00000259176):n.167-7921A>G", + "ENST00000558312(ENSG00000259176):n.166+12594A>G", + "ENST00000558798(ENSG00000259176):n.166+12594A>G" + ], + "id": "rs12442043", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.18260385, + "altHomGenotypeFreq": 0.005157513, + "hetGenotypeFreq": 0.35489267, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.81739616, + "refHomGenotypeFreq": 0.6399498, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22039473, + "altHomGenotypeFreq": 0.0065789474, + "hetGenotypeFreq": 0.4276316, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.77960527, + "refHomGenotypeFreq": 0.56578946, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.07049608, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14099216, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.9295039, + "refHomGenotypeFreq": 0.85900784, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.11278196, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22556391, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.88721806, + "refHomGenotypeFreq": 0.7744361, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2, + "altHomGenotypeFreq": 0.007142857, + "hetGenotypeFreq": 0.3857143, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.8, + "refHomGenotypeFreq": 0.60714287, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2441067, + "altHomGenotypeFreq": 0.009305211, + "hetGenotypeFreq": 0.46960297, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7558933, + "refHomGenotypeFreq": 0.5210918, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22792208, + "altHomGenotypeFreq": 0.007070707, + "hetGenotypeFreq": 0.44170275, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7720779, + "refHomGenotypeFreq": 0.55122656, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10370828, + "altHomGenotypeFreq": 0.0014833127, + "hetGenotypeFreq": 0.20444994, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.89629173, + "refHomGenotypeFreq": 0.7940667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1780322, + "altHomGenotypeFreq": 0.0051585305, + "hetGenotypeFreq": 0.34574735, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.8219678, + "refHomGenotypeFreq": 0.6490941, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18828125, + "altHomGenotypeFreq": 0.00515625, + "hetGenotypeFreq": 0.36625, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.81171876, + "refHomGenotypeFreq": 0.62859374, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22945891, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7705411, + "study": "GONL" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22331565, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22331565, + "id": "15:22331565:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22331565, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.3499999046325684, + "source": "gerp" + }, + { + "score": 0.07100000232458115, + "source": "phastCons" + }, + { + "score": -2.5280001163482666, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 0.6899999976158142, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.695-770C>T", + "ENST00000560193(ENSG00000259176):n.434+12647C>T", + "ENST00000557855(ENSG00000259176):n.111-15054C>T", + "ENST00000559392(ENSG00000259176):n.195+12647C>T", + "ENST00000558896(ENSG00000259176):n.195-770C>T", + "ENST00000557817(ENSG00000259176):n.167-7868C>T", + "ENST00000558312(ENSG00000259176):n.166+12647C>T", + "ENST00000558798(ENSG00000259176):n.166+12647C>T" + ], + "id": "rs1429490", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.93360287, + "altHomGenotypeFreq": 0.8679819, + "hetGenotypeFreq": 0.13124192, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.06639715, + "refHomGenotypeFreq": 7.7619666E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.98778003, + "altHomGenotypeFreq": 0.97759676, + "hetGenotypeFreq": 0.020366598, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.012219959, + "refHomGenotypeFreq": 0.00203666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9797136, + "altHomGenotypeFreq": 0.9594272, + "hetGenotypeFreq": 0.040572792, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.020286396, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.98344374, + "altHomGenotypeFreq": 0.9668874, + "hetGenotypeFreq": 0.03311258, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.01655629, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9988673, + "altHomGenotypeFreq": 0.99773455, + "hetGenotypeFreq": 0.0022654585, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.0011327292, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.76951414, + "altHomGenotypeFreq": 0.5415611, + "hetGenotypeFreq": 0.45590606, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.23048584, + "refHomGenotypeFreq": 0.0025328114, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9309376, + "altHomGenotypeFreq": 0.8629287, + "hetGenotypeFreq": 0.1360178, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.06906239, + "refHomGenotypeFreq": 0.001053494, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9368946, + "altHomGenotypeFreq": 0.87422293, + "hetGenotypeFreq": 0.12534335, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.06310539, + "refHomGenotypeFreq": 4.3371404E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.998998, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.001002004, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.93210864, + "altHomGenotypeFreq": 0.86541533, + "hetGenotypeFreq": 0.13338658, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.067891374, + "refHomGenotypeFreq": 0.001198083, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9680851, + "altHomGenotypeFreq": 0.9361702, + "hetGenotypeFreq": 0.06382979, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.031914894, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.76626325, + "altHomGenotypeFreq": 0.537065, + "hetGenotypeFreq": 0.45839638, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.23373677, + "refHomGenotypeFreq": 0.004538578, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7592593, + "altHomGenotypeFreq": 0.5185185, + "hetGenotypeFreq": 0.4814815, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.24074075, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.73893803, + "altHomGenotypeFreq": 0.4778761, + "hetGenotypeFreq": 0.5221239, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.26106194, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9859813, + "altHomGenotypeFreq": 0.97196263, + "hetGenotypeFreq": 0.028037382, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.014018691, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8125, + "altHomGenotypeFreq": 0.625, + "hetGenotypeFreq": 0.375, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.1875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.72727275, + "altHomGenotypeFreq": 0.46464646, + "hetGenotypeFreq": 0.5252525, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.27272728, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7878788, + "altHomGenotypeFreq": 0.5959596, + "hetGenotypeFreq": 0.3838384, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.21212122, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.99602383, + "altHomGenotypeFreq": 0.9920477, + "hetGenotypeFreq": 0.007952286, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.003976143, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8032787, + "altHomGenotypeFreq": 0.60655737, + "hetGenotypeFreq": 0.39344263, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.19672132, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9610951, + "altHomGenotypeFreq": 0.9221902, + "hetGenotypeFreq": 0.077809796, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.038904898, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7529412, + "altHomGenotypeFreq": 0.5058824, + "hetGenotypeFreq": 0.49411768, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.24705882, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9953271, + "altHomGenotypeFreq": 0.99065423, + "hetGenotypeFreq": 0.009345794, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.004672897, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9230769, + "altHomGenotypeFreq": 0.84615386, + "hetGenotypeFreq": 0.15384616, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.07692308, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9823529, + "altHomGenotypeFreq": 0.9647059, + "hetGenotypeFreq": 0.03529412, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.01764706, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.99920654, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 7.934409E-4, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9991606, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 8.393956E-4, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9994811, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 5.189414E-4, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9989213, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.0010787486, + "study": "UK10K" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22331618, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22331618, + "id": "15:22331618:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22331618, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -0.14900000393390656, + "source": "gerp" + }, + { + "score": 0.009999999776482582, + "source": "phastCons" + }, + { + "score": 0.29600000381469727, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.2799997329711914, + "source": "cadd_raw" + }, + { + "score": 0.75, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.695-57A>G", + "ENST00000560193(ENSG00000259176):n.434+13360A>G", + "ENST00000557855(ENSG00000259176):n.111-14341A>G", + "ENST00000559392(ENSG00000259176):n.195+13360A>G", + "ENST00000558896(ENSG00000259176):n.195-57A>G", + "ENST00000557817(ENSG00000259176):n.167-7155A>G", + "ENST00000558312(ENSG00000259176):n.166+13360A>G", + "ENST00000558798(ENSG00000259176):n.166+13360A>G" + ], + "id": "rs1429492", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.9940172, + "altHomGenotypeFreq": 0.9880991, + "hetGenotypeFreq": 0.011900912, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.005950456, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99750626, + "altHomGenotypeFreq": 0.99501246, + "hetGenotypeFreq": 0.0049875313, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.0024937657, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99879515, + "altHomGenotypeFreq": 0.99759036, + "hetGenotypeFreq": 0.0024096386, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.0012048193, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9997131, + "altHomGenotypeFreq": 0.9994263, + "hetGenotypeFreq": 5.7372346E-4, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 2.8686173E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9996667, + "altHomGenotypeFreq": 0.9993333, + "hetGenotypeFreq": 6.6666666E-4, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 3.3333333E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.98004586, + "altHomGenotypeFreq": 0.9603211, + "hetGenotypeFreq": 0.039678898, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.019839449, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99397236, + "altHomGenotypeFreq": 0.98806185, + "hetGenotypeFreq": 0.011938202, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.005969101, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99407256, + "altHomGenotypeFreq": 0.9881452, + "hetGenotypeFreq": 0.011854851, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.0059274253, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99540734, + "altHomGenotypeFreq": 0.9908147, + "hetGenotypeFreq": 0.009185303, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.004592652, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9989775, + "altHomGenotypeFreq": 0.997955, + "hetGenotypeFreq": 0.0020449897, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.0010224949, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9893617, + "altHomGenotypeFreq": 0.9787234, + "hetGenotypeFreq": 0.021276595, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.010638298, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9878971, + "altHomGenotypeFreq": 0.97579426, + "hetGenotypeFreq": 0.024205748, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.012102874, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9907407, + "altHomGenotypeFreq": 0.9814815, + "hetGenotypeFreq": 0.018518519, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.009259259, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9734513, + "altHomGenotypeFreq": 0.94690263, + "hetGenotypeFreq": 0.053097345, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.026548672, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99450547, + "altHomGenotypeFreq": 0.989011, + "hetGenotypeFreq": 0.010989011, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.0054945056, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99462366, + "altHomGenotypeFreq": 0.9892473, + "hetGenotypeFreq": 0.010752688, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.005376344, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99418604, + "altHomGenotypeFreq": 0.9883721, + "hetGenotypeFreq": 0.011627907, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.0058139535, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.989899, + "altHomGenotypeFreq": 0.97979796, + "hetGenotypeFreq": 0.02020202, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.01010101, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.989899, + "altHomGenotypeFreq": 0.97979796, + "hetGenotypeFreq": 0.02020202, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.01010101, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.999006, + "altHomGenotypeFreq": 0.99801195, + "hetGenotypeFreq": 0.0019880715, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 9.940357E-4, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9918033, + "altHomGenotypeFreq": 0.9836066, + "hetGenotypeFreq": 0.016393442, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.008196721, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99567723, + "altHomGenotypeFreq": 0.99135447, + "hetGenotypeFreq": 0.008645533, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.004322767, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9941176, + "altHomGenotypeFreq": 0.9882353, + "hetGenotypeFreq": 0.011764706, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.005882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9980159, + "altHomGenotypeFreq": 0.99603176, + "hetGenotypeFreq": 0.003968254, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.001984127, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09550562, + "altHomGenotypeFreq": 0.09363296, + "hetGenotypeFreq": 0.0037453184, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9044944, + "refHomGenotypeFreq": 0.90262175, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0, + "study": "UK10K" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 16, + "copyNumber": 2, + "end": 22332346, + "percentageMatch": 0.93, + "period": 16, + "score": 55, + "sequence": "ATAGATAGATAGATAC", + "source": "trf", + "start": 22332315 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22332331, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22332331, + "id": "15:22332331:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22332331, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -5.21999979019165, + "source": "gerp" + }, + { + "score": 0.08399999886751175, + "source": "phastCons" + }, + { + "score": -0.8640000224113464, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.369999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.695-36A>G", + "ENST00000560193(ENSG00000259176):n.434+13381A>G", + "ENST00000557855(ENSG00000259176):n.111-14320A>G", + "ENST00000559392(ENSG00000259176):n.195+13381A>G", + "ENST00000558896(ENSG00000259176):n.195-36A>G", + "ENST00000557817(ENSG00000259176):n.167-7134A>G", + "ENST00000558312(ENSG00000259176):n.166+13381A>G", + "ENST00000558798(ENSG00000259176):n.166+13381A>G" + ], + "id": "rs8028800", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.22901005, + "altHomGenotypeFreq": 0.0077285185, + "hetGenotypeFreq": 0.44256306, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.77098995, + "refHomGenotypeFreq": 0.5497084, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22309417, + "altHomGenotypeFreq": 0.0067264573, + "hetGenotypeFreq": 0.4327354, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.77690583, + "refHomGenotypeFreq": 0.5605381, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.064494684, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12898937, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.93550533, + "refHomGenotypeFreq": 0.87101066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12179487, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24358974, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.8782051, + "refHomGenotypeFreq": 0.75641024, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2062937, + "altHomGenotypeFreq": 0.006993007, + "hetGenotypeFreq": 0.3986014, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7937063, + "refHomGenotypeFreq": 0.5944056, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24091479, + "altHomGenotypeFreq": 0.010025063, + "hetGenotypeFreq": 0.46177945, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.75908524, + "refHomGenotypeFreq": 0.5281955, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22920558, + "altHomGenotypeFreq": 0.0073265336, + "hetGenotypeFreq": 0.44375807, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.77079445, + "refHomGenotypeFreq": 0.5489154, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26730037, + "altHomGenotypeFreq": 0.009885931, + "hetGenotypeFreq": 0.5148289, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.73269963, + "refHomGenotypeFreq": 0.47528517, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22557253, + "altHomGenotypeFreq": 0.0077608144, + "hetGenotypeFreq": 0.4356234, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.7744275, + "refHomGenotypeFreq": 0.55661577, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23324965, + "altHomGenotypeFreq": 0.0076886867, + "hetGenotypeFreq": 0.45112193, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.76675034, + "refHomGenotypeFreq": 0.5411894, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09737828, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.18726592, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.90262175, + "refHomGenotypeFreq": 0.80898875, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22332352, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22332352, + "id": "15:22332352:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22332352, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "cdnaPosition": 739, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "exonOverlap": [ + { + "number": "5/5", + "percentage": 0.32786885 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 239, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "3/7", + "percentage": 0.2570694 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.3600000143051147, + "source": "gerp" + }, + { + "score": 0.2680000066757202, + "source": "phastCons" + }, + { + "score": -0.7979999780654907, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.020000457763671875, + "source": "cadd_raw" + }, + { + "score": 2.869999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.739C>T", + "ENST00000560193(ENSG00000259176):n.434+13461C>T", + "ENST00000557855(ENSG00000259176):n.111-14240C>T", + "ENST00000559392(ENSG00000259176):n.195+13461C>T", + "ENST00000558896(ENSG00000259176):n.239C>T", + "ENST00000557817(ENSG00000259176):n.167-7054C>T", + "ENST00000558312(ENSG00000259176):n.166+13461C>T", + "ENST00000558798(ENSG00000259176):n.166+13461C>T" + ], + "id": "rs376977769", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 4.5269352E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 9.0538705E-4, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9995473, + "refHomGenotypeFreq": 0.9990946, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0031289111, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0062578223, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.9968711, + "refHomGenotypeFreq": 0.99374217, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0010321101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0020642201, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9989679, + "refHomGenotypeFreq": 0.9979358, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 4.682744E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 9.365488E-4, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.99953175, + "refHomGenotypeFreq": 0.99906343, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 4.3346337E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 8.6692674E-4, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.99956656, + "refHomGenotypeFreq": 0.99913305, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22332432, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22332432, + "id": "15:22332432:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22332432, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "cdnaPosition": 749, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "exonOverlap": [ + { + "number": "5/5", + "percentage": 0.32786885 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 249, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "3/7", + "percentage": 0.2570694 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.0999999046325684, + "source": "gerp" + }, + { + "score": 0.375, + "source": "phastCons" + }, + { + "score": -0.9739999771118164, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.5500001907348633, + "source": "cadd_raw" + }, + { + "score": 7.820000171661377, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560134(ENSG00000259176):n.749C>T", + "ENST00000560193(ENSG00000259176):n.434+13471C>T", + "ENST00000557855(ENSG00000259176):n.111-14230C>T", + "ENST00000559392(ENSG00000259176):n.195+13471C>T", + "ENST00000558896(ENSG00000259176):n.249C>T", + "ENST00000557817(ENSG00000259176):n.167-7044C>T", + "ENST00000558312(ENSG00000259176):n.166+13471C>T", + "ENST00000558798(ENSG00000259176):n.166+13471C>T" + ], + "id": "rs575019353", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.0078125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.015625, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.9921875, + "refHomGenotypeFreq": 0.984375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0031948881, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0063897762, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.99680513, + "refHomGenotypeFreq": 0.9936102, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0051124743, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010224949, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.99488753, + "refHomGenotypeFreq": 0.98977506, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0037821482, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0075642965, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.99621785, + "refHomGenotypeFreq": 0.9924357, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.004901961, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009803922, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.99509805, + "refHomGenotypeFreq": 0.99019605, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0054945056, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010989011, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.99450547, + "refHomGenotypeFreq": 0.989011, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.017441861, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.034883723, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.98255813, + "refHomGenotypeFreq": 0.96511626, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0052083335, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010416667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.9947917, + "refHomGenotypeFreq": 0.9895833, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.01010101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02020202, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.989899, + "refHomGenotypeFreq": 0.97979796, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.004970179, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009940358, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.9950298, + "refHomGenotypeFreq": 0.9900596, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0014409221, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0028818443, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.99855906, + "refHomGenotypeFreq": 0.9971182, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.005882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.011764706, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.9941176, + "refHomGenotypeFreq": 0.9882353, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.004854369, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009708738, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.9951456, + "refHomGenotypeFreq": 0.99029124, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.009345794, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.018691588, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.99065423, + "refHomGenotypeFreq": 0.9813084, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22332442, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22332442, + "id": "15:22332442:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22332442, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 558, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "3/7", + "percentage": 0.2570694 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.14100000262260437, + "source": "gerp" + }, + { + "score": 0.6439999938011169, + "source": "phastCons" + }, + { + "score": -0.8339999914169312, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.5100002288818359, + "source": "cadd_raw" + }, + { + "score": 7.53000020980835, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.434+13780T>C", + "ENST00000557855(ENSG00000259176):n.111-13921T>C", + "ENST00000559392(ENSG00000259176):n.195+13780T>C", + "ENST00000558896(ENSG00000259176):n.558T>C", + "ENST00000557817(ENSG00000259176):n.167-6735T>C", + "ENST00000558312(ENSG00000259176):n.166+13780T>C", + "ENST00000558798(ENSG00000259176):n.166+13780T>C" + ], + "id": "rs930109", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.90064085, + "altHomGenotypeFreq": 0.8034824, + "hetGenotypeFreq": 0.19522299, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.09890608, + "refHomGenotypeFreq": 0.0012945822, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9562118, + "altHomGenotypeFreq": 0.9144603, + "hetGenotypeFreq": 0.08350305, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.043788187, + "refHomGenotypeFreq": 0.00203666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8078849, + "altHomGenotypeFreq": 0.61702126, + "hetGenotypeFreq": 0.38172716, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.19211514, + "refHomGenotypeFreq": 0.0012515645, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9594272, + "altHomGenotypeFreq": 0.9188544, + "hetGenotypeFreq": 0.081145585, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.040572792, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96357614, + "altHomGenotypeFreq": 0.92715234, + "hetGenotypeFreq": 0.07284768, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.03642384, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9796678, + "altHomGenotypeFreq": 0.95990837, + "hetGenotypeFreq": 0.0395189, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.020332187, + "refHomGenotypeFreq": 5.727377E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9798108, + "altHomGenotypeFreq": 0.95962155, + "hetGenotypeFreq": 0.040378466, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.020189233, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7348467, + "altHomGenotypeFreq": 0.476838, + "hetGenotypeFreq": 0.5192441, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.26354, + "refHomGenotypeFreq": 0.0039179535, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89758754, + "altHomGenotypeFreq": 0.7977515, + "hetGenotypeFreq": 0.20072608, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.10188547, + "refHomGenotypeFreq": 0.0015224265, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9044139, + "altHomGenotypeFreq": 0.8105644, + "hetGenotypeFreq": 0.18842258, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.09522431, + "refHomGenotypeFreq": 0.0010130246, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9609375, + "altHomGenotypeFreq": 0.921875, + "hetGenotypeFreq": 0.078125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.0390625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.865615, + "altHomGenotypeFreq": 0.7344249, + "hetGenotypeFreq": 0.26357827, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.13378595, + "refHomGenotypeFreq": 0.0019968052, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9785276, + "altHomGenotypeFreq": 0.9570552, + "hetGenotypeFreq": 0.042944785, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.021472393, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9361702, + "altHomGenotypeFreq": 0.87234044, + "hetGenotypeFreq": 0.12765957, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.06382979, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9852941, + "altHomGenotypeFreq": 0.9705882, + "hetGenotypeFreq": 0.029411765, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.014705882, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70877457, + "altHomGenotypeFreq": 0.42511347, + "hetGenotypeFreq": 0.57186085, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.28895614, + "refHomGenotypeFreq": 0.0030257185, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78571427, + "altHomGenotypeFreq": 0.5714286, + "hetGenotypeFreq": 0.42857143, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.21428572, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7932692, + "altHomGenotypeFreq": 0.6057692, + "hetGenotypeFreq": 0.375, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.20673077, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.712963, + "altHomGenotypeFreq": 0.42592594, + "hetGenotypeFreq": 0.5740741, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.28703704, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9791667, + "altHomGenotypeFreq": 0.9583333, + "hetGenotypeFreq": 0.041666668, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.020833334, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67699116, + "altHomGenotypeFreq": 0.3539823, + "hetGenotypeFreq": 0.6460177, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.32300884, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99019605, + "altHomGenotypeFreq": 0.98039216, + "hetGenotypeFreq": 0.019607844, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.009803922, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.98351645, + "altHomGenotypeFreq": 0.96703297, + "hetGenotypeFreq": 0.032967035, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.016483517, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.827957, + "altHomGenotypeFreq": 0.65591395, + "hetGenotypeFreq": 0.34408602, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.17204301, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86868685, + "altHomGenotypeFreq": 0.7373737, + "hetGenotypeFreq": 0.26262626, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.13131313, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97196263, + "altHomGenotypeFreq": 0.94392526, + "hetGenotypeFreq": 0.056074765, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.028037382, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94186044, + "altHomGenotypeFreq": 0.88372093, + "hetGenotypeFreq": 0.11627907, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.058139537, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7395833, + "altHomGenotypeFreq": 0.48958334, + "hetGenotypeFreq": 0.5, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.26041666, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67171717, + "altHomGenotypeFreq": 0.37373737, + "hetGenotypeFreq": 0.6262626, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.3131313, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75252527, + "altHomGenotypeFreq": 0.5151515, + "hetGenotypeFreq": 0.47474748, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.24747474, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9701789, + "altHomGenotypeFreq": 0.94035786, + "hetGenotypeFreq": 0.059642144, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.029821074, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75409836, + "altHomGenotypeFreq": 0.5081967, + "hetGenotypeFreq": 0.4918033, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.24590164, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9337176, + "altHomGenotypeFreq": 0.86743516, + "hetGenotypeFreq": 0.13256484, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.06628242, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67058825, + "altHomGenotypeFreq": 0.34117648, + "hetGenotypeFreq": 0.65882355, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.32941177, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99029124, + "altHomGenotypeFreq": 0.98058254, + "hetGenotypeFreq": 0.019417476, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.009708738, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.95454544, + "altHomGenotypeFreq": 0.90909094, + "hetGenotypeFreq": 0.09090909, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.045454547, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97196263, + "altHomGenotypeFreq": 0.94392526, + "hetGenotypeFreq": 0.056074765, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.028037382, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8942308, + "altHomGenotypeFreq": 0.78846157, + "hetGenotypeFreq": 0.21153846, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.10576923, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.969697, + "altHomGenotypeFreq": 0.93939394, + "hetGenotypeFreq": 0.06060606, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.030303031, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9588235, + "altHomGenotypeFreq": 0.91764706, + "hetGenotypeFreq": 0.08235294, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.04117647, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8105159, + "altHomGenotypeFreq": 0.6269841, + "hetGenotypeFreq": 0.3670635, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.18948413, + "refHomGenotypeFreq": 0.005952381, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7815534, + "altHomGenotypeFreq": 0.57281554, + "hetGenotypeFreq": 0.41747573, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.2184466, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96629214, + "altHomGenotypeFreq": 0.9325843, + "hetGenotypeFreq": 0.06741573, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.033707865, + "refHomGenotypeFreq": 0, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9800317, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.019968262, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9804141, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.019585898, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9802802, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.019719772, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97977346, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.020226536, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22332751, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22332751, + "id": "15:22332751:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22332751, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 45, + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.18656716 + } + ], + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.0999999046325684, + "source": "gerp" + }, + { + "score": 0.6949999928474426, + "source": "phastCons" + }, + { + "score": 0.27399998903274536, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.0600004196166992, + "source": "cadd_raw" + }, + { + "score": 11.020000457763672, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-13813G>T", + "ENST00000557855(ENSG00000259176):n.111-13813G>T", + "ENST00000559392(ENSG00000259176):n.196-13813G>T", + "ENST00000558896(ENSG00000259176):n.583+83G>T", + "ENST00000557817(ENSG00000259176):n.167-6627G>T", + "ENST00000558312(ENSG00000259176):n.167-13813G>T", + "ENST00000558798(ENSG00000259176):n.167-13813G>T", + "ENST00000557009(ENSG00000258652):n.45G>T" + ], + "id": "rs62004745", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.22710814, + "altHomGenotypeFreq": 0.0071722027, + "hetGenotypeFreq": 0.43987188, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7728919, + "refHomGenotypeFreq": 0.5529559, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23017621, + "altHomGenotypeFreq": 0.008810572, + "hetGenotypeFreq": 0.4427313, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7698238, + "refHomGenotypeFreq": 0.54845816, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06274256, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12548512, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.9372574, + "refHomGenotypeFreq": 0.8745149, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12747525, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2549505, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.87252474, + "refHomGenotypeFreq": 0.7450495, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20422535, + "altHomGenotypeFreq": 0.0070422534, + "hetGenotypeFreq": 0.3943662, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.79577464, + "refHomGenotypeFreq": 0.59859157, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24459542, + "altHomGenotypeFreq": 0.009264979, + "hetGenotypeFreq": 0.4706609, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7554046, + "refHomGenotypeFreq": 0.5200741, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2301519, + "altHomGenotypeFreq": 0.0070220693, + "hetGenotypeFreq": 0.44625968, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7698481, + "refHomGenotypeFreq": 0.54671824, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25707844, + "altHomGenotypeFreq": 0.008519168, + "hetGenotypeFreq": 0.4971185, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7429216, + "refHomGenotypeFreq": 0.49436232, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22299431, + "altHomGenotypeFreq": 0.007201516, + "hetGenotypeFreq": 0.4315856, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7770057, + "refHomGenotypeFreq": 0.5612129, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23215948, + "altHomGenotypeFreq": 0.0071362085, + "hetGenotypeFreq": 0.45004654, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7678405, + "refHomGenotypeFreq": 0.54281723, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17041199, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.3258427, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.829588, + "refHomGenotypeFreq": 0.6666667, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22332859, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22332859, + "id": "15:22332859:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22332859, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 373, + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.18656716 + } + ], + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.0299999713897705, + "source": "gerp" + }, + { + "score": 0.5789999961853027, + "source": "phastCons" + }, + { + "score": 0.2280000001192093, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.630000114440918, + "source": "cadd_raw" + }, + { + "score": 8.40999984741211, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-13485T>C", + "ENST00000557855(ENSG00000259176):n.111-13485T>C", + "ENST00000559392(ENSG00000259176):n.196-13485T>C", + "ENST00000558896(ENSG00000259176):n.583+411T>C", + "ENST00000557817(ENSG00000259176):n.167-6299T>C", + "ENST00000558312(ENSG00000259176):n.167-13485T>C", + "ENST00000558798(ENSG00000259176):n.167-13485T>C", + "ENST00000557009(ENSG00000258652):n.373T>C" + ], + "id": "rs1864288", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.4063581, + "altHomGenotypeFreq": 0.05216549, + "hetGenotypeFreq": 0.7083852, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5936419, + "refHomGenotypeFreq": 0.23944929, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4157549, + "altHomGenotypeFreq": 0.059080962, + "hetGenotypeFreq": 0.7133479, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.5842451, + "refHomGenotypeFreq": 0.22757111, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49479845, + "altHomGenotypeFreq": 0.11053316, + "hetGenotypeFreq": 0.76853055, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5052016, + "refHomGenotypeFreq": 0.12093628, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54899496, + "altHomGenotypeFreq": 0.1959799, + "hetGenotypeFreq": 0.70603013, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.451005, + "refHomGenotypeFreq": 0.09798995, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43103448, + "altHomGenotypeFreq": 0.07586207, + "hetGenotypeFreq": 0.71034485, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.5689655, + "refHomGenotypeFreq": 0.2137931, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43174893, + "altHomGenotypeFreq": 0.047531992, + "hetGenotypeFreq": 0.76843387, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.5682511, + "refHomGenotypeFreq": 0.18403412, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42472738, + "altHomGenotypeFreq": 0.05523297, + "hetGenotypeFreq": 0.7389888, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.5752726, + "refHomGenotypeFreq": 0.20577821, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3300276, + "altHomGenotypeFreq": 0.021340698, + "hetGenotypeFreq": 0.6173738, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.66997236, + "refHomGenotypeFreq": 0.36128548, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40583605, + "altHomGenotypeFreq": 0.053361658, + "hetGenotypeFreq": 0.7049488, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.59416395, + "refHomGenotypeFreq": 0.24168958, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40700558, + "altHomGenotypeFreq": 0.05068196, + "hetGenotypeFreq": 0.71264726, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.5929944, + "refHomGenotypeFreq": 0.2366708, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37453184, + "altHomGenotypeFreq": 0.056179777, + "hetGenotypeFreq": 0.63670415, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6254682, + "refHomGenotypeFreq": 0.3071161, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22333187, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22333187, + "id": "15:22333187:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22333187, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.8289999961853027, + "source": "gerp" + }, + { + "score": 0.23100000619888306, + "source": "phastCons" + }, + { + "score": -1.6770000457763672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.05000019073486328, + "source": "cadd_raw" + }, + { + "score": 2.140000104904175, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-13307A>G", + "ENST00000557855(ENSG00000259176):n.111-13307A>G", + "ENST00000559392(ENSG00000259176):n.196-13307A>G", + "ENST00000558896(ENSG00000259176):n.583+589A>G", + "ENST00000557817(ENSG00000259176):n.167-6121A>G", + "ENST00000558312(ENSG00000259176):n.167-13307A>G", + "ENST00000558798(ENSG00000259176):n.167-13307A>G" + ], + "id": "rs1346660", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.99464136, + "altHomGenotypeFreq": 0.9892827, + "hetGenotypeFreq": 0.010717283, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.0053586415, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99898165, + "altHomGenotypeFreq": 0.99796337, + "hetGenotypeFreq": 0.00203666, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.00101833, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99880666, + "altHomGenotypeFreq": 0.9976134, + "hetGenotypeFreq": 0.002386635, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.0011933175, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.98344374, + "altHomGenotypeFreq": 0.9668874, + "hetGenotypeFreq": 0.03311258, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.01655629, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99966705, + "altHomGenotypeFreq": 0.99933416, + "hetGenotypeFreq": 6.6586764E-4, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 3.3293382E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9823637, + "altHomGenotypeFreq": 0.96472746, + "hetGenotypeFreq": 0.03527256, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.01763628, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99474174, + "altHomGenotypeFreq": 0.98948354, + "hetGenotypeFreq": 0.010516476, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.005258238, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9945174, + "altHomGenotypeFreq": 0.9890348, + "hetGenotypeFreq": 0.010965229, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.0054826145, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.998998, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.001002004, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99620605, + "altHomGenotypeFreq": 0.99241215, + "hetGenotypeFreq": 0.0075878594, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.0037939297, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9946808, + "altHomGenotypeFreq": 0.9893617, + "hetGenotypeFreq": 0.010638298, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.005319149, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.98865354, + "altHomGenotypeFreq": 0.9773071, + "hetGenotypeFreq": 0.022692889, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.0113464445, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9953704, + "altHomGenotypeFreq": 0.9907407, + "hetGenotypeFreq": 0.009259259, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.0046296297, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9734513, + "altHomGenotypeFreq": 0.94690263, + "hetGenotypeFreq": 0.053097345, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.026548672, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.989899, + "altHomGenotypeFreq": 0.97979796, + "hetGenotypeFreq": 0.02020202, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.01010101, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9836066, + "altHomGenotypeFreq": 0.9672131, + "hetGenotypeFreq": 0.032786883, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.016393442, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9942363, + "altHomGenotypeFreq": 0.98847264, + "hetGenotypeFreq": 0.011527378, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.0057636886, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9941176, + "altHomGenotypeFreq": 0.9882353, + "hetGenotypeFreq": 0.011764706, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.005882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9906367, + "altHomGenotypeFreq": 0.98876405, + "hetGenotypeFreq": 0.0037453184, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.0093632955, + "refHomGenotypeFreq": 0.007490637, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99973553, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 2.644803E-4, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9997202, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 2.7979855E-4, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 1, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99946064, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 5.393743E-4, + "study": "UK10K" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22333365, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22333365, + "id": "15:22333365:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22333365, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560134", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258652", + "ensemblTranscriptId": "ENST00000557009", + "geneName": "OR4Q1P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.17000000178813934, + "source": "phastCons" + }, + { + "score": 0.10899999737739563, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.3599996566772461, + "source": "cadd_raw" + }, + { + "score": 0.49000000953674316, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-9949G>T", + "ENST00000557855(ENSG00000259176):n.111-9949G>T", + "ENST00000559392(ENSG00000259176):n.196-9949G>T", + "ENST00000558896(ENSG00000259176):n.583+3947G>T", + "ENST00000557817(ENSG00000259176):n.167-2763G>T", + "ENST00000558312(ENSG00000259176):n.167-9949G>T", + "ENST00000558798(ENSG00000259176):n.167-9949G>T" + ], + "id": "rs2341412", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.39345235, + "altHomGenotypeFreq": 0.050624084, + "hetGenotypeFreq": 0.6856565, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.60654765, + "refHomGenotypeFreq": 0.2637194, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4090909, + "altHomGenotypeFreq": 0.05986696, + "hetGenotypeFreq": 0.6984479, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.59090906, + "refHomGenotypeFreq": 0.24168514, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49146983, + "altHomGenotypeFreq": 0.106299214, + "hetGenotypeFreq": 0.7703412, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5085302, + "refHomGenotypeFreq": 0.12335958, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5455665, + "altHomGenotypeFreq": 0.19211823, + "hetGenotypeFreq": 0.70689654, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.4544335, + "refHomGenotypeFreq": 0.10098522, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43150684, + "altHomGenotypeFreq": 0.07534247, + "hetGenotypeFreq": 0.7123288, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5684931, + "refHomGenotypeFreq": 0.21232876, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42875078, + "altHomGenotypeFreq": 0.048336472, + "hetGenotypeFreq": 0.7608286, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5712492, + "refHomGenotypeFreq": 0.19083491, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42394087, + "altHomGenotypeFreq": 0.055302814, + "hetGenotypeFreq": 0.7372761, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.57605916, + "refHomGenotypeFreq": 0.2074211, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28716132, + "altHomGenotypeFreq": 0.015953407, + "hetGenotypeFreq": 0.5424158, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7128387, + "refHomGenotypeFreq": 0.44163078, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39198387, + "altHomGenotypeFreq": 0.05180237, + "hetGenotypeFreq": 0.680363, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.60801613, + "refHomGenotypeFreq": 0.26783463, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3952708, + "altHomGenotypeFreq": 0.049164977, + "hetGenotypeFreq": 0.6922116, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6047292, + "refHomGenotypeFreq": 0.2586234, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22336723, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22336723, + "id": "15:22336723:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22336723, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.8550000190734863, + "source": "gerp" + }, + { + "score": 0.007000000216066837, + "source": "phastCons" + }, + { + "score": -1.8960000276565552, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.3400001525878906, + "source": "cadd_raw" + }, + { + "score": 0.550000011920929, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-2102T>C", + "ENST00000557855(ENSG00000259176):n.111-2102T>C", + "ENST00000559392(ENSG00000259176):n.196-2102T>C", + "ENST00000558896(ENSG00000259176):n.584-2102T>C", + "ENST00000557817(ENSG00000259176):n.320-2102T>C", + "ENST00000558312(ENSG00000259176):n.167-2102T>C", + "ENST00000558798(ENSG00000259176):n.167-2102T>C" + ], + "id": "rs1366868", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.87477356, + "altHomGenotypeFreq": 0.7501941, + "hetGenotypeFreq": 0.2491589, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.12522645, + "refHomGenotypeFreq": 6.4699794E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8961303, + "altHomGenotypeFreq": 0.7922607, + "hetGenotypeFreq": 0.20773931, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.103869654, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96662545, + "altHomGenotypeFreq": 0.9332509, + "hetGenotypeFreq": 0.06674907, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.033374537, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9268585, + "altHomGenotypeFreq": 0.853717, + "hetGenotypeFreq": 0.14628297, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.073141485, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8807947, + "altHomGenotypeFreq": 0.7615894, + "hetGenotypeFreq": 0.23841059, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.119205296, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.92812145, + "altHomGenotypeFreq": 0.85624284, + "hetGenotypeFreq": 0.14375716, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.07187858, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9042312, + "altHomGenotypeFreq": 0.8084624, + "hetGenotypeFreq": 0.19153763, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.09576882, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77793103, + "altHomGenotypeFreq": 0.5581609, + "hetGenotypeFreq": 0.43954024, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.22206897, + "refHomGenotypeFreq": 0.0022988506, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8735074, + "altHomGenotypeFreq": 0.74771714, + "hetGenotypeFreq": 0.25158042, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.12649262, + "refHomGenotypeFreq": 7.0241163E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8763379, + "altHomGenotypeFreq": 0.7532543, + "hetGenotypeFreq": 0.2461672, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.12366214, + "refHomGenotypeFreq": 5.785363E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91683364, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.08316633, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.953125, + "altHomGenotypeFreq": 0.90625, + "hetGenotypeFreq": 0.09375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.046875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.87839454, + "altHomGenotypeFreq": 0.75758785, + "hetGenotypeFreq": 0.24161342, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.12160543, + "refHomGenotypeFreq": 7.9872203E-4, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84662575, + "altHomGenotypeFreq": 0.6952965, + "hetGenotypeFreq": 0.3026585, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.15337424, + "refHomGenotypeFreq": 0.0020449897, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90957445, + "altHomGenotypeFreq": 0.81914896, + "hetGenotypeFreq": 0.18085107, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.09042553, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8186275, + "altHomGenotypeFreq": 0.6372549, + "hetGenotypeFreq": 0.3627451, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.18137255, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7980333, + "altHomGenotypeFreq": 0.5975794, + "hetGenotypeFreq": 0.4009077, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.20196672, + "refHomGenotypeFreq": 0.0015128592, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96190476, + "altHomGenotypeFreq": 0.9238095, + "hetGenotypeFreq": 0.07619048, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.03809524, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9423077, + "altHomGenotypeFreq": 0.88461536, + "hetGenotypeFreq": 0.11538462, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.057692308, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7962963, + "altHomGenotypeFreq": 0.5925926, + "hetGenotypeFreq": 0.4074074, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.2037037, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.875, + "altHomGenotypeFreq": 0.7604167, + "hetGenotypeFreq": 0.22916667, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.125, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7699115, + "altHomGenotypeFreq": 0.54867256, + "hetGenotypeFreq": 0.44247788, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.2300885, + "refHomGenotypeFreq": 0.0088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84313726, + "altHomGenotypeFreq": 0.6862745, + "hetGenotypeFreq": 0.3137255, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.15686275, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8681319, + "altHomGenotypeFreq": 0.73626375, + "hetGenotypeFreq": 0.26373628, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.13186814, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94623655, + "altHomGenotypeFreq": 0.8924731, + "hetGenotypeFreq": 0.10752688, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.05376344, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.92424244, + "altHomGenotypeFreq": 0.8484849, + "hetGenotypeFreq": 0.15151516, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.07575758, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9018692, + "altHomGenotypeFreq": 0.8037383, + "hetGenotypeFreq": 0.19626169, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.098130845, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.80813956, + "altHomGenotypeFreq": 0.61627907, + "hetGenotypeFreq": 0.38372093, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.19186047, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8229167, + "altHomGenotypeFreq": 0.6458333, + "hetGenotypeFreq": 0.3541667, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.17708333, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7626263, + "altHomGenotypeFreq": 0.5252525, + "hetGenotypeFreq": 0.47474748, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.23737374, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82828283, + "altHomGenotypeFreq": 0.65656567, + "hetGenotypeFreq": 0.34343433, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.17171717, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9035785, + "altHomGenotypeFreq": 0.80715704, + "hetGenotypeFreq": 0.19284295, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.09642147, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8032787, + "altHomGenotypeFreq": 0.60655737, + "hetGenotypeFreq": 0.39344263, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.19672132, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.93227667, + "altHomGenotypeFreq": 0.86455333, + "hetGenotypeFreq": 0.1354467, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.06772334, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8117647, + "altHomGenotypeFreq": 0.62352943, + "hetGenotypeFreq": 0.3764706, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.1882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88349515, + "altHomGenotypeFreq": 0.7669903, + "hetGenotypeFreq": 0.23300971, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.116504855, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.93939394, + "altHomGenotypeFreq": 0.8787879, + "hetGenotypeFreq": 0.121212125, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.060606062, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8831776, + "altHomGenotypeFreq": 0.76635516, + "hetGenotypeFreq": 0.23364486, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.11682243, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90384614, + "altHomGenotypeFreq": 0.8076923, + "hetGenotypeFreq": 0.1923077, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.09615385, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.92424244, + "altHomGenotypeFreq": 0.8484849, + "hetGenotypeFreq": 0.15151516, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.07575758, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9764706, + "altHomGenotypeFreq": 0.9529412, + "hetGenotypeFreq": 0.047058824, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.023529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.95238096, + "altHomGenotypeFreq": 0.9047619, + "hetGenotypeFreq": 0.0952381, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.04761905, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9854369, + "altHomGenotypeFreq": 0.9708738, + "hetGenotypeFreq": 0.029126214, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.014563107, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.016853932, + "altHomGenotypeFreq": 0.014981274, + "hetGenotypeFreq": 0.0037453184, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9831461, + "refHomGenotypeFreq": 0.9812734, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22344570, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22344570, + "id": "15:22344570:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22344570, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.3160000145435333, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -0.9150000214576721, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.07999992370605469, + "source": "cadd_raw" + }, + { + "score": 3.450000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-2077C>T", + "ENST00000557855(ENSG00000259176):n.111-2077C>T", + "ENST00000559392(ENSG00000259176):n.196-2077C>T", + "ENST00000558896(ENSG00000259176):n.584-2077C>T", + "ENST00000557817(ENSG00000259176):n.320-2077C>T", + "ENST00000558312(ENSG00000259176):n.167-2077C>T", + "ENST00000558798(ENSG00000259176):n.167-2077C>T" + ], + "id": "rs1366869", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.70317286, + "altHomGenotypeFreq": 0.4155971, + "hetGenotypeFreq": 0.5751515, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.29682717, + "refHomGenotypeFreq": 0.009251417, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7175258, + "altHomGenotypeFreq": 0.44329897, + "hetGenotypeFreq": 0.5484536, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.28247422, + "refHomGenotypeFreq": 0.008247423, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.614899, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.7247475, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.38510102, + "refHomGenotypeFreq": 0.022727273, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8014354, + "altHomGenotypeFreq": 0.6076555, + "hetGenotypeFreq": 0.3875598, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.19856459, + "refHomGenotypeFreq": 0.004784689, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.69205296, + "altHomGenotypeFreq": 0.42384106, + "hetGenotypeFreq": 0.53642386, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.307947, + "refHomGenotypeFreq": 0.0397351, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7297921, + "altHomGenotypeFreq": 0.4665127, + "hetGenotypeFreq": 0.5265589, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.27020785, + "refHomGenotypeFreq": 0.0069284067, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.71808296, + "altHomGenotypeFreq": 0.44448918, + "hetGenotypeFreq": 0.54718757, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.28191704, + "refHomGenotypeFreq": 0.008323265, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6722582, + "altHomGenotypeFreq": 0.35330865, + "hetGenotypeFreq": 0.6378991, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.32774177, + "refHomGenotypeFreq": 0.008792226, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7034398, + "altHomGenotypeFreq": 0.41677466, + "hetGenotypeFreq": 0.57333016, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.29656026, + "refHomGenotypeFreq": 0.009895158, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7028426, + "altHomGenotypeFreq": 0.41413996, + "hetGenotypeFreq": 0.5774053, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.29715744, + "refHomGenotypeFreq": 0.008454811, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.859375, + "altHomGenotypeFreq": 0.71875, + "hetGenotypeFreq": 0.28125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.140625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.68929714, + "altHomGenotypeFreq": 0.3985623, + "hetGenotypeFreq": 0.58146966, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.3107029, + "refHomGenotypeFreq": 0.019968051, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.63496935, + "altHomGenotypeFreq": 0.30674848, + "hetGenotypeFreq": 0.6564417, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.36503068, + "refHomGenotypeFreq": 0.036809817, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7765958, + "altHomGenotypeFreq": 0.5638298, + "hetGenotypeFreq": 0.42553192, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.22340426, + "refHomGenotypeFreq": 0.010638298, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.61764705, + "altHomGenotypeFreq": 0.27450982, + "hetGenotypeFreq": 0.6862745, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.38235295, + "refHomGenotypeFreq": 0.039215688, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6966717, + "altHomGenotypeFreq": 0.40242058, + "hetGenotypeFreq": 0.5885023, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.30332828, + "refHomGenotypeFreq": 0.009077156, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.61904764, + "altHomGenotypeFreq": 0.25714287, + "hetGenotypeFreq": 0.72380954, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.3809524, + "refHomGenotypeFreq": 0.01904762, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.65384614, + "altHomGenotypeFreq": 0.33653846, + "hetGenotypeFreq": 0.6346154, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.34615386, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7268519, + "altHomGenotypeFreq": 0.4537037, + "hetGenotypeFreq": 0.5462963, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.27314815, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6979167, + "altHomGenotypeFreq": 0.41666666, + "hetGenotypeFreq": 0.5625, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.30208334, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6902655, + "altHomGenotypeFreq": 0.40707964, + "hetGenotypeFreq": 0.5663717, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.30973452, + "refHomGenotypeFreq": 0.026548672, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.61764705, + "altHomGenotypeFreq": 0.27450982, + "hetGenotypeFreq": 0.6862745, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.38235295, + "refHomGenotypeFreq": 0.039215688, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6978022, + "altHomGenotypeFreq": 0.3956044, + "hetGenotypeFreq": 0.6043956, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.3021978, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5913978, + "altHomGenotypeFreq": 0.24731183, + "hetGenotypeFreq": 0.68817204, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.40860215, + "refHomGenotypeFreq": 0.06451613, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6010101, + "altHomGenotypeFreq": 0.24242425, + "hetGenotypeFreq": 0.71717167, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.3989899, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7196262, + "altHomGenotypeFreq": 0.45794392, + "hetGenotypeFreq": 0.5233645, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.28037384, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.59302324, + "altHomGenotypeFreq": 0.25581396, + "hetGenotypeFreq": 0.67441857, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.40697673, + "refHomGenotypeFreq": 0.069767445, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6979167, + "altHomGenotypeFreq": 0.41666666, + "hetGenotypeFreq": 0.5625, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.30208334, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67676765, + "altHomGenotypeFreq": 0.35353535, + "hetGenotypeFreq": 0.64646465, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.32323232, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7020202, + "altHomGenotypeFreq": 0.41414142, + "hetGenotypeFreq": 0.5757576, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.2979798, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.70079523, + "altHomGenotypeFreq": 0.41749504, + "hetGenotypeFreq": 0.56660044, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.29920477, + "refHomGenotypeFreq": 0.015904572, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6639344, + "altHomGenotypeFreq": 0.32786885, + "hetGenotypeFreq": 0.6721311, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.33606556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8270893, + "altHomGenotypeFreq": 0.6599424, + "hetGenotypeFreq": 0.33429396, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.17291066, + "refHomGenotypeFreq": 0.0057636886, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7058824, + "altHomGenotypeFreq": 0.4117647, + "hetGenotypeFreq": 0.5882353, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.29411766, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6456311, + "altHomGenotypeFreq": 0.3106796, + "hetGenotypeFreq": 0.6699029, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.35436893, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7222222, + "altHomGenotypeFreq": 0.47474748, + "hetGenotypeFreq": 0.49494952, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.2777778, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.64953274, + "altHomGenotypeFreq": 0.317757, + "hetGenotypeFreq": 0.6635514, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.3504673, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.78846157, + "altHomGenotypeFreq": 0.5769231, + "hetGenotypeFreq": 0.42307693, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.21153846, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7171717, + "altHomGenotypeFreq": 0.44444445, + "hetGenotypeFreq": 0.5454545, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.28282827, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90588236, + "altHomGenotypeFreq": 0.8235294, + "hetGenotypeFreq": 0.16470589, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.09411765, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.62599206, + "altHomGenotypeFreq": 0.28373015, + "hetGenotypeFreq": 0.6845238, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.37400794, + "refHomGenotypeFreq": 0.031746034, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.66019416, + "altHomGenotypeFreq": 0.33009708, + "hetGenotypeFreq": 0.66019416, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.3398058, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12734082, + "altHomGenotypeFreq": 0.07116105, + "hetGenotypeFreq": 0.11235955, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.87265915, + "refHomGenotypeFreq": 0.8164794, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22344595, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22344595, + "id": "15:22344595:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22344595, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 80, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.7459999918937683, + "source": "gerp" + }, + { + "score": 0.032999999821186066, + "source": "phastCons" + }, + { + "score": -0.777999997138977, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.6400003433227539, + "source": "cadd_raw" + }, + { + "score": 0.10000000149011612, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1933T>C", + "ENST00000557855(ENSG00000259176):n.111-1933T>C", + "ENST00000559392(ENSG00000259176):n.196-1933T>C", + "ENST00000558896(ENSG00000259176):n.584-1933T>C", + "ENST00000557817(ENSG00000259176):n.320-1933T>C", + "ENST00000558312(ENSG00000259176):n.167-1933T>C", + "ENST00000558798(ENSG00000259176):n.167-1933T>C", + "ENST00000563771(ENSG00000261277):n.80T>C" + ], + "id": "rs58030160", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.2525494, + "altHomGenotypeFreq": 0.008580069, + "hetGenotypeFreq": 0.48793867, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7474506, + "refHomGenotypeFreq": 0.50348127, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25995576, + "altHomGenotypeFreq": 0.0088495575, + "hetGenotypeFreq": 0.5022124, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.74004424, + "refHomGenotypeFreq": 0.48893806, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13328913, + "altHomGenotypeFreq": 0.0026525198, + "hetGenotypeFreq": 0.2612732, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.8667109, + "refHomGenotypeFreq": 0.73607427, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23566085, + "altHomGenotypeFreq": 0.0049875313, + "hetGenotypeFreq": 0.46134663, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.76433915, + "refHomGenotypeFreq": 0.53366584, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22635135, + "altHomGenotypeFreq": 0.006756757, + "hetGenotypeFreq": 0.4391892, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.7736486, + "refHomGenotypeFreq": 0.5540541, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2615527, + "altHomGenotypeFreq": 0.008009858, + "hetGenotypeFreq": 0.5070856, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7384473, + "refHomGenotypeFreq": 0.4849045, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2527299, + "altHomGenotypeFreq": 0.009770115, + "hetGenotypeFreq": 0.48591954, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.7472701, + "refHomGenotypeFreq": 0.50431037, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27351198, + "altHomGenotypeFreq": 0.008245298, + "hetGenotypeFreq": 0.5305334, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.726488, + "refHomGenotypeFreq": 0.46122134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25260946, + "altHomGenotypeFreq": 0.009674135, + "hetGenotypeFreq": 0.48587066, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.7473905, + "refHomGenotypeFreq": 0.5044552, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25247526, + "altHomGenotypeFreq": 0.007229294, + "hetGenotypeFreq": 0.4904919, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.74752474, + "refHomGenotypeFreq": 0.5022788, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22846442, + "altHomGenotypeFreq": 0.014981274, + "hetGenotypeFreq": 0.42696628, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7715356, + "refHomGenotypeFreq": 0.5580524, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22344739, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22344739, + "id": "15:22344739:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22344739, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 212, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.8799999952316284, + "source": "gerp" + }, + { + "score": 0.6019999980926514, + "source": "phastCons" + }, + { + "score": 0.24899999797344208, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.0299997329711914, + "source": "cadd_raw" + }, + { + "score": 10.850000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1801A>G", + "ENST00000557855(ENSG00000259176):n.111-1801A>G", + "ENST00000559392(ENSG00000259176):n.196-1801A>G", + "ENST00000558896(ENSG00000259176):n.584-1801A>G", + "ENST00000557817(ENSG00000259176):n.320-1801A>G", + "ENST00000558312(ENSG00000259176):n.167-1801A>G", + "ENST00000558798(ENSG00000259176):n.167-1801A>G", + "ENST00000563771(ENSG00000261277):n.212A>G" + ], + "id": "rs28571003", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.58608264, + "altHomGenotypeFreq": 0.2101157, + "hetGenotypeFreq": 0.7519339, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.41391736, + "refHomGenotypeFreq": 0.03795041, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57380456, + "altHomGenotypeFreq": 0.19126819, + "hetGenotypeFreq": 0.76507276, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.4261954, + "refHomGenotypeFreq": 0.043659043, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5706033, + "altHomGenotypeFreq": 0.19640565, + "hetGenotypeFreq": 0.7483954, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.42939666, + "refHomGenotypeFreq": 0.05519897, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.72705317, + "altHomGenotypeFreq": 0.46135265, + "hetGenotypeFreq": 0.531401, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.27294686, + "refHomGenotypeFreq": 0.007246377, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54761904, + "altHomGenotypeFreq": 0.18367347, + "hetGenotypeFreq": 0.72789115, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.45238096, + "refHomGenotypeFreq": 0.088435374, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5797313, + "altHomGenotypeFreq": 0.19801402, + "hetGenotypeFreq": 0.7634346, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.42026868, + "refHomGenotypeFreq": 0.0385514, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5787037, + "altHomGenotypeFreq": 0.19771242, + "hetGenotypeFreq": 0.76198256, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.4212963, + "refHomGenotypeFreq": 0.04030501, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.59322035, + "altHomGenotypeFreq": 0.21751413, + "hetGenotypeFreq": 0.75141245, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.40677965, + "refHomGenotypeFreq": 0.031073445, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.58836544, + "altHomGenotypeFreq": 0.21630993, + "hetGenotypeFreq": 0.74411094, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.4116346, + "refHomGenotypeFreq": 0.039579097, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5832594, + "altHomGenotypeFreq": 0.2024549, + "hetGenotypeFreq": 0.761609, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.4167406, + "refHomGenotypeFreq": 0.035936113, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5168539, + "altHomGenotypeFreq": 0.21722846, + "hetGenotypeFreq": 0.5992509, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.48314607, + "refHomGenotypeFreq": 0.1835206, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22344871, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22344871, + "id": "15:22344871:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22344871, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 220, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.8799999952316284, + "source": "gerp" + }, + { + "score": 0.2849999964237213, + "source": "phastCons" + }, + { + "score": -0.699999988079071, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.5299997329711914, + "source": "cadd_raw" + }, + { + "score": 7.710000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1793C>G", + "ENST00000557855(ENSG00000259176):n.111-1793C>G", + "ENST00000559392(ENSG00000259176):n.196-1793C>G", + "ENST00000558896(ENSG00000259176):n.584-1793C>G", + "ENST00000557817(ENSG00000259176):n.320-1793C>G", + "ENST00000558312(ENSG00000259176):n.167-1793C>G", + "ENST00000558798(ENSG00000259176):n.167-1793C>G", + "ENST00000563771(ENSG00000261277):n.220C>G" + ], + "id": "rs1366870", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.87235284, + "altHomGenotypeFreq": 0.7454181, + "hetGenotypeFreq": 0.25386956, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.12764718, + "refHomGenotypeFreq": 7.1238907E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.894683, + "altHomGenotypeFreq": 0.78936607, + "hetGenotypeFreq": 0.21063395, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.105316974, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.96526057, + "altHomGenotypeFreq": 0.9305211, + "hetGenotypeFreq": 0.06947891, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.034739453, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.92583734, + "altHomGenotypeFreq": 0.8516746, + "hetGenotypeFreq": 0.14832535, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.07416268, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.88, + "altHomGenotypeFreq": 0.76, + "hetGenotypeFreq": 0.24, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.12, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9285714, + "altHomGenotypeFreq": 0.85714287, + "hetGenotypeFreq": 0.14285715, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.071428575, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.90406936, + "altHomGenotypeFreq": 0.8081388, + "hetGenotypeFreq": 0.19186124, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.09593062, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7698157, + "altHomGenotypeFreq": 0.5421659, + "hetGenotypeFreq": 0.45529953, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.23018433, + "refHomGenotypeFreq": 0.0025345623, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.87060684, + "altHomGenotypeFreq": 0.7420337, + "hetGenotypeFreq": 0.2571462, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.12939316, + "refHomGenotypeFreq": 8.2005624E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.87451124, + "altHomGenotypeFreq": 0.7496017, + "hetGenotypeFreq": 0.24981897, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.12548877, + "refHomGenotypeFreq": 5.792904E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9158317, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.08416834, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6573034, + "altHomGenotypeFreq": 0.61048687, + "hetGenotypeFreq": 0.09363296, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.34269664, + "refHomGenotypeFreq": 0.29588014, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22344879, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22344879, + "id": "15:22344879:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22344879, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 292, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.8799999952316284, + "source": "gerp" + }, + { + "score": 0.7900000214576721, + "source": "phastCons" + }, + { + "score": -0.7009999752044678, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.2700004577636719, + "source": "cadd_raw" + }, + { + "score": 12.149999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1721T>C", + "ENST00000557855(ENSG00000259176):n.111-1721T>C", + "ENST00000559392(ENSG00000259176):n.196-1721T>C", + "ENST00000558896(ENSG00000259176):n.584-1721T>C", + "ENST00000557817(ENSG00000259176):n.320-1721T>C", + "ENST00000558312(ENSG00000259176):n.167-1721T>C", + "ENST00000558798(ENSG00000259176):n.167-1721T>C", + "ENST00000563771(ENSG00000261277):n.292T>C" + ], + "id": "rs1366871", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.9106704, + "altHomGenotypeFreq": 0.82147014, + "hetGenotypeFreq": 0.17840041, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.08932962, + "refHomGenotypeFreq": 1.2941634E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9038855, + "altHomGenotypeFreq": 0.80777097, + "hetGenotypeFreq": 0.19222903, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.096114516, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9664179, + "altHomGenotypeFreq": 0.9328358, + "hetGenotypeFreq": 0.06716418, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.03358209, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9328537, + "altHomGenotypeFreq": 0.86570746, + "hetGenotypeFreq": 0.13429257, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.06714629, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88, + "altHomGenotypeFreq": 0.76, + "hetGenotypeFreq": 0.24, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.12, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9277523, + "altHomGenotypeFreq": 0.8555046, + "hetGenotypeFreq": 0.14449541, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.07224771, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9043774, + "altHomGenotypeFreq": 0.80875486, + "hetGenotypeFreq": 0.19124517, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.095622584, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90406245, + "altHomGenotypeFreq": 0.8085839, + "hetGenotypeFreq": 0.19095708, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.09593757, + "refHomGenotypeFreq": 4.5903143E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91105515, + "altHomGenotypeFreq": 0.82234454, + "hetGenotypeFreq": 0.17742124, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.088944845, + "refHomGenotypeFreq": 2.3421946E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91019523, + "altHomGenotypeFreq": 0.82039046, + "hetGenotypeFreq": 0.17960954, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.08980477, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9158317, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.08416834, + "study": "GONL" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22344951, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22344951, + "id": "15:22344951:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22344951, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 438, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.8799999952316284, + "source": "gerp" + }, + { + "score": 0.9679999947547913, + "source": "phastCons" + }, + { + "score": 0.29899999499320984, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.859999656677246, + "source": "cadd_raw" + }, + { + "score": 15.369999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1575C>T", + "ENST00000557855(ENSG00000259176):n.111-1575C>T", + "ENST00000559392(ENSG00000259176):n.196-1575C>T", + "ENST00000558896(ENSG00000259176):n.584-1575C>T", + "ENST00000557817(ENSG00000259176):n.320-1575C>T", + "ENST00000558312(ENSG00000259176):n.167-1575C>T", + "ENST00000558798(ENSG00000259176):n.167-1575C>T", + "ENST00000563771(ENSG00000261277):n.438C>T" + ], + "id": "rs12440831", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.18215135, + "altHomGenotypeFreq": 0.0048184595, + "hetGenotypeFreq": 0.35466576, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8178487, + "refHomGenotypeFreq": 0.6405158, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23717949, + "altHomGenotypeFreq": 0.0064102565, + "hetGenotypeFreq": 0.46153846, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.76282054, + "refHomGenotypeFreq": 0.53205127, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06930052, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13860103, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.93069947, + "refHomGenotypeFreq": 0.86139894, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.88, + "refHomGenotypeFreq": 0.76, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22887324, + "altHomGenotypeFreq": 0.0070422534, + "hetGenotypeFreq": 0.44366196, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.77112675, + "refHomGenotypeFreq": 0.5492958, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25030378, + "altHomGenotypeFreq": 0.008505468, + "hetGenotypeFreq": 0.4835966, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.74969625, + "refHomGenotypeFreq": 0.5078979, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23735024, + "altHomGenotypeFreq": 0.006906272, + "hetGenotypeFreq": 0.46088794, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7626498, + "refHomGenotypeFreq": 0.53220576, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.081434, + "altHomGenotypeFreq": 9.496676E-4, + "hetGenotypeFreq": 0.16096866, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.918566, + "refHomGenotypeFreq": 0.83808166, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17696837, + "altHomGenotypeFreq": 0.0045376504, + "hetGenotypeFreq": 0.34486142, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.82303166, + "refHomGenotypeFreq": 0.6506009, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18857317, + "altHomGenotypeFreq": 0.005166388, + "hetGenotypeFreq": 0.36681354, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.8114268, + "refHomGenotypeFreq": 0.62802005, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23647295, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.76352704, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2340824, + "altHomGenotypeFreq": 0.011235955, + "hetGenotypeFreq": 0.4456929, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7659176, + "refHomGenotypeFreq": 0.54307115, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22345097, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22345097, + "id": "15:22345097:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22345097, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 475, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.27900001406669617, + "source": "gerp" + }, + { + "score": 0.9139999747276306, + "source": "phastCons" + }, + { + "score": 0.29899999499320984, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.3999996185302734, + "source": "cadd_raw" + }, + { + "score": 12.829999923706055, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1538C>G", + "ENST00000557855(ENSG00000259176):n.111-1538C>G", + "ENST00000559392(ENSG00000259176):n.196-1538C>G", + "ENST00000558896(ENSG00000259176):n.584-1538C>G", + "ENST00000557817(ENSG00000259176):n.320-1538C>G", + "ENST00000558312(ENSG00000259176):n.167-1538C>G", + "ENST00000558798(ENSG00000259176):n.167-1538C>G", + "ENST00000563771(ENSG00000261277):n.475C>G" + ], + "id": "rs13380116", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.36745277, + "altHomGenotypeFreq": 0.04538997, + "hetGenotypeFreq": 0.6441256, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.63254726, + "refHomGenotypeFreq": 0.31048444, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40271494, + "altHomGenotypeFreq": 0.061085973, + "hetGenotypeFreq": 0.68325794, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.5972851, + "refHomGenotypeFreq": 0.25565612, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3664812, + "altHomGenotypeFreq": 0.048678722, + "hetGenotypeFreq": 0.635605, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.63351876, + "refHomGenotypeFreq": 0.31571627, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53482586, + "altHomGenotypeFreq": 0.18159205, + "hetGenotypeFreq": 0.7064677, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.46517414, + "refHomGenotypeFreq": 0.1119403, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.425, + "altHomGenotypeFreq": 0.071428575, + "hetGenotypeFreq": 0.70714283, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.575, + "refHomGenotypeFreq": 0.22142857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42777434, + "altHomGenotypeFreq": 0.047117174, + "hetGenotypeFreq": 0.76131433, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5722257, + "refHomGenotypeFreq": 0.19156851, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4184195, + "altHomGenotypeFreq": 0.05492258, + "hetGenotypeFreq": 0.72699386, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.58158046, + "refHomGenotypeFreq": 0.21808355, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23046476, + "altHomGenotypeFreq": 0.01072523, + "hetGenotypeFreq": 0.43947905, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.76953524, + "refHomGenotypeFreq": 0.5497957, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36425832, + "altHomGenotypeFreq": 0.04578005, + "hetGenotypeFreq": 0.6369565, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.6357417, + "refHomGenotypeFreq": 0.31726342, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37144455, + "altHomGenotypeFreq": 0.044902526, + "hetGenotypeFreq": 0.65308404, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.6285555, + "refHomGenotypeFreq": 0.30201343, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43587175, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5641283, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.031835206, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.04868914, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9681648, + "refHomGenotypeFreq": 0.94382024, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22345134, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22345134, + "id": "15:22345134:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22345134, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 499, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.8799999952316284, + "source": "gerp" + }, + { + "score": 0.9589999914169312, + "source": "phastCons" + }, + { + "score": 0.24899999797344208, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 12.319999694824219, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1514T>C", + "ENST00000557855(ENSG00000259176):n.111-1514T>C", + "ENST00000559392(ENSG00000259176):n.196-1514T>C", + "ENST00000558896(ENSG00000259176):n.584-1514T>C", + "ENST00000557817(ENSG00000259176):n.320-1514T>C", + "ENST00000558312(ENSG00000259176):n.167-1514T>C", + "ENST00000558798(ENSG00000259176):n.167-1514T>C", + "ENST00000563771(ENSG00000261277):n.499T>C" + ], + "id": "rs1529528", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.19332783, + "altHomGenotypeFreq": 0.0060468633, + "hetGenotypeFreq": 0.37456194, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.80667216, + "refHomGenotypeFreq": 0.6193912, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21149674, + "altHomGenotypeFreq": 0.0021691974, + "hetGenotypeFreq": 0.4186551, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.7885032, + "refHomGenotypeFreq": 0.5791757, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3660598, + "altHomGenotypeFreq": 0.018205462, + "hetGenotypeFreq": 0.6957087, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.63394016, + "refHomGenotypeFreq": 0.2860858, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13375, + "altHomGenotypeFreq": 0.0025, + "hetGenotypeFreq": 0.2625, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.86625, + "refHomGenotypeFreq": 0.735, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19366197, + "altHomGenotypeFreq": 0.03521127, + "hetGenotypeFreq": 0.31690142, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.806338, + "refHomGenotypeFreq": 0.64788735, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1989577, + "altHomGenotypeFreq": 0.0067443284, + "hetGenotypeFreq": 0.38442674, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.8010423, + "refHomGenotypeFreq": 0.60882896, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20487873, + "altHomGenotypeFreq": 0.0069091935, + "hetGenotypeFreq": 0.39593908, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.79512125, + "refHomGenotypeFreq": 0.5971517, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14194185, + "altHomGenotypeFreq": 0.0017249876, + "hetGenotypeFreq": 0.2804337, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.85805815, + "refHomGenotypeFreq": 0.7178413, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19223145, + "altHomGenotypeFreq": 0.006195019, + "hetGenotypeFreq": 0.37207285, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.8077686, + "refHomGenotypeFreq": 0.6217321, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.194693, + "altHomGenotypeFreq": 0.0058623883, + "hetGenotypeFreq": 0.37766123, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.80530703, + "refHomGenotypeFreq": 0.6164764, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22345158, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22345158, + "id": "15:22345158:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22345158, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 519, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.9079999923706055, + "source": "gerp" + }, + { + "score": 0.9279999732971191, + "source": "phastCons" + }, + { + "score": 0.29899999499320984, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.6700000762939453, + "source": "cadd_raw" + }, + { + "score": 14.260000228881836, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1494C>A", + "ENST00000557855(ENSG00000259176):n.111-1494C>A", + "ENST00000559392(ENSG00000259176):n.196-1494C>A", + "ENST00000558896(ENSG00000259176):n.584-1494C>A", + "ENST00000557817(ENSG00000259176):n.320-1494C>A", + "ENST00000558312(ENSG00000259176):n.167-1494C>A", + "ENST00000558798(ENSG00000259176):n.167-1494C>A", + "ENST00000563771(ENSG00000261277):n.519C>A" + ], + "id": "rs61690271", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.24900186, + "altHomGenotypeFreq": 0.0081990585, + "hetGenotypeFreq": 0.4816056, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.75099814, + "refHomGenotypeFreq": 0.5101954, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25227273, + "altHomGenotypeFreq": 0.009090909, + "hetGenotypeFreq": 0.48636365, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7477273, + "refHomGenotypeFreq": 0.50454545, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1356383, + "altHomGenotypeFreq": 0.0013297872, + "hetGenotypeFreq": 0.26861703, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.8643617, + "refHomGenotypeFreq": 0.7300532, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22879177, + "altHomGenotypeFreq": 0.005141388, + "hetGenotypeFreq": 0.44730076, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7712082, + "refHomGenotypeFreq": 0.54755783, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21830986, + "altHomGenotypeFreq": 0.0070422534, + "hetGenotypeFreq": 0.4225352, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7816901, + "refHomGenotypeFreq": 0.57042253, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26012462, + "altHomGenotypeFreq": 0.008099688, + "hetGenotypeFreq": 0.50404984, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7398754, + "refHomGenotypeFreq": 0.48785046, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2493829, + "altHomGenotypeFreq": 0.009147669, + "hetGenotypeFreq": 0.48047045, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7506171, + "refHomGenotypeFreq": 0.5103819, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26882708, + "altHomGenotypeFreq": 0.008134348, + "hetGenotypeFreq": 0.5213855, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7311729, + "refHomGenotypeFreq": 0.4704802, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25003216, + "altHomGenotypeFreq": 0.009651268, + "hetGenotypeFreq": 0.4807618, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7499678, + "refHomGenotypeFreq": 0.50958693, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24772182, + "altHomGenotypeFreq": 0.006394884, + "hetGenotypeFreq": 0.4826539, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.75227815, + "refHomGenotypeFreq": 0.5109512, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14794007, + "altHomGenotypeFreq": 0.014981274, + "hetGenotypeFreq": 0.2659176, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8520599, + "refHomGenotypeFreq": 0.71910113, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22345178, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22345178, + "id": "15:22345178:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 22345178, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 647, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.8799999952316284, + "source": "gerp" + }, + { + "score": 0.8450000286102295, + "source": "phastCons" + }, + { + "score": 0.24899999797344208, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.25, + "source": "cadd_raw" + }, + { + "score": 12.0600004196167, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1366A>C", + "ENST00000557855(ENSG00000259176):n.111-1366A>C", + "ENST00000559392(ENSG00000259176):n.196-1366A>C", + "ENST00000558896(ENSG00000259176):n.584-1366A>C", + "ENST00000557817(ENSG00000259176):n.320-1366A>C", + "ENST00000558312(ENSG00000259176):n.167-1366A>C", + "ENST00000558798(ENSG00000259176):n.167-1366A>C", + "ENST00000563771(ENSG00000261277):n.647A>C" + ], + "id": "rs12438744", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.17665659, + "altHomGenotypeFreq": 0.0043992302, + "hetGenotypeFreq": 0.3445147, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8233434, + "refHomGenotypeFreq": 0.65108603, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22345133, + "altHomGenotypeFreq": 0.006637168, + "hetGenotypeFreq": 0.43362832, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.7765487, + "refHomGenotypeFreq": 0.5597345, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.06697009, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13394018, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.9330299, + "refHomGenotypeFreq": 0.86605984, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11851852, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23703703, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.88148147, + "refHomGenotypeFreq": 0.76296294, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21830986, + "altHomGenotypeFreq": 0.0070422534, + "hetGenotypeFreq": 0.4225352, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7816901, + "refHomGenotypeFreq": 0.57042253, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2442866, + "altHomGenotypeFreq": 0.008647313, + "hetGenotypeFreq": 0.47127858, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7557134, + "refHomGenotypeFreq": 0.5200741, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23068684, + "altHomGenotypeFreq": 0.0061402256, + "hetGenotypeFreq": 0.44909325, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.76931316, + "refHomGenotypeFreq": 0.54476655, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07876383, + "altHomGenotypeFreq": 7.215007E-4, + "hetGenotypeFreq": 0.15608466, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.92123616, + "refHomGenotypeFreq": 0.8431938, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17212504, + "altHomGenotypeFreq": 0.004093785, + "hetGenotypeFreq": 0.33606252, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.82787496, + "refHomGenotypeFreq": 0.6598437, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18228765, + "altHomGenotypeFreq": 0.0047787884, + "hetGenotypeFreq": 0.35501772, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.81771237, + "refHomGenotypeFreq": 0.6402035, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22945891, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7705411, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2247191, + "altHomGenotypeFreq": 0.011235955, + "hetGenotypeFreq": 0.42696628, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7752809, + "refHomGenotypeFreq": 0.56179774, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22345306, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22345306, + "id": "15:22345306:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 22345306, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 831, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.8799999952316284, + "source": "gerp" + }, + { + "score": 0.42399999499320984, + "source": "phastCons" + }, + { + "score": 0.24899999797344208, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.7299995422363281, + "source": "cadd_raw" + }, + { + "score": 9.0600004196167, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1182A>G", + "ENST00000557855(ENSG00000259176):n.111-1182A>G", + "ENST00000559392(ENSG00000259176):n.196-1182A>G", + "ENST00000558896(ENSG00000259176):n.584-1182A>G", + "ENST00000557817(ENSG00000259176):n.320-1182A>G", + "ENST00000558312(ENSG00000259176):n.167-1182A>G", + "ENST00000558798(ENSG00000259176):n.167-1182A>G", + "ENST00000563771(ENSG00000261277):n.831A>G" + ], + "id": "rs77518658", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.21682309, + "altHomGenotypeFreq": 0.0070907194, + "hetGenotypeFreq": 0.4194647, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7831769, + "refHomGenotypeFreq": 0.57344455, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25599128, + "altHomGenotypeFreq": 0.008714597, + "hetGenotypeFreq": 0.4945534, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.7440087, + "refHomGenotypeFreq": 0.49673203, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13364361, + "altHomGenotypeFreq": 0.0026595744, + "hetGenotypeFreq": 0.26196808, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.8663564, + "refHomGenotypeFreq": 0.73537236, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22066326, + "altHomGenotypeFreq": 0.0051020407, + "hetGenotypeFreq": 0.43112245, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.77933675, + "refHomGenotypeFreq": 0.56377554, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20070423, + "altHomGenotypeFreq": 0.0070422534, + "hetGenotypeFreq": 0.38732395, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7992958, + "refHomGenotypeFreq": 0.6056338, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2599632, + "altHomGenotypeFreq": 0.007970571, + "hetGenotypeFreq": 0.5039853, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7400368, + "refHomGenotypeFreq": 0.48804414, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25024983, + "altHomGenotypeFreq": 0.009564597, + "hetGenotypeFreq": 0.48137045, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7497502, + "refHomGenotypeFreq": 0.509065, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1520979, + "altHomGenotypeFreq": 0.0032467532, + "hetGenotypeFreq": 0.2977023, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.8479021, + "refHomGenotypeFreq": 0.69905096, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21403398, + "altHomGenotypeFreq": 0.008181246, + "hetGenotypeFreq": 0.41170546, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.78596604, + "refHomGenotypeFreq": 0.5801133, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22026397, + "altHomGenotypeFreq": 0.0057453415, + "hetGenotypeFreq": 0.42903727, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.77973604, + "refHomGenotypeFreq": 0.5652174, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20786516, + "altHomGenotypeFreq": 0.014981274, + "hetGenotypeFreq": 0.3857678, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7921348, + "refHomGenotypeFreq": 0.5992509, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22345490, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22345490, + "id": "15:22345490:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22345490, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "cdnaPosition": 887, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.10857763 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.3799999952316284, + "source": "gerp" + }, + { + "score": 0.07999999821186066, + "source": "phastCons" + }, + { + "score": 0.29899999499320984, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.25, + "source": "cadd_raw" + }, + { + "score": 5.269999980926514, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1126C>T", + "ENST00000557855(ENSG00000259176):n.111-1126C>T", + "ENST00000559392(ENSG00000259176):n.196-1126C>T", + "ENST00000558896(ENSG00000259176):n.584-1126C>T", + "ENST00000557817(ENSG00000259176):n.320-1126C>T", + "ENST00000558312(ENSG00000259176):n.167-1126C>T", + "ENST00000558798(ENSG00000259176):n.167-1126C>T", + "ENST00000563771(ENSG00000261277):n.887C>T" + ], + "id": "rs13380139", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.3738921, + "altHomGenotypeFreq": 0.045781285, + "hetGenotypeFreq": 0.65999025, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6242236, + "refHomGenotypeFreq": 0.2942285, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4021978, + "altHomGenotypeFreq": 0.05934066, + "hetGenotypeFreq": 0.6857143, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.5978022, + "refHomGenotypeFreq": 0.25494507, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36956522, + "altHomGenotypeFreq": 0.05027174, + "hetGenotypeFreq": 0.63858694, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6304348, + "refHomGenotypeFreq": 0.3111413, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5321782, + "altHomGenotypeFreq": 0.18069308, + "hetGenotypeFreq": 0.7029703, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.46782178, + "refHomGenotypeFreq": 0.116336636, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42857143, + "altHomGenotypeFreq": 0.06802721, + "hetGenotypeFreq": 0.7210884, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.5714286, + "refHomGenotypeFreq": 0.21088435, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43101344, + "altHomGenotypeFreq": 0.04761905, + "hetGenotypeFreq": 0.7667888, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5689866, + "refHomGenotypeFreq": 0.18559219, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4227648, + "altHomGenotypeFreq": 0.054527335, + "hetGenotypeFreq": 0.7366173, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.577164, + "refHomGenotypeFreq": 0.20885535, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24178344, + "altHomGenotypeFreq": 0.012229299, + "hetGenotypeFreq": 0.47261146, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.75146496, + "refHomGenotypeFreq": 0.51515925, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37091297, + "altHomGenotypeFreq": 0.046277665, + "hetGenotypeFreq": 0.6532948, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.62707496, + "refHomGenotypeFreq": 0.30042756, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37760702, + "altHomGenotypeFreq": 0.0451623, + "hetGenotypeFreq": 0.6683394, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.62066805, + "refHomGenotypeFreq": 0.28649837, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.59375, + "altHomGenotypeFreq": 0.3125, + "hetGenotypeFreq": 0.5625, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.40625, + "refHomGenotypeFreq": 0.125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.355631, + "altHomGenotypeFreq": 0.06629393, + "hetGenotypeFreq": 0.57867414, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.644369, + "refHomGenotypeFreq": 0.35503194, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41206545, + "altHomGenotypeFreq": 0.06952965, + "hetGenotypeFreq": 0.6850716, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.58793455, + "refHomGenotypeFreq": 0.24539877, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47340426, + "altHomGenotypeFreq": 0.11702128, + "hetGenotypeFreq": 0.71276593, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.5265958, + "refHomGenotypeFreq": 0.17021276, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43137255, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.7254902, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.5686275, + "refHomGenotypeFreq": 0.20588236, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21709532, + "altHomGenotypeFreq": 0.004538578, + "hetGenotypeFreq": 0.42511344, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7829047, + "refHomGenotypeFreq": 0.57034796, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34285715, + "altHomGenotypeFreq": 0.028571429, + "hetGenotypeFreq": 0.62857145, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.6571429, + "refHomGenotypeFreq": 0.34285715, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3125, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.4903846, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.6875, + "refHomGenotypeFreq": 0.44230768, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18518518, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3703704, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.8148148, + "refHomGenotypeFreq": 0.6296296, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47395834, + "altHomGenotypeFreq": 0.15625, + "hetGenotypeFreq": 0.6354166, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.5260417, + "refHomGenotypeFreq": 0.20833333, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2079646, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4159292, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.7920354, + "refHomGenotypeFreq": 0.5840708, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4117647, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.7058824, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.5882353, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35164836, + "altHomGenotypeFreq": 0.043956045, + "hetGenotypeFreq": 0.61538464, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.64835167, + "refHomGenotypeFreq": 0.34065935, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34946236, + "altHomGenotypeFreq": 0.043010753, + "hetGenotypeFreq": 0.61290324, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.6505376, + "refHomGenotypeFreq": 0.34408602, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34848484, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.65656567, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.6515151, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39252338, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.69158876, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.60747665, + "refHomGenotypeFreq": 0.26168224, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34302327, + "altHomGenotypeFreq": 0.034883723, + "hetGenotypeFreq": 0.61627907, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.65697676, + "refHomGenotypeFreq": 0.3488372, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22916667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4583333, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.7708333, + "refHomGenotypeFreq": 0.5416667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18181819, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.36363637, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.8181818, + "refHomGenotypeFreq": 0.6363636, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24242425, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4848485, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.75757575, + "refHomGenotypeFreq": 0.5151515, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37673956, + "altHomGenotypeFreq": 0.04771372, + "hetGenotypeFreq": 0.65805167, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.62326044, + "refHomGenotypeFreq": 0.2942346, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23770492, + "altHomGenotypeFreq": 0.04918033, + "hetGenotypeFreq": 0.37704918, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.76229507, + "refHomGenotypeFreq": 0.57377046, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5389049, + "altHomGenotypeFreq": 0.23919308, + "hetGenotypeFreq": 0.59942365, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.4610951, + "refHomGenotypeFreq": 0.16138329, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2529412, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5058824, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.7470588, + "refHomGenotypeFreq": 0.49411765, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39320388, + "altHomGenotypeFreq": 0.029126214, + "hetGenotypeFreq": 0.7281554, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.60679615, + "refHomGenotypeFreq": 0.24271844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3989899, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.6363636, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6010101, + "refHomGenotypeFreq": 0.28282827, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3598131, + "altHomGenotypeFreq": 0.018691588, + "hetGenotypeFreq": 0.682243, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.6401869, + "refHomGenotypeFreq": 0.2990654, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42307693, + "altHomGenotypeFreq": 0.115384616, + "hetGenotypeFreq": 0.6153846, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.5769231, + "refHomGenotypeFreq": 0.26923078, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.65656567, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7117647, + "altHomGenotypeFreq": 0.47058824, + "hetGenotypeFreq": 0.48235297, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.2882353, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33531746, + "altHomGenotypeFreq": 0.043650795, + "hetGenotypeFreq": 0.5833334, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.66468257, + "refHomGenotypeFreq": 0.37301588, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32524273, + "altHomGenotypeFreq": 0.058252428, + "hetGenotypeFreq": 0.5339806, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.6747573, + "refHomGenotypeFreq": 0.407767, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36516854, + "altHomGenotypeFreq": 0.052434456, + "hetGenotypeFreq": 0.6254682, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6348315, + "refHomGenotypeFreq": 0.3220974, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22345546, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22345546, + "id": "15:22345546:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22345546, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "cdnaPosition": 108, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.29411766 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.390000104904175, + "source": "gerp" + }, + { + "score": 0.008999999612569809, + "source": "phastCons" + }, + { + "score": -1.7130000591278076, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.7299995422363281, + "source": "cadd_raw" + }, + { + "score": 0.05999999865889549, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-1004A>T", + "ENST00000557855(ENSG00000259176):n.111-1004A>T", + "ENST00000559392(ENSG00000259176):n.196-1004A>T", + "ENST00000558896(ENSG00000259176):n.584-1004A>T", + "ENST00000557817(ENSG00000259176):n.320-1004A>T", + "ENST00000558312(ENSG00000259176):n.167-1004A>T", + "ENST00000558798(ENSG00000259176):n.167-1004A>T", + "ENST00000603819(ENSG00000261277):n.108A>T" + ], + "id": "rs76270326", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.21927626, + "altHomGenotypeFreq": 0.007098121, + "hetGenotypeFreq": 0.4243563, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.78072375, + "refHomGenotypeFreq": 0.5685456, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25384617, + "altHomGenotypeFreq": 0.008791209, + "hetGenotypeFreq": 0.4901099, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.74615383, + "refHomGenotypeFreq": 0.50109893, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13527851, + "altHomGenotypeFreq": 0.0026525198, + "hetGenotypeFreq": 0.265252, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.8647215, + "refHomGenotypeFreq": 0.7320955, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22512437, + "altHomGenotypeFreq": 0.0024875621, + "hetGenotypeFreq": 0.44527364, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.77487564, + "refHomGenotypeFreq": 0.5522388, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19424461, + "altHomGenotypeFreq": 0.007194245, + "hetGenotypeFreq": 0.37410071, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.8057554, + "refHomGenotypeFreq": 0.61870503, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26007327, + "altHomGenotypeFreq": 0.007936508, + "hetGenotypeFreq": 0.50427353, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.73992676, + "refHomGenotypeFreq": 0.48779, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25025025, + "altHomGenotypeFreq": 0.00972401, + "hetGenotypeFreq": 0.4810525, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7497497, + "refHomGenotypeFreq": 0.5092235, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16044122, + "altHomGenotypeFreq": 0.0032589622, + "hetGenotypeFreq": 0.3143645, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.8395588, + "refHomGenotypeFreq": 0.68237656, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21708207, + "altHomGenotypeFreq": 0.008056395, + "hetGenotypeFreq": 0.41805136, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.7829179, + "refHomGenotypeFreq": 0.57389224, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2219888, + "altHomGenotypeFreq": 0.0059134765, + "hetGenotypeFreq": 0.43215063, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.7780112, + "refHomGenotypeFreq": 0.5619359, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22345668, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22345668, + "id": "15:22345668:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 22345668, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "cdnaPosition": 169, + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.29411766 + } + ], + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.2699999809265137, + "source": "gerp" + }, + { + "score": 0.17000000178813934, + "source": "phastCons" + }, + { + "score": 0.29899999499320984, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.3599996566772461, + "source": "cadd_raw" + }, + { + "score": 6.289999961853027, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000560193(ENSG00000259176):n.435-943C>T", + "ENST00000557855(ENSG00000259176):n.111-943C>T", + "ENST00000559392(ENSG00000259176):n.196-943C>T", + "ENST00000558896(ENSG00000259176):n.584-943C>T", + "ENST00000557817(ENSG00000259176):n.320-943C>T", + "ENST00000558312(ENSG00000259176):n.167-943C>T", + "ENST00000558798(ENSG00000259176):n.167-943C>T", + "ENST00000603819(ENSG00000261277):n.169C>T" + ], + "id": "rs1429472", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.16694237, + "altHomGenotypeFreq": 0.004962779, + "hetGenotypeFreq": 0.3239592, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.83305764, + "refHomGenotypeFreq": 0.671078, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.202407, + "altHomGenotypeFreq": 0.0021881838, + "hetGenotypeFreq": 0.40043762, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.797593, + "refHomGenotypeFreq": 0.5973742, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23497997, + "altHomGenotypeFreq": 0.0013351135, + "hetGenotypeFreq": 0.46728972, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.76502, + "refHomGenotypeFreq": 0.53137517, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10246914, + "altHomGenotypeFreq": 0.002469136, + "hetGenotypeFreq": 0.2, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.89753085, + "refHomGenotypeFreq": 0.7975309, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20774648, + "altHomGenotypeFreq": 0.03521127, + "hetGenotypeFreq": 0.34507042, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7922535, + "refHomGenotypeFreq": 0.6197183, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19871007, + "altHomGenotypeFreq": 0.006756757, + "hetGenotypeFreq": 0.38390663, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.8012899, + "refHomGenotypeFreq": 0.6093366, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20022835, + "altHomGenotypeFreq": 0.0068502924, + "hetGenotypeFreq": 0.3867561, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.79977167, + "refHomGenotypeFreq": 0.60639364, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.086407766, + "altHomGenotypeFreq": 0.0012135922, + "hetGenotypeFreq": 0.17038836, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9135922, + "refHomGenotypeFreq": 0.82839805, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16426441, + "altHomGenotypeFreq": 0.005094433, + "hetGenotypeFreq": 0.31833997, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.83573556, + "refHomGenotypeFreq": 0.6765656, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17027864, + "altHomGenotypeFreq": 0.0047987616, + "hetGenotypeFreq": 0.33095977, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.8297214, + "refHomGenotypeFreq": 0.6642415, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22745492, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7725451, + "study": "GONL" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22345729, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22345729, + "id": "15:22345729:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22345729, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560193", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557855", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000557817", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "transcribed_processed_pseudogene", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000563771", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000261277", + "ensemblTranscriptId": "ENST00000603819", + "geneName": "OR4H6P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "snoRNA", + "ensemblGeneId": "ENSG00000238960", + "ensemblTranscriptId": "ENST00000459608", + "geneName": "snoU13", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.3779999911785126, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.5540000200271606, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.3400001525878906, + "source": "cadd_raw" + }, + { + "score": 0.5600000023841858, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0008149", + "name": "Chlamydia Infections", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0948780", + "name": "rhinosinusitis", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0031094", + "name": "Periodontal Pocket", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0027430", + "name": "Nasal Polyps", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+2618A>T", + "ENST00000558896(ENSG00000259176):n.972+1599A>T", + "ENST00000558312(ENSG00000259176):n.555+1599A>T", + "ENST00000558798(ENSG00000259176):n.555+1599A>T", + "ENST00000560969(ENSG00000259176):n.192+1599A>T" + ], + "id": "rs7174895", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.87428737, + "altHomGenotypeFreq": 0.74909306, + "hetGenotypeFreq": 0.2503887, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.12571262, + "refHomGenotypeFreq": 5.1826896E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8979592, + "altHomGenotypeFreq": 0.79591835, + "hetGenotypeFreq": 0.20408164, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.10204082, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9682045, + "altHomGenotypeFreq": 0.936409, + "hetGenotypeFreq": 0.063591026, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.031795513, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9282297, + "altHomGenotypeFreq": 0.8564593, + "hetGenotypeFreq": 0.14354067, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.07177033, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8807947, + "altHomGenotypeFreq": 0.7615894, + "hetGenotypeFreq": 0.23841059, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.119205296, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.92750716, + "altHomGenotypeFreq": 0.8550143, + "hetGenotypeFreq": 0.14498568, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.07249284, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9039129, + "altHomGenotypeFreq": 0.80782586, + "hetGenotypeFreq": 0.19217415, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.096087076, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.77637035, + "altHomGenotypeFreq": 0.55458313, + "hetGenotypeFreq": 0.4435744, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.22362967, + "refHomGenotypeFreq": 0.0018424689, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.87316847, + "altHomGenotypeFreq": 0.7468058, + "hetGenotypeFreq": 0.25272536, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.12683156, + "refHomGenotypeFreq": 4.6887822E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8756698, + "altHomGenotypeFreq": 0.7519189, + "hetGenotypeFreq": 0.2475018, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.12433019, + "refHomGenotypeFreq": 5.792904E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.91683364, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.08316633, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.96875, + "altHomGenotypeFreq": 0.9375, + "hetGenotypeFreq": 0.0625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.03125, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8736022, + "altHomGenotypeFreq": 0.74840254, + "hetGenotypeFreq": 0.25039935, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.12639776, + "refHomGenotypeFreq": 0.001198083, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8394683, + "altHomGenotypeFreq": 0.6809816, + "hetGenotypeFreq": 0.3169734, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.1605317, + "refHomGenotypeFreq": 0.0020449897, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90425533, + "altHomGenotypeFreq": 0.80851066, + "hetGenotypeFreq": 0.19148937, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.095744684, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8137255, + "altHomGenotypeFreq": 0.627451, + "hetGenotypeFreq": 0.37254903, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.18627451, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7934947, + "altHomGenotypeFreq": 0.5885023, + "hetGenotypeFreq": 0.4099849, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.2065053, + "refHomGenotypeFreq": 0.0015128592, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.96190476, + "altHomGenotypeFreq": 0.9238095, + "hetGenotypeFreq": 0.07619048, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.03809524, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9423077, + "altHomGenotypeFreq": 0.88461536, + "hetGenotypeFreq": 0.11538462, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.057692308, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7962963, + "altHomGenotypeFreq": 0.5925926, + "hetGenotypeFreq": 0.4074074, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.2037037, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8802083, + "altHomGenotypeFreq": 0.7708333, + "hetGenotypeFreq": 0.21875, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.119791664, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7654867, + "altHomGenotypeFreq": 0.539823, + "hetGenotypeFreq": 0.45132744, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.23451327, + "refHomGenotypeFreq": 0.0088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8382353, + "altHomGenotypeFreq": 0.6764706, + "hetGenotypeFreq": 0.32352942, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.16176471, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.85164833, + "altHomGenotypeFreq": 0.7032967, + "hetGenotypeFreq": 0.2967033, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.14835165, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.94623655, + "altHomGenotypeFreq": 0.8924731, + "hetGenotypeFreq": 0.10752688, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.05376344, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9191919, + "altHomGenotypeFreq": 0.83838385, + "hetGenotypeFreq": 0.16161616, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.08080808, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.88785046, + "altHomGenotypeFreq": 0.78504676, + "hetGenotypeFreq": 0.20560747, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.11214953, + "refHomGenotypeFreq": 0.009345794, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8023256, + "altHomGenotypeFreq": 0.60465115, + "hetGenotypeFreq": 0.39534885, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.19767442, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.828125, + "altHomGenotypeFreq": 0.65625, + "hetGenotypeFreq": 0.34375, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.171875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.74242425, + "altHomGenotypeFreq": 0.4848485, + "hetGenotypeFreq": 0.5151515, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.25757575, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.82828283, + "altHomGenotypeFreq": 0.65656567, + "hetGenotypeFreq": 0.34343433, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.17171717, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8946322, + "altHomGenotypeFreq": 0.7912525, + "hetGenotypeFreq": 0.20675945, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.105367795, + "refHomGenotypeFreq": 0.0019880715, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.77868855, + "altHomGenotypeFreq": 0.55737704, + "hetGenotypeFreq": 0.44262293, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.22131148, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.93227667, + "altHomGenotypeFreq": 0.86455333, + "hetGenotypeFreq": 0.13544668, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.06772334, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.81764704, + "altHomGenotypeFreq": 0.63529414, + "hetGenotypeFreq": 0.3647059, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.18235295, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8592233, + "altHomGenotypeFreq": 0.7184466, + "hetGenotypeFreq": 0.2815534, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.1407767, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.87383175, + "altHomGenotypeFreq": 0.74766356, + "hetGenotypeFreq": 0.25233644, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.12616822, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90384614, + "altHomGenotypeFreq": 0.8076923, + "hetGenotypeFreq": 0.1923077, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.09615385, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9141414, + "altHomGenotypeFreq": 0.82828283, + "hetGenotypeFreq": 0.17171717, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.08585858, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9705882, + "altHomGenotypeFreq": 0.9411765, + "hetGenotypeFreq": 0.058823533, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.029411765, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.95039684, + "altHomGenotypeFreq": 0.9007937, + "hetGenotypeFreq": 0.09920635, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.049603175, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.98058254, + "altHomGenotypeFreq": 0.9611651, + "hetGenotypeFreq": 0.03883495, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.019417476, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22349385, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22349385, + "id": "15:22349385:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 22349385, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560544", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.5649999976158142, + "source": "gerp" + }, + { + "score": 0.14900000393390656, + "source": "phastCons" + }, + { + "score": 0.4410000145435333, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.36999988555908203, + "source": "cadd_raw" + }, + { + "score": 6.389999866485596, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+15916C>A", + "ENST00000558896(ENSG00000259176):n.972+14897C>A", + "ENST00000558312(ENSG00000259176):n.555+14897C>A", + "ENST00000558798(ENSG00000259176):n.555+14897C>A", + "ENST00000560969(ENSG00000259176):n.193-8315C>A", + "ENST00000560544(ENSG00000259176):n.214+4278C>A" + ], + "id": "rs7176140", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.3285894, + "altHomGenotypeFreq": 0.02706483, + "hetGenotypeFreq": 0.6114414, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6672145, + "refHomGenotypeFreq": 0.3614938, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30752212, + "altHomGenotypeFreq": 0.015486726, + "hetGenotypeFreq": 0.5862832, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.6913717, + "refHomGenotypeFreq": 0.39823008, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35742706, + "altHomGenotypeFreq": 0.0331565, + "hetGenotypeFreq": 0.6485411, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.64257294, + "refHomGenotypeFreq": 0.3183024, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27061856, + "altHomGenotypeFreq": 0.010309278, + "hetGenotypeFreq": 0.52319586, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7280928, + "refHomGenotypeFreq": 0.46649486, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26811594, + "altHomGenotypeFreq": 0.014492754, + "hetGenotypeFreq": 0.5072464, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.73188406, + "refHomGenotypeFreq": 0.47826087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28064716, + "altHomGenotypeFreq": 0.011823273, + "hetGenotypeFreq": 0.5376478, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.71935284, + "refHomGenotypeFreq": 0.45052895, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29398647, + "altHomGenotypeFreq": 0.015681198, + "hetGenotypeFreq": 0.55675447, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7059416, + "refHomGenotypeFreq": 0.42756438, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.412447, + "altHomGenotypeFreq": 0.055125967, + "hetGenotypeFreq": 0.7438264, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.57296085, + "refHomGenotypeFreq": 0.20104764, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33054605, + "altHomGenotypeFreq": 0.030786775, + "hetGenotypeFreq": 0.6078804, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.665273, + "refHomGenotypeFreq": 0.36133283, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32617858, + "altHomGenotypeFreq": 0.022478927, + "hetGenotypeFreq": 0.6158289, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.6696066, + "refHomGenotypeFreq": 0.36169216, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.265625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.53125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.734375, + "refHomGenotypeFreq": 0.46875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3278754, + "altHomGenotypeFreq": 0.035543133, + "hetGenotypeFreq": 0.5846646, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6721246, + "refHomGenotypeFreq": 0.37979233, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28732106, + "altHomGenotypeFreq": 0.016359918, + "hetGenotypeFreq": 0.5419223, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.7126789, + "refHomGenotypeFreq": 0.4417178, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23404256, + "altHomGenotypeFreq": 0.021276595, + "hetGenotypeFreq": 0.42553192, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.7659575, + "refHomGenotypeFreq": 0.5531915, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24019608, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.44117647, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.75980395, + "refHomGenotypeFreq": 0.5392157, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4160363, + "altHomGenotypeFreq": 0.059001513, + "hetGenotypeFreq": 0.7140696, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5839637, + "refHomGenotypeFreq": 0.22692889, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36666667, + "altHomGenotypeFreq": 0.00952381, + "hetGenotypeFreq": 0.71428573, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.6333333, + "refHomGenotypeFreq": 0.2761905, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37980768, + "altHomGenotypeFreq": 0.086538464, + "hetGenotypeFreq": 0.58653843, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.6201923, + "refHomGenotypeFreq": 0.32692307, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4537037, + "altHomGenotypeFreq": 0.10185185, + "hetGenotypeFreq": 0.7037037, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.5462963, + "refHomGenotypeFreq": 0.19444445, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26041666, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5208334, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.7395833, + "refHomGenotypeFreq": 0.47916666, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38938054, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.7256637, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.6106195, + "refHomGenotypeFreq": 0.24778761, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30392158, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.60784316, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.6960784, + "refHomGenotypeFreq": 0.39215687, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32417583, + "altHomGenotypeFreq": 0.032967035, + "hetGenotypeFreq": 0.5824176, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.67582417, + "refHomGenotypeFreq": 0.3846154, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32258064, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.6236559, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.67741936, + "refHomGenotypeFreq": 0.3655914, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3131313, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.5252525, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.68686867, + "refHomGenotypeFreq": 0.42424244, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25700936, + "altHomGenotypeFreq": 0.028037382, + "hetGenotypeFreq": 0.45794392, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.7429907, + "refHomGenotypeFreq": 0.5140187, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3139535, + "altHomGenotypeFreq": 0.034883723, + "hetGenotypeFreq": 0.55813956, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.68604654, + "refHomGenotypeFreq": 0.40697673, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38020834, + "altHomGenotypeFreq": 0.052083332, + "hetGenotypeFreq": 0.65625, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.6197917, + "refHomGenotypeFreq": 0.29166666, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3888889, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.69696975, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.6111111, + "refHomGenotypeFreq": 0.26262626, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42424244, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.6666666, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.57575756, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28827038, + "altHomGenotypeFreq": 0.02385686, + "hetGenotypeFreq": 0.5288271, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.71172965, + "refHomGenotypeFreq": 0.4473161, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3852459, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.704918, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.6147541, + "refHomGenotypeFreq": 0.26229507, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23775215, + "altHomGenotypeFreq": 0.02017291, + "hetGenotypeFreq": 0.4351585, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.76224786, + "refHomGenotypeFreq": 0.5446686, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4882353, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.85882354, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.5117647, + "refHomGenotypeFreq": 0.08235294, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32038835, + "altHomGenotypeFreq": 0.029126214, + "hetGenotypeFreq": 0.5825243, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.6796116, + "refHomGenotypeFreq": 0.3883495, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28787878, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.53535354, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7121212, + "refHomGenotypeFreq": 0.44444445, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26168224, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.5046729, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.7383177, + "refHomGenotypeFreq": 0.48598132, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27403846, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.49038464, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.72596157, + "refHomGenotypeFreq": 0.48076922, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3181818, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.57575756, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.6818182, + "refHomGenotypeFreq": 0.3939394, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1764706, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.30588236, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.8235294, + "refHomGenotypeFreq": 0.67058825, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3531746, + "altHomGenotypeFreq": 0.04563492, + "hetGenotypeFreq": 0.61507934, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6468254, + "refHomGenotypeFreq": 0.3392857, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37864077, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.6213592, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.6213592, + "refHomGenotypeFreq": 0.3106796, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22362683, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22362683, + "id": "15:22362683:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 22362683, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560544", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000182974", + "ensemblTranscriptId": "ENST00000332663", + "geneName": "OR4M2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.8299999833106995, + "source": "gerp" + }, + { + "score": 0.02800000086426735, + "source": "phastCons" + }, + { + "score": 0.3630000054836273, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.1099996566772461, + "source": "cadd_raw" + }, + { + "score": 3.7200000286102295, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+18193T>G", + "ENST00000558896(ENSG00000259176):n.972+17174T>G", + "ENST00000558312(ENSG00000259176):n.555+17174T>G", + "ENST00000558798(ENSG00000259176):n.555+17174T>G", + "ENST00000560969(ENSG00000259176):n.193-6038T>G", + "ENST00000560544(ENSG00000259176):n.215-3587T>G" + ], + "id": "rs77119890", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.22608572, + "altHomGenotypeFreq": 0.008586432, + "hetGenotypeFreq": 0.43499857, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7739143, + "refHomGenotypeFreq": 0.55641496, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25113124, + "altHomGenotypeFreq": 0.009049774, + "hetGenotypeFreq": 0.4841629, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.74886876, + "refHomGenotypeFreq": 0.50678736, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12967914, + "altHomGenotypeFreq": 0.0026737968, + "hetGenotypeFreq": 0.2540107, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.87032086, + "refHomGenotypeFreq": 0.7433155, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23514211, + "altHomGenotypeFreq": 0.007751938, + "hetGenotypeFreq": 0.45478037, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7648579, + "refHomGenotypeFreq": 0.5374677, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19343066, + "altHomGenotypeFreq": 0.00729927, + "hetGenotypeFreq": 0.37226278, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.80656934, + "refHomGenotypeFreq": 0.620438, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25424263, + "altHomGenotypeFreq": 0.008799497, + "hetGenotypeFreq": 0.49088624, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7457574, + "refHomGenotypeFreq": 0.5003143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2495637, + "altHomGenotypeFreq": 0.011780105, + "hetGenotypeFreq": 0.4755672, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.7504363, + "refHomGenotypeFreq": 0.5126527, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18920992, + "altHomGenotypeFreq": 0.0040910253, + "hetGenotypeFreq": 0.3702378, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.81079006, + "refHomGenotypeFreq": 0.6256712, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22489753, + "altHomGenotypeFreq": 0.009733606, + "hetGenotypeFreq": 0.43032786, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.77510244, + "refHomGenotypeFreq": 0.55993855, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22756205, + "altHomGenotypeFreq": 0.007161044, + "hetGenotypeFreq": 0.44080204, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.77243793, + "refHomGenotypeFreq": 0.55203694, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22364960, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22364960, + "id": "15:22364960:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 22364960, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560544", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000182974", + "ensemblTranscriptId": "ENST00000332663", + "geneName": "OR4M2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.9610000252723694, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": -0.6159999966621399, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.07999992370605469, + "source": "cadd_raw" + }, + { + "score": 1.8899999856948853, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+21609G>A", + "ENST00000558896(ENSG00000259176):n.973-14088G>A", + "ENST00000558312(ENSG00000259176):n.556-14088G>A", + "ENST00000558798(ENSG00000259176):n.555+20590G>A", + "ENST00000560969(ENSG00000259176):n.193-2622G>A", + "ENST00000560544(ENSG00000259176):n.215-171G>A" + ], + "id": "rs489674", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.87866527, + "altHomGenotypeFreq": 0.75797784, + "hetGenotypeFreq": 0.24137485, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.12133472, + "refHomGenotypeFreq": 6.472911E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.90204084, + "altHomGenotypeFreq": 0.8040816, + "hetGenotypeFreq": 0.19591837, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.09795918, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9660074, + "altHomGenotypeFreq": 0.9320148, + "hetGenotypeFreq": 0.06798517, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.033992585, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.93028843, + "altHomGenotypeFreq": 0.8605769, + "hetGenotypeFreq": 0.13942307, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.069711536, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8807947, + "altHomGenotypeFreq": 0.7615894, + "hetGenotypeFreq": 0.23841059, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.119205296, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.929885, + "altHomGenotypeFreq": 0.8597701, + "hetGenotypeFreq": 0.14022988, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.07011494, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.91038805, + "altHomGenotypeFreq": 0.8207761, + "hetGenotypeFreq": 0.1792239, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.08961195, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7794659, + "altHomGenotypeFreq": 0.5612339, + "hetGenotypeFreq": 0.4364641, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.22053407, + "refHomGenotypeFreq": 0.0023020257, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8773861, + "altHomGenotypeFreq": 0.75547487, + "hetGenotypeFreq": 0.24382246, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.12261389, + "refHomGenotypeFreq": 7.026584E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.88024604, + "altHomGenotypeFreq": 0.7610709, + "hetGenotypeFreq": 0.23835021, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.11975398, + "refHomGenotypeFreq": 5.7887123E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9238477, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.0761523, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.953125, + "altHomGenotypeFreq": 0.90625, + "hetGenotypeFreq": 0.09375, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.046875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.87320286, + "altHomGenotypeFreq": 0.7472045, + "hetGenotypeFreq": 0.25199682, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.12679712, + "refHomGenotypeFreq": 7.9872203E-4, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8374233, + "altHomGenotypeFreq": 0.6768916, + "hetGenotypeFreq": 0.3210634, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.16257669, + "refHomGenotypeFreq": 0.0020449897, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.89893615, + "altHomGenotypeFreq": 0.79787236, + "hetGenotypeFreq": 0.20212767, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.10106383, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8137255, + "altHomGenotypeFreq": 0.627451, + "hetGenotypeFreq": 0.37254903, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.18627451, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7874433, + "altHomGenotypeFreq": 0.5763994, + "hetGenotypeFreq": 0.42208773, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.21255673, + "refHomGenotypeFreq": 0.0015128592, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96190476, + "altHomGenotypeFreq": 0.9238095, + "hetGenotypeFreq": 0.07619048, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.03809524, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9423077, + "altHomGenotypeFreq": 0.88461536, + "hetGenotypeFreq": 0.11538462, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.057692308, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7685185, + "altHomGenotypeFreq": 0.537037, + "hetGenotypeFreq": 0.46296299, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.23148148, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8645833, + "altHomGenotypeFreq": 0.7395833, + "hetGenotypeFreq": 0.25, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.13541667, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7654867, + "altHomGenotypeFreq": 0.539823, + "hetGenotypeFreq": 0.45132744, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.23451327, + "refHomGenotypeFreq": 0.0088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8333333, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.33333334, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.16666667, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.87362635, + "altHomGenotypeFreq": 0.74725276, + "hetGenotypeFreq": 0.25274727, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.12637363, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9408602, + "altHomGenotypeFreq": 0.8817204, + "hetGenotypeFreq": 0.11827958, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.059139784, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9292929, + "altHomGenotypeFreq": 0.85858583, + "hetGenotypeFreq": 0.14141414, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.07070707, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9018692, + "altHomGenotypeFreq": 0.8037383, + "hetGenotypeFreq": 0.19626167, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.098130845, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.81395346, + "altHomGenotypeFreq": 0.627907, + "hetGenotypeFreq": 0.37209302, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.18604651, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.828125, + "altHomGenotypeFreq": 0.65625, + "hetGenotypeFreq": 0.34375, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.171875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7626263, + "altHomGenotypeFreq": 0.5252525, + "hetGenotypeFreq": 0.47474748, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.23737374, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.81313133, + "altHomGenotypeFreq": 0.6262626, + "hetGenotypeFreq": 0.3737374, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.18686868, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.90457255, + "altHomGenotypeFreq": 0.80914515, + "hetGenotypeFreq": 0.19085488, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.09542744, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.76229507, + "altHomGenotypeFreq": 0.52459013, + "hetGenotypeFreq": 0.47540984, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.23770492, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.92939484, + "altHomGenotypeFreq": 0.8587896, + "hetGenotypeFreq": 0.14121038, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.07060519, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8117647, + "altHomGenotypeFreq": 0.62352943, + "hetGenotypeFreq": 0.3764706, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.1882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8592233, + "altHomGenotypeFreq": 0.7184466, + "hetGenotypeFreq": 0.2815534, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.1407767, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.94949496, + "altHomGenotypeFreq": 0.8989899, + "hetGenotypeFreq": 0.1010101, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.05050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.87383175, + "altHomGenotypeFreq": 0.74766356, + "hetGenotypeFreq": 0.25233644, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.12616822, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.90865386, + "altHomGenotypeFreq": 0.8173077, + "hetGenotypeFreq": 0.1826923, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.09134615, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.92424244, + "altHomGenotypeFreq": 0.8484849, + "hetGenotypeFreq": 0.15151516, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.07575758, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9705882, + "altHomGenotypeFreq": 0.9411765, + "hetGenotypeFreq": 0.058823533, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.029411765, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.95039684, + "altHomGenotypeFreq": 0.9007937, + "hetGenotypeFreq": 0.09920635, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.049603175, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97572815, + "altHomGenotypeFreq": 0.9514563, + "hetGenotypeFreq": 0.048543688, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.024271844, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22368376, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22368376, + "id": "15:22368376:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22368376, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 322, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560544", + "exonOverlap": [ + { + "number": "3/4", + "percentage": 0.40816328 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 385, + "cdsPosition": 287, + "codon": "gGa/gAa", + "ensemblGeneId": "ENSG00000182974", + "ensemblTranscriptId": "ENST00000332663", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.09225092 + } + ], + "geneName": "OR4M2", + "proteinVariantAnnotation": { + "alternate": "GLU", + "features": [ + { + "description": "Olfactory receptor 4M2", + "end": 313, + "id": "PRO_0000150562", + "start": 1, + "type": "chain" + }, + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 289, + "id": "IPR017452", + "start": 41 + }, + { + "description": "Olfactory receptor", + "end": 103, + "id": "IPR000725", + "start": 92 + }, + { + "description": "Extracellular", + "end": 100, + "start": 80, + "type": "topological domain" + } + ], + "functionalDescription": "In dbSNP:rs1835183.", + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 96, + "reference": "GLY", + "substitutionScores": [ + { + "description": "deleterious", + "score": 0.01, + "source": "sift" + }, + { + "description": "probably damaging", + "score": 0.989, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8NGB6", + "uniprotVariantId": "VAR_047831" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.5, + "source": "gerp" + }, + { + "score": 0.7739999890327454, + "source": "phastCons" + }, + { + "score": 0.4480000138282776, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 4.199999809265137, + "source": "cadd_raw" + }, + { + "score": 23.899999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+22095G>A", + "ENST00000558896(ENSG00000259176):n.973-13602G>A", + "ENST00000558312(ENSG00000259176):n.556-13602G>A", + "ENST00000558798(ENSG00000259176):n.555+21076G>A", + "ENST00000560969(ENSG00000259176):n.193-2136G>A", + "ENST00000560544(ENSG00000259176):n.322G>A", + "ENST00000332663(ENSG00000182974):c.287G>A", + "ENSP00000329467:p.Gly96Glu" + ], + "id": "rs1835183", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.6351111, + "altHomGenotypeFreq": 0.30215874, + "hetGenotypeFreq": 0.6659047, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.3648889, + "refHomGenotypeFreq": 0.03193656, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6388682, + "altHomGenotypeFreq": 0.30193597, + "hetGenotypeFreq": 0.6738645, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.3611318, + "refHomGenotypeFreq": 0.024199553, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56769085, + "altHomGenotypeFreq": 0.20043206, + "hetGenotypeFreq": 0.7345175, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.43230918, + "refHomGenotypeFreq": 0.06505041, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.69138527, + "altHomGenotypeFreq": 0.39624238, + "hetGenotypeFreq": 0.5902858, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.30861476, + "refHomGenotypeFreq": 0.013471878, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.64395034, + "altHomGenotypeFreq": 0.30341262, + "hetGenotypeFreq": 0.6810755, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.35604963, + "refHomGenotypeFreq": 0.015511893, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6787442, + "altHomGenotypeFreq": 0.37455508, + "hetGenotypeFreq": 0.60837823, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.32125583, + "refHomGenotypeFreq": 0.017066715, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.64366925, + "altHomGenotypeFreq": 0.30824086, + "hetGenotypeFreq": 0.67085683, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.35633072, + "refHomGenotypeFreq": 0.02090231, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4398707, + "altHomGenotypeFreq": 0.059770115, + "hetGenotypeFreq": 0.76020116, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5601293, + "refHomGenotypeFreq": 0.18002874, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6363726, + "altHomGenotypeFreq": 0.30277887, + "hetGenotypeFreq": 0.66718745, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.3636274, + "refHomGenotypeFreq": 0.030033674, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.63358164, + "altHomGenotypeFreq": 0.3014069, + "hetGenotypeFreq": 0.66434944, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.3664184, + "refHomGenotypeFreq": 0.034243677, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5876785, + "altHomGenotypeFreq": 0.24018599, + "hetGenotypeFreq": 0.69498503, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.41232148, + "refHomGenotypeFreq": 0.06482896, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.622428, + "altHomGenotypeFreq": 0.2695473, + "hetGenotypeFreq": 0.7057613, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.37757203, + "refHomGenotypeFreq": 0.024691358, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56786174, + "altHomGenotypeFreq": 0.20870678, + "hetGenotypeFreq": 0.7183099, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.4321383, + "refHomGenotypeFreq": 0.072983354, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6670702, + "altHomGenotypeFreq": 0.3559322, + "hetGenotypeFreq": 0.622276, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.3329298, + "refHomGenotypeFreq": 0.021791767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6192053, + "altHomGenotypeFreq": 0.26490065, + "hetGenotypeFreq": 0.7086093, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.3807947, + "refHomGenotypeFreq": 0.026490066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6717025, + "altHomGenotypeFreq": 0.3596746, + "hetGenotypeFreq": 0.6240558, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.3282975, + "refHomGenotypeFreq": 0.016269611, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6418554, + "altHomGenotypeFreq": 0.3059601, + "hetGenotypeFreq": 0.6717907, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.35814455, + "refHomGenotypeFreq": 0.02224919, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44445804, + "altHomGenotypeFreq": 0.060435526, + "hetGenotypeFreq": 0.768045, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.55554193, + "refHomGenotypeFreq": 0.17151946, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5849669, + "altHomGenotypeFreq": 0.23920625, + "hetGenotypeFreq": 0.69152135, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.41503307, + "refHomGenotypeFreq": 0.0692724, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.59102374, + "altHomGenotypeFreq": 0.24139465, + "hetGenotypeFreq": 0.69925815, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.40897626, + "refHomGenotypeFreq": 0.059347183, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41034952, + "altHomGenotypeFreq": 0.06264185, + "hetGenotypeFreq": 0.6954153, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.58965045, + "refHomGenotypeFreq": 0.24194281, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.55904967, + "altHomGenotypeFreq": 0.22266646, + "hetGenotypeFreq": 0.6727664, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.44095033, + "refHomGenotypeFreq": 0.104567125, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.63523257, + "altHomGenotypeFreq": 0.30465117, + "hetGenotypeFreq": 0.6611628, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.36476743, + "refHomGenotypeFreq": 0.034186047, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.62772954, + "altHomGenotypeFreq": 0.2902487, + "hetGenotypeFreq": 0.6749617, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.37227046, + "refHomGenotypeFreq": 0.03478963, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6578366, + "altHomGenotypeFreq": 0.34437087, + "hetGenotypeFreq": 0.62693155, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.34216335, + "refHomGenotypeFreq": 0.028697573, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6311038, + "altHomGenotypeFreq": 0.2857143, + "hetGenotypeFreq": 0.6907791, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.36889616, + "refHomGenotypeFreq": 0.023506604, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56432205, + "altHomGenotypeFreq": 0.1922721, + "hetGenotypeFreq": 0.7441, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.43567792, + "refHomGenotypeFreq": 0.06362795, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.69422346, + "altHomGenotypeFreq": 0.4010723, + "hetGenotypeFreq": 0.58630234, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.30577654, + "refHomGenotypeFreq": 0.012625389, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.68536437, + "altHomGenotypeFreq": 0.38554582, + "hetGenotypeFreq": 0.59963715, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.31463563, + "refHomGenotypeFreq": 0.014817054, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6453706, + "altHomGenotypeFreq": 0.31085333, + "hetGenotypeFreq": 0.66903454, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.35462937, + "refHomGenotypeFreq": 0.020112101, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44864398, + "altHomGenotypeFreq": 0.058088094, + "hetGenotypeFreq": 0.7811118, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.551356, + "refHomGenotypeFreq": 0.16080016, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6217228, + "altHomGenotypeFreq": 0.3258427, + "hetGenotypeFreq": 0.5917603, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.37827715, + "refHomGenotypeFreq": 0.08239701, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.635321, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.36467898, + "study": "DISCOVEHR" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22368862, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM4415663", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM4415663", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4M2", + "histologySubtype": "", + "mutationId": "COSM4415663", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + { + "geneName": "OR4M2", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM4415663", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + } + ] + } + }, + "chromosome": "15", + "end": 22368862, + "id": "15:22368862:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22368862, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 365, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560544", + "exonOverlap": [ + { + "number": "3/4", + "percentage": 0.40816328 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 428, + "cdsPosition": 330, + "codon": "tcG/tcA", + "ensemblGeneId": "ENSG00000182974", + "ensemblTranscriptId": "ENST00000332663", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.09225092 + } + ], + "geneName": "OR4M2", + "proteinVariantAnnotation": { + "alternate": "SER", + "position": 110, + "reference": "SER" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -5.010000228881836, + "source": "gerp" + }, + { + "score": 0.8510000109672546, + "source": "phastCons" + }, + { + "score": -0.7279999852180481, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": 0.9799995422363281, + "source": "cadd_raw" + }, + { + "score": 10.579999923706055, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+22138G>A", + "ENST00000558896(ENSG00000259176):n.973-13559G>A", + "ENST00000558312(ENSG00000259176):n.556-13559G>A", + "ENST00000558798(ENSG00000259176):n.555+21119G>A", + "ENST00000560969(ENSG00000259176):n.193-2093G>A", + "ENST00000560544(ENSG00000259176):n.365G>A", + "ENST00000332663(ENSG00000182974):c.330G>A", + "ENSP00000329467:p.Ser110=" + ], + "id": "rs1835182", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.6174639, + "altHomGenotypeFreq": 0.2770099, + "hetGenotypeFreq": 0.680908, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.38253608, + "refHomGenotypeFreq": 0.042082097, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6218284, + "altHomGenotypeFreq": 0.27462685, + "hetGenotypeFreq": 0.694403, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.37817165, + "refHomGenotypeFreq": 0.030970149, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.502079, + "altHomGenotypeFreq": 0.12339489, + "hetGenotypeFreq": 0.7573682, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.497921, + "refHomGenotypeFreq": 0.11923689, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.670449, + "altHomGenotypeFreq": 0.36201888, + "hetGenotypeFreq": 0.61686033, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.32955095, + "refHomGenotypeFreq": 0.021120794, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6259052, + "altHomGenotypeFreq": 0.27229464, + "hetGenotypeFreq": 0.7072212, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.37409475, + "refHomGenotypeFreq": 0.020484172, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.66494656, + "altHomGenotypeFreq": 0.35254362, + "hetGenotypeFreq": 0.6248059, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.33505344, + "refHomGenotypeFreq": 0.022650471, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.63225365, + "altHomGenotypeFreq": 0.28887272, + "hetGenotypeFreq": 0.6867619, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.36774632, + "refHomGenotypeFreq": 0.02436539, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4104521, + "altHomGenotypeFreq": 0.04651839, + "hetGenotypeFreq": 0.7278674, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5895479, + "refHomGenotypeFreq": 0.22561419, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.61946315, + "altHomGenotypeFreq": 0.2782909, + "hetGenotypeFreq": 0.68234456, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.38053682, + "refHomGenotypeFreq": 0.03936457, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6150414, + "altHomGenotypeFreq": 0.2754577, + "hetGenotypeFreq": 0.67916733, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.3849586, + "refHomGenotypeFreq": 0.04537493, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5693982, + "altHomGenotypeFreq": 0.21961124, + "hetGenotypeFreq": 0.69957393, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.43060178, + "refHomGenotypeFreq": 0.08081481, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6076605, + "altHomGenotypeFreq": 0.24430642, + "hetGenotypeFreq": 0.72670805, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.39233956, + "refHomGenotypeFreq": 0.028985508, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.503201, + "altHomGenotypeFreq": 0.117797695, + "hetGenotypeFreq": 0.77080667, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.49679896, + "refHomGenotypeFreq": 0.11139565, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.65254235, + "altHomGenotypeFreq": 0.3244552, + "hetGenotypeFreq": 0.65617436, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.34745762, + "refHomGenotypeFreq": 0.01937046, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.60264903, + "altHomGenotypeFreq": 0.23178808, + "hetGenotypeFreq": 0.74172187, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.397351, + "refHomGenotypeFreq": 0.026490066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.657574, + "altHomGenotypeFreq": 0.33778295, + "hetGenotypeFreq": 0.6395821, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.342426, + "refHomGenotypeFreq": 0.022634938, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.63132334, + "altHomGenotypeFreq": 0.28760287, + "hetGenotypeFreq": 0.687441, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.36867666, + "refHomGenotypeFreq": 0.024956157, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4173238, + "altHomGenotypeFreq": 0.050763924, + "hetGenotypeFreq": 0.7331198, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5826762, + "refHomGenotypeFreq": 0.21611631, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5655185, + "altHomGenotypeFreq": 0.2164278, + "hetGenotypeFreq": 0.6981814, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.4344815, + "refHomGenotypeFreq": 0.08539082, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5741926, + "altHomGenotypeFreq": 0.22354516, + "hetGenotypeFreq": 0.70129484, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.42580742, + "refHomGenotypeFreq": 0.07516, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3933273, + "altHomGenotypeFreq": 0.049024057, + "hetGenotypeFreq": 0.68860644, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.6066727, + "refHomGenotypeFreq": 0.26236948, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5484392, + "altHomGenotypeFreq": 0.20559742, + "hetGenotypeFreq": 0.68568355, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.45156083, + "refHomGenotypeFreq": 0.10871905, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.627907, + "altHomGenotypeFreq": 0.28581396, + "hetGenotypeFreq": 0.68418604, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.37209302, + "refHomGenotypeFreq": 0.03, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6096879, + "altHomGenotypeFreq": 0.2650545, + "hetGenotypeFreq": 0.6892669, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.39031205, + "refHomGenotypeFreq": 0.045678586, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6368653, + "altHomGenotypeFreq": 0.30684328, + "hetGenotypeFreq": 0.66004413, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.36313465, + "refHomGenotypeFreq": 0.03311258, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6209257, + "altHomGenotypeFreq": 0.2693566, + "hetGenotypeFreq": 0.70313823, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.37907428, + "refHomGenotypeFreq": 0.02750515, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49629372, + "altHomGenotypeFreq": 0.11211489, + "hetGenotypeFreq": 0.76835763, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5037063, + "refHomGenotypeFreq": 0.11952745, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.671656, + "altHomGenotypeFreq": 0.3652881, + "hetGenotypeFreq": 0.61273575, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.32834402, + "refHomGenotypeFreq": 0.02197612, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.67125565, + "altHomGenotypeFreq": 0.3633888, + "hetGenotypeFreq": 0.61573374, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.32874432, + "refHomGenotypeFreq": 0.020877458, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6335731, + "altHomGenotypeFreq": 0.2904976, + "hetGenotypeFreq": 0.6861511, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.36642686, + "refHomGenotypeFreq": 0.02335132, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4222479, + "altHomGenotypeFreq": 0.04426482, + "hetGenotypeFreq": 0.7559661, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5777521, + "refHomGenotypeFreq": 0.19976905, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6292135, + "altHomGenotypeFreq": 0.30337077, + "hetGenotypeFreq": 0.6516854, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.37078652, + "refHomGenotypeFreq": 0.04494382, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.625651, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.374349, + "study": "DISCOVEHR" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22368905, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM5428505", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM5428505", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM5428505", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4M2", + "histologySubtype": "", + "mutationId": "COSM5428505", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "urinary tract", + "sampleSource": "", + "siteSubtype": "bladder", + "tumourOrigin": "" + }, + { + "geneName": "OR4M2", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM5428505", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4M2", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM5428505", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + } + ] + } + }, + "chromosome": "15", + "end": 22368905, + "id": "15:22368905:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22368905, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560544", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 771, + "cdsPosition": 673, + "codon": "Ttc/Ctc", + "ensemblGeneId": "ENSG00000182974", + "ensemblTranscriptId": "ENST00000332663", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.09225092 + } + ], + "geneName": "OR4M2", + "proteinVariantAnnotation": { + "alternate": "LEU", + "features": [ + { + "description": "Cytoplasmic", + "end": 237, + "start": 220, + "type": "topological domain" + }, + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 289, + "id": "IPR017452", + "start": 41 + }, + { + "description": "Olfactory receptor 4M2", + "end": 313, + "id": "PRO_0000150562", + "start": 1, + "type": "chain" + } + ], + "functionalDescription": "In dbSNP:rs491208.", + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 225, + "reference": "PHE", + "substitutionScores": [ + { + "description": "tolerated", + "score": 1, + "source": "sift" + }, + { + "description": "benign", + "score": 0, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8NGB6", + "uniprotVariantId": "VAR_047833" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.4869999885559082, + "source": "gerp" + }, + { + "score": 0.06199999898672104, + "source": "phastCons" + }, + { + "score": -0.41100001335144043, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": -2.1399998664855957, + "source": "cadd_raw" + }, + { + "score": 0, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+22481T>C", + "ENST00000558896(ENSG00000259176):n.973-13216T>C", + "ENST00000558312(ENSG00000259176):n.556-13216T>C", + "ENST00000558798(ENSG00000259176):n.555+21462T>C", + "ENST00000560969(ENSG00000259176):n.193-1750T>C", + "ENST00000560544(ENSG00000259176):n.512+196T>C", + "ENST00000332663(ENSG00000182974):c.673T>C", + "ENSP00000329467:p.Phe225Leu" + ], + "id": "rs491208", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.9079921, + "altHomGenotypeFreq": 0.81661844, + "hetGenotypeFreq": 0.18274735, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.092007905, + "refHomGenotypeFreq": 6.3422887E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90767825, + "altHomGenotypeFreq": 0.8160877, + "hetGenotypeFreq": 0.18318099, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.09232175, + "refHomGenotypeFreq": 7.3126145E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.95314854, + "altHomGenotypeFreq": 0.906645, + "hetGenotypeFreq": 0.09300707, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.046851445, + "refHomGenotypeFreq": 3.4790675E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9443319, + "altHomGenotypeFreq": 0.8888425, + "hetGenotypeFreq": 0.11097866, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.055668138, + "refHomGenotypeFreq": 1.7880558E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9152112, + "altHomGenotypeFreq": 0.8304224, + "hetGenotypeFreq": 0.16957758, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.08478879, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.92429817, + "altHomGenotypeFreq": 0.8487757, + "hetGenotypeFreq": 0.15104493, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.075701855, + "refHomGenotypeFreq": 1.7938828E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9182551, + "altHomGenotypeFreq": 0.83659977, + "hetGenotypeFreq": 0.16331065, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.081744894, + "refHomGenotypeFreq": 8.957363E-5, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7741447, + "altHomGenotypeFreq": 0.5525, + "hetGenotypeFreq": 0.4432895, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.22585526, + "refHomGenotypeFreq": 0.004210526, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9063423, + "altHomGenotypeFreq": 0.8133822, + "hetGenotypeFreq": 0.18592018, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.093657695, + "refHomGenotypeFreq": 6.9760886E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90999085, + "altHomGenotypeFreq": 0.8205391, + "hetGenotypeFreq": 0.17890346, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.09000917, + "refHomGenotypeFreq": 5.5744365E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8806579, + "altHomGenotypeFreq": 0.76196337, + "hetGenotypeFreq": 0.2373891, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.119342096, + "refHomGenotypeFreq": 6.475426E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9038855, + "altHomGenotypeFreq": 0.80777097, + "hetGenotypeFreq": 0.19222903, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.096114516, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96645963, + "altHomGenotypeFreq": 0.93291926, + "hetGenotypeFreq": 0.06708074, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.03354037, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.93317425, + "altHomGenotypeFreq": 0.86634845, + "hetGenotypeFreq": 0.13365155, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.06682578, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8874172, + "altHomGenotypeFreq": 0.77483445, + "hetGenotypeFreq": 0.22516556, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.11258278, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9289398, + "altHomGenotypeFreq": 0.85787964, + "hetGenotypeFreq": 0.14212035, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.07106017, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9174, + "altHomGenotypeFreq": 0.8348, + "hetGenotypeFreq": 0.1652, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.0826, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77376556, + "altHomGenotypeFreq": 0.5498385, + "hetGenotypeFreq": 0.4478542, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.22623442, + "refHomGenotypeFreq": 0.0023073372, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.87914664, + "altHomGenotypeFreq": 0.7589966, + "hetGenotypeFreq": 0.24030009, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.12085336, + "refHomGenotypeFreq": 7.033173E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8825231, + "altHomGenotypeFreq": 0.765625, + "hetGenotypeFreq": 0.2337963, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.11747685, + "refHomGenotypeFreq": 5.787037E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9298597, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.07014028, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9049863, + "altHomGenotypeFreq": 0.8107636, + "hetGenotypeFreq": 0.18844543, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.09501368, + "refHomGenotypeFreq": 7.909567E-4, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9116998, + "altHomGenotypeFreq": 0.82339954, + "hetGenotypeFreq": 0.17660044, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.08830022, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8548934, + "altHomGenotypeFreq": 0.71208817, + "hetGenotypeFreq": 0.28561047, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.14510658, + "refHomGenotypeFreq": 0.0023013565, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.95353675, + "altHomGenotypeFreq": 0.9070735, + "hetGenotypeFreq": 0.09292649, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.046463244, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9467809, + "altHomGenotypeFreq": 0.8937349, + "hetGenotypeFreq": 0.10609207, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.053219106, + "refHomGenotypeFreq": 1.7307026E-4, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9316601, + "altHomGenotypeFreq": 0.86332023, + "hetGenotypeFreq": 0.13667977, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.068339884, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9220014, + "altHomGenotypeFreq": 0.84415275, + "hetGenotypeFreq": 0.15569742, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.07799856, + "refHomGenotypeFreq": 1.4985315E-4, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7709615, + "altHomGenotypeFreq": 0.5463461, + "hetGenotypeFreq": 0.44923076, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.22903846, + "refHomGenotypeFreq": 0.0044230768, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3445693, + "altHomGenotypeFreq": 0.25842696, + "hetGenotypeFreq": 0.17228465, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.65543073, + "refHomGenotypeFreq": 0.5692884, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.916113, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.08388698, + "study": "DISCOVEHR" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22369248, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Variant of unknown origin" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25275298" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM4591915", + "somaticInformation": { + "histologySubtype": "squamous cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4M2", + "histologySubtype": "squamous cell carcinoma", + "mutationId": "COSM4591915", + "mutationSomaticStatus": "Variant of unknown origin", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 22369248, + "id": "15:22369248:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22369248, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560544", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 804, + "cdsPosition": 706, + "codon": "Aac/Gac", + "ensemblGeneId": "ENSG00000182974", + "ensemblTranscriptId": "ENST00000332663", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.09225092 + } + ], + "geneName": "OR4M2", + "proteinVariantAnnotation": { + "alternate": "ASP", + "features": [ + { + "description": "Cytoplasmic", + "end": 237, + "start": 220, + "type": "topological domain" + }, + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 289, + "id": "IPR017452", + "start": 41 + }, + { + "description": "Olfactory receptor 4M2", + "end": 313, + "id": "PRO_0000150562", + "start": 1, + "type": "chain" + } + ], + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 236, + "reference": "ASN", + "substitutionScores": [ + { + "description": "deleterious", + "score": 0.01, + "source": "sift" + }, + { + "description": "benign", + "score": 0.111, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8NGB6" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.3300000429153442, + "source": "gerp" + }, + { + "score": 0.8980000019073486, + "source": "phastCons" + }, + { + "score": 0.36800000071525574, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 2.640000343322754, + "source": "cadd_raw" + }, + { + "score": 20.5, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+22514A>G", + "ENST00000558896(ENSG00000259176):n.973-13183A>G", + "ENST00000558312(ENSG00000259176):n.556-13183A>G", + "ENST00000558798(ENSG00000259176):n.555+21495A>G", + "ENST00000560969(ENSG00000259176):n.193-1717A>G", + "ENST00000560544(ENSG00000259176):n.512+229A>G", + "ENST00000332663(ENSG00000182974):c.706A>G", + "ENSP00000329467:p.Asn236Asp" + ], + "id": "rs140783867", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.008259092, + "altHomGenotypeFreq": 8.226188E-6, + "hetGenotypeFreq": 0.016501732, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9917409, + "refHomGenotypeFreq": 0.98349005, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.010166358, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.020332716, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.98983365, + "refHomGenotypeFreq": 0.9796673, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0046700994, + "altHomGenotypeFreq": 5.987307E-5, + "hetGenotypeFreq": 0.009220453, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.9953299, + "refHomGenotypeFreq": 0.9907197, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0037732, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0075464, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.9962268, + "refHomGenotypeFreq": 0.9924536, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.019225346, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03845069, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.98077464, + "refHomGenotypeFreq": 0.9615493, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.011383872, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.022767743, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.9886161, + "refHomGenotypeFreq": 0.9772323, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 9.174312E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0018348624, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.99908257, + "refHomGenotypeFreq": 0.99816513, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.008464274, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.016928548, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.9915357, + "refHomGenotypeFreq": 0.98307145, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.008010195, + "altHomGenotypeFreq": 1.8204988E-5, + "hetGenotypeFreq": 0.01598398, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.9919898, + "refHomGenotypeFreq": 0.9839978, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.008955419, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.017910838, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9910446, + "refHomGenotypeFreq": 0.98208916, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0051229508, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0102459015, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.99487704, + "refHomGenotypeFreq": 0.9897541, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.009661836, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.019323671, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.99033815, + "refHomGenotypeFreq": 0.98067635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0033112583, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0066225166, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.9966887, + "refHomGenotypeFreq": 0.9933775, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.019503547, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.039007094, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.98049647, + "refHomGenotypeFreq": 0.96099293, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.012665944, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.025331888, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.9873341, + "refHomGenotypeFreq": 0.9746681, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 8.0220035E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0016044007, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9991978, + "refHomGenotypeFreq": 0.9983956, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.008331364, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.016662728, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.99166864, + "refHomGenotypeFreq": 0.9833373, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.009727911, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.019455822, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.9902721, + "refHomGenotypeFreq": 0.98054415, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 6.808897E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0013617794, + "population": "AA", + "refAllele": "A", + "refAlleleFreq": 0.99931914, + "refHomGenotypeFreq": 0.9986382, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0056127943, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.011225589, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9943872, + "refHomGenotypeFreq": 0.9887744, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.008139535, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01627907, + "population": "EA", + "refAllele": "A", + "refAlleleFreq": 0.99186045, + "refHomGenotypeFreq": 0.98372096, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.013138565, + "altHomGenotypeFreq": 1.6505735E-5, + "hetGenotypeFreq": 0.026277132, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.98684496, + "refHomGenotypeFreq": 0.97370636, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.018847007, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.037694015, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.981153, + "refHomGenotypeFreq": 0.96230596, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0047872984, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009574597, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.9952127, + "refHomGenotypeFreq": 0.9904254, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.006090134, + "altHomGenotypeFreq": 1.7400383E-4, + "hetGenotypeFreq": 0.0118322605, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.9939099, + "refHomGenotypeFreq": 0.9879937, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.036071535, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07214307, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.96392846, + "refHomGenotypeFreq": 0.9278569, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.017442733, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.034885466, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.98255724, + "refHomGenotypeFreq": 0.96511453, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0024985585, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0053815106, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.99730927, + "refHomGenotypeFreq": 0.9946185, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0056179776, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.011235955, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.994382, + "refHomGenotypeFreq": 0.98876405, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 5.0E-4, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9995, + "study": "DISCOVEHR" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22369281, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22369281, + "id": "15:22369281:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22369281, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560544", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 813, + "cdsPosition": 715, + "codon": "Atg/Gtg", + "ensemblGeneId": "ENSG00000182974", + "ensemblTranscriptId": "ENST00000332663", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.09225092 + } + ], + "geneName": "OR4M2", + "proteinVariantAnnotation": { + "alternate": "VAL", + "features": [ + { + "description": "Olfactory receptor 4M2", + "end": 313, + "id": "PRO_0000150562", + "start": 1, + "type": "chain" + }, + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 289, + "id": "IPR017452", + "start": 41 + }, + { + "description": "Helical; Name=6", + "end": 260, + "start": 238, + "type": "transmembrane region" + }, + { + "description": "Olfactory receptor", + "end": 246, + "id": "IPR000725", + "start": 237 + } + ], + "functionalDescription": "In dbSNP:rs12593418.", + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 239, + "reference": "MET", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.06, + "source": "sift" + }, + { + "description": "benign", + "score": 0.001, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8NGB6", + "uniprotVariantId": "VAR_047834" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.10000000149011612, + "source": "gerp" + }, + { + "score": 0.9729999899864197, + "source": "phastCons" + }, + { + "score": 0.36800000071525574, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 0.4399995803833008, + "source": "cadd_raw" + }, + { + "score": 7, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+22523A>G", + "ENST00000558896(ENSG00000259176):n.973-13174A>G", + "ENST00000558312(ENSG00000259176):n.556-13174A>G", + "ENST00000558798(ENSG00000259176):n.555+21504A>G", + "ENST00000560969(ENSG00000259176):n.193-1708A>G", + "ENST00000560544(ENSG00000259176):n.512+238A>G", + "ENST00000332663(ENSG00000182974):c.715A>G", + "ENSP00000329467:p.Met239Val" + ], + "id": "rs12593418", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.31261033, + "altHomGenotypeFreq": 0.03162632, + "hetGenotypeFreq": 0.5619768, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6873853, + "refHomGenotypeFreq": 0.40639693, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30530274, + "altHomGenotypeFreq": 0.026117926, + "hetGenotypeFreq": 0.55836964, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.69469726, + "refHomGenotypeFreq": 0.41551247, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3248093, + "altHomGenotypeFreq": 0.03863949, + "hetGenotypeFreq": 0.57233965, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6751907, + "refHomGenotypeFreq": 0.3890209, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39929503, + "altHomGenotypeFreq": 0.086883925, + "hetGenotypeFreq": 0.6248222, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.60070497, + "refHomGenotypeFreq": 0.28829387, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2989226, + "altHomGenotypeFreq": 0.018469658, + "hetGenotypeFreq": 0.5609059, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7010774, + "refHomGenotypeFreq": 0.42062446, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2997166, + "altHomGenotypeFreq": 0.021303626, + "hetGenotypeFreq": 0.55682594, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7002834, + "refHomGenotypeFreq": 0.4218704, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30179763, + "altHomGenotypeFreq": 0.020001544, + "hetGenotypeFreq": 0.5635922, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6982024, + "refHomGenotypeFreq": 0.41640627, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12610745, + "altHomGenotypeFreq": 0.0018576736, + "hetGenotypeFreq": 0.24864247, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.8738211, + "refHomGenotypeFreq": 0.74949986, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31448403, + "altHomGenotypeFreq": 0.030496873, + "hetGenotypeFreq": 0.56799024, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.685508, + "refHomGenotypeFreq": 0.40151286, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3103528, + "altHomGenotypeFreq": 0.032987148, + "hetGenotypeFreq": 0.5547313, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6896472, + "refHomGenotypeFreq": 0.41228154, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2566338, + "altHomGenotypeFreq": 0.017018616, + "hetGenotypeFreq": 0.47923034, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.74336624, + "refHomGenotypeFreq": 0.50375104, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2997763, + "altHomGenotypeFreq": 0.022371365, + "hetGenotypeFreq": 0.55480987, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.7002237, + "refHomGenotypeFreq": 0.42281878, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31666666, + "altHomGenotypeFreq": 0.028, + "hetGenotypeFreq": 0.57733333, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.68333334, + "refHomGenotypeFreq": 0.39466667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36455697, + "altHomGenotypeFreq": 0.055696204, + "hetGenotypeFreq": 0.6177215, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.63544303, + "refHomGenotypeFreq": 0.32658228, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29929578, + "altHomGenotypeFreq": 0.014084507, + "hetGenotypeFreq": 0.57042253, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7007042, + "refHomGenotypeFreq": 0.41549295, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29926786, + "altHomGenotypeFreq": 0.018913971, + "hetGenotypeFreq": 0.56070775, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7007322, + "refHomGenotypeFreq": 0.42037827, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30407253, + "altHomGenotypeFreq": 0.022161461, + "hetGenotypeFreq": 0.56382215, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6959275, + "refHomGenotypeFreq": 0.4140164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13082965, + "altHomGenotypeFreq": 0.001227295, + "hetGenotypeFreq": 0.25920472, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.86917037, + "refHomGenotypeFreq": 0.739568, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2524156, + "altHomGenotypeFreq": 0.015936755, + "hetGenotypeFreq": 0.4729577, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.7475844, + "refHomGenotypeFreq": 0.51110554, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.261864, + "altHomGenotypeFreq": 0.018360043, + "hetGenotypeFreq": 0.48700795, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.738136, + "refHomGenotypeFreq": 0.49463204, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32264528, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6773547, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31832987, + "altHomGenotypeFreq": 0.027411303, + "hetGenotypeFreq": 0.5818371, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6816701, + "refHomGenotypeFreq": 0.39075157, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31526548, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.57743365, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6847345, + "refHomGenotypeFreq": 0.3960177, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3625699, + "altHomGenotypeFreq": 0.03306589, + "hetGenotypeFreq": 0.659008, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.6374301, + "refHomGenotypeFreq": 0.3079261, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32849175, + "altHomGenotypeFreq": 0.03253544, + "hetGenotypeFreq": 0.5919126, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.67150825, + "refHomGenotypeFreq": 0.37555194, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40158784, + "altHomGenotypeFreq": 0.0891642, + "hetGenotypeFreq": 0.6248473, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.59841216, + "refHomGenotypeFreq": 0.28598848, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32232657, + "altHomGenotypeFreq": 0.024840957, + "hetGenotypeFreq": 0.59497124, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.67767346, + "refHomGenotypeFreq": 0.3801878, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3162741, + "altHomGenotypeFreq": 0.018926876, + "hetGenotypeFreq": 0.5946945, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6837259, + "refHomGenotypeFreq": 0.38637865, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1586659, + "altHomGenotypeFreq": 0.0021206862, + "hetGenotypeFreq": 0.3130904, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.8413341, + "refHomGenotypeFreq": 0.6847889, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1329588, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2659176, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8670412, + "refHomGenotypeFreq": 0.7340824, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.320488, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.679512, + "study": "DISCOVEHR" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22369290, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "thyroid", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25275298" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "histologySubtype": "squamous cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "stomach", + "sampleSource": "fresh/frozen - NOS", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "breast", + "sampleSource": "fresh/frozen - NOS", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:26496030" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "histologySubtype": "astrocytoma Grade IV", + "primaryHistology": "glioma", + "primarySite": "central nervous system", + "sampleSource": "cell-line", + "siteSubtype": "brain", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:27545006" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "histologySubtype": "bronchioloalveolar adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "fixed - NOS", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "prostate", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:24599305" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM147863", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "surgery - NOS", + "tumourOrigin": "metastasis" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4M2", + "histologySubtype": "", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "thyroid", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4M2", + "histologySubtype": "squamous cell carcinoma", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + { + "geneName": "OR4M2", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "carcinoma", + "primarySite": "stomach", + "sampleSource": "fresh/frozen - NOS", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4M2", + "histologySubtype": "", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "breast", + "sampleSource": "fresh/frozen - NOS", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4M2", + "histologySubtype": "astrocytoma Grade IV", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "glioma", + "primarySite": "central nervous system", + "sampleSource": "cell-line", + "siteSubtype": "brain", + "tumourOrigin": "" + }, + { + "geneName": "OR4M2", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4M2", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4M2", + "histologySubtype": "bronchioloalveolar adenocarcinoma", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "fixed - NOS", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4M2", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "prostate", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4M2", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM147863", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "surgery - NOS", + "siteSubtype": "", + "tumourOrigin": "metastasis" + } + ] + } + }, + "chromosome": "15", + "end": 22369290, + "id": "15:22369290:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22369290, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560969", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000560544", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 949, + "cdsPosition": 851, + "codon": "cGt/cAt", + "ensemblGeneId": "ENSG00000182974", + "ensemblTranscriptId": "ENST00000332663", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.09225092 + } + ], + "geneName": "OR4M2", + "proteinVariantAnnotation": { + "alternate": "HIS", + "features": [ + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 289, + "id": "IPR017452", + "start": 41 + }, + { + "description": "Olfactory receptor", + "end": 293, + "id": "IPR000725", + "start": 282 + }, + { + "description": "Olfactory receptor 4M2", + "end": 313, + "id": "PRO_0000150562", + "start": 1, + "type": "chain" + }, + { + "description": "Helical; Name=7", + "end": 291, + "start": 272, + "type": "transmembrane region" + }, + { + "description": "G protein-coupled receptor, rhodopsin-like", + "end": 297, + "id": "IPR000276", + "start": 271 + } + ], + "functionalDescription": "In dbSNP:rs4087943.", + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 284, + "reference": "ARG", + "substitutionScores": [ + { + "description": "deleterious", + "score": 0, + "source": "sift" + }, + { + "description": "benign", + "score": 0.003, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8NGB6", + "uniprotVariantId": "VAR_047835" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.2799999713897705, + "source": "gerp" + }, + { + "score": 0.8119999766349792, + "source": "phastCons" + }, + { + "score": -0.5979999899864197, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 4.319999694824219, + "source": "cadd_raw" + }, + { + "score": 24, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.291+22659G>A", + "ENST00000558896(ENSG00000259176):n.973-13038G>A", + "ENST00000558312(ENSG00000259176):n.556-13038G>A", + "ENST00000558798(ENSG00000259176):n.555+21640G>A", + "ENST00000560969(ENSG00000259176):n.193-1572G>A", + "ENST00000560544(ENSG00000259176):n.512+374G>A", + "ENST00000332663(ENSG00000182974):c.851G>A", + "ENSP00000329467:p.Arg284His" + ], + "id": "rs4087943", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.5700269, + "altHomGenotypeFreq": 0.21568201, + "hetGenotypeFreq": 0.70868975, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4299731, + "refHomGenotypeFreq": 0.07562821, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5615587, + "altHomGenotypeFreq": 0.19465362, + "hetGenotypeFreq": 0.73381025, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.43844128, + "refHomGenotypeFreq": 0.071536146, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45169377, + "altHomGenotypeFreq": 0.084016144, + "hetGenotypeFreq": 0.73535526, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5483062, + "refHomGenotypeFreq": 0.1806286, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7031269, + "altHomGenotypeFreq": 0.44144633, + "hetGenotypeFreq": 0.5233611, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.29687312, + "refHomGenotypeFreq": 0.035192564, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52622193, + "altHomGenotypeFreq": 0.15334591, + "hetGenotypeFreq": 0.74575204, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.47377807, + "refHomGenotypeFreq": 0.100902036, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5611372, + "altHomGenotypeFreq": 0.17940933, + "hetGenotypeFreq": 0.7634557, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.43886283, + "refHomGenotypeFreq": 0.05713497, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56623733, + "altHomGenotypeFreq": 0.20137244, + "hetGenotypeFreq": 0.7297297, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.43376267, + "refHomGenotypeFreq": 0.06889782, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45573062, + "altHomGenotypeFreq": 0.055493586, + "hetGenotypeFreq": 0.80047405, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5442694, + "refHomGenotypeFreq": 0.14403234, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5689913, + "altHomGenotypeFreq": 0.2124474, + "hetGenotypeFreq": 0.71308774, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.43100873, + "refHomGenotypeFreq": 0.07446484, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5712821, + "altHomGenotypeFreq": 0.21960233, + "hetGenotypeFreq": 0.7033594, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.42871794, + "refHomGenotypeFreq": 0.07703821, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52963656, + "altHomGenotypeFreq": 0.15220597, + "hetGenotypeFreq": 0.7548612, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4703634, + "refHomGenotypeFreq": 0.09293281, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5539112, + "altHomGenotypeFreq": 0.17547569, + "hetGenotypeFreq": 0.75687104, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.4460888, + "refHomGenotypeFreq": 0.067653276, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45347312, + "altHomGenotypeFreq": 0.07470511, + "hetGenotypeFreq": 0.75753605, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.54652685, + "refHomGenotypeFreq": 0.16775885, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.68915665, + "altHomGenotypeFreq": 0.40481928, + "hetGenotypeFreq": 0.5686747, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.31084338, + "refHomGenotypeFreq": 0.026506023, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5102041, + "altHomGenotypeFreq": 0.14965986, + "hetGenotypeFreq": 0.7210884, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.48979592, + "refHomGenotypeFreq": 0.1292517, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56523025, + "altHomGenotypeFreq": 0.18181819, + "hetGenotypeFreq": 0.76682407, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.43476978, + "refHomGenotypeFreq": 0.051357735, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5607776, + "altHomGenotypeFreq": 0.18758526, + "hetGenotypeFreq": 0.74638474, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.43922237, + "refHomGenotypeFreq": 0.06603001, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45503423, + "altHomGenotypeFreq": 0.062805474, + "hetGenotypeFreq": 0.7844575, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5449658, + "refHomGenotypeFreq": 0.15273705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5279126, + "altHomGenotypeFreq": 0.1520631, + "hetGenotypeFreq": 0.75169903, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.47208738, + "refHomGenotypeFreq": 0.09623786, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53176504, + "altHomGenotypeFreq": 0.15238237, + "hetGenotypeFreq": 0.75876534, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.46823496, + "refHomGenotypeFreq": 0.088852264, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43100318, + "altHomGenotypeFreq": 0.057648662, + "hetGenotypeFreq": 0.74670905, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.56899685, + "refHomGenotypeFreq": 0.1956423, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.51522374, + "altHomGenotypeFreq": 0.1505459, + "hetGenotypeFreq": 0.7293557, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.48477626, + "refHomGenotypeFreq": 0.12009842, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5583721, + "altHomGenotypeFreq": 0.19813953, + "hetGenotypeFreq": 0.7204651, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.44162792, + "refHomGenotypeFreq": 0.08139535, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56159145, + "altHomGenotypeFreq": 0.20031056, + "hetGenotypeFreq": 0.7225618, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.43840855, + "refHomGenotypeFreq": 0.07712766, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5597345, + "altHomGenotypeFreq": 0.20353982, + "hetGenotypeFreq": 0.7123894, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.44026548, + "refHomGenotypeFreq": 0.084070794, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5751638, + "altHomGenotypeFreq": 0.21050715, + "hetGenotypeFreq": 0.72931325, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.42483622, + "refHomGenotypeFreq": 0.06017957, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44904828, + "altHomGenotypeFreq": 0.07729805, + "hetGenotypeFreq": 0.7435005, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5509517, + "refHomGenotypeFreq": 0.17920148, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7089083, + "altHomGenotypeFreq": 0.450131, + "hetGenotypeFreq": 0.5175546, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.2910917, + "refHomGenotypeFreq": 0.032314412, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5612523, + "altHomGenotypeFreq": 0.17937084, + "hetGenotypeFreq": 0.76376283, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.43874773, + "refHomGenotypeFreq": 0.056866303, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5635433, + "altHomGenotypeFreq": 0.19556864, + "hetGenotypeFreq": 0.73594934, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.4364567, + "refHomGenotypeFreq": 0.06848205, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4589028, + "altHomGenotypeFreq": 0.054282963, + "hetGenotypeFreq": 0.8092396, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5410972, + "refHomGenotypeFreq": 0.13647738, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5411985, + "altHomGenotypeFreq": 0.16479401, + "hetGenotypeFreq": 0.752809, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4588015, + "refHomGenotypeFreq": 0.08239701, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56945, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.43054998, + "study": "DISCOVEHR" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22369426, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM1372009", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM1372009", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM1372009", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "thyroid", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM1372009", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4M2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15373" + } + } + ], + "heritableTraits": [], + "id": "COSM1372009", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4M2", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM1372009", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4M2", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM1372009", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4M2", + "histologySubtype": "", + "mutationId": "COSM1372009", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "thyroid", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4M2", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM1372009", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4M2", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM1372009", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 22369426, + "id": "15:22369426:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22369426, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398013", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000539711", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000359727", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560039", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000561072", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000559571", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560205", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560762", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.0700000524520874, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -2.36899995803833, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.43000030517578125, + "source": "cadd_raw" + }, + { + "score": 0.33000001311302185, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337451(ENSG00000140157):c.196+231A>G", + "ENST00000398014(ENSG00000140157):c.196+231A>G", + "ENST00000398013(ENSG00000140157):c.196+231A>G", + "ENST00000539711(ENSG00000140157):c.139+1629A>G", + "ENST00000359727(ENSG00000140157):c.139+1629A>G" + ], + "id": "rs7173238", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.86256737, + "altHomGenotypeFreq": 0.7457627, + "hetGenotypeFreq": 0.23367494, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.13739982, + "refHomGenotypeFreq": 0.020562343, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83575886, + "altHomGenotypeFreq": 0.6985447, + "hetGenotypeFreq": 0.27442828, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.16424116, + "refHomGenotypeFreq": 0.027027028, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94625, + "altHomGenotypeFreq": 0.89625, + "hetGenotypeFreq": 0.1, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.05375, + "refHomGenotypeFreq": 0.00375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91445786, + "altHomGenotypeFreq": 0.8313253, + "hetGenotypeFreq": 0.16626506, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.08554217, + "refHomGenotypeFreq": 0.0024096386, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81, + "altHomGenotypeFreq": 0.66, + "hetGenotypeFreq": 0.3, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.19, + "refHomGenotypeFreq": 0.04, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88122827, + "altHomGenotypeFreq": 0.7815759, + "hetGenotypeFreq": 0.19930474, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.118771724, + "refHomGenotypeFreq": 0.01911935, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82252795, + "altHomGenotypeFreq": 0.67570144, + "hetGenotypeFreq": 0.29378915, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.17740397, + "refHomGenotypeFreq": 0.030509397, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90761375, + "altHomGenotypeFreq": 0.82288766, + "hetGenotypeFreq": 0.16945218, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.09238626, + "refHomGenotypeFreq": 0.0076601673, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86538464, + "altHomGenotypeFreq": 0.7504749, + "hetGenotypeFreq": 0.22993827, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.13455603, + "refHomGenotypeFreq": 0.019586895, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8590762, + "altHomGenotypeFreq": 0.7399235, + "hetGenotypeFreq": 0.23830539, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.1409238, + "refHomGenotypeFreq": 0.021771109, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8356713, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.16432866, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9140625, + "altHomGenotypeFreq": 0.84375, + "hetGenotypeFreq": 0.140625, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.0859375, + "refHomGenotypeFreq": 0.015625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89976037, + "altHomGenotypeFreq": 0.8111022, + "hetGenotypeFreq": 0.1773163, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.10023962, + "refHomGenotypeFreq": 0.011581469, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9161554, + "altHomGenotypeFreq": 0.8425358, + "hetGenotypeFreq": 0.14723927, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.08384458, + "refHomGenotypeFreq": 0.010224949, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84042555, + "altHomGenotypeFreq": 0.71276593, + "hetGenotypeFreq": 0.25531915, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.15957446, + "refHomGenotypeFreq": 0.031914894, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9264706, + "altHomGenotypeFreq": 0.8627451, + "hetGenotypeFreq": 0.12745099, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.073529415, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.92435706, + "altHomGenotypeFreq": 0.85325265, + "hetGenotypeFreq": 0.14220877, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.075642966, + "refHomGenotypeFreq": 0.004538578, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.947619, + "altHomGenotypeFreq": 0.8952381, + "hetGenotypeFreq": 0.104761906, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.052380953, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89903843, + "altHomGenotypeFreq": 0.7980769, + "hetGenotypeFreq": 0.20192307, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.100961536, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9259259, + "altHomGenotypeFreq": 0.8703704, + "hetGenotypeFreq": 0.11111111, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.074074075, + "refHomGenotypeFreq": 0.018518519, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9166667, + "altHomGenotypeFreq": 0.84375, + "hetGenotypeFreq": 0.14583334, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.083333336, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.95132744, + "altHomGenotypeFreq": 0.9026549, + "hetGenotypeFreq": 0.09734513, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.048672568, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9558824, + "altHomGenotypeFreq": 0.9117647, + "hetGenotypeFreq": 0.0882353, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.04411765, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84615386, + "altHomGenotypeFreq": 0.71428573, + "hetGenotypeFreq": 0.26373628, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.15384616, + "refHomGenotypeFreq": 0.021978023, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9086022, + "altHomGenotypeFreq": 0.8172043, + "hetGenotypeFreq": 0.1827957, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.09139785, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.93434346, + "altHomGenotypeFreq": 0.8787879, + "hetGenotypeFreq": 0.11111111, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.065656565, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7990654, + "altHomGenotypeFreq": 0.635514, + "hetGenotypeFreq": 0.3271028, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.20093457, + "refHomGenotypeFreq": 0.037383176, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90697676, + "altHomGenotypeFreq": 0.81395346, + "hetGenotypeFreq": 0.18604651, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.093023255, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9114583, + "altHomGenotypeFreq": 0.8229167, + "hetGenotypeFreq": 0.17708334, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.088541664, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90909094, + "altHomGenotypeFreq": 0.82828283, + "hetGenotypeFreq": 0.16161616, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.09090909, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9141414, + "altHomGenotypeFreq": 0.82828283, + "hetGenotypeFreq": 0.17171717, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.08585858, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83697814, + "altHomGenotypeFreq": 0.7037773, + "hetGenotypeFreq": 0.2664016, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.16302186, + "refHomGenotypeFreq": 0.029821074, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.93442625, + "altHomGenotypeFreq": 0.86885244, + "hetGenotypeFreq": 0.13114753, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.06557377, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89048994, + "altHomGenotypeFreq": 0.79538906, + "hetGenotypeFreq": 0.19020173, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.10951009, + "refHomGenotypeFreq": 0.014409222, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9235294, + "altHomGenotypeFreq": 0.84705883, + "hetGenotypeFreq": 0.15294118, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.07647059, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8737864, + "altHomGenotypeFreq": 0.776699, + "hetGenotypeFreq": 0.19417477, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.1262136, + "refHomGenotypeFreq": 0.029126214, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90909094, + "altHomGenotypeFreq": 0.8181818, + "hetGenotypeFreq": 0.18181819, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.09090909, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.80841124, + "altHomGenotypeFreq": 0.6635514, + "hetGenotypeFreq": 0.28971964, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.19158879, + "refHomGenotypeFreq": 0.046728972, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8557692, + "altHomGenotypeFreq": 0.72115386, + "hetGenotypeFreq": 0.26923078, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.14423077, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82828283, + "altHomGenotypeFreq": 0.6969697, + "hetGenotypeFreq": 0.26262626, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.17171717, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9705882, + "altHomGenotypeFreq": 0.9411765, + "hetGenotypeFreq": 0.058823533, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.029411765, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9206349, + "altHomGenotypeFreq": 0.84325397, + "hetGenotypeFreq": 0.15476191, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.07936508, + "refHomGenotypeFreq": 0.001984127, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9126214, + "altHomGenotypeFreq": 0.8252427, + "hetGenotypeFreq": 0.17475727, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.08737864, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8201534, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.1798466, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81421375, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.18578623, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8248573, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.1751427, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8152643, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.1847357, + "study": "UK10K" + } + ], + "reference": "T", + "start": 23019569, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23019569, + "id": "15:23019569:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 23019569, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398013", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000539711", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000359727", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560039", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000561072", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000559571", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560205", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560762", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.5199999809265137, + "source": "gerp" + }, + { + "score": 0.050999999046325684, + "source": "phastCons" + }, + { + "score": -0.2290000021457672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.26000022888183594, + "source": "cadd_raw" + }, + { + "score": 5.369999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337451(ENSG00000140157):c.139+85C>T", + "ENST00000398014(ENSG00000140157):c.139+85C>T", + "ENST00000398013(ENSG00000140157):c.139+85C>T", + "ENST00000539711(ENSG00000140157):c.139+85C>T", + "ENST00000359727(ENSG00000140157):c.139+85C>T", + "ENST00000560039(ENSG00000140157):c.139+85C>T" + ], + "id": "rs7170784", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.44391224, + "altHomGenotypeFreq": 0.22719917, + "hetGenotypeFreq": 0.4334261, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5560878, + "refHomGenotypeFreq": 0.33937472, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5554415, + "altHomGenotypeFreq": 0.31622177, + "hetGenotypeFreq": 0.47843942, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.44455853, + "refHomGenotypeFreq": 0.2053388, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30383664, + "altHomGenotypeFreq": 0.08663366, + "hetGenotypeFreq": 0.43440595, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.69616336, + "refHomGenotypeFreq": 0.4789604, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4557416, + "altHomGenotypeFreq": 0.19856459, + "hetGenotypeFreq": 0.51435405, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.54425836, + "refHomGenotypeFreq": 0.28708133, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40397352, + "altHomGenotypeFreq": 0.15231788, + "hetGenotypeFreq": 0.5033113, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5960265, + "refHomGenotypeFreq": 0.34437087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6459289, + "altHomGenotypeFreq": 0.42832568, + "hetGenotypeFreq": 0.4352064, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.3540711, + "refHomGenotypeFreq": 0.13646789, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5496596, + "altHomGenotypeFreq": 0.3034308, + "hetGenotypeFreq": 0.49245763, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.45034042, + "refHomGenotypeFreq": 0.2041116, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1945977, + "altHomGenotypeFreq": 0.03678161, + "hetGenotypeFreq": 0.3156322, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8054023, + "refHomGenotypeFreq": 0.6475862, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43190068, + "altHomGenotypeFreq": 0.2140766, + "hetGenotypeFreq": 0.4356482, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.5680993, + "refHomGenotypeFreq": 0.35027522, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45875543, + "altHomGenotypeFreq": 0.24341534, + "hetGenotypeFreq": 0.4306802, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.54124457, + "refHomGenotypeFreq": 0.3259045, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.64128256, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.35871744, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.515625, + "altHomGenotypeFreq": 0.3125, + "hetGenotypeFreq": 0.40625, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.484375, + "refHomGenotypeFreq": 0.28125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37959266, + "altHomGenotypeFreq": 0.17412141, + "hetGenotypeFreq": 0.4109425, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.62040734, + "refHomGenotypeFreq": 0.4149361, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5419223, + "altHomGenotypeFreq": 0.28425357, + "hetGenotypeFreq": 0.5153374, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.4580777, + "refHomGenotypeFreq": 0.200409, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40957448, + "altHomGenotypeFreq": 0.21276596, + "hetGenotypeFreq": 0.39361703, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.59042555, + "refHomGenotypeFreq": 0.39361703, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50980395, + "altHomGenotypeFreq": 0.27450982, + "hetGenotypeFreq": 0.47058827, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.49019608, + "refHomGenotypeFreq": 0.25490198, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15279879, + "altHomGenotypeFreq": 0.027231468, + "hetGenotypeFreq": 0.25113463, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8472012, + "refHomGenotypeFreq": 0.7216339, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31428573, + "altHomGenotypeFreq": 0.123809524, + "hetGenotypeFreq": 0.3809524, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.6857143, + "refHomGenotypeFreq": 0.4952381, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21153846, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.3653846, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.78846157, + "refHomGenotypeFreq": 0.6057692, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14351852, + "altHomGenotypeFreq": 0.018518519, + "hetGenotypeFreq": 0.25, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.8564815, + "refHomGenotypeFreq": 0.7314815, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.546875, + "altHomGenotypeFreq": 0.3125, + "hetGenotypeFreq": 0.46875, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.453125, + "refHomGenotypeFreq": 0.21875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16371681, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.27433628, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.8362832, + "refHomGenotypeFreq": 0.69911504, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5735294, + "altHomGenotypeFreq": 0.28431374, + "hetGenotypeFreq": 0.57843137, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.42647058, + "refHomGenotypeFreq": 0.13725491, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5494506, + "altHomGenotypeFreq": 0.30769232, + "hetGenotypeFreq": 0.4835165, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.45054945, + "refHomGenotypeFreq": 0.20879121, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2795699, + "altHomGenotypeFreq": 0.086021505, + "hetGenotypeFreq": 0.38709676, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.72043014, + "refHomGenotypeFreq": 0.5268817, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.43434346, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46261683, + "altHomGenotypeFreq": 0.23364486, + "hetGenotypeFreq": 0.45794392, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.5373832, + "refHomGenotypeFreq": 0.3084112, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5116279, + "altHomGenotypeFreq": 0.20930232, + "hetGenotypeFreq": 0.60465115, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.4883721, + "refHomGenotypeFreq": 0.18604651, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17708333, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.29166666, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.8229167, + "refHomGenotypeFreq": 0.6770833, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1010101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2020202, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.8989899, + "refHomGenotypeFreq": 0.7979798, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15656565, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.25252527, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.84343433, + "refHomGenotypeFreq": 0.7171717, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.555666, + "altHomGenotypeFreq": 0.31610337, + "hetGenotypeFreq": 0.47912526, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.444334, + "refHomGenotypeFreq": 0.20477137, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20491803, + "altHomGenotypeFreq": 0.08196721, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.795082, + "refHomGenotypeFreq": 0.6721311, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46974063, + "altHomGenotypeFreq": 0.2334294, + "hetGenotypeFreq": 0.47262248, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5302594, + "refHomGenotypeFreq": 0.2939481, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14117648, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.23529413, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.85882354, + "refHomGenotypeFreq": 0.7411765, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5631068, + "altHomGenotypeFreq": 0.33009708, + "hetGenotypeFreq": 0.4660194, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.4368932, + "refHomGenotypeFreq": 0.2038835, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7070707, + "altHomGenotypeFreq": 0.5050505, + "hetGenotypeFreq": 0.4040404, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.2929293, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.23364486, + "hetGenotypeFreq": 0.53271025, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.23364486, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48557693, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.5096154, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.5144231, + "refHomGenotypeFreq": 0.2596154, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5707071, + "altHomGenotypeFreq": 0.3131313, + "hetGenotypeFreq": 0.5151515, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.42929292, + "refHomGenotypeFreq": 0.17171717, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48235294, + "altHomGenotypeFreq": 0.2, + "hetGenotypeFreq": 0.5647059, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.5176471, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28174603, + "altHomGenotypeFreq": 0.077380955, + "hetGenotypeFreq": 0.40873015, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.71825397, + "refHomGenotypeFreq": 0.5138889, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30582523, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.47572815, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.69417477, + "refHomGenotypeFreq": 0.4563107, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53370786, + "altHomGenotypeFreq": 0.2883895, + "hetGenotypeFreq": 0.4906367, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.46629214, + "refHomGenotypeFreq": 0.22097379, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5711452, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4288548, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.55959713, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.4404029, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.57991695, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.42008302, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56202805, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.43797195, + "study": "UK10K" + } + ], + "reference": "G", + "start": 23021113, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23021113, + "id": "15:23021113:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 23021113, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "cdnaPosition": 712, + "cdsPosition": 99, + "codon": "aaG/aaA", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "exonOverlap": [ + { + "number": "4/8", + "percentage": 0.43103448 + } + ], + "geneName": "NIPA2", + "proteinVariantAnnotation": { + "alternate": "LYS", + "position": 33, + "reference": "LYS" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 609, + "cdsPosition": 99, + "codon": "aaG/aaA", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "exonOverlap": [ + { + "number": "3/7", + "percentage": 0.43103448 + } + ], + "geneName": "NIPA2", + "proteinVariantAnnotation": { + "alternate": "LYS", + "position": 33, + "reference": "LYS" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 427, + "cdsPosition": 99, + "codon": "aaG/aaA", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398013", + "exonOverlap": [ + { + "number": "2/6", + "percentage": 0.43103448 + } + ], + "geneName": "NIPA2", + "proteinVariantAnnotation": { + "alternate": "LYS", + "position": 33, + "reference": "LYS" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 416, + "cdsPosition": 99, + "codon": "aaG/aaA", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000539711", + "exonOverlap": [ + { + "number": "2/5", + "percentage": 0.43103448 + } + ], + "geneName": "NIPA2", + "proteinVariantAnnotation": { + "alternate": "LYS", + "position": 33, + "reference": "LYS" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 604, + "cdsPosition": 99, + "codon": "aaG/aaA", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000359727", + "exonOverlap": [ + { + "number": "3/6", + "percentage": 0.43103448 + } + ], + "geneName": "NIPA2", + "proteinVariantAnnotation": { + "alternate": "LYS", + "position": 33, + "reference": "LYS" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 476, + "cdsPosition": 99, + "codon": "aaG/aaA", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560039", + "exonOverlap": [ + { + "number": "3/4", + "percentage": 0.61728394 + } + ], + "geneName": "NIPA2", + "proteinVariantAnnotation": { + "alternate": "LYS", + "position": 33, + "reference": "LYS" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000561072", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000559571", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560205", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560762", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.3799999952316284, + "source": "gerp" + }, + { + "score": 0.9179999828338623, + "source": "phastCons" + }, + { + "score": -0.3319999873638153, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": 1.8199996948242188, + "source": "cadd_raw" + }, + { + "score": 15.130000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337451(ENSG00000140157):c.99G>A", + "ENSP00000337618:p.Lys33=", + "ENST00000398014(ENSG00000140157):c.99G>A", + "ENSP00000381096:p.Lys33=", + "ENST00000398013(ENSG00000140157):c.99G>A", + "ENSP00000381095:p.Lys33=", + "ENST00000539711(ENSG00000140157):c.99G>A", + "ENSP00000437746:p.Lys33=", + "ENST00000359727(ENSG00000140157):c.99G>A", + "ENSP00000352762:p.Lys33=", + "ENST00000560039(ENSG00000140157):c.99G>A", + "ENSP00000453700:p.Lys33=" + ], + "id": "rs7170838", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.21394105, + "altHomGenotypeFreq": 0.05217057, + "hetGenotypeFreq": 0.32356548, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7860467, + "refHomGenotypeFreq": 0.62426394, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20147058, + "altHomGenotypeFreq": 0.04007353, + "hetGenotypeFreq": 0.3227941, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7985294, + "refHomGenotypeFreq": 0.63713235, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23710677, + "altHomGenotypeFreq": 0.05192375, + "hetGenotypeFreq": 0.37036604, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.7628932, + "refHomGenotypeFreq": 0.5777102, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3815599, + "altHomGenotypeFreq": 0.15164676, + "hetGenotypeFreq": 0.4598263, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6184401, + "refHomGenotypeFreq": 0.38852698, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21575622, + "altHomGenotypeFreq": 0.044843048, + "hetGenotypeFreq": 0.34182635, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.78424376, + "refHomGenotypeFreq": 0.6133306, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16091591, + "altHomGenotypeFreq": 0.026736518, + "hetGenotypeFreq": 0.26835877, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.8390841, + "refHomGenotypeFreq": 0.70490474, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1723933, + "altHomGenotypeFreq": 0.030814089, + "hetGenotypeFreq": 0.28315845, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.8276067, + "refHomGenotypeFreq": 0.68602747, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23341653, + "altHomGenotypeFreq": 0.05582556, + "hetGenotypeFreq": 0.355576, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.76638645, + "refHomGenotypeFreq": 0.58859843, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20685127, + "altHomGenotypeFreq": 0.04807233, + "hetGenotypeFreq": 0.31757283, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.79314125, + "refHomGenotypeFreq": 0.6343548, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22254199, + "altHomGenotypeFreq": 0.05714234, + "hetGenotypeFreq": 0.33083552, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7774399, + "refHomGenotypeFreq": 0.61202216, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20319709, + "altHomGenotypeFreq": 0.04347261, + "hetGenotypeFreq": 0.31951392, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7967704, + "refHomGenotypeFreq": 0.63701344, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15983607, + "altHomGenotypeFreq": 0.018442623, + "hetGenotypeFreq": 0.28278688, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.84016395, + "refHomGenotypeFreq": 0.69877046, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26770186, + "altHomGenotypeFreq": 0.079503104, + "hetGenotypeFreq": 0.37639752, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.73229814, + "refHomGenotypeFreq": 0.5440994, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34178743, + "altHomGenotypeFreq": 0.09903382, + "hetGenotypeFreq": 0.4879227, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.65700483, + "refHomGenotypeFreq": 0.41304347, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24324325, + "altHomGenotypeFreq": 0.06081081, + "hetGenotypeFreq": 0.36486486, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7567568, + "refHomGenotypeFreq": 0.5743243, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16724238, + "altHomGenotypeFreq": 0.031663787, + "hetGenotypeFreq": 0.27115718, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.83275765, + "refHomGenotypeFreq": 0.697179, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18563195, + "altHomGenotypeFreq": 0.035249967, + "hetGenotypeFreq": 0.30076396, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.81436807, + "refHomGenotypeFreq": 0.6639861, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22613007, + "altHomGenotypeFreq": 0.052583028, + "hetGenotypeFreq": 0.3470941, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.77386993, + "refHomGenotypeFreq": 0.6003229, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20503174, + "altHomGenotypeFreq": 0.043263577, + "hetGenotypeFreq": 0.3236539, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7949095, + "refHomGenotypeFreq": 0.6330825, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20092982, + "altHomGenotypeFreq": 0.04373093, + "hetGenotypeFreq": 0.31439778, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7990702, + "refHomGenotypeFreq": 0.6418713, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22083522, + "altHomGenotypeFreq": 0.054471176, + "hetGenotypeFreq": 0.3327281, + "population": "AA", + "refAllele": "C", + "refAlleleFreq": 0.7791648, + "refHomGenotypeFreq": 0.6128007, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1803014, + "altHomGenotypeFreq": 0.037828695, + "hetGenotypeFreq": 0.2849454, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8196986, + "refHomGenotypeFreq": 0.6772259, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15953489, + "altHomGenotypeFreq": 0.029302325, + "hetGenotypeFreq": 0.26046512, + "population": "EA", + "refAllele": "C", + "refAlleleFreq": 0.8404651, + "refHomGenotypeFreq": 0.71023256, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.036072146, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.96392787, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2074176, + "altHomGenotypeFreq": 0.048967075, + "hetGenotypeFreq": 0.31690106, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7925824, + "refHomGenotypeFreq": 0.63413185, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19603524, + "altHomGenotypeFreq": 0.037444934, + "hetGenotypeFreq": 0.3171806, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.80396473, + "refHomGenotypeFreq": 0.6453745, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20095722, + "altHomGenotypeFreq": 0.04289349, + "hetGenotypeFreq": 0.31612748, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.79904276, + "refHomGenotypeFreq": 0.64097905, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23848113, + "altHomGenotypeFreq": 0.055105347, + "hetGenotypeFreq": 0.36675155, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.7615189, + "refHomGenotypeFreq": 0.57814306, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3888985, + "altHomGenotypeFreq": 0.1575307, + "hetGenotypeFreq": 0.4627356, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6111015, + "refHomGenotypeFreq": 0.3797337, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15784699, + "altHomGenotypeFreq": 0.027517388, + "hetGenotypeFreq": 0.26065922, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.842153, + "refHomGenotypeFreq": 0.7118234, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17502475, + "altHomGenotypeFreq": 0.032332562, + "hetGenotypeFreq": 0.28538436, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.82497525, + "refHomGenotypeFreq": 0.6822831, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23027329, + "altHomGenotypeFreq": 0.05408006, + "hetGenotypeFreq": 0.35238644, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7697267, + "refHomGenotypeFreq": 0.5935335, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3359375, + "altHomGenotypeFreq": 0.1875, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.6640625, + "refHomGenotypeFreq": 0.515625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22563897, + "altHomGenotypeFreq": 0.05111821, + "hetGenotypeFreq": 0.34904152, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.774361, + "refHomGenotypeFreq": 0.5998403, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19427402, + "altHomGenotypeFreq": 0.020449897, + "hetGenotypeFreq": 0.34764826, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.805726, + "refHomGenotypeFreq": 0.63190186, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30851063, + "altHomGenotypeFreq": 0.10638298, + "hetGenotypeFreq": 0.40425533, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.69148934, + "refHomGenotypeFreq": 0.4893617, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24019608, + "altHomGenotypeFreq": 0.029411765, + "hetGenotypeFreq": 0.42156863, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.75980395, + "refHomGenotypeFreq": 0.54901963, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22617246, + "altHomGenotypeFreq": 0.036308624, + "hetGenotypeFreq": 0.3797277, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.77382755, + "refHomGenotypeFreq": 0.5839637, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25238097, + "altHomGenotypeFreq": 0.08571429, + "hetGenotypeFreq": 0.33333334, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.74761903, + "refHomGenotypeFreq": 0.5809524, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26442307, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.47115386, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.7355769, + "refHomGenotypeFreq": 0.5, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.046296295, + "hetGenotypeFreq": 0.4074074, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.5462963, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.3125, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.6770833, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21681416, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.38053095, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.78318584, + "refHomGenotypeFreq": 0.59292036, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20588236, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.37254903, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.7941176, + "refHomGenotypeFreq": 0.60784316, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17032968, + "altHomGenotypeFreq": 0.032967035, + "hetGenotypeFreq": 0.2747253, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.8296703, + "refHomGenotypeFreq": 0.6923077, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1827957, + "altHomGenotypeFreq": 0.06451613, + "hetGenotypeFreq": 0.23655914, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.8172043, + "refHomGenotypeFreq": 0.6989247, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.41414142, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.5151515, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19626169, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.26168224, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.8037383, + "refHomGenotypeFreq": 0.6728972, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19767442, + "altHomGenotypeFreq": 0.023255814, + "hetGenotypeFreq": 0.3488372, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.8023256, + "refHomGenotypeFreq": 0.627907, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20833333, + "altHomGenotypeFreq": 0.041666668, + "hetGenotypeFreq": 0.33333334, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.7916667, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22727273, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.3737374, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.77272725, + "refHomGenotypeFreq": 0.5858586, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23232323, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.34343433, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.7676768, + "refHomGenotypeFreq": 0.5959596, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17992048, + "altHomGenotypeFreq": 0.045725647, + "hetGenotypeFreq": 0.26838967, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.8200795, + "refHomGenotypeFreq": 0.6858847, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22950819, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.4262295, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.7704918, + "refHomGenotypeFreq": 0.55737704, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31123918, + "altHomGenotypeFreq": 0.112391934, + "hetGenotypeFreq": 0.39769453, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6887608, + "refHomGenotypeFreq": 0.48991355, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21764706, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.41176474, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.7823529, + "refHomGenotypeFreq": 0.5764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16019417, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.2815534, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.83980584, + "refHomGenotypeFreq": 0.69902915, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15656565, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.21212122, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.84343433, + "refHomGenotypeFreq": 0.7373737, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20560747, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.317757, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.7943925, + "refHomGenotypeFreq": 0.635514, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1826923, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.32692307, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.8173077, + "refHomGenotypeFreq": 0.65384614, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.27272725, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45294118, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.5529412, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.5470588, + "refHomGenotypeFreq": 0.27058825, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24206349, + "altHomGenotypeFreq": 0.06349207, + "hetGenotypeFreq": 0.35714287, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.75793654, + "refHomGenotypeFreq": 0.5793651, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22815534, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.32038835, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.7718447, + "refHomGenotypeFreq": 0.61165047, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13670412, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.2659176, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.86329585, + "refHomGenotypeFreq": 0.7303371, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1774, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8226, + "study": "DISCOVEHR" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16146523, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8385348, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16675994, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.83324003, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15697975, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.84302026, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1661273, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.8338727, + "study": "UK10K" + } + ], + "reference": "C", + "start": 23021238, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "17044" + } + } + ], + "heritableTraits": [], + "id": "COSM1179596", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "17044" + } + } + ], + "heritableTraits": [], + "id": "COSM1179596", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "17044" + } + } + ], + "heritableTraits": [], + "id": "COSM1179596", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "17044" + } + } + ], + "heritableTraits": [], + "id": "COSM1179596", + "somaticInformation": { + "histologySubtype": "neoplasm", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA2_ENST00000337451" + } + } + ], + "heritableTraits": [], + "id": "COSM7218290", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:23265383" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA2" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "17044" + } + } + ], + "heritableTraits": [], + "id": "COSM1179596", + "somaticInformation": { + "primaryHistology": "adenoma", + "primarySite": "prostate", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "NIPA2", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM1179596", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "NIPA2", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM1179596", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + { + "geneName": "NIPA2", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM1179596", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "NIPA2", + "histologySubtype": "neoplasm", + "mutationId": "COSM1179596", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "NIPA2_ENST00000337451", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM7218290", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "NIPA2", + "histologySubtype": "", + "mutationId": "COSM1179596", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "adenoma", + "primarySite": "prostate", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 23021238, + "id": "15:23021238:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 23021238, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000337451", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398014", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000398013", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000539711", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000359727", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560039", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000561072", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000559571", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560205", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000140157", + "ensemblTranscriptId": "ENST00000560762", + "geneName": "NIPA2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 3.7100000381469727, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -1.5269999504089355, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 4.380000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0033578", + "name": "Prostatic Neoplasms", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C2825055", + "name": "Recurrence", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014553", + "name": "Epilepsy, Absence", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337451(ENSG00000140157):c.-93-86G>A", + "ENST00000398014(ENSG00000140157):c.-93-86G>A", + "ENST00000398013(ENSG00000140157):c.-93-86G>A", + "ENST00000539711(ENSG00000140157):c.-93-86G>A", + "ENST00000359727(ENSG00000140157):c.-93-86G>A", + "ENST00000560039(ENSG00000140157):c.-23-156G>A", + "ENST00000561072(ENSG00000140157):n.487-86G>A", + "ENST00000559571(ENSG00000140157):n.636-86G>A", + "ENST00000560205(ENSG00000140157):n.563-86G>A", + "ENST00000560762(ENSG00000140157):n.512-86G>A" + ], + "id": "rs7171241", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.2042899, + "altHomGenotypeFreq": 0.0439389, + "hetGenotypeFreq": 0.320702, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7957101, + "refHomGenotypeFreq": 0.6353591, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16086066, + "altHomGenotypeFreq": 0.018442623, + "hetGenotypeFreq": 0.28483605, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.83913934, + "refHomGenotypeFreq": 0.6967213, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26856434, + "altHomGenotypeFreq": 0.08044554, + "hetGenotypeFreq": 0.37623763, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.73143566, + "refHomGenotypeFreq": 0.54331684, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34772182, + "altHomGenotypeFreq": 0.1031175, + "hetGenotypeFreq": 0.48920864, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6522782, + "refHomGenotypeFreq": 0.40767387, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23841059, + "altHomGenotypeFreq": 0.059602648, + "hetGenotypeFreq": 0.3576159, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7615894, + "refHomGenotypeFreq": 0.58278143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16920821, + "altHomGenotypeFreq": 0.032258064, + "hetGenotypeFreq": 0.2739003, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.8307918, + "refHomGenotypeFreq": 0.69384164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18602784, + "altHomGenotypeFreq": 0.035331905, + "hetGenotypeFreq": 0.30139187, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.8139722, + "refHomGenotypeFreq": 0.66327626, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22744015, + "altHomGenotypeFreq": 0.053176794, + "hetGenotypeFreq": 0.34852672, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7725599, + "refHomGenotypeFreq": 0.5982965, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20604815, + "altHomGenotypeFreq": 0.04380505, + "hetGenotypeFreq": 0.3244862, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.79395187, + "refHomGenotypeFreq": 0.63170874, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20211063, + "altHomGenotypeFreq": 0.044104803, + "hetGenotypeFreq": 0.31601164, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.79788935, + "refHomGenotypeFreq": 0.6398836, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12224449, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8777555, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3359375, + "altHomGenotypeFreq": 0.1875, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.6640625, + "refHomGenotypeFreq": 0.515625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22723642, + "altHomGenotypeFreq": 0.05391374, + "hetGenotypeFreq": 0.34664536, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.77276355, + "refHomGenotypeFreq": 0.5994409, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19529653, + "altHomGenotypeFreq": 0.022494888, + "hetGenotypeFreq": 0.3456033, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.8047035, + "refHomGenotypeFreq": 0.63190186, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30851063, + "altHomGenotypeFreq": 0.10638298, + "hetGenotypeFreq": 0.40425533, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.69148934, + "refHomGenotypeFreq": 0.4893617, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24019608, + "altHomGenotypeFreq": 0.029411765, + "hetGenotypeFreq": 0.42156863, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.75980395, + "refHomGenotypeFreq": 0.54901963, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22995462, + "altHomGenotypeFreq": 0.04387292, + "hetGenotypeFreq": 0.3721634, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7700454, + "refHomGenotypeFreq": 0.5839637, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25238097, + "altHomGenotypeFreq": 0.08571429, + "hetGenotypeFreq": 0.33333334, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.74761903, + "refHomGenotypeFreq": 0.5809524, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26923078, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.48076922, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.7307692, + "refHomGenotypeFreq": 0.4903846, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.046296295, + "hetGenotypeFreq": 0.4074074, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.5462963, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.171875, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.30208334, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.828125, + "refHomGenotypeFreq": 0.6770833, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23451327, + "altHomGenotypeFreq": 0.061946902, + "hetGenotypeFreq": 0.34513277, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.7654867, + "refHomGenotypeFreq": 0.59292036, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20588236, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.37254903, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.7941176, + "refHomGenotypeFreq": 0.60784316, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17032968, + "altHomGenotypeFreq": 0.032967035, + "hetGenotypeFreq": 0.2747253, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.8296703, + "refHomGenotypeFreq": 0.6923077, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1827957, + "altHomGenotypeFreq": 0.06451613, + "hetGenotypeFreq": 0.23655914, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.8172043, + "refHomGenotypeFreq": 0.6989247, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.41414142, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.5151515, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19626169, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.26168224, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.8037383, + "refHomGenotypeFreq": 0.6728972, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19767442, + "altHomGenotypeFreq": 0.023255814, + "hetGenotypeFreq": 0.3488372, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.8023256, + "refHomGenotypeFreq": 0.627907, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20833333, + "altHomGenotypeFreq": 0.041666668, + "hetGenotypeFreq": 0.33333334, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.7916667, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22727273, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.3737374, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.77272725, + "refHomGenotypeFreq": 0.5858586, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23232323, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.34343433, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.7676768, + "refHomGenotypeFreq": 0.5959596, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17992048, + "altHomGenotypeFreq": 0.045725647, + "hetGenotypeFreq": 0.26838967, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.8200795, + "refHomGenotypeFreq": 0.6858847, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22950819, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.4262295, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.7704918, + "refHomGenotypeFreq": 0.55737704, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31268013, + "altHomGenotypeFreq": 0.11527377, + "hetGenotypeFreq": 0.3948127, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6873199, + "refHomGenotypeFreq": 0.48991355, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22352941, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.4, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.7764706, + "refHomGenotypeFreq": 0.5764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16019417, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.2815534, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.83980584, + "refHomGenotypeFreq": 0.69902915, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15656565, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.21212122, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.84343433, + "refHomGenotypeFreq": 0.7373737, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20560747, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.317757, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.7943925, + "refHomGenotypeFreq": 0.635514, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1826923, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.32692307, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.8173077, + "refHomGenotypeFreq": 0.65384614, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.27272725, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45882353, + "altHomGenotypeFreq": 0.1882353, + "hetGenotypeFreq": 0.5411765, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.5411765, + "refHomGenotypeFreq": 0.27058825, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24305555, + "altHomGenotypeFreq": 0.06349207, + "hetGenotypeFreq": 0.35912699, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.7569444, + "refHomGenotypeFreq": 0.57738096, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22815534, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.32038835, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.7718447, + "refHomGenotypeFreq": 0.61165047, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16172971, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8382703, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16703974, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.83296025, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15723923, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.8427608, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16639698, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.833603, + "study": "UK10K" + } + ], + "reference": "C", + "start": 23021515, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23021515, + "id": "15:23021515:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 23021515, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000337435", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000559448", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000538684", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000561183", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000557930", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560069", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.6370000243186951, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -2.069000005722046, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.39999961853027344, + "source": "cadd_raw" + }, + { + "score": 0.3799999952316284, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337435(ENSG00000170113):c.479-1287T>G", + "ENST00000437912(ENSG00000170113):c.254-1287T>G", + "ENST00000559448(ENSG00000170113):c.*180-1287T>G", + "ENST00000538684(ENSG00000170113):c.-32-1287T>G", + "ENST00000561183(ENSG00000170113):c.254-1287T>G", + "ENST00000557930(ENSG00000170113):c.*217-1287T>G", + "ENST00000560069(ENSG00000170113):c.*346-1287T>G" + ], + "id": "rs11630188", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.6306011, + "altHomGenotypeFreq": 0.41722327, + "hetGenotypeFreq": 0.42675573, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.36939886, + "refHomGenotypeFreq": 0.15602101, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6950719, + "altHomGenotypeFreq": 0.4989733, + "hetGenotypeFreq": 0.39219713, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.30492812, + "refHomGenotypeFreq": 0.108829565, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8075965, + "altHomGenotypeFreq": 0.65753424, + "hetGenotypeFreq": 0.30012453, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.19240348, + "refHomGenotypeFreq": 0.04234122, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8385168, + "altHomGenotypeFreq": 0.70574164, + "hetGenotypeFreq": 0.26555023, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.16148326, + "refHomGenotypeFreq": 0.028708134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81666666, + "altHomGenotypeFreq": 0.66, + "hetGenotypeFreq": 0.31333333, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.18333334, + "refHomGenotypeFreq": 0.026666667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6586483, + "altHomGenotypeFreq": 0.4318442, + "hetGenotypeFreq": 0.45360824, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.34135166, + "refHomGenotypeFreq": 0.114547536, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7013109, + "altHomGenotypeFreq": 0.49197432, + "hetGenotypeFreq": 0.4186731, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.29868913, + "refHomGenotypeFreq": 0.08935259, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43112186, + "altHomGenotypeFreq": 0.19281271, + "hetGenotypeFreq": 0.4766183, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5688781, + "refHomGenotypeFreq": 0.330569, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.63329816, + "altHomGenotypeFreq": 0.4208304, + "hetGenotypeFreq": 0.4249355, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.36670184, + "refHomGenotypeFreq": 0.15423411, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6272661, + "altHomGenotypeFreq": 0.41276288, + "hetGenotypeFreq": 0.42900652, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.37273386, + "refHomGenotypeFreq": 0.1582306, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73547095, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.26452905, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8515625, + "altHomGenotypeFreq": 0.703125, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.1484375, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.683107, + "altHomGenotypeFreq": 0.49760383, + "hetGenotypeFreq": 0.37100637, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.31689298, + "refHomGenotypeFreq": 0.13138978, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8619632, + "altHomGenotypeFreq": 0.7382413, + "hetGenotypeFreq": 0.24744377, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.1380368, + "refHomGenotypeFreq": 0.014314928, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7819149, + "altHomGenotypeFreq": 0.5744681, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.21808511, + "refHomGenotypeFreq": 0.010638298, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8627451, + "altHomGenotypeFreq": 0.7254902, + "hetGenotypeFreq": 0.27450982, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.13725491, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38350984, + "altHomGenotypeFreq": 0.14372164, + "hetGenotypeFreq": 0.4795764, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6164902, + "refHomGenotypeFreq": 0.37670198, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85714287, + "altHomGenotypeFreq": 0.74285716, + "hetGenotypeFreq": 0.22857144, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.14285715, + "refHomGenotypeFreq": 0.028571429, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7307692, + "altHomGenotypeFreq": 0.52884614, + "hetGenotypeFreq": 0.40384614, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.26923078, + "refHomGenotypeFreq": 0.067307696, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3935185, + "altHomGenotypeFreq": 0.1388889, + "hetGenotypeFreq": 0.5092592, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.6064815, + "refHomGenotypeFreq": 0.35185185, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8125, + "altHomGenotypeFreq": 0.625, + "hetGenotypeFreq": 0.375, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.1875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3761062, + "altHomGenotypeFreq": 0.123893805, + "hetGenotypeFreq": 0.50442475, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.6238938, + "refHomGenotypeFreq": 0.37168142, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85294116, + "altHomGenotypeFreq": 0.74509805, + "hetGenotypeFreq": 0.21568629, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.14705883, + "refHomGenotypeFreq": 0.039215688, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75274724, + "altHomGenotypeFreq": 0.5604396, + "hetGenotypeFreq": 0.3846154, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.24725275, + "refHomGenotypeFreq": 0.054945055, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7580645, + "altHomGenotypeFreq": 0.5913978, + "hetGenotypeFreq": 0.33333334, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.24193548, + "refHomGenotypeFreq": 0.07526882, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8080808, + "altHomGenotypeFreq": 0.64646465, + "hetGenotypeFreq": 0.32323232, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.1919192, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77102804, + "altHomGenotypeFreq": 0.58878505, + "hetGenotypeFreq": 0.36448598, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.22897196, + "refHomGenotypeFreq": 0.046728972, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88372093, + "altHomGenotypeFreq": 0.7906977, + "hetGenotypeFreq": 0.18604651, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.11627907, + "refHomGenotypeFreq": 0.023255814, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43229166, + "altHomGenotypeFreq": 0.17708333, + "hetGenotypeFreq": 0.5104167, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.5677083, + "refHomGenotypeFreq": 0.3125, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.41414142, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.4949495, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4040404, + "altHomGenotypeFreq": 0.2020202, + "hetGenotypeFreq": 0.4040404, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.5959596, + "refHomGenotypeFreq": 0.3939394, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7186879, + "altHomGenotypeFreq": 0.5089463, + "hetGenotypeFreq": 0.41948313, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.28131214, + "refHomGenotypeFreq": 0.071570575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4262295, + "altHomGenotypeFreq": 0.13114753, + "hetGenotypeFreq": 0.59016395, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.57377046, + "refHomGenotypeFreq": 0.27868852, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.80115277, + "altHomGenotypeFreq": 0.6340058, + "hetGenotypeFreq": 0.33429396, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.19884726, + "refHomGenotypeFreq": 0.031700287, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37058824, + "altHomGenotypeFreq": 0.14117648, + "hetGenotypeFreq": 0.45882356, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.62941176, + "refHomGenotypeFreq": 0.4, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89805824, + "altHomGenotypeFreq": 0.80582523, + "hetGenotypeFreq": 0.18446602, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.10194175, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64646465, + "altHomGenotypeFreq": 0.4040404, + "hetGenotypeFreq": 0.4848485, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.35353535, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6682243, + "altHomGenotypeFreq": 0.42056075, + "hetGenotypeFreq": 0.49532712, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.3317757, + "refHomGenotypeFreq": 0.08411215, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67788464, + "altHomGenotypeFreq": 0.45192307, + "hetGenotypeFreq": 0.45192307, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.3221154, + "refHomGenotypeFreq": 0.09615385, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75757575, + "altHomGenotypeFreq": 0.57575756, + "hetGenotypeFreq": 0.36363637, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.24242425, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9352941, + "altHomGenotypeFreq": 0.87058824, + "hetGenotypeFreq": 0.12941177, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.064705886, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78571427, + "altHomGenotypeFreq": 0.6230159, + "hetGenotypeFreq": 0.32539684, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.21428572, + "refHomGenotypeFreq": 0.051587302, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7718447, + "altHomGenotypeFreq": 0.60194176, + "hetGenotypeFreq": 0.33980584, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.22815534, + "refHomGenotypeFreq": 0.058252428, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7402804, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.25971964, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.74090654, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.25909346, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7410483, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.25895172, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73948216, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.2605178, + "study": "UK10K" + } + ], + "reference": "A", + "start": 23050627, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23050627, + "id": "15:23050627:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 23050627, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "cdnaPosition": 466, + "cdsPosition": 441, + "codon": "acA/acG", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000337435", + "exonOverlap": [ + { + "number": "4/5", + "percentage": 0.621118 + } + ], + "geneName": "NIPA1", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 147, + "reference": "THR" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 1514, + "cdsPosition": 216, + "codon": "acA/acG", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "exonOverlap": [ + { + "number": "4/5", + "percentage": 0.621118 + } + ], + "geneName": "NIPA1", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 72, + "reference": "THR" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "cdnaPosition": 413, + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000559448", + "exonOverlap": [ + { + "number": "5/6", + "percentage": 0.621118 + } + ], + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + }, + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 413, + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000538684", + "exonOverlap": [ + { + "number": "5/6", + "percentage": 0.621118 + } + ], + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001623", + "name": "5_prime_UTR_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "protein_coding", + "cdnaPosition": 613, + "cdsPosition": 216, + "codon": "acA/acG", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000561183", + "exonOverlap": [ + { + "number": "4/5", + "percentage": 0.621118 + } + ], + "geneName": "NIPA1", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 72, + "reference": "THR" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "cdnaPosition": 356, + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000557930", + "exonOverlap": [ + { + "number": "5/6", + "percentage": 0.621118 + } + ], + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + }, + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "cdnaPosition": 494, + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560069", + "exonOverlap": [ + { + "number": "6/7", + "percentage": 0.621118 + } + ], + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + }, + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -7.420000076293945, + "source": "gerp" + }, + { + "score": 0.4790000021457672, + "source": "phastCons" + }, + { + "score": -0.22699999809265137, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": -0.4499998092651367, + "source": "cadd_raw" + }, + { + "score": 0.28999999165534973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337435(ENSG00000170113):c.441A>G", + "ENSP00000337452:p.Thr147=", + "ENST00000437912(ENSG00000170113):c.216A>G", + "ENSP00000393962:p.Thr72=", + "ENST00000559448(ENSG00000170113):c.*142A>G", + "ENST00000538684(ENSG00000170113):c.-70A>G", + "ENST00000561183(ENSG00000170113):c.216A>G", + "ENSP00000453722:p.Thr72=", + "ENST00000557930(ENSG00000170113):c.*179A>G", + "ENST00000560069(ENSG00000170113):c.*308A>G" + ], + "id": "rs11263683", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.7448666, + "altHomGenotypeFreq": 0.5652799, + "hetGenotypeFreq": 0.35917348, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.25513336, + "refHomGenotypeFreq": 0.07554664, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7469001, + "altHomGenotypeFreq": 0.56017506, + "hetGenotypeFreq": 0.37345004, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.25309992, + "refHomGenotypeFreq": 0.066374905, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81852967, + "altHomGenotypeFreq": 0.6703386, + "hetGenotypeFreq": 0.2963822, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.18147032, + "refHomGenotypeFreq": 0.03327922, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8662081, + "altHomGenotypeFreq": 0.7540349, + "hetGenotypeFreq": 0.22434637, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.13379191, + "refHomGenotypeFreq": 0.021618724, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.79433274, + "altHomGenotypeFreq": 0.62827545, + "hetGenotypeFreq": 0.33211458, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.20566727, + "refHomGenotypeFreq": 0.039609995, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64045954, + "altHomGenotypeFreq": 0.4098905, + "hetGenotypeFreq": 0.46113804, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.3595405, + "refHomGenotypeFreq": 0.12897146, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72115093, + "altHomGenotypeFreq": 0.5205457, + "hetGenotypeFreq": 0.40121037, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.2788491, + "refHomGenotypeFreq": 0.0782439, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48699686, + "altHomGenotypeFreq": 0.24333508, + "hetGenotypeFreq": 0.48732358, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.5130031, + "refHomGenotypeFreq": 0.26934135, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7484988, + "altHomGenotypeFreq": 0.56954557, + "hetGenotypeFreq": 0.35790643, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.25150123, + "refHomGenotypeFreq": 0.072548, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7404663, + "altHomGenotypeFreq": 0.56011206, + "hetGenotypeFreq": 0.36070845, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.2595337, + "refHomGenotypeFreq": 0.079179466, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6457672, + "altHomGenotypeFreq": 0.43118078, + "hetGenotypeFreq": 0.42917287, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.3542328, + "refHomGenotypeFreq": 0.13964635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6909651, + "altHomGenotypeFreq": 0.49281314, + "hetGenotypeFreq": 0.3963039, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.3090349, + "refHomGenotypeFreq": 0.11088296, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8312655, + "altHomGenotypeFreq": 0.6898263, + "hetGenotypeFreq": 0.2828784, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.16873449, + "refHomGenotypeFreq": 0.027295286, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8448687, + "altHomGenotypeFreq": 0.7183771, + "hetGenotypeFreq": 0.2529833, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.15513127, + "refHomGenotypeFreq": 0.028639618, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8178808, + "altHomGenotypeFreq": 0.66225165, + "hetGenotypeFreq": 0.3112583, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.1821192, + "refHomGenotypeFreq": 0.026490066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6502576, + "altHomGenotypeFreq": 0.42186606, + "hetGenotypeFreq": 0.45678306, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.3497424, + "refHomGenotypeFreq": 0.121350884, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.69929135, + "altHomGenotypeFreq": 0.4888354, + "hetGenotypeFreq": 0.42091188, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.30070865, + "refHomGenotypeFreq": 0.090252705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48735633, + "altHomGenotypeFreq": 0.24528736, + "hetGenotypeFreq": 0.48413792, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.5126437, + "refHomGenotypeFreq": 0.27057472, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6493088, + "altHomGenotypeFreq": 0.43521556, + "hetGenotypeFreq": 0.4281865, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.3506912, + "refHomGenotypeFreq": 0.13659793, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6413878, + "altHomGenotypeFreq": 0.4261915, + "hetGenotypeFreq": 0.4303926, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.3586122, + "refHomGenotypeFreq": 0.14341591, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49455288, + "altHomGenotypeFreq": 0.2523831, + "hetGenotypeFreq": 0.48433954, + "population": "AA", + "refAllele": "T", + "refAlleleFreq": 0.5054471, + "refHomGenotypeFreq": 0.26327735, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65369827, + "altHomGenotypeFreq": 0.44379517, + "hetGenotypeFreq": 0.41980624, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.3463017, + "refHomGenotypeFreq": 0.13639858, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73523253, + "altHomGenotypeFreq": 0.54186046, + "hetGenotypeFreq": 0.38674417, + "population": "EA", + "refAllele": "T", + "refAlleleFreq": 0.26476744, + "refHomGenotypeFreq": 0.07139535, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73647296, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.26352707, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73588914, + "altHomGenotypeFreq": 0.5529177, + "hetGenotypeFreq": 0.36594287, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.26411083, + "refHomGenotypeFreq": 0.08113941, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73348016, + "altHomGenotypeFreq": 0.52863437, + "hetGenotypeFreq": 0.40969163, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.2665198, + "refHomGenotypeFreq": 0.06167401, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.844719, + "altHomGenotypeFreq": 0.7157219, + "hetGenotypeFreq": 0.25799417, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.155281, + "refHomGenotypeFreq": 0.026283914, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81406105, + "altHomGenotypeFreq": 0.6630435, + "hetGenotypeFreq": 0.30203515, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.18593894, + "refHomGenotypeFreq": 0.03492137, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8773536, + "altHomGenotypeFreq": 0.7738815, + "hetGenotypeFreq": 0.2069442, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.1226464, + "refHomGenotypeFreq": 0.019174296, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6328999, + "altHomGenotypeFreq": 0.40641063, + "hetGenotypeFreq": 0.45297852, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.3671001, + "refHomGenotypeFreq": 0.14061083, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7220524, + "altHomGenotypeFreq": 0.521399, + "hetGenotypeFreq": 0.40130672, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.2779476, + "refHomGenotypeFreq": 0.07729425, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49519417, + "altHomGenotypeFreq": 0.2545175, + "hetGenotypeFreq": 0.4813533, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.50480586, + "refHomGenotypeFreq": 0.2641292, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8515625, + "altHomGenotypeFreq": 0.703125, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.1484375, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7040735, + "altHomGenotypeFreq": 0.51877, + "hetGenotypeFreq": 0.37060702, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.2959265, + "refHomGenotypeFreq": 0.110623, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8619632, + "altHomGenotypeFreq": 0.7382413, + "hetGenotypeFreq": 0.24744377, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.1380368, + "refHomGenotypeFreq": 0.014314928, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.79787236, + "altHomGenotypeFreq": 0.60638297, + "hetGenotypeFreq": 0.38297874, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.20212767, + "refHomGenotypeFreq": 0.010638298, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8627451, + "altHomGenotypeFreq": 0.7254902, + "hetGenotypeFreq": 0.27450982, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.13725491, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44780636, + "altHomGenotypeFreq": 0.19667171, + "hetGenotypeFreq": 0.50226927, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.55219364, + "refHomGenotypeFreq": 0.301059, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8761905, + "altHomGenotypeFreq": 0.7714286, + "hetGenotypeFreq": 0.20952381, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.123809524, + "refHomGenotypeFreq": 0.01904762, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.74038464, + "altHomGenotypeFreq": 0.5480769, + "hetGenotypeFreq": 0.38461536, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.2596154, + "refHomGenotypeFreq": 0.067307696, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4675926, + "altHomGenotypeFreq": 0.21296297, + "hetGenotypeFreq": 0.5092593, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.5324074, + "refHomGenotypeFreq": 0.2777778, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8125, + "altHomGenotypeFreq": 0.625, + "hetGenotypeFreq": 0.375, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.1875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44690266, + "altHomGenotypeFreq": 0.20353982, + "hetGenotypeFreq": 0.48672566, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.55309737, + "refHomGenotypeFreq": 0.30973452, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85294116, + "altHomGenotypeFreq": 0.74509805, + "hetGenotypeFreq": 0.21568629, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.14705883, + "refHomGenotypeFreq": 0.039215688, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.74725276, + "altHomGenotypeFreq": 0.5604396, + "hetGenotypeFreq": 0.37362638, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.25274727, + "refHomGenotypeFreq": 0.06593407, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77956986, + "altHomGenotypeFreq": 0.6236559, + "hetGenotypeFreq": 0.31182796, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.2204301, + "refHomGenotypeFreq": 0.06451613, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8333333, + "altHomGenotypeFreq": 0.6969697, + "hetGenotypeFreq": 0.27272728, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.16666667, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77102804, + "altHomGenotypeFreq": 0.58878505, + "hetGenotypeFreq": 0.36448598, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.22897196, + "refHomGenotypeFreq": 0.046728972, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88372093, + "altHomGenotypeFreq": 0.7906977, + "hetGenotypeFreq": 0.18604651, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.11627907, + "refHomGenotypeFreq": 0.023255814, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48958334, + "altHomGenotypeFreq": 0.21875, + "hetGenotypeFreq": 0.5416666, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.5104167, + "refHomGenotypeFreq": 0.23958333, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35858586, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.47474748, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.64141417, + "refHomGenotypeFreq": 0.4040404, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46464646, + "altHomGenotypeFreq": 0.23232323, + "hetGenotypeFreq": 0.46464646, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.53535354, + "refHomGenotypeFreq": 0.3030303, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71570575, + "altHomGenotypeFreq": 0.5049702, + "hetGenotypeFreq": 0.42147118, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.28429425, + "refHomGenotypeFreq": 0.07355865, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47540984, + "altHomGenotypeFreq": 0.16393442, + "hetGenotypeFreq": 0.6229508, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.52459013, + "refHomGenotypeFreq": 0.21311475, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8097983, + "altHomGenotypeFreq": 0.64841497, + "hetGenotypeFreq": 0.32276657, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.19020173, + "refHomGenotypeFreq": 0.028818443, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44117647, + "altHomGenotypeFreq": 0.21176471, + "hetGenotypeFreq": 0.45882356, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.5588235, + "refHomGenotypeFreq": 0.32941177, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89805824, + "altHomGenotypeFreq": 0.80582523, + "hetGenotypeFreq": 0.18446602, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.10194175, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64141417, + "altHomGenotypeFreq": 0.3939394, + "hetGenotypeFreq": 0.49494952, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.35858586, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6682243, + "altHomGenotypeFreq": 0.42056075, + "hetGenotypeFreq": 0.49532712, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.3317757, + "refHomGenotypeFreq": 0.08411215, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6923077, + "altHomGenotypeFreq": 0.47115386, + "hetGenotypeFreq": 0.4423077, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.30769232, + "refHomGenotypeFreq": 0.086538464, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75252527, + "altHomGenotypeFreq": 0.56565654, + "hetGenotypeFreq": 0.3737374, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.24747474, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9352941, + "altHomGenotypeFreq": 0.87058824, + "hetGenotypeFreq": 0.12941177, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.064705886, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.80257934, + "altHomGenotypeFreq": 0.6527778, + "hetGenotypeFreq": 0.29960316, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.19742064, + "refHomGenotypeFreq": 0.04761905, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7815534, + "altHomGenotypeFreq": 0.6213592, + "hetGenotypeFreq": 0.32038835, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.2184466, + "refHomGenotypeFreq": 0.058252428, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.79588014, + "altHomGenotypeFreq": 0.64044946, + "hetGenotypeFreq": 0.3108614, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.20411985, + "refHomGenotypeFreq": 0.04868914, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.724883, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.27511698, + "study": "DISCOVEHR" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73591644, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.26408356, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73559034, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.26440963, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7374157, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.26258433, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73435813, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.26564187, + "study": "UK10K" + } + ], + "reference": "T", + "start": 23052632, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "ClinicalSignificance_in_source_file", + "value": "Benign" + }, + { + "name": "ReviewStatus_in_source_file", + "value": "criteria provided, multiple submitters, no conflicts" + } + ], + "alleleOrigin": [ + "germline_variant" + ], + "bibliography": [], + "consistencyStatus": "congruent", + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA1" + } + } + ], + "heritableTraits": [ + { + "inheritanceMode": "unknown", + "trait": "spastic paraplegia 6" + }, + { + "inheritanceMode": "unknown", + "trait": "spastic paraplegia, autosomal dominant" + }, + { + "inheritanceMode": "unknown", + "trait": "not specified" + } + ], + "id": "129804", + "source": { + "name": "clinvar" + }, + "submissions": [], + "url": "https://www.ncbi.nlm.nih.gov/clinvar/variation/129804", + "variantClassification": { + "clinicalSignificance": "benign" + } + }, + { + "additionalProperties": [ + { + "name": "ClinicalSignificance_in_source_file", + "value": "Benign" + }, + { + "name": "ReviewStatus_in_source_file", + "value": "CRITERIA_PROVIDED_SINGLE_SUBMITTER" + }, + { + "name": "modeOfInheritance", + "value": "[{\"modeOfInheritance\":\"autosomal dominant inheritance\",\"trait\":\"not specified\"}]" + } + ], + "alleleOrigin": [ + "germline_variant" + ], + "bibliography": [], + "consistencyStatus": "congruent", + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA1" + } + } + ], + "heritableTraits": [ + { + "inheritanceMode": "monoallelic", + "trait": "not specified" + } + ], + "id": "RCV000117820", + "source": { + "name": "clinvar" + }, + "submissions": [ + { + "date": "20170629", + "submitter": "Genetic Services Laboratory, University of Chicago" + }, + { + "date": "20160121", + "submitter": "GeneDx" + } + ], + "url": "https://www.ncbi.nlm.nih.gov/clinvar/RCV000117820", + "variantClassification": { + "clinicalSignificance": "benign" + } + }, + { + "additionalProperties": [ + { + "name": "ClinicalSignificance_in_source_file", + "value": "Benign" + }, + { + "name": "ReviewStatus_in_source_file", + "value": "CRITERIA_PROVIDED_SINGLE_SUBMITTER" + }, + { + "name": "modeOfInheritance", + "value": "[{\"trait\":\"Spastic paraplegia, autosomal dominant\"}]" + } + ], + "alleleOrigin": [ + "germline_variant" + ], + "bibliography": [], + "consistencyStatus": "congruent", + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA1" + } + } + ], + "heritableTraits": [ + { + "inheritanceMode": "unknown", + "trait": "Spastic paraplegia, autosomal dominant" + } + ], + "id": "RCV000298408", + "source": { + "name": "clinvar" + }, + "submissions": [ + { + "date": "20160614", + "submitter": "Illumina Clinical Services Laboratory,Illumina" + } + ], + "url": "https://www.ncbi.nlm.nih.gov/clinvar/RCV000298408", + "variantClassification": { + "clinicalSignificance": "benign" + } + }, + { + "additionalProperties": [ + { + "name": "ClinicalSignificance_in_source_file", + "value": "Benign" + }, + { + "name": "ReviewStatus_in_source_file", + "value": "NO_ASSERTION_CRITERIA_PROVIDED" + }, + { + "name": "modeOfInheritance", + "value": "[{\"trait\":\"Spastic paraplegia 6\"}]" + } + ], + "alleleOrigin": [ + "germline_variant" + ], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA1" + } + } + ], + "heritableTraits": [ + { + "inheritanceMode": "unknown", + "trait": "Spastic paraplegia 6" + } + ], + "id": "RCV000606392", + "source": { + "name": "clinvar" + }, + "submissions": [ + { + "date": "20180409", + "submitter": "Diagnostic Laboratory, Department of Genetics,University Medical Center Groningen" + } + ], + "url": "https://www.ncbi.nlm.nih.gov/clinvar/RCV000606392", + "variantClassification": { + "clinicalSignificance": "benign" + } + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "17043" + } + } + ], + "heritableTraits": [], + "id": "COSM3999473", + "somaticInformation": { + "histologySubtype": "squamous cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "oesophagus", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "NIPA1" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "17043" + } + } + ], + "heritableTraits": [], + "id": "COSM3999473", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [ + { + "accession": "129804", + "clinicalSignificance": "Benign", + "geneNames": [ + "NIPA1" + ], + "reviewStatus": "criteria provided, multiple submitters, no conflicts", + "traits": [ + "spastic paraplegia 6", + "spastic paraplegia, autosomal dominant", + "not specified" + ] + }, + { + "accession": "RCV000117820", + "clinicalSignificance": "Benign", + "geneNames": [ + "NIPA1" + ], + "reviewStatus": "CRITERIA_PROVIDED_SINGLE_SUBMITTER", + "traits": [ + "not specified" + ] + }, + { + "accession": "RCV000298408", + "clinicalSignificance": "Benign", + "geneNames": [ + "NIPA1" + ], + "reviewStatus": "CRITERIA_PROVIDED_SINGLE_SUBMITTER", + "traits": [ + "Spastic paraplegia, autosomal dominant" + ] + }, + { + "accession": "RCV000606392", + "clinicalSignificance": "Benign", + "geneNames": [ + "NIPA1" + ], + "reviewStatus": "NO_ASSERTION_CRITERIA_PROVIDED", + "traits": [ + "Spastic paraplegia 6" + ] + } + ], + "cosmic": [ + { + "geneName": "NIPA1", + "histologySubtype": "squamous cell carcinoma", + "mutationId": "COSM3999473", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "oesophagus", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "NIPA1", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM3999473", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 23052632, + "id": "15:23052632:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 23052632, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000337435", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000559448", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000538684", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000561183", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000557930", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560069", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560105", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.4800000190734863, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -1.5080000162124634, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.6999998092651367, + "source": "cadd_raw" + }, + { + "score": 0.07000000029802322, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337435(ENSG00000170113):c.317+190C>G", + "ENST00000437912(ENSG00000170113):c.92+190C>G", + "ENST00000559448(ENSG00000170113):c.207+190C>G", + "ENST00000538684(ENSG00000170113):c.-276+190C>G", + "ENST00000561183(ENSG00000170113):c.92+190C>G", + "ENST00000557930(ENSG00000170113):c.161+190C>G", + "ENST00000560069(ENSG00000170113):c.92+190C>G" + ], + "id": "rs7168401", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.93534094, + "altHomGenotypeFreq": 0.8770863, + "hetGenotypeFreq": 0.11650925, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.064659074, + "refHomGenotypeFreq": 0.0064044506, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96421266, + "altHomGenotypeFreq": 0.9284254, + "hetGenotypeFreq": 0.07157464, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.03578732, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9809069, + "altHomGenotypeFreq": 0.96181387, + "hetGenotypeFreq": 0.03818616, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.01909308, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9933775, + "altHomGenotypeFreq": 0.98675495, + "hetGenotypeFreq": 0.013245033, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.0066225166, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94899714, + "altHomGenotypeFreq": 0.90028656, + "hetGenotypeFreq": 0.09742121, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.051002864, + "refHomGenotypeFreq": 0.0022922636, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96513027, + "altHomGenotypeFreq": 0.9318637, + "hetGenotypeFreq": 0.06653307, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.034869738, + "refHomGenotypeFreq": 0.0016032064, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8570773, + "altHomGenotypeFreq": 0.73319566, + "hetGenotypeFreq": 0.24776325, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.14292268, + "refHomGenotypeFreq": 0.019041065, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.93349725, + "altHomGenotypeFreq": 0.8742536, + "hetGenotypeFreq": 0.1184873, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.06650275, + "refHomGenotypeFreq": 0.007259103, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9376175, + "altHomGenotypeFreq": 0.88058406, + "hetGenotypeFreq": 0.114066795, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.062382534, + "refHomGenotypeFreq": 0.0053491397, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96793586, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.03206413, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94628596, + "altHomGenotypeFreq": 0.8973642, + "hetGenotypeFreq": 0.09784345, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.05371406, + "refHomGenotypeFreq": 0.004792332, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9907975, + "altHomGenotypeFreq": 0.9815951, + "hetGenotypeFreq": 0.018404908, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.009202454, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96276593, + "altHomGenotypeFreq": 0.9255319, + "hetGenotypeFreq": 0.07446808, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.03723404, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99019605, + "altHomGenotypeFreq": 0.98039216, + "hetGenotypeFreq": 0.019607844, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.009803922, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8419062, + "altHomGenotypeFreq": 0.7004539, + "hetGenotypeFreq": 0.28290468, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.1580938, + "refHomGenotypeFreq": 0.016641453, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8518519, + "altHomGenotypeFreq": 0.7222222, + "hetGenotypeFreq": 0.25925925, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.14814815, + "refHomGenotypeFreq": 0.018518519, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84513277, + "altHomGenotypeFreq": 0.69911504, + "hetGenotypeFreq": 0.2920354, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.15486726, + "refHomGenotypeFreq": 0.0088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99509805, + "altHomGenotypeFreq": 0.99019605, + "hetGenotypeFreq": 0.009803922, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.004901961, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97252744, + "altHomGenotypeFreq": 0.94505495, + "hetGenotypeFreq": 0.054945055, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.027472528, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.989899, + "altHomGenotypeFreq": 0.97979796, + "hetGenotypeFreq": 0.02020202, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.01010101, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9766355, + "altHomGenotypeFreq": 0.95327103, + "hetGenotypeFreq": 0.04672897, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.023364486, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8541667, + "altHomGenotypeFreq": 0.7291667, + "hetGenotypeFreq": 0.25, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.14583333, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8333333, + "altHomGenotypeFreq": 0.67676765, + "hetGenotypeFreq": 0.3131313, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.16666667, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8181818, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.3030303, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.18181819, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9691849, + "altHomGenotypeFreq": 0.9383698, + "hetGenotypeFreq": 0.06163022, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.03081511, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86885244, + "altHomGenotypeFreq": 0.75409836, + "hetGenotypeFreq": 0.22950819, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.13114753, + "refHomGenotypeFreq": 0.016393442, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9740634, + "altHomGenotypeFreq": 0.9510086, + "hetGenotypeFreq": 0.046109512, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.0259366, + "refHomGenotypeFreq": 0.0028818443, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82941175, + "altHomGenotypeFreq": 0.67058825, + "hetGenotypeFreq": 0.31764707, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.17058824, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9854369, + "altHomGenotypeFreq": 0.9708738, + "hetGenotypeFreq": 0.029126214, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.014563107, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.111111104, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9859813, + "altHomGenotypeFreq": 0.97196263, + "hetGenotypeFreq": 0.028037382, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.014018691, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96153843, + "altHomGenotypeFreq": 0.9326923, + "hetGenotypeFreq": 0.05769231, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.03846154, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96464646, + "altHomGenotypeFreq": 0.9292929, + "hetGenotypeFreq": 0.07070707, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.035353534, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9823529, + "altHomGenotypeFreq": 0.9647059, + "hetGenotypeFreq": 0.03529412, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.01764706, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9980159, + "altHomGenotypeFreq": 0.99603176, + "hetGenotypeFreq": 0.003968254, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.001984127, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96958476, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.030415233, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97006154, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.029938444, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96886355, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.031136481, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9703344, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.029665587, + "study": "UK10K" + } + ], + "reference": "G", + "start": 23060625, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23060625, + "id": "15:23060625:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 23060625, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000337435", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000559448", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000538684", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000561183", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000557930", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560069", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560105", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2799999713897705, + "source": "gerp" + }, + { + "score": 0.027000000700354576, + "source": "phastCons" + }, + { + "score": -0.3319999873638153, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.14999961853027344, + "source": "cadd_raw" + }, + { + "score": 4.210000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337435(ENSG00000170113):c.179-3863C>T", + "ENST00000437912(ENSG00000170113):c.-47-3863C>T", + "ENST00000559448(ENSG00000170113):c.69-3863C>T", + "ENST00000538684(ENSG00000170113):c.-414-3863C>T", + "ENST00000561183(ENSG00000170113):c.-47-3863C>T", + "ENST00000557930(ENSG00000170113):c.23-3863C>T", + "ENST00000560069(ENSG00000170113):c.-47-3863C>T", + "ENST00000560105(ENSG00000170113):n.78-3863C>T" + ], + "id": "rs6606826", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.3317666, + "altHomGenotypeFreq": 0.18547812, + "hetGenotypeFreq": 0.292577, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6682334, + "refHomGenotypeFreq": 0.5219449, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14784394, + "altHomGenotypeFreq": 0.028747434, + "hetGenotypeFreq": 0.23819302, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.85215604, + "refHomGenotypeFreq": 0.7330595, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56327546, + "altHomGenotypeFreq": 0.3101737, + "hetGenotypeFreq": 0.5062035, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.43672457, + "refHomGenotypeFreq": 0.18362282, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15513127, + "altHomGenotypeFreq": 0.023866348, + "hetGenotypeFreq": 0.26252982, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.8448687, + "refHomGenotypeFreq": 0.7136038, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16225165, + "altHomGenotypeFreq": 0.01986755, + "hetGenotypeFreq": 0.28476822, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.83774835, + "refHomGenotypeFreq": 0.69536424, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14011462, + "altHomGenotypeFreq": 0.021776505, + "hetGenotypeFreq": 0.23667622, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.8598854, + "refHomGenotypeFreq": 0.7415473, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13711189, + "altHomGenotypeFreq": 0.020476446, + "hetGenotypeFreq": 0.23327088, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.8628881, + "refHomGenotypeFreq": 0.74625266, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7440736, + "altHomGenotypeFreq": 0.550748, + "hetGenotypeFreq": 0.38665134, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.25592634, + "refHomGenotypeFreq": 0.06260069, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34343138, + "altHomGenotypeFreq": 0.19383569, + "hetGenotypeFreq": 0.2991914, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.6565686, + "refHomGenotypeFreq": 0.5069729, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31732443, + "altHomGenotypeFreq": 0.17513059, + "hetGenotypeFreq": 0.2843877, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.68267554, + "refHomGenotypeFreq": 0.54048175, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14128256, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.85871744, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1328125, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.203125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.8671875, + "refHomGenotypeFreq": 0.765625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43730032, + "altHomGenotypeFreq": 0.28115016, + "hetGenotypeFreq": 0.31230032, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5626997, + "refHomGenotypeFreq": 0.4065495, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21063395, + "altHomGenotypeFreq": 0.044989776, + "hetGenotypeFreq": 0.33128834, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.78936607, + "refHomGenotypeFreq": 0.6237219, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21808511, + "altHomGenotypeFreq": 0.05319149, + "hetGenotypeFreq": 0.32978725, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.7819149, + "refHomGenotypeFreq": 0.61702126, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20588236, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.33333334, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.7941176, + "refHomGenotypeFreq": 0.627451, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8434191, + "altHomGenotypeFreq": 0.709531, + "hetGenotypeFreq": 0.26777607, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.15658094, + "refHomGenotypeFreq": 0.022692889, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5809524, + "altHomGenotypeFreq": 0.35238096, + "hetGenotypeFreq": 0.45714286, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.41904762, + "refHomGenotypeFreq": 0.1904762, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.61538464, + "altHomGenotypeFreq": 0.375, + "hetGenotypeFreq": 0.48076922, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.3846154, + "refHomGenotypeFreq": 0.14423077, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9027778, + "altHomGenotypeFreq": 0.8148148, + "hetGenotypeFreq": 0.17592593, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.097222224, + "refHomGenotypeFreq": 0.009259259, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21354167, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.3854167, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.7864583, + "refHomGenotypeFreq": 0.59375, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.88495576, + "altHomGenotypeFreq": 0.7699115, + "hetGenotypeFreq": 0.2300885, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.11504425, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2009804, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.32352942, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.79901963, + "refHomGenotypeFreq": 0.6372549, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13736264, + "altHomGenotypeFreq": 0.021978023, + "hetGenotypeFreq": 0.23076923, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.86263734, + "refHomGenotypeFreq": 0.74725276, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6451613, + "altHomGenotypeFreq": 0.4516129, + "hetGenotypeFreq": 0.38709676, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.3548387, + "refHomGenotypeFreq": 0.16129032, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6111111, + "altHomGenotypeFreq": 0.35353535, + "hetGenotypeFreq": 0.5151515, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.3888889, + "refHomGenotypeFreq": 0.13131313, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11682243, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23364486, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.8831776, + "refHomGenotypeFreq": 0.76635516, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25581396, + "altHomGenotypeFreq": 0.069767445, + "hetGenotypeFreq": 0.37209302, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.74418604, + "refHomGenotypeFreq": 0.55813956, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.828125, + "altHomGenotypeFreq": 0.6875, + "hetGenotypeFreq": 0.28125, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.171875, + "refHomGenotypeFreq": 0.03125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8737374, + "altHomGenotypeFreq": 0.74747473, + "hetGenotypeFreq": 0.25252527, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.12626262, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.75757575, + "altHomGenotypeFreq": 0.54545456, + "hetGenotypeFreq": 0.42424244, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.24242425, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13717695, + "altHomGenotypeFreq": 0.029821074, + "hetGenotypeFreq": 0.21471173, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.86282307, + "refHomGenotypeFreq": 0.7554672, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6885246, + "altHomGenotypeFreq": 0.4918033, + "hetGenotypeFreq": 0.39344263, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.3114754, + "refHomGenotypeFreq": 0.114754096, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1945245, + "altHomGenotypeFreq": 0.054755043, + "hetGenotypeFreq": 0.2795389, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.80547553, + "refHomGenotypeFreq": 0.66570604, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.90588236, + "altHomGenotypeFreq": 0.8235294, + "hetGenotypeFreq": 0.16470589, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.09411765, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18446602, + "altHomGenotypeFreq": 0.058252428, + "hetGenotypeFreq": 0.2524272, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.815534, + "refHomGenotypeFreq": 0.6893204, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13131313, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.2020202, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.86868685, + "refHomGenotypeFreq": 0.7676768, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13084112, + "altHomGenotypeFreq": 0.037383176, + "hetGenotypeFreq": 0.18691587, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.86915886, + "refHomGenotypeFreq": 0.7757009, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22596154, + "altHomGenotypeFreq": 0.10576923, + "hetGenotypeFreq": 0.24038462, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.77403843, + "refHomGenotypeFreq": 0.65384614, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17171717, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.22222222, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.82828283, + "refHomGenotypeFreq": 0.7171717, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1764706, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.32941177, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.8235294, + "refHomGenotypeFreq": 0.65882355, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.59126985, + "altHomGenotypeFreq": 0.35515872, + "hetGenotypeFreq": 0.4722222, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.40873015, + "refHomGenotypeFreq": 0.17261904, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50970876, + "altHomGenotypeFreq": 0.2524272, + "hetGenotypeFreq": 0.5145631, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.49029127, + "refHomGenotypeFreq": 0.23300971, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13977784, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.86022216, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1326245, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.8673755, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14711988, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.8528801, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13214672, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.8678533, + "study": "UK10K" + } + ], + "reference": "G", + "start": 23066182, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23066182, + "id": "15:23066182:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 23066182, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000337435", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000559448", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000538684", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000561183", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000557930", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560069", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560105", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -1.5499999523162842, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.6899995803833008, + "source": "cadd_raw" + }, + { + "score": 0.07999999821186066, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337435(ENSG00000170113):c.179-10094A>G", + "ENST00000437912(ENSG00000170113):c.-47-10094A>G", + "ENST00000559448(ENSG00000170113):c.69-10094A>G", + "ENST00000538684(ENSG00000170113):c.-414-10094A>G", + "ENST00000561183(ENSG00000170113):c.-47-10094A>G", + "ENST00000557930(ENSG00000170113):c.23-10094A>G", + "ENST00000560069(ENSG00000170113):c.-47-10094A>G", + "ENST00000560105(ENSG00000170113):n.78-10094A>G" + ], + "id": "rs6606827", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.91730344, + "altHomGenotypeFreq": 0.84380263, + "hetGenotypeFreq": 0.14700168, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.08269654, + "refHomGenotypeFreq": 0.0091957, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88911706, + "altHomGenotypeFreq": 0.79466116, + "hetGenotypeFreq": 0.1889117, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.11088296, + "refHomGenotypeFreq": 0.016427105, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9188544, + "altHomGenotypeFreq": 0.84725535, + "hetGenotypeFreq": 0.14319809, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.081145585, + "refHomGenotypeFreq": 0.00954654, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9039735, + "altHomGenotypeFreq": 0.80794704, + "hetGenotypeFreq": 0.19205298, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.09602649, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86840594, + "altHomGenotypeFreq": 0.7540138, + "hetGenotypeFreq": 0.2287844, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.13159403, + "refHomGenotypeFreq": 0.017201835, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88753515, + "altHomGenotypeFreq": 0.7877895, + "hetGenotypeFreq": 0.19949123, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.11246485, + "refHomGenotypeFreq": 0.012719239, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9759285, + "altHomGenotypeFreq": 0.9530032, + "hetGenotypeFreq": 0.045850527, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.024071528, + "refHomGenotypeFreq": 0.0011462632, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9199578, + "altHomGenotypeFreq": 0.84882224, + "hetGenotypeFreq": 0.14227118, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.08004219, + "refHomGenotypeFreq": 0.008906598, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9140252, + "altHomGenotypeFreq": 0.83760315, + "hetGenotypeFreq": 0.15284412, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.08597481, + "refHomGenotypeFreq": 0.009552757, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8677355, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.13226452, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9609375, + "altHomGenotypeFreq": 0.921875, + "hetGenotypeFreq": 0.078125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.0390625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9582668, + "altHomGenotypeFreq": 0.9217252, + "hetGenotypeFreq": 0.073083065, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.041733228, + "refHomGenotypeFreq": 0.005191693, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9815951, + "altHomGenotypeFreq": 0.9631902, + "hetGenotypeFreq": 0.036809817, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.018404908, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96276593, + "altHomGenotypeFreq": 0.9255319, + "hetGenotypeFreq": 0.07446808, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.03723404, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9852941, + "altHomGenotypeFreq": 0.9705882, + "hetGenotypeFreq": 0.029411767, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.014705882, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.994705, + "altHomGenotypeFreq": 0.99092287, + "hetGenotypeFreq": 0.0075642965, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.0052950075, + "refHomGenotypeFreq": 0.0015128592, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9635417, + "altHomGenotypeFreq": 0.9270833, + "hetGenotypeFreq": 0.072916664, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.036458332, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9754902, + "altHomGenotypeFreq": 0.95098037, + "hetGenotypeFreq": 0.04901961, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.024509804, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8956044, + "altHomGenotypeFreq": 0.8021978, + "hetGenotypeFreq": 0.18681319, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.104395606, + "refHomGenotypeFreq": 0.010989011, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8224299, + "altHomGenotypeFreq": 0.6635514, + "hetGenotypeFreq": 0.317757, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.17757009, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99418604, + "altHomGenotypeFreq": 0.9883721, + "hetGenotypeFreq": 0.011627907, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.0058139535, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9895833, + "altHomGenotypeFreq": 0.9791667, + "hetGenotypeFreq": 0.020833334, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.010416667, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86182904, + "altHomGenotypeFreq": 0.7435388, + "hetGenotypeFreq": 0.23658052, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.13817097, + "refHomGenotypeFreq": 0.019880716, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9590164, + "altHomGenotypeFreq": 0.93442625, + "hetGenotypeFreq": 0.049180325, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.040983606, + "refHomGenotypeFreq": 0.016393442, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9351585, + "altHomGenotypeFreq": 0.8760807, + "hetGenotypeFreq": 0.11815561, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.0648415, + "refHomGenotypeFreq": 0.0057636886, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99029124, + "altHomGenotypeFreq": 0.98058254, + "hetGenotypeFreq": 0.019417476, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.009708738, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8484849, + "altHomGenotypeFreq": 0.72727275, + "hetGenotypeFreq": 0.24242425, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.15151516, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86915886, + "altHomGenotypeFreq": 0.7570093, + "hetGenotypeFreq": 0.22429907, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.13084112, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86538464, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.23076925, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.13461539, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8787879, + "altHomGenotypeFreq": 0.7777778, + "hetGenotypeFreq": 0.2020202, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.121212125, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9705882, + "altHomGenotypeFreq": 0.9411765, + "hetGenotypeFreq": 0.05882353, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.029411765, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.882174, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.11782597, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.881925, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.11807498, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8816814, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.11831863, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8826861, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.117313914, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 136, + "copyNumber": 1.9, + "end": 23072547, + "percentageMatch": 0.82, + "period": 134, + "score": 327, + "sequence": "TTTTGTATTTTTAGTAGAGACGGGGCTTCACCATGTTAGCCAGGATGGTCTCAAGCTCCTGACCTAGGTGATACGCCCACCTCAGCCTCCCAAAAGTGCTGGGATTACAGACGTCAGCCACGATGCCCGGTGCCAA", + "source": "trf", + "start": 23072292 + } + ], + "start": 23072413, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23072413, + "id": "15:23072413:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 23072413, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000337435", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000559448", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000538684", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000561183", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000557930", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "cds_start_NF", + "mRNA_start_NF" + ] + }, + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560069", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000560105", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2100000381469727, + "source": "gerp" + }, + { + "score": 0.1120000034570694, + "source": "phastCons" + }, + { + "score": 0.23999999463558197, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.26000022888183594, + "source": "cadd_raw" + }, + { + "score": 5.320000171661377, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000337435(ENSG00000170113):c.178+5162A>G", + "ENST00000437912(ENSG00000170113):c.-48+17683A>G", + "ENST00000559448(ENSG00000170113):c.68+5162A>G", + "ENST00000538684(ENSG00000170113):c.-415+5162A>G", + "ENST00000561183(ENSG00000170113):c.-48+5748A>G", + "ENST00000557930(ENSG00000170113):c.22+5162A>G", + "ENST00000560069(ENSG00000170113):c.-48+5748A>G", + "ENST00000560105(ENSG00000170113):n.77+5162A>G" + ], + "id": "rs62001111", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.26064277, + "altHomGenotypeFreq": 0.08993715, + "hetGenotypeFreq": 0.34141126, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.73935723, + "refHomGenotypeFreq": 0.5686516, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32581967, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.40163934, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6741803, + "refHomGenotypeFreq": 0.47336066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.094678216, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18935643, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.9053218, + "refHomGenotypeFreq": 0.81064355, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18345323, + "altHomGenotypeFreq": 0.03117506, + "hetGenotypeFreq": 0.30455637, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.81654674, + "refHomGenotypeFreq": 0.6642686, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36666667, + "altHomGenotypeFreq": 0.14, + "hetGenotypeFreq": 0.45333335, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.6333333, + "refHomGenotypeFreq": 0.40666667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37858784, + "altHomGenotypeFreq": 0.14293915, + "hetGenotypeFreq": 0.47129735, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.62141216, + "refHomGenotypeFreq": 0.3857635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36113712, + "altHomGenotypeFreq": 0.1367224, + "hetGenotypeFreq": 0.44882944, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.63886285, + "refHomGenotypeFreq": 0.41444817, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.068113945, + "altHomGenotypeFreq": 0.005053986, + "hetGenotypeFreq": 0.12611991, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9318861, + "refHomGenotypeFreq": 0.8688261, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25067386, + "altHomGenotypeFreq": 0.084261104, + "hetGenotypeFreq": 0.3328255, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.74932617, + "refHomGenotypeFreq": 0.5829134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.272971, + "altHomGenotypeFreq": 0.09695652, + "hetGenotypeFreq": 0.352029, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.72702897, + "refHomGenotypeFreq": 0.5510145, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38476953, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.61523044, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15625, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.25, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.84375, + "refHomGenotypeFreq": 0.71875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16253993, + "altHomGenotypeFreq": 0.04033546, + "hetGenotypeFreq": 0.24440895, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.83746004, + "refHomGenotypeFreq": 0.7152556, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21676892, + "altHomGenotypeFreq": 0.042944785, + "hetGenotypeFreq": 0.34764826, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.7832311, + "refHomGenotypeFreq": 0.60940695, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.06382979, + "hetGenotypeFreq": 0.37234044, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.5638298, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23039216, + "altHomGenotypeFreq": 0.029411765, + "hetGenotypeFreq": 0.4019608, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.76960784, + "refHomGenotypeFreq": 0.5686275, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.023449318, + "altHomGenotypeFreq": 0.0015128592, + "hetGenotypeFreq": 0.04387292, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9765507, + "refHomGenotypeFreq": 0.9546142, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11904762, + "altHomGenotypeFreq": 0.028571429, + "hetGenotypeFreq": 0.18095239, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.88095236, + "refHomGenotypeFreq": 0.7904762, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09134615, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18269232, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.90865386, + "refHomGenotypeFreq": 0.8173077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0046296297, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009259259, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.9953704, + "refHomGenotypeFreq": 0.9907407, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.203125, + "altHomGenotypeFreq": 0.041666668, + "hetGenotypeFreq": 0.32291666, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.796875, + "refHomGenotypeFreq": 0.6354167, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0044247787, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0088495575, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.99557525, + "refHomGenotypeFreq": 0.99115044, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23529412, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.33333334, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.7647059, + "refHomGenotypeFreq": 0.5980392, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3021978, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.45054945, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.6978022, + "refHomGenotypeFreq": 0.47252747, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.059139784, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11827957, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.9408602, + "refHomGenotypeFreq": 0.8817204, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08585858, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17171717, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.9141414, + "refHomGenotypeFreq": 0.82828283, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40186915, + "altHomGenotypeFreq": 0.17757009, + "hetGenotypeFreq": 0.44859815, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.5981308, + "refHomGenotypeFreq": 0.37383178, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19186047, + "altHomGenotypeFreq": 0.023255814, + "hetGenotypeFreq": 0.33720928, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.80813956, + "refHomGenotypeFreq": 0.6395349, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.052083332, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.104166664, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.9479167, + "refHomGenotypeFreq": 0.8958333, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.02020202, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04040404, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.97979796, + "refHomGenotypeFreq": 0.959596, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34095427, + "altHomGenotypeFreq": 0.10934394, + "hetGenotypeFreq": 0.46322066, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.6590457, + "refHomGenotypeFreq": 0.4274354, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08196721, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.13114753, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.91803277, + "refHomGenotypeFreq": 0.852459, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19164266, + "altHomGenotypeFreq": 0.054755043, + "hetGenotypeFreq": 0.27377522, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.80835736, + "refHomGenotypeFreq": 0.67146975, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.023529412, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.047058824, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.9764706, + "refHomGenotypeFreq": 0.9529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2184466, + "altHomGenotypeFreq": 0.048543688, + "hetGenotypeFreq": 0.33980584, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.7815534, + "refHomGenotypeFreq": 0.61165047, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.45454547, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.47474748, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35514018, + "altHomGenotypeFreq": 0.093457945, + "hetGenotypeFreq": 0.5233645, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.6448598, + "refHomGenotypeFreq": 0.38317758, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27403846, + "altHomGenotypeFreq": 0.10576923, + "hetGenotypeFreq": 0.33653846, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.72596157, + "refHomGenotypeFreq": 0.5576923, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.33838382, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.43434346, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.66161615, + "refHomGenotypeFreq": 0.44444445, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.052941177, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.105882354, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.9470588, + "refHomGenotypeFreq": 0.89411765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09424603, + "altHomGenotypeFreq": 0.009920635, + "hetGenotypeFreq": 0.1686508, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.90575397, + "refHomGenotypeFreq": 0.8214286, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11165048, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.18446602, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.88834953, + "refHomGenotypeFreq": 0.79611653, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35850304, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.64149696, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35926133, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.64073867, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35962635, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.64037365, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35733548, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.64266455, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 75, + "copyNumber": 3, + "end": 23081242, + "percentageMatch": 0.92, + "period": 75, + "score": 359, + "sequence": "ATGTCATCCAAAAGCATGGCAAAGAAGGCAGGCAGCCCCATCCGAGCCTATGCTGTAGAGGACGCTCCCTGGACT", + "source": "trf", + "start": 23081014 + } + ], + "start": 23081072, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23081072, + "id": "15:23081072:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 23081072, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "cdnaPosition": 53, + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559762", + "exonOverlap": [ + { + "number": "1/5", + "percentage": 0.44444445 + } + ], + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000560434", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559740", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -3.8389999866485596, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.7299995422363281, + "source": "cadd_raw" + }, + { + "score": 0.05999999865889549, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000437912(ENSG00000170113):c.-48+1834T>G", + "ENST00000557922(ENSG00000259344):n.477-1620T>G", + "ENST00000559762(ENSG00000259425):n.53A>C" + ], + "id": "rs4778307", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.73102665, + "altHomGenotypeFreq": 0.5391163, + "hetGenotypeFreq": 0.38382065, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.26897335, + "refHomGenotypeFreq": 0.07706303, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6930185, + "altHomGenotypeFreq": 0.49486652, + "hetGenotypeFreq": 0.3963039, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.30698153, + "refHomGenotypeFreq": 0.108829565, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8283208, + "altHomGenotypeFreq": 0.6904762, + "hetGenotypeFreq": 0.2756892, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.1716792, + "refHomGenotypeFreq": 0.033834588, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7320574, + "altHomGenotypeFreq": 0.5502392, + "hetGenotypeFreq": 0.36363637, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.26794258, + "refHomGenotypeFreq": 0.086124405, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71854305, + "altHomGenotypeFreq": 0.5231788, + "hetGenotypeFreq": 0.39072847, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.28145695, + "refHomGenotypeFreq": 0.08609272, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6883601, + "altHomGenotypeFreq": 0.47477064, + "hetGenotypeFreq": 0.4271789, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.3116399, + "refHomGenotypeFreq": 0.09805046, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6925299, + "altHomGenotypeFreq": 0.4811232, + "hetGenotypeFreq": 0.4228134, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.3074701, + "refHomGenotypeFreq": 0.09606341, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8007588, + "altHomGenotypeFreq": 0.64083695, + "hetGenotypeFreq": 0.31984365, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.1992412, + "refHomGenotypeFreq": 0.039319385, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7368297, + "altHomGenotypeFreq": 0.5465663, + "hetGenotypeFreq": 0.3805268, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.26317027, + "refHomGenotypeFreq": 0.07290687, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72386, + "altHomGenotypeFreq": 0.52991575, + "hetGenotypeFreq": 0.38788846, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.27614, + "refHomGenotypeFreq": 0.08219576, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.66232467, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.33767536, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75, + "altHomGenotypeFreq": 0.59375, + "hetGenotypeFreq": 0.3125, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.25, + "refHomGenotypeFreq": 0.09375, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7577875, + "altHomGenotypeFreq": 0.5826677, + "hetGenotypeFreq": 0.35023963, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.24221246, + "refHomGenotypeFreq": 0.06709265, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6881391, + "altHomGenotypeFreq": 0.45603272, + "hetGenotypeFreq": 0.4642127, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.31186095, + "refHomGenotypeFreq": 0.0797546, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7287234, + "altHomGenotypeFreq": 0.5212766, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.2712766, + "refHomGenotypeFreq": 0.06382979, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71568626, + "altHomGenotypeFreq": 0.50980395, + "hetGenotypeFreq": 0.4117647, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.28431374, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82072616, + "altHomGenotypeFreq": 0.67927384, + "hetGenotypeFreq": 0.28290468, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.17927383, + "refHomGenotypeFreq": 0.037821483, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8047619, + "altHomGenotypeFreq": 0.6761905, + "hetGenotypeFreq": 0.25714287, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.1952381, + "refHomGenotypeFreq": 0.06666667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85096157, + "altHomGenotypeFreq": 0.72115386, + "hetGenotypeFreq": 0.2596154, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.14903846, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8611111, + "altHomGenotypeFreq": 0.7407407, + "hetGenotypeFreq": 0.24074073, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.1388889, + "refHomGenotypeFreq": 0.018518519, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.703125, + "altHomGenotypeFreq": 0.46875, + "hetGenotypeFreq": 0.46875, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.296875, + "refHomGenotypeFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82743365, + "altHomGenotypeFreq": 0.67256635, + "hetGenotypeFreq": 0.30973452, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.17256637, + "refHomGenotypeFreq": 0.017699115, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6911765, + "altHomGenotypeFreq": 0.46078432, + "hetGenotypeFreq": 0.46078432, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.30882353, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6978022, + "altHomGenotypeFreq": 0.45054945, + "hetGenotypeFreq": 0.49450552, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.3021978, + "refHomGenotypeFreq": 0.054945055, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9032258, + "altHomGenotypeFreq": 0.8172043, + "hetGenotypeFreq": 0.17204301, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.09677419, + "refHomGenotypeFreq": 0.010752688, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85353535, + "altHomGenotypeFreq": 0.7171717, + "hetGenotypeFreq": 0.27272728, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.14646465, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6214953, + "altHomGenotypeFreq": 0.39252338, + "hetGenotypeFreq": 0.45794392, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.37850466, + "refHomGenotypeFreq": 0.1495327, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70348835, + "altHomGenotypeFreq": 0.4651163, + "hetGenotypeFreq": 0.47674417, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.29651162, + "refHomGenotypeFreq": 0.058139537, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8229167, + "altHomGenotypeFreq": 0.6875, + "hetGenotypeFreq": 0.2708333, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.17708333, + "refHomGenotypeFreq": 0.041666668, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81313133, + "altHomGenotypeFreq": 0.64646465, + "hetGenotypeFreq": 0.33333334, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.18686868, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77272725, + "altHomGenotypeFreq": 0.61616164, + "hetGenotypeFreq": 0.31313133, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.22727273, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.69681907, + "altHomGenotypeFreq": 0.48906562, + "hetGenotypeFreq": 0.41550696, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.3031809, + "refHomGenotypeFreq": 0.09542744, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73770493, + "altHomGenotypeFreq": 0.57377046, + "hetGenotypeFreq": 0.32786885, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.26229507, + "refHomGenotypeFreq": 0.09836066, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7161383, + "altHomGenotypeFreq": 0.5389049, + "hetGenotypeFreq": 0.35446686, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.28386167, + "refHomGenotypeFreq": 0.10662824, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88235295, + "altHomGenotypeFreq": 0.7882353, + "hetGenotypeFreq": 0.1882353, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.11764706, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.63106793, + "altHomGenotypeFreq": 0.37864077, + "hetGenotypeFreq": 0.5048543, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.36893204, + "refHomGenotypeFreq": 0.116504855, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75252527, + "altHomGenotypeFreq": 0.56565654, + "hetGenotypeFreq": 0.3737374, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.24747474, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71028036, + "altHomGenotypeFreq": 0.5233645, + "hetGenotypeFreq": 0.37383178, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.2897196, + "refHomGenotypeFreq": 0.10280374, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.61538464, + "altHomGenotypeFreq": 0.42307693, + "hetGenotypeFreq": 0.3846154, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.3846154, + "refHomGenotypeFreq": 0.1923077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7070707, + "altHomGenotypeFreq": 0.5151515, + "hetGenotypeFreq": 0.3838384, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.2929293, + "refHomGenotypeFreq": 0.1010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8, + "altHomGenotypeFreq": 0.65882355, + "hetGenotypeFreq": 0.28235295, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.2, + "refHomGenotypeFreq": 0.05882353, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83234125, + "altHomGenotypeFreq": 0.70238096, + "hetGenotypeFreq": 0.25992066, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.16765873, + "refHomGenotypeFreq": 0.037698414, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75728154, + "altHomGenotypeFreq": 0.592233, + "hetGenotypeFreq": 0.33009708, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.24271844, + "refHomGenotypeFreq": 0.0776699, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6441948, + "altHomGenotypeFreq": 0.44194758, + "hetGenotypeFreq": 0.40449437, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.35580525, + "refHomGenotypeFreq": 0.15355805, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67151546, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.32848454, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6743145, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.3256855, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67073166, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.3292683, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67233014, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.3276699, + "study": "UK10K" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23096921, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23096921, + "id": "15:23096921:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 23096921, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559762", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000560434", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559740", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.06300000101327896, + "source": "phastCons" + }, + { + "score": -1.4919999837875366, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.2200002670288086, + "source": "cadd_raw" + }, + { + "score": 1.0099999904632568, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000437912(ENSG00000170113):c.-48+464G>A", + "ENST00000557922(ENSG00000259344):n.476+464G>A", + "ENST00000559762(ENSG00000259425):n.226-108C>T", + "ENST00000560434(ENSG00000259425):n.147-108C>T", + "ENST00000559740(ENSG00000259425):n.147-108C>T", + "ENST00000558417(ENSG00000259425):n.85-108C>T" + ], + "id": "rs139353578", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.023586152, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.047172304, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.97641385, + "refHomGenotypeFreq": 0.9528277, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.023109244, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04621849, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.97689074, + "refHomGenotypeFreq": 0.9537815, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.013285024, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.026570048, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.98671496, + "refHomGenotypeFreq": 0.97343, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.05, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.95, + "refHomGenotypeFreq": 0.9, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.03079179, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06158358, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.96920824, + "refHomGenotypeFreq": 0.9384164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.036078215, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07215643, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.9639218, + "refHomGenotypeFreq": 0.9278436, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0043869778, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0087739555, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.99561304, + "refHomGenotypeFreq": 0.991226, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.022689275, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04537855, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.9773107, + "refHomGenotypeFreq": 0.95462143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.024696834, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04939367, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.9753032, + "refHomGenotypeFreq": 0.95060635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04208417, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.95791584, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.015625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.984375, + "refHomGenotypeFreq": 0.96875, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.014776357, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.029552717, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.98522365, + "refHomGenotypeFreq": 0.9704473, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.010224949, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.020449897, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.98977506, + "refHomGenotypeFreq": 0.9795501, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.03723404, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07446808, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.96276593, + "refHomGenotypeFreq": 0.9255319, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.009803922, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.019607844, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.99019605, + "refHomGenotypeFreq": 0.98039216, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0037821482, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0075642965, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.99621785, + "refHomGenotypeFreq": 0.9924357, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0052083335, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010416667, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.9947917, + "refHomGenotypeFreq": 0.9895833, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.019607844, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.039215688, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.98039216, + "refHomGenotypeFreq": 0.9607843, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.03846154, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07692308, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.96153843, + "refHomGenotypeFreq": 0.9230769, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07009346, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14018692, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.92990655, + "refHomGenotypeFreq": 0.8598131, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0052083335, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010416667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.9947917, + "refHomGenotypeFreq": 0.9895833, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.01010101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02020202, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.989899, + "refHomGenotypeFreq": 0.97979796, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04671968, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09343937, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.9532803, + "refHomGenotypeFreq": 0.90656066, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.016393442, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.032786883, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.9836066, + "refHomGenotypeFreq": 0.9672131, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.017291067, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03458213, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.98270893, + "refHomGenotypeFreq": 0.96541786, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.014563107, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.029126214, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.9854369, + "refHomGenotypeFreq": 0.9708738, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.025252525, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05050505, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.9747475, + "refHomGenotypeFreq": 0.94949496, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.056074765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11214953, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.94392526, + "refHomGenotypeFreq": 0.88785046, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.009615385, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01923077, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.99038464, + "refHomGenotypeFreq": 0.9807692, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04040404, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08080808, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.959596, + "refHomGenotypeFreq": 0.9191919, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.005882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.011764706, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.9941176, + "refHomGenotypeFreq": 0.9882353, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0018726592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0037453184, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.99812734, + "refHomGenotypeFreq": 0.9962547, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23098291, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23098291, + "id": "15:23098291:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 23098291, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "cdnaPosition": 276, + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559762", + "exonOverlap": [ + { + "number": "2/5", + "percentage": 0.7751938 + } + ], + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 197, + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000560434", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.34965035 + } + ], + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "cdnaPosition": 197, + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559740", + "exonOverlap": [ + { + "number": "2/6", + "percentage": 0.7751938 + } + ], + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 135, + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "exonOverlap": [ + { + "number": "2/7", + "percentage": 0.7751938 + } + ], + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.03099999949336052, + "source": "phastCons" + }, + { + "score": 0.12099999934434891, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.26000022888183594, + "source": "cadd_raw" + }, + { + "score": 5.360000133514404, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000437912(ENSG00000170113):c.-48+306G>A", + "ENST00000557922(ENSG00000259344):n.476+306G>A", + "ENST00000559762(ENSG00000259425):n.276C>T", + "ENST00000560434(ENSG00000259425):n.197C>T", + "ENST00000559740(ENSG00000259425):n.197C>T", + "ENST00000558417(ENSG00000259425):n.135C>T" + ], + "id": "rs2347179", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.4862574, + "altHomGenotypeFreq": 1.3951866E-4, + "hetGenotypeFreq": 0.9722358, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.51374257, + "refHomGenotypeFreq": 0.027624695, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4925532, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9851064, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.5074468, + "refHomGenotypeFreq": 0.0148936175, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49168798, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.98337597, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.50831205, + "refHomGenotypeFreq": 0.01662404, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48759305, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9751861, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.51240695, + "refHomGenotypeFreq": 0.024813896, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48965517, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.97931033, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.5103448, + "refHomGenotypeFreq": 0.020689655, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49621212, + "altHomGenotypeFreq": 5.827506E-4, + "hetGenotypeFreq": 0.99125874, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5037879, + "refHomGenotypeFreq": 0.008158508, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49137932, + "altHomGenotypeFreq": 1.3904338E-4, + "hetGenotypeFreq": 0.9824805, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.5086207, + "refHomGenotypeFreq": 0.017380422, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46912047, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.93824095, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5308795, + "refHomGenotypeFreq": 0.06175903, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48583302, + "altHomGenotypeFreq": 2.5185745E-4, + "hetGenotypeFreq": 0.9711623, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.514167, + "refHomGenotypeFreq": 0.02858582, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4867845, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.973569, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.51321554, + "refHomGenotypeFreq": 0.02643103, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4812734, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9625468, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5187266, + "refHomGenotypeFreq": 0.037453182, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23098449, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23098449, + "id": "15:23098449:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 23098449, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559762", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 295, + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000560434", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.34965035 + } + ], + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559740", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.032999999821186066, + "source": "phastCons" + }, + { + "score": 0.10199999809265137, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 4.119999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000437912(ENSG00000170113):c.-48+208A>C", + "ENST00000557922(ENSG00000259344):n.476+208A>C", + "ENST00000559762(ENSG00000259425):n.354+20T>G", + "ENST00000560434(ENSG00000259425):n.295T>G", + "ENST00000559740(ENSG00000259425):n.275+20T>G", + "ENST00000558417(ENSG00000259425):n.213+20T>G" + ], + "id": "rs188998814", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.09118039, + "altHomGenotypeFreq": 4.2131872E-4, + "hetGenotypeFreq": 0.18151815, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9088196, + "refHomGenotypeFreq": 0.8180605, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.029978586, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.059957173, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.9700214, + "refHomGenotypeFreq": 0.94004285, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0678426, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1356852, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.9321574, + "refHomGenotypeFreq": 0.8643148, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08943089, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17886178, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.91056913, + "refHomGenotypeFreq": 0.8211382, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.03448276, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06896552, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.9655172, + "refHomGenotypeFreq": 0.9310345, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.01849642, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03699284, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.9815036, + "refHomGenotypeFreq": 0.96300715, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.016476726, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.032953452, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.98352325, + "refHomGenotypeFreq": 0.96704656, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29335016, + "altHomGenotypeFreq": 0.0016835016, + "hetGenotypeFreq": 0.5833333, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.70664984, + "refHomGenotypeFreq": 0.41498315, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.092279315, + "altHomGenotypeFreq": 3.815823E-4, + "hetGenotypeFreq": 0.18379547, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.9077207, + "refHomGenotypeFreq": 0.81582296, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08982599, + "altHomGenotypeFreq": 4.7029316E-4, + "hetGenotypeFreq": 0.1787114, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.910174, + "refHomGenotypeFreq": 0.8208183, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.013108614, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.026217228, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9868914, + "refHomGenotypeFreq": 0.9737828, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23098547, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23098547, + "id": "15:23098547:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 23098547, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559762", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000560434", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559740", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.014000000432133675, + "source": "phastCons" + }, + { + "score": -1.9500000476837158, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.06000041961669922, + "source": "cadd_raw" + }, + { + "score": 2.0799999237060547, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000437912(ENSG00000170113):c.-48+33G>A", + "ENST00000557922(ENSG00000259344):n.476+33G>A", + "ENST00000559762(ENSG00000259425):n.354+195C>T", + "ENST00000559740(ENSG00000259425):n.275+195C>T", + "ENST00000558417(ENSG00000259425):n.213+195C>T" + ], + "id": "rs3902646", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.47916502, + "altHomGenotypeFreq": 0.08563733, + "hetGenotypeFreq": 0.7870554, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.520835, + "refHomGenotypeFreq": 0.1273073, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40992168, + "altHomGenotypeFreq": 0.01305483, + "hetGenotypeFreq": 0.79373366, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.59007835, + "refHomGenotypeFreq": 0.19321148, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47567955, + "altHomGenotypeFreq": 0.014306151, + "hetGenotypeFreq": 0.9227468, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5243205, + "refHomGenotypeFreq": 0.062947065, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43714285, + "altHomGenotypeFreq": 0.008571428, + "hetGenotypeFreq": 0.85714287, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.56285715, + "refHomGenotypeFreq": 0.13428572, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43253967, + "altHomGenotypeFreq": 0.015873017, + "hetGenotypeFreq": 0.8333333, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.5674603, + "refHomGenotypeFreq": 0.15079366, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38671586, + "altHomGenotypeFreq": 0.0044280444, + "hetGenotypeFreq": 0.76457566, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6132841, + "refHomGenotypeFreq": 0.23099631, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4211327, + "altHomGenotypeFreq": 0.008622147, + "hetGenotypeFreq": 0.82502115, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.5788673, + "refHomGenotypeFreq": 0.16635673, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.61567855, + "altHomGenotypeFreq": 0.26455864, + "hetGenotypeFreq": 0.7022398, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.38432148, + "refHomGenotypeFreq": 0.033201583, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48422486, + "altHomGenotypeFreq": 0.090778716, + "hetGenotypeFreq": 0.7868923, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.51577514, + "refHomGenotypeFreq": 0.12232898, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47292036, + "altHomGenotypeFreq": 0.07929204, + "hetGenotypeFreq": 0.78725666, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.52707964, + "refHomGenotypeFreq": 0.13345133, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10674157, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21348314, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.89325845, + "refHomGenotypeFreq": 0.78651685, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23098722, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23098722, + "id": "15:23098722:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 23098722, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559762", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000560434", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559740", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.024000000208616257, + "source": "phastCons" + }, + { + "score": -1.7089999914169312, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.6400003433227539, + "source": "cadd_raw" + }, + { + "score": 0.10000000149011612, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000557922(ENSG00000259344):n.379-2758G>A", + "ENST00000558417(ENSG00000259425):n.608-97C>T" + ], + "id": "rs113555870", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 3.618421E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 7.236842E-4, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.99963814, + "refHomGenotypeFreq": 0.99927634, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0010526315, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.002105263, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.9989474, + "refHomGenotypeFreq": 0.99789476, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0035211267, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0070422534, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.99647886, + "refHomGenotypeFreq": 0.9929578, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 6.155951E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0012311902, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.9993844, + "refHomGenotypeFreq": 0.9987688, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 4.1711357E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 8.3422713E-4, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.9995829, + "refHomGenotypeFreq": 0.9991658, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 2.937289E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 5.874578E-4, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.99970627, + "refHomGenotypeFreq": 0.99941254, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2846442, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5692884, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7153558, + "refHomGenotypeFreq": 0.4307116, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23101610, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23101610, + "id": "15:23101610:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 23101610, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559762", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000560434", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559740", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 903, + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.03132832 + } + ], + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -1.7300000190734863, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.05000019073486328, + "source": "cadd_raw" + }, + { + "score": 2.1600000858306885, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000557922(ENSG00000259344):n.379-3443T>C", + "ENST00000558417(ENSG00000259425):n.903A>G" + ], + "id": "rs7402568", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.19101568, + "altHomGenotypeFreq": 0.04905769, + "hetGenotypeFreq": 0.28398794, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.80894834, + "refHomGenotypeFreq": 0.6669544, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25469485, + "altHomGenotypeFreq": 0.07746479, + "hetGenotypeFreq": 0.3544601, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.7453052, + "refHomGenotypeFreq": 0.5680751, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19403973, + "altHomGenotypeFreq": 0.047682118, + "hetGenotypeFreq": 0.29271522, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.80596024, + "refHomGenotypeFreq": 0.65960264, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21527778, + "altHomGenotypeFreq": 0.058333334, + "hetGenotypeFreq": 0.31388888, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.7847222, + "refHomGenotypeFreq": 0.62777776, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24285714, + "altHomGenotypeFreq": 0.057142857, + "hetGenotypeFreq": 0.37142858, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.75714284, + "refHomGenotypeFreq": 0.5714286, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23425196, + "altHomGenotypeFreq": 0.060367454, + "hetGenotypeFreq": 0.34776902, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.765748, + "refHomGenotypeFreq": 0.5918635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26459026, + "altHomGenotypeFreq": 0.072875716, + "hetGenotypeFreq": 0.38358027, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.73533416, + "refHomGenotypeFreq": 0.543544, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04457507, + "altHomGenotypeFreq": 0.0024491795, + "hetGenotypeFreq": 0.08425178, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9554249, + "refHomGenotypeFreq": 0.913299, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18976963, + "altHomGenotypeFreq": 0.04932969, + "hetGenotypeFreq": 0.28087986, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.8102304, + "refHomGenotypeFreq": 0.66979045, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19255507, + "altHomGenotypeFreq": 0.04872166, + "hetGenotypeFreq": 0.2878276, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.8073645, + "refHomGenotypeFreq": 0.6634507, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26653308, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7334669, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.265625, + "altHomGenotypeFreq": 0.078125, + "hetGenotypeFreq": 0.375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.734375, + "refHomGenotypeFreq": 0.546875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18630192, + "altHomGenotypeFreq": 0.0543131, + "hetGenotypeFreq": 0.26397765, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.81369805, + "refHomGenotypeFreq": 0.6817093, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30981594, + "altHomGenotypeFreq": 0.10633947, + "hetGenotypeFreq": 0.40695298, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.69018406, + "refHomGenotypeFreq": 0.48670757, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2606383, + "altHomGenotypeFreq": 0.06382979, + "hetGenotypeFreq": 0.39361703, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.7393617, + "refHomGenotypeFreq": 0.5425532, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37745097, + "altHomGenotypeFreq": 0.15686275, + "hetGenotypeFreq": 0.44117647, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.622549, + "refHomGenotypeFreq": 0.4019608, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0113464445, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.022692889, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.98865354, + "refHomGenotypeFreq": 0.9773071, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13333334, + "altHomGenotypeFreq": 0.01904762, + "hetGenotypeFreq": 0.22857143, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.8666667, + "refHomGenotypeFreq": 0.75238097, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16346154, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.26923078, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.83653843, + "refHomGenotypeFreq": 0.7019231, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32291666, + "altHomGenotypeFreq": 0.083333336, + "hetGenotypeFreq": 0.4791667, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.6770833, + "refHomGenotypeFreq": 0.4375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30882353, + "altHomGenotypeFreq": 0.12745099, + "hetGenotypeFreq": 0.3627451, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.6911765, + "refHomGenotypeFreq": 0.50980395, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30769232, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.4615385, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.6923077, + "refHomGenotypeFreq": 0.46153846, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19354838, + "altHomGenotypeFreq": 0.043010753, + "hetGenotypeFreq": 0.30107528, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.8064516, + "refHomGenotypeFreq": 0.65591395, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18181819, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.3030303, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.8181818, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22897196, + "altHomGenotypeFreq": 0.056074765, + "hetGenotypeFreq": 0.34579438, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.77102804, + "refHomGenotypeFreq": 0.5981308, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27906978, + "altHomGenotypeFreq": 0.069767445, + "hetGenotypeFreq": 0.41860464, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.7209302, + "refHomGenotypeFreq": 0.5116279, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.03125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0625, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.96875, + "refHomGenotypeFreq": 0.9375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.025252525, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05050505, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.9747475, + "refHomGenotypeFreq": 0.94949496, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2942346, + "altHomGenotypeFreq": 0.09542744, + "hetGenotypeFreq": 0.3976143, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.7057654, + "refHomGenotypeFreq": 0.50695825, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.024590164, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.049180325, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.97540987, + "refHomGenotypeFreq": 0.9508197, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2074928, + "altHomGenotypeFreq": 0.048991356, + "hetGenotypeFreq": 0.3170029, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.79250723, + "refHomGenotypeFreq": 0.6340058, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25728154, + "altHomGenotypeFreq": 0.08737864, + "hetGenotypeFreq": 0.33980584, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.74271846, + "refHomGenotypeFreq": 0.57281554, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32323232, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.42424244, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.67676765, + "refHomGenotypeFreq": 0.46464646, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2990654, + "altHomGenotypeFreq": 0.10280374, + "hetGenotypeFreq": 0.39252335, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.7009346, + "refHomGenotypeFreq": 0.5046729, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14903846, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.2596154, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.85096157, + "refHomGenotypeFreq": 0.72115386, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3181818, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.3737374, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.6818182, + "refHomGenotypeFreq": 0.4949495, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1764706, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.25882354, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.8235294, + "refHomGenotypeFreq": 0.69411767, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1736111, + "altHomGenotypeFreq": 0.037698414, + "hetGenotypeFreq": 0.2718254, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.8263889, + "refHomGenotypeFreq": 0.6904762, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19902913, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.26213592, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.80097085, + "refHomGenotypeFreq": 0.6699029, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2752809, + "altHomGenotypeFreq": 0.07865169, + "hetGenotypeFreq": 0.39325842, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7247191, + "refHomGenotypeFreq": 0.5280899, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2810103, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.71898973, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2867935, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.7132065, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27503893, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.72496104, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28721684, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.71278316, + "study": "UK10K" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 21, + "copyNumber": 5.3, + "end": 23102347, + "percentageMatch": 0.84, + "period": 21, + "score": 71, + "sequence": "CAGGAGCAGGAGCTGCGGGAC", + "source": "trf", + "start": 23102237 + }, + { + "chromosome": "15", + "consensusSize": 21, + "copyNumber": 128.6, + "end": 23104943, + "percentageMatch": 0.92, + "period": 21, + "score": 3460, + "sequence": "TGCGGGAGCAGGAGGAGCAGA", + "source": "trf", + "start": 23102250 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23102295, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23102295, + "id": "15:23102295:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23102295, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000170113", + "ensemblTranscriptId": "ENST00000437912", + "geneName": "NIPA1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000561118", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000561063", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559762", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000559740", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 2294, + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.03132832 + } + ], + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": 0, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.880000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "hpo": "HP:0000006", + "id": "OMIM:600363", + "name": "Autosomal dominant inheritance", + "source": "hpo" + }, + { + "hpo": "HP:0007340", + "id": "OMIM:600363", + "name": "Lower limb muscle weakness", + "source": "hpo" + }, + { + "hpo": "HP:0001761", + "id": "OMIM:600363", + "name": "Pes cavus", + "source": "hpo" + }, + { + "hpo": "HP:0000012", + "id": "OMIM:600363", + "name": "Urinary urgency", + "source": "hpo" + }, + { + "hpo": "HP:0001337", + "id": "OMIM:600363", + "name": "Tremor", + "source": "hpo" + }, + { + "hpo": "HP:0001250", + "id": "OMIM:600363", + "name": "Seizures", + "source": "hpo" + }, + { + "hpo": "HP:0002169", + "id": "OMIM:600363", + "name": "Clonus", + "source": "hpo" + }, + { + "hpo": "HP:0001258", + "id": "OMIM:600363", + "name": "Spastic paraplegia", + "source": "hpo" + }, + { + "hpo": "HP:0002314", + "id": "OMIM:600363", + "name": "Degeneration of the lateral corticospinal tracts", + "source": "hpo" + }, + { + "hpo": "HP:0002064", + "id": "OMIM:600363", + "name": "Spastic gait", + "source": "hpo" + }, + { + "hpo": "HP:0002839", + "id": "OMIM:600363", + "name": "Urinary bladder sphincter dysfunction", + "source": "hpo" + }, + { + "hpo": "HP:0002061", + "id": "OMIM:600363", + "name": "Lower limb spasticity", + "source": "hpo" + }, + { + "hpo": "HP:0003587", + "id": "OMIM:600363", + "name": "Insidious onset", + "source": "hpo" + }, + { + "hpo": "HP:0003828", + "id": "OMIM:600363", + "name": "Variable expressivity", + "source": "hpo" + }, + { + "hpo": "HP:0003676", + "id": "OMIM:600363", + "name": "Progressive", + "source": "hpo" + }, + { + "hpo": "HP:0003487", + "id": "OMIM:600363", + "name": "Babinski sign", + "source": "hpo" + }, + { + "hpo": "HP:0000020", + "id": "OMIM:600363", + "name": "Urinary incontinence", + "source": "hpo" + }, + { + "hpo": "HP:0002166", + "id": "OMIM:600363", + "name": "Impaired vibration sensation in the lower limbs", + "source": "hpo" + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C1838192", + "name": "Spastic paraplegia 6, autosomal dominant", + "numberOfPubmeds": 3, + "score": 0.620567, + "source": "disgenet", + "sources": [ + "BeFree", + "CLINVAR", + "CTD_human", + "UNIPROT" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037773", + "name": "Spastic Paraplegia, Hereditary", + "numberOfPubmeds": 11, + "score": 0.0076746903, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD", + "LHGDN" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0002736", + "name": "Amyotrophic Lateral Sclerosis", + "numberOfPubmeds": 2, + "score": 0.0028840767, + "source": "disgenet", + "sources": [ + "BeFree", + "GAD" + ] + }, + { + "associationTypes": [ + "AlteredExpression" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0030486", + "name": "Paraplegia", + "numberOfPubmeds": 1, + "score": 0.002522577, + "source": "disgenet", + "sources": [ + "LHGDN" + ] + }, + { + "associationTypes": [ + "GeneticVariation" + ], + "id": "umls:C0004936", + "name": "Mental Disorders", + "numberOfPubmeds": 1, + "score": 0.0023170675, + "source": "disgenet", + "sources": [ + "GAD" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0037772", + "name": "Spastic Paraplegia", + "numberOfPubmeds": 7, + "score": 0.001984532, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C0751602", + "name": "Hereditary Autosomal Dominant Spastic Paraplegia", + "numberOfPubmeds": 6, + "score": 0.0017010274, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0524851", + "name": "Neurodegenerative Diseases", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker, GeneticVariation" + ], + "id": "umls:C3825627", + "name": "Stress (Psychology)", + "numberOfPubmeds": 2, + "score": 5.6700915E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C3714552", + "name": "Weakness", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0014544", + "name": "Epilepsy", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0270850", + "name": "Epilepsy, Idiopathic Generalized", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C1858712", + "name": "Spastic paraplegia 10, autosomal dominant", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0085084", + "name": "Motor Neuron Disease", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C2718017", + "name": "TDP-43 Proteinopathies", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0004352", + "name": "Autistic Disorder", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0162635", + "name": "Angelman Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0026838", + "name": "Muscle Spasticity", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + }, + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0338656", + "name": "Impaired cognition", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000557922(ENSG00000259344):n.379-4834C>T", + "ENST00000558417(ENSG00000259425):n.2294G>A" + ], + "id": "rs77247395", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.38126266, + "altHomGenotypeFreq": 0.14407761, + "hetGenotypeFreq": 0.47437012, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.61873734, + "refHomGenotypeFreq": 0.38155228, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38260868, + "altHomGenotypeFreq": 0.17391305, + "hetGenotypeFreq": 0.4173913, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.6173913, + "refHomGenotypeFreq": 0.40869564, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31740615, + "altHomGenotypeFreq": 0.11945392, + "hetGenotypeFreq": 0.39590445, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6825939, + "refHomGenotypeFreq": 0.48464164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38392857, + "altHomGenotypeFreq": 0.16964285, + "hetGenotypeFreq": 0.42857143, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6160714, + "refHomGenotypeFreq": 0.4017857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48765433, + "altHomGenotypeFreq": 0.24691358, + "hetGenotypeFreq": 0.4814815, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5123457, + "refHomGenotypeFreq": 0.27160493, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38711396, + "altHomGenotypeFreq": 0.14057508, + "hetGenotypeFreq": 0.49307775, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6128861, + "refHomGenotypeFreq": 0.36634716, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40985474, + "altHomGenotypeFreq": 0.15978354, + "hetGenotypeFreq": 0.5001424, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.59014523, + "refHomGenotypeFreq": 0.34007406, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32186732, + "altHomGenotypeFreq": 0.10380835, + "hetGenotypeFreq": 0.43611795, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.67813265, + "refHomGenotypeFreq": 0.4600737, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38744137, + "altHomGenotypeFreq": 0.14747263, + "hetGenotypeFreq": 0.47993746, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.6125586, + "refHomGenotypeFreq": 0.3725899, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37353325, + "altHomGenotypeFreq": 0.13983051, + "hetGenotypeFreq": 0.46740547, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.62646675, + "refHomGenotypeFreq": 0.392764, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49298596, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.50701404, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53125, + "altHomGenotypeFreq": 0.359375, + "hetGenotypeFreq": 0.34375, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.46875, + "refHomGenotypeFreq": 0.296875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53714055, + "altHomGenotypeFreq": 0.35223642, + "hetGenotypeFreq": 0.36980832, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.46285942, + "refHomGenotypeFreq": 0.27795526, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5777096, + "altHomGenotypeFreq": 0.3640082, + "hetGenotypeFreq": 0.42740285, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.42229038, + "refHomGenotypeFreq": 0.20858896, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5638298, + "altHomGenotypeFreq": 0.39361703, + "hetGenotypeFreq": 0.34042555, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.43617022, + "refHomGenotypeFreq": 0.26595744, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5735294, + "altHomGenotypeFreq": 0.38235295, + "hetGenotypeFreq": 0.38235295, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.42647058, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49848714, + "altHomGenotypeFreq": 0.3207262, + "hetGenotypeFreq": 0.35552195, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5015129, + "refHomGenotypeFreq": 0.3237519, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48095238, + "altHomGenotypeFreq": 0.31428573, + "hetGenotypeFreq": 0.33333334, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.5190476, + "refHomGenotypeFreq": 0.35238096, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5432692, + "altHomGenotypeFreq": 0.40384614, + "hetGenotypeFreq": 0.27884614, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.45673078, + "refHomGenotypeFreq": 0.31730768, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5972222, + "altHomGenotypeFreq": 0.42592594, + "hetGenotypeFreq": 0.3425926, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.4027778, + "refHomGenotypeFreq": 0.23148148, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5677083, + "altHomGenotypeFreq": 0.36458334, + "hetGenotypeFreq": 0.40625, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.43229166, + "refHomGenotypeFreq": 0.22916667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39823008, + "altHomGenotypeFreq": 0.22123894, + "hetGenotypeFreq": 0.3539823, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.6017699, + "refHomGenotypeFreq": 0.42477876, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6127451, + "altHomGenotypeFreq": 0.4019608, + "hetGenotypeFreq": 0.42156863, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.3872549, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.61538464, + "altHomGenotypeFreq": 0.3846154, + "hetGenotypeFreq": 0.4615385, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.3846154, + "refHomGenotypeFreq": 0.15384616, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5322581, + "altHomGenotypeFreq": 0.3548387, + "hetGenotypeFreq": 0.35483873, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.46774194, + "refHomGenotypeFreq": 0.29032257, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48989898, + "altHomGenotypeFreq": 0.32323232, + "hetGenotypeFreq": 0.3333333, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.510101, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5794392, + "altHomGenotypeFreq": 0.36448598, + "hetGenotypeFreq": 0.42990655, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.42056075, + "refHomGenotypeFreq": 0.20560747, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5988372, + "altHomGenotypeFreq": 0.3604651, + "hetGenotypeFreq": 0.47674417, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.4011628, + "refHomGenotypeFreq": 0.1627907, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5677083, + "altHomGenotypeFreq": 0.39583334, + "hetGenotypeFreq": 0.34375, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.43229166, + "refHomGenotypeFreq": 0.26041666, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47474748, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.36363637, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.5252525, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.479798, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.41414142, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.52020204, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6252485, + "altHomGenotypeFreq": 0.41749504, + "hetGenotypeFreq": 0.41550696, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.37475148, + "refHomGenotypeFreq": 0.16699801, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48360655, + "altHomGenotypeFreq": 0.36065573, + "hetGenotypeFreq": 0.24590164, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.5163934, + "refHomGenotypeFreq": 0.39344263, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4884726, + "altHomGenotypeFreq": 0.3314121, + "hetGenotypeFreq": 0.31412104, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.51152736, + "refHomGenotypeFreq": 0.35446686, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4882353, + "altHomGenotypeFreq": 0.29411766, + "hetGenotypeFreq": 0.3882353, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.5117647, + "refHomGenotypeFreq": 0.31764707, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5388349, + "altHomGenotypeFreq": 0.3106796, + "hetGenotypeFreq": 0.4563107, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.46116504, + "refHomGenotypeFreq": 0.23300971, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.64646465, + "altHomGenotypeFreq": 0.43434343, + "hetGenotypeFreq": 0.4242424, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.35353535, + "refHomGenotypeFreq": 0.14141414, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.64953274, + "altHomGenotypeFreq": 0.44859812, + "hetGenotypeFreq": 0.40186918, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.3504673, + "refHomGenotypeFreq": 0.1495327, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.26923078, + "hetGenotypeFreq": 0.34615386, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.3846154, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6363636, + "altHomGenotypeFreq": 0.45454547, + "hetGenotypeFreq": 0.36363637, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.36363637, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42941177, + "altHomGenotypeFreq": 0.31764707, + "hetGenotypeFreq": 0.22352943, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.57058823, + "refHomGenotypeFreq": 0.45882353, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4940476, + "altHomGenotypeFreq": 0.3313492, + "hetGenotypeFreq": 0.32539684, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.50595236, + "refHomGenotypeFreq": 0.34325397, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42718446, + "altHomGenotypeFreq": 0.26213592, + "hetGenotypeFreq": 0.33009708, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.57281554, + "refHomGenotypeFreq": 0.407767, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0018726592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0037453184, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.99812734, + "refHomGenotypeFreq": 0.9962547, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 21, + "copyNumber": 128.6, + "end": 23104943, + "percentageMatch": 0.92, + "period": 21, + "score": 3460, + "sequence": "TGCGGGAGCAGGAGGAGCAGA", + "source": "trf", + "start": 23102250 + }, + { + "chromosome": "15", + "consensusSize": 11, + "copyNumber": 163.6, + "end": 23104942, + "percentageMatch": 0.64, + "period": 9, + "score": 162, + "sequence": "GGAGCAGATGC", + "source": "trf", + "start": 23103229 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23103686, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23103686, + "id": "15:23103686:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 23103686, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000561118", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000561063", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-" + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000560859", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-" + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 3804, + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.03132832 + } + ], + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.05299999937415123, + "source": "phastCons" + }, + { + "score": 0.09200000017881393, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.18999958038330078, + "source": "cadd_raw" + }, + { + "score": 4.630000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000557922(ENSG00000259344):n.378+3556T>C", + "ENST00000558417(ENSG00000259425):n.3804A>G" + ], + "id": "rs28405611", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.46364054, + "altHomGenotypeFreq": 0.22267312, + "hetGenotypeFreq": 0.48193482, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5363595, + "refHomGenotypeFreq": 0.29539207, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50207037, + "altHomGenotypeFreq": 0.252588, + "hetGenotypeFreq": 0.49896482, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.4979296, + "refHomGenotypeFreq": 0.24844721, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32544756, + "altHomGenotypeFreq": 0.10741688, + "hetGenotypeFreq": 0.43606138, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.67455244, + "refHomGenotypeFreq": 0.45652175, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39855072, + "altHomGenotypeFreq": 0.1594203, + "hetGenotypeFreq": 0.47826087, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.60144925, + "refHomGenotypeFreq": 0.36231884, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.56333333, + "altHomGenotypeFreq": 0.32, + "hetGenotypeFreq": 0.48666668, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.43666667, + "refHomGenotypeFreq": 0.19333333, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48505747, + "altHomGenotypeFreq": 0.23563218, + "hetGenotypeFreq": 0.49885058, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5149425, + "refHomGenotypeFreq": 0.26551723, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53698206, + "altHomGenotypeFreq": 0.2892428, + "hetGenotypeFreq": 0.49547848, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.46301794, + "refHomGenotypeFreq": 0.21527871, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3522093, + "altHomGenotypeFreq": 0.12302326, + "hetGenotypeFreq": 0.4583721, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6477907, + "refHomGenotypeFreq": 0.41860464, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4597558, + "altHomGenotypeFreq": 0.217046, + "hetGenotypeFreq": 0.48541963, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.54024416, + "refHomGenotypeFreq": 0.29753438, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46843028, + "altHomGenotypeFreq": 0.22961122, + "hetGenotypeFreq": 0.47763813, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5315697, + "refHomGenotypeFreq": 0.29275066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.375, + "altHomGenotypeFreq": 0.140625, + "hetGenotypeFreq": 0.46875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.625, + "refHomGenotypeFreq": 0.390625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39676517, + "altHomGenotypeFreq": 0.17372204, + "hetGenotypeFreq": 0.44608626, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6032348, + "refHomGenotypeFreq": 0.38019168, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48773006, + "altHomGenotypeFreq": 0.22903885, + "hetGenotypeFreq": 0.5173824, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.5122699, + "refHomGenotypeFreq": 0.25357872, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4787234, + "altHomGenotypeFreq": 0.24468085, + "hetGenotypeFreq": 0.4680851, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.5212766, + "refHomGenotypeFreq": 0.28723404, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.27450982, + "hetGenotypeFreq": 0.4509804, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.27450982, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2927383, + "altHomGenotypeFreq": 0.098335855, + "hetGenotypeFreq": 0.38880485, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.70726174, + "refHomGenotypeFreq": 0.5128593, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30952382, + "altHomGenotypeFreq": 0.13333334, + "hetGenotypeFreq": 0.35238096, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.6904762, + "refHomGenotypeFreq": 0.51428574, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3653846, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.48076922, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.63461536, + "refHomGenotypeFreq": 0.39423078, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3148148, + "altHomGenotypeFreq": 0.074074075, + "hetGenotypeFreq": 0.4814815, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.6851852, + "refHomGenotypeFreq": 0.44444445, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47916666, + "altHomGenotypeFreq": 0.20833333, + "hetGenotypeFreq": 0.5416667, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.5208333, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19026549, + "altHomGenotypeFreq": 0.03539823, + "hetGenotypeFreq": 0.30973452, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.8097345, + "refHomGenotypeFreq": 0.65486723, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53431374, + "altHomGenotypeFreq": 0.25490198, + "hetGenotypeFreq": 0.5588236, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.46568626, + "refHomGenotypeFreq": 0.18627451, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5494506, + "altHomGenotypeFreq": 0.2967033, + "hetGenotypeFreq": 0.50549453, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.45054945, + "refHomGenotypeFreq": 0.1978022, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31182796, + "altHomGenotypeFreq": 0.086021505, + "hetGenotypeFreq": 0.45161292, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.68817204, + "refHomGenotypeFreq": 0.4623656, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3131313, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.44444445, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.68686867, + "refHomGenotypeFreq": 0.46464646, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50934577, + "altHomGenotypeFreq": 0.24299066, + "hetGenotypeFreq": 0.5327103, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.4906542, + "refHomGenotypeFreq": 0.22429906, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48255813, + "altHomGenotypeFreq": 0.22093023, + "hetGenotypeFreq": 0.5232558, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.51744187, + "refHomGenotypeFreq": 0.25581396, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.421875, + "altHomGenotypeFreq": 0.22916667, + "hetGenotypeFreq": 0.3854167, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.578125, + "refHomGenotypeFreq": 0.38541666, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3131313, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.44444445, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.68686867, + "refHomGenotypeFreq": 0.46464646, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28282827, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.3838384, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.7171717, + "refHomGenotypeFreq": 0.5252525, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54274356, + "altHomGenotypeFreq": 0.29025844, + "hetGenotypeFreq": 0.5049702, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.45725647, + "refHomGenotypeFreq": 0.20477137, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31967214, + "altHomGenotypeFreq": 0.13114753, + "hetGenotypeFreq": 0.37704918, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.6803279, + "refHomGenotypeFreq": 0.4918033, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3631124, + "altHomGenotypeFreq": 0.15850145, + "hetGenotypeFreq": 0.4092219, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6368876, + "refHomGenotypeFreq": 0.43227667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22352941, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.32941177, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.7764706, + "refHomGenotypeFreq": 0.6117647, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44174758, + "altHomGenotypeFreq": 0.18446602, + "hetGenotypeFreq": 0.5145631, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.55825245, + "refHomGenotypeFreq": 0.30097088, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.510101, + "altHomGenotypeFreq": 0.24242425, + "hetGenotypeFreq": 0.53535354, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.48989898, + "refHomGenotypeFreq": 0.22222222, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.59345794, + "altHomGenotypeFreq": 0.36448598, + "hetGenotypeFreq": 0.45794392, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.40654206, + "refHomGenotypeFreq": 0.17757009, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36057693, + "altHomGenotypeFreq": 0.15384616, + "hetGenotypeFreq": 0.41346154, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.6394231, + "refHomGenotypeFreq": 0.43269232, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55050504, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.49494952, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.44949496, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22941177, + "altHomGenotypeFreq": 0.08235294, + "hetGenotypeFreq": 0.29411766, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.7705882, + "refHomGenotypeFreq": 0.62352943, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32242063, + "altHomGenotypeFreq": 0.11309524, + "hetGenotypeFreq": 0.4186508, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.67757934, + "refHomGenotypeFreq": 0.46825397, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3106796, + "altHomGenotypeFreq": 0.1262136, + "hetGenotypeFreq": 0.36893204, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.6893204, + "refHomGenotypeFreq": 0.5048544, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.52434456, + "altHomGenotypeFreq": 0.31460676, + "hetGenotypeFreq": 0.41947564, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.47565544, + "refHomGenotypeFreq": 0.2659176, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5249934, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.4750066, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53217685, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.46782318, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5186819, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.48131812, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5315534, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.4684466, + "study": "UK10K" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23105196, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23105196, + "id": "15:23105196:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23105196, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "cdnaPosition": 293, + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000561118", + "exonOverlap": [ + { + "number": "3/3", + "percentage": 0.34364262 + } + ], + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "cdnaPosition": 296, + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000561063", + "exonOverlap": [ + { + "number": "3/3", + "percentage": 0.34364262 + } + ], + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000560859", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259425", + "ensemblTranscriptId": "ENST00000558417", + "geneName": "RP11-566K19.5", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": 0, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 3.5999999046325684, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000557922(ENSG00000259344):n.378+22T>C", + "ENST00000561118(ENSG00000259344):n.293T>C", + "ENST00000561063(ENSG00000259344):n.296T>C" + ], + "id": "rs1056969", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.01696701, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03393402, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.983033, + "refHomGenotypeFreq": 0.966066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.005458515, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01091703, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.99454147, + "refHomGenotypeFreq": 0.989083, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.036567163, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.073134325, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.96343285, + "refHomGenotypeFreq": 0.9268657, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.033333335, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06666667, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.96666664, + "refHomGenotypeFreq": 0.93333334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.006666667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.013333334, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.99333334, + "refHomGenotypeFreq": 0.9866667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 8.72093E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.001744186, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.9991279, + "refHomGenotypeFreq": 0.9982558, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 8.078632E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0016157264, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.9991921, + "refHomGenotypeFreq": 0.9983843, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.062479004, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12495801, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.937521, + "refHomGenotypeFreq": 0.87504196, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.017121032, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.034242064, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.982879, + "refHomGenotypeFreq": 0.9657579, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.016777435, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03355487, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.98322254, + "refHomGenotypeFreq": 0.96644515, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.002004008, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.997996, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0093632955, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.018726591, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9906367, + "refHomGenotypeFreq": 0.9812734, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + } + ], + "start": 23108730, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23108730, + "id": "15:23108730:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23108730, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000557922", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000561118", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000561063", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259344", + "ensemblTranscriptId": "ENST00000560859", + "geneName": "RP11-566K19.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000270628", + "ensemblTranscriptId": "ENST00000604568", + "geneName": "RP11-26F2.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.014000000432133675, + "source": "phastCons" + }, + { + "score": -2.1470000743865967, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.43000030517578125, + "source": "cadd_raw" + }, + { + "score": 0.33000001311302185, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs9744401", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.8089283, + "altHomGenotypeFreq": 0.65945315, + "hetGenotypeFreq": 0.29895037, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.19107166, + "refHomGenotypeFreq": 0.041596476, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78542095, + "altHomGenotypeFreq": 0.6221766, + "hetGenotypeFreq": 0.3264887, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.21457906, + "refHomGenotypeFreq": 0.0513347, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78070176, + "altHomGenotypeFreq": 0.6253133, + "hetGenotypeFreq": 0.31077695, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.21929824, + "refHomGenotypeFreq": 0.06390978, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77458036, + "altHomGenotypeFreq": 0.6211031, + "hetGenotypeFreq": 0.30695444, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.22541967, + "refHomGenotypeFreq": 0.07194245, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8245033, + "altHomGenotypeFreq": 0.6821192, + "hetGenotypeFreq": 0.28476822, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.17549668, + "refHomGenotypeFreq": 0.03311258, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71970135, + "altHomGenotypeFreq": 0.5226881, + "hetGenotypeFreq": 0.39402643, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.28029868, + "refHomGenotypeFreq": 0.083285466, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7829747, + "altHomGenotypeFreq": 0.61192036, + "hetGenotypeFreq": 0.3421088, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.21702525, + "refHomGenotypeFreq": 0.04597087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89970165, + "altHomGenotypeFreq": 0.80904293, + "hetGenotypeFreq": 0.18131742, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.10029837, + "refHomGenotypeFreq": 0.00963966, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8135414, + "altHomGenotypeFreq": 0.6665102, + "hetGenotypeFreq": 0.29406244, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.18645857, + "refHomGenotypeFreq": 0.039427366, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8032407, + "altHomGenotypeFreq": 0.6507523, + "hetGenotypeFreq": 0.30497685, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.19675925, + "refHomGenotypeFreq": 0.044270832, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.757515, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.24248497, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.765625, + "altHomGenotypeFreq": 0.59375, + "hetGenotypeFreq": 0.34375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.234375, + "refHomGenotypeFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8047125, + "altHomGenotypeFreq": 0.6573482, + "hetGenotypeFreq": 0.29472846, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.19528754, + "refHomGenotypeFreq": 0.047923323, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7494888, + "altHomGenotypeFreq": 0.5603272, + "hetGenotypeFreq": 0.3783231, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.25051126, + "refHomGenotypeFreq": 0.061349694, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7819149, + "altHomGenotypeFreq": 0.64893615, + "hetGenotypeFreq": 0.26595744, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.21808511, + "refHomGenotypeFreq": 0.08510638, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75, + "altHomGenotypeFreq": 0.5980392, + "hetGenotypeFreq": 0.30392158, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.25, + "refHomGenotypeFreq": 0.09803922, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9258699, + "altHomGenotypeFreq": 0.85476553, + "hetGenotypeFreq": 0.14220877, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.0741301, + "refHomGenotypeFreq": 0.0030257185, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7619048, + "altHomGenotypeFreq": 0.5714286, + "hetGenotypeFreq": 0.3809524, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.23809524, + "refHomGenotypeFreq": 0.04761905, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.69711536, + "altHomGenotypeFreq": 0.50961536, + "hetGenotypeFreq": 0.375, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.3028846, + "refHomGenotypeFreq": 0.115384616, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9490741, + "altHomGenotypeFreq": 0.8981481, + "hetGenotypeFreq": 0.10185185, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.050925925, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78125, + "altHomGenotypeFreq": 0.5833333, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.21875, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9424779, + "altHomGenotypeFreq": 0.88495576, + "hetGenotypeFreq": 0.11504425, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.057522126, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75980395, + "altHomGenotypeFreq": 0.57843137, + "hetGenotypeFreq": 0.3627451, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.24019608, + "refHomGenotypeFreq": 0.05882353, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7967033, + "altHomGenotypeFreq": 0.62637365, + "hetGenotypeFreq": 0.34065935, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.2032967, + "refHomGenotypeFreq": 0.032967035, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8064516, + "altHomGenotypeFreq": 0.6451613, + "hetGenotypeFreq": 0.32258064, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.19354838, + "refHomGenotypeFreq": 0.032258064, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75252527, + "altHomGenotypeFreq": 0.56565654, + "hetGenotypeFreq": 0.3737374, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.24747474, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73364484, + "altHomGenotypeFreq": 0.5233645, + "hetGenotypeFreq": 0.42056075, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.26635513, + "refHomGenotypeFreq": 0.056074765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70348835, + "altHomGenotypeFreq": 0.47674417, + "hetGenotypeFreq": 0.45348835, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.29651162, + "refHomGenotypeFreq": 0.069767445, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.921875, + "altHomGenotypeFreq": 0.84375, + "hetGenotypeFreq": 0.15625, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.078125, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.92424244, + "altHomGenotypeFreq": 0.8484849, + "hetGenotypeFreq": 0.15151516, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.07575758, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8939394, + "altHomGenotypeFreq": 0.7878788, + "hetGenotypeFreq": 0.21212122, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.10606061, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.776342, + "altHomGenotypeFreq": 0.5944334, + "hetGenotypeFreq": 0.3638171, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.22365806, + "refHomGenotypeFreq": 0.041749503, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8606557, + "altHomGenotypeFreq": 0.75409836, + "hetGenotypeFreq": 0.21311475, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.13934426, + "refHomGenotypeFreq": 0.032786883, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7579251, + "altHomGenotypeFreq": 0.6051873, + "hetGenotypeFreq": 0.3054755, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.24207492, + "refHomGenotypeFreq": 0.08933718, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9647059, + "altHomGenotypeFreq": 0.92941177, + "hetGenotypeFreq": 0.07058824, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.03529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.74757284, + "altHomGenotypeFreq": 0.5533981, + "hetGenotypeFreq": 0.38834953, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.2524272, + "refHomGenotypeFreq": 0.058252428, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7676768, + "altHomGenotypeFreq": 0.57575756, + "hetGenotypeFreq": 0.3838384, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.23232323, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7943925, + "altHomGenotypeFreq": 0.635514, + "hetGenotypeFreq": 0.317757, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.20560747, + "refHomGenotypeFreq": 0.046728972, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67788464, + "altHomGenotypeFreq": 0.5, + "hetGenotypeFreq": 0.35576922, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.3221154, + "refHomGenotypeFreq": 0.14423077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7929293, + "altHomGenotypeFreq": 0.61616164, + "hetGenotypeFreq": 0.35353535, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.20707071, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8235294, + "altHomGenotypeFreq": 0.69411767, + "hetGenotypeFreq": 0.25882354, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.1764706, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75992066, + "altHomGenotypeFreq": 0.59126985, + "hetGenotypeFreq": 0.33730158, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.24007936, + "refHomGenotypeFreq": 0.071428575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78640777, + "altHomGenotypeFreq": 0.6699029, + "hetGenotypeFreq": 0.2330097, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.21359223, + "refHomGenotypeFreq": 0.097087376, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23123116, + "id": "10741", + "percentageMatch": 0.969361, + "source": "genomicSuperDup", + "start": 23091797 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23117296, + "id": "10255", + "percentageMatch": 0.918093, + "source": "genomicSuperDup", + "start": 23109015 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23117298, + "id": "10254", + "percentageMatch": 0.919467, + "source": "genomicSuperDup", + "start": 23109015 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23117301, + "id": "10253", + "percentageMatch": 0.918688, + "source": "genomicSuperDup", + "start": 23109015 + } + ], + "start": 23116232, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23116232, + "id": "15:23116232:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 23116232, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259480", + "ensemblTranscriptId": "ENST00000558839", + "geneName": "RP11-26F2.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.840000033378601, + "source": "gerp" + }, + { + "score": 0.017999999225139618, + "source": "phastCons" + }, + { + "score": -1.4639999866485596, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.039999961853027344, + "source": "cadd_raw" + }, + { + "score": 2.2899999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558839(ENSG00000259480):n.414+201G>A" + ], + "id": "rs8033142", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.87393385, + "altHomGenotypeFreq": 0.7647325, + "hetGenotypeFreq": 0.21840268, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.12606616, + "refHomGenotypeFreq": 0.016864823, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8778004, + "altHomGenotypeFreq": 0.7678208, + "hetGenotypeFreq": 0.21995927, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.122199595, + "refHomGenotypeFreq": 0.012219959, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.945679, + "altHomGenotypeFreq": 0.89382714, + "hetGenotypeFreq": 0.1037037, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.054320987, + "refHomGenotypeFreq": 0.002469136, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9004796, + "altHomGenotypeFreq": 0.80815345, + "hetGenotypeFreq": 0.18465228, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.099520385, + "refHomGenotypeFreq": 0.007194245, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90066224, + "altHomGenotypeFreq": 0.81456953, + "hetGenotypeFreq": 0.17218544, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.09933775, + "refHomGenotypeFreq": 0.013245033, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8888889, + "altHomGenotypeFreq": 0.78808707, + "hetGenotypeFreq": 0.20160367, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.11111111, + "refHomGenotypeFreq": 0.010309278, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.884113, + "altHomGenotypeFreq": 0.7816873, + "hetGenotypeFreq": 0.20485139, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.11588698, + "refHomGenotypeFreq": 0.0134612825, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.83318037, + "altHomGenotypeFreq": 0.6959615, + "hetGenotypeFreq": 0.27443781, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.16681965, + "refHomGenotypeFreq": 0.029600734, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8744447, + "altHomGenotypeFreq": 0.76654196, + "hetGenotypeFreq": 0.21580547, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.12555529, + "refHomGenotypeFreq": 0.01765256, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8733025, + "altHomGenotypeFreq": 0.7624964, + "hetGenotypeFreq": 0.22161224, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.12669748, + "refHomGenotypeFreq": 0.01589136, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7825651, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.21743487, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9296875, + "altHomGenotypeFreq": 0.875, + "hetGenotypeFreq": 0.109375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.0703125, + "refHomGenotypeFreq": 0.015625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8771965, + "altHomGenotypeFreq": 0.7759585, + "hetGenotypeFreq": 0.20247604, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.12280352, + "refHomGenotypeFreq": 0.021565495, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8394683, + "altHomGenotypeFreq": 0.6993865, + "hetGenotypeFreq": 0.2801636, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.1605317, + "refHomGenotypeFreq": 0.020449897, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9361702, + "altHomGenotypeFreq": 0.87234044, + "hetGenotypeFreq": 0.12765957, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.06382979, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.79901963, + "altHomGenotypeFreq": 0.61764705, + "hetGenotypeFreq": 0.3627451, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.2009804, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.81467474, + "altHomGenotypeFreq": 0.68683815, + "hetGenotypeFreq": 0.25567323, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.18532526, + "refHomGenotypeFreq": 0.057488654, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9238095, + "altHomGenotypeFreq": 0.85714287, + "hetGenotypeFreq": 0.13333334, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.07619048, + "refHomGenotypeFreq": 0.00952381, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8942308, + "altHomGenotypeFreq": 0.8076923, + "hetGenotypeFreq": 0.17307693, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.10576923, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8148148, + "altHomGenotypeFreq": 0.7037037, + "hetGenotypeFreq": 0.22222224, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.18518518, + "refHomGenotypeFreq": 0.074074075, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8645833, + "altHomGenotypeFreq": 0.7395833, + "hetGenotypeFreq": 0.25, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.13541667, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7743363, + "altHomGenotypeFreq": 0.6283186, + "hetGenotypeFreq": 0.2920354, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.22566372, + "refHomGenotypeFreq": 0.07964602, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8480392, + "altHomGenotypeFreq": 0.7254902, + "hetGenotypeFreq": 0.24509805, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.15196079, + "refHomGenotypeFreq": 0.029411765, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9285714, + "altHomGenotypeFreq": 0.85714287, + "hetGenotypeFreq": 0.14285715, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.071428575, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9731183, + "altHomGenotypeFreq": 0.94623655, + "hetGenotypeFreq": 0.05376344, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.02688172, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.969697, + "altHomGenotypeFreq": 0.93939394, + "hetGenotypeFreq": 0.06060606, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.030303031, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90654206, + "altHomGenotypeFreq": 0.8130841, + "hetGenotypeFreq": 0.18691587, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.093457945, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.84302324, + "altHomGenotypeFreq": 0.7209302, + "hetGenotypeFreq": 0.24418604, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.15697674, + "refHomGenotypeFreq": 0.034883723, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.828125, + "altHomGenotypeFreq": 0.6875, + "hetGenotypeFreq": 0.28125, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.171875, + "refHomGenotypeFreq": 0.03125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8080808, + "altHomGenotypeFreq": 0.67676765, + "hetGenotypeFreq": 0.26262626, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.1919192, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8181818, + "altHomGenotypeFreq": 0.68686867, + "hetGenotypeFreq": 0.26262626, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.18181819, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.91053677, + "altHomGenotypeFreq": 0.8250497, + "hetGenotypeFreq": 0.17097417, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.08946322, + "refHomGenotypeFreq": 0.003976143, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8770492, + "altHomGenotypeFreq": 0.75409836, + "hetGenotypeFreq": 0.24590164, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.12295082, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9207493, + "altHomGenotypeFreq": 0.8443804, + "hetGenotypeFreq": 0.15273775, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.07925072, + "refHomGenotypeFreq": 0.0028818443, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8117647, + "altHomGenotypeFreq": 0.7058824, + "hetGenotypeFreq": 0.21176471, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.1882353, + "refHomGenotypeFreq": 0.08235294, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8446602, + "altHomGenotypeFreq": 0.69902915, + "hetGenotypeFreq": 0.29126215, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.1553398, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9141414, + "altHomGenotypeFreq": 0.83838385, + "hetGenotypeFreq": 0.15151516, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.08585858, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.88785046, + "altHomGenotypeFreq": 0.78504676, + "hetGenotypeFreq": 0.20560747, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.11214953, + "refHomGenotypeFreq": 0.009345794, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86538464, + "altHomGenotypeFreq": 0.7307692, + "hetGenotypeFreq": 0.26923078, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.13461539, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9191919, + "altHomGenotypeFreq": 0.83838385, + "hetGenotypeFreq": 0.16161616, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.08080808, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9647059, + "altHomGenotypeFreq": 0.92941177, + "hetGenotypeFreq": 0.07058824, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.03529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9325397, + "altHomGenotypeFreq": 0.87103176, + "hetGenotypeFreq": 0.12301588, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.06746032, + "refHomGenotypeFreq": 0.005952381, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.907767, + "altHomGenotypeFreq": 0.815534, + "hetGenotypeFreq": 0.18446602, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.09223301, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8932822, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.1067178, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.89003915, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.10996083, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8969901, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.10300986, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.88942826, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.110571735, + "study": "UK10K" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23146940, + "id": "10666", + "percentageMatch": 0.961478, + "source": "genomicSuperDup", + "start": 23124190 + } + ], + "start": 23140114, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23140114, + "id": "15:23140114:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 23140114, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259480", + "ensemblTranscriptId": "ENST00000558839", + "geneName": "RP11-26F2.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.5080000162124634, + "source": "gerp" + }, + { + "score": 0.30399999022483826, + "source": "phastCons" + }, + { + "score": 0.17299999296665192, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 4.079999923706055, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558839(ENSG00000259480):n.124+166C>G" + ], + "id": "rs2033551", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.41695267, + "altHomGenotypeFreq": 0.19568737, + "hetGenotypeFreq": 0.4425306, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.58304733, + "refHomGenotypeFreq": 0.36178204, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45204082, + "altHomGenotypeFreq": 0.20204082, + "hetGenotypeFreq": 0.5, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5479592, + "refHomGenotypeFreq": 0.29795918, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94074076, + "altHomGenotypeFreq": 0.8839506, + "hetGenotypeFreq": 0.11358025, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.05925926, + "refHomGenotypeFreq": 0.002469136, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44244605, + "altHomGenotypeFreq": 0.21342926, + "hetGenotypeFreq": 0.45803356, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.55755395, + "refHomGenotypeFreq": 0.32853717, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4205298, + "altHomGenotypeFreq": 0.17218544, + "hetGenotypeFreq": 0.49668875, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5794702, + "refHomGenotypeFreq": 0.33112583, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4400459, + "altHomGenotypeFreq": 0.19219737, + "hetGenotypeFreq": 0.49569708, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5599541, + "refHomGenotypeFreq": 0.31210557, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44237968, + "altHomGenotypeFreq": 0.19358289, + "hetGenotypeFreq": 0.49759358, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.55762035, + "refHomGenotypeFreq": 0.30882353, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2599954, + "altHomGenotypeFreq": 0.071001835, + "hetGenotypeFreq": 0.37798715, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7400046, + "refHomGenotypeFreq": 0.551011, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4182968, + "altHomGenotypeFreq": 0.20147593, + "hetGenotypeFreq": 0.4336418, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.5817032, + "refHomGenotypeFreq": 0.3648823, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41529104, + "altHomGenotypeFreq": 0.18853171, + "hetGenotypeFreq": 0.4535187, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.5847089, + "refHomGenotypeFreq": 0.3579496, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48096192, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5190381, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4765625, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.5234375, + "refHomGenotypeFreq": 0.296875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5235623, + "altHomGenotypeFreq": 0.32947284, + "hetGenotypeFreq": 0.3881789, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4764377, + "refHomGenotypeFreq": 0.28234825, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6206544, + "altHomGenotypeFreq": 0.3783231, + "hetGenotypeFreq": 0.4846626, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.3793456, + "refHomGenotypeFreq": 0.13701431, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44680852, + "altHomGenotypeFreq": 0.19148937, + "hetGenotypeFreq": 0.5106383, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.5531915, + "refHomGenotypeFreq": 0.29787233, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60294116, + "altHomGenotypeFreq": 0.37254903, + "hetGenotypeFreq": 0.46078432, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.3970588, + "refHomGenotypeFreq": 0.16666667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2118003, + "altHomGenotypeFreq": 0.045385778, + "hetGenotypeFreq": 0.33282906, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7881997, + "refHomGenotypeFreq": 0.62178516, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9238095, + "altHomGenotypeFreq": 0.85714287, + "hetGenotypeFreq": 0.13333334, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.07619048, + "refHomGenotypeFreq": 0.00952381, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88461536, + "altHomGenotypeFreq": 0.78846157, + "hetGenotypeFreq": 0.1923077, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.115384616, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15277778, + "altHomGenotypeFreq": 0.027777778, + "hetGenotypeFreq": 0.25, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.8472222, + "refHomGenotypeFreq": 0.7222222, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.59375, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.5833334, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.40625, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19026549, + "altHomGenotypeFreq": 0.053097345, + "hetGenotypeFreq": 0.27433628, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.8097345, + "refHomGenotypeFreq": 0.67256635, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64705884, + "altHomGenotypeFreq": 0.44117647, + "hetGenotypeFreq": 0.41176474, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.3529412, + "refHomGenotypeFreq": 0.14705883, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53846157, + "altHomGenotypeFreq": 0.2967033, + "hetGenotypeFreq": 0.4835165, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.46153846, + "refHomGenotypeFreq": 0.21978022, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9677419, + "altHomGenotypeFreq": 0.9354839, + "hetGenotypeFreq": 0.06451613, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.032258064, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46728972, + "altHomGenotypeFreq": 0.18691589, + "hetGenotypeFreq": 0.5607476, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.53271025, + "refHomGenotypeFreq": 0.25233644, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6395349, + "altHomGenotypeFreq": 0.39534885, + "hetGenotypeFreq": 0.4883721, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.3604651, + "refHomGenotypeFreq": 0.11627907, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20833333, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.29166666, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.7916667, + "refHomGenotypeFreq": 0.6458333, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18181819, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.32323232, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.8181818, + "refHomGenotypeFreq": 0.65656567, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26262626, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.42424244, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.7373737, + "refHomGenotypeFreq": 0.5252525, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4811133, + "altHomGenotypeFreq": 0.21471173, + "hetGenotypeFreq": 0.5328032, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.5188867, + "refHomGenotypeFreq": 0.2524851, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.352459, + "altHomGenotypeFreq": 0.06557377, + "hetGenotypeFreq": 0.57377046, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.647541, + "refHomGenotypeFreq": 0.36065573, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45821327, + "altHomGenotypeFreq": 0.2017291, + "hetGenotypeFreq": 0.5129683, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.54178673, + "refHomGenotypeFreq": 0.28530258, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19411765, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.29411766, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.80588233, + "refHomGenotypeFreq": 0.65882355, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6213592, + "altHomGenotypeFreq": 0.37864077, + "hetGenotypeFreq": 0.4854369, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.37864077, + "refHomGenotypeFreq": 0.13592233, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4090909, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.5555556, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.59090906, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49532712, + "altHomGenotypeFreq": 0.20560747, + "hetGenotypeFreq": 0.5794393, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.5046729, + "refHomGenotypeFreq": 0.21495327, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.17307693, + "hetGenotypeFreq": 0.53846157, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.28846154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.26262626, + "hetGenotypeFreq": 0.47474748, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.26262626, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4764706, + "altHomGenotypeFreq": 0.21176471, + "hetGenotypeFreq": 0.5294118, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.5235294, + "refHomGenotypeFreq": 0.25882354, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9255952, + "altHomGenotypeFreq": 0.85714287, + "hetGenotypeFreq": 0.13690478, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.07440476, + "refHomGenotypeFreq": 0.005952381, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9126214, + "altHomGenotypeFreq": 0.8252427, + "hetGenotypeFreq": 0.17475727, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.08737864, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46254683, + "altHomGenotypeFreq": 0.25093633, + "hetGenotypeFreq": 0.42322096, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5374532, + "refHomGenotypeFreq": 0.3258427, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47156838, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.52843165, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47509792, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.5249021, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4662688, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.5337312, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4770766, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.5229234, + "study": "UK10K" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23146940, + "id": "10666", + "percentageMatch": 0.961478, + "source": "genomicSuperDup", + "start": 23124190 + } + ], + "start": 23145708, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23145708, + "id": "15:23145708:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 23145708, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 55, + "ensemblGeneId": "ENSG00000259480", + "ensemblTranscriptId": "ENST00000558839", + "exonOverlap": [ + { + "number": "1/7", + "percentage": 0.8064516 + } + ], + "geneName": "RP11-26F2.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.01080000028014183, + "source": "gerp" + }, + { + "score": 0.08399999886751175, + "source": "phastCons" + }, + { + "score": -1.1690000295639038, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.1099996566772461, + "source": "cadd_raw" + }, + { + "score": 1.7200000286102295, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558839(ENSG00000259480):n.55G>C" + ], + "id": "rs11635337", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.09693778, + "altHomGenotypeFreq": 0.0112410365, + "hetGenotypeFreq": 0.1713935, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9030622, + "refHomGenotypeFreq": 0.81736547, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.114285715, + "altHomGenotypeFreq": 0.01632653, + "hetGenotypeFreq": 0.19591837, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.8857143, + "refHomGenotypeFreq": 0.78775513, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08076449, + "altHomGenotypeFreq": 0.007398274, + "hetGenotypeFreq": 0.14673243, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.9192355, + "refHomGenotypeFreq": 0.8458693, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.05861244, + "altHomGenotypeFreq": 0.004784689, + "hetGenotypeFreq": 0.1076555, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.94138753, + "refHomGenotypeFreq": 0.88755983, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0794702, + "altHomGenotypeFreq": 0.0066225166, + "hetGenotypeFreq": 0.14569536, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.9205298, + "refHomGenotypeFreq": 0.8476821, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12335432, + "altHomGenotypeFreq": 0.015455066, + "hetGenotypeFreq": 0.21579851, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.8766457, + "refHomGenotypeFreq": 0.76874644, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1286, + "altHomGenotypeFreq": 0.016, + "hetGenotypeFreq": 0.2252, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.8714, + "refHomGenotypeFreq": 0.7588, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.037253555, + "altHomGenotypeFreq": 0.0022925264, + "hetGenotypeFreq": 0.06992205, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.96274644, + "refHomGenotypeFreq": 0.9277854, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09643483, + "altHomGenotypeFreq": 0.01157218, + "hetGenotypeFreq": 0.16972531, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.90356517, + "refHomGenotypeFreq": 0.8187025, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09755921, + "altHomGenotypeFreq": 0.010831889, + "hetGenotypeFreq": 0.17345466, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.9024408, + "refHomGenotypeFreq": 0.81571347, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13927856, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.86072147, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.046875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.953125, + "refHomGenotypeFreq": 0.90625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.093250796, + "altHomGenotypeFreq": 0.013578275, + "hetGenotypeFreq": 0.15934505, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9067492, + "refHomGenotypeFreq": 0.8270767, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16768916, + "altHomGenotypeFreq": 0.024539877, + "hetGenotypeFreq": 0.28629857, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.83231086, + "refHomGenotypeFreq": 0.68916154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13297872, + "altHomGenotypeFreq": 0.021276595, + "hetGenotypeFreq": 0.22340426, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.86702126, + "refHomGenotypeFreq": 0.7553192, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14705883, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.29411766, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.85294116, + "refHomGenotypeFreq": 0.7058824, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0204236, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0408472, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9795764, + "refHomGenotypeFreq": 0.9591528, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.07619048, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15238096, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.9238095, + "refHomGenotypeFreq": 0.84761906, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.125, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.9375, + "refHomGenotypeFreq": 0.875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.009259259, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.018518519, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.9907407, + "refHomGenotypeFreq": 0.9814815, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.140625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.28125, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.859375, + "refHomGenotypeFreq": 0.71875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18627451, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.29411766, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.8137255, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22527473, + "altHomGenotypeFreq": 0.06593407, + "hetGenotypeFreq": 0.31868133, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.77472526, + "refHomGenotypeFreq": 0.61538464, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.021505376, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.021505376, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.97849464, + "refHomGenotypeFreq": 0.9677419, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.025252525, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.030303031, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.9747475, + "refHomGenotypeFreq": 0.959596, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13084112, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.24299064, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.86915886, + "refHomGenotypeFreq": 0.74766356, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18023255, + "altHomGenotypeFreq": 0.034883723, + "hetGenotypeFreq": 0.2906977, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.8197674, + "refHomGenotypeFreq": 0.6744186, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.015625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03125, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.984375, + "refHomGenotypeFreq": 0.96875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.030303031, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.060606062, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.969697, + "refHomGenotypeFreq": 0.93939394, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.045454547, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09090909, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.95454544, + "refHomGenotypeFreq": 0.90909094, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15805168, + "altHomGenotypeFreq": 0.029821074, + "hetGenotypeFreq": 0.25646123, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.84194833, + "refHomGenotypeFreq": 0.7137177, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04918033, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09836066, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.9508197, + "refHomGenotypeFreq": 0.90163934, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08789625, + "altHomGenotypeFreq": 0.011527377, + "hetGenotypeFreq": 0.15273777, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.9121038, + "refHomGenotypeFreq": 0.83573484, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.005882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.011764706, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.9941176, + "refHomGenotypeFreq": 0.9882353, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18446602, + "altHomGenotypeFreq": 0.048543688, + "hetGenotypeFreq": 0.27184466, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.815534, + "refHomGenotypeFreq": 0.6796116, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14141414, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.22222222, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.85858583, + "refHomGenotypeFreq": 0.74747473, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1682243, + "altHomGenotypeFreq": 0.018691588, + "hetGenotypeFreq": 0.2990654, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.8317757, + "refHomGenotypeFreq": 0.682243, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.125, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.21153846, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.875, + "refHomGenotypeFreq": 0.7692308, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13131313, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.2020202, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.86868685, + "refHomGenotypeFreq": 0.7676768, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.023529412, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.047058824, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.9764706, + "refHomGenotypeFreq": 0.9529412, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0.005952381, + "hetGenotypeFreq": 0.09920635, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.89484125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.08737864, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.1553398, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.9126214, + "refHomGenotypeFreq": 0.83495146, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.041198503, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08239701, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9588015, + "refHomGenotypeFreq": 0.917603, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13845544, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.86154455, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1348629, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.8651371, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.14037363, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.85962635, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1364617, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.86353827, + "study": "UK10K" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23146940, + "id": "10666", + "percentageMatch": 0.961478, + "source": "genomicSuperDup", + "start": 23124190 + } + ], + "start": 23145943, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23145943, + "id": "15:23145943:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 23145943, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259480", + "ensemblTranscriptId": "ENST00000558839", + "geneName": "RP11-26F2.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.2799999713897705, + "source": "gerp" + }, + { + "score": 0.08799999952316284, + "source": "phastCons" + }, + { + "score": -2.046999931335449, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.25, + "source": "cadd_raw" + }, + { + "score": 0.8700000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4778311", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.45369792, + "altHomGenotypeFreq": 0.20823766, + "hetGenotypeFreq": 0.49092048, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5463021, + "refHomGenotypeFreq": 0.30084187, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4732334, + "altHomGenotypeFreq": 0.20342612, + "hetGenotypeFreq": 0.53961456, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5267666, + "refHomGenotypeFreq": 0.25695932, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.94252163, + "altHomGenotypeFreq": 0.8875154, + "hetGenotypeFreq": 0.11001236, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.05747837, + "refHomGenotypeFreq": 0.0024721879, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4509804, + "altHomGenotypeFreq": 0.21323529, + "hetGenotypeFreq": 0.47549018, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.54901963, + "refHomGenotypeFreq": 0.3112745, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4513889, + "altHomGenotypeFreq": 0.18055555, + "hetGenotypeFreq": 0.5416667, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5486111, + "refHomGenotypeFreq": 0.2777778, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45347467, + "altHomGenotypeFreq": 0.19552414, + "hetGenotypeFreq": 0.5159011, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5465253, + "refHomGenotypeFreq": 0.28857478, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45983073, + "altHomGenotypeFreq": 0.19952823, + "hetGenotypeFreq": 0.52060497, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5401693, + "refHomGenotypeFreq": 0.27986678, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3309066, + "altHomGenotypeFreq": 0.08159341, + "hetGenotypeFreq": 0.49862638, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.66909343, + "refHomGenotypeFreq": 0.41978022, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4558546, + "altHomGenotypeFreq": 0.21531883, + "hetGenotypeFreq": 0.48107156, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.5441454, + "refHomGenotypeFreq": 0.3036096, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45102772, + "altHomGenotypeFreq": 0.19947056, + "hetGenotypeFreq": 0.5031143, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.5489723, + "refHomGenotypeFreq": 0.29741514, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.484375, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.46875, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.515625, + "refHomGenotypeFreq": 0.28125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5597045, + "altHomGenotypeFreq": 0.3290735, + "hetGenotypeFreq": 0.461262, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.44029552, + "refHomGenotypeFreq": 0.20966454, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.62474436, + "altHomGenotypeFreq": 0.3783231, + "hetGenotypeFreq": 0.49284256, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.3752556, + "refHomGenotypeFreq": 0.12883435, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4574468, + "altHomGenotypeFreq": 0.19148937, + "hetGenotypeFreq": 0.5319149, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.5425532, + "refHomGenotypeFreq": 0.27659574, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.60294116, + "altHomGenotypeFreq": 0.37254903, + "hetGenotypeFreq": 0.46078432, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.3970588, + "refHomGenotypeFreq": 0.16666667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32829046, + "altHomGenotypeFreq": 0.046898637, + "hetGenotypeFreq": 0.5627837, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.67170954, + "refHomGenotypeFreq": 0.3903177, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9238095, + "altHomGenotypeFreq": 0.85714287, + "hetGenotypeFreq": 0.13333334, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.07619048, + "refHomGenotypeFreq": 0.00952381, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8894231, + "altHomGenotypeFreq": 0.78846157, + "hetGenotypeFreq": 0.20192307, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.11057692, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30092594, + "altHomGenotypeFreq": 0.027777778, + "hetGenotypeFreq": 0.5462963, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.6990741, + "refHomGenotypeFreq": 0.42592594, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.59375, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.5833334, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.40625, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3318584, + "altHomGenotypeFreq": 0.053097345, + "hetGenotypeFreq": 0.5575221, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.6681416, + "refHomGenotypeFreq": 0.38938054, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6617647, + "altHomGenotypeFreq": 0.44117647, + "hetGenotypeFreq": 0.44117647, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.3382353, + "refHomGenotypeFreq": 0.11764706, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.55494505, + "altHomGenotypeFreq": 0.2967033, + "hetGenotypeFreq": 0.51648355, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.44505495, + "refHomGenotypeFreq": 0.18681319, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9677419, + "altHomGenotypeFreq": 0.9354839, + "hetGenotypeFreq": 0.06451613, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.032258064, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49532712, + "altHomGenotypeFreq": 0.18691589, + "hetGenotypeFreq": 0.6168224, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.5046729, + "refHomGenotypeFreq": 0.19626169, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6395349, + "altHomGenotypeFreq": 0.39534885, + "hetGenotypeFreq": 0.4883721, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.3604651, + "refHomGenotypeFreq": 0.11627907, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.328125, + "altHomGenotypeFreq": 0.052083332, + "hetGenotypeFreq": 0.5520833, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.671875, + "refHomGenotypeFreq": 0.39583334, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32828283, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.57575756, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.67171717, + "refHomGenotypeFreq": 0.3838384, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33838382, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.57575756, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.66161615, + "refHomGenotypeFreq": 0.37373737, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49304175, + "altHomGenotypeFreq": 0.21073559, + "hetGenotypeFreq": 0.5646123, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.50695825, + "refHomGenotypeFreq": 0.22465208, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40983605, + "altHomGenotypeFreq": 0.06557377, + "hetGenotypeFreq": 0.6885246, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.59016395, + "refHomGenotypeFreq": 0.24590164, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47262248, + "altHomGenotypeFreq": 0.2017291, + "hetGenotypeFreq": 0.54178673, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.52737755, + "refHomGenotypeFreq": 0.25648415, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2882353, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.48235297, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.7117647, + "refHomGenotypeFreq": 0.47058824, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6262136, + "altHomGenotypeFreq": 0.37864077, + "hetGenotypeFreq": 0.49514565, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.37378642, + "refHomGenotypeFreq": 0.1262136, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41414142, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.56565654, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5858586, + "refHomGenotypeFreq": 0.3030303, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49532712, + "altHomGenotypeFreq": 0.19626169, + "hetGenotypeFreq": 0.5981308, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.5046729, + "refHomGenotypeFreq": 0.20560747, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46153846, + "altHomGenotypeFreq": 0.17307693, + "hetGenotypeFreq": 0.5769231, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.53846157, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.510101, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.5151515, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.48989898, + "refHomGenotypeFreq": 0.23232323, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49411765, + "altHomGenotypeFreq": 0.21176471, + "hetGenotypeFreq": 0.5647059, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.5058824, + "refHomGenotypeFreq": 0.22352941, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9265873, + "altHomGenotypeFreq": 0.85714287, + "hetGenotypeFreq": 0.1388889, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.0734127, + "refHomGenotypeFreq": 0.003968254, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9126214, + "altHomGenotypeFreq": 0.8252427, + "hetGenotypeFreq": 0.17475727, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.08737864, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23159289, + "id": "10573", + "percentageMatch": 0.958349, + "source": "genomicSuperDup", + "start": 23146939 + } + ], + "start": 23147471, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23147471, + "id": "15:23147471:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 23147471, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000230856", + "ensemblTranscriptId": "ENST00000458160", + "geneName": "AC138649.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.309999942779541, + "source": "gerp" + }, + { + "score": 0.06599999964237213, + "source": "phastCons" + }, + { + "score": -1.8960000276565552, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "downstream_gene_variant", + "functionalScore": [ + { + "score": 0.06000041961669922, + "source": "cadd_raw" + }, + { + "score": 3.2200000286102295, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs10908263", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.9981259, + "altHomGenotypeFreq": 0.99625176, + "hetGenotypeFreq": 0.0037482227, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.0018741114, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9979592, + "altHomGenotypeFreq": 0.9959184, + "hetGenotypeFreq": 0.0040816325, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.0020408162, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99640286, + "altHomGenotypeFreq": 0.9928058, + "hetGenotypeFreq": 0.007194245, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.0035971224, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9988532, + "altHomGenotypeFreq": 0.9977064, + "hetGenotypeFreq": 0.0022935779, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.0011467889, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9976657, + "altHomGenotypeFreq": 0.99533147, + "hetGenotypeFreq": 0.0046685343, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.0023342671, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99839634, + "altHomGenotypeFreq": 0.9967927, + "hetGenotypeFreq": 0.003207331, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.0016036655, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99824643, + "altHomGenotypeFreq": 0.99649286, + "hetGenotypeFreq": 0.0035071312, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.0017535656, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9979769, + "altHomGenotypeFreq": 0.99595374, + "hetGenotypeFreq": 0.0040462427, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.0020231213, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.997996, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.002004008, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99840254, + "altHomGenotypeFreq": 0.99680513, + "hetGenotypeFreq": 0.0031948881, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.0015974441, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9969743, + "altHomGenotypeFreq": 0.9939486, + "hetGenotypeFreq": 0.006051437, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.0030257185, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99557525, + "altHomGenotypeFreq": 0.99115044, + "hetGenotypeFreq": 0.0088495575, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.0044247787, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.989011, + "altHomGenotypeFreq": 0.978022, + "hetGenotypeFreq": 0.021978023, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.010989011, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9970179, + "altHomGenotypeFreq": 0.9940358, + "hetGenotypeFreq": 0.0059642144, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.0029821075, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99855906, + "altHomGenotypeFreq": 0.9971182, + "hetGenotypeFreq": 0.0028818443, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.0014409221, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9823529, + "altHomGenotypeFreq": 0.9647059, + "hetGenotypeFreq": 0.03529412, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.01764706, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9951923, + "altHomGenotypeFreq": 0.99038464, + "hetGenotypeFreq": 0.009615385, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.0048076925, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9960328, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.0039672046, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9977616, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.0022383884, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99429166, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.005708355, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9978425, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.0021574972, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23159289, + "id": "10573", + "percentageMatch": 0.958349, + "source": "genomicSuperDup", + "start": 23146939 + } + ], + "start": 23155215, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23155215, + "id": "15:23155215:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 23155215, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259174", + "ensemblTranscriptId": "ENST00000559896", + "geneName": "RP11-1180F24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -0.45399999618530273, + "source": "gerp" + }, + { + "score": 0.02199999988079071, + "source": "phastCons" + }, + { + "score": 0.32899999618530273, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 1.309999942779541, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1994761", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.22310758, + "altHomGenotypeFreq": 8.4767315E-5, + "hetGenotypeFreq": 0.4460456, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7768924, + "refHomGenotypeFreq": 0.5538696, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24932614, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.49865228, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.75067383, + "refHomGenotypeFreq": 0.5013477, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 6.165228E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0012330456, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.99938345, + "refHomGenotypeFreq": 0.99876696, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07857143, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15714286, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.92142856, + "refHomGenotypeFreq": 0.8428571, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13559322, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.27118644, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.86440676, + "refHomGenotypeFreq": 0.7288136, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34092695, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6818539, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.65907305, + "refHomGenotypeFreq": 0.3181461, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28994727, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.57989454, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.7100527, + "refHomGenotypeFreq": 0.42010543, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13830417, + "altHomGenotypeFreq": 2.96472E-4, + "hetGenotypeFreq": 0.27601543, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.8616958, + "refHomGenotypeFreq": 0.7236881, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21596639, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.43193278, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.7840336, + "refHomGenotypeFreq": 0.56806725, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23200685, + "altHomGenotypeFreq": 1.9040366E-4, + "hetGenotypeFreq": 0.4636329, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.76799315, + "refHomGenotypeFreq": 0.5361767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.02247191, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04494382, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9775281, + "refHomGenotypeFreq": 0.9550562, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23181942, + "id": "7635", + "percentageMatch": 0.914351, + "source": "genomicSuperDup", + "start": 23165146 + } + ], + "start": 23181922, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23181922, + "id": "15:23181922:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 23181922, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 208, + "ensemblGeneId": "ENSG00000259174", + "ensemblTranscriptId": "ENST00000559896", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.14184397 + } + ], + "geneName": "RP11-1180F24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.03099999949336052, + "source": "phastCons" + }, + { + "score": 0.11299999803304672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.039999961853027344, + "source": "cadd_raw" + }, + { + "score": 2.990000009536743, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559896(ENSG00000259174):n.208A>G" + ], + "id": "rs371836", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.046910983, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.093821965, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.953089, + "refHomGenotypeFreq": 0.90617806, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0639881, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1279762, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.9360119, + "refHomGenotypeFreq": 0.8720238, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.024926687, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.049853373, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.97507334, + "refHomGenotypeFreq": 0.9501466, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.050847456, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10169491, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.9491525, + "refHomGenotypeFreq": 0.89830506, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09803922, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19607843, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.9019608, + "refHomGenotypeFreq": 0.8039216, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.041428026, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08285605, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.958572, + "refHomGenotypeFreq": 0.91714394, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.05540839, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11081678, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9445916, + "refHomGenotypeFreq": 0.8891832, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.045421902, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.090843804, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.9545781, + "refHomGenotypeFreq": 0.9091562, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04878877, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09757754, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.9512112, + "refHomGenotypeFreq": 0.9024225, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + } + ], + "start": 23182145, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23182145, + "id": "15:23182145:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23182145, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 212, + "ensemblGeneId": "ENSG00000259174", + "ensemblTranscriptId": "ENST00000559896", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.14184397 + } + ], + "geneName": "RP11-1180F24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.026000000536441803, + "source": "phastCons" + }, + { + "score": -1.3890000581741333, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 3.690000057220459, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559896(ENSG00000259174):n.212A>G" + ], + "id": "rs371829", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.04809221, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09618442, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9519078, + "refHomGenotypeFreq": 0.90381557, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.07017544, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14035088, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.9298246, + "refHomGenotypeFreq": 0.8596491, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.024495678, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.048991356, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.97550434, + "refHomGenotypeFreq": 0.9510086, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.054166667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.108333334, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.9458333, + "refHomGenotypeFreq": 0.89166665, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09699893, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19399786, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.90300107, + "refHomGenotypeFreq": 0.80600214, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.044070363, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.088140726, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.95592964, + "refHomGenotypeFreq": 0.9118593, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.05354782, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10709564, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9464522, + "refHomGenotypeFreq": 0.89290434, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.047014657, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.094029315, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.95298535, + "refHomGenotypeFreq": 0.9059707, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.049440715, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09888143, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.95055926, + "refHomGenotypeFreq": 0.9011186, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + } + ], + "start": 23182149, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23182149, + "id": "15:23182149:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23182149, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 260, + "ensemblGeneId": "ENSG00000259174", + "ensemblTranscriptId": "ENST00000559896", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.14184397 + } + ], + "geneName": "RP11-1180F24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.029999999329447746, + "source": "phastCons" + }, + { + "score": -1.6109999418258667, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.4200000762939453, + "source": "cadd_raw" + }, + { + "score": 6.829999923706055, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559896(ENSG00000259174):n.260C>T" + ], + "id": "rs28561424", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.06731492, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13462985, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9326851, + "refHomGenotypeFreq": 0.86537015, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08647799, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17295597, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.913522, + "refHomGenotypeFreq": 0.827044, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 6.6225167E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0013245033, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.99933773, + "refHomGenotypeFreq": 0.9986755, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.02529762, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05059524, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.97470236, + "refHomGenotypeFreq": 0.9494048, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0862069, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1724138, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.9137931, + "refHomGenotypeFreq": 0.82758623, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.099236645, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19847329, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.90076333, + "refHomGenotypeFreq": 0.8015267, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.064970605, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12994121, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.9350294, + "refHomGenotypeFreq": 0.8700588, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.08721532, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17443064, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9127847, + "refHomGenotypeFreq": 0.82556933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06742978, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13485956, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.9325702, + "refHomGenotypeFreq": 0.86514044, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06716963, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13433926, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.9328304, + "refHomGenotypeFreq": 0.8656607, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + } + ], + "start": 23182197, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23182197, + "id": "15:23182197:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 23182197, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 330, + "ensemblGeneId": "ENSG00000259174", + "ensemblTranscriptId": "ENST00000559896", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.14184397 + } + ], + "geneName": "RP11-1180F24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.06400000303983688, + "source": "phastCons" + }, + { + "score": 0.1340000033378601, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.11999988555908203, + "source": "cadd_raw" + }, + { + "score": 3.8399999141693115, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559896(ENSG00000259174):n.330G>A" + ], + "id": "rs12050782", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.46845183, + "altHomGenotypeFreq": 0.22651525, + "hetGenotypeFreq": 0.48387313, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5315482, + "refHomGenotypeFreq": 0.2896116, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5170213, + "altHomGenotypeFreq": 0.23617022, + "hetGenotypeFreq": 0.56170213, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.48297873, + "refHomGenotypeFreq": 0.20212767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.875, + "altHomGenotypeFreq": 0.77146465, + "hetGenotypeFreq": 0.20707071, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.125, + "refHomGenotypeFreq": 0.021464646, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5831325, + "altHomGenotypeFreq": 0.34698796, + "hetGenotypeFreq": 0.47228914, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.41686746, + "refHomGenotypeFreq": 0.18072289, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46283785, + "altHomGenotypeFreq": 0.20945945, + "hetGenotypeFreq": 0.5067568, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5371622, + "refHomGenotypeFreq": 0.2837838, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5511765, + "altHomGenotypeFreq": 0.29764706, + "hetGenotypeFreq": 0.5070588, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.44882354, + "refHomGenotypeFreq": 0.19529411, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53220814, + "altHomGenotypeFreq": 0.25133616, + "hetGenotypeFreq": 0.56174403, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.46779186, + "refHomGenotypeFreq": 0.18691984, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23640217, + "altHomGenotypeFreq": 0.04261832, + "hetGenotypeFreq": 0.3875677, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.76359785, + "refHomGenotypeFreq": 0.56981397, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46557596, + "altHomGenotypeFreq": 0.22369541, + "hetGenotypeFreq": 0.4837611, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.534424, + "refHomGenotypeFreq": 0.2925435, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4720012, + "altHomGenotypeFreq": 0.22999549, + "hetGenotypeFreq": 0.4840114, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.5279988, + "refHomGenotypeFreq": 0.2859931, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43987975, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5601202, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6171875, + "altHomGenotypeFreq": 0.3125, + "hetGenotypeFreq": 0.609375, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.3828125, + "refHomGenotypeFreq": 0.078125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50758785, + "altHomGenotypeFreq": 0.26597443, + "hetGenotypeFreq": 0.48322684, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.49241215, + "refHomGenotypeFreq": 0.25079873, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5899795, + "altHomGenotypeFreq": 0.28425357, + "hetGenotypeFreq": 0.6114519, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.41002044, + "refHomGenotypeFreq": 0.10429448, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46276596, + "altHomGenotypeFreq": 0.18085106, + "hetGenotypeFreq": 0.5638298, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.53723407, + "refHomGenotypeFreq": 0.25531915, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6127451, + "altHomGenotypeFreq": 0.30392158, + "hetGenotypeFreq": 0.61764705, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.3872549, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19894099, + "altHomGenotypeFreq": 0.012102874, + "hetGenotypeFreq": 0.37367624, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.801059, + "refHomGenotypeFreq": 0.61422086, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.82857144, + "altHomGenotypeFreq": 0.6952381, + "hetGenotypeFreq": 0.26666668, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.17142858, + "refHomGenotypeFreq": 0.03809524, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8125, + "altHomGenotypeFreq": 0.65384614, + "hetGenotypeFreq": 0.31730768, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.1875, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17592593, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35185185, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.8240741, + "refHomGenotypeFreq": 0.6481481, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5989583, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.59375, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.40104166, + "refHomGenotypeFreq": 0.104166664, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22566372, + "altHomGenotypeFreq": 0.017699115, + "hetGenotypeFreq": 0.4159292, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.7743363, + "refHomGenotypeFreq": 0.5663717, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5833333, + "altHomGenotypeFreq": 0.28431374, + "hetGenotypeFreq": 0.5980392, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.41666666, + "refHomGenotypeFreq": 0.11764706, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.521978, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.5824176, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.47802198, + "refHomGenotypeFreq": 0.18681319, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7311828, + "altHomGenotypeFreq": 0.5591398, + "hetGenotypeFreq": 0.34408602, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.26881722, + "refHomGenotypeFreq": 0.09677419, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.81313133, + "altHomGenotypeFreq": 0.65656567, + "hetGenotypeFreq": 0.31313133, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.18686868, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46728972, + "altHomGenotypeFreq": 0.13084112, + "hetGenotypeFreq": 0.6728972, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.53271025, + "refHomGenotypeFreq": 0.19626169, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56395346, + "altHomGenotypeFreq": 0.27906978, + "hetGenotypeFreq": 0.5697675, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.4360465, + "refHomGenotypeFreq": 0.15116279, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19270833, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.34375, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.8072917, + "refHomGenotypeFreq": 0.6354167, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18686868, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.37373737, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.81313133, + "refHomGenotypeFreq": 0.6262626, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17676768, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35353535, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.82323235, + "refHomGenotypeFreq": 0.64646465, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5049702, + "altHomGenotypeFreq": 0.18489066, + "hetGenotypeFreq": 0.640159, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.4950298, + "refHomGenotypeFreq": 0.1749503, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31967214, + "altHomGenotypeFreq": 0.06557377, + "hetGenotypeFreq": 0.5081967, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.6803279, + "refHomGenotypeFreq": 0.4262295, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.54034585, + "altHomGenotypeFreq": 0.26224783, + "hetGenotypeFreq": 0.556196, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.45965418, + "refHomGenotypeFreq": 0.1815562, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15294118, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30588236, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.84705883, + "refHomGenotypeFreq": 0.69411767, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5873786, + "altHomGenotypeFreq": 0.2524272, + "hetGenotypeFreq": 0.6699029, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.41262135, + "refHomGenotypeFreq": 0.0776699, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4949495, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.64646465, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5050505, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.55140185, + "altHomGenotypeFreq": 0.23364486, + "hetGenotypeFreq": 0.635514, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.44859812, + "refHomGenotypeFreq": 0.13084112, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5144231, + "altHomGenotypeFreq": 0.24038461, + "hetGenotypeFreq": 0.5480769, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.48557693, + "refHomGenotypeFreq": 0.21153846, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48989898, + "altHomGenotypeFreq": 0.16161616, + "hetGenotypeFreq": 0.65656567, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.510101, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6, + "altHomGenotypeFreq": 0.34117648, + "hetGenotypeFreq": 0.5176471, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.4, + "refHomGenotypeFreq": 0.14117648, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8125, + "altHomGenotypeFreq": 0.66468257, + "hetGenotypeFreq": 0.29563493, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.1875, + "refHomGenotypeFreq": 0.03968254, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.86893207, + "altHomGenotypeFreq": 0.74757284, + "hetGenotypeFreq": 0.24271846, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.13106796, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38202247, + "altHomGenotypeFreq": 0.23220974, + "hetGenotypeFreq": 0.29962546, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6179775, + "refHomGenotypeFreq": 0.4681648, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + } + ], + "start": 23182267, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23182267, + "id": "15:23182267:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 23182267, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "cdnaPosition": 1941, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "exonOverlap": [ + { + "number": "10/11", + "percentage": 1.1235955 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "retained_intron", + "cdnaPosition": 247, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000558484", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.2710027 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 1598, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "exonOverlap": [ + { + "number": "8/8", + "percentage": 1.1235955 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.09300000220537186, + "source": "gerp" + }, + { + "score": 0.017999999225139618, + "source": "phastCons" + }, + { + "score": -1.437000036239624, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.5100002288818359, + "source": "cadd_raw" + }, + { + "score": 0.20999999344348907, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.1941G>A", + "ENST00000558484(ENSG00000187667):n.247G>A", + "ENST00000340286(ENSG00000187667):n.1598G>A" + ], + "id": "rs7167486", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.4017782, + "altHomGenotypeFreq": 0.19073269, + "hetGenotypeFreq": 0.42209098, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.59822184, + "refHomGenotypeFreq": 0.38717633, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48863637, + "altHomGenotypeFreq": 0.22727273, + "hetGenotypeFreq": 0.52272725, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.5113636, + "refHomGenotypeFreq": 0.25, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36533666, + "altHomGenotypeFreq": 0.1234414, + "hetGenotypeFreq": 0.48379052, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.63466334, + "refHomGenotypeFreq": 0.39276809, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.54415274, + "altHomGenotypeFreq": 0.31264916, + "hetGenotypeFreq": 0.46300715, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.45584726, + "refHomGenotypeFreq": 0.22434367, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48322147, + "altHomGenotypeFreq": 0.20134228, + "hetGenotypeFreq": 0.5637584, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.5167785, + "refHomGenotypeFreq": 0.23489933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.52379584, + "altHomGenotypeFreq": 0.27293578, + "hetGenotypeFreq": 0.5017202, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.47620413, + "refHomGenotypeFreq": 0.22534403, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5265487, + "altHomGenotypeFreq": 0.2724591, + "hetGenotypeFreq": 0.5081791, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.47345132, + "refHomGenotypeFreq": 0.21936175, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11968757, + "altHomGenotypeFreq": 0.014013324, + "hetGenotypeFreq": 0.21134849, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.88031244, + "refHomGenotypeFreq": 0.7746382, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39545667, + "altHomGenotypeFreq": 0.18889411, + "hetGenotypeFreq": 0.41312516, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.6045433, + "refHomGenotypeFreq": 0.39798075, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4095922, + "altHomGenotypeFreq": 0.19300537, + "hetGenotypeFreq": 0.43317372, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.5904078, + "refHomGenotypeFreq": 0.37382093, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50701404, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.49298596, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.546875, + "altHomGenotypeFreq": 0.3125, + "hetGenotypeFreq": 0.46875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.453125, + "refHomGenotypeFreq": 0.21875, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3430511, + "altHomGenotypeFreq": 0.1557508, + "hetGenotypeFreq": 0.37460065, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.65694886, + "refHomGenotypeFreq": 0.46964857, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44580778, + "altHomGenotypeFreq": 0.21472393, + "hetGenotypeFreq": 0.46216768, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.55419225, + "refHomGenotypeFreq": 0.32310838, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.54787236, + "altHomGenotypeFreq": 0.27659574, + "hetGenotypeFreq": 0.5425532, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.45212767, + "refHomGenotypeFreq": 0.18085106, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44607842, + "altHomGenotypeFreq": 0.24509804, + "hetGenotypeFreq": 0.4019608, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.5539216, + "refHomGenotypeFreq": 0.3529412, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.053706504, + "altHomGenotypeFreq": 0.004538578, + "hetGenotypeFreq": 0.098335855, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9462935, + "refHomGenotypeFreq": 0.89712554, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34285715, + "altHomGenotypeFreq": 0.13333334, + "hetGenotypeFreq": 0.41904762, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.6571429, + "refHomGenotypeFreq": 0.44761905, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2451923, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.35576922, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.7548077, + "refHomGenotypeFreq": 0.5769231, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.032407407, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06481481, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.9675926, + "refHomGenotypeFreq": 0.9351852, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40104166, + "altHomGenotypeFreq": 0.13541667, + "hetGenotypeFreq": 0.53125, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.5989583, + "refHomGenotypeFreq": 0.33333334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.013274336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.026548672, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.9867257, + "refHomGenotypeFreq": 0.9734513, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42156863, + "altHomGenotypeFreq": 0.18627451, + "hetGenotypeFreq": 0.47058824, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.57843137, + "refHomGenotypeFreq": 0.34313726, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.510989, + "altHomGenotypeFreq": 0.21978022, + "hetGenotypeFreq": 0.5824176, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.489011, + "refHomGenotypeFreq": 0.1978022, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27419356, + "altHomGenotypeFreq": 0.09677419, + "hetGenotypeFreq": 0.35483873, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.7258065, + "refHomGenotypeFreq": 0.5483871, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3181818, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.45454547, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.6818182, + "refHomGenotypeFreq": 0.45454547, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4906542, + "altHomGenotypeFreq": 0.25233644, + "hetGenotypeFreq": 0.47663552, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.50934577, + "refHomGenotypeFreq": 0.27102804, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4883721, + "altHomGenotypeFreq": 0.26744187, + "hetGenotypeFreq": 0.44186047, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.5116279, + "refHomGenotypeFreq": 0.29069766, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.083333336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16666667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.9166667, + "refHomGenotypeFreq": 0.8333333, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.045454547, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09090909, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.95454544, + "refHomGenotypeFreq": 0.90909094, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07575758, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.13131313, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.92424244, + "refHomGenotypeFreq": 0.85858583, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.51789266, + "altHomGenotypeFreq": 0.25447315, + "hetGenotypeFreq": 0.526839, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.48210734, + "refHomGenotypeFreq": 0.21868788, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1557377, + "altHomGenotypeFreq": 0.032786883, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.8442623, + "refHomGenotypeFreq": 0.72131145, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5590778, + "altHomGenotypeFreq": 0.29682997, + "hetGenotypeFreq": 0.5244957, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.4409222, + "refHomGenotypeFreq": 0.17867436, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.011764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.023529412, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.9882353, + "refHomGenotypeFreq": 0.9764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47572815, + "altHomGenotypeFreq": 0.24271844, + "hetGenotypeFreq": 0.46601942, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.52427185, + "refHomGenotypeFreq": 0.29126215, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.54545456, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.50505054, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.45454547, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.21495327, + "hetGenotypeFreq": 0.57009345, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.21495327, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.53846157, + "altHomGenotypeFreq": 0.26923078, + "hetGenotypeFreq": 0.5384615, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.46153846, + "refHomGenotypeFreq": 0.1923077, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.54545456, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.50505054, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.45454547, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.60588235, + "altHomGenotypeFreq": 0.34117648, + "hetGenotypeFreq": 0.5294118, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.39411765, + "refHomGenotypeFreq": 0.12941177, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29960316, + "altHomGenotypeFreq": 0.10119048, + "hetGenotypeFreq": 0.39682537, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.70039684, + "refHomGenotypeFreq": 0.5019841, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31553397, + "altHomGenotypeFreq": 0.116504855, + "hetGenotypeFreq": 0.39805824, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.684466, + "refHomGenotypeFreq": 0.4854369, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44194758, + "altHomGenotypeFreq": 0.22846442, + "hetGenotypeFreq": 0.42696628, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5580524, + "refHomGenotypeFreq": 0.3445693, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + } + ], + "start": 23191502, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23191502, + "id": "15:23191502:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 23191502, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "cdnaPosition": 1934, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "exonOverlap": [ + { + "number": "10/11", + "percentage": 1.1235955 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "retained_intron", + "cdnaPosition": 240, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000558484", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.2710027 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 1591, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "exonOverlap": [ + { + "number": "8/8", + "percentage": 1.1235955 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.029999999329447746, + "source": "phastCons" + }, + { + "score": 0.11299999803304672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 1.4500000476837158, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.1934A>G", + "ENST00000558484(ENSG00000187667):n.240A>G", + "ENST00000340286(ENSG00000187667):n.1591A>G" + ], + "id": "rs7181814", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.7131323, + "altHomGenotypeFreq": 0.5819066, + "hetGenotypeFreq": 0.2625162, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.28683528, + "refHomGenotypeFreq": 0.15557717, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83811474, + "altHomGenotypeFreq": 0.7008197, + "hetGenotypeFreq": 0.27459016, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.16188525, + "refHomGenotypeFreq": 0.024590164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8926799, + "altHomGenotypeFreq": 0.79776675, + "hetGenotypeFreq": 0.18982631, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.1073201, + "refHomGenotypeFreq": 0.012406948, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8281623, + "altHomGenotypeFreq": 0.6968974, + "hetGenotypeFreq": 0.26252982, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.1718377, + "refHomGenotypeFreq": 0.040572792, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83557045, + "altHomGenotypeFreq": 0.6912752, + "hetGenotypeFreq": 0.2885906, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.16442953, + "refHomGenotypeFreq": 0.020134227, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88287514, + "altHomGenotypeFreq": 0.78064144, + "hetGenotypeFreq": 0.20446736, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.117124856, + "refHomGenotypeFreq": 0.01489118, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8883086, + "altHomGenotypeFreq": 0.7884023, + "hetGenotypeFreq": 0.1998125, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.111691445, + "refHomGenotypeFreq": 0.011785188, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28124282, + "altHomGenotypeFreq": 0.078941315, + "hetGenotypeFreq": 0.40483317, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.7186421, + "refHomGenotypeFreq": 0.5162256, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70714116, + "altHomGenotypeFreq": 0.5765713, + "hetGenotypeFreq": 0.26113978, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.2928588, + "refHomGenotypeFreq": 0.16228893, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72054553, + "altHomGenotypeFreq": 0.5885084, + "hetGenotypeFreq": 0.2642194, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.2793819, + "refHomGenotypeFreq": 0.1472722, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88977957, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.11022044, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8515625, + "altHomGenotypeFreq": 0.71875, + "hetGenotypeFreq": 0.265625, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.1484375, + "refHomGenotypeFreq": 0.015625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6703275, + "altHomGenotypeFreq": 0.5407348, + "hetGenotypeFreq": 0.2591853, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.32967252, + "refHomGenotypeFreq": 0.20007987, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83231086, + "altHomGenotypeFreq": 0.7014315, + "hetGenotypeFreq": 0.2617587, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.16768916, + "refHomGenotypeFreq": 0.036809817, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7712766, + "altHomGenotypeFreq": 0.63829786, + "hetGenotypeFreq": 0.26595744, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.2287234, + "refHomGenotypeFreq": 0.095744684, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8382353, + "altHomGenotypeFreq": 0.6960784, + "hetGenotypeFreq": 0.28431374, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.16176471, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18532526, + "altHomGenotypeFreq": 0.037821483, + "hetGenotypeFreq": 0.2950076, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.81467474, + "refHomGenotypeFreq": 0.66717094, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8857143, + "altHomGenotypeFreq": 0.8, + "hetGenotypeFreq": 0.17142858, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.114285715, + "refHomGenotypeFreq": 0.028571429, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8317308, + "altHomGenotypeFreq": 0.6923077, + "hetGenotypeFreq": 0.27884614, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.16826923, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1712963, + "altHomGenotypeFreq": 0.018518519, + "hetGenotypeFreq": 0.30555555, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.8287037, + "refHomGenotypeFreq": 0.6759259, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8697917, + "altHomGenotypeFreq": 0.7604167, + "hetGenotypeFreq": 0.21875, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.13020833, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18141593, + "altHomGenotypeFreq": 0.017699115, + "hetGenotypeFreq": 0.32743365, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.8185841, + "refHomGenotypeFreq": 0.65486723, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.79901963, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.2647059, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.2009804, + "refHomGenotypeFreq": 0.068627454, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8681319, + "altHomGenotypeFreq": 0.74725276, + "hetGenotypeFreq": 0.24175826, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.13186814, + "refHomGenotypeFreq": 0.010989011, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7903226, + "altHomGenotypeFreq": 0.6236559, + "hetGenotypeFreq": 0.3333333, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.20967741, + "refHomGenotypeFreq": 0.043010753, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83838385, + "altHomGenotypeFreq": 0.7070707, + "hetGenotypeFreq": 0.26262626, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.16161616, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8411215, + "altHomGenotypeFreq": 0.71028036, + "hetGenotypeFreq": 0.26168224, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.1588785, + "refHomGenotypeFreq": 0.028037382, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8313953, + "altHomGenotypeFreq": 0.6976744, + "hetGenotypeFreq": 0.26744187, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.16860466, + "refHomGenotypeFreq": 0.034883723, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21354167, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.3645833, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.7864583, + "refHomGenotypeFreq": 0.6041667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15151516, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.24242425, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.8484849, + "refHomGenotypeFreq": 0.72727275, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13636364, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.2121212, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.8636364, + "refHomGenotypeFreq": 0.75757575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8727634, + "altHomGenotypeFreq": 0.7614314, + "hetGenotypeFreq": 0.22266401, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.12723657, + "refHomGenotypeFreq": 0.015904572, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31967214, + "altHomGenotypeFreq": 0.13114753, + "hetGenotypeFreq": 0.37704918, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.6803279, + "refHomGenotypeFreq": 0.4918033, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.80835736, + "altHomGenotypeFreq": 0.6743516, + "hetGenotypeFreq": 0.2680115, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.19164266, + "refHomGenotypeFreq": 0.057636887, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1764706, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.25882354, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.8235294, + "refHomGenotypeFreq": 0.69411767, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8252427, + "altHomGenotypeFreq": 0.6893204, + "hetGenotypeFreq": 0.27184466, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.17475729, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8939394, + "altHomGenotypeFreq": 0.7979798, + "hetGenotypeFreq": 0.1919192, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.10606061, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8598131, + "altHomGenotypeFreq": 0.7383177, + "hetGenotypeFreq": 0.24299066, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.14018692, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78846157, + "altHomGenotypeFreq": 0.6442308, + "hetGenotypeFreq": 0.28846154, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.21153846, + "refHomGenotypeFreq": 0.067307696, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9040404, + "altHomGenotypeFreq": 0.8181818, + "hetGenotypeFreq": 0.17171717, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.0959596, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84117645, + "altHomGenotypeFreq": 0.7176471, + "hetGenotypeFreq": 0.24705884, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.15882353, + "refHomGenotypeFreq": 0.03529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85218257, + "altHomGenotypeFreq": 0.73214287, + "hetGenotypeFreq": 0.24007937, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.14781746, + "refHomGenotypeFreq": 0.027777778, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.907767, + "altHomGenotypeFreq": 0.8252427, + "hetGenotypeFreq": 0.16504854, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.09223301, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78089887, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.22846442, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.21910113, + "refHomGenotypeFreq": 0.10486891, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8968527, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.10314731, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8992725, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.100727476, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89517385, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.10482615, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8985976, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.10140237, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + } + ], + "start": 23191509, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23191509, + "id": "15:23191509:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 23191509, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000558484", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-" + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000560810", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.17000000178813934, + "source": "phastCons" + }, + { + "score": 0.10199999809265137, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.35000038146972656, + "source": "cadd_raw" + }, + { + "score": 6.210000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.1590-112A>G", + "ENST00000340286(ENSG00000187667):n.1247-112A>G" + ], + "id": "rs201624922", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.019169556, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.038339112, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.98083043, + "refHomGenotypeFreq": 0.96166086, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.025555555, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05111111, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.97444445, + "refHomGenotypeFreq": 0.9488889, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0074123987, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.014824797, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.9925876, + "refHomGenotypeFreq": 0.9851752, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.018716577, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.037433155, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.9812834, + "refHomGenotypeFreq": 0.96256685, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1037037, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2074074, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.8962963, + "refHomGenotypeFreq": 0.7925926, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.015725289, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.031450577, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.9842747, + "refHomGenotypeFreq": 0.96854943, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.026934307, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.053868614, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.9730657, + "refHomGenotypeFreq": 0.9461314, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.005958292, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.011916584, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9940417, + "refHomGenotypeFreq": 0.9880834, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.020110158, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.040220316, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.97988987, + "refHomGenotypeFreq": 0.9597797, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.018009478, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.036018956, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.9819905, + "refHomGenotypeFreq": 0.96398103, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269147, + "id": "9242", + "percentageMatch": 0.975146, + "source": "genomicSuperDup", + "start": 23194060 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269734, + "id": "9241", + "percentageMatch": 0.974579, + "source": "genomicSuperDup", + "start": 23194060 + } + ], + "start": 23195011, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23195011, + "id": "15:23195011:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 23195011, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 842, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000560810", + "exonOverlap": [ + { + "number": "4/4", + "percentage": 0.041169204 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.09300000220537186, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -1.4500000476837158, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.48999977111816406, + "source": "cadd_raw" + }, + { + "score": 0.23000000417232513, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.1293+157T>C", + "ENST00000340286(ENSG00000187667):n.1080+157T>C", + "ENST00000560810(ENSG00000187667):n.842T>C" + ], + "id": "rs376544", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.52183956, + "altHomGenotypeFreq": 0.28692427, + "hetGenotypeFreq": 0.4896402, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.46825564, + "refHomGenotypeFreq": 0.22343554, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54555553, + "altHomGenotypeFreq": 0.2888889, + "hetGenotypeFreq": 0.51555556, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.45333335, + "refHomGenotypeFreq": 0.19555555, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7496791, + "altHomGenotypeFreq": 0.563543, + "hetGenotypeFreq": 0.37227213, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.2503209, + "refHomGenotypeFreq": 0.06418485, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5508685, + "altHomGenotypeFreq": 0.30521092, + "hetGenotypeFreq": 0.49379653, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.44789082, + "refHomGenotypeFreq": 0.20099255, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55, + "altHomGenotypeFreq": 0.34285715, + "hetGenotypeFreq": 0.41428572, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.45, + "refHomGenotypeFreq": 0.24285714, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53872794, + "altHomGenotypeFreq": 0.3016373, + "hetGenotypeFreq": 0.47418135, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.46127203, + "refHomGenotypeFreq": 0.22418135, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5380403, + "altHomGenotypeFreq": 0.2958528, + "hetGenotypeFreq": 0.48495913, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.46166763, + "refHomGenotypeFreq": 0.21918808, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4380824, + "altHomGenotypeFreq": 0.20941637, + "hetGenotypeFreq": 0.52525747, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5279549, + "refHomGenotypeFreq": 0.26532614, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5246212, + "altHomGenotypeFreq": 0.2915404, + "hetGenotypeFreq": 0.48623735, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.4653409, + "refHomGenotypeFreq": 0.22222222, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5183789, + "altHomGenotypeFreq": 0.28118128, + "hetGenotypeFreq": 0.49387372, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.47188187, + "refHomGenotypeFreq": 0.22494502, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5480962, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.45190382, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.234375, + "hetGenotypeFreq": 0.53125, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.234375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5415335, + "altHomGenotypeFreq": 0.293131, + "hetGenotypeFreq": 0.49680513, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.45846644, + "refHomGenotypeFreq": 0.2100639, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5674847, + "altHomGenotypeFreq": 0.3190184, + "hetGenotypeFreq": 0.4969325, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.43251532, + "refHomGenotypeFreq": 0.18404908, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48404256, + "altHomGenotypeFreq": 0.18085106, + "hetGenotypeFreq": 0.60638297, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.5159575, + "refHomGenotypeFreq": 0.21276596, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5637255, + "altHomGenotypeFreq": 0.3529412, + "hetGenotypeFreq": 0.42156863, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.4362745, + "refHomGenotypeFreq": 0.2254902, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41981846, + "altHomGenotypeFreq": 0.14674735, + "hetGenotypeFreq": 0.5461422, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.58018154, + "refHomGenotypeFreq": 0.30711043, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7380952, + "altHomGenotypeFreq": 0.552381, + "hetGenotypeFreq": 0.37142858, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.26190478, + "refHomGenotypeFreq": 0.07619048, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7355769, + "altHomGenotypeFreq": 0.5192308, + "hetGenotypeFreq": 0.43269232, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.26442307, + "refHomGenotypeFreq": 0.048076924, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36574075, + "altHomGenotypeFreq": 0.1388889, + "hetGenotypeFreq": 0.4537037, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.6342593, + "refHomGenotypeFreq": 0.4074074, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.578125, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.5520833, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.421875, + "refHomGenotypeFreq": 0.14583333, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3539823, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.6548673, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.6460177, + "refHomGenotypeFreq": 0.31858408, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5833333, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.5, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.41666666, + "refHomGenotypeFreq": 0.16666667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.521978, + "altHomGenotypeFreq": 0.25274727, + "hetGenotypeFreq": 0.53846157, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.47802198, + "refHomGenotypeFreq": 0.20879121, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7580645, + "altHomGenotypeFreq": 0.5591398, + "hetGenotypeFreq": 0.39784947, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.24193548, + "refHomGenotypeFreq": 0.043010753, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7373737, + "altHomGenotypeFreq": 0.54545456, + "hetGenotypeFreq": 0.3838384, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.26262626, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53271025, + "altHomGenotypeFreq": 0.2897196, + "hetGenotypeFreq": 0.4859813, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.46728972, + "refHomGenotypeFreq": 0.22429906, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5813953, + "altHomGenotypeFreq": 0.3488372, + "hetGenotypeFreq": 0.46511626, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.41860464, + "refHomGenotypeFreq": 0.18604651, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.453125, + "altHomGenotypeFreq": 0.15625, + "hetGenotypeFreq": 0.59375, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.546875, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47474748, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.44444445, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.5252525, + "refHomGenotypeFreq": 0.3030303, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5151515, + "altHomGenotypeFreq": 0.23232323, + "hetGenotypeFreq": 0.56565654, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.4848485, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5149105, + "altHomGenotypeFreq": 0.27634194, + "hetGenotypeFreq": 0.47713718, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.48508945, + "refHomGenotypeFreq": 0.24652088, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45081967, + "altHomGenotypeFreq": 0.18032786, + "hetGenotypeFreq": 0.54098356, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.5491803, + "refHomGenotypeFreq": 0.27868852, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49279538, + "altHomGenotypeFreq": 0.21037464, + "hetGenotypeFreq": 0.5648415, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5072046, + "refHomGenotypeFreq": 0.22478387, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34117648, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.5647059, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.65882355, + "refHomGenotypeFreq": 0.3764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5339806, + "altHomGenotypeFreq": 0.26213592, + "hetGenotypeFreq": 0.5436893, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.46601942, + "refHomGenotypeFreq": 0.19417475, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48989898, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.43434343, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.510101, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.59345794, + "altHomGenotypeFreq": 0.37383178, + "hetGenotypeFreq": 0.43925232, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.40654206, + "refHomGenotypeFreq": 0.18691589, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48557693, + "altHomGenotypeFreq": 0.24038461, + "hetGenotypeFreq": 0.4903846, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.5144231, + "refHomGenotypeFreq": 0.26923078, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42929292, + "altHomGenotypeFreq": 0.18181819, + "hetGenotypeFreq": 0.4949495, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.5707071, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5058824, + "altHomGenotypeFreq": 0.1882353, + "hetGenotypeFreq": 0.63529414, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.49411765, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7361111, + "altHomGenotypeFreq": 0.53373015, + "hetGenotypeFreq": 0.4047619, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.2638889, + "refHomGenotypeFreq": 0.061507937, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.71359223, + "altHomGenotypeFreq": 0.49514562, + "hetGenotypeFreq": 0.43689322, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.28640777, + "refHomGenotypeFreq": 0.067961164, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269147, + "id": "9242", + "percentageMatch": 0.975146, + "source": "genomicSuperDup", + "start": 23194060 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269734, + "id": "9241", + "percentageMatch": 0.974579, + "source": "genomicSuperDup", + "start": 23194060 + } + ], + "start": 23200080, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23200080, + "id": "15:23200080:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23200080, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 834, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000560810", + "exonOverlap": [ + { + "number": "4/4", + "percentage": 0.041169204 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.007000000216066837, + "source": "phastCons" + }, + { + "score": -1.3890000581741333, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.06999969482421875, + "source": "cadd_raw" + }, + { + "score": 2.0399999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.1293+149T>C", + "ENST00000340286(ENSG00000187667):n.1080+149T>C", + "ENST00000560810(ENSG00000187667):n.834T>C" + ], + "id": "rs6606848", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.5226519, + "altHomGenotypeFreq": 0.2791617, + "hetGenotypeFreq": 0.48726273, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.47720698, + "refHomGenotypeFreq": 0.23357561, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5392377, + "altHomGenotypeFreq": 0.2735426, + "hetGenotypeFreq": 0.53139013, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.46076232, + "refHomGenotypeFreq": 0.19506727, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6352564, + "altHomGenotypeFreq": 0.42179486, + "hetGenotypeFreq": 0.42692307, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.3647436, + "refHomGenotypeFreq": 0.15128206, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.51625, + "altHomGenotypeFreq": 0.27, + "hetGenotypeFreq": 0.4925, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.48375, + "refHomGenotypeFreq": 0.2375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55244756, + "altHomGenotypeFreq": 0.34265736, + "hetGenotypeFreq": 0.41958043, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.44755244, + "refHomGenotypeFreq": 0.23776224, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.533123, + "altHomGenotypeFreq": 0.29842272, + "hetGenotypeFreq": 0.46940064, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.46687698, + "refHomGenotypeFreq": 0.23217666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.56142163, + "altHomGenotypeFreq": 0.32192892, + "hetGenotypeFreq": 0.4795753, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.43828344, + "refHomGenotypeFreq": 0.19849579, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42938554, + "altHomGenotypeFreq": 0.17145689, + "hetGenotypeFreq": 0.5158573, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.57061446, + "refHomGenotypeFreq": 0.31268582, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.525, + "altHomGenotypeFreq": 0.28358778, + "hetGenotypeFreq": 0.4832061, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.47480917, + "refHomGenotypeFreq": 0.23320611, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.51972747, + "altHomGenotypeFreq": 0.2736492, + "hetGenotypeFreq": 0.49231502, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.48019332, + "refHomGenotypeFreq": 0.2340358, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5390781, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.46092185, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.484375, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.46875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.515625, + "refHomGenotypeFreq": 0.28125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5129792, + "altHomGenotypeFreq": 0.26158148, + "hetGenotypeFreq": 0.5027955, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.48702076, + "refHomGenotypeFreq": 0.235623, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49386504, + "altHomGenotypeFreq": 0.25357872, + "hetGenotypeFreq": 0.4805726, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.506135, + "refHomGenotypeFreq": 0.26584867, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4574468, + "altHomGenotypeFreq": 0.18085106, + "hetGenotypeFreq": 0.5531915, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.5425532, + "refHomGenotypeFreq": 0.26595744, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.28431374, + "hetGenotypeFreq": 0.43137258, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.28431374, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4160363, + "altHomGenotypeFreq": 0.1452345, + "hetGenotypeFreq": 0.5416036, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5839637, + "refHomGenotypeFreq": 0.31316188, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6761905, + "altHomGenotypeFreq": 0.42857143, + "hetGenotypeFreq": 0.49523813, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.32380953, + "refHomGenotypeFreq": 0.07619048, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65384614, + "altHomGenotypeFreq": 0.41346154, + "hetGenotypeFreq": 0.48076925, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.34615386, + "refHomGenotypeFreq": 0.10576923, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4212963, + "altHomGenotypeFreq": 0.17592593, + "hetGenotypeFreq": 0.49074072, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.5787037, + "refHomGenotypeFreq": 0.33333334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.515625, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.53125, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.484375, + "refHomGenotypeFreq": 0.21875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3141593, + "altHomGenotypeFreq": 0.0088495575, + "hetGenotypeFreq": 0.6106195, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.6858407, + "refHomGenotypeFreq": 0.38053098, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50980395, + "altHomGenotypeFreq": 0.2254902, + "hetGenotypeFreq": 0.5686275, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.49019608, + "refHomGenotypeFreq": 0.20588236, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53846157, + "altHomGenotypeFreq": 0.2967033, + "hetGenotypeFreq": 0.4835165, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.46153846, + "refHomGenotypeFreq": 0.21978022, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6451613, + "altHomGenotypeFreq": 0.3548387, + "hetGenotypeFreq": 0.58064514, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.3548387, + "refHomGenotypeFreq": 0.06451613, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6212121, + "altHomGenotypeFreq": 0.3939394, + "hetGenotypeFreq": 0.45454547, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.37878788, + "refHomGenotypeFreq": 0.15151516, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55607474, + "altHomGenotypeFreq": 0.35514018, + "hetGenotypeFreq": 0.40186918, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.44392523, + "refHomGenotypeFreq": 0.24299066, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49418604, + "altHomGenotypeFreq": 0.29069766, + "hetGenotypeFreq": 0.40697676, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.50581396, + "refHomGenotypeFreq": 0.30232558, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44270834, + "altHomGenotypeFreq": 0.14583333, + "hetGenotypeFreq": 0.59375, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.5572917, + "refHomGenotypeFreq": 0.26041666, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4848485, + "altHomGenotypeFreq": 0.24242425, + "hetGenotypeFreq": 0.48484847, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.5151515, + "refHomGenotypeFreq": 0.27272728, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48989898, + "altHomGenotypeFreq": 0.23232323, + "hetGenotypeFreq": 0.5151515, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.510101, + "refHomGenotypeFreq": 0.25252524, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.528827, + "altHomGenotypeFreq": 0.31212723, + "hetGenotypeFreq": 0.43339962, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.47117296, + "refHomGenotypeFreq": 0.25447315, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4180328, + "altHomGenotypeFreq": 0.14754099, + "hetGenotypeFreq": 0.54098356, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.58196723, + "refHomGenotypeFreq": 0.3114754, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4855908, + "altHomGenotypeFreq": 0.2017291, + "hetGenotypeFreq": 0.56772333, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.51440924, + "refHomGenotypeFreq": 0.23054755, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34705883, + "altHomGenotypeFreq": 0.07058824, + "hetGenotypeFreq": 0.5529412, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.65294117, + "refHomGenotypeFreq": 0.3764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4514563, + "altHomGenotypeFreq": 0.22330096, + "hetGenotypeFreq": 0.4563107, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.5485437, + "refHomGenotypeFreq": 0.32038835, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.479798, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.41414142, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.52020204, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.60280377, + "altHomGenotypeFreq": 0.39252338, + "hetGenotypeFreq": 0.42056075, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.39719626, + "refHomGenotypeFreq": 0.18691589, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5192308, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.53846157, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.48076922, + "refHomGenotypeFreq": 0.21153846, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45959595, + "altHomGenotypeFreq": 0.23232323, + "hetGenotypeFreq": 0.45454547, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.540404, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4764706, + "altHomGenotypeFreq": 0.12941177, + "hetGenotypeFreq": 0.69411767, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.5235294, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6617063, + "altHomGenotypeFreq": 0.41269842, + "hetGenotypeFreq": 0.49801588, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.33829364, + "refHomGenotypeFreq": 0.08928572, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.70873785, + "altHomGenotypeFreq": 0.46601942, + "hetGenotypeFreq": 0.48543692, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.29126215, + "refHomGenotypeFreq": 0.048543688, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269147, + "id": "9242", + "percentageMatch": 0.975146, + "source": "genomicSuperDup", + "start": 23194060 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269734, + "id": "9241", + "percentageMatch": 0.974579, + "source": "genomicSuperDup", + "start": 23194060 + } + ], + "start": 23200088, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23200088, + "id": "15:23200088:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23200088, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "cdnaPosition": 1236, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "exonOverlap": [ + { + "number": "5/11", + "percentage": 0.5882353 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 1023, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "exonOverlap": [ + { + "number": "4/8", + "percentage": 0.5882353 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 628, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000560810", + "exonOverlap": [ + { + "number": "4/4", + "percentage": 0.041169204 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.11400000005960464, + "source": "phastCons" + }, + { + "score": 0.11299999803304672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.06000041961669922, + "source": "cadd_raw" + }, + { + "score": 2.109999895095825, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.1236A>G", + "ENST00000340286(ENSG00000187667):n.1023A>G", + "ENST00000560810(ENSG00000187667):n.628A>G" + ], + "id": "rs148910586", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.15851767, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31703535, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.84148234, + "refHomGenotypeFreq": 0.6829647, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18271334, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3654267, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.8172867, + "refHomGenotypeFreq": 0.6345733, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2602564, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5205128, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.7397436, + "refHomGenotypeFreq": 0.47948718, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2578534, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5157068, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7421466, + "refHomGenotypeFreq": 0.4842932, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16906475, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3381295, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.83093524, + "refHomGenotypeFreq": 0.6618705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21075402, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.42150804, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.78924596, + "refHomGenotypeFreq": 0.578492, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18667409, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.37334818, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.81332594, + "refHomGenotypeFreq": 0.6266518, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.060755335, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12151067, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9392447, + "refHomGenotypeFreq": 0.8784893, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15543504, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31087008, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.844565, + "refHomGenotypeFreq": 0.6891299, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16233766, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.32467532, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.83766234, + "refHomGenotypeFreq": 0.6753247, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14529058, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8547094, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1610487, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3220974, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8389513, + "refHomGenotypeFreq": 0.67790264, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269147, + "id": "9242", + "percentageMatch": 0.975146, + "source": "genomicSuperDup", + "start": 23194060 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269734, + "id": "9241", + "percentageMatch": 0.974579, + "source": "genomicSuperDup", + "start": 23194060 + } + ], + "start": 23200294, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "Q1A5X8_HUMAN" + } + } + ], + "heritableTraits": [], + "id": "COSM1317815", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "Q1A5X8_HUMAN" + } + } + ], + "heritableTraits": [], + "id": "COSM1317815", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:26496030" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "Q1A5X8_HUMAN" + } + } + ], + "heritableTraits": [], + "id": "COSM1317815", + "somaticInformation": { + "histologySubtype": "astrocytoma Grade IV", + "primaryHistology": "glioma", + "primarySite": "central nervous system", + "sampleSource": "cell-line", + "siteSubtype": "brain", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "Q1A5X8_HUMAN" + } + } + ], + "heritableTraits": [], + "id": "COSM1317815", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "Q1A5X8_HUMAN", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM1317815", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "Q1A5X8_HUMAN", + "histologySubtype": "", + "mutationId": "COSM1317815", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "Q1A5X8_HUMAN", + "histologySubtype": "astrocytoma Grade IV", + "mutationId": "COSM1317815", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "glioma", + "primarySite": "central nervous system", + "sampleSource": "cell-line", + "siteSubtype": "brain", + "tumourOrigin": "" + }, + { + "geneName": "Q1A5X8_HUMAN", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM1317815", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 23200294, + "id": "15:23200294:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 23200294, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "cdnaPosition": 1207, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "exonOverlap": [ + { + "number": "5/11", + "percentage": 0.5882353 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 994, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "exonOverlap": [ + { + "number": "4/8", + "percentage": 0.5882353 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 599, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000560810", + "exonOverlap": [ + { + "number": "4/4", + "percentage": 0.041169204 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.15000000596046448, + "source": "phastCons" + }, + { + "score": 0.11299999803304672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.19999980926513672, + "source": "cadd_raw" + }, + { + "score": 4.699999809265137, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.1207A>C", + "ENST00000340286(ENSG00000187667):n.994A>C", + "ENST00000560810(ENSG00000187667):n.599A>C" + ], + "id": "rs59830212", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.37052667, + "altHomGenotypeFreq": 0.10654963, + "hetGenotypeFreq": 0.5279541, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6294733, + "refHomGenotypeFreq": 0.36549628, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41804978, + "altHomGenotypeFreq": 0.12240664, + "hetGenotypeFreq": 0.5912863, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.5819502, + "refHomGenotypeFreq": 0.28630707, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.234375, + "altHomGenotypeFreq": 0.02875, + "hetGenotypeFreq": 0.41125, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.765625, + "refHomGenotypeFreq": 0.56, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3802469, + "altHomGenotypeFreq": 0.086419754, + "hetGenotypeFreq": 0.5876543, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.61975306, + "refHomGenotypeFreq": 0.32592592, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4047619, + "altHomGenotypeFreq": 0.14965986, + "hetGenotypeFreq": 0.5102041, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.5952381, + "refHomGenotypeFreq": 0.34013605, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43374926, + "altHomGenotypeFreq": 0.12715389, + "hetGenotypeFreq": 0.6131907, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.56625074, + "refHomGenotypeFreq": 0.2596554, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4305593, + "altHomGenotypeFreq": 0.13185625, + "hetGenotypeFreq": 0.5974061, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.56944066, + "refHomGenotypeFreq": 0.27073765, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24877924, + "altHomGenotypeFreq": 0.063993834, + "hetGenotypeFreq": 0.3695708, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.75122076, + "refHomGenotypeFreq": 0.56643534, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36416963, + "altHomGenotypeFreq": 0.10558475, + "hetGenotypeFreq": 0.5171697, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6358304, + "refHomGenotypeFreq": 0.37724552, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37837633, + "altHomGenotypeFreq": 0.10774106, + "hetGenotypeFreq": 0.54127055, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.62162364, + "refHomGenotypeFreq": 0.3509884, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4038076, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.59619236, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3895131, + "altHomGenotypeFreq": 0.11985019, + "hetGenotypeFreq": 0.53932583, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.61048687, + "refHomGenotypeFreq": 0.34082398, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269147, + "id": "9242", + "percentageMatch": 0.975146, + "source": "genomicSuperDup", + "start": 23194060 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269734, + "id": "9241", + "percentageMatch": 0.974579, + "source": "genomicSuperDup", + "start": 23194060 + } + ], + "start": 23200323, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23200323, + "id": "15:23200323:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 23200323, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000560810", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.5239999890327454, + "source": "gerp" + }, + { + "score": 0.06800000369548798, + "source": "phastCons" + }, + { + "score": 0.11299999803304672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 4.059999942779541, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.1123+50T>C", + "ENST00000340286(ENSG00000187667):n.911-175T>C", + "ENST00000560810(ENSG00000187667):n.516-175T>C" + ], + "id": "rs7177562", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.4541846, + "altHomGenotypeFreq": 0.20377108, + "hetGenotypeFreq": 0.500827, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5458154, + "refHomGenotypeFreq": 0.29540193, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47599164, + "altHomGenotypeFreq": 0.19624217, + "hetGenotypeFreq": 0.55949897, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.52400833, + "refHomGenotypeFreq": 0.24425887, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6218274, + "altHomGenotypeFreq": 0.40101522, + "hetGenotypeFreq": 0.44162437, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.37817258, + "refHomGenotypeFreq": 0.1573604, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45566502, + "altHomGenotypeFreq": 0.19704433, + "hetGenotypeFreq": 0.51724136, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.54433495, + "refHomGenotypeFreq": 0.2857143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.26712328, + "hetGenotypeFreq": 0.46575344, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.26712328, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46978194, + "altHomGenotypeFreq": 0.20872274, + "hetGenotypeFreq": 0.5221184, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.53021806, + "refHomGenotypeFreq": 0.26915887, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49111864, + "altHomGenotypeFreq": 0.23132204, + "hetGenotypeFreq": 0.51959324, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.50888133, + "refHomGenotypeFreq": 0.24908474, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35055608, + "altHomGenotypeFreq": 0.118164964, + "hetGenotypeFreq": 0.4647822, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6494439, + "refHomGenotypeFreq": 0.41705284, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45685643, + "altHomGenotypeFreq": 0.20837809, + "hetGenotypeFreq": 0.49695668, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.5431436, + "refHomGenotypeFreq": 0.29466525, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45086104, + "altHomGenotypeFreq": 0.19804038, + "hetGenotypeFreq": 0.50564134, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.54913896, + "refHomGenotypeFreq": 0.2963183, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49298596, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.50701404, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.421875, + "altHomGenotypeFreq": 0.21875, + "hetGenotypeFreq": 0.40625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.578125, + "refHomGenotypeFreq": 0.375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4538738, + "altHomGenotypeFreq": 0.22244409, + "hetGenotypeFreq": 0.46285942, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5461262, + "refHomGenotypeFreq": 0.3146965, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47137013, + "altHomGenotypeFreq": 0.22903885, + "hetGenotypeFreq": 0.4846626, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.52862984, + "refHomGenotypeFreq": 0.28629857, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42021278, + "altHomGenotypeFreq": 0.14893617, + "hetGenotypeFreq": 0.5425532, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.57978725, + "refHomGenotypeFreq": 0.30851063, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49509802, + "altHomGenotypeFreq": 0.27450982, + "hetGenotypeFreq": 0.44117647, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.50490195, + "refHomGenotypeFreq": 0.28431374, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2934947, + "altHomGenotypeFreq": 0.09984872, + "hetGenotypeFreq": 0.38729197, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7065053, + "refHomGenotypeFreq": 0.5128593, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6, + "altHomGenotypeFreq": 0.36190477, + "hetGenotypeFreq": 0.4761905, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.4, + "refHomGenotypeFreq": 0.16190477, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6923077, + "altHomGenotypeFreq": 0.47115386, + "hetGenotypeFreq": 0.4423077, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.30769232, + "refHomGenotypeFreq": 0.086538464, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30555555, + "altHomGenotypeFreq": 0.12962963, + "hetGenotypeFreq": 0.35185188, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.6944444, + "refHomGenotypeFreq": 0.5185185, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5104167, + "altHomGenotypeFreq": 0.21875, + "hetGenotypeFreq": 0.5833333, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.48958334, + "refHomGenotypeFreq": 0.19791667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18141593, + "altHomGenotypeFreq": 0.017699115, + "hetGenotypeFreq": 0.32743365, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.8185841, + "refHomGenotypeFreq": 0.65486723, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49019608, + "altHomGenotypeFreq": 0.2254902, + "hetGenotypeFreq": 0.5294118, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.50980395, + "refHomGenotypeFreq": 0.24509804, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.521978, + "altHomGenotypeFreq": 0.25274727, + "hetGenotypeFreq": 0.53846157, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.47802198, + "refHomGenotypeFreq": 0.20879121, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.58064514, + "altHomGenotypeFreq": 0.31182796, + "hetGenotypeFreq": 0.5376344, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.41935483, + "refHomGenotypeFreq": 0.15053764, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53535354, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.4848485, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.46464646, + "refHomGenotypeFreq": 0.22222222, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5373832, + "altHomGenotypeFreq": 0.27102804, + "hetGenotypeFreq": 0.5327103, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.46261683, + "refHomGenotypeFreq": 0.19626169, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4244186, + "altHomGenotypeFreq": 0.20930232, + "hetGenotypeFreq": 0.43023258, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.5755814, + "refHomGenotypeFreq": 0.3604651, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.328125, + "altHomGenotypeFreq": 0.114583336, + "hetGenotypeFreq": 0.4270833, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.671875, + "refHomGenotypeFreq": 0.45833334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34848484, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.39393938, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.6515151, + "refHomGenotypeFreq": 0.45454547, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36868685, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.43434343, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.63131315, + "refHomGenotypeFreq": 0.41414142, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5079523, + "altHomGenotypeFreq": 0.25447315, + "hetGenotypeFreq": 0.50695825, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.49204773, + "refHomGenotypeFreq": 0.23856859, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31967214, + "altHomGenotypeFreq": 0.09836066, + "hetGenotypeFreq": 0.44262296, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.6803279, + "refHomGenotypeFreq": 0.45901638, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42651296, + "altHomGenotypeFreq": 0.1757925, + "hetGenotypeFreq": 0.50144094, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.57348704, + "refHomGenotypeFreq": 0.32276657, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21764706, + "altHomGenotypeFreq": 0.03529412, + "hetGenotypeFreq": 0.3647059, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.7823529, + "refHomGenotypeFreq": 0.6, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43203884, + "altHomGenotypeFreq": 0.21359223, + "hetGenotypeFreq": 0.43689322, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.56796116, + "refHomGenotypeFreq": 0.34951457, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46969697, + "altHomGenotypeFreq": 0.21212122, + "hetGenotypeFreq": 0.5151515, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.530303, + "refHomGenotypeFreq": 0.27272728, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57009345, + "altHomGenotypeFreq": 0.34579438, + "hetGenotypeFreq": 0.44859815, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.42990655, + "refHomGenotypeFreq": 0.20560747, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45192307, + "altHomGenotypeFreq": 0.21153846, + "hetGenotypeFreq": 0.48076922, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.5480769, + "refHomGenotypeFreq": 0.30769232, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43434343, + "altHomGenotypeFreq": 0.18181819, + "hetGenotypeFreq": 0.50505054, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.56565654, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40588236, + "altHomGenotypeFreq": 0.12941177, + "hetGenotypeFreq": 0.5529412, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.59411764, + "refHomGenotypeFreq": 0.31764707, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.61210316, + "altHomGenotypeFreq": 0.37698412, + "hetGenotypeFreq": 0.4702381, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.38789684, + "refHomGenotypeFreq": 0.15277778, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6456311, + "altHomGenotypeFreq": 0.4368932, + "hetGenotypeFreq": 0.41747573, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.35436893, + "refHomGenotypeFreq": 0.14563107, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.052434456, + "altHomGenotypeFreq": 0.033707865, + "hetGenotypeFreq": 0.037453182, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.94756556, + "refHomGenotypeFreq": 0.92883897, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269147, + "id": "9242", + "percentageMatch": 0.975146, + "source": "genomicSuperDup", + "start": 23194060 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269734, + "id": "9241", + "percentageMatch": 0.974579, + "source": "genomicSuperDup", + "start": 23194060 + } + ], + "start": 23200581, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23200581, + "id": "15:23200581:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23200581, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "cdnaPosition": 1056, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "exonOverlap": [ + { + "number": "4/11", + "percentage": 0.6289308 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000560810", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.31700000166893005, + "source": "phastCons" + }, + { + "score": 0.11299999803304672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 5.710000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.1056T>A", + "ENST00000340286(ENSG00000187667):n.911-292T>A", + "ENST00000560810(ENSG00000187667):n.516-292T>A" + ], + "id": "rs58552405", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.871959, + "altHomGenotypeFreq": 0.7742109, + "hetGenotypeFreq": 0.19549628, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.12804101, + "refHomGenotypeFreq": 0.030292876, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9106383, + "altHomGenotypeFreq": 0.82978725, + "hetGenotypeFreq": 0.16170213, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.089361705, + "refHomGenotypeFreq": 0.008510638, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8748379, + "altHomGenotypeFreq": 0.76653695, + "hetGenotypeFreq": 0.21660182, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.12516212, + "refHomGenotypeFreq": 0.016861219, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9, + "altHomGenotypeFreq": 0.8153846, + "hetGenotypeFreq": 0.16923077, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.1, + "refHomGenotypeFreq": 0.015384615, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9131944, + "altHomGenotypeFreq": 0.8333333, + "hetGenotypeFreq": 0.15972222, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.08680555, + "refHomGenotypeFreq": 0.0069444445, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9729892, + "altHomGenotypeFreq": 0.9459784, + "hetGenotypeFreq": 0.054021608, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.027010804, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.95869356, + "altHomGenotypeFreq": 0.91917115, + "hetGenotypeFreq": 0.07904487, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.041306436, + "refHomGenotypeFreq": 0.0017839989, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67219174, + "altHomGenotypeFreq": 0.44335797, + "hetGenotypeFreq": 0.45766753, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.32780826, + "refHomGenotypeFreq": 0.09897448, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8688137, + "altHomGenotypeFreq": 0.76770985, + "hetGenotypeFreq": 0.20220767, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.13118632, + "refHomGenotypeFreq": 0.030082485, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.87584245, + "altHomGenotypeFreq": 0.7822375, + "hetGenotypeFreq": 0.18720983, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.124157555, + "refHomGenotypeFreq": 0.030552644, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8777555, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.12224449, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.875, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.25, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.125, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.82148564, + "altHomGenotypeFreq": 0.6952875, + "hetGenotypeFreq": 0.25239617, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.17851438, + "refHomGenotypeFreq": 0.052316293, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8854806, + "altHomGenotypeFreq": 0.7873211, + "hetGenotypeFreq": 0.19631901, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.114519425, + "refHomGenotypeFreq": 0.016359918, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.85638297, + "altHomGenotypeFreq": 0.7340425, + "hetGenotypeFreq": 0.24468085, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.14361702, + "refHomGenotypeFreq": 0.021276595, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9019608, + "altHomGenotypeFreq": 0.8039216, + "hetGenotypeFreq": 0.19607843, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.09803922, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.62632376, + "altHomGenotypeFreq": 0.40695915, + "hetGenotypeFreq": 0.4387292, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.37367624, + "refHomGenotypeFreq": 0.15431164, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86190474, + "altHomGenotypeFreq": 0.7619048, + "hetGenotypeFreq": 0.2, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.13809524, + "refHomGenotypeFreq": 0.03809524, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.83653843, + "altHomGenotypeFreq": 0.7019231, + "hetGenotypeFreq": 0.26923078, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.16346154, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6064815, + "altHomGenotypeFreq": 0.3888889, + "hetGenotypeFreq": 0.4351852, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.3935185, + "refHomGenotypeFreq": 0.17592593, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8958333, + "altHomGenotypeFreq": 0.8020833, + "hetGenotypeFreq": 0.1875, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.104166664, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5442478, + "altHomGenotypeFreq": 0.28318584, + "hetGenotypeFreq": 0.5221239, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.45575222, + "refHomGenotypeFreq": 0.19469027, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8872549, + "altHomGenotypeFreq": 0.7941176, + "hetGenotypeFreq": 0.18627451, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.1127451, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.94505495, + "altHomGenotypeFreq": 0.8901099, + "hetGenotypeFreq": 0.10989011, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.054945055, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7741935, + "altHomGenotypeFreq": 0.58064514, + "hetGenotypeFreq": 0.38709676, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.22580644, + "refHomGenotypeFreq": 0.032258064, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8080808, + "altHomGenotypeFreq": 0.67676765, + "hetGenotypeFreq": 0.26262626, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.1919192, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9392523, + "altHomGenotypeFreq": 0.8785047, + "hetGenotypeFreq": 0.12149533, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.060747664, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86627907, + "altHomGenotypeFreq": 0.76744187, + "hetGenotypeFreq": 0.19767442, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.13372093, + "refHomGenotypeFreq": 0.034883723, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6302083, + "altHomGenotypeFreq": 0.41666666, + "hetGenotypeFreq": 0.42708334, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.36979166, + "refHomGenotypeFreq": 0.15625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7070707, + "altHomGenotypeFreq": 0.5252525, + "hetGenotypeFreq": 0.36363637, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.2929293, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67676765, + "altHomGenotypeFreq": 0.47474748, + "hetGenotypeFreq": 0.4040404, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.32323232, + "refHomGenotypeFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9562624, + "altHomGenotypeFreq": 0.9125249, + "hetGenotypeFreq": 0.08747515, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.043737575, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6639344, + "altHomGenotypeFreq": 0.45901638, + "hetGenotypeFreq": 0.40983605, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.33606556, + "refHomGenotypeFreq": 0.13114753, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.88760805, + "altHomGenotypeFreq": 0.7867435, + "hetGenotypeFreq": 0.2017291, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.112391934, + "refHomGenotypeFreq": 0.011527377, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5764706, + "altHomGenotypeFreq": 0.32941177, + "hetGenotypeFreq": 0.49411768, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.42352942, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8737864, + "altHomGenotypeFreq": 0.7669903, + "hetGenotypeFreq": 0.21359223, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.1262136, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.94949496, + "altHomGenotypeFreq": 0.8989899, + "hetGenotypeFreq": 0.1010101, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.05050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.96728975, + "altHomGenotypeFreq": 0.93457943, + "hetGenotypeFreq": 0.06542056, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.03271028, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.92788464, + "altHomGenotypeFreq": 0.86538464, + "hetGenotypeFreq": 0.125, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.072115384, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.97979796, + "altHomGenotypeFreq": 0.959596, + "hetGenotypeFreq": 0.04040404, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.02020202, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.88235295, + "altHomGenotypeFreq": 0.7764706, + "hetGenotypeFreq": 0.21176471, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.11764706, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.83531743, + "altHomGenotypeFreq": 0.7043651, + "hetGenotypeFreq": 0.26190478, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.16468254, + "refHomGenotypeFreq": 0.03373016, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.88834953, + "altHomGenotypeFreq": 0.78640777, + "hetGenotypeFreq": 0.2038835, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.11165048, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0018726592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0037453184, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.99812734, + "refHomGenotypeFreq": 0.9962547, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269147, + "id": "9242", + "percentageMatch": 0.975146, + "source": "genomicSuperDup", + "start": 23194060 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269734, + "id": "9241", + "percentageMatch": 0.974579, + "source": "genomicSuperDup", + "start": 23194060 + } + ], + "start": 23200698, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23200698, + "id": "15:23200698:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 23200698, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000560810", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.3569999933242798, + "source": "gerp" + }, + { + "score": 0.45500001311302185, + "source": "phastCons" + }, + { + "score": 0.11299999803304672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 1.1599998474121094, + "source": "cadd_raw" + }, + { + "score": 11.579999923706055, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.657-22T>C", + "ENST00000340286(ENSG00000187667):n.603-22T>C", + "ENST00000560810(ENSG00000187667):n.208-22T>C" + ], + "id": "rs78309194", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 1.2984483E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 2.5968967E-4, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9998702, + "refHomGenotypeFreq": 0.9997403, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0010288066, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.002057613, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.99897116, + "refHomGenotypeFreq": 0.9979424, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.00243309, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.00486618, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.99756694, + "refHomGenotypeFreq": 0.9951338, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 6.688068E-5, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 1.3376136E-4, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.9999331, + "refHomGenotypeFreq": 0.99986625, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 1.17370895E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 2.3474179E-4, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.99988264, + "refHomGenotypeFreq": 0.9997653, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 1.4528549E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 2.9057098E-4, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.99985474, + "refHomGenotypeFreq": 0.9997094, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269147, + "id": "9242", + "percentageMatch": 0.975146, + "source": "genomicSuperDup", + "start": 23194060 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269734, + "id": "9241", + "percentageMatch": 0.974579, + "source": "genomicSuperDup", + "start": 23194060 + } + ], + "start": 23205220, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23205220, + "id": "15:23205220:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 23205220, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "cdnaPosition": 458, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000400153", + "exonOverlap": [ + { + "number": "1/11", + "percentage": 0.15243903 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000340286", + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "retained_intron", + "cdnaPosition": 9, + "ensemblGeneId": "ENSG00000187667", + "ensemblTranscriptId": "ENST00000560810", + "exonOverlap": [ + { + "number": "1/4", + "percentage": 0.4830918 + } + ], + "geneName": "WHAMMP3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.8450000286102295, + "source": "gerp" + }, + { + "score": 0.007000000216066837, + "source": "phastCons" + }, + { + "score": -1.3140000104904175, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.19999980926513672, + "source": "cadd_raw" + }, + { + "score": 4.679999828338623, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [ + { + "associationTypes": [ + "Biomarker" + ], + "id": "umls:C0032897", + "name": "Prader-Willi Syndrome", + "numberOfPubmeds": 1, + "score": 2.8350457E-4, + "source": "disgenet", + "sources": [ + "BeFree" + ] + } + ], + "hgvs": [ + "ENST00000400153(ENSG00000187667):n.458C>G", + "ENST00000340286(ENSG00000187667):n.602+176C>G", + "ENST00000560810(ENSG00000187667):n.9C>G" + ], + "id": "rs62000597", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.81568986, + "altHomGenotypeFreq": 0.6993212, + "hetGenotypeFreq": 0.23273724, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.18431014, + "refHomGenotypeFreq": 0.067941524, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88350517, + "altHomGenotypeFreq": 0.7814433, + "hetGenotypeFreq": 0.2041237, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.11649484, + "refHomGenotypeFreq": 0.01443299, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8625473, + "altHomGenotypeFreq": 0.74905425, + "hetGenotypeFreq": 0.22698613, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.1374527, + "refHomGenotypeFreq": 0.023959646, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8789346, + "altHomGenotypeFreq": 0.7723971, + "hetGenotypeFreq": 0.21307506, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.12106538, + "refHomGenotypeFreq": 0.014527845, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8874172, + "altHomGenotypeFreq": 0.78807944, + "hetGenotypeFreq": 0.1986755, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.11258278, + "refHomGenotypeFreq": 0.013245033, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94198734, + "altHomGenotypeFreq": 0.8879954, + "hetGenotypeFreq": 0.10798392, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.05801264, + "refHomGenotypeFreq": 0.004020678, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9388784, + "altHomGenotypeFreq": 0.8820602, + "hetGenotypeFreq": 0.11363637, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.06112157, + "refHomGenotypeFreq": 0.0043033888, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52684176, + "altHomGenotypeFreq": 0.2786428, + "hetGenotypeFreq": 0.49639785, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.47315827, + "refHomGenotypeFreq": 0.22495933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81190336, + "altHomGenotypeFreq": 0.69581616, + "hetGenotypeFreq": 0.23217443, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.18809664, + "refHomGenotypeFreq": 0.07200943, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82038903, + "altHomGenotypeFreq": 0.7036712, + "hetGenotypeFreq": 0.23343572, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.17961094, + "refHomGenotypeFreq": 0.062893085, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9308617, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.06913827, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8671875, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.234375, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.1328125, + "refHomGenotypeFreq": 0.015625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.76697284, + "altHomGenotypeFreq": 0.6285942, + "hetGenotypeFreq": 0.27675718, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.23302716, + "refHomGenotypeFreq": 0.09464856, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.87218815, + "altHomGenotypeFreq": 0.76891613, + "hetGenotypeFreq": 0.20654397, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.12781186, + "refHomGenotypeFreq": 0.024539877, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8351064, + "altHomGenotypeFreq": 0.7234042, + "hetGenotypeFreq": 0.22340426, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.16489361, + "refHomGenotypeFreq": 0.05319149, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.872549, + "altHomGenotypeFreq": 0.7647059, + "hetGenotypeFreq": 0.21568628, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.12745099, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44856277, + "altHomGenotypeFreq": 0.19213313, + "hetGenotypeFreq": 0.5128593, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5514372, + "refHomGenotypeFreq": 0.29500756, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88095236, + "altHomGenotypeFreq": 0.8, + "hetGenotypeFreq": 0.16190477, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.11904762, + "refHomGenotypeFreq": 0.03809524, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8605769, + "altHomGenotypeFreq": 0.75961536, + "hetGenotypeFreq": 0.20192307, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.13942307, + "refHomGenotypeFreq": 0.03846154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47685185, + "altHomGenotypeFreq": 0.21296297, + "hetGenotypeFreq": 0.5277778, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.5231481, + "refHomGenotypeFreq": 0.25925925, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8854167, + "altHomGenotypeFreq": 0.78125, + "hetGenotypeFreq": 0.20833333, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.114583336, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3141593, + "altHomGenotypeFreq": 0.07079646, + "hetGenotypeFreq": 0.48672566, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.6858407, + "refHomGenotypeFreq": 0.44247788, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.877451, + "altHomGenotypeFreq": 0.78431374, + "hetGenotypeFreq": 0.18627451, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.12254902, + "refHomGenotypeFreq": 0.029411765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94505495, + "altHomGenotypeFreq": 0.8901099, + "hetGenotypeFreq": 0.10989012, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.054945055, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78494626, + "altHomGenotypeFreq": 0.61290324, + "hetGenotypeFreq": 0.34408602, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.21505377, + "refHomGenotypeFreq": 0.043010753, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82828283, + "altHomGenotypeFreq": 0.7171717, + "hetGenotypeFreq": 0.22222222, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.17171717, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9018692, + "altHomGenotypeFreq": 0.8037383, + "hetGenotypeFreq": 0.19626167, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.098130845, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8604651, + "altHomGenotypeFreq": 0.75581396, + "hetGenotypeFreq": 0.20930234, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.13953489, + "refHomGenotypeFreq": 0.034883723, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5052083, + "altHomGenotypeFreq": 0.23958333, + "hetGenotypeFreq": 0.53125, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.49479166, + "refHomGenotypeFreq": 0.22916667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.510101, + "altHomGenotypeFreq": 0.23232323, + "hetGenotypeFreq": 0.5555556, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.48989898, + "refHomGenotypeFreq": 0.21212122, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5151515, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.5252525, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.4848485, + "refHomGenotypeFreq": 0.22222222, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9383698, + "altHomGenotypeFreq": 0.8807157, + "hetGenotypeFreq": 0.11530815, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.06163022, + "refHomGenotypeFreq": 0.003976143, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5163934, + "altHomGenotypeFreq": 0.27868852, + "hetGenotypeFreq": 0.47540984, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.48360655, + "refHomGenotypeFreq": 0.24590164, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8559078, + "altHomGenotypeFreq": 0.740634, + "hetGenotypeFreq": 0.23054755, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.14409222, + "refHomGenotypeFreq": 0.028818443, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32941177, + "altHomGenotypeFreq": 0.09411765, + "hetGenotypeFreq": 0.47058824, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.67058825, + "refHomGenotypeFreq": 0.43529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8640777, + "altHomGenotypeFreq": 0.75728154, + "hetGenotypeFreq": 0.21359223, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.13592233, + "refHomGenotypeFreq": 0.029126214, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94949496, + "altHomGenotypeFreq": 0.90909094, + "hetGenotypeFreq": 0.08080808, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.05050505, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94392526, + "altHomGenotypeFreq": 0.89719623, + "hetGenotypeFreq": 0.09345794, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.056074765, + "refHomGenotypeFreq": 0.009345794, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85096157, + "altHomGenotypeFreq": 0.7307692, + "hetGenotypeFreq": 0.24038461, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.14903846, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.95454544, + "altHomGenotypeFreq": 0.90909094, + "hetGenotypeFreq": 0.09090909, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.045454547, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.87647057, + "altHomGenotypeFreq": 0.7647059, + "hetGenotypeFreq": 0.22352943, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.12352941, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8501984, + "altHomGenotypeFreq": 0.7361111, + "hetGenotypeFreq": 0.22817461, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.14980158, + "refHomGenotypeFreq": 0.035714287, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88834953, + "altHomGenotypeFreq": 0.776699, + "hetGenotypeFreq": 0.22330098, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.11165048, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94485587, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.055144142, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9437605, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.056239508, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94628954, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.05371043, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9433657, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.056634303, + "study": "UK10K" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 23216152, + "id": "9224", + "percentageMatch": 0.983865, + "source": "genomicSuperDup", + "start": 23090899 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23208814, + "id": "9240", + "percentageMatch": 0.932698, + "source": "genomicSuperDup", + "start": 23190508 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269147, + "id": "9242", + "percentageMatch": 0.975146, + "source": "genomicSuperDup", + "start": 23194060 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 23269734, + "id": "9241", + "percentageMatch": 0.974579, + "source": "genomicSuperDup", + "start": 23194060 + } + ], + "start": 23207960, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 23207960, + "id": "15:23207960:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 23207960, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "geneName": "OR4N4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.10400000214576721, + "source": "gerp" + }, + { + "score": 0.004999999888241291, + "source": "phastCons" + }, + { + "score": 0.40400001406669617, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 0.6800000071525574, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-28705G>T", + "ENST00000558896(ENSG00000259176):n.973-2902G>T", + "ENST00000558312(ENSG00000259176):n.556-2902G>T", + "ENST00000558798(ENSG00000259176):n.556-28705G>T" + ], + "id": "rs2019679", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.2973392, + "altHomGenotypeFreq": 0.05783415, + "hetGenotypeFreq": 0.47901013, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7026608, + "refHomGenotypeFreq": 0.46315572, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33741647, + "altHomGenotypeFreq": 0.077951, + "hetGenotypeFreq": 0.518931, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.66258353, + "refHomGenotypeFreq": 0.40311804, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32738096, + "altHomGenotypeFreq": 0.044973545, + "hetGenotypeFreq": 0.5648148, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.67261904, + "refHomGenotypeFreq": 0.39021164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4160401, + "altHomGenotypeFreq": 0.15037593, + "hetGenotypeFreq": 0.5313283, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5839599, + "refHomGenotypeFreq": 0.31829575, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30769232, + "altHomGenotypeFreq": 0.06993007, + "hetGenotypeFreq": 0.4755245, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.6923077, + "refHomGenotypeFreq": 0.45454547, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3289554, + "altHomGenotypeFreq": 0.06719609, + "hetGenotypeFreq": 0.5235186, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6710446, + "refHomGenotypeFreq": 0.40928528, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32423037, + "altHomGenotypeFreq": 0.06752731, + "hetGenotypeFreq": 0.51340616, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.6757696, + "refHomGenotypeFreq": 0.41906655, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21612665, + "altHomGenotypeFreq": 0.027982326, + "hetGenotypeFreq": 0.37628865, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7838733, + "refHomGenotypeFreq": 0.595729, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29331005, + "altHomGenotypeFreq": 0.0556665, + "hetGenotypeFreq": 0.47528708, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.70668995, + "refHomGenotypeFreq": 0.46904644, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30230948, + "altHomGenotypeFreq": 0.060508084, + "hetGenotypeFreq": 0.48360276, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.69769055, + "refHomGenotypeFreq": 0.45588914, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32264528, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6773547, + "study": "GONL" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22379562, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22379562, + "id": "15:22379562:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22379562, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "geneName": "OR4N4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.11800000071525574, + "source": "gerp" + }, + { + "score": 0.012000000104308128, + "source": "phastCons" + }, + { + "score": 0.3319999873638153, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 1.7799999713897705, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-28587A>G", + "ENST00000558896(ENSG00000259176):n.973-2784A>G", + "ENST00000558312(ENSG00000259176):n.556-2784A>G", + "ENST00000558798(ENSG00000259176):n.556-28587A>G" + ], + "id": "rs4636875", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.43563202, + "altHomGenotypeFreq": 0.11598574, + "hetGenotypeFreq": 0.6392926, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.56436795, + "refHomGenotypeFreq": 0.2447217, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41318682, + "altHomGenotypeFreq": 0.0967033, + "hetGenotypeFreq": 0.63296705, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.5868132, + "refHomGenotypeFreq": 0.27032968, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38274044, + "altHomGenotypeFreq": 0.0513834, + "hetGenotypeFreq": 0.6627141, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.61725956, + "refHomGenotypeFreq": 0.2859025, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3972431, + "altHomGenotypeFreq": 0.13283208, + "hetGenotypeFreq": 0.52882206, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6027569, + "refHomGenotypeFreq": 0.33834586, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41724136, + "altHomGenotypeFreq": 0.13793103, + "hetGenotypeFreq": 0.5586207, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5827586, + "refHomGenotypeFreq": 0.3034483, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41363636, + "altHomGenotypeFreq": 0.09272727, + "hetGenotypeFreq": 0.64181817, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5863636, + "refHomGenotypeFreq": 0.26545453, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4247775, + "altHomGenotypeFreq": 0.1172482, + "hetGenotypeFreq": 0.6150586, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.5752225, + "refHomGenotypeFreq": 0.2676932, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47988296, + "altHomGenotypeFreq": 0.13484515, + "hetGenotypeFreq": 0.6900756, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.52011704, + "refHomGenotypeFreq": 0.17507926, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4386804, + "altHomGenotypeFreq": 0.12176938, + "hetGenotypeFreq": 0.6338221, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.5613196, + "refHomGenotypeFreq": 0.24440855, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43188074, + "altHomGenotypeFreq": 0.1088685, + "hetGenotypeFreq": 0.64602447, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5681193, + "refHomGenotypeFreq": 0.24510704, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46893787, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5310621, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3828125, + "altHomGenotypeFreq": 0.171875, + "hetGenotypeFreq": 0.421875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.6171875, + "refHomGenotypeFreq": 0.40625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4271166, + "altHomGenotypeFreq": 0.13977636, + "hetGenotypeFreq": 0.5746805, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.57288337, + "refHomGenotypeFreq": 0.28554314, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4202454, + "altHomGenotypeFreq": 0.1390593, + "hetGenotypeFreq": 0.5623722, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.5797546, + "refHomGenotypeFreq": 0.29856852, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3723404, + "altHomGenotypeFreq": 0.10638298, + "hetGenotypeFreq": 0.5319149, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.62765956, + "refHomGenotypeFreq": 0.3617021, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4509804, + "altHomGenotypeFreq": 0.14705883, + "hetGenotypeFreq": 0.60784316, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.54901963, + "refHomGenotypeFreq": 0.24509804, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48184568, + "altHomGenotypeFreq": 0.1709531, + "hetGenotypeFreq": 0.62178516, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5181543, + "refHomGenotypeFreq": 0.20726173, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32857144, + "altHomGenotypeFreq": 0.01904762, + "hetGenotypeFreq": 0.61904764, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.67142856, + "refHomGenotypeFreq": 0.36190477, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3653846, + "altHomGenotypeFreq": 0.10576923, + "hetGenotypeFreq": 0.5192307, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.63461536, + "refHomGenotypeFreq": 0.375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5324074, + "altHomGenotypeFreq": 0.21296297, + "hetGenotypeFreq": 0.63888884, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.4675926, + "refHomGenotypeFreq": 0.14814815, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4375, + "altHomGenotypeFreq": 0.15625, + "hetGenotypeFreq": 0.5625, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.5625, + "refHomGenotypeFreq": 0.28125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50442475, + "altHomGenotypeFreq": 0.22123894, + "hetGenotypeFreq": 0.5663717, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.49557522, + "refHomGenotypeFreq": 0.21238938, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40686274, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.46078432, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.59313726, + "refHomGenotypeFreq": 0.3627451, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43406594, + "altHomGenotypeFreq": 0.12087912, + "hetGenotypeFreq": 0.62637365, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.56593406, + "refHomGenotypeFreq": 0.25274727, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41935483, + "altHomGenotypeFreq": 0.12903225, + "hetGenotypeFreq": 0.5806452, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.58064514, + "refHomGenotypeFreq": 0.29032257, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46969697, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.6767677, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.530303, + "refHomGenotypeFreq": 0.1919192, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41121495, + "altHomGenotypeFreq": 0.1495327, + "hetGenotypeFreq": 0.5233645, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.58878505, + "refHomGenotypeFreq": 0.3271028, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38372093, + "altHomGenotypeFreq": 0.08139535, + "hetGenotypeFreq": 0.6046512, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.61627907, + "refHomGenotypeFreq": 0.3139535, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4375, + "altHomGenotypeFreq": 0.14583333, + "hetGenotypeFreq": 0.5833334, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.5625, + "refHomGenotypeFreq": 0.27083334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48989898, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.6969697, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.510101, + "refHomGenotypeFreq": 0.16161616, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43939394, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.53535354, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.56060606, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42942345, + "altHomGenotypeFreq": 0.13916501, + "hetGenotypeFreq": 0.5805169, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.57057655, + "refHomGenotypeFreq": 0.28031808, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45901638, + "altHomGenotypeFreq": 0.13114753, + "hetGenotypeFreq": 0.6557377, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.5409836, + "refHomGenotypeFreq": 0.21311475, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39337176, + "altHomGenotypeFreq": 0.15561959, + "hetGenotypeFreq": 0.47550434, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.60662824, + "refHomGenotypeFreq": 0.36887607, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49411765, + "altHomGenotypeFreq": 0.14117648, + "hetGenotypeFreq": 0.7058824, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.5058824, + "refHomGenotypeFreq": 0.15294118, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41747573, + "altHomGenotypeFreq": 0.1262136, + "hetGenotypeFreq": 0.5825243, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.5825243, + "refHomGenotypeFreq": 0.29126215, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42424244, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.5454545, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.57575756, + "refHomGenotypeFreq": 0.3030303, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44859812, + "altHomGenotypeFreq": 0.1495327, + "hetGenotypeFreq": 0.5981308, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.55140185, + "refHomGenotypeFreq": 0.25233644, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37980768, + "altHomGenotypeFreq": 0.14423077, + "hetGenotypeFreq": 0.47115386, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.6201923, + "refHomGenotypeFreq": 0.3846154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42929292, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.6161616, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.5707071, + "refHomGenotypeFreq": 0.26262626, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44117647, + "altHomGenotypeFreq": 0.21176471, + "hetGenotypeFreq": 0.45882356, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.5588235, + "refHomGenotypeFreq": 0.32941177, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3829365, + "altHomGenotypeFreq": 0.08928572, + "hetGenotypeFreq": 0.5873016, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.61706346, + "refHomGenotypeFreq": 0.3234127, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3398058, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.5436893, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.66019416, + "refHomGenotypeFreq": 0.3883495, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22379680, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22379680, + "id": "15:22379680:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22379680, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "geneName": "OR4N4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.0989999994635582, + "source": "phastCons" + }, + { + "score": 0, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.11999988555908203, + "source": "cadd_raw" + }, + { + "score": 3.9100000858306885, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-27335C>T", + "ENST00000558896(ENSG00000259176):n.973-1532C>T", + "ENST00000558312(ENSG00000259176):n.556-1532C>T", + "ENST00000558798(ENSG00000259176):n.556-27335C>T" + ], + "id": "rs559625", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.89943445, + "altHomGenotypeFreq": 0.8036593, + "hetGenotypeFreq": 0.19155024, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.10056554, + "refHomGenotypeFreq": 0.0047904192, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8976793, + "altHomGenotypeFreq": 0.8016878, + "hetGenotypeFreq": 0.19198312, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.10232068, + "refHomGenotypeFreq": 0.006329114, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9646402, + "altHomGenotypeFreq": 0.9305211, + "hetGenotypeFreq": 0.06823821, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.0353598, + "refHomGenotypeFreq": 0.0012406948, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9305211, + "altHomGenotypeFreq": 0.8610422, + "hetGenotypeFreq": 0.13895781, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.06947891, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8732877, + "altHomGenotypeFreq": 0.75342464, + "hetGenotypeFreq": 0.23972602, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.12671232, + "refHomGenotypeFreq": 0.006849315, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.92533803, + "altHomGenotypeFreq": 0.8559671, + "hetGenotypeFreq": 0.13874191, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.07466196, + "refHomGenotypeFreq": 0.005291005, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9037775, + "altHomGenotypeFreq": 0.81195056, + "hetGenotypeFreq": 0.18365385, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.09622253, + "refHomGenotypeFreq": 0.0043956046, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8671801, + "altHomGenotypeFreq": 0.7405213, + "hetGenotypeFreq": 0.25331753, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.1328199, + "refHomGenotypeFreq": 0.0061611375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9006981, + "altHomGenotypeFreq": 0.80609053, + "hetGenotypeFreq": 0.18921521, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.099301875, + "refHomGenotypeFreq": 0.0046942704, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8978727, + "altHomGenotypeFreq": 0.8006546, + "hetGenotypeFreq": 0.19443618, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.10212734, + "refHomGenotypeFreq": 0.004909253, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9218437, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.078156315, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.96875, + "altHomGenotypeFreq": 0.9375, + "hetGenotypeFreq": 0.0625, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.03125, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.91413736, + "altHomGenotypeFreq": 0.8334665, + "hetGenotypeFreq": 0.16134185, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.08586262, + "refHomGenotypeFreq": 0.005191693, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.84764826, + "altHomGenotypeFreq": 0.7096115, + "hetGenotypeFreq": 0.27607363, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.15235174, + "refHomGenotypeFreq": 0.014314928, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.94148934, + "altHomGenotypeFreq": 0.88297874, + "hetGenotypeFreq": 0.11702128, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.05851064, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.82843137, + "altHomGenotypeFreq": 0.6764706, + "hetGenotypeFreq": 0.30392158, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.17156863, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9281392, + "altHomGenotypeFreq": 0.8593041, + "hetGenotypeFreq": 0.13767019, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.07186082, + "refHomGenotypeFreq": 0.0030257185, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.95238096, + "altHomGenotypeFreq": 0.9142857, + "hetGenotypeFreq": 0.07619048, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.04761905, + "refHomGenotypeFreq": 0.00952381, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9519231, + "altHomGenotypeFreq": 0.90384614, + "hetGenotypeFreq": 0.09615385, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.048076924, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9166667, + "altHomGenotypeFreq": 0.8425926, + "hetGenotypeFreq": 0.14814815, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.083333336, + "refHomGenotypeFreq": 0.009259259, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8645833, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.22916666, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.13541667, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9557522, + "altHomGenotypeFreq": 0.91150445, + "hetGenotypeFreq": 0.088495575, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.044247787, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.84313726, + "altHomGenotypeFreq": 0.7058824, + "hetGenotypeFreq": 0.27450982, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.15686275, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8791209, + "altHomGenotypeFreq": 0.7582418, + "hetGenotypeFreq": 0.24175824, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.12087912, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9354839, + "altHomGenotypeFreq": 0.8817204, + "hetGenotypeFreq": 0.10752688, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.06451613, + "refHomGenotypeFreq": 0.010752688, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9191919, + "altHomGenotypeFreq": 0.83838385, + "hetGenotypeFreq": 0.16161616, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.08080808, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.91588783, + "altHomGenotypeFreq": 0.8317757, + "hetGenotypeFreq": 0.1682243, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.08411215, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8313953, + "altHomGenotypeFreq": 0.6627907, + "hetGenotypeFreq": 0.3372093, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.16860466, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9427083, + "altHomGenotypeFreq": 0.8854167, + "hetGenotypeFreq": 0.11458333, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.057291668, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9292929, + "altHomGenotypeFreq": 0.85858583, + "hetGenotypeFreq": 0.14141414, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.07070707, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90909094, + "altHomGenotypeFreq": 0.82828283, + "hetGenotypeFreq": 0.16161616, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.09090909, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9055666, + "altHomGenotypeFreq": 0.81312126, + "hetGenotypeFreq": 0.18489066, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.0944334, + "refHomGenotypeFreq": 0.0019880715, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90163934, + "altHomGenotypeFreq": 0.8032787, + "hetGenotypeFreq": 0.1967213, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.09836066, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9423631, + "altHomGenotypeFreq": 0.88760805, + "hetGenotypeFreq": 0.109510094, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.057636887, + "refHomGenotypeFreq": 0.0028818443, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.92941177, + "altHomGenotypeFreq": 0.85882354, + "hetGenotypeFreq": 0.14117648, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.07058824, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86893207, + "altHomGenotypeFreq": 0.74757284, + "hetGenotypeFreq": 0.24271844, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.13106796, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.93939394, + "altHomGenotypeFreq": 0.8787879, + "hetGenotypeFreq": 0.12121212, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.060606062, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86915886, + "altHomGenotypeFreq": 0.74766356, + "hetGenotypeFreq": 0.24299066, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.13084112, + "refHomGenotypeFreq": 0.009345794, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90384614, + "altHomGenotypeFreq": 0.8076923, + "hetGenotypeFreq": 0.1923077, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.09615385, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.92424244, + "altHomGenotypeFreq": 0.8484849, + "hetGenotypeFreq": 0.15151516, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.07575758, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9705882, + "altHomGenotypeFreq": 0.9529412, + "hetGenotypeFreq": 0.03529412, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.029411765, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9494048, + "altHomGenotypeFreq": 0.9027778, + "hetGenotypeFreq": 0.09325397, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.05059524, + "refHomGenotypeFreq": 0.003968254, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9854369, + "altHomGenotypeFreq": 0.9708738, + "hetGenotypeFreq": 0.029126214, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.014563107, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9045226, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.09547739, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9079463, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.09205372, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90217954, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.097820446, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9069579, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.09304207, + "study": "UK10K" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22380932, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22380932, + "id": "15:22380932:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22380932, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1164, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.07434944 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 747, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "exonOverlap": [ + { + "number": "6/7", + "percentage": 0.35842294 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 274, + "cdsPosition": 183, + "codon": "ttA/ttC", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.088809945 + } + ], + "geneName": "OR4N4", + "proteinVariantAnnotation": { + "alternate": "PHE", + "features": [ + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 287, + "id": "IPR017452", + "start": 41 + }, + { + "description": "Olfactory receptor 4N4", + "end": 316, + "id": "PRO_0000150564", + "start": 1, + "type": "chain" + }, + { + "description": "Helical; Name=2", + "end": 79, + "start": 58, + "type": "transmembrane region" + }, + { + "description": "G protein-coupled receptor, rhodopsin-like", + "end": 80, + "id": "IPR000276", + "start": 59 + } + ], + "functionalDescription": "In dbSNP:rs535034.", + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 61, + "reference": "LEU", + "substitutionScores": [ + { + "description": "tolerated", + "score": 1, + "source": "sift" + }, + { + "description": "benign", + "score": 0, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8N0Y3", + "uniprotVariantId": "VAR_048034" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.2799999713897705, + "source": "gerp" + }, + { + "score": 0.24400000274181366, + "source": "phastCons" + }, + { + "score": -1.0429999828338623, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": -0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 1.0399999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-25612A>C", + "ENST00000558896(ENSG00000259176):n.1164A>C", + "ENST00000558312(ENSG00000259176):n.747A>C", + "ENST00000558798(ENSG00000259176):n.556-25612A>C", + "ENST00000328795(ENSG00000183706):c.183A>C", + "ENSP00000332500:p.Leu61Phe" + ], + "id": "rs535034", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.18480201, + "altHomGenotypeFreq": 0.0142075885, + "hetGenotypeFreq": 0.34118885, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.815198, + "refHomGenotypeFreq": 0.64460355, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20378064, + "altHomGenotypeFreq": 0.020357292, + "hetGenotypeFreq": 0.3668467, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.79621935, + "refHomGenotypeFreq": 0.612796, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14429161, + "altHomGenotypeFreq": 0.0050894087, + "hetGenotypeFreq": 0.2784044, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.8557084, + "refHomGenotypeFreq": 0.7165062, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11342371, + "altHomGenotypeFreq": 0.010183947, + "hetGenotypeFreq": 0.20647953, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.8865763, + "refHomGenotypeFreq": 0.7833365, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21245247, + "altHomGenotypeFreq": 0.0114068445, + "hetGenotypeFreq": 0.40209126, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7875475, + "refHomGenotypeFreq": 0.5865019, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23424557, + "altHomGenotypeFreq": 0.008493237, + "hetGenotypeFreq": 0.45150468, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7657544, + "refHomGenotypeFreq": 0.5400021, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20759934, + "altHomGenotypeFreq": 0.018139545, + "hetGenotypeFreq": 0.3789196, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.79240066, + "refHomGenotypeFreq": 0.60294086, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2675488, + "altHomGenotypeFreq": 0.031628206, + "hetGenotypeFreq": 0.47184122, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7324512, + "refHomGenotypeFreq": 0.4965306, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18122782, + "altHomGenotypeFreq": 0.012884555, + "hetGenotypeFreq": 0.33668652, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.8187722, + "refHomGenotypeFreq": 0.6504289, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18909197, + "altHomGenotypeFreq": 0.015795568, + "hetGenotypeFreq": 0.34659278, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.810908, + "refHomGenotypeFreq": 0.6376116, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27637735, + "altHomGenotypeFreq": 0.044689618, + "hetGenotypeFreq": 0.46337545, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7236227, + "refHomGenotypeFreq": 0.49193493, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27370688, + "altHomGenotypeFreq": 0.05172414, + "hetGenotypeFreq": 0.44396552, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.7262931, + "refHomGenotypeFreq": 0.50431037, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19505852, + "altHomGenotypeFreq": 0.009102731, + "hetGenotypeFreq": 0.3719116, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.8049415, + "refHomGenotypeFreq": 0.6189857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15679012, + "altHomGenotypeFreq": 0.019753087, + "hetGenotypeFreq": 0.27407408, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.84320986, + "refHomGenotypeFreq": 0.7061728, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26449275, + "altHomGenotypeFreq": 0.036231883, + "hetGenotypeFreq": 0.45652175, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.73550725, + "refHomGenotypeFreq": 0.5072464, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26978418, + "altHomGenotypeFreq": 0.037769783, + "hetGenotypeFreq": 0.46402878, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.73021585, + "refHomGenotypeFreq": 0.49820143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26557565, + "altHomGenotypeFreq": 0.043784093, + "hetGenotypeFreq": 0.44358313, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.73442435, + "refHomGenotypeFreq": 0.5126328, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32753772, + "altHomGenotypeFreq": 0.05829711, + "hetGenotypeFreq": 0.53848124, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6724623, + "refHomGenotypeFreq": 0.4032217, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2765742, + "altHomGenotypeFreq": 0.04522995, + "hetGenotypeFreq": 0.46268845, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.7234258, + "refHomGenotypeFreq": 0.49208158, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27613565, + "altHomGenotypeFreq": 0.044026136, + "hetGenotypeFreq": 0.46421903, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.7238643, + "refHomGenotypeFreq": 0.49175483, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24649298, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.753507, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2156607, + "altHomGenotypeFreq": 0.0042377245, + "hetGenotypeFreq": 0.42284596, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7843393, + "refHomGenotypeFreq": 0.5729163, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22695853, + "altHomGenotypeFreq": 0.0069124424, + "hetGenotypeFreq": 0.44009218, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.7730415, + "refHomGenotypeFreq": 0.5529954, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16033255, + "altHomGenotypeFreq": 0.0012501563, + "hetGenotypeFreq": 0.31816477, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.83966744, + "refHomGenotypeFreq": 0.6805851, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17735095, + "altHomGenotypeFreq": 2.4943877E-4, + "hetGenotypeFreq": 0.35420305, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.82264906, + "refHomGenotypeFreq": 0.6455475, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12010147, + "altHomGenotypeFreq": 0.0015745276, + "hetGenotypeFreq": 0.23705389, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.87989855, + "refHomGenotypeFreq": 0.7613716, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26711905, + "altHomGenotypeFreq": 0.0058605797, + "hetGenotypeFreq": 0.52251697, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.73288095, + "refHomGenotypeFreq": 0.47162247, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23671032, + "altHomGenotypeFreq": 0.005941087, + "hetGenotypeFreq": 0.46153846, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7632897, + "refHomGenotypeFreq": 0.5325205, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2777074, + "altHomGenotypeFreq": 0.002955457, + "hetGenotypeFreq": 0.5495039, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7222926, + "refHomGenotypeFreq": 0.44754064, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23816, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.76184, + "study": "DISCOVEHR" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22382655, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25275298" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754239", + "somaticInformation": { + "histologySubtype": "squamous cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754239", + "somaticInformation": { + "histologySubtype": "neoplasm", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754239", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "thyroid", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25759019" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754239", + "somaticInformation": { + "histologySubtype": "basal cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "skin", + "sampleSource": "surgery fresh/frozen", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754239", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "breast", + "sampleSource": "fresh/frozen - NOS", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:22810696" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754239", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4N4", + "histologySubtype": "squamous cell carcinoma", + "mutationId": "COSM3754239", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "neoplasm", + "mutationId": "COSM3754239", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "", + "mutationId": "COSM3754239", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "thyroid", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4N4", + "histologySubtype": "basal cell carcinoma", + "mutationId": "COSM3754239", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "skin", + "sampleSource": "surgery fresh/frozen", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "", + "mutationId": "COSM3754239", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "breast", + "sampleSource": "fresh/frozen - NOS", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4N4", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM3754239", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 22382655, + "id": "15:22382655:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 22382655, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1213, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.07434944 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 796, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "exonOverlap": [ + { + "number": "6/7", + "percentage": 0.35842294 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 323, + "cdsPosition": 232, + "codon": "Gct/Cct", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.088809945 + } + ], + "geneName": "OR4N4", + "proteinVariantAnnotation": { + "alternate": "PRO", + "features": [ + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 287, + "id": "IPR017452", + "start": 41 + }, + { + "description": "G protein-coupled receptor, rhodopsin-like", + "end": 80, + "id": "IPR000276", + "start": 59 + }, + { + "description": "Helical; Name=2", + "end": 79, + "start": 58, + "type": "transmembrane region" + }, + { + "description": "Olfactory receptor 4N4", + "end": 316, + "id": "PRO_0000150564", + "start": 1, + "type": "chain" + } + ], + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 78, + "reference": "ALA", + "substitutionScores": [ + { + "description": "deleterious", + "score": 0.03, + "source": "sift" + }, + { + "description": "possibly damaging", + "score": 0.797, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8N0Y3" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.259999990463257, + "source": "gerp" + }, + { + "score": 0.027000000700354576, + "source": "phastCons" + }, + { + "score": 0.18400000035762787, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 2.75, + "source": "cadd_raw" + }, + { + "score": 21.100000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-25563G>C", + "ENST00000558896(ENSG00000259176):n.1213G>C", + "ENST00000558312(ENSG00000259176):n.796G>C", + "ENST00000558798(ENSG00000259176):n.556-25563G>C", + "ENST00000328795(ENSG00000183706):c.232G>C", + "ENSP00000332500:p.Ala78Pro" + ], + "id": "rs62006708", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.18782845, + "altHomGenotypeFreq": 0.006819596, + "hetGenotypeFreq": 0.36202633, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8121672, + "refHomGenotypeFreq": 0.63115406, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20496894, + "altHomGenotypeFreq": 0.011257764, + "hetGenotypeFreq": 0.38742235, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7950311, + "refHomGenotypeFreq": 0.60131985, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17693374, + "altHomGenotypeFreq": 0.0026455026, + "hetGenotypeFreq": 0.34870243, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.8230033, + "refHomGenotypeFreq": 0.6486521, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10222073, + "altHomGenotypeFreq": 0.0059788907, + "hetGenotypeFreq": 0.19248368, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.8977793, + "refHomGenotypeFreq": 0.80153745, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23626135, + "altHomGenotypeFreq": 0.0080051925, + "hetGenotypeFreq": 0.45651233, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.76373863, + "refHomGenotypeFreq": 0.53548247, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20729733, + "altHomGenotypeFreq": 0.0018100409, + "hetGenotypeFreq": 0.41097456, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7927027, + "refHomGenotypeFreq": 0.5872154, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21678363, + "altHomGenotypeFreq": 0.00759562, + "hetGenotypeFreq": 0.418376, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.78321636, + "refHomGenotypeFreq": 0.5740284, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.03744286, + "altHomGenotypeFreq": 0.0014788922, + "hetGenotypeFreq": 0.071927935, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.96255714, + "refHomGenotypeFreq": 0.9265932, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19407816, + "altHomGenotypeFreq": 0.0067275576, + "hetGenotypeFreq": 0.37470123, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.80592185, + "refHomGenotypeFreq": 0.6185712, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18031149, + "altHomGenotypeFreq": 0.0069302972, + "hetGenotypeFreq": 0.3467814, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.819679, + "refHomGenotypeFreq": 0.6462883, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17451608, + "altHomGenotypeFreq": 0.021333152, + "hetGenotypeFreq": 0.30636588, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8254839, + "refHomGenotypeFreq": 0.672301, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23913044, + "altHomGenotypeFreq": 0.032608695, + "hetGenotypeFreq": 0.41304347, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.76086956, + "refHomGenotypeFreq": 0.5543478, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18717277, + "altHomGenotypeFreq": 0.0065445025, + "hetGenotypeFreq": 0.36125654, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.8128272, + "refHomGenotypeFreq": 0.6321989, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10945274, + "altHomGenotypeFreq": 0.0049751243, + "hetGenotypeFreq": 0.20895523, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.8905473, + "refHomGenotypeFreq": 0.78606963, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23809524, + "altHomGenotypeFreq": 0.06122449, + "hetGenotypeFreq": 0.3537415, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7619048, + "refHomGenotypeFreq": 0.585034, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22563177, + "altHomGenotypeFreq": 0.026474128, + "hetGenotypeFreq": 0.39831528, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7743682, + "refHomGenotypeFreq": 0.5752106, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23763502, + "altHomGenotypeFreq": 0.031694144, + "hetGenotypeFreq": 0.41188174, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.762365, + "refHomGenotypeFreq": 0.5564241, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.043204, + "altHomGenotypeFreq": 0.0035705785, + "hetGenotypeFreq": 0.07926684, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.956796, + "refHomGenotypeFreq": 0.9171626, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17259414, + "altHomGenotypeFreq": 0.022397242, + "hetGenotypeFreq": 0.3003938, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.82740587, + "refHomGenotypeFreq": 0.67720896, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17690192, + "altHomGenotypeFreq": 0.02001222, + "hetGenotypeFreq": 0.3137794, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.82309806, + "refHomGenotypeFreq": 0.6662084, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.035179302, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.070358604, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.9648207, + "refHomGenotypeFreq": 0.9296414, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11994464, + "altHomGenotypeFreq": 3.0755036E-4, + "hetGenotypeFreq": 0.23927417, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.88005537, + "refHomGenotypeFreq": 0.7604183, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1633721, + "altHomGenotypeFreq": 4.651163E-4, + "hetGenotypeFreq": 0.32581395, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.8366279, + "refHomGenotypeFreq": 0.67372096, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25851703, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.741483, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20083253, + "altHomGenotypeFreq": 6.0062064E-4, + "hetGenotypeFreq": 0.40046382, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.79916745, + "refHomGenotypeFreq": 0.59893554, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20066519, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.40133038, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7993348, + "refHomGenotypeFreq": 0.59866965, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2435992, + "altHomGenotypeFreq": 0.0016001969, + "hetGenotypeFreq": 0.48399803, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.75640076, + "refHomGenotypeFreq": 0.5144018, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19002098, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.38004196, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.809979, + "refHomGenotypeFreq": 0.61995804, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09944656, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19889311, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.90055346, + "refHomGenotypeFreq": 0.80110687, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22190246, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.44380492, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.77809757, + "refHomGenotypeFreq": 0.5561951, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23009883, + "altHomGenotypeFreq": 6.9722324E-4, + "hetGenotypeFreq": 0.4588032, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.76990116, + "refHomGenotypeFreq": 0.54049957, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.05096942, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10193884, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9490306, + "refHomGenotypeFreq": 0.89806116, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08801498, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17602997, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.91198504, + "refHomGenotypeFreq": 0.82397, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.223664, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.776336, + "study": "DISCOVEHR" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22382704, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM4148383", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM4148383", + "somaticInformation": { + "histologySubtype": "neoplasm", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25759019" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM4148383", + "somaticInformation": { + "histologySubtype": "basal cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "skin", + "sampleSource": "surgery fresh/frozen", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:26238782" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM4148383", + "somaticInformation": { + "histologySubtype": "Merkel cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "skin", + "sampleSource": "surgery fresh/frozen", + "siteSubtype": "upper extremity", + "tumourOrigin": "metastasis" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4N4", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM4148383", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4N4", + "histologySubtype": "neoplasm", + "mutationId": "COSM4148383", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "basal cell carcinoma", + "mutationId": "COSM4148383", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "skin", + "sampleSource": "surgery fresh/frozen", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "Merkel cell carcinoma", + "mutationId": "COSM4148383", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "skin", + "sampleSource": "surgery fresh/frozen", + "siteSubtype": "upper extremity", + "tumourOrigin": "metastasis" + } + ] + } + }, + "chromosome": "15", + "end": 22382704, + "id": "15:22382704:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22382704, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1330, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.07434944 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 440, + "cdsPosition": 349, + "codon": "Gtg/Ctg", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.088809945 + } + ], + "geneName": "OR4N4", + "proteinVariantAnnotation": { + "alternate": "LEU", + "features": [ + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 287, + "id": "IPR017452", + "start": 41 + }, + { + "description": "G protein-coupled receptor, rhodopsin-like", + "end": 126, + "id": "IPR000276", + "start": 110 + }, + { + "description": "Olfactory receptor 4N4", + "end": 316, + "id": "PRO_0000150564", + "start": 1, + "type": "chain" + }, + { + "description": "Helical; Name=3", + "end": 120, + "start": 101, + "type": "transmembrane region" + }, + { + "end": 189, + "start": 97, + "type": "disulfide bond" + }, + { + "description": "G protein-coupled receptor, rhodopsin-like", + "end": 126, + "id": "IPR000276", + "start": 104 + } + ], + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 117, + "reference": "VAL", + "substitutionScores": [ + { + "description": "deleterious", + "score": 0.05, + "source": "sift" + }, + { + "description": "benign", + "score": 0.213, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8N0Y3" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.259999990463257, + "source": "gerp" + }, + { + "score": 0.7319999933242798, + "source": "phastCons" + }, + { + "score": 0.18400000035762787, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 1.6800003051757812, + "source": "cadd_raw" + }, + { + "score": 14.350000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-25446G>C", + "ENST00000558896(ENSG00000259176):n.1330G>C", + "ENST00000558312(ENSG00000259176):n.834+79G>C", + "ENST00000558798(ENSG00000259176):n.556-25446G>C", + "ENST00000328795(ENSG00000183706):c.349G>C", + "ENSP00000332500:p.Val117Leu" + ], + "id": "rs12438969", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.224716, + "altHomGenotypeFreq": 0.037518896, + "hetGenotypeFreq": 0.3744374, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7752624, + "refHomGenotypeFreq": 0.5880437, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24136592, + "altHomGenotypeFreq": 0.04967016, + "hetGenotypeFreq": 0.38339153, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7586341, + "refHomGenotypeFreq": 0.5669383, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18827884, + "altHomGenotypeFreq": 0.009130167, + "hetGenotypeFreq": 0.35829735, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.81172115, + "refHomGenotypeFreq": 0.6325725, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13094145, + "altHomGenotypeFreq": 0.017434392, + "hetGenotypeFreq": 0.22701412, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.86905855, + "refHomGenotypeFreq": 0.75555146, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2345898, + "altHomGenotypeFreq": 0.033481155, + "hetGenotypeFreq": 0.4022173, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7654102, + "refHomGenotypeFreq": 0.56430155, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27525783, + "altHomGenotypeFreq": 0.034568373, + "hetGenotypeFreq": 0.4813789, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7247422, + "refHomGenotypeFreq": 0.48405272, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25785193, + "altHomGenotypeFreq": 0.051463727, + "hetGenotypeFreq": 0.4127764, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.74214804, + "refHomGenotypeFreq": 0.53575987, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29302877, + "altHomGenotypeFreq": 0.052947752, + "hetGenotypeFreq": 0.48016205, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7069712, + "refHomGenotypeFreq": 0.4668902, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2230167, + "altHomGenotypeFreq": 0.037111446, + "hetGenotypeFreq": 0.37187377, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7769517, + "refHomGenotypeFreq": 0.5910148, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22676057, + "altHomGenotypeFreq": 0.038009137, + "hetGenotypeFreq": 0.3775219, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7732299, + "refHomGenotypeFreq": 0.58446896, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2670521, + "altHomGenotypeFreq": 0.043912176, + "hetGenotypeFreq": 0.44627985, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7329479, + "refHomGenotypeFreq": 0.50980794, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27489176, + "altHomGenotypeFreq": 0.056277055, + "hetGenotypeFreq": 0.43722942, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7251082, + "refHomGenotypeFreq": 0.5064935, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19003932, + "altHomGenotypeFreq": 0.007863696, + "hetGenotypeFreq": 0.36435124, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.80996066, + "refHomGenotypeFreq": 0.6277851, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15789473, + "altHomGenotypeFreq": 0.020050125, + "hetGenotypeFreq": 0.2756892, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.84210527, + "refHomGenotypeFreq": 0.70426065, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26408452, + "altHomGenotypeFreq": 0.03521127, + "hetGenotypeFreq": 0.45774648, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7359155, + "refHomGenotypeFreq": 0.5070422, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27065867, + "altHomGenotypeFreq": 0.041317366, + "hetGenotypeFreq": 0.45868263, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7293413, + "refHomGenotypeFreq": 0.5, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2685775, + "altHomGenotypeFreq": 0.048549186, + "hetGenotypeFreq": 0.44005662, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7314225, + "refHomGenotypeFreq": 0.5113942, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2874876, + "altHomGenotypeFreq": 0.044935454, + "hetGenotypeFreq": 0.48510426, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.71251243, + "refHomGenotypeFreq": 0.46996027, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26689947, + "altHomGenotypeFreq": 0.045273136, + "hetGenotypeFreq": 0.44325268, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.73310053, + "refHomGenotypeFreq": 0.5114742, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26724005, + "altHomGenotypeFreq": 0.042236216, + "hetGenotypeFreq": 0.45000768, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.73275995, + "refHomGenotypeFreq": 0.5077561, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.248497, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.751503, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24104545, + "altHomGenotypeFreq": 0.034606908, + "hetGenotypeFreq": 0.41304532, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7588704, + "refHomGenotypeFreq": 0.5523478, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26463965, + "altHomGenotypeFreq": 0.054054055, + "hetGenotypeFreq": 0.42117116, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7353604, + "refHomGenotypeFreq": 0.5247748, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17529513, + "altHomGenotypeFreq": 0.01746188, + "hetGenotypeFreq": 0.31677324, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.8241515, + "refHomGenotypeFreq": 0.66576487, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20783903, + "altHomGenotypeFreq": 0.0076762037, + "hetGenotypeFreq": 0.40032566, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.792161, + "refHomGenotypeFreq": 0.59199816, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12978761, + "altHomGenotypeFreq": 0.012883008, + "hetGenotypeFreq": 0.23380919, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.8702124, + "refHomGenotypeFreq": 0.7533078, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28892627, + "altHomGenotypeFreq": 0.03334353, + "hetGenotypeFreq": 0.5111655, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7110737, + "refHomGenotypeFreq": 0.45549098, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26726758, + "altHomGenotypeFreq": 0.044623937, + "hetGenotypeFreq": 0.44528732, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7327324, + "refHomGenotypeFreq": 0.51008874, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3003006, + "altHomGenotypeFreq": 0.044488978, + "hetGenotypeFreq": 0.51182365, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.6995992, + "refHomGenotypeFreq": 0.44368738, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.252809, + "altHomGenotypeFreq": 0.052434456, + "hetGenotypeFreq": 0.40074906, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.747191, + "refHomGenotypeFreq": 0.54681647, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.260605, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.739395, + "study": "DISCOVEHR" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22382821, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25275298" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754240", + "somaticInformation": { + "histologySubtype": "squamous cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:22810696" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754240", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4N4", + "histologySubtype": "squamous cell carcinoma", + "mutationId": "COSM3754240", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM3754240", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 22382821, + "id": "15:22382821:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22382821, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1337, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.07434944 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 447, + "cdsPosition": 356, + "codon": "gCc/gAc", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.088809945 + } + ], + "geneName": "OR4N4", + "proteinVariantAnnotation": { + "alternate": "ASP", + "features": [ + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 287, + "id": "IPR017452", + "start": 41 + }, + { + "description": "G protein-coupled receptor, rhodopsin-like", + "end": 126, + "id": "IPR000276", + "start": 110 + }, + { + "description": "Olfactory receptor 4N4", + "end": 316, + "id": "PRO_0000150564", + "start": 1, + "type": "chain" + }, + { + "description": "Helical; Name=3", + "end": 120, + "start": 101, + "type": "transmembrane region" + }, + { + "end": 189, + "start": 97, + "type": "disulfide bond" + }, + { + "description": "G protein-coupled receptor, rhodopsin-like", + "end": 126, + "id": "IPR000276", + "start": 104 + } + ], + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 119, + "reference": "ALA", + "substitutionScores": [ + { + "description": "deleterious", + "score": 0, + "source": "sift" + }, + { + "description": "probably damaging", + "score": 0.999, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8N0Y3" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 3.200000047683716, + "source": "gerp" + }, + { + "score": 0.703000009059906, + "source": "phastCons" + }, + { + "score": 0.18400000035762787, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 5.560000419616699, + "source": "cadd_raw" + }, + { + "score": 26.399999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-25439C>A", + "ENST00000558896(ENSG00000259176):n.1337C>A", + "ENST00000558312(ENSG00000259176):n.834+86C>A", + "ENST00000558798(ENSG00000259176):n.556-25439C>A", + "ENST00000328795(ENSG00000183706):c.356C>A", + "ENSP00000332500:p.Ala119Asp" + ], + "id": "rs62006709", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.18958299, + "altHomGenotypeFreq": 0.025688611, + "hetGenotypeFreq": 0.32778877, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.810417, + "refHomGenotypeFreq": 0.64652264, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21348096, + "altHomGenotypeFreq": 0.033022534, + "hetGenotypeFreq": 0.36091685, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.78651905, + "refHomGenotypeFreq": 0.6060606, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07531638, + "altHomGenotypeFreq": 0.0013515174, + "hetGenotypeFreq": 0.14792973, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.92468363, + "refHomGenotypeFreq": 0.85071874, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1123592, + "altHomGenotypeFreq": 0.012365328, + "hetGenotypeFreq": 0.19998775, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8876408, + "refHomGenotypeFreq": 0.7876469, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20354578, + "altHomGenotypeFreq": 0.017953321, + "hetGenotypeFreq": 0.37118492, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7964542, + "refHomGenotypeFreq": 0.6108618, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2687649, + "altHomGenotypeFreq": 0.028707677, + "hetGenotypeFreq": 0.48011446, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7312351, + "refHomGenotypeFreq": 0.4911779, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23562911, + "altHomGenotypeFreq": 0.037503332, + "hetGenotypeFreq": 0.39625156, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.76437086, + "refHomGenotypeFreq": 0.5662451, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10591235, + "altHomGenotypeFreq": 0.009647189, + "hetGenotypeFreq": 0.19253032, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8940877, + "refHomGenotypeFreq": 0.7978225, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19248095, + "altHomGenotypeFreq": 0.026601966, + "hetGenotypeFreq": 0.33175796, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.807519, + "refHomGenotypeFreq": 0.64164007, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18609627, + "altHomGenotypeFreq": 0.024589697, + "hetGenotypeFreq": 0.32301313, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.81390375, + "refHomGenotypeFreq": 0.65239716, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19394273, + "altHomGenotypeFreq": 0.022731956, + "hetGenotypeFreq": 0.34242153, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8060573, + "refHomGenotypeFreq": 0.6348465, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2462039, + "altHomGenotypeFreq": 0.039045554, + "hetGenotypeFreq": 0.4143167, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7537961, + "refHomGenotypeFreq": 0.5466378, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07133676, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14267352, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.92866325, + "refHomGenotypeFreq": 0.8573265, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1234414, + "altHomGenotypeFreq": 0.009975063, + "hetGenotypeFreq": 0.22693267, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8765586, + "refHomGenotypeFreq": 0.7630923, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23239437, + "altHomGenotypeFreq": 0.014084507, + "hetGenotypeFreq": 0.43661973, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.76760566, + "refHomGenotypeFreq": 0.5492958, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26364726, + "altHomGenotypeFreq": 0.034193162, + "hetGenotypeFreq": 0.45890823, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.73635274, + "refHomGenotypeFreq": 0.50689864, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24250856, + "altHomGenotypeFreq": 0.030393835, + "hetGenotypeFreq": 0.42422944, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7574914, + "refHomGenotypeFreq": 0.5453767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.105628654, + "altHomGenotypeFreq": 0.009015595, + "hetGenotypeFreq": 0.19322611, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.89437133, + "refHomGenotypeFreq": 0.7977583, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18930708, + "altHomGenotypeFreq": 0.02342971, + "hetGenotypeFreq": 0.33175474, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.8106929, + "refHomGenotypeFreq": 0.64481556, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19963285, + "altHomGenotypeFreq": 0.021875478, + "hetGenotypeFreq": 0.35551476, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.8003671, + "refHomGenotypeFreq": 0.62260973, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22745492, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7725451, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20454697, + "altHomGenotypeFreq": 0.022466635, + "hetGenotypeFreq": 0.3641607, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.795453, + "refHomGenotypeFreq": 0.6133727, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23825504, + "altHomGenotypeFreq": 0.035794184, + "hetGenotypeFreq": 0.4049217, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.761745, + "refHomGenotypeFreq": 0.5592841, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17106718, + "altHomGenotypeFreq": 0.015719023, + "hetGenotypeFreq": 0.3106963, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.8289328, + "refHomGenotypeFreq": 0.6735847, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.099907175, + "altHomGenotypeFreq": 9.282896E-4, + "hetGenotypeFreq": 0.19795777, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.90009284, + "refHomGenotypeFreq": 0.80111396, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11345853, + "altHomGenotypeFreq": 0.008346374, + "hetGenotypeFreq": 0.21022432, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8865415, + "refHomGenotypeFreq": 0.7814293, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28224328, + "altHomGenotypeFreq": 0.026894866, + "hetGenotypeFreq": 0.5106968, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.71775675, + "refHomGenotypeFreq": 0.4624083, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24674848, + "altHomGenotypeFreq": 0.03127582, + "hetGenotypeFreq": 0.4309453, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7532515, + "refHomGenotypeFreq": 0.53777885, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12507433, + "altHomGenotypeFreq": 0.006739346, + "hetGenotypeFreq": 0.23666997, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8749257, + "refHomGenotypeFreq": 0.75659066, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22284645, + "altHomGenotypeFreq": 0.052434456, + "hetGenotypeFreq": 0.34082398, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.77715355, + "refHomGenotypeFreq": 0.60674155, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.239698, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.760302, + "study": "DISCOVEHR" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22382828, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25275298" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754241", + "somaticInformation": { + "histologySubtype": "squamous cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:22810696" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754241", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25759019" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3754241", + "somaticInformation": { + "histologySubtype": "basal cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "skin", + "sampleSource": "surgery fresh/frozen", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4N4", + "histologySubtype": "squamous cell carcinoma", + "mutationId": "COSM3754241", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM3754241", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "basal cell carcinoma", + "mutationId": "COSM3754241", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "skin", + "sampleSource": "surgery fresh/frozen", + "siteSubtype": "", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 22382828, + "id": "15:22382828:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 22382828, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1406, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.07434944 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 516, + "cdsPosition": 425, + "codon": "tAt/tGt", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.088809945 + } + ], + "geneName": "OR4N4", + "proteinVariantAnnotation": { + "alternate": "CYS", + "features": [ + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 287, + "id": "IPR017452", + "start": 41 + }, + { + "description": "Helical; Name=4", + "end": 158, + "start": 140, + "type": "transmembrane region" + }, + { + "end": 189, + "start": 97, + "type": "disulfide bond" + }, + { + "description": "Olfactory receptor 4N4", + "end": 316, + "id": "PRO_0000150564", + "start": 1, + "type": "chain" + } + ], + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 142, + "reference": "TYR", + "substitutionScores": [ + { + "description": "tolerated", + "score": 0.2, + "source": "sift" + }, + { + "description": "benign", + "score": 0.151, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8N0Y3" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 3.369999885559082, + "source": "gerp" + }, + { + "score": 0.23600000143051147, + "source": "phastCons" + }, + { + "score": 0.3319999873638153, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 0.039999961853027344, + "source": "cadd_raw" + }, + { + "score": 3.069999933242798, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-25370A>G", + "ENST00000558896(ENSG00000259176):n.1406A>G", + "ENST00000558312(ENSG00000259176):n.834+155A>G", + "ENST00000558798(ENSG00000259176):n.556-25370A>G", + "ENST00000328795(ENSG00000183706):c.425A>G", + "ENSP00000332500:p.Tyr142Cys" + ], + "id": "rs62006710", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.21250877, + "altHomGenotypeFreq": 0.033069447, + "hetGenotypeFreq": 0.35887864, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7874912, + "refHomGenotypeFreq": 0.6080519, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22845314, + "altHomGenotypeFreq": 0.041023713, + "hetGenotypeFreq": 0.37485886, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.77154684, + "refHomGenotypeFreq": 0.5841174, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19447786, + "altHomGenotypeFreq": 0.006977863, + "hetGenotypeFreq": 0.375, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.80552214, + "refHomGenotypeFreq": 0.61802214, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.111147895, + "altHomGenotypeFreq": 0.013724192, + "hetGenotypeFreq": 0.1948474, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.8888521, + "refHomGenotypeFreq": 0.7914284, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26815644, + "altHomGenotypeFreq": 0.053589903, + "hetGenotypeFreq": 0.42913306, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7318436, + "refHomGenotypeFreq": 0.51727706, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23303168, + "altHomGenotypeFreq": 0.031027796, + "hetGenotypeFreq": 0.40400776, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7669683, + "refHomGenotypeFreq": 0.5649645, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24700388, + "altHomGenotypeFreq": 0.041501757, + "hetGenotypeFreq": 0.41100425, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7529961, + "refHomGenotypeFreq": 0.547494, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04307365, + "altHomGenotypeFreq": 0.004653018, + "hetGenotypeFreq": 0.076841265, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.95692635, + "refHomGenotypeFreq": 0.9185057, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22005986, + "altHomGenotypeFreq": 0.03458596, + "hetGenotypeFreq": 0.37094778, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.7799401, + "refHomGenotypeFreq": 0.59446627, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20339483, + "altHomGenotypeFreq": 0.031239057, + "hetGenotypeFreq": 0.34431154, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.79660517, + "refHomGenotypeFreq": 0.6244494, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17681238, + "altHomGenotypeFreq": 0.025336126, + "hetGenotypeFreq": 0.3029525, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.82318765, + "refHomGenotypeFreq": 0.6717114, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24946237, + "altHomGenotypeFreq": 0.045161292, + "hetGenotypeFreq": 0.40860215, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.75053763, + "refHomGenotypeFreq": 0.5462366, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1875, + "altHomGenotypeFreq": 0.0065104165, + "hetGenotypeFreq": 0.36197916, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.8125, + "refHomGenotypeFreq": 0.63151044, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.11278196, + "altHomGenotypeFreq": 0.015037594, + "hetGenotypeFreq": 0.19548872, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.88721806, + "refHomGenotypeFreq": 0.7894737, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22945206, + "altHomGenotypeFreq": 0.05479452, + "hetGenotypeFreq": 0.34931508, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7705479, + "refHomGenotypeFreq": 0.5958904, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22932778, + "altHomGenotypeFreq": 0.032123737, + "hetGenotypeFreq": 0.39440808, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7706722, + "refHomGenotypeFreq": 0.57346815, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24030355, + "altHomGenotypeFreq": 0.036818437, + "hetGenotypeFreq": 0.4069702, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7596965, + "refHomGenotypeFreq": 0.55621135, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04330336, + "altHomGenotypeFreq": 0.0044959774, + "hetGenotypeFreq": 0.07761477, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9566966, + "refHomGenotypeFreq": 0.91788924, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17485373, + "altHomGenotypeFreq": 0.026084837, + "hetGenotypeFreq": 0.29753777, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.82514626, + "refHomGenotypeFreq": 0.67637736, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17924814, + "altHomGenotypeFreq": 0.024405032, + "hetGenotypeFreq": 0.3096862, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.82075185, + "refHomGenotypeFreq": 0.66590875, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.061159287, + "altHomGenotypeFreq": 0.005476951, + "hetGenotypeFreq": 0.11136467, + "population": "AA", + "refAllele": "A", + "refAlleleFreq": 0.9388407, + "refHomGenotypeFreq": 0.8831584, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18673486, + "altHomGenotypeFreq": 0.029753603, + "hetGenotypeFreq": 0.3139625, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.81326514, + "refHomGenotypeFreq": 0.6562839, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25129047, + "altHomGenotypeFreq": 0.042233694, + "hetGenotypeFreq": 0.41811356, + "population": "EA", + "refAllele": "A", + "refAlleleFreq": 0.7487095, + "refHomGenotypeFreq": 0.53965276, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26352707, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.73647296, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21900675, + "altHomGenotypeFreq": 0.032630615, + "hetGenotypeFreq": 0.37275228, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7809932, + "refHomGenotypeFreq": 0.5946171, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21540178, + "altHomGenotypeFreq": 0.02455357, + "hetGenotypeFreq": 0.38169643, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.78459823, + "refHomGenotypeFreq": 0.59375, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26712748, + "altHomGenotypeFreq": 0.045265477, + "hetGenotypeFreq": 0.443724, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.73287255, + "refHomGenotypeFreq": 0.5110105, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19962773, + "altHomGenotypeFreq": 0.0069799908, + "hetGenotypeFreq": 0.38529548, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.80037224, + "refHomGenotypeFreq": 0.60772455, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10742222, + "altHomGenotypeFreq": 0.012689032, + "hetGenotypeFreq": 0.18946637, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.89257777, + "refHomGenotypeFreq": 0.7978446, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23915036, + "altHomGenotypeFreq": 0.030562347, + "hetGenotypeFreq": 0.41717604, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.76084965, + "refHomGenotypeFreq": 0.5522616, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25302303, + "altHomGenotypeFreq": 0.040772922, + "hetGenotypeFreq": 0.42450023, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.746977, + "refHomGenotypeFreq": 0.53472686, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.053439565, + "altHomGenotypeFreq": 0.006218422, + "hetGenotypeFreq": 0.094442286, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.94656044, + "refHomGenotypeFreq": 0.8993393, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22097379, + "altHomGenotypeFreq": 0.04494382, + "hetGenotypeFreq": 0.35205993, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7790262, + "refHomGenotypeFreq": 0.60299623, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.247647, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.752353, + "study": "DISCOVEHR" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22382897, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM7214904", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4N4", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM7214904", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "blood-bone marrow", + "siteSubtype": "", + "tumourOrigin": "primary" + } + ] + } + }, + "chromosome": "15", + "end": 22382897, + "id": "15:22382897:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22382897, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1573, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.07434944 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 683, + "cdsPosition": 592, + "codon": "Cta/Ata", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.088809945 + } + ], + "geneName": "OR4N4", + "proteinVariantAnnotation": { + "alternate": "ILE", + "features": [ + { + "description": "GPCR, rhodopsin-like, 7TM", + "end": 287, + "id": "IPR017452", + "start": 41 + }, + { + "description": "Helical; Name=5", + "end": 219, + "start": 196, + "type": "transmembrane region" + }, + { + "description": "Olfactory receptor 4N4", + "end": 316, + "id": "PRO_0000150564", + "start": 1, + "type": "chain" + } + ], + "keywords": [ + "Cell membrane", + "Complete proteome", + "Disulfide bond", + "G-protein coupled receptor", + "Glycoprotein", + "Membrane", + "Olfaction", + "Polymorphism", + "Receptor", + "Reference proteome", + "Sensory transduction", + "Transducer", + "Transmembrane", + "Transmembrane helix" + ], + "position": 198, + "reference": "LEU", + "substitutionScores": [ + { + "description": "deleterious", + "score": 0.04, + "source": "sift" + }, + { + "description": "probably damaging", + "score": 0.999, + "source": "polyphen" + } + ], + "uniprotAccession": "Q8N0Y3" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.440000057220459, + "source": "gerp" + }, + { + "score": 0.2879999876022339, + "source": "phastCons" + }, + { + "score": 0.40400001406669617, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 3.1999998092651367, + "source": "cadd_raw" + }, + { + "score": 22.700000762939453, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-25203C>A", + "ENST00000558896(ENSG00000259176):n.1573C>A", + "ENST00000558312(ENSG00000259176):n.835-238C>A", + "ENST00000558798(ENSG00000259176):n.556-25203C>A", + "ENST00000328795(ENSG00000183706):c.592C>A", + "ENSP00000332500:p.Leu198Ile" + ], + "id": "rs12441468", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.22766823, + "altHomGenotypeFreq": 0.038713265, + "hetGenotypeFreq": 0.3779099, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7723318, + "refHomGenotypeFreq": 0.5833768, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2442352, + "altHomGenotypeFreq": 0.050345886, + "hetGenotypeFreq": 0.38777864, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7557648, + "refHomGenotypeFreq": 0.56187546, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18664765, + "altHomGenotypeFreq": 0.009050335, + "hetGenotypeFreq": 0.35519466, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.81335235, + "refHomGenotypeFreq": 0.635755, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1345804, + "altHomGenotypeFreq": 0.018190637, + "hetGenotypeFreq": 0.23277953, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8654196, + "refHomGenotypeFreq": 0.7490298, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24471042, + "altHomGenotypeFreq": 0.033554178, + "hetGenotypeFreq": 0.42231247, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7552896, + "refHomGenotypeFreq": 0.54413337, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2783354, + "altHomGenotypeFreq": 0.03512925, + "hetGenotypeFreq": 0.48641226, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7216646, + "refHomGenotypeFreq": 0.4784585, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26020244, + "altHomGenotypeFreq": 0.053311426, + "hetGenotypeFreq": 0.41378203, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.73979753, + "refHomGenotypeFreq": 0.53290653, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28843462, + "altHomGenotypeFreq": 0.05152618, + "hetGenotypeFreq": 0.47381687, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7115654, + "refHomGenotypeFreq": 0.47465697, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22632766, + "altHomGenotypeFreq": 0.038530186, + "hetGenotypeFreq": 0.37559494, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.77367234, + "refHomGenotypeFreq": 0.58587486, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22928338, + "altHomGenotypeFreq": 0.038933847, + "hetGenotypeFreq": 0.38069907, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7707166, + "refHomGenotypeFreq": 0.5803671, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26694363, + "altHomGenotypeFreq": 0.04490833, + "hetGenotypeFreq": 0.44407058, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.73305637, + "refHomGenotypeFreq": 0.5110211, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27145922, + "altHomGenotypeFreq": 0.055793993, + "hetGenotypeFreq": 0.43133047, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7285408, + "refHomGenotypeFreq": 0.51287556, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18675497, + "altHomGenotypeFreq": 0.00794702, + "hetGenotypeFreq": 0.3576159, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.81324506, + "refHomGenotypeFreq": 0.6344371, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15617129, + "altHomGenotypeFreq": 0.020151133, + "hetGenotypeFreq": 0.2720403, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.84382874, + "refHomGenotypeFreq": 0.70780855, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26041666, + "altHomGenotypeFreq": 0.034722224, + "hetGenotypeFreq": 0.4513889, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7395833, + "refHomGenotypeFreq": 0.5138889, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27218583, + "altHomGenotypeFreq": 0.041691482, + "hetGenotypeFreq": 0.46098867, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7278142, + "refHomGenotypeFreq": 0.49731985, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26888323, + "altHomGenotypeFreq": 0.04941409, + "hetGenotypeFreq": 0.4389383, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7311168, + "refHomGenotypeFreq": 0.5116476, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28695223, + "altHomGenotypeFreq": 0.046793763, + "hetGenotypeFreq": 0.4803169, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7130478, + "refHomGenotypeFreq": 0.47288933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2666874, + "altHomGenotypeFreq": 0.0464885, + "hetGenotypeFreq": 0.44039777, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7333126, + "refHomGenotypeFreq": 0.51311374, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2672599, + "altHomGenotypeFreq": 0.04295796, + "hetGenotypeFreq": 0.44860387, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7327401, + "refHomGenotypeFreq": 0.50843817, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.06913827, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9308617, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2411978, + "altHomGenotypeFreq": 0.036879834, + "hetGenotypeFreq": 0.40863594, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7588022, + "refHomGenotypeFreq": 0.55448425, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26785713, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.4107143, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.73214287, + "refHomGenotypeFreq": 0.52678573, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17740549, + "altHomGenotypeFreq": 0.020864015, + "hetGenotypeFreq": 0.31308296, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.8225945, + "refHomGenotypeFreq": 0.666053, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.205, + "altHomGenotypeFreq": 0.006976744, + "hetGenotypeFreq": 0.39604652, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.795, + "refHomGenotypeFreq": 0.59697676, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1299878, + "altHomGenotypeFreq": 0.013416972, + "hetGenotypeFreq": 0.23314166, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8700122, + "refHomGenotypeFreq": 0.7534414, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28908646, + "altHomGenotypeFreq": 0.033721644, + "hetGenotypeFreq": 0.5107296, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.71091354, + "refHomGenotypeFreq": 0.45554873, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2674876, + "altHomGenotypeFreq": 0.04751745, + "hetGenotypeFreq": 0.43994027, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7325124, + "refHomGenotypeFreq": 0.5125423, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29628187, + "altHomGenotypeFreq": 0.045357212, + "hetGenotypeFreq": 0.50184935, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7037181, + "refHomGenotypeFreq": 0.45279345, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3828125, + "altHomGenotypeFreq": 0.046875, + "hetGenotypeFreq": 0.671875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.6171875, + "refHomGenotypeFreq": 0.28125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42032748, + "altHomGenotypeFreq": 0.04752396, + "hetGenotypeFreq": 0.745607, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5796725, + "refHomGenotypeFreq": 0.206869, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39468303, + "altHomGenotypeFreq": 0.018404908, + "hetGenotypeFreq": 0.7525562, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.605317, + "refHomGenotypeFreq": 0.22903885, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44148937, + "altHomGenotypeFreq": 0.06382979, + "hetGenotypeFreq": 0.7553191, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.55851066, + "refHomGenotypeFreq": 0.18085106, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38235295, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.7254902, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.61764705, + "refHomGenotypeFreq": 0.25490198, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42965204, + "altHomGenotypeFreq": 0.08018155, + "hetGenotypeFreq": 0.698941, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.57034796, + "refHomGenotypeFreq": 0.22087745, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41904762, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.83809525, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.5809524, + "refHomGenotypeFreq": 0.16190477, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.8269231, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.14423077, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45833334, + "altHomGenotypeFreq": 0.12037037, + "hetGenotypeFreq": 0.67592597, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.5416667, + "refHomGenotypeFreq": 0.2037037, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41666666, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8333333, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.5833333, + "refHomGenotypeFreq": 0.16666667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4159292, + "altHomGenotypeFreq": 0.053097345, + "hetGenotypeFreq": 0.7256637, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.5840708, + "refHomGenotypeFreq": 0.22123894, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39215687, + "altHomGenotypeFreq": 0.029411765, + "hetGenotypeFreq": 0.7254902, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.60784316, + "refHomGenotypeFreq": 0.24509804, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4945055, + "altHomGenotypeFreq": 0.06593407, + "hetGenotypeFreq": 0.85714287, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.50549453, + "refHomGenotypeFreq": 0.07692308, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39784947, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.7741935, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.60215056, + "refHomGenotypeFreq": 0.21505377, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3838384, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.7474748, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.61616164, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45794392, + "altHomGenotypeFreq": 0.07476635, + "hetGenotypeFreq": 0.76635516, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.5420561, + "refHomGenotypeFreq": 0.1588785, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39534885, + "altHomGenotypeFreq": 0.034883723, + "hetGenotypeFreq": 0.7209302, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.60465115, + "refHomGenotypeFreq": 0.24418604, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38541666, + "altHomGenotypeFreq": 0.052083332, + "hetGenotypeFreq": 0.6666667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.6145833, + "refHomGenotypeFreq": 0.28125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4040404, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.7070707, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.5959596, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45959595, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.6767677, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.540404, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4642147, + "altHomGenotypeFreq": 0.071570575, + "hetGenotypeFreq": 0.7852883, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.5357853, + "refHomGenotypeFreq": 0.14314115, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45901638, + "altHomGenotypeFreq": 0.114754096, + "hetGenotypeFreq": 0.6885246, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.5409836, + "refHomGenotypeFreq": 0.19672132, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38616714, + "altHomGenotypeFreq": 0.04034582, + "hetGenotypeFreq": 0.69164264, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.61383283, + "refHomGenotypeFreq": 0.26801154, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43529412, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.7529412, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.5647059, + "refHomGenotypeFreq": 0.1882353, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3883495, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.75728154, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.61165047, + "refHomGenotypeFreq": 0.23300971, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44444445, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.74747473, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5555556, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45327103, + "altHomGenotypeFreq": 0.056074765, + "hetGenotypeFreq": 0.7943925, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.54672897, + "refHomGenotypeFreq": 0.1495327, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4278846, + "altHomGenotypeFreq": 0.048076924, + "hetGenotypeFreq": 0.7596154, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.57211536, + "refHomGenotypeFreq": 0.1923077, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47474748, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.7676768, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.5252525, + "refHomGenotypeFreq": 0.14141414, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5529412, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.7235294, + "refHomGenotypeFreq": 0.44705883, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41269842, + "altHomGenotypeFreq": 0.013888889, + "hetGenotypeFreq": 0.7976191, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5873016, + "refHomGenotypeFreq": 0.18849206, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41747573, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.7961165, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5825243, + "refHomGenotypeFreq": 0.18446602, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.123595506, + "altHomGenotypeFreq": 0.033707865, + "hetGenotypeFreq": 0.17977528, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8764045, + "refHomGenotypeFreq": 0.78651685, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2666, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7334, + "study": "DISCOVEHR" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22383064, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM1372015", + "somaticInformation": { + "histologySubtype": "neoplasm", + "primaryHistology": "other", + "primarySite": "liver", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:25275298" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM1372015", + "somaticInformation": { + "histologySubtype": "squamous cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:26496030" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM1372015", + "somaticInformation": { + "histologySubtype": "astrocytoma Grade IV", + "primaryHistology": "glioma", + "primarySite": "central nervous system", + "sampleSource": "cell-line", + "siteSubtype": "brain", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:22810696" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM1372015", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4N4", + "histologySubtype": "neoplasm", + "mutationId": "COSM1372015", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "other", + "primarySite": "liver", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4N4", + "histologySubtype": "squamous cell carcinoma", + "mutationId": "COSM1372015", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "carcinoma", + "primarySite": "upper aerodigestive tract", + "sampleSource": "cell-line", + "siteSubtype": "head neck", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "astrocytoma Grade IV", + "mutationId": "COSM1372015", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "glioma", + "primarySite": "central nervous system", + "sampleSource": "cell-line", + "siteSubtype": "brain", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM1372015", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "large intestine", + "sampleSource": "", + "siteSubtype": "colon", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 22383064, + "id": "15:22383064:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 22383064, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1575, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.07434944 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 685, + "cdsPosition": 594, + "codon": "ctA/ctG", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.088809945 + } + ], + "geneName": "OR4N4", + "proteinVariantAnnotation": { + "alternate": "LEU", + "position": 198, + "reference": "LEU" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.009999990463257, + "source": "gerp" + }, + { + "score": 0.3059999942779541, + "source": "phastCons" + }, + { + "score": -0.5049999952316284, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": -0.13000011444091797, + "source": "cadd_raw" + }, + { + "score": 1.5199999809265137, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-25201A>G", + "ENST00000558896(ENSG00000259176):n.1575A>G", + "ENST00000558312(ENSG00000259176):n.835-236A>G", + "ENST00000558798(ENSG00000259176):n.556-25201A>G", + "ENST00000328795(ENSG00000183706):c.594A>G", + "ENSP00000332500:p.Leu198=" + ], + "id": "rs559754", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.6880698, + "altHomGenotypeFreq": 0.4328481, + "hetGenotypeFreq": 0.51050216, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.3119008, + "refHomGenotypeFreq": 0.056649707, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6817669, + "altHomGenotypeFreq": 0.4300752, + "hetGenotypeFreq": 0.5037594, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.3180451, + "refHomGenotypeFreq": 0.06616541, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.60096556, + "altHomGenotypeFreq": 0.25783765, + "hetGenotypeFreq": 0.6862558, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.39903444, + "refHomGenotypeFreq": 0.055906545, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8040982, + "altHomGenotypeFreq": 0.63418764, + "hetGenotypeFreq": 0.34012333, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.19575073, + "refHomGenotypeFreq": 0.025689071, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6737611, + "altHomGenotypeFreq": 0.41592544, + "hetGenotypeFreq": 0.5156713, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.32623887, + "refHomGenotypeFreq": 0.06840322, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7048691, + "altHomGenotypeFreq": 0.45898026, + "hetGenotypeFreq": 0.4917777, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.2951309, + "refHomGenotypeFreq": 0.049242076, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.68794453, + "altHomGenotypeFreq": 0.43224922, + "hetGenotypeFreq": 0.5114091, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.31204623, + "refHomGenotypeFreq": 0.05634168, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6244387, + "altHomGenotypeFreq": 0.3313376, + "hetGenotypeFreq": 0.5862022, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.3755613, + "refHomGenotypeFreq": 0.0824602, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6846323, + "altHomGenotypeFreq": 0.42687237, + "hetGenotypeFreq": 0.51555055, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.31535235, + "refHomGenotypeFreq": 0.057577062, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6922095, + "altHomGenotypeFreq": 0.4400444, + "hetGenotypeFreq": 0.50442266, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.30774426, + "refHomGenotypeFreq": 0.05553294, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6686666, + "altHomGenotypeFreq": 0.3953878, + "hetGenotypeFreq": 0.5465576, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.33133337, + "refHomGenotypeFreq": 0.05805457, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6753653, + "altHomGenotypeFreq": 0.4217119, + "hetGenotypeFreq": 0.5073069, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.32463464, + "refHomGenotypeFreq": 0.07098121, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5987342, + "altHomGenotypeFreq": 0.24936709, + "hetGenotypeFreq": 0.69873416, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.40126583, + "refHomGenotypeFreq": 0.051898733, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7776413, + "altHomGenotypeFreq": 0.5872236, + "hetGenotypeFreq": 0.38083538, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.22235872, + "refHomGenotypeFreq": 0.03194103, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6666667, + "altHomGenotypeFreq": 0.414966, + "hetGenotypeFreq": 0.50340134, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.08163265, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.70454544, + "altHomGenotypeFreq": 0.4562937, + "hetGenotypeFreq": 0.4965035, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.29545453, + "refHomGenotypeFreq": 0.047202796, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.68679035, + "altHomGenotypeFreq": 0.42412075, + "hetGenotypeFreq": 0.52533925, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.31320962, + "refHomGenotypeFreq": 0.050540015, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6242781, + "altHomGenotypeFreq": 0.32555342, + "hetGenotypeFreq": 0.5974495, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.37572184, + "refHomGenotypeFreq": 0.076997116, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.668991, + "altHomGenotypeFreq": 0.39631337, + "hetGenotypeFreq": 0.5453553, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.33100897, + "refHomGenotypeFreq": 0.05833131, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.66826564, + "altHomGenotypeFreq": 0.39424375, + "hetGenotypeFreq": 0.5480438, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.33173436, + "refHomGenotypeFreq": 0.057712488, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67702776, + "altHomGenotypeFreq": 0.4114067, + "hetGenotypeFreq": 0.53130907, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.3229388, + "refHomGenotypeFreq": 0.057284266, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7114094, + "altHomGenotypeFreq": 0.4675615, + "hetGenotypeFreq": 0.48769575, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.2885906, + "refHomGenotypeFreq": 0.04474273, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6198651, + "altHomGenotypeFreq": 0.3199264, + "hetGenotypeFreq": 0.59987736, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.38013488, + "refHomGenotypeFreq": 0.0801962, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5995807, + "altHomGenotypeFreq": 0.25343582, + "hetGenotypeFreq": 0.69228977, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.4004193, + "refHomGenotypeFreq": 0.0542744, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.806491, + "altHomGenotypeFreq": 0.6361891, + "hetGenotypeFreq": 0.3413017, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.19316001, + "refHomGenotypeFreq": 0.022509161, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7073881, + "altHomGenotypeFreq": 0.46106684, + "hetGenotypeFreq": 0.49264255, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.2926119, + "refHomGenotypeFreq": 0.046290617, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6850485, + "altHomGenotypeFreq": 0.4257915, + "hetGenotypeFreq": 0.518514, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.3149515, + "refHomGenotypeFreq": 0.055694506, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6145529, + "altHomGenotypeFreq": 0.30956554, + "hetGenotypeFreq": 0.6099747, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.3854471, + "refHomGenotypeFreq": 0.08045977, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3828125, + "altHomGenotypeFreq": 0.046875, + "hetGenotypeFreq": 0.671875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.6171875, + "refHomGenotypeFreq": 0.28125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42032748, + "altHomGenotypeFreq": 0.04752396, + "hetGenotypeFreq": 0.745607, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5796725, + "refHomGenotypeFreq": 0.206869, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39468303, + "altHomGenotypeFreq": 0.018404908, + "hetGenotypeFreq": 0.7525562, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.605317, + "refHomGenotypeFreq": 0.22903885, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44148937, + "altHomGenotypeFreq": 0.06382979, + "hetGenotypeFreq": 0.7553191, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.55851066, + "refHomGenotypeFreq": 0.18085106, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38235295, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.7254902, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.61764705, + "refHomGenotypeFreq": 0.25490198, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42965204, + "altHomGenotypeFreq": 0.08018155, + "hetGenotypeFreq": 0.698941, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.57034796, + "refHomGenotypeFreq": 0.22087745, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41904762, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.83809525, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.5809524, + "refHomGenotypeFreq": 0.16190477, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.8269231, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.14423077, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45833334, + "altHomGenotypeFreq": 0.12037037, + "hetGenotypeFreq": 0.67592597, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.5416667, + "refHomGenotypeFreq": 0.2037037, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41666666, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8333333, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.5833333, + "refHomGenotypeFreq": 0.16666667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4159292, + "altHomGenotypeFreq": 0.053097345, + "hetGenotypeFreq": 0.7256637, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.5840708, + "refHomGenotypeFreq": 0.22123894, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39215687, + "altHomGenotypeFreq": 0.029411765, + "hetGenotypeFreq": 0.7254902, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.60784316, + "refHomGenotypeFreq": 0.24509804, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4945055, + "altHomGenotypeFreq": 0.06593407, + "hetGenotypeFreq": 0.85714287, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.50549453, + "refHomGenotypeFreq": 0.07692308, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39784947, + "altHomGenotypeFreq": 0.010752688, + "hetGenotypeFreq": 0.7741935, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.60215056, + "refHomGenotypeFreq": 0.21505377, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3838384, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.7474748, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.61616164, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45794392, + "altHomGenotypeFreq": 0.07476635, + "hetGenotypeFreq": 0.76635516, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.5420561, + "refHomGenotypeFreq": 0.1588785, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39534885, + "altHomGenotypeFreq": 0.034883723, + "hetGenotypeFreq": 0.7209302, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.60465115, + "refHomGenotypeFreq": 0.24418604, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38541666, + "altHomGenotypeFreq": 0.052083332, + "hetGenotypeFreq": 0.6666667, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.6145833, + "refHomGenotypeFreq": 0.28125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4040404, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.7070707, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.5959596, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45959595, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.6767677, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.540404, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4642147, + "altHomGenotypeFreq": 0.071570575, + "hetGenotypeFreq": 0.7852883, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.5357853, + "refHomGenotypeFreq": 0.14314115, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45901638, + "altHomGenotypeFreq": 0.114754096, + "hetGenotypeFreq": 0.6885246, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.5409836, + "refHomGenotypeFreq": 0.19672132, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38616714, + "altHomGenotypeFreq": 0.04034582, + "hetGenotypeFreq": 0.69164264, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.61383283, + "refHomGenotypeFreq": 0.26801154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43529412, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.7529412, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.5647059, + "refHomGenotypeFreq": 0.1882353, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3883495, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.75728154, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.61165047, + "refHomGenotypeFreq": 0.23300971, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44444445, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.74747473, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5555556, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45327103, + "altHomGenotypeFreq": 0.056074765, + "hetGenotypeFreq": 0.7943925, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.54672897, + "refHomGenotypeFreq": 0.1495327, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4278846, + "altHomGenotypeFreq": 0.048076924, + "hetGenotypeFreq": 0.7596154, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.57211536, + "refHomGenotypeFreq": 0.1923077, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47474748, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.7676768, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.5252525, + "refHomGenotypeFreq": 0.14141414, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5529412, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.7235294, + "refHomGenotypeFreq": 0.44705883, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41269842, + "altHomGenotypeFreq": 0.013888889, + "hetGenotypeFreq": 0.7976191, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5873016, + "refHomGenotypeFreq": 0.18849206, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41747573, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.7961165, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.5825243, + "refHomGenotypeFreq": 0.18446602, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38389513, + "altHomGenotypeFreq": 0.25093633, + "hetGenotypeFreq": 0.2659176, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.61610484, + "refHomGenotypeFreq": 0.48314607, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.685667, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.31433302, + "study": "DISCOVEHR" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22383066, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM3999468", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4N4", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM3999468", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 22383066, + "id": "15:22383066:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22383066, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1698, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.07434944 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 808, + "cdsPosition": 717, + "codon": "acG/acA", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.088809945 + } + ], + "geneName": "OR4N4", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 239, + "reference": "THR" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -5.329999923706055, + "source": "gerp" + }, + { + "score": 0.09700000286102295, + "source": "phastCons" + }, + { + "score": -0.6549999713897705, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": 0.06999969482421875, + "source": "cadd_raw" + }, + { + "score": 3.369999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-25078G>A", + "ENST00000558896(ENSG00000259176):n.1698G>A", + "ENST00000558312(ENSG00000259176):n.835-113G>A", + "ENST00000558798(ENSG00000259176):n.556-25078G>A", + "ENST00000328795(ENSG00000183706):c.717G>A", + "ENSP00000332500:p.Thr239=" + ], + "id": "rs1820851", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.51217633, + "altHomGenotypeFreq": 0.2183419, + "hetGenotypeFreq": 0.5876689, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.48782364, + "refHomGenotypeFreq": 0.19398919, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49774182, + "altHomGenotypeFreq": 0.19984946, + "hetGenotypeFreq": 0.5957847, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5022582, + "refHomGenotypeFreq": 0.20436582, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47958317, + "altHomGenotypeFreq": 0.1395856, + "hetGenotypeFreq": 0.6799952, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5204168, + "refHomGenotypeFreq": 0.18041924, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6960737, + "altHomGenotypeFreq": 0.47393537, + "hetGenotypeFreq": 0.44427666, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.30392632, + "refHomGenotypeFreq": 0.08178798, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4821128, + "altHomGenotypeFreq": 0.16856061, + "hetGenotypeFreq": 0.6271044, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.51788723, + "refHomGenotypeFreq": 0.20433502, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5023245, + "altHomGenotypeFreq": 0.18967922, + "hetGenotypeFreq": 0.6252906, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.4976755, + "refHomGenotypeFreq": 0.18503022, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49219793, + "altHomGenotypeFreq": 0.19016254, + "hetGenotypeFreq": 0.6040708, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.50780207, + "refHomGenotypeFreq": 0.20576666, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31260377, + "altHomGenotypeFreq": 0.057830658, + "hetGenotypeFreq": 0.5095462, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.6873962, + "refHomGenotypeFreq": 0.43262312, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.510332, + "altHomGenotypeFreq": 0.21238612, + "hetGenotypeFreq": 0.5958918, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.48966798, + "refHomGenotypeFreq": 0.19172211, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.51440644, + "altHomGenotypeFreq": 0.22554338, + "hetGenotypeFreq": 0.5777262, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.48559353, + "refHomGenotypeFreq": 0.19673045, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44341373, + "altHomGenotypeFreq": 0.14732358, + "hetGenotypeFreq": 0.5921803, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.55658627, + "refHomGenotypeFreq": 0.2604961, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47239915, + "altHomGenotypeFreq": 0.16985138, + "hetGenotypeFreq": 0.60509557, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5276008, + "refHomGenotypeFreq": 0.22505307, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4636724, + "altHomGenotypeFreq": 0.12021136, + "hetGenotypeFreq": 0.6869221, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5363276, + "refHomGenotypeFreq": 0.19286658, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.65925926, + "altHomGenotypeFreq": 0.42222223, + "hetGenotypeFreq": 0.47407407, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.34074074, + "refHomGenotypeFreq": 0.1037037, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47241378, + "altHomGenotypeFreq": 0.18620689, + "hetGenotypeFreq": 0.5724138, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5275862, + "refHomGenotypeFreq": 0.2413793, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49701494, + "altHomGenotypeFreq": 0.18865672, + "hetGenotypeFreq": 0.61671644, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.50298506, + "refHomGenotypeFreq": 0.19462687, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4870945, + "altHomGenotypeFreq": 0.17108604, + "hetGenotypeFreq": 0.6320169, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5129055, + "refHomGenotypeFreq": 0.19689704, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3137157, + "altHomGenotypeFreq": 0.061346635, + "hetGenotypeFreq": 0.50473815, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.6862843, + "refHomGenotypeFreq": 0.4339152, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44152775, + "altHomGenotypeFreq": 0.14742473, + "hetGenotypeFreq": 0.588206, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.5584723, + "refHomGenotypeFreq": 0.26436925, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4457406, + "altHomGenotypeFreq": 0.14719877, + "hetGenotypeFreq": 0.5970836, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.5542594, + "refHomGenotypeFreq": 0.25571758, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3256504, + "altHomGenotypeFreq": 0.06846189, + "hetGenotypeFreq": 0.514377, + "population": "AA", + "refAllele": "G", + "refAlleleFreq": 0.6743496, + "refHomGenotypeFreq": 0.4171611, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42964512, + "altHomGenotypeFreq": 0.14210445, + "hetGenotypeFreq": 0.57508135, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5703549, + "refHomGenotypeFreq": 0.2828142, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48310652, + "altHomGenotypeFreq": 0.17996246, + "hetGenotypeFreq": 0.60628814, + "population": "EA", + "refAllele": "G", + "refAlleleFreq": 0.5168935, + "refHomGenotypeFreq": 0.21374941, + "study": "ESP6500" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48096192, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5190381, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5019599, + "altHomGenotypeFreq": 0.2010642, + "hetGenotypeFreq": 0.60179144, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.49804008, + "refHomGenotypeFreq": 0.19714433, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5067114, + "altHomGenotypeFreq": 0.22595078, + "hetGenotypeFreq": 0.56152123, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.49328858, + "refHomGenotypeFreq": 0.21252796, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5102664, + "altHomGenotypeFreq": 0.19078465, + "hetGenotypeFreq": 0.6389636, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.48973355, + "refHomGenotypeFreq": 0.17025177, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48095238, + "altHomGenotypeFreq": 0.13379791, + "hetGenotypeFreq": 0.69430894, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5190476, + "refHomGenotypeFreq": 0.17189315, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7052934, + "altHomGenotypeFreq": 0.48563468, + "hetGenotypeFreq": 0.43931744, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.2947066, + "refHomGenotypeFreq": 0.07504789, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50550795, + "altHomGenotypeFreq": 0.1869645, + "hetGenotypeFreq": 0.6370869, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.49449205, + "refHomGenotypeFreq": 0.17594859, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49462792, + "altHomGenotypeFreq": 0.18642521, + "hetGenotypeFreq": 0.6164054, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5053721, + "refHomGenotypeFreq": 0.19716938, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32372355, + "altHomGenotypeFreq": 0.056493886, + "hetGenotypeFreq": 0.53445935, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.67627645, + "refHomGenotypeFreq": 0.4090468, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46629214, + "altHomGenotypeFreq": 0.1610487, + "hetGenotypeFreq": 0.61048687, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.53370786, + "refHomGenotypeFreq": 0.22846442, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.495338, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.50466204, + "study": "DISCOVEHR" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22383189, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [ + "PMID:26503331" + ], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM147864", + "somaticInformation": { + "histologySubtype": "squamous cell carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "surgery fresh/frozen", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM147864", + "somaticInformation": { + "histologySubtype": "neoplasm", + "primaryHistology": "other", + "primarySite": "liver", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM147864", + "somaticInformation": { + "histologySubtype": "acute myeloid leukaemia", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM147864", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "prostate", + "sampleSource": "fresh/frozen - NOS", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Reported in another cancer sample as somatic" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM147864", + "somaticInformation": { + "histologySubtype": "adenocarcinoma", + "primaryHistology": "carcinoma", + "primarySite": "stomach", + "sampleSource": "fresh/frozen - NOS", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "OR4N4" + } + }, + { + "featureType": "gene", + "xrefs": { + "symbol": "15375" + } + } + ], + "heritableTraits": [], + "id": "COSM147864", + "somaticInformation": { + "histologySubtype": "ductal carcinoma", + "primaryHistology": "carcinoma", + "primarySite": "pancreas", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "OR4N4", + "histologySubtype": "squamous cell carcinoma", + "mutationId": "COSM147864", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "surgery fresh/frozen", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "neoplasm", + "mutationId": "COSM147864", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "other", + "primarySite": "liver", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4N4", + "histologySubtype": "acute myeloid leukaemia", + "mutationId": "COSM147864", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "haematopoietic neoplasm", + "primarySite": "haematopoietic and lymphoid tissue", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM147864", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "prostate", + "sampleSource": "fresh/frozen - NOS", + "siteSubtype": "", + "tumourOrigin": "primary" + }, + { + "geneName": "OR4N4", + "histologySubtype": "adenocarcinoma", + "mutationId": "COSM147864", + "mutationSomaticStatus": "Reported in another cancer sample as somatic", + "primaryHistology": "carcinoma", + "primarySite": "stomach", + "sampleSource": "fresh/frozen - NOS", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "OR4N4", + "histologySubtype": "ductal carcinoma", + "mutationId": "COSM147864", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "pancreas", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + } + ] + } + }, + "chromosome": "15", + "end": 22383189, + "id": "15:22383189:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22383189, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1992, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.07434944 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "cdnaPosition": 1016, + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "exonOverlap": [ + { + "number": "7/7", + "percentage": 0.3846154 + } + ], + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "cdnaPosition": 1102, + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.088809945 + } + ], + "geneName": "OR4N4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001624", + "name": "3_prime_UTR_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.340000033378601, + "source": "gerp" + }, + { + "score": 0.11100000143051147, + "source": "phastCons" + }, + { + "score": 0.328000009059906, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "3_prime_UTR_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-24784delA", + "ENST00000558896(ENSG00000259176):n.1992delA", + "ENST00000558312(ENSG00000259176):n.1016delA", + "ENST00000558798(ENSG00000259176):n.556-24784delA", + "ENST00000328795(ENSG00000183706):c.*60delA" + ], + "id": "rs3841636", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.5823318, + "altHomGenotypeFreq": 0.29462892, + "hetGenotypeFreq": 0.5754057, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.41766822, + "refHomGenotypeFreq": 0.12996536, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.62473345, + "altHomGenotypeFreq": 0.3496802, + "hetGenotypeFreq": 0.5501066, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.37526652, + "refHomGenotypeFreq": 0.10021322, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6418663, + "altHomGenotypeFreq": 0.32030264, + "hetGenotypeFreq": 0.6431274, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.35813367, + "refHomGenotypeFreq": 0.036569986, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.75555557, + "altHomGenotypeFreq": 0.54814816, + "hetGenotypeFreq": 0.4148148, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.24444444, + "refHomGenotypeFreq": 0.037037037, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.62676054, + "altHomGenotypeFreq": 0.33802816, + "hetGenotypeFreq": 0.57746476, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.37323943, + "refHomGenotypeFreq": 0.08450704, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.65198106, + "altHomGenotypeFreq": 0.37374336, + "hetGenotypeFreq": 0.55647546, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.3480189, + "refHomGenotypeFreq": 0.06978119, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6472717, + "altHomGenotypeFreq": 0.36929289, + "hetGenotypeFreq": 0.5559577, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.35272828, + "refHomGenotypeFreq": 0.07474944, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.40230027, + "altHomGenotypeFreq": 0.090526834, + "hetGenotypeFreq": 0.6235469, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5976997, + "refHomGenotypeFreq": 0.28592628, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.58075833, + "altHomGenotypeFreq": 0.2944725, + "hetGenotypeFreq": 0.5725717, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.41924167, + "refHomGenotypeFreq": 0.1329558, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.58426714, + "altHomGenotypeFreq": 0.29482132, + "hetGenotypeFreq": 0.5788916, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.4157329, + "refHomGenotypeFreq": 0.1262871, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.69138277, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.30861723, + "study": "GONL" + }, + { + "altAllele": "", + "altAlleleFreq": 0.765625, + "altHomGenotypeFreq": 0.59375, + "hetGenotypeFreq": 0.34375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.234375, + "refHomGenotypeFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5926518, + "altHomGenotypeFreq": 0.32028753, + "hetGenotypeFreq": 0.54472846, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.40734825, + "refHomGenotypeFreq": 0.13498403, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6952965, + "altHomGenotypeFreq": 0.44376278, + "hetGenotypeFreq": 0.5030675, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.30470347, + "refHomGenotypeFreq": 0.053169735, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.67021275, + "altHomGenotypeFreq": 0.42553192, + "hetGenotypeFreq": 0.4893617, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.32978722, + "refHomGenotypeFreq": 0.08510638, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6960784, + "altHomGenotypeFreq": 0.44117647, + "hetGenotypeFreq": 0.50980395, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.30392158, + "refHomGenotypeFreq": 0.04901961, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.37897125, + "altHomGenotypeFreq": 0.083207265, + "hetGenotypeFreq": 0.59152794, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6210287, + "refHomGenotypeFreq": 0.32526475, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6333333, + "altHomGenotypeFreq": 0.30476192, + "hetGenotypeFreq": 0.6571429, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.36666667, + "refHomGenotypeFreq": 0.03809524, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6105769, + "altHomGenotypeFreq": 0.31730768, + "hetGenotypeFreq": 0.58653843, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.38942307, + "refHomGenotypeFreq": 0.09615385, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3287037, + "altHomGenotypeFreq": 0.037037037, + "hetGenotypeFreq": 0.5833334, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.6712963, + "refHomGenotypeFreq": 0.37962964, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.75, + "altHomGenotypeFreq": 0.5416667, + "hetGenotypeFreq": 0.41666666, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.25, + "refHomGenotypeFreq": 0.041666668, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3761062, + "altHomGenotypeFreq": 0.07079646, + "hetGenotypeFreq": 0.6106195, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.6238938, + "refHomGenotypeFreq": 0.31858408, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6813725, + "altHomGenotypeFreq": 0.44117647, + "hetGenotypeFreq": 0.48039216, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.31862745, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.63736266, + "altHomGenotypeFreq": 0.34065935, + "hetGenotypeFreq": 0.5934066, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.36263737, + "refHomGenotypeFreq": 0.06593407, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6182796, + "altHomGenotypeFreq": 0.2795699, + "hetGenotypeFreq": 0.6774193, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.38172042, + "refHomGenotypeFreq": 0.043010753, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6212121, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.6363636, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.37878788, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.64953274, + "altHomGenotypeFreq": 0.37383178, + "hetGenotypeFreq": 0.55140185, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.3504673, + "refHomGenotypeFreq": 0.07476635, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.60465115, + "altHomGenotypeFreq": 0.27906978, + "hetGenotypeFreq": 0.6511628, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.39534885, + "refHomGenotypeFreq": 0.069767445, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4375, + "altHomGenotypeFreq": 0.15625, + "hetGenotypeFreq": 0.5625, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.5625, + "refHomGenotypeFreq": 0.28125, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.34848484, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.57575756, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.6515151, + "refHomGenotypeFreq": 0.36363637, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4090909, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.57575756, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.59090906, + "refHomGenotypeFreq": 0.3030303, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.65308154, + "altHomGenotypeFreq": 0.3856859, + "hetGenotypeFreq": 0.53479123, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.3469185, + "refHomGenotypeFreq": 0.07952286, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.39344263, + "altHomGenotypeFreq": 0.114754096, + "hetGenotypeFreq": 0.55737704, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.60655737, + "refHomGenotypeFreq": 0.32786885, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.7291066, + "altHomGenotypeFreq": 0.5302594, + "hetGenotypeFreq": 0.39769453, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.27089337, + "refHomGenotypeFreq": 0.07204611, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.37058824, + "altHomGenotypeFreq": 0.03529412, + "hetGenotypeFreq": 0.67058825, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.62941176, + "refHomGenotypeFreq": 0.29411766, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.7330097, + "altHomGenotypeFreq": 0.49514562, + "hetGenotypeFreq": 0.47572815, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.2669903, + "refHomGenotypeFreq": 0.029126214, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.65656567, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.5454545, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.34343433, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6869159, + "altHomGenotypeFreq": 0.44859812, + "hetGenotypeFreq": 0.47663552, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.31308413, + "refHomGenotypeFreq": 0.07476635, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6298077, + "altHomGenotypeFreq": 0.375, + "hetGenotypeFreq": 0.50961536, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.37019232, + "refHomGenotypeFreq": 0.115384616, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.63131315, + "altHomGenotypeFreq": 0.37373737, + "hetGenotypeFreq": 0.5151515, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.36868685, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.8882353, + "altHomGenotypeFreq": 0.7882353, + "hetGenotypeFreq": 0.2, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.11176471, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.61904764, + "altHomGenotypeFreq": 0.3015873, + "hetGenotypeFreq": 0.6349206, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.3809524, + "refHomGenotypeFreq": 0.06349207, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.61165047, + "altHomGenotypeFreq": 0.30097088, + "hetGenotypeFreq": 0.6213592, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.3883495, + "refHomGenotypeFreq": 0.0776699, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22383483, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22383483, + "id": "15:22383483:A:-", + "length": 1, + "names": [], + "reference": "A", + "start": 22383483, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "geneName": "OR4N4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.12999999523162842, + "source": "gerp" + }, + { + "score": 0.07500000298023224, + "source": "phastCons" + }, + { + "score": 0.18700000643730164, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.9000000953674316, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-23901C>G", + "ENST00000558798(ENSG00000259176):n.556-23901C>G" + ], + "id": "rs1975067", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.5084255, + "altHomGenotypeFreq": 0.14141278, + "hetGenotypeFreq": 0.73402536, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.49157456, + "refHomGenotypeFreq": 0.124561876, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55073994, + "altHomGenotypeFreq": 0.17758985, + "hetGenotypeFreq": 0.7463002, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.44926006, + "refHomGenotypeFreq": 0.07610994, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4535484, + "altHomGenotypeFreq": 0.076129034, + "hetGenotypeFreq": 0.7548387, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5464516, + "refHomGenotypeFreq": 0.16903226, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6767554, + "altHomGenotypeFreq": 0.39709443, + "hetGenotypeFreq": 0.55932206, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.32324454, + "refHomGenotypeFreq": 0.043583535, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5033557, + "altHomGenotypeFreq": 0.16107382, + "hetGenotypeFreq": 0.68456376, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.4966443, + "refHomGenotypeFreq": 0.15436241, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5648474, + "altHomGenotypeFreq": 0.18368545, + "hetGenotypeFreq": 0.7623239, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.4351526, + "refHomGenotypeFreq": 0.05399061, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5520819, + "altHomGenotypeFreq": 0.17665529, + "hetGenotypeFreq": 0.75085324, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.4479181, + "refHomGenotypeFreq": 0.07249147, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3927946, + "altHomGenotypeFreq": 0.04003002, + "hetGenotypeFreq": 0.70552915, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.6072054, + "refHomGenotypeFreq": 0.25444084, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5067642, + "altHomGenotypeFreq": 0.14162096, + "hetGenotypeFreq": 0.7302864, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.49323583, + "refHomGenotypeFreq": 0.12809263, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.51048106, + "altHomGenotypeFreq": 0.14115518, + "hetGenotypeFreq": 0.7386518, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.48951894, + "refHomGenotypeFreq": 0.120193034, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22384366, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22384366, + "id": "15:22384366:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22384366, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558896", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558312", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000183706", + "ensemblTranscriptId": "ENST00000328795", + "geneName": "OR4N4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.14900000393390656, + "source": "gerp" + }, + { + "score": 0.01899999938905239, + "source": "phastCons" + }, + { + "score": -1.062999963760376, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.23999977111816406, + "source": "cadd_raw" + }, + { + "score": 5.139999866485596, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-21628A>G", + "ENST00000558798(ENSG00000259176):n.556-21628A>G" + ], + "id": "rs11259850", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.48311266, + "altHomGenotypeFreq": 0.10584977, + "hetGenotypeFreq": 0.7545258, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5168873, + "refHomGenotypeFreq": 0.13962443, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4766949, + "altHomGenotypeFreq": 0.09957627, + "hetGenotypeFreq": 0.7542373, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.52330506, + "refHomGenotypeFreq": 0.14618644, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7234042, + "altHomGenotypeFreq": 0.46182728, + "hetGenotypeFreq": 0.52315396, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.27659574, + "refHomGenotypeFreq": 0.015018773, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.58312654, + "altHomGenotypeFreq": 0.24317618, + "hetGenotypeFreq": 0.67990077, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.41687346, + "refHomGenotypeFreq": 0.07692308, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44333333, + "altHomGenotypeFreq": 0.06, + "hetGenotypeFreq": 0.76666665, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5566667, + "refHomGenotypeFreq": 0.17333333, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.486535, + "altHomGenotypeFreq": 0.08318372, + "hetGenotypeFreq": 0.80670255, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.513465, + "refHomGenotypeFreq": 0.1101137, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46960634, + "altHomGenotypeFreq": 0.08805119, + "hetGenotypeFreq": 0.7631103, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.53039366, + "refHomGenotypeFreq": 0.1488385, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45109224, + "altHomGenotypeFreq": 0.066019416, + "hetGenotypeFreq": 0.77014565, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.54890776, + "refHomGenotypeFreq": 0.16383494, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48508558, + "altHomGenotypeFreq": 0.113447435, + "hetGenotypeFreq": 0.7432763, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.51491445, + "refHomGenotypeFreq": 0.14327629, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48067632, + "altHomGenotypeFreq": 0.09646739, + "hetGenotypeFreq": 0.7684179, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.51932365, + "refHomGenotypeFreq": 0.13511473, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46092185, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5390781, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.625, + "altHomGenotypeFreq": 0.34375, + "hetGenotypeFreq": 0.5625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.375, + "refHomGenotypeFreq": 0.09375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5259585, + "altHomGenotypeFreq": 0.20407349, + "hetGenotypeFreq": 0.64377, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.47404152, + "refHomGenotypeFreq": 0.15215655, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4805726, + "altHomGenotypeFreq": 0.12883435, + "hetGenotypeFreq": 0.7034764, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.5194274, + "refHomGenotypeFreq": 0.16768916, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49468085, + "altHomGenotypeFreq": 0.15957446, + "hetGenotypeFreq": 0.67021275, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.5053192, + "refHomGenotypeFreq": 0.17021276, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47058824, + "altHomGenotypeFreq": 0.09803922, + "hetGenotypeFreq": 0.74509805, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.5294118, + "refHomGenotypeFreq": 0.15686275, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42889562, + "altHomGenotypeFreq": 0.07261725, + "hetGenotypeFreq": 0.7125567, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5711044, + "refHomGenotypeFreq": 0.21482602, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7285714, + "altHomGenotypeFreq": 0.46666667, + "hetGenotypeFreq": 0.52380955, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.27142859, + "refHomGenotypeFreq": 0.00952381, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.71634614, + "altHomGenotypeFreq": 0.4903846, + "hetGenotypeFreq": 0.45192307, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.28365386, + "refHomGenotypeFreq": 0.057692308, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4074074, + "altHomGenotypeFreq": 0.055555556, + "hetGenotypeFreq": 0.7037037, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.5925926, + "refHomGenotypeFreq": 0.24074075, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5104167, + "altHomGenotypeFreq": 0.17708333, + "hetGenotypeFreq": 0.6666666, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.48958334, + "refHomGenotypeFreq": 0.15625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4380531, + "altHomGenotypeFreq": 0.07079646, + "hetGenotypeFreq": 0.7345133, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.5619469, + "refHomGenotypeFreq": 0.19469027, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46568626, + "altHomGenotypeFreq": 0.11764706, + "hetGenotypeFreq": 0.6960784, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.53431374, + "refHomGenotypeFreq": 0.18627451, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43406594, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.71428573, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.56593406, + "refHomGenotypeFreq": 0.20879121, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.70430106, + "altHomGenotypeFreq": 0.4408602, + "hetGenotypeFreq": 0.5268817, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.2956989, + "refHomGenotypeFreq": 0.032258064, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6969697, + "altHomGenotypeFreq": 0.41414142, + "hetGenotypeFreq": 0.56565654, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.3030303, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42056075, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.7102804, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.5794392, + "refHomGenotypeFreq": 0.22429906, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48255813, + "altHomGenotypeFreq": 0.13953489, + "hetGenotypeFreq": 0.6860465, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.51744187, + "refHomGenotypeFreq": 0.1744186, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41145834, + "altHomGenotypeFreq": 0.072916664, + "hetGenotypeFreq": 0.6770834, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.5885417, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41414142, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.68686867, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.5858586, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42929292, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.7373737, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.5707071, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45427436, + "altHomGenotypeFreq": 0.11332008, + "hetGenotypeFreq": 0.68190855, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.54572564, + "refHomGenotypeFreq": 0.20477137, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46721312, + "altHomGenotypeFreq": 0.114754096, + "hetGenotypeFreq": 0.704918, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.5327869, + "refHomGenotypeFreq": 0.18032786, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.59365994, + "altHomGenotypeFreq": 0.3054755, + "hetGenotypeFreq": 0.57636887, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.40634006, + "refHomGenotypeFreq": 0.11815562, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45294118, + "altHomGenotypeFreq": 0.08235294, + "hetGenotypeFreq": 0.7411765, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.5470588, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47572815, + "altHomGenotypeFreq": 0.116504855, + "hetGenotypeFreq": 0.7184466, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.52427185, + "refHomGenotypeFreq": 0.16504854, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47474748, + "altHomGenotypeFreq": 0.16161616, + "hetGenotypeFreq": 0.62626266, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5252525, + "refHomGenotypeFreq": 0.21212122, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47663552, + "altHomGenotypeFreq": 0.13084112, + "hetGenotypeFreq": 0.69158876, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.5233645, + "refHomGenotypeFreq": 0.17757009, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5144231, + "altHomGenotypeFreq": 0.1923077, + "hetGenotypeFreq": 0.6442308, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.48557693, + "refHomGenotypeFreq": 0.16346154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46464646, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.6666666, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.53535354, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7764706, + "altHomGenotypeFreq": 0.5764706, + "hetGenotypeFreq": 0.4, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.22352941, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7222222, + "altHomGenotypeFreq": 0.4702381, + "hetGenotypeFreq": 0.50396824, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.2777778, + "refHomGenotypeFreq": 0.025793651, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7621359, + "altHomGenotypeFreq": 0.5339806, + "hetGenotypeFreq": 0.4563107, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.23786408, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22386639, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22386639, + "id": "15:22386639:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22386639, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.08900000154972076, + "source": "phastCons" + }, + { + "score": 0.06400000303983688, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.2700004577636719, + "source": "cadd_raw" + }, + { + "score": 0.8100000023841858, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.292-12606C>G", + "ENST00000558798(ENSG00000259176):n.556-12606C>G" + ], + "id": "rs267621", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.3699713, + "altHomGenotypeFreq": 0.042748198, + "hetGenotypeFreq": 0.65444624, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.63002867, + "refHomGenotypeFreq": 0.30280557, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3975501, + "altHomGenotypeFreq": 0.051224943, + "hetGenotypeFreq": 0.6926503, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.6024499, + "refHomGenotypeFreq": 0.25612473, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37649402, + "altHomGenotypeFreq": 0.055776894, + "hetGenotypeFreq": 0.64143425, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.62350595, + "refHomGenotypeFreq": 0.30278885, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5277778, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.7121212, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.4722222, + "refHomGenotypeFreq": 0.116161615, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36363637, + "altHomGenotypeFreq": 0.027972028, + "hetGenotypeFreq": 0.67132866, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.6363636, + "refHomGenotypeFreq": 0.3006993, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4229335, + "altHomGenotypeFreq": 0.046612803, + "hetGenotypeFreq": 0.7526414, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5770665, + "refHomGenotypeFreq": 0.2007458, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40976098, + "altHomGenotypeFreq": 0.049663663, + "hetGenotypeFreq": 0.72019464, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.590239, + "refHomGenotypeFreq": 0.23014168, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25821537, + "altHomGenotypeFreq": 0.013144591, + "hetGenotypeFreq": 0.49014157, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.74178463, + "refHomGenotypeFreq": 0.49671385, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36642623, + "altHomGenotypeFreq": 0.04252088, + "hetGenotypeFreq": 0.6478107, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.6335738, + "refHomGenotypeFreq": 0.30966845, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37435457, + "altHomGenotypeFreq": 0.04302926, + "hetGenotypeFreq": 0.6626506, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.62564546, + "refHomGenotypeFreq": 0.29432014, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22395661, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22395661, + "id": "15:22395661:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22395661, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.5499999523162842, + "source": "gerp" + }, + { + "score": 0.2590000033378601, + "source": "phastCons" + }, + { + "score": 0.3190000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.5200004577636719, + "source": "cadd_raw" + }, + { + "score": 7.639999866485596, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.490+1849A>G" + ], + "id": "rs185572", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.39353308, + "altHomGenotypeFreq": 0.05468259, + "hetGenotypeFreq": 0.67770094, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.60646695, + "refHomGenotypeFreq": 0.26761645, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40401787, + "altHomGenotypeFreq": 0.071428575, + "hetGenotypeFreq": 0.6651786, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.59598213, + "refHomGenotypeFreq": 0.26339287, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39037433, + "altHomGenotypeFreq": 0.069518715, + "hetGenotypeFreq": 0.64171124, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6096257, + "refHomGenotypeFreq": 0.28877005, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54125, + "altHomGenotypeFreq": 0.1825, + "hetGenotypeFreq": 0.7175, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.45875, + "refHomGenotypeFreq": 0.1, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36619717, + "altHomGenotypeFreq": 0.028169014, + "hetGenotypeFreq": 0.6760563, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.63380283, + "refHomGenotypeFreq": 0.29577464, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43421865, + "altHomGenotypeFreq": 0.06053119, + "hetGenotypeFreq": 0.74737495, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.56578135, + "refHomGenotypeFreq": 0.19209388, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42680675, + "altHomGenotypeFreq": 0.062047422, + "hetGenotypeFreq": 0.72951865, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.57319325, + "refHomGenotypeFreq": 0.20843391, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30224547, + "altHomGenotypeFreq": 0.022199541, + "hetGenotypeFreq": 0.56009185, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6977545, + "refHomGenotypeFreq": 0.4177086, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39151004, + "altHomGenotypeFreq": 0.056011103, + "hetGenotypeFreq": 0.67099786, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.60849, + "refHomGenotypeFreq": 0.27299103, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39604193, + "altHomGenotypeFreq": 0.053035043, + "hetGenotypeFreq": 0.68601376, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6039581, + "refHomGenotypeFreq": 0.2609512, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22410314, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22410314, + "id": "15:22410314:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22410314, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+" + }, + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000558798", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.950000047683716, + "source": "gerp" + }, + { + "score": 0.012000000104308128, + "source": "phastCons" + }, + { + "score": 0.3779999911785126, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 3.5999999046325684, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559392(ENSG00000259176):n.491-145G>A" + ], + "id": "rs267611", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.371624, + "altHomGenotypeFreq": 0.042090494, + "hetGenotypeFreq": 0.659067, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.628376, + "refHomGenotypeFreq": 0.29884252, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39198217, + "altHomGenotypeFreq": 0.04899777, + "hetGenotypeFreq": 0.6859688, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.6080178, + "refHomGenotypeFreq": 0.2650334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38085675, + "altHomGenotypeFreq": 0.06693441, + "hetGenotypeFreq": 0.6278447, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.61914325, + "refHomGenotypeFreq": 0.30522087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5277778, + "altHomGenotypeFreq": 0.16919191, + "hetGenotypeFreq": 0.7171717, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.4722222, + "refHomGenotypeFreq": 0.11363637, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3586207, + "altHomGenotypeFreq": 0.020689655, + "hetGenotypeFreq": 0.6758621, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.6413793, + "refHomGenotypeFreq": 0.3034483, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.423995, + "altHomGenotypeFreq": 0.048366833, + "hetGenotypeFreq": 0.7512563, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.57600504, + "refHomGenotypeFreq": 0.20037688, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4055984, + "altHomGenotypeFreq": 0.04641531, + "hetGenotypeFreq": 0.7183662, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5944016, + "refHomGenotypeFreq": 0.23521851, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27038735, + "altHomGenotypeFreq": 0.014271152, + "hetGenotypeFreq": 0.5122324, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.72961265, + "refHomGenotypeFreq": 0.47349644, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3680081, + "altHomGenotypeFreq": 0.04201468, + "hetGenotypeFreq": 0.65198684, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.6319919, + "refHomGenotypeFreq": 0.30599847, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37612152, + "altHomGenotypeFreq": 0.042184796, + "hetGenotypeFreq": 0.66787344, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6238785, + "refHomGenotypeFreq": 0.28994176, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22413308, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22413308, + "id": "15:22413308:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22413308, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 29, + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "exonOverlap": [ + { + "number": "1/1", + "percentage": -1 + } + ], + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.4500000476837158, + "source": "gerp" + }, + { + "score": 0.5130000114440918, + "source": "phastCons" + }, + { + "score": 0.3190000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559395(ENSG00000259435):n.33dupT" + ], + "id": "rs79042047", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.28142038, + "altHomGenotypeFreq": 0.012162729, + "hetGenotypeFreq": 0.5385153, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.7185796, + "refHomGenotypeFreq": 0.44932196, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30829597, + "altHomGenotypeFreq": 0.00896861, + "hetGenotypeFreq": 0.5986547, + "population": "OTH", + "refAllele": "", + "refAlleleFreq": 0.69170403, + "refHomGenotypeFreq": 0.3923767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1346912, + "altHomGenotypeFreq": 0.0026281208, + "hetGenotypeFreq": 0.26412615, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.8653088, + "refHomGenotypeFreq": 0.73324573, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26005024, + "altHomGenotypeFreq": 0.010050251, + "hetGenotypeFreq": 0.5, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.73994976, + "refHomGenotypeFreq": 0.48994976, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3309859, + "altHomGenotypeFreq": 0.02112676, + "hetGenotypeFreq": 0.6197183, + "population": "ASJ", + "refAllele": "", + "refAlleleFreq": 0.6690141, + "refHomGenotypeFreq": 0.35915494, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30314234, + "altHomGenotypeFreq": 0.015403573, + "hetGenotypeFreq": 0.57547754, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.6968577, + "refHomGenotypeFreq": 0.40911892, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30635756, + "altHomGenotypeFreq": 0.015645001, + "hetGenotypeFreq": 0.58142513, + "population": "NFE", + "refAllele": "", + "refAlleleFreq": 0.69364244, + "refHomGenotypeFreq": 0.40292987, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25339308, + "altHomGenotypeFreq": 0.006658131, + "hetGenotypeFreq": 0.49346992, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.7466069, + "refHomGenotypeFreq": 0.49987197, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27872476, + "altHomGenotypeFreq": 0.013762626, + "hetGenotypeFreq": 0.5299242, + "population": "MALE", + "refAllele": "", + "refAlleleFreq": 0.72127527, + "refHomGenotypeFreq": 0.45631313, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28476354, + "altHomGenotypeFreq": 0.010178516, + "hetGenotypeFreq": 0.5491701, + "population": "FEMALE", + "refAllele": "", + "refAlleleFreq": 0.7152364, + "refHomGenotypeFreq": 0.44065142, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2578125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.515625, + "population": "MXL", + "refAllele": "", + "refAlleleFreq": 0.7421875, + "refHomGenotypeFreq": 0.484375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25339457, + "altHomGenotypeFreq": 0.0067891376, + "hetGenotypeFreq": 0.49321085, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.74660546, + "refHomGenotypeFreq": 0.5, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30470347, + "altHomGenotypeFreq": 0.0020449897, + "hetGenotypeFreq": 0.605317, + "population": "SAS", + "refAllele": "", + "refAlleleFreq": 0.6952965, + "refHomGenotypeFreq": 0.39263803, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2712766, + "altHomGenotypeFreq": 0.021276595, + "hetGenotypeFreq": 0.5, + "population": "CLM", + "refAllele": "", + "refAlleleFreq": 0.7287234, + "refHomGenotypeFreq": 0.4787234, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2990196, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5980392, + "population": "ITU", + "refAllele": "", + "refAlleleFreq": 0.70098037, + "refHomGenotypeFreq": 0.4019608, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25642964, + "altHomGenotypeFreq": 0.009077156, + "hetGenotypeFreq": 0.494705, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.7435703, + "refHomGenotypeFreq": 0.49621785, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15238096, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30476192, + "population": "CHS", + "refAllele": "", + "refAlleleFreq": 0.84761906, + "refHomGenotypeFreq": 0.6952381, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16826923, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.33653846, + "population": "JPT", + "refAllele": "", + "refAlleleFreq": 0.8317308, + "refHomGenotypeFreq": 0.66346157, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.018518519, + "hetGenotypeFreq": 0.46296299, + "population": "YRI", + "refAllele": "", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.5185185, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5625, + "population": "PJL", + "refAllele": "", + "refAlleleFreq": 0.71875, + "refHomGenotypeFreq": 0.4375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2300885, + "altHomGenotypeFreq": 0.0088495575, + "hetGenotypeFreq": 0.44247788, + "population": "GWD", + "refAllele": "", + "refAlleleFreq": 0.7699115, + "refHomGenotypeFreq": 0.54867256, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3137255, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.627451, + "population": "STU", + "refAllele": "", + "refAlleleFreq": 0.6862745, + "refHomGenotypeFreq": 0.37254903, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35714287, + "altHomGenotypeFreq": 0.021978023, + "hetGenotypeFreq": 0.6703297, + "population": "GBR", + "refAllele": "", + "refAlleleFreq": 0.64285713, + "refHomGenotypeFreq": 0.30769232, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3333333, + "population": "CDX", + "refAllele": "", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.116161615, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23232323, + "population": "KHV", + "refAllele": "", + "refAlleleFreq": 0.88383836, + "refHomGenotypeFreq": 0.7676768, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2897196, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.5607477, + "population": "IBS", + "refAllele": "", + "refAlleleFreq": 0.71028036, + "refHomGenotypeFreq": 0.42990655, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2848837, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5697675, + "population": "BEB", + "refAllele": "", + "refAlleleFreq": 0.71511626, + "refHomGenotypeFreq": 0.43023255, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26041666, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.5, + "population": "ACB", + "refAllele": "", + "refAlleleFreq": 0.7395833, + "refHomGenotypeFreq": 0.48958334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2929293, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5858586, + "population": "ESN", + "refAllele": "", + "refAlleleFreq": 0.7070707, + "refHomGenotypeFreq": 0.41414142, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28787878, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.53535354, + "population": "LWK", + "refAllele": "", + "refAlleleFreq": 0.7121212, + "refHomGenotypeFreq": 0.44444445, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31709743, + "altHomGenotypeFreq": 0.01192843, + "hetGenotypeFreq": 0.610338, + "population": "EUR", + "refAllele": "", + "refAlleleFreq": 0.6829026, + "refHomGenotypeFreq": 0.3777336, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23770492, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.47540984, + "population": "ASW", + "refAllele": "", + "refAlleleFreq": 0.76229507, + "refHomGenotypeFreq": 0.52459013, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23631124, + "altHomGenotypeFreq": 0.011527377, + "hetGenotypeFreq": 0.44956774, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.76368874, + "refHomGenotypeFreq": 0.5389049, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22941177, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.45882356, + "population": "MSL", + "refAllele": "", + "refAlleleFreq": 0.7705882, + "refHomGenotypeFreq": 0.5411765, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3398058, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.66019416, + "population": "GIH", + "refAllele": "", + "refAlleleFreq": 0.66019416, + "refHomGenotypeFreq": 0.33009708, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2929293, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5858586, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.7070707, + "refHomGenotypeFreq": 0.41414142, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3084112, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6168224, + "population": "TSI", + "refAllele": "", + "refAlleleFreq": 0.69158876, + "refHomGenotypeFreq": 0.38317758, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2596154, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.5, + "population": "PUR", + "refAllele": "", + "refAlleleFreq": 0.74038464, + "refHomGenotypeFreq": 0.4903846, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34343433, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.62626266, + "population": "CEU", + "refAllele": "", + "refAlleleFreq": 0.65656567, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15294118, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.28235295, + "population": "PEL", + "refAllele": "", + "refAlleleFreq": 0.84705883, + "refHomGenotypeFreq": 0.7058824, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14781746, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.29563493, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.85218257, + "refHomGenotypeFreq": 0.7043651, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13592233, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.27184469, + "population": "CHB", + "refAllele": "", + "refAlleleFreq": 0.8640777, + "refHomGenotypeFreq": 0.7281553, + "study": "1kG_phase3" + } + ], + "reference": "", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22413598, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22413597, + "id": "15:22413598:-:T", + "length": 1, + "names": [], + "reference": "", + "start": 22413598, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 257, + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.12224939 + } + ], + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2999999523162842, + "source": "gerp" + }, + { + "score": 0.7129999995231628, + "source": "phastCons" + }, + { + "score": 0.3880000114440918, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.6499996185302734, + "source": "cadd_raw" + }, + { + "score": 14.130000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559395(ENSG00000259435):n.257C>T" + ], + "id": "rs267613", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.41276807, + "altHomGenotypeFreq": 0.07151283, + "hetGenotypeFreq": 0.6825105, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.58723193, + "refHomGenotypeFreq": 0.24597669, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4008758, + "altHomGenotypeFreq": 0.05732484, + "hetGenotypeFreq": 0.6871019, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.5991242, + "refHomGenotypeFreq": 0.25557324, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3601598, + "altHomGenotypeFreq": 0.052638255, + "hetGenotypeFreq": 0.6150431, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6398402, + "refHomGenotypeFreq": 0.33231863, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.54943186, + "altHomGenotypeFreq": 0.2099543, + "hetGenotypeFreq": 0.6789552, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.4505681, + "refHomGenotypeFreq": 0.111090526, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39012596, + "altHomGenotypeFreq": 0.04385965, + "hetGenotypeFreq": 0.6925326, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.60987407, + "refHomGenotypeFreq": 0.26360774, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42422593, + "altHomGenotypeFreq": 0.054505885, + "hetGenotypeFreq": 0.7394401, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5757741, + "refHomGenotypeFreq": 0.20605402, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3936352, + "altHomGenotypeFreq": 0.04665838, + "hetGenotypeFreq": 0.69395363, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.6063648, + "refHomGenotypeFreq": 0.259388, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26684853, + "altHomGenotypeFreq": 0.010470432, + "hetGenotypeFreq": 0.5127562, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.73315144, + "refHomGenotypeFreq": 0.47677335, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4098741, + "altHomGenotypeFreq": 0.06611757, + "hetGenotypeFreq": 0.6875131, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.59012586, + "refHomGenotypeFreq": 0.24636933, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41625118, + "altHomGenotypeFreq": 0.078006476, + "hetGenotypeFreq": 0.6764894, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.5837488, + "refHomGenotypeFreq": 0.2455041, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37113184, + "altHomGenotypeFreq": 0.041961968, + "hetGenotypeFreq": 0.65833974, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.62886816, + "refHomGenotypeFreq": 0.29969826, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.390625, + "altHomGenotypeFreq": 0.04910714, + "hetGenotypeFreq": 0.68303573, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.609375, + "refHomGenotypeFreq": 0.26785713, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3806366, + "altHomGenotypeFreq": 0.062334217, + "hetGenotypeFreq": 0.6366048, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.61936337, + "refHomGenotypeFreq": 0.301061, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5274314, + "altHomGenotypeFreq": 0.16957606, + "hetGenotypeFreq": 0.7157107, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.47256857, + "refHomGenotypeFreq": 0.114713214, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3657718, + "altHomGenotypeFreq": 0.020134227, + "hetGenotypeFreq": 0.6912752, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.63422817, + "refHomGenotypeFreq": 0.2885906, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42420462, + "altHomGenotypeFreq": 0.048034936, + "hetGenotypeFreq": 0.75233936, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5757954, + "refHomGenotypeFreq": 0.1996257, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40472442, + "altHomGenotypeFreq": 0.046814602, + "hetGenotypeFreq": 0.7158196, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.5952756, + "refHomGenotypeFreq": 0.23736578, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2694963, + "altHomGenotypeFreq": 0.01380721, + "hetGenotypeFreq": 0.51137817, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7305037, + "refHomGenotypeFreq": 0.47481462, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36791497, + "altHomGenotypeFreq": 0.04187753, + "hetGenotypeFreq": 0.6520749, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.632085, + "refHomGenotypeFreq": 0.30604756, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37513787, + "altHomGenotypeFreq": 0.042067118, + "hetGenotypeFreq": 0.6661415, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.62486213, + "refHomGenotypeFreq": 0.2917914, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41085744, + "altHomGenotypeFreq": 0.06042361, + "hetGenotypeFreq": 0.70086765, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.58914256, + "refHomGenotypeFreq": 0.23870872, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39183223, + "altHomGenotypeFreq": 0.050772626, + "hetGenotypeFreq": 0.6821192, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.60816777, + "refHomGenotypeFreq": 0.26710817, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42852813, + "altHomGenotypeFreq": 0.060863238, + "hetGenotypeFreq": 0.73532975, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.57147187, + "refHomGenotypeFreq": 0.20380698, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36159572, + "altHomGenotypeFreq": 0.046522446, + "hetGenotypeFreq": 0.63014656, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6384043, + "refHomGenotypeFreq": 0.323331, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5536425, + "altHomGenotypeFreq": 0.21024399, + "hetGenotypeFreq": 0.686797, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.4463575, + "refHomGenotypeFreq": 0.10295899, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43517116, + "altHomGenotypeFreq": 0.056043625, + "hetGenotypeFreq": 0.75825506, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5648288, + "refHomGenotypeFreq": 0.1857013, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40432137, + "altHomGenotypeFreq": 0.044533078, + "hetGenotypeFreq": 0.71957654, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.5956786, + "refHomGenotypeFreq": 0.23589036, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29291764, + "altHomGenotypeFreq": 0.010200154, + "hetGenotypeFreq": 0.56543493, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7070824, + "refHomGenotypeFreq": 0.4243649, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35955057, + "altHomGenotypeFreq": 0.033707865, + "hetGenotypeFreq": 0.6516854, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.64044946, + "refHomGenotypeFreq": 0.31460676, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.406266, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.593734, + "study": "DISCOVEHR" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22413825, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22413825, + "id": "15:22413825:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22413825, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 372, + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.12224939 + } + ], + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2999999523162842, + "source": "gerp" + }, + { + "score": 0.718999981880188, + "source": "phastCons" + }, + { + "score": 0.3190000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.1899995803833008, + "source": "cadd_raw" + }, + { + "score": 11.710000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559395(ENSG00000259435):n.372T>C" + ], + "id": "rs7167256", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.28033015, + "altHomGenotypeFreq": 0.012157186, + "hetGenotypeFreq": 0.5363459, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7196699, + "refHomGenotypeFreq": 0.4514969, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29871893, + "altHomGenotypeFreq": 0.013586956, + "hetGenotypeFreq": 0.570264, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.7012811, + "refHomGenotypeFreq": 0.41614908, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1373257, + "altHomGenotypeFreq": 0.001369522, + "hetGenotypeFreq": 0.27191234, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.8626743, + "refHomGenotypeFreq": 0.7267181, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25285986, + "altHomGenotypeFreq": 0.0057502906, + "hetGenotypeFreq": 0.49421912, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.74714017, + "refHomGenotypeFreq": 0.5000306, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30070227, + "altHomGenotypeFreq": 0.009789317, + "hetGenotypeFreq": 0.5818259, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.6992977, + "refHomGenotypeFreq": 0.40838477, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29452983, + "altHomGenotypeFreq": 0.014980188, + "hetGenotypeFreq": 0.55909926, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7054702, + "refHomGenotypeFreq": 0.42592055, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3067134, + "altHomGenotypeFreq": 0.0164025, + "hetGenotypeFreq": 0.58062184, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.6932866, + "refHomGenotypeFreq": 0.40297568, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27053928, + "altHomGenotypeFreq": 0.008765413, + "hetGenotypeFreq": 0.52354777, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.7294607, + "refHomGenotypeFreq": 0.46768683, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28378698, + "altHomGenotypeFreq": 0.012936836, + "hetGenotypeFreq": 0.5417003, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.716213, + "refHomGenotypeFreq": 0.44536284, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2761521, + "altHomGenotypeFreq": 0.011214882, + "hetGenotypeFreq": 0.52987444, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.72384787, + "refHomGenotypeFreq": 0.45891067, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29051465, + "altHomGenotypeFreq": 0.01274462, + "hetGenotypeFreq": 0.5555401, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.70948535, + "refHomGenotypeFreq": 0.4317153, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31069043, + "altHomGenotypeFreq": 0.008908686, + "hetGenotypeFreq": 0.6035635, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6893096, + "refHomGenotypeFreq": 0.38752785, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1387808, + "altHomGenotypeFreq": 0.0025940337, + "hetGenotypeFreq": 0.27237353, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.86121917, + "refHomGenotypeFreq": 0.72503245, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26375, + "altHomGenotypeFreq": 0.01, + "hetGenotypeFreq": 0.5075, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.73625, + "refHomGenotypeFreq": 0.4825, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32517484, + "altHomGenotypeFreq": 0.02097902, + "hetGenotypeFreq": 0.6083916, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.6748252, + "refHomGenotypeFreq": 0.37062937, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3050276, + "altHomGenotypeFreq": 0.014101778, + "hetGenotypeFreq": 0.5818516, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.6949724, + "refHomGenotypeFreq": 0.4040466, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30661848, + "altHomGenotypeFreq": 0.015873017, + "hetGenotypeFreq": 0.58149093, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.69338155, + "refHomGenotypeFreq": 0.40263605, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28447172, + "altHomGenotypeFreq": 0.008953697, + "hetGenotypeFreq": 0.55103606, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.71552825, + "refHomGenotypeFreq": 0.44001022, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28807905, + "altHomGenotypeFreq": 0.014224572, + "hetGenotypeFreq": 0.547709, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.7119209, + "refHomGenotypeFreq": 0.43806645, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2935308, + "altHomGenotypeFreq": 0.010911925, + "hetGenotypeFreq": 0.5652377, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.70646924, + "refHomGenotypeFreq": 0.42385036, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29380304, + "altHomGenotypeFreq": 0.011868996, + "hetGenotypeFreq": 0.56386805, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.70619696, + "refHomGenotypeFreq": 0.42426294, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2931416, + "altHomGenotypeFreq": 0.013274336, + "hetGenotypeFreq": 0.5597345, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.7068584, + "refHomGenotypeFreq": 0.42699116, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29474896, + "altHomGenotypeFreq": 0.009944215, + "hetGenotypeFreq": 0.5696095, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.70525104, + "refHomGenotypeFreq": 0.42044628, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15843192, + "altHomGenotypeFreq": 0.0020876827, + "hetGenotypeFreq": 0.31268847, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.84156805, + "refHomGenotypeFreq": 0.6852238, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2577516, + "altHomGenotypeFreq": 0.0060627055, + "hetGenotypeFreq": 0.5033778, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7422484, + "refHomGenotypeFreq": 0.4905595, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29866788, + "altHomGenotypeFreq": 0.013321223, + "hetGenotypeFreq": 0.5706933, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.70133215, + "refHomGenotypeFreq": 0.41598547, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31561092, + "altHomGenotypeFreq": 0.014830382, + "hetGenotypeFreq": 0.60156107, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.68438905, + "refHomGenotypeFreq": 0.38360852, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3018522, + "altHomGenotypeFreq": 0.009453984, + "hetGenotypeFreq": 0.5847964, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.6981478, + "refHomGenotypeFreq": 0.40574956, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21161048, + "altHomGenotypeFreq": 0.02247191, + "hetGenotypeFreq": 0.37827715, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7883895, + "refHomGenotypeFreq": 0.5992509, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.321424, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.678576, + "study": "DISCOVEHR" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22413940, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22413940, + "id": "15:22413940:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22413940, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 386, + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.12224939 + } + ], + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2999999523162842, + "source": "gerp" + }, + { + "score": 0.8709999918937683, + "source": "phastCons" + }, + { + "score": 0.3880000114440918, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.8500003814697266, + "source": "cadd_raw" + }, + { + "score": 15.300000190734863, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559395(ENSG00000259435):n.386C>T" + ], + "id": "rs1810247", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.22145095, + "altHomGenotypeFreq": 0.009376709, + "hetGenotypeFreq": 0.42415717, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7785447, + "refHomGenotypeFreq": 0.5664661, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22906116, + "altHomGenotypeFreq": 0.0074016363, + "hetGenotypeFreq": 0.44331905, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7709388, + "refHomGenotypeFreq": 0.54927933, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28362826, + "altHomGenotypeFreq": 0.011013488, + "hetGenotypeFreq": 0.54522955, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.7163717, + "refHomGenotypeFreq": 0.44375697, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11426385, + "altHomGenotypeFreq": 0.0036118764, + "hetGenotypeFreq": 0.22130395, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.88573617, + "refHomGenotypeFreq": 0.7750842, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2693666, + "altHomGenotypeFreq": 0.01677334, + "hetGenotypeFreq": 0.5051865, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.73063344, + "refHomGenotypeFreq": 0.47804016, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23221192, + "altHomGenotypeFreq": 0.0057037896, + "hetGenotypeFreq": 0.45301625, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7677881, + "refHomGenotypeFreq": 0.54128, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2476101, + "altHomGenotypeFreq": 0.010574915, + "hetGenotypeFreq": 0.47407037, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7523899, + "refHomGenotypeFreq": 0.5153547, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.100507826, + "altHomGenotypeFreq": 0.0015516998, + "hetGenotypeFreq": 0.19805333, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.89942163, + "refHomGenotypeFreq": 0.80039495, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22727416, + "altHomGenotypeFreq": 0.009643186, + "hetGenotypeFreq": 0.43526196, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7727258, + "refHomGenotypeFreq": 0.55509484, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2144334, + "altHomGenotypeFreq": 0.009055578, + "hetGenotypeFreq": 0.4107748, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.78555703, + "refHomGenotypeFreq": 0.5801696, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19919889, + "altHomGenotypeFreq": 0.007662835, + "hetGenotypeFreq": 0.3830721, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8008011, + "refHomGenotypeFreq": 0.6092651, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24779736, + "altHomGenotypeFreq": 0.004405286, + "hetGenotypeFreq": 0.48678413, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.75220263, + "refHomGenotypeFreq": 0.5088106, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28457448, + "altHomGenotypeFreq": 0.01462766, + "hetGenotypeFreq": 0.5398936, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.71542555, + "refHomGenotypeFreq": 0.44547874, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12375, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2475, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.87625, + "refHomGenotypeFreq": 0.7525, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23357664, + "altHomGenotypeFreq": 0.03649635, + "hetGenotypeFreq": 0.3941606, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.76642334, + "refHomGenotypeFreq": 0.5693431, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23129252, + "altHomGenotypeFreq": 0.008658009, + "hetGenotypeFreq": 0.44526902, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.76870745, + "refHomGenotypeFreq": 0.54607296, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2425357, + "altHomGenotypeFreq": 0.009808164, + "hetGenotypeFreq": 0.46545506, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7574643, + "refHomGenotypeFreq": 0.52473676, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.097488925, + "altHomGenotypeFreq": 0.0024618416, + "hetGenotypeFreq": 0.19005416, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.90251106, + "refHomGenotypeFreq": 0.807484, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19837879, + "altHomGenotypeFreq": 0.0077918814, + "hetGenotypeFreq": 0.38117382, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.8016212, + "refHomGenotypeFreq": 0.61103433, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20021881, + "altHomGenotypeFreq": 0.0075023444, + "hetGenotypeFreq": 0.38543296, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7997812, + "refHomGenotypeFreq": 0.6070647, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2420254, + "altHomGenotypeFreq": 0.009170378, + "hetGenotypeFreq": 0.46574304, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7579581, + "refHomGenotypeFreq": 0.5250866, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23068433, + "altHomGenotypeFreq": 0.0066225166, + "hetGenotypeFreq": 0.44812363, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.76931566, + "refHomGenotypeFreq": 0.5452539, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27234688, + "altHomGenotypeFreq": 0.014918132, + "hetGenotypeFreq": 0.5148575, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.72765315, + "refHomGenotypeFreq": 0.47022438, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29591838, + "altHomGenotypeFreq": 0.009972171, + "hetGenotypeFreq": 0.5718924, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.70408165, + "refHomGenotypeFreq": 0.41813543, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.118211694, + "altHomGenotypeFreq": 0.0038049119, + "hetGenotypeFreq": 0.22881356, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8817883, + "refHomGenotypeFreq": 0.76738155, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25098395, + "altHomGenotypeFreq": 0.004238571, + "hetGenotypeFreq": 0.49349076, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.74901605, + "refHomGenotypeFreq": 0.50227064, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26504198, + "altHomGenotypeFreq": 0.010347931, + "hetGenotypeFreq": 0.50938815, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.734958, + "refHomGenotypeFreq": 0.48026395, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13455245, + "altHomGenotypeFreq": 0.0011549566, + "hetGenotypeFreq": 0.26718, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.86525506, + "refHomGenotypeFreq": 0.7316651, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18913858, + "altHomGenotypeFreq": 0.011235955, + "hetGenotypeFreq": 0.35580525, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8108614, + "refHomGenotypeFreq": 0.6329588, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.262152, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.73784804, + "study": "DISCOVEHR" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22413954, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22413954, + "id": "15:22413954:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22413954, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 437, + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.12224939 + } + ], + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2999999523162842, + "source": "gerp" + }, + { + "score": 0.8769999742507935, + "source": "phastCons" + }, + { + "score": 0.3880000114440918, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.9399995803833008, + "source": "cadd_raw" + }, + { + "score": 15.84000015258789, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559395(ENSG00000259435):n.437C>T" + ], + "id": "rs59278647", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.21739456, + "altHomGenotypeFreq": 0.009416511, + "hetGenotypeFreq": 0.4159561, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.78260547, + "refHomGenotypeFreq": 0.5746274, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22418587, + "altHomGenotypeFreq": 0.007545671, + "hetGenotypeFreq": 0.43328038, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7758141, + "refHomGenotypeFreq": 0.55917394, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2815546, + "altHomGenotypeFreq": 0.010997251, + "hetGenotypeFreq": 0.54111475, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.71844536, + "refHomGenotypeFreq": 0.44788802, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11219152, + "altHomGenotypeFreq": 0.0035694505, + "hetGenotypeFreq": 0.21724413, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8878085, + "refHomGenotypeFreq": 0.7791864, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26449358, + "altHomGenotypeFreq": 0.017144145, + "hetGenotypeFreq": 0.49469885, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7355064, + "refHomGenotypeFreq": 0.488157, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2274562, + "altHomGenotypeFreq": 0.00580823, + "hetGenotypeFreq": 0.44329593, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7725438, + "refHomGenotypeFreq": 0.55089587, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24348918, + "altHomGenotypeFreq": 0.010588601, + "hetGenotypeFreq": 0.46580115, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7565108, + "refHomGenotypeFreq": 0.52361023, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.097914, + "altHomGenotypeFreq": 0.0014190435, + "hetGenotypeFreq": 0.19298993, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.902086, + "refHomGenotypeFreq": 0.80559105, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22312184, + "altHomGenotypeFreq": 0.009725492, + "hetGenotypeFreq": 0.42679268, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7768782, + "refHomGenotypeFreq": 0.5634818, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21050231, + "altHomGenotypeFreq": 0.00904468, + "hetGenotypeFreq": 0.40291527, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7894977, + "refHomGenotypeFreq": 0.58804005, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19968674, + "altHomGenotypeFreq": 0.0075878873, + "hetGenotypeFreq": 0.3841977, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.80031323, + "refHomGenotypeFreq": 0.60821444, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2527115, + "altHomGenotypeFreq": 0.004338395, + "hetGenotypeFreq": 0.4967462, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7472885, + "refHomGenotypeFreq": 0.4989154, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28263795, + "altHomGenotypeFreq": 0.014804846, + "hetGenotypeFreq": 0.5356662, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.71736205, + "refHomGenotypeFreq": 0.44952893, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12437811, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24875621, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8756219, + "refHomGenotypeFreq": 0.75124377, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23333333, + "altHomGenotypeFreq": 0.037037037, + "hetGenotypeFreq": 0.39259258, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.76666665, + "refHomGenotypeFreq": 0.5703704, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23079306, + "altHomGenotypeFreq": 0.008674102, + "hetGenotypeFreq": 0.44423792, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.76920694, + "refHomGenotypeFreq": 0.54708797, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24308556, + "altHomGenotypeFreq": 0.009651397, + "hetGenotypeFreq": 0.46686834, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.75691444, + "refHomGenotypeFreq": 0.52348024, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.098451324, + "altHomGenotypeFreq": 0.0024582103, + "hetGenotypeFreq": 0.19198623, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9015487, + "refHomGenotypeFreq": 0.8055556, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.198239, + "altHomGenotypeFreq": 0.00754717, + "hetGenotypeFreq": 0.38138366, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.80176103, + "refHomGenotypeFreq": 0.6110692, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20148091, + "altHomGenotypeFreq": 0.007638348, + "hetGenotypeFreq": 0.38768512, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7985191, + "refHomGenotypeFreq": 0.60467654, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2745491, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7254509, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24171852, + "altHomGenotypeFreq": 0.009044845, + "hetGenotypeFreq": 0.46534735, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.75828147, + "refHomGenotypeFreq": 0.5256078, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23068433, + "altHomGenotypeFreq": 0.0066225166, + "hetGenotypeFreq": 0.44812363, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.76931566, + "refHomGenotypeFreq": 0.5452539, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27155173, + "altHomGenotypeFreq": 0.014813016, + "hetGenotypeFreq": 0.51347744, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.7284483, + "refHomGenotypeFreq": 0.47170958, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.295634, + "altHomGenotypeFreq": 0.009753832, + "hetGenotypeFreq": 0.57176036, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.704366, + "refHomGenotypeFreq": 0.41848582, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11849161, + "altHomGenotypeFreq": 0.00380557, + "hetGenotypeFreq": 0.22937208, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8815084, + "refHomGenotypeFreq": 0.76682234, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25045455, + "altHomGenotypeFreq": 0.0042424244, + "hetGenotypeFreq": 0.49242425, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.74954545, + "refHomGenotypeFreq": 0.50333333, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2648136, + "altHomGenotypeFreq": 0.010175902, + "hetGenotypeFreq": 0.5092754, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7351864, + "refHomGenotypeFreq": 0.4805487, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13421205, + "altHomGenotypeFreq": 0.0011545122, + "hetGenotypeFreq": 0.26611507, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.865788, + "refHomGenotypeFreq": 0.73273045, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21348314, + "altHomGenotypeFreq": 0.011235955, + "hetGenotypeFreq": 0.40449437, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.78651685, + "refHomGenotypeFreq": 0.58426964, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26223, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.73776996, + "study": "DISCOVEHR" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22414005, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22414005, + "id": "15:22414005:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22414005, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 622, + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.12224939 + } + ], + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.100000023841858, + "source": "gerp" + }, + { + "score": 0.3529999852180481, + "source": "phastCons" + }, + { + "score": 0.32499998807907104, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.4099998474121094, + "source": "cadd_raw" + }, + { + "score": 6.769999980926514, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559395(ENSG00000259435):n.622T>C" + ], + "id": "rs28695837", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.22458632, + "altHomGenotypeFreq": 0.00964358, + "hetGenotypeFreq": 0.4298855, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7754137, + "refHomGenotypeFreq": 0.56047094, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23045187, + "altHomGenotypeFreq": 0.0074656187, + "hetGenotypeFreq": 0.4459725, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.7695481, + "refHomGenotypeFreq": 0.5465619, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.314214, + "altHomGenotypeFreq": 0.012487757, + "hetGenotypeFreq": 0.6034525, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.685786, + "refHomGenotypeFreq": 0.38405976, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11582822, + "altHomGenotypeFreq": 0.0035582823, + "hetGenotypeFreq": 0.22453988, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.8841718, + "refHomGenotypeFreq": 0.77190185, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27905956, + "altHomGenotypeFreq": 0.018896945, + "hetGenotypeFreq": 0.5203252, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.7209405, + "refHomGenotypeFreq": 0.46077785, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22922987, + "altHomGenotypeFreq": 0.005773559, + "hetGenotypeFreq": 0.44691262, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.77077013, + "refHomGenotypeFreq": 0.5473138, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24615014, + "altHomGenotypeFreq": 0.010723602, + "hetGenotypeFreq": 0.47085306, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.75384986, + "refHomGenotypeFreq": 0.5184233, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11838737, + "altHomGenotypeFreq": 0.0015642776, + "hetGenotypeFreq": 0.23364618, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.8816126, + "refHomGenotypeFreq": 0.7647895, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23010983, + "altHomGenotypeFreq": 0.009881234, + "hetGenotypeFreq": 0.4404572, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.7698902, + "refHomGenotypeFreq": 0.5496616, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21792454, + "altHomGenotypeFreq": 0.00935695, + "hetGenotypeFreq": 0.41713515, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.78207546, + "refHomGenotypeFreq": 0.5735079, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20857896, + "altHomGenotypeFreq": 0.007490117, + "hetGenotypeFreq": 0.4021777, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.79142106, + "refHomGenotypeFreq": 0.5903322, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2510965, + "altHomGenotypeFreq": 0.004385965, + "hetGenotypeFreq": 0.49342105, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.7489035, + "refHomGenotypeFreq": 0.502193, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.318, + "altHomGenotypeFreq": 0.016, + "hetGenotypeFreq": 0.604, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.682, + "refHomGenotypeFreq": 0.38, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1299505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.259901, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.8700495, + "refHomGenotypeFreq": 0.740099, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25177306, + "altHomGenotypeFreq": 0.035460994, + "hetGenotypeFreq": 0.4326241, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.74822694, + "refHomGenotypeFreq": 0.5319149, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23261538, + "altHomGenotypeFreq": 0.008615385, + "hetGenotypeFreq": 0.448, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7673846, + "refHomGenotypeFreq": 0.5433846, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24394959, + "altHomGenotypeFreq": 0.0093083205, + "hetGenotypeFreq": 0.46928254, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.7560504, + "refHomGenotypeFreq": 0.52140915, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11945813, + "altHomGenotypeFreq": 0.0024630541, + "hetGenotypeFreq": 0.23399015, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.88054186, + "refHomGenotypeFreq": 0.7635468, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20906141, + "altHomGenotypeFreq": 0.0077383923, + "hetGenotypeFreq": 0.40264603, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.7909386, + "refHomGenotypeFreq": 0.5896156, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20797566, + "altHomGenotypeFreq": 0.007179647, + "hetGenotypeFreq": 0.40159202, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.7920244, + "refHomGenotypeFreq": 0.59122837, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24708621, + "altHomGenotypeFreq": 0.009376961, + "hetGenotypeFreq": 0.4754185, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7529138, + "refHomGenotypeFreq": 0.51520455, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23730685, + "altHomGenotypeFreq": 0.0066225166, + "hetGenotypeFreq": 0.46136865, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.76269317, + "refHomGenotypeFreq": 0.5320088, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27335516, + "altHomGenotypeFreq": 0.014903671, + "hetGenotypeFreq": 0.5169029, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.7266449, + "refHomGenotypeFreq": 0.46819338, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32482597, + "altHomGenotypeFreq": 0.011600928, + "hetGenotypeFreq": 0.6264501, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.675174, + "refHomGenotypeFreq": 0.36194897, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12080595, + "altHomGenotypeFreq": 0.0038049119, + "hetGenotypeFreq": 0.23400207, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.879194, + "refHomGenotypeFreq": 0.762193, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2512875, + "altHomGenotypeFreq": 0.004241139, + "hetGenotypeFreq": 0.4940927, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.74871254, + "refHomGenotypeFreq": 0.5016662, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26641843, + "altHomGenotypeFreq": 0.010510195, + "hetGenotypeFreq": 0.51181644, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.7335816, + "refHomGenotypeFreq": 0.47767335, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15529571, + "altHomGenotypeFreq": 0.0011596443, + "hetGenotypeFreq": 0.30827212, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.8447043, + "refHomGenotypeFreq": 0.6905682, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22846442, + "altHomGenotypeFreq": 0.011235955, + "hetGenotypeFreq": 0.4344569, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7715356, + "refHomGenotypeFreq": 0.5543071, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.263151, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.736849, + "study": "DISCOVEHR" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22414190, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22414190, + "id": "15:22414190:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22414190, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 694, + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.12224939 + } + ], + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.3200000524520874, + "source": "gerp" + }, + { + "score": 0.7419999837875366, + "source": "phastCons" + }, + { + "score": -0.8349999785423279, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.75, + "source": "cadd_raw" + }, + { + "score": 14.699999809265137, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559395(ENSG00000259435):n.694C>T" + ], + "id": "rs1429510", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.28275636, + "altHomGenotypeFreq": 0.012126105, + "hetGenotypeFreq": 0.54126054, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7172436, + "refHomGenotypeFreq": 0.44661337, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3006939, + "altHomGenotypeFreq": 0.014263686, + "hetGenotypeFreq": 0.5728604, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.6993061, + "refHomGenotypeFreq": 0.41287586, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14232993, + "altHomGenotypeFreq": 0.0013531799, + "hetGenotypeFreq": 0.2819535, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.85767007, + "refHomGenotypeFreq": 0.71669334, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25266054, + "altHomGenotypeFreq": 0.0058103977, + "hetGenotypeFreq": 0.4937003, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7473394, + "refHomGenotypeFreq": 0.5004893, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29823238, + "altHomGenotypeFreq": 0.00991593, + "hetGenotypeFreq": 0.5766329, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7017676, + "refHomGenotypeFreq": 0.41345116, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29863545, + "altHomGenotypeFreq": 0.014877286, + "hetGenotypeFreq": 0.5675163, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7013645, + "refHomGenotypeFreq": 0.41760635, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3094556, + "altHomGenotypeFreq": 0.016299535, + "hetGenotypeFreq": 0.5863122, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.69054437, + "refHomGenotypeFreq": 0.3973883, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2805683, + "altHomGenotypeFreq": 0.008467279, + "hetGenotypeFreq": 0.5442021, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7194317, + "refHomGenotypeFreq": 0.44733065, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28581867, + "altHomGenotypeFreq": 0.012902111, + "hetGenotypeFreq": 0.5458331, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7141813, + "refHomGenotypeFreq": 0.44126475, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27906647, + "altHomGenotypeFreq": 0.011191063, + "hetGenotypeFreq": 0.5357508, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.72093356, + "refHomGenotypeFreq": 0.45305812, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29201534, + "altHomGenotypeFreq": 0.013110181, + "hetGenotypeFreq": 0.5578103, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7079847, + "refHomGenotypeFreq": 0.4290795, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31493506, + "altHomGenotypeFreq": 0.008658009, + "hetGenotypeFreq": 0.61255413, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.6850649, + "refHomGenotypeFreq": 0.37878788, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13147411, + "altHomGenotypeFreq": 0.0026560426, + "hetGenotypeFreq": 0.25763613, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.8685259, + "refHomGenotypeFreq": 0.7397078, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26108375, + "altHomGenotypeFreq": 0.009852217, + "hetGenotypeFreq": 0.50246304, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7389163, + "refHomGenotypeFreq": 0.48768473, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.020833334, + "hetGenotypeFreq": 0.625, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.35416666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30562347, + "altHomGenotypeFreq": 0.014669927, + "hetGenotypeFreq": 0.5819071, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6943765, + "refHomGenotypeFreq": 0.40342298, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30806932, + "altHomGenotypeFreq": 0.016337547, + "hetGenotypeFreq": 0.58346355, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.69193065, + "refHomGenotypeFreq": 0.4001989, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28730768, + "altHomGenotypeFreq": 0.009230769, + "hetGenotypeFreq": 0.55615383, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7126923, + "refHomGenotypeFreq": 0.43461537, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29000127, + "altHomGenotypeFreq": 0.014752238, + "hetGenotypeFreq": 0.55049807, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7099987, + "refHomGenotypeFreq": 0.43474972, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2945077, + "altHomGenotypeFreq": 0.011078171, + "hetGenotypeFreq": 0.5668591, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.70549226, + "refHomGenotypeFreq": 0.42206272, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2950706, + "altHomGenotypeFreq": 0.011984659, + "hetGenotypeFreq": 0.5661718, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7049294, + "refHomGenotypeFreq": 0.4218435, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29646018, + "altHomGenotypeFreq": 0.015486726, + "hetGenotypeFreq": 0.5619469, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.70353985, + "refHomGenotypeFreq": 0.42256638, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29532236, + "altHomGenotypeFreq": 0.009936985, + "hetGenotypeFreq": 0.57077074, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.70467764, + "refHomGenotypeFreq": 0.4192923, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16083024, + "altHomGenotypeFreq": 0.0020871984, + "hetGenotypeFreq": 0.31748608, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.83916974, + "refHomGenotypeFreq": 0.6804267, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2581343, + "altHomGenotypeFreq": 0.0062305294, + "hetGenotypeFreq": 0.50380754, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7418657, + "refHomGenotypeFreq": 0.48996192, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29888016, + "altHomGenotypeFreq": 0.013317191, + "hetGenotypeFreq": 0.5711259, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.70111984, + "refHomGenotypeFreq": 0.4155569, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3168927, + "altHomGenotypeFreq": 0.0150070675, + "hetGenotypeFreq": 0.6037713, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.68310726, + "refHomGenotypeFreq": 0.38122162, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30505344, + "altHomGenotypeFreq": 0.009329446, + "hetGenotypeFreq": 0.591448, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.6949465, + "refHomGenotypeFreq": 0.39922255, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.123595506, + "altHomGenotypeFreq": 0.018726591, + "hetGenotypeFreq": 0.20973782, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8764045, + "refHomGenotypeFreq": 0.7715356, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.321667, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.67833304, + "study": "DISCOVEHR" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22414262, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22414262, + "id": "15:22414262:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22414262, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -2.4200000762939453, + "source": "gerp" + }, + { + "score": 0.027000000700354576, + "source": "phastCons" + }, + { + "score": -1.690000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs200221521", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.24232654, + "altHomGenotypeFreq": 0.123631544, + "hetGenotypeFreq": 0.8290616, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.46183762, + "refHomGenotypeFreq": 0.047306776, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24875621, + "altHomGenotypeFreq": 0.14427863, + "hetGenotypeFreq": 0.8150912, + "population": "OTH", + "refAllele": "", + "refAlleleFreq": 0.4481758, + "refHomGenotypeFreq": 0.040630184, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30229998, + "altHomGenotypeFreq": 0.15512602, + "hetGenotypeFreq": 0.81233174, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.4387081, + "refHomGenotypeFreq": 0.032542206, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14963692, + "altHomGenotypeFreq": 0.22095437, + "hetGenotypeFreq": 0.7548409, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.4016252, + "refHomGenotypeFreq": 0.024204703, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2681661, + "altHomGenotypeFreq": 0.15354672, + "hetGenotypeFreq": 0.8217993, + "population": "ASJ", + "refAllele": "", + "refAlleleFreq": 0.43555364, + "refHomGenotypeFreq": 0.024653979, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24549621, + "altHomGenotypeFreq": 0.08628319, + "hetGenotypeFreq": 0.8708913, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.4782712, + "refHomGenotypeFreq": 0.04282554, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25552738, + "altHomGenotypeFreq": 0.106479794, + "hetGenotypeFreq": 0.83798474, + "population": "NFE", + "refAllele": "", + "refAlleleFreq": 0.4745278, + "refHomGenotypeFreq": 0.05553542, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1589041, + "altHomGenotypeFreq": 0.10027398, + "hetGenotypeFreq": 0.81452054, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.49246576, + "refHomGenotypeFreq": 0.08520548, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24859302, + "altHomGenotypeFreq": 0.1180224, + "hetGenotypeFreq": 0.8363326, + "population": "MALE", + "refAllele": "", + "refAlleleFreq": 0.46381128, + "refHomGenotypeFreq": 0.04564492, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23445654, + "altHomGenotypeFreq": 0.13067597, + "hetGenotypeFreq": 0.81993014, + "population": "FEMALE", + "refAllele": "", + "refAlleleFreq": 0.45935896, + "refHomGenotypeFreq": 0.049393877, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16622458, + "altHomGenotypeFreq": 0.17595047, + "hetGenotypeFreq": 0.7308898, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.4586046, + "refHomGenotypeFreq": 0.09315971, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19895288, + "altHomGenotypeFreq": 0.14397906, + "hetGenotypeFreq": 0.7853403, + "population": "OTH", + "refAllele": "", + "refAlleleFreq": 0.46335077, + "refHomGenotypeFreq": 0.070680626, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22524408, + "altHomGenotypeFreq": 0.26778242, + "hetGenotypeFreq": 0.67782426, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.39330545, + "refHomGenotypeFreq": 0.054393306, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09662577, + "altHomGenotypeFreq": 0.22392638, + "hetGenotypeFreq": 0.74539876, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.40337422, + "refHomGenotypeFreq": 0.030674847, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17424242, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.75757575, + "population": "ASJ", + "refAllele": "", + "refAlleleFreq": 0.45454547, + "refHomGenotypeFreq": 0.07575758, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20840481, + "altHomGenotypeFreq": 0.14065179, + "hetGenotypeFreq": 0.8087479, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.45497426, + "refHomGenotypeFreq": 0.050600342, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17644694, + "altHomGenotypeFreq": 0.18649517, + "hetGenotypeFreq": 0.73392284, + "population": "NFE", + "refAllele": "", + "refAlleleFreq": 0.4465434, + "refHomGenotypeFreq": 0.07958199, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.124499716, + "altHomGenotypeFreq": 0.149514, + "hetGenotypeFreq": 0.7021155, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.49942824, + "refHomGenotypeFreq": 0.1483705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16428983, + "altHomGenotypeFreq": 0.17574187, + "hetGenotypeFreq": 0.7293287, + "population": "MALE", + "refAllele": "", + "refAlleleFreq": 0.45959377, + "refHomGenotypeFreq": 0.09492941, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16866703, + "altHomGenotypeFreq": 0.17621388, + "hetGenotypeFreq": 0.73286057, + "population": "FEMALE", + "refAllele": "", + "refAlleleFreq": 0.4573559, + "refHomGenotypeFreq": 0.09092563, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24214894, + "altHomGenotypeFreq": 0.079333395, + "hetGenotypeFreq": 0.8625145, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.4894094, + "refHomGenotypeFreq": 0.058152154, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24683544, + "altHomGenotypeFreq": 0.10970464, + "hetGenotypeFreq": 0.835443, + "population": "OTH", + "refAllele": "", + "refAlleleFreq": 0.47257385, + "refHomGenotypeFreq": 0.05485232, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26624045, + "altHomGenotypeFreq": 0.091359034, + "hetGenotypeFreq": 0.8725511, + "population": "SAS", + "refAllele": "", + "refAlleleFreq": 0.47236544, + "refHomGenotypeFreq": 0.036089916, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33833596, + "altHomGenotypeFreq": 0.07319642, + "hetGenotypeFreq": 0.88414955, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.4847288, + "refHomGenotypeFreq": 0.04265403, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15512885, + "altHomGenotypeFreq": 0.102071755, + "hetGenotypeFreq": 0.85194546, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.47195554, + "refHomGenotypeFreq": 0.04598282, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23479816, + "altHomGenotypeFreq": 0.07102709, + "hetGenotypeFreq": 0.85896784, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.499489, + "refHomGenotypeFreq": 0.07000511, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24951631, + "altHomGenotypeFreq": 0.073453866, + "hetGenotypeFreq": 0.8639001, + "population": "NFE", + "refAllele": "", + "refAlleleFreq": 0.49459603, + "refHomGenotypeFreq": 0.06264594, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15755749, + "altHomGenotypeFreq": 0.08141727, + "hetGenotypeFreq": 0.8337731, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.50169617, + "refHomGenotypeFreq": 0.084809646, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.190438, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.80956197, + "study": "DISCOVEHR" + } + ], + "reference": "", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22414394, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22414393, + "id": "15:22414394:-:A", + "length": 1, + "names": [], + "reference": "", + "start": 22414394, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "sense_overlapping", + "ensemblGeneId": "ENSG00000259176", + "ensemblTranscriptId": "ENST00000559392", + "geneName": "RP11-69H14.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+" + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259435", + "ensemblTranscriptId": "ENST00000559395", + "geneName": "OR4N3P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0.29499998688697815, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": -0.9890000224113464, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "downstream_gene_variant", + "functionalScore": [ + { + "score": -0.22999954223632812, + "source": "cadd_raw" + }, + { + "score": 0.949999988079071, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs8030520", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.46296915, + "altHomGenotypeFreq": 0.070382014, + "hetGenotypeFreq": 0.7851743, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5370308, + "refHomGenotypeFreq": 0.1444437, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4843096, + "altHomGenotypeFreq": 0.08368201, + "hetGenotypeFreq": 0.8012552, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.5156904, + "refHomGenotypeFreq": 0.11506276, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54693365, + "altHomGenotypeFreq": 0.18773466, + "hetGenotypeFreq": 0.718398, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.45306632, + "refHomGenotypeFreq": 0.09386733, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37376237, + "altHomGenotypeFreq": 0.03217822, + "hetGenotypeFreq": 0.6831683, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.62623763, + "refHomGenotypeFreq": 0.28465346, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.52666664, + "altHomGenotypeFreq": 0.12, + "hetGenotypeFreq": 0.81333333, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.47333333, + "refHomGenotypeFreq": 0.06666667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4520096, + "altHomGenotypeFreq": 0.064787045, + "hetGenotypeFreq": 0.7744451, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5479904, + "refHomGenotypeFreq": 0.16076785, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46953553, + "altHomGenotypeFreq": 0.07459016, + "hetGenotypeFreq": 0.7898907, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.5304645, + "refHomGenotypeFreq": 0.13551913, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44344878, + "altHomGenotypeFreq": 0.042867523, + "hetGenotypeFreq": 0.8011625, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5565512, + "refHomGenotypeFreq": 0.15596996, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46391752, + "altHomGenotypeFreq": 0.072043665, + "hetGenotypeFreq": 0.78374773, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.53608245, + "refHomGenotypeFreq": 0.14420861, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46180245, + "altHomGenotypeFreq": 0.06833781, + "hetGenotypeFreq": 0.78692925, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5381976, + "refHomGenotypeFreq": 0.14473292, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22423285, + "id": "8434", + "percentageMatch": 0.95606, + "source": "genomicSuperDup", + "start": 22292726 + } + ], + "start": 22418376, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22418376, + "id": "15:22418376:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22418376, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.11500000208616257, + "source": "phastCons" + }, + { + "score": -1.8480000495910645, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": -0.13000011444091797, + "source": "cadd_raw" + }, + { + "score": 1.5299999713897705, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs8025256", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.54879326, + "altHomGenotypeFreq": 0.18087618, + "hetGenotypeFreq": 0.7358342, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.4512067, + "refHomGenotypeFreq": 0.08328961, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52916664, + "altHomGenotypeFreq": 0.13541667, + "hetGenotypeFreq": 0.7875, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.47083333, + "refHomGenotypeFreq": 0.077083334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60883087, + "altHomGenotypeFreq": 0.28109452, + "hetGenotypeFreq": 0.65547264, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.39116916, + "refHomGenotypeFreq": 0.063432835, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41826922, + "altHomGenotypeFreq": 0.057692308, + "hetGenotypeFreq": 0.72115386, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.5817308, + "refHomGenotypeFreq": 0.22115384, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5782313, + "altHomGenotypeFreq": 0.1904762, + "hetGenotypeFreq": 0.7755102, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.4217687, + "refHomGenotypeFreq": 0.034013607, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.493906, + "altHomGenotypeFreq": 0.08763784, + "hetGenotypeFreq": 0.8125363, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.50609404, + "refHomGenotypeFreq": 0.09982588, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49552056, + "altHomGenotypeFreq": 0.10004072, + "hetGenotypeFreq": 0.79095966, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.5044794, + "refHomGenotypeFreq": 0.108999595, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.664347, + "altHomGenotypeFreq": 0.35421017, + "hetGenotypeFreq": 0.6202737, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.33565298, + "refHomGenotypeFreq": 0.02551612, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.552338, + "altHomGenotypeFreq": 0.1865654, + "hetGenotypeFreq": 0.7315452, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.447662, + "refHomGenotypeFreq": 0.08188939, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5444151, + "altHomGenotypeFreq": 0.17384931, + "hetGenotypeFreq": 0.7411316, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.45558488, + "refHomGenotypeFreq": 0.08501906, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47394788, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5260521, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4453125, + "altHomGenotypeFreq": 0.140625, + "hetGenotypeFreq": 0.609375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.5546875, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5934505, + "altHomGenotypeFreq": 0.2879393, + "hetGenotypeFreq": 0.61102235, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.4065495, + "refHomGenotypeFreq": 0.10103834, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5378323, + "altHomGenotypeFreq": 0.18609408, + "hetGenotypeFreq": 0.7034765, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.46216768, + "refHomGenotypeFreq": 0.11042945, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45212767, + "altHomGenotypeFreq": 0.11702128, + "hetGenotypeFreq": 0.67021275, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.54787236, + "refHomGenotypeFreq": 0.21276596, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5245098, + "altHomGenotypeFreq": 0.15686275, + "hetGenotypeFreq": 0.7352941, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.47549018, + "refHomGenotypeFreq": 0.10784314, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73373675, + "altHomGenotypeFreq": 0.48108926, + "hetGenotypeFreq": 0.505295, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.26626325, + "refHomGenotypeFreq": 0.013615734, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65238094, + "altHomGenotypeFreq": 0.36190477, + "hetGenotypeFreq": 0.5809524, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.34761906, + "refHomGenotypeFreq": 0.057142857, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6826923, + "altHomGenotypeFreq": 0.42307693, + "hetGenotypeFreq": 0.5192307, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.31730768, + "refHomGenotypeFreq": 0.057692308, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7638889, + "altHomGenotypeFreq": 0.5277778, + "hetGenotypeFreq": 0.4722222, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.2361111, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49479166, + "altHomGenotypeFreq": 0.13541667, + "hetGenotypeFreq": 0.71875, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.5052083, + "refHomGenotypeFreq": 0.14583333, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7212389, + "altHomGenotypeFreq": 0.45132744, + "hetGenotypeFreq": 0.53982306, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.27876106, + "refHomGenotypeFreq": 0.0088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54901963, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.74509805, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.4509804, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.56593406, + "altHomGenotypeFreq": 0.24175824, + "hetGenotypeFreq": 0.64835167, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.43406594, + "refHomGenotypeFreq": 0.10989011, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.66129035, + "altHomGenotypeFreq": 0.34408602, + "hetGenotypeFreq": 0.6344086, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.33870968, + "refHomGenotypeFreq": 0.021505376, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.63131315, + "altHomGenotypeFreq": 0.34343433, + "hetGenotypeFreq": 0.57575756, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.36868685, + "refHomGenotypeFreq": 0.08080808, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49532712, + "altHomGenotypeFreq": 0.12149533, + "hetGenotypeFreq": 0.74766356, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.5046729, + "refHomGenotypeFreq": 0.13084112, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55813956, + "altHomGenotypeFreq": 0.24418604, + "hetGenotypeFreq": 0.627907, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.44186047, + "refHomGenotypeFreq": 0.12790698, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7083333, + "altHomGenotypeFreq": 0.4375, + "hetGenotypeFreq": 0.5416666, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.29166666, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72727275, + "altHomGenotypeFreq": 0.45454547, + "hetGenotypeFreq": 0.5454545, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.27272728, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7878788, + "altHomGenotypeFreq": 0.5858586, + "hetGenotypeFreq": 0.4040404, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.21212122, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.528827, + "altHomGenotypeFreq": 0.17693837, + "hetGenotypeFreq": 0.7037773, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.47117296, + "refHomGenotypeFreq": 0.119284295, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6803279, + "altHomGenotypeFreq": 0.40983605, + "hetGenotypeFreq": 0.5409836, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.31967214, + "refHomGenotypeFreq": 0.04918033, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40057638, + "altHomGenotypeFreq": 0.09221902, + "hetGenotypeFreq": 0.6167147, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.59942365, + "refHomGenotypeFreq": 0.2910663, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7235294, + "altHomGenotypeFreq": 0.47058824, + "hetGenotypeFreq": 0.5058824, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.2764706, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5631068, + "altHomGenotypeFreq": 0.22330096, + "hetGenotypeFreq": 0.6796117, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.4368932, + "refHomGenotypeFreq": 0.097087376, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52020204, + "altHomGenotypeFreq": 0.23232323, + "hetGenotypeFreq": 0.57575756, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.479798, + "refHomGenotypeFreq": 0.1919192, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5373832, + "altHomGenotypeFreq": 0.1495327, + "hetGenotypeFreq": 0.7757009, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.46261683, + "refHomGenotypeFreq": 0.07476635, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4375, + "altHomGenotypeFreq": 0.10576923, + "hetGenotypeFreq": 0.66346157, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.5625, + "refHomGenotypeFreq": 0.23076923, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.530303, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.75757575, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.46969697, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2647059, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.5058824, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.7352941, + "refHomGenotypeFreq": 0.48235294, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.66071427, + "altHomGenotypeFreq": 0.37896827, + "hetGenotypeFreq": 0.56349206, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.3392857, + "refHomGenotypeFreq": 0.057539683, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6747573, + "altHomGenotypeFreq": 0.41747573, + "hetGenotypeFreq": 0.5145631, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.32524273, + "refHomGenotypeFreq": 0.067961164, + "study": "1kG_phase3" + } + ], + "reference": "T", + "start": 22425529, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22425529, + "id": "15:22425529:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22425529, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.029999999329447746, + "source": "phastCons" + }, + { + "score": -1.8489999771118164, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 0.07999992370605469, + "source": "cadd_raw" + }, + { + "score": 3.4700000286102295, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs2137967", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.5381858, + "altHomGenotypeFreq": 0.16274175, + "hetGenotypeFreq": 0.75088805, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.46181422, + "refHomGenotypeFreq": 0.086370215, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5251046, + "altHomGenotypeFreq": 0.13179916, + "hetGenotypeFreq": 0.7866109, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.4748954, + "refHomGenotypeFreq": 0.08158996, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6098015, + "altHomGenotypeFreq": 0.28163773, + "hetGenotypeFreq": 0.65632755, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.3901985, + "refHomGenotypeFreq": 0.06203474, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41666666, + "altHomGenotypeFreq": 0.05392157, + "hetGenotypeFreq": 0.7254902, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5833333, + "refHomGenotypeFreq": 0.22058824, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5714286, + "altHomGenotypeFreq": 0.17687075, + "hetGenotypeFreq": 0.78911567, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.42857143, + "refHomGenotypeFreq": 0.034013607, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49327487, + "altHomGenotypeFreq": 0.0871345, + "hetGenotypeFreq": 0.8122807, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.50672513, + "refHomGenotypeFreq": 0.1005848, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49435452, + "altHomGenotypeFreq": 0.09835397, + "hetGenotypeFreq": 0.79200107, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5056455, + "refHomGenotypeFreq": 0.10964495, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6293584, + "altHomGenotypeFreq": 0.29381683, + "hetGenotypeFreq": 0.6710832, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.37064156, + "refHomGenotypeFreq": 0.035099953, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5407871, + "altHomGenotypeFreq": 0.16660704, + "hetGenotypeFreq": 0.74836016, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.45921287, + "refHomGenotypeFreq": 0.0850328, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5349861, + "altHomGenotypeFreq": 0.15798739, + "hetGenotypeFreq": 0.7539974, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.46501392, + "refHomGenotypeFreq": 0.08801526, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.421875, + "altHomGenotypeFreq": 0.109375, + "hetGenotypeFreq": 0.625, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.578125, + "refHomGenotypeFreq": 0.265625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5788738, + "altHomGenotypeFreq": 0.24840255, + "hetGenotypeFreq": 0.6609425, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4211262, + "refHomGenotypeFreq": 0.090654954, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5398773, + "altHomGenotypeFreq": 0.17177914, + "hetGenotypeFreq": 0.73619634, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.4601227, + "refHomGenotypeFreq": 0.09202454, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4574468, + "altHomGenotypeFreq": 0.095744684, + "hetGenotypeFreq": 0.7234043, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.5425532, + "refHomGenotypeFreq": 0.18085106, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.11764706, + "hetGenotypeFreq": 0.7647059, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.11764706, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.67927384, + "altHomGenotypeFreq": 0.3797277, + "hetGenotypeFreq": 0.5990923, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.3207262, + "refHomGenotypeFreq": 0.02118003, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.66190475, + "altHomGenotypeFreq": 0.36190477, + "hetGenotypeFreq": 0.6, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.33809525, + "refHomGenotypeFreq": 0.03809524, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6826923, + "altHomGenotypeFreq": 0.42307693, + "hetGenotypeFreq": 0.5192307, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.31730768, + "refHomGenotypeFreq": 0.057692308, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6805556, + "altHomGenotypeFreq": 0.3611111, + "hetGenotypeFreq": 0.6388889, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.31944445, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.13541667, + "hetGenotypeFreq": 0.7291666, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.13541667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.67699116, + "altHomGenotypeFreq": 0.37168142, + "hetGenotypeFreq": 0.6106194, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.32300884, + "refHomGenotypeFreq": 0.017699115, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5588235, + "altHomGenotypeFreq": 0.18627451, + "hetGenotypeFreq": 0.74509805, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.44117647, + "refHomGenotypeFreq": 0.068627454, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53296703, + "altHomGenotypeFreq": 0.16483517, + "hetGenotypeFreq": 0.73626375, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.46703297, + "refHomGenotypeFreq": 0.0989011, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.65591395, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.6451613, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.34408602, + "refHomGenotypeFreq": 0.021505376, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6010101, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.65656567, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.3989899, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.12149533, + "hetGenotypeFreq": 0.7570094, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.12149533, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5697674, + "altHomGenotypeFreq": 0.22093023, + "hetGenotypeFreq": 0.6976744, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.43023255, + "refHomGenotypeFreq": 0.08139535, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.671875, + "altHomGenotypeFreq": 0.36458334, + "hetGenotypeFreq": 0.6145834, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.328125, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.68686867, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.6060606, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.3131313, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7070707, + "altHomGenotypeFreq": 0.42424244, + "hetGenotypeFreq": 0.56565654, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.2929293, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5298211, + "altHomGenotypeFreq": 0.15109344, + "hetGenotypeFreq": 0.7574553, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.47017893, + "refHomGenotypeFreq": 0.091451295, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6393443, + "altHomGenotypeFreq": 0.3442623, + "hetGenotypeFreq": 0.59016395, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.36065573, + "refHomGenotypeFreq": 0.06557377, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40634006, + "altHomGenotypeFreq": 0.08933718, + "hetGenotypeFreq": 0.6340058, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.59365994, + "refHomGenotypeFreq": 0.27665707, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6764706, + "altHomGenotypeFreq": 0.4, + "hetGenotypeFreq": 0.5529412, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.32352942, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.57281554, + "altHomGenotypeFreq": 0.2038835, + "hetGenotypeFreq": 0.7378641, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.42718446, + "refHomGenotypeFreq": 0.058252428, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.55050504, + "altHomGenotypeFreq": 0.22222222, + "hetGenotypeFreq": 0.65656567, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.44949496, + "refHomGenotypeFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5420561, + "altHomGenotypeFreq": 0.13084112, + "hetGenotypeFreq": 0.8224299, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.45794392, + "refHomGenotypeFreq": 0.046728972, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45673078, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.66346157, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.5432692, + "refHomGenotypeFreq": 0.21153846, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5252525, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.8080808, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.47474748, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2764706, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.5058824, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.7235294, + "refHomGenotypeFreq": 0.47058824, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6527778, + "altHomGenotypeFreq": 0.35714287, + "hetGenotypeFreq": 0.59126985, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.3472222, + "refHomGenotypeFreq": 0.051587302, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.66019416, + "altHomGenotypeFreq": 0.3883495, + "hetGenotypeFreq": 0.5436893, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.3398058, + "refHomGenotypeFreq": 0.067961164, + "study": "1kG_phase3" + } + ], + "reference": "G", + "start": 22428674, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22428674, + "id": "15:22428674:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22428674, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000260739", + "ensemblTranscriptId": "ENST00000565129", + "geneName": "RP11-2F9.4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.6869999766349792, + "source": "gerp" + }, + { + "score": 0.039000000804662704, + "source": "phastCons" + }, + { + "score": 0.1860000044107437, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 1.4600000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000565129(ENSG00000260739):n.75-791G>C" + ], + "id": "rs12912917", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.322302, + "altHomGenotypeFreq": 0.025735816, + "hetGenotypeFreq": 0.5931324, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.677698, + "refHomGenotypeFreq": 0.3811318, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39497718, + "altHomGenotypeFreq": 0.043378994, + "hetGenotypeFreq": 0.70319635, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.60502285, + "refHomGenotypeFreq": 0.25342464, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.116094984, + "altHomGenotypeFreq": 0.0026385225, + "hetGenotypeFreq": 0.22691293, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.883905, + "refHomGenotypeFreq": 0.77044857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3307888, + "altHomGenotypeFreq": 0.020356234, + "hetGenotypeFreq": 0.62086517, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6692112, + "refHomGenotypeFreq": 0.35877863, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37313432, + "altHomGenotypeFreq": 0.02238806, + "hetGenotypeFreq": 0.70149255, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.6268657, + "refHomGenotypeFreq": 0.2761194, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40142152, + "altHomGenotypeFreq": 0.037700865, + "hetGenotypeFreq": 0.7274413, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5985785, + "refHomGenotypeFreq": 0.23485784, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39630598, + "altHomGenotypeFreq": 0.035922047, + "hetGenotypeFreq": 0.7207679, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.603694, + "refHomGenotypeFreq": 0.24331006, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18654196, + "altHomGenotypeFreq": 0.00571577, + "hetGenotypeFreq": 0.36165237, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.813458, + "refHomGenotypeFreq": 0.63263184, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3171403, + "altHomGenotypeFreq": 0.02828981, + "hetGenotypeFreq": 0.577701, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.6828597, + "refHomGenotypeFreq": 0.3940092, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3287496, + "altHomGenotypeFreq": 0.02254557, + "hetGenotypeFreq": 0.61240804, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.6712504, + "refHomGenotypeFreq": 0.36504638, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3977956, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.60220444, + "study": "GONL" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 37, + "copyNumber": 19.3, + "end": 22435159, + "percentageMatch": 0.8, + "period": 37, + "score": 732, + "sequence": "CACACCTGTCCCCACGTGGACCCTTCCCTGAGACGAG", + "source": "trf", + "start": 22434446 + }, + { + "chromosome": "15", + "consensusSize": 175, + "copyNumber": 2.8, + "end": 22435496, + "percentageMatch": 0.8, + "period": 175, + "score": 471, + "sequence": "GAGCACACCTGTCCCCACGTGGACCCTTCCCTCAGACAAGCACACCTGTCCCCACATGGACCCTTCCCTCAGAGGAGCACAACTGTACCCATGTGGACCCTTCCCTCAGACAAACACACCTGTCACCACGTGGACCCTTCCCTCAGAGGAGCTCATCTGTCCTCTTCCCCAAGGC", + "source": "trf", + "start": 22434998 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + } + ], + "start": 22435151, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22435151, + "id": "15:22435151:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22435151, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000260739", + "ensemblTranscriptId": "ENST00000565129", + "geneName": "RP11-2F9.4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 552, + "ensemblGeneId": "ENSG00000223877", + "ensemblTranscriptId": "ENST00000460876", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.1607717 + } + ], + "geneName": "RP11-2F9.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000223877", + "ensemblTranscriptId": "ENST00000415697", + "geneName": "RP11-2F9.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -2.9700000286102295, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -2.2739999294281006, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.5200004577636719, + "source": "cadd_raw" + }, + { + "score": 0.20000000298023224, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000460876(ENSG00000223877):n.552T>C" + ], + "id": "rs2059928", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.6331355, + "altHomGenotypeFreq": 0.30213904, + "hetGenotypeFreq": 0.66199297, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.36686447, + "refHomGenotypeFreq": 0.035868004, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.61704314, + "altHomGenotypeFreq": 0.2772074, + "hetGenotypeFreq": 0.67967147, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.3829569, + "refHomGenotypeFreq": 0.04312115, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6198758, + "altHomGenotypeFreq": 0.29440993, + "hetGenotypeFreq": 0.65093166, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.3801242, + "refHomGenotypeFreq": 0.054658387, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5421687, + "altHomGenotypeFreq": 0.17108434, + "hetGenotypeFreq": 0.74216866, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.45783132, + "refHomGenotypeFreq": 0.08674699, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5960265, + "altHomGenotypeFreq": 0.25165564, + "hetGenotypeFreq": 0.68874174, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.40397352, + "refHomGenotypeFreq": 0.059602648, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6133062, + "altHomGenotypeFreq": 0.27019176, + "hetGenotypeFreq": 0.68622893, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.38669378, + "refHomGenotypeFreq": 0.043579314, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6125725, + "altHomGenotypeFreq": 0.26467016, + "hetGenotypeFreq": 0.69580466, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.38742748, + "refHomGenotypeFreq": 0.03952516, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.69035006, + "altHomGenotypeFreq": 0.39728236, + "hetGenotypeFreq": 0.58613545, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.30964994, + "refHomGenotypeFreq": 0.01658222, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6350236, + "altHomGenotypeFreq": 0.30625, + "hetGenotypeFreq": 0.6575472, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.3649764, + "refHomGenotypeFreq": 0.03620283, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.63079953, + "altHomGenotypeFreq": 0.29705283, + "hetGenotypeFreq": 0.66749346, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.36920047, + "refHomGenotypeFreq": 0.035453748, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6192385, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.38076153, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5234375, + "altHomGenotypeFreq": 0.1875, + "hetGenotypeFreq": 0.671875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.4765625, + "refHomGenotypeFreq": 0.140625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.63398564, + "altHomGenotypeFreq": 0.31988817, + "hetGenotypeFreq": 0.6281949, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.3660144, + "refHomGenotypeFreq": 0.051916935, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54805726, + "altHomGenotypeFreq": 0.17791411, + "hetGenotypeFreq": 0.7402863, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.45194274, + "refHomGenotypeFreq": 0.08179959, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57978725, + "altHomGenotypeFreq": 0.22340426, + "hetGenotypeFreq": 0.71276593, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.42021278, + "refHomGenotypeFreq": 0.06382979, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5392157, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.74509805, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.46078432, + "refHomGenotypeFreq": 0.0882353, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7344932, + "altHomGenotypeFreq": 0.48260212, + "hetGenotypeFreq": 0.50378215, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.2655068, + "refHomGenotypeFreq": 0.013615734, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.66190475, + "altHomGenotypeFreq": 0.35238096, + "hetGenotypeFreq": 0.61904764, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.33809525, + "refHomGenotypeFreq": 0.028571429, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65865386, + "altHomGenotypeFreq": 0.3846154, + "hetGenotypeFreq": 0.5480769, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.34134614, + "refHomGenotypeFreq": 0.067307696, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7175926, + "altHomGenotypeFreq": 0.4351852, + "hetGenotypeFreq": 0.5648148, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.2824074, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5416667, + "altHomGenotypeFreq": 0.19791667, + "hetGenotypeFreq": 0.6875, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.45833334, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7787611, + "altHomGenotypeFreq": 0.57522124, + "hetGenotypeFreq": 0.40707964, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.22123894, + "refHomGenotypeFreq": 0.017699115, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5588235, + "altHomGenotypeFreq": 0.19607843, + "hetGenotypeFreq": 0.7254902, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.44117647, + "refHomGenotypeFreq": 0.078431375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6703297, + "altHomGenotypeFreq": 0.35164836, + "hetGenotypeFreq": 0.63736266, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.32967034, + "refHomGenotypeFreq": 0.010989011, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6666667, + "altHomGenotypeFreq": 0.34408602, + "hetGenotypeFreq": 0.6451613, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.010752688, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6212121, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.65656567, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.37878788, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.61214954, + "altHomGenotypeFreq": 0.28037384, + "hetGenotypeFreq": 0.6635514, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.38785046, + "refHomGenotypeFreq": 0.056074765, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55813956, + "altHomGenotypeFreq": 0.19767442, + "hetGenotypeFreq": 0.7209302, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.44186047, + "refHomGenotypeFreq": 0.08139535, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7239583, + "altHomGenotypeFreq": 0.45833334, + "hetGenotypeFreq": 0.53125, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.27604166, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7070707, + "altHomGenotypeFreq": 0.41414142, + "hetGenotypeFreq": 0.5858586, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.2929293, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7626263, + "altHomGenotypeFreq": 0.53535354, + "hetGenotypeFreq": 0.45454544, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.23737374, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6302187, + "altHomGenotypeFreq": 0.29224652, + "hetGenotypeFreq": 0.6759443, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.36978132, + "refHomGenotypeFreq": 0.031809144, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.71311474, + "altHomGenotypeFreq": 0.47540984, + "hetGenotypeFreq": 0.47540984, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.28688523, + "refHomGenotypeFreq": 0.04918033, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5302594, + "altHomGenotypeFreq": 0.19020173, + "hetGenotypeFreq": 0.6801153, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.46974063, + "refHomGenotypeFreq": 0.129683, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7235294, + "altHomGenotypeFreq": 0.47058824, + "hetGenotypeFreq": 0.5058824, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.2764706, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5436893, + "altHomGenotypeFreq": 0.13592233, + "hetGenotypeFreq": 0.815534, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.4563107, + "refHomGenotypeFreq": 0.048543688, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.64141417, + "altHomGenotypeFreq": 0.32323232, + "hetGenotypeFreq": 0.6363636, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.35858586, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.60747665, + "altHomGenotypeFreq": 0.24299066, + "hetGenotypeFreq": 0.72897196, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.39252338, + "refHomGenotypeFreq": 0.028037382, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57211536, + "altHomGenotypeFreq": 0.24038461, + "hetGenotypeFreq": 0.66346157, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.4278846, + "refHomGenotypeFreq": 0.09615385, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6262626, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.7070707, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.37373737, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42941177, + "altHomGenotypeFreq": 0.09411765, + "hetGenotypeFreq": 0.67058825, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.57058823, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.66071427, + "altHomGenotypeFreq": 0.3611111, + "hetGenotypeFreq": 0.5992063, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.3392857, + "refHomGenotypeFreq": 0.03968254, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.69417477, + "altHomGenotypeFreq": 0.42718446, + "hetGenotypeFreq": 0.5339806, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.30582523, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.57865167, + "altHomGenotypeFreq": 0.26217228, + "hetGenotypeFreq": 0.6329588, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.4213483, + "refHomGenotypeFreq": 0.10486891, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22443744, + "id": "9179", + "percentageMatch": 0.917224, + "source": "genomicSuperDup", + "start": 22436286 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22443744, + "id": "9122", + "percentageMatch": 0.917071, + "source": "genomicSuperDup", + "start": 22436286 + } + ], + "start": 22440297, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22440297, + "id": "15:22440297:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22440297, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000260739", + "ensemblTranscriptId": "ENST00000565129", + "geneName": "RP11-2F9.4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 527, + "ensemblGeneId": "ENSG00000223877", + "ensemblTranscriptId": "ENST00000460876", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.1607717 + } + ], + "geneName": "RP11-2F9.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000223877", + "ensemblTranscriptId": "ENST00000415697", + "geneName": "RP11-2F9.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -3.5199999809265137, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -3.931999921798706, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.8000001907348633, + "source": "cadd_raw" + }, + { + "score": 0.03999999910593033, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000460876(ENSG00000223877):n.527T>C" + ], + "id": "rs9744755", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.42278686, + "altHomGenotypeFreq": 0.072083704, + "hetGenotypeFreq": 0.70140636, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5772131, + "refHomGenotypeFreq": 0.22650996, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37473002, + "altHomGenotypeFreq": 0.019438446, + "hetGenotypeFreq": 0.71058315, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.62526995, + "refHomGenotypeFreq": 0.2699784, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5494368, + "altHomGenotypeFreq": 0.17396747, + "hetGenotypeFreq": 0.75093865, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.4505632, + "refHomGenotypeFreq": 0.075093865, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3420398, + "altHomGenotypeFreq": 0.029850746, + "hetGenotypeFreq": 0.6243781, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6579602, + "refHomGenotypeFreq": 0.34577113, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39925373, + "altHomGenotypeFreq": 0.06716418, + "hetGenotypeFreq": 0.6641791, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.6007463, + "refHomGenotypeFreq": 0.26865673, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37561882, + "altHomGenotypeFreq": 0.029084159, + "hetGenotypeFreq": 0.6930693, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.6243812, + "refHomGenotypeFreq": 0.27784654, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3580851, + "altHomGenotypeFreq": 0.029787235, + "hetGenotypeFreq": 0.65659577, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6419149, + "refHomGenotypeFreq": 0.31361702, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5377203, + "altHomGenotypeFreq": 0.14923619, + "hetGenotypeFreq": 0.7769683, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.46227968, + "refHomGenotypeFreq": 0.073795535, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42345876, + "altHomGenotypeFreq": 0.07488663, + "hetGenotypeFreq": 0.69714427, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.57654124, + "refHomGenotypeFreq": 0.22796911, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42195123, + "altHomGenotypeFreq": 0.06859756, + "hetGenotypeFreq": 0.7067073, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.57804877, + "refHomGenotypeFreq": 0.22469512, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23970038, + "altHomGenotypeFreq": 0.033707865, + "hetGenotypeFreq": 0.411985, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7602996, + "refHomGenotypeFreq": 0.5543071, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22443744, + "id": "9179", + "percentageMatch": 0.917224, + "source": "genomicSuperDup", + "start": 22436286 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22443744, + "id": "9122", + "percentageMatch": 0.917071, + "source": "genomicSuperDup", + "start": 22436286 + } + ], + "start": 22440322, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22440322, + "id": "15:22440322:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22440322, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000260739", + "ensemblTranscriptId": "ENST00000565129", + "geneName": "RP11-2F9.4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 33, + "ensemblGeneId": "ENSG00000223877", + "ensemblTranscriptId": "ENST00000460876", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.1607717 + } + ], + "geneName": "RP11-2F9.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000223877", + "ensemblTranscriptId": "ENST00000415697", + "geneName": "RP11-2F9.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.4600000381469727, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -2.816999912261963, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.5100002288818359, + "source": "cadd_raw" + }, + { + "score": 0.20000000298023224, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000460876(ENSG00000223877):n.33T>C" + ], + "id": "rs4505267", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.388277, + "altHomGenotypeFreq": 0.043023337, + "hetGenotypeFreq": 0.69050735, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.611723, + "refHomGenotypeFreq": 0.26646933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35917032, + "altHomGenotypeFreq": 0.019650655, + "hetGenotypeFreq": 0.6790393, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6408297, + "refHomGenotypeFreq": 0.30131003, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5310559, + "altHomGenotypeFreq": 0.1378882, + "hetGenotypeFreq": 0.7863354, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.4689441, + "refHomGenotypeFreq": 0.0757764, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3337469, + "altHomGenotypeFreq": 0.027295286, + "hetGenotypeFreq": 0.61290324, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6662531, + "refHomGenotypeFreq": 0.3598015, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37121212, + "altHomGenotypeFreq": 0.06818182, + "hetGenotypeFreq": 0.6060606, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.6287879, + "refHomGenotypeFreq": 0.32575756, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36142322, + "altHomGenotypeFreq": 0.029338326, + "hetGenotypeFreq": 0.6641698, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.6385768, + "refHomGenotypeFreq": 0.30649188, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34427404, + "altHomGenotypeFreq": 0.02837896, + "hetGenotypeFreq": 0.63179016, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.65572596, + "refHomGenotypeFreq": 0.33983088, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45397592, + "altHomGenotypeFreq": 0.057831325, + "hetGenotypeFreq": 0.79228914, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5460241, + "refHomGenotypeFreq": 0.14987952, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38726708, + "altHomGenotypeFreq": 0.043975156, + "hetGenotypeFreq": 0.6865839, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.61273295, + "refHomGenotypeFreq": 0.269441, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38953218, + "altHomGenotypeFreq": 0.04184036, + "hetGenotypeFreq": 0.69538367, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6104678, + "refHomGenotypeFreq": 0.262776, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36472946, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.63527054, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28277153, + "altHomGenotypeFreq": 0.033707865, + "hetGenotypeFreq": 0.49812734, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7172285, + "refHomGenotypeFreq": 0.4681648, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22443744, + "id": "9179", + "percentageMatch": 0.917224, + "source": "genomicSuperDup", + "start": 22436286 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22443744, + "id": "9122", + "percentageMatch": 0.917071, + "source": "genomicSuperDup", + "start": 22436286 + } + ], + "start": 22440816, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22440816, + "id": "15:22440816:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22440816, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_gene", + "cdnaPosition": 299, + "cdsPosition": 299, + "codon": "aCg/aTg", + "ensemblGeneId": "ENSG00000270505", + "ensemblTranscriptId": "ENST00000604066", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.3257329 + } + ], + "geneName": "IGHV1OR15-1", + "proteinVariantAnnotation": { + "alternate": "MET", + "position": 100, + "reference": "THR", + "substitutionScores": [] + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.3149999976158142, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": -0.31999969482421875, + "source": "cadd_raw" + }, + { + "score": 0.6200000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000604066(ENSG00000270505):c.299C>T" + ], + "id": "rs62007810", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.21074675, + "altHomGenotypeFreq": 0.0079947775, + "hetGenotypeFreq": 0.40550393, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.78925323, + "refHomGenotypeFreq": 0.5865013, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21916509, + "altHomGenotypeFreq": 0.006451613, + "hetGenotypeFreq": 0.42542693, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7808349, + "refHomGenotypeFreq": 0.56812143, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23567033, + "altHomGenotypeFreq": 0.0066369013, + "hetGenotypeFreq": 0.45806685, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7643297, + "refHomGenotypeFreq": 0.53529626, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10776148, + "altHomGenotypeFreq": 0.0029573299, + "hetGenotypeFreq": 0.2096083, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.8922385, + "refHomGenotypeFreq": 0.78743434, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24467641, + "altHomGenotypeFreq": 0.01440501, + "hetGenotypeFreq": 0.4605428, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7553236, + "refHomGenotypeFreq": 0.5250522, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23532721, + "altHomGenotypeFreq": 0.003281455, + "hetGenotypeFreq": 0.4640915, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7646728, + "refHomGenotypeFreq": 0.53262705, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24153554, + "altHomGenotypeFreq": 0.009554503, + "hetGenotypeFreq": 0.46396208, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.75846446, + "refHomGenotypeFreq": 0.5264834, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.058342274, + "altHomGenotypeFreq": 2.6824034E-4, + "hetGenotypeFreq": 0.11614807, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9416577, + "refHomGenotypeFreq": 0.88358366, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21814445, + "altHomGenotypeFreq": 0.008143524, + "hetGenotypeFreq": 0.42000186, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7818555, + "refHomGenotypeFreq": 0.57185465, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20175439, + "altHomGenotypeFreq": 0.007813968, + "hetGenotypeFreq": 0.38788083, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7982456, + "refHomGenotypeFreq": 0.6043052, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16987246, + "altHomGenotypeFreq": 0.005377456, + "hetGenotypeFreq": 0.32899, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.83012754, + "refHomGenotypeFreq": 0.66563255, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21205357, + "altHomGenotypeFreq": 0.002232143, + "hetGenotypeFreq": 0.41964287, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7879464, + "refHomGenotypeFreq": 0.578125, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23572378, + "altHomGenotypeFreq": 0.003984064, + "hetGenotypeFreq": 0.46347943, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7642762, + "refHomGenotypeFreq": 0.5325365, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10776942, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21553884, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.8922306, + "refHomGenotypeFreq": 0.78446114, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21917808, + "altHomGenotypeFreq": 0.04109589, + "hetGenotypeFreq": 0.3561644, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7808219, + "refHomGenotypeFreq": 0.60273975, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21900311, + "altHomGenotypeFreq": 0.0043613706, + "hetGenotypeFreq": 0.4292835, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.78099686, + "refHomGenotypeFreq": 0.56635517, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22143267, + "altHomGenotypeFreq": 0.008756819, + "hetGenotypeFreq": 0.4253517, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7785673, + "refHomGenotypeFreq": 0.56589144, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.053127985, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10625597, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.946872, + "refHomGenotypeFreq": 0.89374405, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16935684, + "altHomGenotypeFreq": 0.0058356095, + "hetGenotypeFreq": 0.32704246, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.8306432, + "refHomGenotypeFreq": 0.66712195, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1705162, + "altHomGenotypeFreq": 0.0048054564, + "hetGenotypeFreq": 0.3314215, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.8294838, + "refHomGenotypeFreq": 0.66377306, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26553106, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.73446894, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2220179, + "altHomGenotypeFreq": 0.008383035, + "hetGenotypeFreq": 0.42726973, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7779821, + "refHomGenotypeFreq": 0.56434727, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20982143, + "altHomGenotypeFreq": 0.002232143, + "hetGenotypeFreq": 0.41517857, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7901786, + "refHomGenotypeFreq": 0.58258927, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26039016, + "altHomGenotypeFreq": 0.014661335, + "hetGenotypeFreq": 0.49145764, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.73960984, + "refHomGenotypeFreq": 0.49388102, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24138333, + "altHomGenotypeFreq": 0.007452259, + "hetGenotypeFreq": 0.46786213, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7586167, + "refHomGenotypeFreq": 0.5246856, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.105599724, + "altHomGenotypeFreq": 0.0032837885, + "hetGenotypeFreq": 0.20463187, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.8944003, + "refHomGenotypeFreq": 0.79208434, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24236006, + "altHomGenotypeFreq": 0.0030257185, + "hetGenotypeFreq": 0.4786687, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.75763994, + "refHomGenotypeFreq": 0.5183056, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25055456, + "altHomGenotypeFreq": 0.009652278, + "hetGenotypeFreq": 0.48180455, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.74944544, + "refHomGenotypeFreq": 0.5085432, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.071428575, + "altHomGenotypeFreq": 2.0350021E-4, + "hetGenotypeFreq": 0.14245014, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9285714, + "refHomGenotypeFreq": 0.85734636, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19850187, + "altHomGenotypeFreq": 0.014981274, + "hetGenotypeFreq": 0.3670412, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8014981, + "refHomGenotypeFreq": 0.6179775, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + } + ], + "start": 22448436, + "traitAssociation": [ + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "IGHV1OR15-1" + } + } + ], + "heritableTraits": [], + "id": "COSM4148385", + "somaticInformation": { + "histologySubtype": "neoplasm", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "tumourOrigin": "" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + }, + { + "additionalProperties": [ + { + "name": "mutationSomaticStatus_in_source_file", + "value": "Confirmed somatic variant" + } + ], + "alleleOrigin": [], + "bibliography": [], + "ethnicity": "Z", + "genomicFeatures": [ + { + "featureType": "gene", + "xrefs": { + "symbol": "IGHV1OR15-1" + } + } + ], + "heritableTraits": [], + "id": "COSM4148385", + "somaticInformation": { + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "tumourOrigin": "primary" + }, + "source": { + "name": "cosmic" + }, + "submissions": [] + } + ], + "variantTraitAssociation": { + "clinvar": [], + "cosmic": [ + { + "geneName": "IGHV1OR15-1", + "histologySubtype": "neoplasm", + "mutationId": "COSM4148385", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "other", + "primarySite": "thyroid", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "" + }, + { + "geneName": "IGHV1OR15-1", + "histologySubtype": "", + "mutationId": "COSM4148385", + "mutationSomaticStatus": "Confirmed somatic variant", + "primaryHistology": "carcinoma", + "primarySite": "lung", + "sampleSource": "", + "siteSubtype": "", + "tumourOrigin": "primary" + } + ] + } + }, + "chromosome": "15", + "end": 22448436, + "id": "15:22448436:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22448436, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000269182", + "ensemblTranscriptId": "ENST00000599120", + "geneName": "AC010760.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0.04650000110268593, + "source": "gerp" + }, + { + "score": 0.1289999932050705, + "source": "phastCons" + }, + { + "score": 0.11299999803304672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.6099996566772461, + "source": "cadd_raw" + }, + { + "score": 8.279999732971191, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000599120(ENSG00000269182):c.25+733T>A" + ], + "id": "rs1874597", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.33602834, + "altHomGenotypeFreq": 0.030344732, + "hetGenotypeFreq": 0.6113672, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.66397166, + "refHomGenotypeFreq": 0.35828802, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40563992, + "altHomGenotypeFreq": 0.045553144, + "hetGenotypeFreq": 0.72017354, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.5943601, + "refHomGenotypeFreq": 0.23427331, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13820079, + "altHomGenotypeFreq": 0.0013037809, + "hetGenotypeFreq": 0.273794, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.86179924, + "refHomGenotypeFreq": 0.7249022, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32115868, + "altHomGenotypeFreq": 0.020151133, + "hetGenotypeFreq": 0.60201514, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.6788413, + "refHomGenotypeFreq": 0.37783375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3697183, + "altHomGenotypeFreq": 0.028169014, + "hetGenotypeFreq": 0.6830986, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.6302817, + "refHomGenotypeFreq": 0.28873238, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40169904, + "altHomGenotypeFreq": 0.03883495, + "hetGenotypeFreq": 0.72572815, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.598301, + "refHomGenotypeFreq": 0.23543689, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40556952, + "altHomGenotypeFreq": 0.04299274, + "hetGenotypeFreq": 0.72515357, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.5944305, + "refHomGenotypeFreq": 0.23185371, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21320182, + "altHomGenotypeFreq": 0.008851795, + "hetGenotypeFreq": 0.40870005, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.7867982, + "refHomGenotypeFreq": 0.5824481, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32970247, + "altHomGenotypeFreq": 0.031246109, + "hetGenotypeFreq": 0.59691274, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6702975, + "refHomGenotypeFreq": 0.37184116, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34384614, + "altHomGenotypeFreq": 0.02923077, + "hetGenotypeFreq": 0.6292308, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.65615386, + "refHomGenotypeFreq": 0.34153846, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23847695, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.76152307, + "study": "GONL" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + } + ], + "start": 22457652, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22457652, + "id": "15:22457652:T:A", + "length": 1, + "names": [], + "reference": "T", + "start": 22457652, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_pseudogene", + "ensemblGeneId": "ENSG00000271288", + "ensemblTranscriptId": "ENST00000564926", + "geneName": "IGHV1OR15-3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.190000057220459, + "source": "gerp" + }, + { + "score": 0.017000000923871994, + "source": "phastCons" + }, + { + "score": 0.4490000009536743, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": 0.22999954223632812, + "source": "cadd_raw" + }, + { + "score": 5.059999942779541, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4779314", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.28087687, + "altHomGenotypeFreq": 0.01904132, + "hetGenotypeFreq": 0.5236798, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7191188, + "refHomGenotypeFreq": 0.45727888, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30507162, + "altHomGenotypeFreq": 0.020518776, + "hetGenotypeFreq": 0.5691057, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.69492835, + "refHomGenotypeFreq": 0.41037554, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1157045, + "altHomGenotypeFreq": 0.0015900196, + "hetGenotypeFreq": 0.22835127, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.88423437, + "refHomGenotypeFreq": 0.7700587, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.251739, + "altHomGenotypeFreq": 0.009233611, + "hetGenotypeFreq": 0.48501077, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.748261, + "refHomGenotypeFreq": 0.5057556, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32726294, + "altHomGenotypeFreq": 0.024137931, + "hetGenotypeFreq": 0.60625, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.67273706, + "refHomGenotypeFreq": 0.36961207, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33743182, + "altHomGenotypeFreq": 0.01693618, + "hetGenotypeFreq": 0.6409913, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.66256815, + "refHomGenotypeFreq": 0.34207252, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32213274, + "altHomGenotypeFreq": 0.02899282, + "hetGenotypeFreq": 0.5862798, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.67786723, + "refHomGenotypeFreq": 0.38472733, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19033319, + "altHomGenotypeFreq": 0.005148005, + "hetGenotypeFreq": 0.37037036, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8096668, + "refHomGenotypeFreq": 0.6244816, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28360996, + "altHomGenotypeFreq": 0.019915827, + "hetGenotypeFreq": 0.5273882, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7163901, + "refHomGenotypeFreq": 0.45269594, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27756387, + "altHomGenotypeFreq": 0.017981248, + "hetGenotypeFreq": 0.51918447, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.72242653, + "refHomGenotypeFreq": 0.46283427, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27545014, + "altHomGenotypeFreq": 0.017451523, + "hetGenotypeFreq": 0.51599723, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7245499, + "refHomGenotypeFreq": 0.46655124, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3278867, + "altHomGenotypeFreq": 0.03050109, + "hetGenotypeFreq": 0.59477127, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.6721133, + "refHomGenotypeFreq": 0.37472767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10798429, + "altHomGenotypeFreq": 0.0013089005, + "hetGenotypeFreq": 0.21335079, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.8920157, + "refHomGenotypeFreq": 0.7853403, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2675, + "altHomGenotypeFreq": 0.0125, + "hetGenotypeFreq": 0.51, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7325, + "refHomGenotypeFreq": 0.4775, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33214286, + "altHomGenotypeFreq": 0.021428572, + "hetGenotypeFreq": 0.62142855, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.66785717, + "refHomGenotypeFreq": 0.35714287, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33292383, + "altHomGenotypeFreq": 0.022113021, + "hetGenotypeFreq": 0.6216216, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6670762, + "refHomGenotypeFreq": 0.35626537, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31920305, + "altHomGenotypeFreq": 0.023456266, + "hetGenotypeFreq": 0.59149355, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.6807969, + "refHomGenotypeFreq": 0.38505015, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19889225, + "altHomGenotypeFreq": 0.0067975833, + "hetGenotypeFreq": 0.38418934, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.80110776, + "refHomGenotypeFreq": 0.6090131, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27263656, + "altHomGenotypeFreq": 0.01833375, + "hetGenotypeFreq": 0.50860566, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7273634, + "refHomGenotypeFreq": 0.4730606, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27896294, + "altHomGenotypeFreq": 0.016350046, + "hetGenotypeFreq": 0.52522576, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7210371, + "refHomGenotypeFreq": 0.45842418, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1437563, + "altHomGenotypeFreq": 0.0035246727, + "hetGenotypeFreq": 0.28046325, + "population": "AA", + "refAllele": "C", + "refAlleleFreq": 0.8562437, + "refHomGenotypeFreq": 0.71601206, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22869919, + "altHomGenotypeFreq": 0.021138212, + "hetGenotypeFreq": 0.41512194, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7713008, + "refHomGenotypeFreq": 0.56373984, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2692123, + "altHomGenotypeFreq": 0.029538905, + "hetGenotypeFreq": 0.47934678, + "population": "EA", + "refAllele": "C", + "refAlleleFreq": 0.7307877, + "refHomGenotypeFreq": 0.49111432, + "study": "ESP6500" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29202753, + "altHomGenotypeFreq": 0.018417124, + "hetGenotypeFreq": 0.5472374, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7079642, + "refHomGenotypeFreq": 0.43434545, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32550335, + "altHomGenotypeFreq": 0.029082773, + "hetGenotypeFreq": 0.59284115, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.67449665, + "refHomGenotypeFreq": 0.37807608, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2587629, + "altHomGenotypeFreq": 0.010066707, + "hetGenotypeFreq": 0.49739236, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.7412371, + "refHomGenotypeFreq": 0.49254093, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1369338, + "altHomGenotypeFreq": 0.0018583043, + "hetGenotypeFreq": 0.27038327, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.8629501, + "refHomGenotypeFreq": 0.7277584, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2570885, + "altHomGenotypeFreq": 0.0076071923, + "hetGenotypeFreq": 0.49896264, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.74291146, + "refHomGenotypeFreq": 0.49343014, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34664246, + "altHomGenotypeFreq": 0.016333938, + "hetGenotypeFreq": 0.66061705, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6533575, + "refHomGenotypeFreq": 0.323049, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33130702, + "altHomGenotypeFreq": 0.026536984, + "hetGenotypeFreq": 0.6095401, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.66869295, + "refHomGenotypeFreq": 0.36392292, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2181277, + "altHomGenotypeFreq": 0.0049271197, + "hetGenotypeFreq": 0.42640114, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.78187233, + "refHomGenotypeFreq": 0.5686717, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2846442, + "altHomGenotypeFreq": 0.041198503, + "hetGenotypeFreq": 0.4868914, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7153558, + "refHomGenotypeFreq": 0.47191012, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + } + ], + "start": 22466002, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22466002, + "id": "15:22466002:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22466002, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_pseudogene", + "cdnaPosition": 283, + "ensemblGeneId": "ENSG00000271288", + "ensemblTranscriptId": "ENST00000564926", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.32786885 + } + ], + "geneName": "IGHV1OR15-3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -4.690000057220459, + "source": "gerp" + }, + { + "score": 0.014000000432133675, + "source": "phastCons" + }, + { + "score": -1.746999979019165, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.43000030517578125, + "source": "cadd_raw" + }, + { + "score": 0.3400000035762787, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000564926(ENSG00000271288):n.283T>G" + ], + "id": "rs1985064", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.49060708, + "altHomGenotypeFreq": 0.1106981, + "hetGenotypeFreq": 0.75981796, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5093929, + "refHomGenotypeFreq": 0.12948394, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4981461, + "altHomGenotypeFreq": 0.11902113, + "hetGenotypeFreq": 0.7582499, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.5018539, + "refHomGenotypeFreq": 0.12272896, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48756745, + "altHomGenotypeFreq": 0.105442174, + "hetGenotypeFreq": 0.7642505, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5124326, + "refHomGenotypeFreq": 0.1303073, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43598992, + "altHomGenotypeFreq": 0.093160234, + "hetGenotypeFreq": 0.68565935, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5640101, + "refHomGenotypeFreq": 0.22118042, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5045277, + "altHomGenotypeFreq": 0.11545586, + "hetGenotypeFreq": 0.77814364, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.4954723, + "refHomGenotypeFreq": 0.1064005, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50598097, + "altHomGenotypeFreq": 0.10729497, + "hetGenotypeFreq": 0.797372, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.49401903, + "refHomGenotypeFreq": 0.09533303, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5029226, + "altHomGenotypeFreq": 0.12219141, + "hetGenotypeFreq": 0.76146245, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.49707738, + "refHomGenotypeFreq": 0.11634617, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5114438, + "altHomGenotypeFreq": 0.08742515, + "hetGenotypeFreq": 0.84803724, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.4885562, + "refHomGenotypeFreq": 0.06453759, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49246076, + "altHomGenotypeFreq": 0.11200961, + "hetGenotypeFreq": 0.7609023, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.5075393, + "refHomGenotypeFreq": 0.12708811, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48835686, + "altHomGenotypeFreq": 0.109106004, + "hetGenotypeFreq": 0.7585017, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5116431, + "refHomGenotypeFreq": 0.13239229, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5013276, + "altHomGenotypeFreq": 0.107666776, + "hetGenotypeFreq": 0.7873216, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.49867243, + "refHomGenotypeFreq": 0.10501162, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.51979166, + "altHomGenotypeFreq": 0.12708333, + "hetGenotypeFreq": 0.78541666, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.48020834, + "refHomGenotypeFreq": 0.0875, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4802799, + "altHomGenotypeFreq": 0.10941476, + "hetGenotypeFreq": 0.7417303, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5197201, + "refHomGenotypeFreq": 0.14885496, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46350366, + "altHomGenotypeFreq": 0.09245742, + "hetGenotypeFreq": 0.74209243, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.53649634, + "refHomGenotypeFreq": 0.16545013, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5067114, + "altHomGenotypeFreq": 0.12751678, + "hetGenotypeFreq": 0.75838923, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.49328858, + "refHomGenotypeFreq": 0.11409396, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5081776, + "altHomGenotypeFreq": 0.11331776, + "hetGenotypeFreq": 0.78971964, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.49182242, + "refHomGenotypeFreq": 0.096962616, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49258447, + "altHomGenotypeFreq": 0.10793738, + "hetGenotypeFreq": 0.76929414, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.50741553, + "refHomGenotypeFreq": 0.12276847, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5188457, + "altHomGenotypeFreq": 0.103180215, + "hetGenotypeFreq": 0.83133096, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.4811543, + "refHomGenotypeFreq": 0.06548881, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5023381, + "altHomGenotypeFreq": 0.11115108, + "hetGenotypeFreq": 0.7823741, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.49766186, + "refHomGenotypeFreq": 0.10647482, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5000743, + "altHomGenotypeFreq": 0.10334572, + "hetGenotypeFreq": 0.79345727, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.49992564, + "refHomGenotypeFreq": 0.10319702, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48515552, + "altHomGenotypeFreq": 0.098963246, + "hetGenotypeFreq": 0.7723845, + "population": "AA", + "refAllele": "A", + "refAlleleFreq": 0.5148445, + "refHomGenotypeFreq": 0.12865222, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48300284, + "altHomGenotypeFreq": 0.116462074, + "hetGenotypeFreq": 0.7330815, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.51699716, + "refHomGenotypeFreq": 0.1504564, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48192343, + "altHomGenotypeFreq": 0.12523629, + "hetGenotypeFreq": 0.7133743, + "population": "EA", + "refAllele": "A", + "refAlleleFreq": 0.51807654, + "refHomGenotypeFreq": 0.16138941, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4935307, + "altHomGenotypeFreq": 0.11172592, + "hetGenotypeFreq": 0.7636095, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5064693, + "refHomGenotypeFreq": 0.12466452, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5089286, + "altHomGenotypeFreq": 0.13839285, + "hetGenotypeFreq": 0.7410714, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.49107143, + "refHomGenotypeFreq": 0.12053572, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48158914, + "altHomGenotypeFreq": 0.10428779, + "hetGenotypeFreq": 0.75460273, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.51841086, + "refHomGenotypeFreq": 0.1411095, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4953456, + "altHomGenotypeFreq": 0.11449849, + "hetGenotypeFreq": 0.7616942, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5046544, + "refHomGenotypeFreq": 0.12380731, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43604147, + "altHomGenotypeFreq": 0.09714779, + "hetGenotypeFreq": 0.67778736, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5639585, + "refHomGenotypeFreq": 0.22506483, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5052918, + "altHomGenotypeFreq": 0.108557604, + "hetGenotypeFreq": 0.7934684, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.49470818, + "refHomGenotypeFreq": 0.097973995, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50208336, + "altHomGenotypeFreq": 0.11888489, + "hetGenotypeFreq": 0.7663969, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.49791667, + "refHomGenotypeFreq": 0.11471823, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5123243, + "altHomGenotypeFreq": 0.0900387, + "hetGenotypeFreq": 0.8445712, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.4876757, + "refHomGenotypeFreq": 0.0653901, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4765625, + "altHomGenotypeFreq": 0.09375, + "hetGenotypeFreq": 0.765625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.5234375, + "refHomGenotypeFreq": 0.140625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5059904, + "altHomGenotypeFreq": 0.12779553, + "hetGenotypeFreq": 0.75638974, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.49400958, + "refHomGenotypeFreq": 0.11581469, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49386504, + "altHomGenotypeFreq": 0.116564415, + "hetGenotypeFreq": 0.75460124, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.506135, + "refHomGenotypeFreq": 0.12883435, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47340426, + "altHomGenotypeFreq": 0.11702128, + "hetGenotypeFreq": 0.71276593, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.5265958, + "refHomGenotypeFreq": 0.17021276, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50980395, + "altHomGenotypeFreq": 0.12745099, + "hetGenotypeFreq": 0.7647059, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.49019608, + "refHomGenotypeFreq": 0.10784314, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53025717, + "altHomGenotypeFreq": 0.113464445, + "hetGenotypeFreq": 0.8335855, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.4697428, + "refHomGenotypeFreq": 0.052950077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44285715, + "altHomGenotypeFreq": 0.057142857, + "hetGenotypeFreq": 0.7714286, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.55714285, + "refHomGenotypeFreq": 0.17142858, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49519232, + "altHomGenotypeFreq": 0.13461539, + "hetGenotypeFreq": 0.72115386, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.5048077, + "refHomGenotypeFreq": 0.14423077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5138889, + "altHomGenotypeFreq": 0.09259259, + "hetGenotypeFreq": 0.8425926, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.4861111, + "refHomGenotypeFreq": 0.06481481, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.453125, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.78125, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.546875, + "refHomGenotypeFreq": 0.15625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50442475, + "altHomGenotypeFreq": 0.07964602, + "hetGenotypeFreq": 0.8495575, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.49557522, + "refHomGenotypeFreq": 0.07079646, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5147059, + "altHomGenotypeFreq": 0.13725491, + "hetGenotypeFreq": 0.754902, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.4852941, + "refHomGenotypeFreq": 0.10784314, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53296703, + "altHomGenotypeFreq": 0.17582418, + "hetGenotypeFreq": 0.71428573, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.46703297, + "refHomGenotypeFreq": 0.10989011, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5913978, + "altHomGenotypeFreq": 0.24731183, + "hetGenotypeFreq": 0.68817204, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.40860215, + "refHomGenotypeFreq": 0.06451613, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5252525, + "altHomGenotypeFreq": 0.16161616, + "hetGenotypeFreq": 0.72727275, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.47474748, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5140187, + "altHomGenotypeFreq": 0.17757009, + "hetGenotypeFreq": 0.6728972, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.48598132, + "refHomGenotypeFreq": 0.1495327, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50581396, + "altHomGenotypeFreq": 0.15116279, + "hetGenotypeFreq": 0.7093023, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.49418604, + "refHomGenotypeFreq": 0.13953489, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5416667, + "altHomGenotypeFreq": 0.104166664, + "hetGenotypeFreq": 0.875, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.45833334, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.530303, + "altHomGenotypeFreq": 0.1010101, + "hetGenotypeFreq": 0.85858583, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.46969697, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5555556, + "altHomGenotypeFreq": 0.18181819, + "hetGenotypeFreq": 0.74747473, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.44444445, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.51192844, + "altHomGenotypeFreq": 0.15109344, + "hetGenotypeFreq": 0.72167003, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.48807156, + "refHomGenotypeFreq": 0.12723657, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.56557375, + "altHomGenotypeFreq": 0.18032786, + "hetGenotypeFreq": 0.77049184, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.43442622, + "refHomGenotypeFreq": 0.04918033, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45965418, + "altHomGenotypeFreq": 0.1037464, + "hetGenotypeFreq": 0.7118156, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.54034585, + "refHomGenotypeFreq": 0.18443803, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5176471, + "altHomGenotypeFreq": 0.08235294, + "hetGenotypeFreq": 0.87058824, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.48235294, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4854369, + "altHomGenotypeFreq": 0.106796116, + "hetGenotypeFreq": 0.75728154, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.5145631, + "refHomGenotypeFreq": 0.13592233, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5050505, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.72727275, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.4949495, + "refHomGenotypeFreq": 0.13131313, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48598132, + "altHomGenotypeFreq": 0.093457945, + "hetGenotypeFreq": 0.7850467, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.5140187, + "refHomGenotypeFreq": 0.12149533, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4903846, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.7307692, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.50961536, + "refHomGenotypeFreq": 0.14423077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5252525, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.7070707, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.47474748, + "refHomGenotypeFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39411765, + "altHomGenotypeFreq": 0.07058824, + "hetGenotypeFreq": 0.64705884, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.60588235, + "refHomGenotypeFreq": 0.28235295, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5119048, + "altHomGenotypeFreq": 0.15079366, + "hetGenotypeFreq": 0.7222222, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.48809522, + "refHomGenotypeFreq": 0.12698413, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5145631, + "altHomGenotypeFreq": 0.16504854, + "hetGenotypeFreq": 0.6990291, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.4854369, + "refHomGenotypeFreq": 0.13592233, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5093633, + "altHomGenotypeFreq": 0.123595506, + "hetGenotypeFreq": 0.7715356, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.4906367, + "refHomGenotypeFreq": 0.10486891, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + } + ], + "start": 22466126, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22466126, + "id": "15:22466126:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 22466126, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_pseudogene", + "ensemblGeneId": "ENSG00000271288", + "ensemblTranscriptId": "ENST00000564926", + "geneName": "IGHV1OR15-3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "IG_V_gene", + "ensemblGeneId": "ENSG00000259261", + "ensemblTranscriptId": "ENST00000557788", + "geneName": "IGHV4OR15-8", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.11299999803304672, + "source": "gerp" + }, + { + "score": 0.008999999612569809, + "source": "phastCons" + }, + { + "score": -1.5449999570846558, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "upstream_gene_variant", + "functionalScore": [ + { + "score": -0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 1.850000023841858, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1319758", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.59726995, + "altHomGenotypeFreq": 0.24345584, + "hetGenotypeFreq": 0.70762825, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.40273005, + "refHomGenotypeFreq": 0.04891592, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.59479165, + "altHomGenotypeFreq": 0.23541667, + "hetGenotypeFreq": 0.71875, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.40520832, + "refHomGenotypeFreq": 0.045833334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.523212, + "altHomGenotypeFreq": 0.15809284, + "hetGenotypeFreq": 0.7302384, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.47678795, + "refHomGenotypeFreq": 0.11166876, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.459799, + "altHomGenotypeFreq": 0.1080402, + "hetGenotypeFreq": 0.7035176, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.540201, + "refHomGenotypeFreq": 0.18844222, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6333333, + "altHomGenotypeFreq": 0.28666666, + "hetGenotypeFreq": 0.6933333, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.36666667, + "refHomGenotypeFreq": 0.02, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6002394, + "altHomGenotypeFreq": 0.2543387, + "hetGenotypeFreq": 0.6918013, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.39976063, + "refHomGenotypeFreq": 0.053859964, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.60315305, + "altHomGenotypeFreq": 0.25061157, + "hetGenotypeFreq": 0.7050829, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.39684698, + "refHomGenotypeFreq": 0.04430552, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.61160505, + "altHomGenotypeFreq": 0.25479645, + "hetGenotypeFreq": 0.7136172, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.38839495, + "refHomGenotypeFreq": 0.031586338, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5982676, + "altHomGenotypeFreq": 0.24563919, + "hetGenotypeFreq": 0.7052569, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.4017324, + "refHomGenotypeFreq": 0.04910394, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.59603435, + "altHomGenotypeFreq": 0.2407517, + "hetGenotypeFreq": 0.71056527, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.40396568, + "refHomGenotypeFreq": 0.048683044, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + } + ], + "start": 22469782, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22469782, + "id": "15:22469782:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 22469782, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_gene", + "cdnaPosition": 329, + "cdsPosition": 329, + "codon": "aGg/aCg", + "ensemblGeneId": "ENSG00000259261", + "ensemblTranscriptId": "ENST00000557788", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.3257329 + } + ], + "geneName": "IGHV4OR15-8", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 110, + "reference": "ARG", + "substitutionScores": [] + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2999999523162842, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": -1.4919999837875366, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": -1.0600004196166992, + "source": "cadd_raw" + }, + { + "score": 0.009999999776482582, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000557788(ENSG00000259261):c.329G>C", + "ENSP00000473987:p.Arg110Thr" + ], + "id": "rs586350", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.8528421, + "altHomGenotypeFreq": 0.7058576, + "hetGenotypeFreq": 0.29400203, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.14714141, + "refHomGenotypeFreq": 1.4039029E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8333948, + "altHomGenotypeFreq": 0.66715866, + "hetGenotypeFreq": 0.33247232, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.16660516, + "refHomGenotypeFreq": 3.6900368E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9919991, + "altHomGenotypeFreq": 0.984346, + "hetGenotypeFreq": 0.015653988, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.007826994, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.91369313, + "altHomGenotypeFreq": 0.8275058, + "hetGenotypeFreq": 0.17237464, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.086306855, + "refHomGenotypeFreq": 1.1953858E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7937755, + "altHomGenotypeFreq": 0.5877551, + "hetGenotypeFreq": 0.41204083, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.20622449, + "refHomGenotypeFreq": 2.0408163E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.83205485, + "altHomGenotypeFreq": 0.6642, + "hetGenotypeFreq": 0.33570978, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.16794513, + "refHomGenotypeFreq": 9.024456E-5, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.84202117, + "altHomGenotypeFreq": 0.6841901, + "hetGenotypeFreq": 0.31568056, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.15796962, + "refHomGenotypeFreq": 1.2934698E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8983095, + "altHomGenotypeFreq": 0.79661906, + "hetGenotypeFreq": 0.20338094, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.10169047, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.84571564, + "altHomGenotypeFreq": 0.6916119, + "hetGenotypeFreq": 0.3082226, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.15427686, + "refHomGenotypeFreq": 1.655654E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8615055, + "altHomGenotypeFreq": 0.7231757, + "hetGenotypeFreq": 0.27671447, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.13846703, + "refHomGenotypeFreq": 1.0978555E-4, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.85341024, + "altHomGenotypeFreq": 0.70779306, + "hetGenotypeFreq": 0.29123443, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.14658973, + "refHomGenotypeFreq": 9.725104E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8162218, + "altHomGenotypeFreq": 0.63244355, + "hetGenotypeFreq": 0.36755648, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.18377824, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99260175, + "altHomGenotypeFreq": 0.98520344, + "hetGenotypeFreq": 0.014796548, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.007398274, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8942308, + "altHomGenotypeFreq": 0.78846157, + "hetGenotypeFreq": 0.21153846, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.10576923, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8187919, + "altHomGenotypeFreq": 0.6510067, + "hetGenotypeFreq": 0.33557048, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.18120806, + "refHomGenotypeFreq": 0.013422819, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.81828636, + "altHomGenotypeFreq": 0.6388729, + "hetGenotypeFreq": 0.3588269, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.18171363, + "refHomGenotypeFreq": 0.0023001726, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.82400966, + "altHomGenotypeFreq": 0.64922374, + "hetGenotypeFreq": 0.34957173, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.17599036, + "refHomGenotypeFreq": 0.0012044968, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8934483, + "altHomGenotypeFreq": 0.7868965, + "hetGenotypeFreq": 0.21310344, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.10655172, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.85713446, + "altHomGenotypeFreq": 0.71532506, + "hetGenotypeFreq": 0.28361887, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.14286552, + "refHomGenotypeFreq": 0.0010560901, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8488119, + "altHomGenotypeFreq": 0.6984932, + "hetGenotypeFreq": 0.30063748, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.15118806, + "refHomGenotypeFreq": 8.6931325E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9519038, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.04809619, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8332283, + "altHomGenotypeFreq": 0.6665727, + "hetGenotypeFreq": 0.3333278, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.16676341, + "refHomGenotypeFreq": 9.950084E-5, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.81584823, + "altHomGenotypeFreq": 0.6316964, + "hetGenotypeFreq": 0.36830357, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.18415178, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7414232, + "altHomGenotypeFreq": 0.48308885, + "hetGenotypeFreq": 0.5166687, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.2585768, + "refHomGenotypeFreq": 2.4245364E-4, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9917691, + "altHomGenotypeFreq": 0.98377, + "hetGenotypeFreq": 0.016230002, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.008115001, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.90665513, + "altHomGenotypeFreq": 0.81331027, + "hetGenotypeFreq": 0.18668972, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.09334486, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8162432, + "altHomGenotypeFreq": 0.6324864, + "hetGenotypeFreq": 0.3675136, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.1837568, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.81542206, + "altHomGenotypeFreq": 0.63096416, + "hetGenotypeFreq": 0.3689157, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.18457797, + "refHomGenotypeFreq": 1.201093E-4, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8956504, + "altHomGenotypeFreq": 0.7913008, + "hetGenotypeFreq": 0.2086992, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.1043496, + "refHomGenotypeFreq": 0, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9609375, + "altHomGenotypeFreq": 0.921875, + "hetGenotypeFreq": 0.078125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.0390625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8985623, + "altHomGenotypeFreq": 0.7991214, + "hetGenotypeFreq": 0.19888179, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.1014377, + "refHomGenotypeFreq": 0.0019968052, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74846625, + "altHomGenotypeFreq": 0.50715744, + "hetGenotypeFreq": 0.4826176, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.25153375, + "refHomGenotypeFreq": 0.010224949, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.92021275, + "altHomGenotypeFreq": 0.84042555, + "hetGenotypeFreq": 0.15957448, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.07978723, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.71568626, + "altHomGenotypeFreq": 0.44117647, + "hetGenotypeFreq": 0.54901963, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.28431374, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9228442, + "altHomGenotypeFreq": 0.84568834, + "hetGenotypeFreq": 0.15431164, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.07715582, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.98571426, + "altHomGenotypeFreq": 0.9714286, + "hetGenotypeFreq": 0.02857143, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.014285714, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9951923, + "altHomGenotypeFreq": 0.99038464, + "hetGenotypeFreq": 0.009615385, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.0048076925, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.912037, + "altHomGenotypeFreq": 0.8240741, + "hetGenotypeFreq": 0.17592593, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.08796296, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8125, + "altHomGenotypeFreq": 0.625, + "hetGenotypeFreq": 0.375, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.1875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.94690263, + "altHomGenotypeFreq": 0.8938053, + "hetGenotypeFreq": 0.10619469, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.053097345, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7794118, + "altHomGenotypeFreq": 0.5588235, + "hetGenotypeFreq": 0.44117647, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.22058824, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8901099, + "altHomGenotypeFreq": 0.7802198, + "hetGenotypeFreq": 0.21978024, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.10989011, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.99462366, + "altHomGenotypeFreq": 0.9892473, + "hetGenotypeFreq": 0.010752688, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.005376344, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9848485, + "altHomGenotypeFreq": 0.969697, + "hetGenotypeFreq": 0.030303031, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.015151516, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.864486, + "altHomGenotypeFreq": 0.72897196, + "hetGenotypeFreq": 0.27102804, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.13551402, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6976744, + "altHomGenotypeFreq": 0.41860464, + "hetGenotypeFreq": 0.55813956, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.30232558, + "refHomGenotypeFreq": 0.023255814, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9166667, + "altHomGenotypeFreq": 0.8333333, + "hetGenotypeFreq": 0.16666667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.083333336, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8888889, + "altHomGenotypeFreq": 0.7777778, + "hetGenotypeFreq": 0.22222221, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.11111111, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.111111104, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.889662, + "altHomGenotypeFreq": 0.77932405, + "hetGenotypeFreq": 0.22067595, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.11033797, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.90163934, + "altHomGenotypeFreq": 0.8032787, + "hetGenotypeFreq": 0.1967213, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.09836066, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9423631, + "altHomGenotypeFreq": 0.8847262, + "hetGenotypeFreq": 0.11527377, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.057636887, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9411765, + "altHomGenotypeFreq": 0.88235295, + "hetGenotypeFreq": 0.11764706, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.05882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7330097, + "altHomGenotypeFreq": 0.4854369, + "hetGenotypeFreq": 0.49514562, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.2669903, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.93939394, + "altHomGenotypeFreq": 0.8787879, + "hetGenotypeFreq": 0.121212125, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.060606062, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.86915886, + "altHomGenotypeFreq": 0.7383177, + "hetGenotypeFreq": 0.26168224, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.13084112, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9423077, + "altHomGenotypeFreq": 0.88461536, + "hetGenotypeFreq": 0.115384616, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.057692308, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8888889, + "altHomGenotypeFreq": 0.7777778, + "hetGenotypeFreq": 0.22222222, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.11111111, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9529412, + "altHomGenotypeFreq": 0.90588236, + "hetGenotypeFreq": 0.09411765, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.047058824, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9910714, + "altHomGenotypeFreq": 0.98214287, + "hetGenotypeFreq": 0.017857144, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.008928572, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9951456, + "altHomGenotypeFreq": 0.99029124, + "hetGenotypeFreq": 0.009708738, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.004854369, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21722846, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4344569, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7827715, + "refHomGenotypeFreq": 0.56554306, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22473755, + "id": "8477", + "percentageMatch": 0.923502, + "source": "genomicSuperDup", + "start": 22472669 + } + ], + "start": 22472942, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22472942, + "id": "15:22472942:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22472942, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_gene", + "cdnaPosition": 243, + "cdsPosition": 243, + "codon": "ccG/ccA", + "ensemblGeneId": "ENSG00000259261", + "ensemblTranscriptId": "ENST00000557788", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.3257329 + } + ], + "geneName": "IGHV4OR15-8", + "proteinVariantAnnotation": { + "alternate": "PRO", + "position": 81, + "reference": "PRO" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.35499998927116394, + "source": "gerp" + }, + { + "score": 0.05400000140070915, + "source": "phastCons" + }, + { + "score": -0.49799999594688416, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": 1.3299999237060547, + "source": "cadd_raw" + }, + { + "score": 12.470000267028809, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000557788(ENSG00000259261):c.243G>A", + "ENSP00000473987:p.Pro81=" + ], + "id": "rs3814940", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.23805025, + "altHomGenotypeFreq": 0.0033949337, + "hetGenotypeFreq": 0.46931064, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7619498, + "refHomGenotypeFreq": 0.52729446, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23510242, + "altHomGenotypeFreq": 0.002793296, + "hetGenotypeFreq": 0.46461824, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7648976, + "refHomGenotypeFreq": 0.5325885, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38412017, + "altHomGenotypeFreq": 0.0062426846, + "hetGenotypeFreq": 0.75575495, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.61587983, + "refHomGenotypeFreq": 0.23800234, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1240302, + "altHomGenotypeFreq": 9.697977E-4, + "hetGenotypeFreq": 0.24612081, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8759698, + "refHomGenotypeFreq": 0.7529094, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21768707, + "altHomGenotypeFreq": 0.0032653061, + "hetGenotypeFreq": 0.42884353, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7823129, + "refHomGenotypeFreq": 0.5678912, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27653533, + "altHomGenotypeFreq": 0.0017381228, + "hetGenotypeFreq": 0.54959446, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.72346467, + "refHomGenotypeFreq": 0.44866744, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22527657, + "altHomGenotypeFreq": 0.003472056, + "hetGenotypeFreq": 0.44360903, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7747234, + "refHomGenotypeFreq": 0.5529189, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3178936, + "altHomGenotypeFreq": 0.008196721, + "hetGenotypeFreq": 0.61939377, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.6821064, + "refHomGenotypeFreq": 0.37240952, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23799106, + "altHomGenotypeFreq": 0.003171813, + "hetGenotypeFreq": 0.4696385, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.76200897, + "refHomGenotypeFreq": 0.5271897, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23812068, + "altHomGenotypeFreq": 0.003660422, + "hetGenotypeFreq": 0.46892053, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7618793, + "refHomGenotypeFreq": 0.5274191, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29681247, + "altHomGenotypeFreq": 0.007647227, + "hetGenotypeFreq": 0.57833046, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7031875, + "refHomGenotypeFreq": 0.4140223, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2972973, + "altHomGenotypeFreq": 0.0045045046, + "hetGenotypeFreq": 0.5855856, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7027027, + "refHomGenotypeFreq": 0.4099099, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39017734, + "altHomGenotypeFreq": 0.009549796, + "hetGenotypeFreq": 0.76125515, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.60982263, + "refHomGenotypeFreq": 0.22919509, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18320611, + "altHomGenotypeFreq": 0.0025445293, + "hetGenotypeFreq": 0.36132315, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8167939, + "refHomGenotypeFreq": 0.6361323, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26449275, + "altHomGenotypeFreq": 0.02173913, + "hetGenotypeFreq": 0.48550725, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.73550725, + "refHomGenotypeFreq": 0.49275362, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31723484, + "altHomGenotypeFreq": 0.009469697, + "hetGenotypeFreq": 0.6155303, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6827651, + "refHomGenotypeFreq": 0.375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2709997, + "altHomGenotypeFreq": 0.003697131, + "hetGenotypeFreq": 0.53460515, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7290003, + "refHomGenotypeFreq": 0.46169773, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32795835, + "altHomGenotypeFreq": 0.013712544, + "hetGenotypeFreq": 0.62849164, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.67204165, + "refHomGenotypeFreq": 0.35779583, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.297421, + "altHomGenotypeFreq": 0.007994842, + "hetGenotypeFreq": 0.57885236, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.70257896, + "refHomGenotypeFreq": 0.4131528, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2960558, + "altHomGenotypeFreq": 0.007215007, + "hetGenotypeFreq": 0.5776816, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7039442, + "refHomGenotypeFreq": 0.4151034, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29325175, + "altHomGenotypeFreq": 0.0031352167, + "hetGenotypeFreq": 0.5802666, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7067315, + "refHomGenotypeFreq": 0.4165982, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28202248, + "altHomGenotypeFreq": 0.006741573, + "hetGenotypeFreq": 0.5505618, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7179775, + "refHomGenotypeFreq": 0.44269663, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31827617, + "altHomGenotypeFreq": 0.002319619, + "hetGenotypeFreq": 0.63191307, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.68172383, + "refHomGenotypeFreq": 0.3657673, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3935153, + "altHomGenotypeFreq": 0.005831584, + "hetGenotypeFreq": 0.7753674, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6064847, + "refHomGenotypeFreq": 0.21880102, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16292922, + "altHomGenotypeFreq": 7.007708E-4, + "hetGenotypeFreq": 0.3244569, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.83707076, + "refHomGenotypeFreq": 0.6748423, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32284668, + "altHomGenotypeFreq": 0.0012217471, + "hetGenotypeFreq": 0.64324987, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.67715335, + "refHomGenotypeFreq": 0.3555284, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.285923, + "altHomGenotypeFreq": 0.00301324, + "hetGenotypeFreq": 0.5658195, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.714077, + "refHomGenotypeFreq": 0.43116724, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34605935, + "altHomGenotypeFreq": 0.0067553734, + "hetGenotypeFreq": 0.6790174, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.65373594, + "refHomGenotypeFreq": 0.31422722, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22846442, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.4494382, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7715356, + "refHomGenotypeFreq": 0.54681647, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22473755, + "id": "8477", + "percentageMatch": 0.923502, + "source": "genomicSuperDup", + "start": 22472669 + } + ], + "start": 22473028, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22473028, + "id": "15:22473028:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22473028, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_gene", + "cdnaPosition": 229, + "cdsPosition": 229, + "codon": "Ccc/Acc", + "ensemblGeneId": "ENSG00000259261", + "ensemblTranscriptId": "ENST00000557788", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.3257329 + } + ], + "geneName": "IGHV4OR15-8", + "proteinVariantAnnotation": { + "alternate": "THR", + "position": 77, + "reference": "PRO", + "substitutionScores": [] + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.2409999966621399, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.7670000195503235, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": -2.75, + "source": "cadd_raw" + }, + { + "score": 0, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000557788(ENSG00000259261):c.229C>A", + "ENSP00000473987:p.Pro77Thr" + ], + "id": "rs72687775", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.37206963, + "altHomGenotypeFreq": 2.2860017E-5, + "hetGenotypeFreq": 0.74413925, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6279075, + "refHomGenotypeFreq": 0.2558379, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33097485, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6619497, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.6690252, + "refHomGenotypeFreq": 0.3380503, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38434705, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7686941, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.615653, + "refHomGenotypeFreq": 0.2313059, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3841634, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7683268, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6158366, + "refHomGenotypeFreq": 0.2316732, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32298586, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6459717, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.6770142, + "refHomGenotypeFreq": 0.35402828, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4293478, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8586956, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5706522, + "refHomGenotypeFreq": 0.14130434, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3720732, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7441464, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.6279268, + "refHomGenotypeFreq": 0.25585362, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1722365, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.344473, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8277635, + "refHomGenotypeFreq": 0.655527, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37820193, + "altHomGenotypeFreq": 4.165105E-5, + "hetGenotypeFreq": 0.75640386, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.62175643, + "refHomGenotypeFreq": 0.2435545, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36460945, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7292189, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6353905, + "refHomGenotypeFreq": 0.27078107, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11046935, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2209387, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.88953066, + "refHomGenotypeFreq": 0.7790613, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12969284, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.25938568, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.87030715, + "refHomGenotypeFreq": 0.74061435, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23991507, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.47983015, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.7600849, + "refHomGenotypeFreq": 0.52016985, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.116949156, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23389831, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.88305086, + "refHomGenotypeFreq": 0.7661017, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.110526316, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22105263, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8894737, + "refHomGenotypeFreq": 0.77894735, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09030837, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18061674, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.90969163, + "refHomGenotypeFreq": 0.81938326, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14873193, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.29746386, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.85126805, + "refHomGenotypeFreq": 0.70253617, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04369558, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08739116, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.95630443, + "refHomGenotypeFreq": 0.91260886, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11523953, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23047906, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.88476044, + "refHomGenotypeFreq": 0.76952094, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.104597166, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.20919433, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.89540285, + "refHomGenotypeFreq": 0.79080564, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41240275, + "altHomGenotypeFreq": 3.3607233E-5, + "hetGenotypeFreq": 0.8248055, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.58756363, + "refHomGenotypeFreq": 0.1751609, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39932126, + "altHomGenotypeFreq": 0.0022624435, + "hetGenotypeFreq": 0.7941176, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.60067874, + "refHomGenotypeFreq": 0.20361991, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45159718, + "altHomGenotypeFreq": 1.2192148E-4, + "hetGenotypeFreq": 0.9034382, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.548159, + "refHomGenotypeFreq": 0.09643989, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4392468, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8784936, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5607532, + "refHomGenotypeFreq": 0.12150639, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4272362, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8544724, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5727638, + "refHomGenotypeFreq": 0.1455276, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43879125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8775825, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5612088, + "refHomGenotypeFreq": 0.12241752, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4111591, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8223182, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5888409, + "refHomGenotypeFreq": 0.1776818, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29599917, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.59199834, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.70400083, + "refHomGenotypeFreq": 0.40800166, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3483146, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6966292, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6516854, + "refHomGenotypeFreq": 0.30337077, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22473755, + "id": "8477", + "percentageMatch": 0.923502, + "source": "genomicSuperDup", + "start": 22472669 + } + ], + "start": 22473042, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22473042, + "id": "15:22473042:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22473042, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_gene", + "cdnaPosition": 165, + "cdsPosition": 165, + "codon": "agC/agT", + "ensemblGeneId": "ENSG00000259261", + "ensemblTranscriptId": "ENST00000557788", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.3257329 + } + ], + "geneName": "IGHV4OR15-8", + "proteinVariantAnnotation": { + "alternate": "SER", + "position": 55, + "reference": "SER" + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001819", + "name": "synonymous_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2999999523162842, + "source": "gerp" + }, + { + "score": 0.07400000095367432, + "source": "phastCons" + }, + { + "score": 0.4000000059604645, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "synonymous_variant", + "functionalScore": [ + { + "score": -0.1099996566772461, + "source": "cadd_raw" + }, + { + "score": 1.6699999570846558, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000557788(ENSG00000259261):c.165C>T", + "ENSP00000473987:p.Ser55=" + ], + "id": "rs72687776", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.37155327, + "altHomGenotypeFreq": 1.1546811E-5, + "hetGenotypeFreq": 0.7430835, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6284467, + "refHomGenotypeFreq": 0.256905, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32604057, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.65208113, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.67395943, + "refHomGenotypeFreq": 0.3479189, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38658032, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.77316064, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.61341965, + "refHomGenotypeFreq": 0.22683936, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38190222, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.76380444, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6180978, + "refHomGenotypeFreq": 0.23619558, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3065749, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6131498, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.69342506, + "refHomGenotypeFreq": 0.38685015, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4288931, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8577862, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5711069, + "refHomGenotypeFreq": 0.14221379, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37331265, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7466253, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.62668735, + "refHomGenotypeFreq": 0.2533747, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18627068, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.37254137, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8137293, + "refHomGenotypeFreq": 0.62745863, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37758136, + "altHomGenotypeFreq": 2.109393E-5, + "hetGenotypeFreq": 0.7551206, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.62241864, + "refHomGenotypeFreq": 0.24485835, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36426258, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.72852516, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6357374, + "refHomGenotypeFreq": 0.27147487, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19452344, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.38904688, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.80547655, + "refHomGenotypeFreq": 0.61095315, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24221453, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.48442906, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.75778544, + "refHomGenotypeFreq": 0.51557094, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30729166, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6145833, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6927083, + "refHomGenotypeFreq": 0.38541666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20777027, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.41554055, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.7922297, + "refHomGenotypeFreq": 0.5844595, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19892474, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39784947, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8010753, + "refHomGenotypeFreq": 0.60215056, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25516528, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.51033056, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7448347, + "refHomGenotypeFreq": 0.4896694, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24015479, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.48030958, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7598452, + "refHomGenotypeFreq": 0.5196904, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.083165325, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16633065, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.91683465, + "refHomGenotypeFreq": 0.83366936, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19908293, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39816585, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.8009171, + "refHomGenotypeFreq": 0.6018342, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1889228, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3778456, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.81107724, + "refHomGenotypeFreq": 0.6221544, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41686752, + "altHomGenotypeFreq": 1.6736962E-5, + "hetGenotypeFreq": 0.83370155, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5831325, + "refHomGenotypeFreq": 0.16628172, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4085779, + "altHomGenotypeFreq": 0.0022573364, + "hetGenotypeFreq": 0.8126411, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.59142214, + "refHomGenotypeFreq": 0.18510158, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.452929, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.905858, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.547071, + "refHomGenotypeFreq": 0.094142005, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4425517, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8851034, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5574483, + "refHomGenotypeFreq": 0.11489662, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4304878, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8609756, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5695122, + "refHomGenotypeFreq": 0.13902439, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44429183, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.88858366, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.55570817, + "refHomGenotypeFreq": 0.11141636, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4156592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8313184, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5843408, + "refHomGenotypeFreq": 0.16868164, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30691016, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6138203, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.69308984, + "refHomGenotypeFreq": 0.38617972, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11423221, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22846442, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8857678, + "refHomGenotypeFreq": 0.7715356, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22473755, + "id": "8477", + "percentageMatch": 0.923502, + "source": "genomicSuperDup", + "start": 22472669 + } + ], + "start": 22473106, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22473106, + "id": "15:22473106:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22473106, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_gene", + "cdnaPosition": 125, + "cdsPosition": 125, + "codon": "gTt/gCt", + "ensemblGeneId": "ENSG00000259261", + "ensemblTranscriptId": "ENST00000557788", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.3257329 + } + ], + "geneName": "IGHV4OR15-8", + "proteinVariantAnnotation": { + "alternate": "ALA", + "position": 42, + "reference": "VAL", + "substitutionScores": [] + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2300000190734863, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -2.0280001163482666, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": -1.2200002670288086, + "source": "cadd_raw" + }, + { + "score": 0, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000557788(ENSG00000259261):c.125T>C", + "ENSP00000473987:p.Val42Ala" + ], + "id": "rs75509601", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.30499917, + "altHomGenotypeFreq": 1.5208894E-5, + "hetGenotypeFreq": 0.6099679, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6950008, + "refHomGenotypeFreq": 0.39001688, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24915484, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.49830967, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.7508452, + "refHomGenotypeFreq": 0.5016903, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3215881, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6431762, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6784119, + "refHomGenotypeFreq": 0.35682383, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32583845, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6516769, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.67416155, + "refHomGenotypeFreq": 0.34832308, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18931496, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.37862992, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.81068504, + "refHomGenotypeFreq": 0.6213701, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38869837, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.77739674, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.61130166, + "refHomGenotypeFreq": 0.22260328, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30815423, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.61630845, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6918458, + "refHomGenotypeFreq": 0.38369152, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.11135676, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22271352, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.88864326, + "refHomGenotypeFreq": 0.77728647, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30971953, + "altHomGenotypeFreq": 2.796186E-5, + "hetGenotypeFreq": 0.61938316, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.69028044, + "refHomGenotypeFreq": 0.3805889, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29936975, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5987395, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.70063025, + "refHomGenotypeFreq": 0.4012605, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19754907, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39509815, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8024509, + "refHomGenotypeFreq": 0.60490185, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24593496, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.49186993, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.75406504, + "refHomGenotypeFreq": 0.5081301, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31619257, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.63238513, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.68380743, + "refHomGenotypeFreq": 0.36761487, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21679688, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.43359375, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.7832031, + "refHomGenotypeFreq": 0.56640625, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17857143, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35714287, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.8214286, + "refHomGenotypeFreq": 0.64285713, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2719101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5438202, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.72808987, + "refHomGenotypeFreq": 0.45617977, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24426916, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.48853832, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7557308, + "refHomGenotypeFreq": 0.5114617, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.082359195, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16471839, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9176408, + "refHomGenotypeFreq": 0.8352816, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20182827, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.40365654, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.79817176, + "refHomGenotypeFreq": 0.59634346, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1922687, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3845374, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.80773133, + "refHomGenotypeFreq": 0.6154626, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39117318, + "altHomGenotypeFreq": 1.7189514E-5, + "hetGenotypeFreq": 0.782312, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6088268, + "refHomGenotypeFreq": 0.21767083, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3926097, + "altHomGenotypeFreq": 0.0023094688, + "hetGenotypeFreq": 0.7806005, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6073903, + "refHomGenotypeFreq": 0.21709007, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4283298, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8566596, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.57167023, + "refHomGenotypeFreq": 0.14334044, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40860084, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8172017, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5913992, + "refHomGenotypeFreq": 0.18279834, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4126067, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8252134, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.58739334, + "refHomGenotypeFreq": 0.17478663, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42554194, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8510839, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.57445806, + "refHomGenotypeFreq": 0.14891611, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3895439, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7790878, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6104561, + "refHomGenotypeFreq": 0.22091219, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27363774, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5472755, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7263623, + "refHomGenotypeFreq": 0.45272455, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.07116105, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1423221, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.92883897, + "refHomGenotypeFreq": 0.8576779, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22473755, + "id": "8477", + "percentageMatch": 0.923502, + "source": "genomicSuperDup", + "start": 22472669 + } + ], + "start": 22473146, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22473146, + "id": "15:22473146:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22473146, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_gene", + "cdnaPosition": 104, + "cdsPosition": 104, + "codon": "gAg/gGg", + "ensemblGeneId": "ENSG00000259261", + "ensemblTranscriptId": "ENST00000557788", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.3257329 + } + ], + "geneName": "IGHV4OR15-8", + "proteinVariantAnnotation": { + "alternate": "GLY", + "position": 35, + "reference": "GLU", + "substitutionScores": [] + }, + "sequenceOntologyTerms": [ + { + "accession": "SO:0001583", + "name": "missense_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "mRNA_end_NF", + "cds_end_NF", + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.180000066757202, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": 0.32100000977516174, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "missense_variant", + "functionalScore": [ + { + "score": 0.5, + "source": "cadd_raw" + }, + { + "score": 7.489999771118164, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000557788(ENSG00000259261):c.104A>G", + "ENSP00000473987:p.Glu35Gly" + ], + "id": "rs201318253", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.1999442, + "altHomGenotypeFreq": 1.6907887E-5, + "hetGenotypeFreq": 0.3998546, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8000558, + "refHomGenotypeFreq": 0.6001285, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14546104, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.29092208, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.854539, + "refHomGenotypeFreq": 0.7090779, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2077517, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4155034, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.7922483, + "refHomGenotypeFreq": 0.58449656, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23318301, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.46636602, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.766817, + "refHomGenotypeFreq": 0.53363395, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.097272724, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19454545, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.90272725, + "refHomGenotypeFreq": 0.80545455, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29930893, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.59861785, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.70069104, + "refHomGenotypeFreq": 0.40138215, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20151986, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.40303972, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.79848015, + "refHomGenotypeFreq": 0.59696025, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.048397504, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09679501, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9516025, + "refHomGenotypeFreq": 0.903205, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20241795, + "altHomGenotypeFreq": 3.1079064E-5, + "hetGenotypeFreq": 0.40477374, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.79758203, + "refHomGenotypeFreq": 0.5951952, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19699273, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39398545, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.80300725, + "refHomGenotypeFreq": 0.60601455, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15560694, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31121388, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8443931, + "refHomGenotypeFreq": 0.68878615, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19573644, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39147288, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.8042636, + "refHomGenotypeFreq": 0.6085271, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28195488, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.56390977, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.7180451, + "refHomGenotypeFreq": 0.43609023, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18604651, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.37209302, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.81395346, + "refHomGenotypeFreq": 0.627907, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15243903, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30487806, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.847561, + "refHomGenotypeFreq": 0.69512194, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21864009, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.43728018, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7813599, + "refHomGenotypeFreq": 0.5627198, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19353603, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.38707206, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.80646396, + "refHomGenotypeFreq": 0.612928, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.061850313, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.123700626, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9381497, + "refHomGenotypeFreq": 0.8762994, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15907182, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31814364, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.8409282, + "refHomGenotypeFreq": 0.68185633, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15136316, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30272633, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.8486368, + "refHomGenotypeFreq": 0.6972737, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34470677, + "altHomGenotypeFreq": 1.7346354E-5, + "hetGenotypeFreq": 0.6893788, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6552932, + "refHomGenotypeFreq": 0.31060383, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36098132, + "altHomGenotypeFreq": 0.0023364485, + "hetGenotypeFreq": 0.71728975, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6390187, + "refHomGenotypeFreq": 0.28037384, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38980407, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.77960813, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.61019593, + "refHomGenotypeFreq": 0.22039187, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36547357, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.73094714, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.63452643, + "refHomGenotypeFreq": 0.26905283, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37715983, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.75431967, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.62284017, + "refHomGenotypeFreq": 0.24568035, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38109562, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.76219124, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.61890435, + "refHomGenotypeFreq": 0.23780873, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3403622, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6807244, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.6596378, + "refHomGenotypeFreq": 0.3192756, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21296097, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.42592195, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.78703904, + "refHomGenotypeFreq": 0.5740781, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.031835206, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06367041, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9681648, + "refHomGenotypeFreq": 0.9363296, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22478119, + "id": "8470", + "percentageMatch": 0.954055, + "source": "genomicSuperDup", + "start": 22434926 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22473755, + "id": "8477", + "percentageMatch": 0.923502, + "source": "genomicSuperDup", + "start": 22472669 + } + ], + "start": 22473167, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22473167, + "id": "15:22473167:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22473167, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_pseudogene", + "ensemblGeneId": "ENSG00000270356", + "ensemblTranscriptId": "ENST00000560037", + "geneName": "IGHV1OR15-4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.5199999809265137, + "source": "gerp" + }, + { + "score": 0.009999999776482582, + "source": "phastCons" + }, + { + "score": -2.365000009536743, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": -0.6999998092651367, + "source": "cadd_raw" + }, + { + "score": 0.07000000029802322, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1973424", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.3682451, + "altHomGenotypeFreq": 0.03294734, + "hetGenotypeFreq": 0.6705955, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6317549, + "refHomGenotypeFreq": 0.29645714, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4076087, + "altHomGenotypeFreq": 0.04347826, + "hetGenotypeFreq": 0.7282609, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.5923913, + "refHomGenotypeFreq": 0.22826087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13618422, + "altHomGenotypeFreq": 0.002631579, + "hetGenotypeFreq": 0.26710525, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.8638158, + "refHomGenotypeFreq": 0.7302632, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3345771, + "altHomGenotypeFreq": 0.02238806, + "hetGenotypeFreq": 0.6243781, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.66542286, + "refHomGenotypeFreq": 0.35323384, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39041096, + "altHomGenotypeFreq": 0.04109589, + "hetGenotypeFreq": 0.69863015, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.60958904, + "refHomGenotypeFreq": 0.26027396, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40231284, + "altHomGenotypeFreq": 0.036518563, + "hetGenotypeFreq": 0.73158854, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.5976872, + "refHomGenotypeFreq": 0.23189288, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41011316, + "altHomGenotypeFreq": 0.040927503, + "hetGenotypeFreq": 0.73837125, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.58988684, + "refHomGenotypeFreq": 0.22070122, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32072118, + "altHomGenotypeFreq": 0.022346368, + "hetGenotypeFreq": 0.5967496, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.67927885, + "refHomGenotypeFreq": 0.38090402, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36206895, + "altHomGenotypeFreq": 0.03336238, + "hetGenotypeFreq": 0.6574132, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.63793105, + "refHomGenotypeFreq": 0.30922446, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37590733, + "altHomGenotypeFreq": 0.032432433, + "hetGenotypeFreq": 0.6869498, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.62409264, + "refHomGenotypeFreq": 0.28061777, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3539326, + "altHomGenotypeFreq": 0.056179777, + "hetGenotypeFreq": 0.5955056, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.64606744, + "refHomGenotypeFreq": 0.3483146, + "study": "MGP" + } + ], + "reference": "T", + "start": 22482721, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22482721, + "id": "15:22482721:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22482721, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_pseudogene", + "cdnaPosition": 326, + "ensemblGeneId": "ENSG00000270356", + "ensemblTranscriptId": "ENST00000560037", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.32786885 + } + ], + "geneName": "IGHV1OR15-4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.9380000233650208, + "source": "gerp" + }, + { + "score": 0.024000000208616257, + "source": "phastCons" + }, + { + "score": -0.39800000190734863, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.23999977111816406, + "source": "cadd_raw" + }, + { + "score": 5.090000152587891, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560037(ENSG00000270356):n.326T>C" + ], + "id": "rs1807224", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.4660484, + "altHomGenotypeFreq": 0.099657886, + "hetGenotypeFreq": 0.73278105, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5339516, + "refHomGenotypeFreq": 0.16756108, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48110738, + "altHomGenotypeFreq": 0.09427609, + "hetGenotypeFreq": 0.77366257, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.51889265, + "refHomGenotypeFreq": 0.13206135, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2849697, + "altHomGenotypeFreq": 0.013818182, + "hetGenotypeFreq": 0.542303, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.7150303, + "refHomGenotypeFreq": 0.4438788, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42312995, + "altHomGenotypeFreq": 0.07516183, + "hetGenotypeFreq": 0.6959362, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5768701, + "refHomGenotypeFreq": 0.22890194, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50937176, + "altHomGenotypeFreq": 0.123377964, + "hetGenotypeFreq": 0.7719876, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.4906282, + "refHomGenotypeFreq": 0.1046344, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47570533, + "altHomGenotypeFreq": 0.085930295, + "hetGenotypeFreq": 0.7795501, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5242947, + "refHomGenotypeFreq": 0.13451964, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50823784, + "altHomGenotypeFreq": 0.13303514, + "hetGenotypeFreq": 0.7504054, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.4917622, + "refHomGenotypeFreq": 0.1165595, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5146724, + "altHomGenotypeFreq": 0.10920541, + "hetGenotypeFreq": 0.81093395, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.4853276, + "refHomGenotypeFreq": 0.07986064, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46662536, + "altHomGenotypeFreq": 0.100537114, + "hetGenotypeFreq": 0.7321765, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.53337467, + "refHomGenotypeFreq": 0.16728641, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46534902, + "altHomGenotypeFreq": 0.09859207, + "hetGenotypeFreq": 0.7335139, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.534651, + "refHomGenotypeFreq": 0.16789405, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49460348, + "altHomGenotypeFreq": 0.11812027, + "hetGenotypeFreq": 0.7529664, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.50539654, + "refHomGenotypeFreq": 0.12891331, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49154335, + "altHomGenotypeFreq": 0.10993657, + "hetGenotypeFreq": 0.7632135, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.50845665, + "refHomGenotypeFreq": 0.12684989, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28833553, + "altHomGenotypeFreq": 0.014416776, + "hetGenotypeFreq": 0.5478375, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.7116645, + "refHomGenotypeFreq": 0.43774575, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45925927, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.6962963, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5407407, + "refHomGenotypeFreq": 0.19259259, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5103448, + "altHomGenotypeFreq": 0.14482759, + "hetGenotypeFreq": 0.73103446, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.48965517, + "refHomGenotypeFreq": 0.12413793, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47810438, + "altHomGenotypeFreq": 0.095380925, + "hetGenotypeFreq": 0.7654469, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.52189565, + "refHomGenotypeFreq": 0.13917217, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5072464, + "altHomGenotypeFreq": 0.13209109, + "hetGenotypeFreq": 0.75031054, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.49275362, + "refHomGenotypeFreq": 0.11759835, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5199099, + "altHomGenotypeFreq": 0.12254088, + "hetGenotypeFreq": 0.7947381, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.48009008, + "refHomGenotypeFreq": 0.082721025, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49326456, + "altHomGenotypeFreq": 0.119781554, + "hetGenotypeFreq": 0.746966, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.50673544, + "refHomGenotypeFreq": 0.13325243, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49625582, + "altHomGenotypeFreq": 0.11607009, + "hetGenotypeFreq": 0.76037145, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5037442, + "refHomGenotypeFreq": 0.123558484, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47362223, + "altHomGenotypeFreq": 0.110221386, + "hetGenotypeFreq": 0.7268017, + "population": "AA", + "refAllele": "A", + "refAlleleFreq": 0.52637774, + "refHomGenotypeFreq": 0.16297692, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48487, + "altHomGenotypeFreq": 0.12592593, + "hetGenotypeFreq": 0.7178881, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.51513004, + "refHomGenotypeFreq": 0.15618597, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4905258, + "altHomGenotypeFreq": 0.13382283, + "hetGenotypeFreq": 0.71340597, + "population": "EA", + "refAllele": "A", + "refAlleleFreq": 0.50947416, + "refHomGenotypeFreq": 0.1527712, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4693137, + "altHomGenotypeFreq": 0.09923968, + "hetGenotypeFreq": 0.74014807, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.53068626, + "refHomGenotypeFreq": 0.16061224, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48552337, + "altHomGenotypeFreq": 0.10244989, + "hetGenotypeFreq": 0.766147, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.5144766, + "refHomGenotypeFreq": 0.13140312, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4160911, + "altHomGenotypeFreq": 0.050890584, + "hetGenotypeFreq": 0.73040104, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.58390886, + "refHomGenotypeFreq": 0.21870835, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29358974, + "altHomGenotypeFreq": 0.013053613, + "hetGenotypeFreq": 0.5610723, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.7064102, + "refHomGenotypeFreq": 0.4258741, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4213483, + "altHomGenotypeFreq": 0.07381158, + "hetGenotypeFreq": 0.6950735, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.57865167, + "refHomGenotypeFreq": 0.23111495, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46899578, + "altHomGenotypeFreq": 0.07955233, + "hetGenotypeFreq": 0.77888685, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.53100425, + "refHomGenotypeFreq": 0.1415608, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5064433, + "altHomGenotypeFreq": 0.1274874, + "hetGenotypeFreq": 0.7579118, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.4935567, + "refHomGenotypeFreq": 0.114600815, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.51514846, + "altHomGenotypeFreq": 0.10675071, + "hetGenotypeFreq": 0.81679547, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.48485157, + "refHomGenotypeFreq": 0.07645384, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.07116105, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.13483146, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.92883897, + "refHomGenotypeFreq": 0.8614232, + "study": "MGP" + } + ], + "reference": "A", + "start": 22482858, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22482858, + "id": "15:22482858:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22482858, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_pseudogene", + "ensemblGeneId": "ENSG00000270356", + "ensemblTranscriptId": "ENST00000560037", + "geneName": "IGHV1OR15-4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.7590000033378601, + "source": "gerp" + }, + { + "score": 0.006000000052154064, + "source": "phastCons" + }, + { + "score": -0.8500000238418579, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 1.0800000429153442, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs753259", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.46433893, + "altHomGenotypeFreq": 0.10244391, + "hetGenotypeFreq": 0.72379005, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5356611, + "refHomGenotypeFreq": 0.17376606, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48128656, + "altHomGenotypeFreq": 0.09980507, + "hetGenotypeFreq": 0.76296294, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.5187135, + "refHomGenotypeFreq": 0.13723198, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27426723, + "altHomGenotypeFreq": 0.013830733, + "hetGenotypeFreq": 0.520873, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.7257328, + "refHomGenotypeFreq": 0.46529627, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42077833, + "altHomGenotypeFreq": 0.0767855, + "hetGenotypeFreq": 0.6879857, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.57922167, + "refHomGenotypeFreq": 0.23522882, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5101561, + "altHomGenotypeFreq": 0.12850118, + "hetGenotypeFreq": 0.76330984, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.4898439, + "refHomGenotypeFreq": 0.10818901, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47639808, + "altHomGenotypeFreq": 0.08909601, + "hetGenotypeFreq": 0.77460414, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.52360195, + "refHomGenotypeFreq": 0.13629986, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5081559, + "altHomGenotypeFreq": 0.13655096, + "hetGenotypeFreq": 0.74320984, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.49184412, + "refHomGenotypeFreq": 0.12023921, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5097161, + "altHomGenotypeFreq": 0.103914, + "hetGenotypeFreq": 0.8116042, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.4902839, + "refHomGenotypeFreq": 0.084481806, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46481338, + "altHomGenotypeFreq": 0.10354809, + "hetGenotypeFreq": 0.7225306, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.53518665, + "refHomGenotypeFreq": 0.17392135, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46376407, + "altHomGenotypeFreq": 0.101106055, + "hetGenotypeFreq": 0.725316, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5362359, + "refHomGenotypeFreq": 0.17357792, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49365568, + "altHomGenotypeFreq": 0.11593428, + "hetGenotypeFreq": 0.75544274, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5063443, + "refHomGenotypeFreq": 0.12862295, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49157894, + "altHomGenotypeFreq": 0.10947368, + "hetGenotypeFreq": 0.7642105, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.50842106, + "refHomGenotypeFreq": 0.12631579, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2888158, + "altHomGenotypeFreq": 0.013157895, + "hetGenotypeFreq": 0.5513158, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.7111842, + "refHomGenotypeFreq": 0.4355263, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4632353, + "altHomGenotypeFreq": 0.1127451, + "hetGenotypeFreq": 0.70098037, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5367647, + "refHomGenotypeFreq": 0.18627451, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5133333, + "altHomGenotypeFreq": 0.14666666, + "hetGenotypeFreq": 0.73333335, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.48666668, + "refHomGenotypeFreq": 0.12, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4784279, + "altHomGenotypeFreq": 0.09456265, + "hetGenotypeFreq": 0.7677305, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5215721, + "refHomGenotypeFreq": 0.13770686, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50726527, + "altHomGenotypeFreq": 0.13159698, + "hetGenotypeFreq": 0.7513365, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.49273476, + "refHomGenotypeFreq": 0.11706648, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.51573676, + "altHomGenotypeFreq": 0.115879826, + "hetGenotypeFreq": 0.79971385, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.48426324, + "refHomGenotypeFreq": 0.084406294, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49159917, + "altHomGenotypeFreq": 0.11652363, + "hetGenotypeFreq": 0.7501511, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.5084008, + "refHomGenotypeFreq": 0.13332528, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4961946, + "altHomGenotypeFreq": 0.11520669, + "hetGenotypeFreq": 0.7619758, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5038054, + "refHomGenotypeFreq": 0.12281749, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5089202, + "altHomGenotypeFreq": 0.12723005, + "hetGenotypeFreq": 0.7633803, + "population": "AA", + "refAllele": "A", + "refAlleleFreq": 0.4910798, + "refHomGenotypeFreq": 0.10938967, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5096607, + "altHomGenotypeFreq": 0.1379202, + "hetGenotypeFreq": 0.743481, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.4903393, + "refHomGenotypeFreq": 0.118598804, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5100331, + "altHomGenotypeFreq": 0.14329556, + "hetGenotypeFreq": 0.73347497, + "population": "EA", + "refAllele": "A", + "refAlleleFreq": 0.48996696, + "refHomGenotypeFreq": 0.12322946, + "study": "ESP6500" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46874273, + "altHomGenotypeFreq": 0.09841053, + "hetGenotypeFreq": 0.74066436, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5312573, + "refHomGenotypeFreq": 0.16092508, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.485426, + "altHomGenotypeFreq": 0.10313901, + "hetGenotypeFreq": 0.764574, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.514574, + "refHomGenotypeFreq": 0.132287, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4155639, + "altHomGenotypeFreq": 0.050989438, + "hetGenotypeFreq": 0.729149, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.58443606, + "refHomGenotypeFreq": 0.2198616, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29187164, + "altHomGenotypeFreq": 0.012415086, + "hetGenotypeFreq": 0.5589131, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.7081284, + "refHomGenotypeFreq": 0.4286718, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4212079, + "altHomGenotypeFreq": 0.07323846, + "hetGenotypeFreq": 0.6959389, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5787921, + "refHomGenotypeFreq": 0.23082264, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46912834, + "altHomGenotypeFreq": 0.07990315, + "hetGenotypeFreq": 0.77845037, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5308717, + "refHomGenotypeFreq": 0.14164649, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5065566, + "altHomGenotypeFreq": 0.12752263, + "hetGenotypeFreq": 0.7580679, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.4934434, + "refHomGenotypeFreq": 0.114409454, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50994056, + "altHomGenotypeFreq": 0.097151056, + "hetGenotypeFreq": 0.825579, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.49005944, + "refHomGenotypeFreq": 0.077269934, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4868914, + "altHomGenotypeFreq": 0.1423221, + "hetGenotypeFreq": 0.6891386, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5131086, + "refHomGenotypeFreq": 0.16853933, + "study": "MGP" + } + ], + "reference": "A", + "start": 22483277, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22483277, + "id": "15:22483277:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22483277, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_pseudogene", + "ensemblGeneId": "ENSG00000270356", + "ensemblTranscriptId": "ENST00000560037", + "geneName": "IGHV1OR15-4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.492000013589859, + "source": "gerp" + }, + { + "score": 0.00800000037997961, + "source": "phastCons" + }, + { + "score": -0.8500000238418579, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.2799997329711914, + "source": "cadd_raw" + }, + { + "score": 0.7699999809265137, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs550604", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.71043175, + "altHomGenotypeFreq": 0.43859398, + "hetGenotypeFreq": 0.54367554, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.28956825, + "refHomGenotypeFreq": 0.017730467, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71590906, + "altHomGenotypeFreq": 0.44597617, + "hetGenotypeFreq": 0.53986585, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.2840909, + "refHomGenotypeFreq": 0.014157973, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5631816, + "altHomGenotypeFreq": 0.1826695, + "hetGenotypeFreq": 0.7610242, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.4368184, + "refHomGenotypeFreq": 0.056306306, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7399627, + "altHomGenotypeFreq": 0.5059291, + "hetGenotypeFreq": 0.46806717, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.26003733, + "refHomGenotypeFreq": 0.026003731, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7145661, + "altHomGenotypeFreq": 0.44669423, + "hetGenotypeFreq": 0.5357438, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.2854339, + "refHomGenotypeFreq": 0.017561983, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.69970065, + "altHomGenotypeFreq": 0.40642098, + "hetGenotypeFreq": 0.5865593, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.30029938, + "refHomGenotypeFreq": 0.0070197172, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7241418, + "altHomGenotypeFreq": 0.45956677, + "hetGenotypeFreq": 0.52914995, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.27585825, + "refHomGenotypeFreq": 0.011283264, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8002503, + "altHomGenotypeFreq": 0.60300314, + "hetGenotypeFreq": 0.3944942, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.19974974, + "refHomGenotypeFreq": 0.0025026344, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70773154, + "altHomGenotypeFreq": 0.43280914, + "hetGenotypeFreq": 0.54984486, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.29226843, + "refHomGenotypeFreq": 0.017345987, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7137229, + "altHomGenotypeFreq": 0.4456449, + "hetGenotypeFreq": 0.536156, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.28627712, + "refHomGenotypeFreq": 0.018199092, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7409294, + "altHomGenotypeFreq": 0.4924385, + "hetGenotypeFreq": 0.4969819, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.25907055, + "refHomGenotypeFreq": 0.0105796065, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7166324, + "altHomGenotypeFreq": 0.44558522, + "hetGenotypeFreq": 0.54209447, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.28336754, + "refHomGenotypeFreq": 0.0123203285, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.57625, + "altHomGenotypeFreq": 0.195, + "hetGenotypeFreq": 0.7625, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.42375, + "refHomGenotypeFreq": 0.0425, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72792363, + "altHomGenotypeFreq": 0.47016707, + "hetGenotypeFreq": 0.5155131, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.27207637, + "refHomGenotypeFreq": 0.014319809, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72333336, + "altHomGenotypeFreq": 0.48666668, + "hetGenotypeFreq": 0.47333333, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.27666667, + "refHomGenotypeFreq": 0.04, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70562893, + "altHomGenotypeFreq": 0.42389432, + "hetGenotypeFreq": 0.5634693, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.29437104, + "refHomGenotypeFreq": 0.012636416, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7347034, + "altHomGenotypeFreq": 0.47944838, + "hetGenotypeFreq": 0.5105101, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.26529655, + "refHomGenotypeFreq": 0.010041505, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.80073714, + "altHomGenotypeFreq": 0.6046994, + "hetGenotypeFreq": 0.39207557, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.19926284, + "refHomGenotypeFreq": 0.0032250634, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.74109554, + "altHomGenotypeFreq": 0.49371105, + "hetGenotypeFreq": 0.494769, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.25890443, + "refHomGenotypeFreq": 0.011519925, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7407246, + "altHomGenotypeFreq": 0.49086955, + "hetGenotypeFreq": 0.49971014, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.25927538, + "refHomGenotypeFreq": 0.00942029, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8270677, + "altHomGenotypeFreq": 0.6574248, + "hetGenotypeFreq": 0.3392857, + "population": "AA", + "refAllele": "T", + "refAlleleFreq": 0.17293233, + "refHomGenotypeFreq": 0.0032894737, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7685418, + "altHomGenotypeFreq": 0.5477687, + "hetGenotypeFreq": 0.4415462, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.2314582, + "refHomGenotypeFreq": 0.010685104, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7391407, + "altHomGenotypeFreq": 0.49268177, + "hetGenotypeFreq": 0.49291784, + "population": "EA", + "refAllele": "T", + "refAlleleFreq": 0.2608593, + "refHomGenotypeFreq": 0.014400378, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7087652, + "altHomGenotypeFreq": 0.43491083, + "hetGenotypeFreq": 0.5477087, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.2912348, + "refHomGenotypeFreq": 0.017380437, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7168539, + "altHomGenotypeFreq": 0.44494382, + "hetGenotypeFreq": 0.5438202, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.28314605, + "refHomGenotypeFreq": 0.011235955, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.66388756, + "altHomGenotypeFreq": 0.35333496, + "hetGenotypeFreq": 0.62110513, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.33611247, + "refHomGenotypeFreq": 0.025559884, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55847955, + "altHomGenotypeFreq": 0.174269, + "hetGenotypeFreq": 0.76842105, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.44152048, + "refHomGenotypeFreq": 0.05730994, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7373957, + "altHomGenotypeFreq": 0.50121695, + "hetGenotypeFreq": 0.47235745, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.26260433, + "refHomGenotypeFreq": 0.02642559, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7011529, + "altHomGenotypeFreq": 0.41140777, + "hetGenotypeFreq": 0.5794903, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.29884708, + "refHomGenotypeFreq": 0.009101942, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72102916, + "altHomGenotypeFreq": 0.4537914, + "hetGenotypeFreq": 0.5344755, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.27897087, + "refHomGenotypeFreq": 0.011733124, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8034688, + "altHomGenotypeFreq": 0.60940063, + "hetGenotypeFreq": 0.3881363, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.19653119, + "refHomGenotypeFreq": 0.0024630541, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.765625, + "altHomGenotypeFreq": 0.578125, + "hetGenotypeFreq": 0.375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.234375, + "refHomGenotypeFreq": 0.046875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7058706, + "altHomGenotypeFreq": 0.44009584, + "hetGenotypeFreq": 0.5315495, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.2941294, + "refHomGenotypeFreq": 0.028354632, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6441718, + "altHomGenotypeFreq": 0.32515338, + "hetGenotypeFreq": 0.63803685, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.35582823, + "refHomGenotypeFreq": 0.036809817, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.80851066, + "altHomGenotypeFreq": 0.63829786, + "hetGenotypeFreq": 0.34042555, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.19148937, + "refHomGenotypeFreq": 0.021276595, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64705884, + "altHomGenotypeFreq": 0.32352942, + "hetGenotypeFreq": 0.64705884, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.3529412, + "refHomGenotypeFreq": 0.029411765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82829046, + "altHomGenotypeFreq": 0.6565809, + "hetGenotypeFreq": 0.34341908, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.17170954, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54761904, + "altHomGenotypeFreq": 0.15238096, + "hetGenotypeFreq": 0.7904762, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.45238096, + "refHomGenotypeFreq": 0.057142857, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.57211536, + "altHomGenotypeFreq": 0.1923077, + "hetGenotypeFreq": 0.7596154, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.4278846, + "refHomGenotypeFreq": 0.048076924, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8518519, + "altHomGenotypeFreq": 0.7037037, + "hetGenotypeFreq": 0.2962963, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.14814815, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6927083, + "altHomGenotypeFreq": 0.42708334, + "hetGenotypeFreq": 0.53125, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.30729166, + "refHomGenotypeFreq": 0.041666668, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8362832, + "altHomGenotypeFreq": 0.67256635, + "hetGenotypeFreq": 0.32743365, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.16371681, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6372549, + "altHomGenotypeFreq": 0.30392158, + "hetGenotypeFreq": 0.6666667, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.3627451, + "refHomGenotypeFreq": 0.029411765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7307692, + "altHomGenotypeFreq": 0.47252747, + "hetGenotypeFreq": 0.51648355, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.26923078, + "refHomGenotypeFreq": 0.010989011, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5268817, + "altHomGenotypeFreq": 0.12903225, + "hetGenotypeFreq": 0.7956989, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.47311828, + "refHomGenotypeFreq": 0.07526882, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.540404, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.7777778, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.45959595, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72897196, + "altHomGenotypeFreq": 0.48598132, + "hetGenotypeFreq": 0.4859813, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.27102804, + "refHomGenotypeFreq": 0.028037382, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6104651, + "altHomGenotypeFreq": 0.26744187, + "hetGenotypeFreq": 0.6860465, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.3895349, + "refHomGenotypeFreq": 0.046511628, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7916667, + "altHomGenotypeFreq": 0.5833333, + "hetGenotypeFreq": 0.4166667, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.20833333, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81313133, + "altHomGenotypeFreq": 0.6262626, + "hetGenotypeFreq": 0.3737374, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.18686868, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8333333, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.33333334, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.16666667, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71570575, + "altHomGenotypeFreq": 0.45129225, + "hetGenotypeFreq": 0.5288271, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.28429425, + "refHomGenotypeFreq": 0.019880716, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8114754, + "altHomGenotypeFreq": 0.6229508, + "hetGenotypeFreq": 0.37704918, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.18852459, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7795389, + "altHomGenotypeFreq": 0.5878962, + "hetGenotypeFreq": 0.38328528, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.2204611, + "refHomGenotypeFreq": 0.028818443, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85294116, + "altHomGenotypeFreq": 0.7058824, + "hetGenotypeFreq": 0.29411766, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.14705883, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.63106793, + "altHomGenotypeFreq": 0.30097088, + "hetGenotypeFreq": 0.66019416, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.36893204, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65656567, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.64646465, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.34343433, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72897196, + "altHomGenotypeFreq": 0.47663552, + "hetGenotypeFreq": 0.5046729, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.27102804, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78365386, + "altHomGenotypeFreq": 0.58653843, + "hetGenotypeFreq": 0.39423078, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.21634616, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7323232, + "altHomGenotypeFreq": 0.4848485, + "hetGenotypeFreq": 0.4949495, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.26767677, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7529412, + "altHomGenotypeFreq": 0.5411765, + "hetGenotypeFreq": 0.42352945, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.24705882, + "refHomGenotypeFreq": 0.03529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54464287, + "altHomGenotypeFreq": 0.15476191, + "hetGenotypeFreq": 0.7797619, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.45535713, + "refHomGenotypeFreq": 0.065476194, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5339806, + "altHomGenotypeFreq": 0.14563107, + "hetGenotypeFreq": 0.77669907, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.46601942, + "refHomGenotypeFreq": 0.0776699, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67228466, + "altHomGenotypeFreq": 0.3857678, + "hetGenotypeFreq": 0.5730337, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.32771537, + "refHomGenotypeFreq": 0.041198503, + "study": "MGP" + } + ], + "reference": "T", + "start": 22483328, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22483328, + "id": "15:22483328:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22483328, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_pseudogene", + "ensemblGeneId": "ENSG00000270356", + "ensemblTranscriptId": "ENST00000560037", + "geneName": "IGHV1OR15-4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.492000013589859, + "source": "gerp" + }, + { + "score": 0.039000000804662704, + "source": "phastCons" + }, + { + "score": 0.23499999940395355, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.06000041961669922, + "source": "cadd_raw" + }, + { + "score": 3.2300000190734863, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs527776", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.27284467, + "altHomGenotypeFreq": 0.019267015, + "hetGenotypeFreq": 0.5071553, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7271553, + "refHomGenotypeFreq": 0.47357765, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31469297, + "altHomGenotypeFreq": 0.021929825, + "hetGenotypeFreq": 0.5855263, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.685307, + "refHomGenotypeFreq": 0.39254385, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3281671, + "altHomGenotypeFreq": 0.04043127, + "hetGenotypeFreq": 0.5754717, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.67183286, + "refHomGenotypeFreq": 0.38409704, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3375, + "altHomGenotypeFreq": 0.045, + "hetGenotypeFreq": 0.585, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6625, + "refHomGenotypeFreq": 0.37, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29225352, + "altHomGenotypeFreq": 0.0070422534, + "hetGenotypeFreq": 0.57042253, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7077465, + "refHomGenotypeFreq": 0.4225352, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32311028, + "altHomGenotypeFreq": 0.026022306, + "hetGenotypeFreq": 0.59417593, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.6768897, + "refHomGenotypeFreq": 0.37980172, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30693427, + "altHomGenotypeFreq": 0.022011222, + "hetGenotypeFreq": 0.5698461, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.69306576, + "refHomGenotypeFreq": 0.40814272, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1716418, + "altHomGenotypeFreq": 0.005472637, + "hetGenotypeFreq": 0.3323383, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.82835823, + "refHomGenotypeFreq": 0.66218907, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26781666, + "altHomGenotypeFreq": 0.018257366, + "hetGenotypeFreq": 0.4991186, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.73218334, + "refHomGenotypeFreq": 0.48262402, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27910075, + "altHomGenotypeFreq": 0.020523265, + "hetGenotypeFreq": 0.51715493, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.7208993, + "refHomGenotypeFreq": 0.4623218, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.041198503, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08239701, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9588015, + "refHomGenotypeFreq": 0.917603, + "study": "MGP" + } + ], + "reference": "A", + "start": 22483512, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22483512, + "id": "15:22483512:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22483512, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "IG_V_pseudogene", + "ensemblGeneId": "ENSG00000270356", + "ensemblTranscriptId": "ENST00000560037", + "geneName": "IGHV1OR15-4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.9829999804496765, + "source": "gerp" + }, + { + "score": 0.01899999938905239, + "source": "phastCons" + }, + { + "score": 0.23499999940395355, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.05000019073486328, + "source": "cadd_raw" + }, + { + "score": 2.130000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs656226", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.281662, + "altHomGenotypeFreq": 0.0200561, + "hetGenotypeFreq": 0.5232118, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.718338, + "refHomGenotypeFreq": 0.45673212, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31758243, + "altHomGenotypeFreq": 0.021978023, + "hetGenotypeFreq": 0.5912088, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6824176, + "refHomGenotypeFreq": 0.3868132, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33175033, + "altHomGenotypeFreq": 0.043419268, + "hetGenotypeFreq": 0.5766621, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.66824967, + "refHomGenotypeFreq": 0.37991858, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33709273, + "altHomGenotypeFreq": 0.042606518, + "hetGenotypeFreq": 0.58897245, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.66290724, + "refHomGenotypeFreq": 0.36842105, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28928572, + "altHomGenotypeFreq": 0.007142857, + "hetGenotypeFreq": 0.5642857, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7107143, + "refHomGenotypeFreq": 0.42857143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3234568, + "altHomGenotypeFreq": 0.025925925, + "hetGenotypeFreq": 0.5950617, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.67654324, + "refHomGenotypeFreq": 0.37901235, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30776978, + "altHomGenotypeFreq": 0.022158273, + "hetGenotypeFreq": 0.571223, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6922302, + "refHomGenotypeFreq": 0.4066187, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19941905, + "altHomGenotypeFreq": 0.007577671, + "hetGenotypeFreq": 0.38368276, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.800581, + "refHomGenotypeFreq": 0.60873955, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27665102, + "altHomGenotypeFreq": 0.019520853, + "hetGenotypeFreq": 0.51426035, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.723349, + "refHomGenotypeFreq": 0.4662188, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2878669, + "altHomGenotypeFreq": 0.020718882, + "hetGenotypeFreq": 0.53429604, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.7121331, + "refHomGenotypeFreq": 0.4449851, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0037453184, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.007490637, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9962547, + "refHomGenotypeFreq": 0.99250937, + "study": "MGP" + } + ], + "reference": "A", + "start": 22483564, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22483564, + "id": "15:22483564:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22483564, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000271507", + "ensemblTranscriptId": "ENST00000605422", + "geneName": "RP11-603B24.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.0399999618530273, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": -0.625, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": -0.5600004196166992, + "source": "cadd_raw" + }, + { + "score": 0.1599999964237213, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs113115466", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.2232279, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4464558, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7767721, + "refHomGenotypeFreq": 0.5535442, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31962025, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6392405, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.68037975, + "refHomGenotypeFreq": 0.3607595, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4144144, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8288288, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5855856, + "refHomGenotypeFreq": 0.17117117, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31203008, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.62406015, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.6879699, + "refHomGenotypeFreq": 0.37593985, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.088, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.176, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.912, + "refHomGenotypeFreq": 0.824, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3952381, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7904762, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.6047619, + "refHomGenotypeFreq": 0.20952381, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1888298, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3776596, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.8111702, + "refHomGenotypeFreq": 0.62234044, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17331626, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3466325, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.82668376, + "refHomGenotypeFreq": 0.6533675, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2004332, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4008664, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.7995668, + "refHomGenotypeFreq": 0.5991336, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25367156, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5073431, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.7463284, + "refHomGenotypeFreq": 0.4926569, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17228465, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3445693, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.82771534, + "refHomGenotypeFreq": 0.65543073, + "study": "MGP" + } + ], + "reference": "T", + "start": 22489900, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22489900, + "id": "15:22489900:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22489900, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000271507", + "ensemblTranscriptId": "ENST00000605422", + "geneName": "RP11-603B24.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.8410000205039978, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -0.6620000004768372, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": -0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 1.0800000429153442, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs111826301", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.29080844, + "altHomGenotypeFreq": 1.5639907E-5, + "hetGenotypeFreq": 0.5816012, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.70918375, + "refHomGenotypeFreq": 0.41838315, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24327958, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.48655915, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7567204, + "refHomGenotypeFreq": 0.51344085, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3352081, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6704162, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6647919, + "refHomGenotypeFreq": 0.3295838, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3301404, + "altHomGenotypeFreq": 1.003009E-4, + "hetGenotypeFreq": 0.66018057, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6698094, + "refHomGenotypeFreq": 0.33971915, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19751693, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39503387, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.8024831, + "refHomGenotypeFreq": 0.60496616, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32824665, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6564933, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.67175335, + "refHomGenotypeFreq": 0.3435067, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28942806, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5788561, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.71057194, + "refHomGenotypeFreq": 0.42114392, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11376127, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22752254, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.88623875, + "refHomGenotypeFreq": 0.77247745, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29453456, + "altHomGenotypeFreq": 2.8810971E-5, + "hetGenotypeFreq": 0.5890115, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.70546544, + "refHomGenotypeFreq": 0.4109597, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28638384, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5728019, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.713599, + "refHomGenotypeFreq": 0.42719808, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2739027, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5478054, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7260973, + "refHomGenotypeFreq": 0.45219457, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36914602, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.73829204, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.630854, + "refHomGenotypeFreq": 0.261708, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4460133, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8920266, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5539867, + "refHomGenotypeFreq": 0.10797342, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36486486, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7297297, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6351351, + "refHomGenotypeFreq": 0.27027026, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10546875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2109375, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.89453125, + "refHomGenotypeFreq": 0.7890625, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43677717, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.87355435, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5632228, + "refHomGenotypeFreq": 0.12644565, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2347286, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4694572, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7652714, + "refHomGenotypeFreq": 0.5305428, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22950819, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.45901638, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7704918, + "refHomGenotypeFreq": 0.5409836, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24805114, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.49610227, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.75194883, + "refHomGenotypeFreq": 0.5038977, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3073663, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6147326, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.6926337, + "refHomGenotypeFreq": 0.3852674, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38740632, + "altHomGenotypeFreq": 1.9020808E-5, + "hetGenotypeFreq": 0.7747746, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.61259365, + "refHomGenotypeFreq": 0.22520638, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37101063, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.74202126, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.62898934, + "refHomGenotypeFreq": 0.25797874, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4244462, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8488924, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.5755538, + "refHomGenotypeFreq": 0.1511076, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4201581, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8403162, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5798419, + "refHomGenotypeFreq": 0.1596838, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41587433, + "altHomGenotypeFreq": 2.0669698E-4, + "hetGenotypeFreq": 0.83133525, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.5841257, + "refHomGenotypeFreq": 0.16845804, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41109556, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8221911, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.58890444, + "refHomGenotypeFreq": 0.1778089, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38348392, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.76696783, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.61651605, + "refHomGenotypeFreq": 0.23303214, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26853198, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.53706396, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.731468, + "refHomGenotypeFreq": 0.46293604, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0078125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.015625, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.9921875, + "refHomGenotypeFreq": 0.984375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 3.9936102E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 7.9872203E-4, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.99960065, + "refHomGenotypeFreq": 0.9992013, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 7.564296E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0015128592, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.99924356, + "refHomGenotypeFreq": 0.9984871, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0014409221, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0028818443, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.99855906, + "refHomGenotypeFreq": 0.9971182, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.101123594, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.20224719, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8988764, + "refHomGenotypeFreq": 0.7977528, + "study": "MGP" + } + ], + "reference": "C", + "start": 22489958, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22489958, + "id": "15:22489958:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22489958, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000271507", + "ensemblTranscriptId": "ENST00000605422", + "geneName": "RP11-603B24.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.6190000176429749, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.2939999997615814, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": -0.06999969482421875, + "source": "cadd_raw" + }, + { + "score": 2.0399999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs72687799", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.28593835, + "altHomGenotypeFreq": 1.5377991E-5, + "hetGenotypeFreq": 0.57184595, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7140616, + "refHomGenotypeFreq": 0.42813864, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23925975, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4785195, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.7607403, + "refHomGenotypeFreq": 0.5214805, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32961392, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.65922785, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6703861, + "refHomGenotypeFreq": 0.34077215, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32628325, + "altHomGenotypeFreq": 9.814506E-5, + "hetGenotypeFreq": 0.6523702, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6737167, + "refHomGenotypeFreq": 0.34753165, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19344915, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3868983, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.80655086, + "refHomGenotypeFreq": 0.6131017, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3220313, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6440626, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.6779687, + "refHomGenotypeFreq": 0.3559374, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28462756, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5692551, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.71537244, + "refHomGenotypeFreq": 0.43074492, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1093547, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2187094, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.8906453, + "refHomGenotypeFreq": 0.7812906, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28960815, + "altHomGenotypeFreq": 2.8231043E-5, + "hetGenotypeFreq": 0.57915986, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.7103918, + "refHomGenotypeFreq": 0.42081192, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28154767, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.56309533, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.71845233, + "refHomGenotypeFreq": 0.43690467, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27641535, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5528307, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.72358465, + "refHomGenotypeFreq": 0.44716933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.369863, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.739726, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.63013697, + "refHomGenotypeFreq": 0.26027396, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44645798, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.89291596, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.553542, + "refHomGenotypeFreq": 0.10708402, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36409396, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7281879, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.63590604, + "refHomGenotypeFreq": 0.27181208, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10546875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2109375, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.89453125, + "refHomGenotypeFreq": 0.7890625, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4370258, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8740516, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5629742, + "refHomGenotypeFreq": 0.1259484, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2367888, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4735776, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7632112, + "refHomGenotypeFreq": 0.52642244, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23496504, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.46993008, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.765035, + "refHomGenotypeFreq": 0.53006995, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2507728, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5015456, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.7492272, + "refHomGenotypeFreq": 0.4984544, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30940545, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6188109, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.69059455, + "refHomGenotypeFreq": 0.3811891, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3829566, + "altHomGenotypeFreq": 1.8899305E-5, + "hetGenotypeFreq": 0.7658754, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6170434, + "refHomGenotypeFreq": 0.23410569, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3723404, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7446808, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.62765956, + "refHomGenotypeFreq": 0.25531915, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4206589, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8413178, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.5793411, + "refHomGenotypeFreq": 0.15868224, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41859853, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.83719707, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.58140147, + "refHomGenotypeFreq": 0.16280295, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40962994, + "altHomGenotypeFreq": 2.0445716E-4, + "hetGenotypeFreq": 0.81885093, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.59037006, + "refHomGenotypeFreq": 0.18094459, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4079776, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8159552, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5920224, + "refHomGenotypeFreq": 0.1840448, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37892538, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.75785077, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6210746, + "refHomGenotypeFreq": 0.24214925, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2624071, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5248142, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7375929, + "refHomGenotypeFreq": 0.4751858, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08239701, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16479401, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.917603, + "refHomGenotypeFreq": 0.835206, + "study": "MGP" + } + ], + "reference": "A", + "start": 22489966, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22489966, + "id": "15:22489966:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 22489966, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000271507", + "ensemblTranscriptId": "ENST00000605422", + "geneName": "RP11-603B24.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.3300000429153442, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": -0.9819999933242798, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": 0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 4.119999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs72687801", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.27712637, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.55425274, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7228736, + "refHomGenotypeFreq": 0.4457473, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22886662, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.45773324, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.77113336, + "refHomGenotypeFreq": 0.5422667, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3244647, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6489294, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6755353, + "refHomGenotypeFreq": 0.35107058, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31995767, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.63991535, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6800423, + "refHomGenotypeFreq": 0.36008468, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1828141, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3656282, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8171859, + "refHomGenotypeFreq": 0.6343718, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30676886, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6135377, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6932311, + "refHomGenotypeFreq": 0.38646224, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27604717, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.55209434, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.72395283, + "refHomGenotypeFreq": 0.44790566, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10674274, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21348548, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.89325726, + "refHomGenotypeFreq": 0.7865145, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27952418, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.55904835, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.72047585, + "refHomGenotypeFreq": 0.44095168, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27425894, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5485179, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.725741, + "refHomGenotypeFreq": 0.4514821, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27513656, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5502731, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7248634, + "refHomGenotypeFreq": 0.44972688, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37265417, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.74530834, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.62734586, + "refHomGenotypeFreq": 0.2546917, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44122383, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.88244766, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.55877614, + "refHomGenotypeFreq": 0.11755233, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36057693, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.72115386, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6394231, + "refHomGenotypeFreq": 0.27884614, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.109848484, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21969697, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8901515, + "refHomGenotypeFreq": 0.780303, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4325886, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8651772, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5674114, + "refHomGenotypeFreq": 0.1348228, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23697744, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4739549, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.76302254, + "refHomGenotypeFreq": 0.52604514, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23492548, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.46985096, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.76507455, + "refHomGenotypeFreq": 0.53014904, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25007573, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.50015146, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.74992424, + "refHomGenotypeFreq": 0.49984854, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30748925, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6149785, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6925108, + "refHomGenotypeFreq": 0.3850215, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36314628, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.72629255, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.63685375, + "refHomGenotypeFreq": 0.27370748, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3505291, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7010582, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.6494709, + "refHomGenotypeFreq": 0.2989418, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4012947, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8025894, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.5987053, + "refHomGenotypeFreq": 0.19741057, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3972858, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7945716, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6027142, + "refHomGenotypeFreq": 0.20542842, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39324686, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7864937, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6067531, + "refHomGenotypeFreq": 0.21350628, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38808855, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7761771, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6119115, + "refHomGenotypeFreq": 0.2238229, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3593167, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7186334, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.6406833, + "refHomGenotypeFreq": 0.2813666, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24080664, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.48161328, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.75919336, + "refHomGenotypeFreq": 0.5183867, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11423221, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22846442, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8857678, + "refHomGenotypeFreq": 0.7715356, + "study": "MGP" + } + ], + "reference": "G", + "start": 22489988, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22489988, + "id": "15:22489988:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22489988, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000271507", + "ensemblTranscriptId": "ENST00000605422", + "geneName": "RP11-603B24.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.6899999976158142, + "source": "gerp" + }, + { + "score": 0.006000000052154064, + "source": "phastCons" + }, + { + "score": 0.42100000381469727, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": -0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 1.7899999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs112521162", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.2826373, + "altHomGenotypeFreq": 1.446529E-5, + "hetGenotypeFreq": 0.5652457, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7173627, + "refHomGenotypeFreq": 0.43473983, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24088944, + "altHomGenotypeFreq": 6.1766524E-4, + "hetGenotypeFreq": 0.48054355, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.75911057, + "refHomGenotypeFreq": 0.51883876, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.33110195, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6622039, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.66889805, + "refHomGenotypeFreq": 0.3377961, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32319266, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6463853, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.67680734, + "refHomGenotypeFreq": 0.3536147, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19149299, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.38298598, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.808507, + "refHomGenotypeFreq": 0.617014, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31527936, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6305587, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.68472064, + "refHomGenotypeFreq": 0.36944127, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28104857, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.56209713, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.7189514, + "refHomGenotypeFreq": 0.43790284, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11349948, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22699896, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.88650054, + "refHomGenotypeFreq": 0.773001, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2852026, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5704052, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.71479744, + "refHomGenotypeFreq": 0.42959484, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27956235, + "altHomGenotypeFreq": 3.1804593E-5, + "hetGenotypeFreq": 0.5590611, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.72043765, + "refHomGenotypeFreq": 0.44090706, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27585185, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5517037, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.72414815, + "refHomGenotypeFreq": 0.4482963, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36614174, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7322835, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.63385826, + "refHomGenotypeFreq": 0.26771653, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4427663, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8855326, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5572337, + "refHomGenotypeFreq": 0.11446741, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3592233, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7184466, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.6407767, + "refHomGenotypeFreq": 0.2815534, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10687023, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21374045, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.89312977, + "refHomGenotypeFreq": 0.78625953, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42879623, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.85759246, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.57120377, + "refHomGenotypeFreq": 0.14240755, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23939393, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.47878787, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.76060605, + "refHomGenotypeFreq": 0.5212121, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.237214, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.474428, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.76278603, + "refHomGenotypeFreq": 0.525572, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25041473, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.50082946, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.7495853, + "refHomGenotypeFreq": 0.49917057, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30849624, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6169925, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.69150376, + "refHomGenotypeFreq": 0.38300756, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15934066, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31868133, + "population": "AA", + "refAllele": "T", + "refAlleleFreq": 0.8406593, + "refHomGenotypeFreq": 0.6813187, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24099499, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.48198998, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.759005, + "refHomGenotypeFreq": 0.51801, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2800191, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5600382, + "population": "EA", + "refAllele": "T", + "refAlleleFreq": 0.7199809, + "refHomGenotypeFreq": 0.4399618, + "study": "ESP6500" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3680869, + "altHomGenotypeFreq": 1.9209712E-5, + "hetGenotypeFreq": 0.73613536, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.63191307, + "refHomGenotypeFreq": 0.2638454, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34880635, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6976127, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6511936, + "refHomGenotypeFreq": 0.30238727, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40444055, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8088811, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.5955595, + "refHomGenotypeFreq": 0.19111891, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40497857, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.80995715, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5950214, + "refHomGenotypeFreq": 0.19004282, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39745972, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.79491943, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.60254025, + "refHomGenotypeFreq": 0.20508054, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39680028, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.79360056, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.6031997, + "refHomGenotypeFreq": 0.20639944, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3638456, + "altHomGenotypeFreq": 3.487115E-5, + "hetGenotypeFreq": 0.72762144, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.6361544, + "refHomGenotypeFreq": 0.2723437, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24772291, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.49544582, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.7522771, + "refHomGenotypeFreq": 0.50455415, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10674157, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21348314, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.89325845, + "refHomGenotypeFreq": 0.78651685, + "study": "MGP" + } + ], + "reference": "T", + "start": 22490019, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22490019, + "id": "15:22490019:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22490019, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000271507", + "ensemblTranscriptId": "ENST00000605422", + "geneName": "RP11-603B24.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.44699999690055847, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.2930000126361847, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": 0.020000457763671875, + "source": "cadd_raw" + }, + { + "score": 2.8499999046325684, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs72687802", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.304632, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6093081, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.69534594, + "refHomGenotypeFreq": 0.39069185, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2566879, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.51401275, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.74299365, + "refHomGenotypeFreq": 0.48598728, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35643566, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7128713, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.64356434, + "refHomGenotypeFreq": 0.28712872, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34227902, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.68455803, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.657721, + "refHomGenotypeFreq": 0.31544194, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21360424, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4279152, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7860424, + "refHomGenotypeFreq": 0.5720848, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3415942, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6831884, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.6584058, + "refHomGenotypeFreq": 0.3168116, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30198675, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6039735, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.69801325, + "refHomGenotypeFreq": 0.3960265, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12803578, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.25607157, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.8719642, + "refHomGenotypeFreq": 0.74392843, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30731475, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.61465657, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.6926717, + "refHomGenotypeFreq": 0.38534343, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30143434, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.60293317, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6985334, + "refHomGenotypeFreq": 0.3970669, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27921528, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.55851513, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7207424, + "refHomGenotypeFreq": 0.44148487, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36939314, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7414248, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6292876, + "refHomGenotypeFreq": 0.2585752, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44670847, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.89341694, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.55329156, + "refHomGenotypeFreq": 0.106583074, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3611111, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7222222, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6388889, + "refHomGenotypeFreq": 0.2777778, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10769231, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21538462, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.8923077, + "refHomGenotypeFreq": 0.7846154, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42930087, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.85860175, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.57069916, + "refHomGenotypeFreq": 0.14139827, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.242033, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.484066, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.757967, + "refHomGenotypeFreq": 0.515934, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24320698, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.48641396, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.756793, + "refHomGenotypeFreq": 0.51358604, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25394678, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.50804394, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.74597806, + "refHomGenotypeFreq": 0.49195608, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3116908, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6233816, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6883092, + "refHomGenotypeFreq": 0.37661836, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38385224, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.767724, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.61613804, + "refHomGenotypeFreq": 0.23227602, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3690476, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7380952, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.63095236, + "refHomGenotypeFreq": 0.26190478, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42162308, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.84324616, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.5783769, + "refHomGenotypeFreq": 0.15675382, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42057082, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.84114164, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5794292, + "refHomGenotypeFreq": 0.15885837, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4149413, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8298826, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5850587, + "refHomGenotypeFreq": 0.1701174, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4131054, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8262108, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5868946, + "refHomGenotypeFreq": 0.17378917, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3789701, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7579755, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6210122, + "refHomGenotypeFreq": 0.24202448, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26256984, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5251397, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.73743016, + "refHomGenotypeFreq": 0.47486034, + "study": "EXAC" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15917604, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31835207, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.84082395, + "refHomGenotypeFreq": 0.68164796, + "study": "MGP" + } + ], + "reference": "A", + "start": 22490035, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22490035, + "id": "15:22490035:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22490035, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "cdnaPosition": 50, + "ensemblGeneId": "ENSG00000259501", + "ensemblTranscriptId": "ENST00000557861", + "exonOverlap": [ + { + "number": "1/2", + "percentage": 0.39370078 + } + ], + "geneName": "RP11-467N20.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.35600000619888306, + "source": "phastCons" + }, + { + "score": 0.06400000303983688, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.010000228881835938, + "source": "cadd_raw" + }, + { + "score": 2.5399999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000557861(ENSG00000259501):n.50G>A" + ], + "id": "rs62008212", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.5124557, + "altHomGenotypeFreq": 0.24025206, + "hetGenotypeFreq": 0.54440725, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4875443, + "refHomGenotypeFreq": 0.21534069, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5355872, + "altHomGenotypeFreq": 0.2597865, + "hetGenotypeFreq": 0.5516014, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.4644128, + "refHomGenotypeFreq": 0.1886121, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8542345, + "altHomGenotypeFreq": 0.71824104, + "hetGenotypeFreq": 0.27198696, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.14576547, + "refHomGenotypeFreq": 0.009771987, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4466192, + "altHomGenotypeFreq": 0.14234875, + "hetGenotypeFreq": 0.60854095, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5533808, + "refHomGenotypeFreq": 0.24911033, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.54950494, + "altHomGenotypeFreq": 0.2970297, + "hetGenotypeFreq": 0.5049505, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.45049506, + "refHomGenotypeFreq": 0.1980198, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6136784, + "altHomGenotypeFreq": 0.35489833, + "hetGenotypeFreq": 0.51756006, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.38632163, + "refHomGenotypeFreq": 0.12754159, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5151183, + "altHomGenotypeFreq": 0.23707274, + "hetGenotypeFreq": 0.5560911, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.48488167, + "refHomGenotypeFreq": 0.2068361, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4124652, + "altHomGenotypeFreq": 0.120630994, + "hetGenotypeFreq": 0.5836684, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5875348, + "refHomGenotypeFreq": 0.29570058, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5137382, + "altHomGenotypeFreq": 0.24483724, + "hetGenotypeFreq": 0.53780186, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.4862618, + "refHomGenotypeFreq": 0.21736087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.51080596, + "altHomGenotypeFreq": 0.2343539, + "hetGenotypeFreq": 0.55290407, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.48919407, + "refHomGenotypeFreq": 0.212742, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7044088, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.29559118, + "study": "GONL" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22647420, + "id": "10646", + "percentageMatch": 0.910781, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22647417, + "id": "10645", + "percentageMatch": 0.911738, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22647418, + "id": "10403", + "percentageMatch": 0.917936, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22647416, + "id": "10355", + "percentageMatch": 0.919665, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22670650, + "id": "10250", + "percentageMatch": 0.946132, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22670650, + "id": "10249", + "percentageMatch": 0.94591, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22670650, + "id": "10248", + "percentageMatch": 0.946204, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22682840, + "id": "9181", + "percentageMatch": 0.992748, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22647417, + "id": "9056", + "percentageMatch": 0.914234, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22647416, + "id": "9055", + "percentageMatch": 0.919854, + "source": "genomicSuperDup", + "start": 22646194 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22647416, + "id": "9054", + "percentageMatch": 0.919854, + "source": "genomicSuperDup", + "start": 22646194 + } + ], + "start": 22646652, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22646652, + "id": "15:22646652:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22646652, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1739, + "ensemblGeneId": "ENSG00000259689", + "ensemblTranscriptId": "ENST00000558695", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.045766592 + } + ], + "geneName": "ABCB10P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.3959999978542328, + "source": "gerp" + }, + { + "score": 0.3540000021457672, + "source": "phastCons" + }, + { + "score": 0.22499999403953552, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.6400003433227539, + "source": "cadd_raw" + }, + { + "score": 8.460000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558695(ENSG00000259689):n.1739T>C" + ], + "id": "rs145557440", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.15782997, + "altHomGenotypeFreq": 5.6254835E-4, + "hetGenotypeFreq": 0.31453484, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.84217006, + "refHomGenotypeFreq": 0.6849026, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20319635, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4063927, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.79680365, + "refHomGenotypeFreq": 0.5936073, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.009339975, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01867995, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.99066, + "refHomGenotypeFreq": 0.98132, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13953489, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.27906978, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.8604651, + "refHomGenotypeFreq": 0.7209302, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17985612, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35971224, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.8201439, + "refHomGenotypeFreq": 0.64028776, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2023731, + "altHomGenotypeFreq": 0.0013183915, + "hetGenotypeFreq": 0.4021094, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7976269, + "refHomGenotypeFreq": 0.59657216, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22993298, + "altHomGenotypeFreq": 8.9352194E-4, + "hetGenotypeFreq": 0.45807892, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.77006704, + "refHomGenotypeFreq": 0.54102755, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.051634297, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10326859, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9483657, + "refHomGenotypeFreq": 0.89673144, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1558887, + "altHomGenotypeFreq": 6.352433E-4, + "hetGenotypeFreq": 0.3105069, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.8441113, + "refHomGenotypeFreq": 0.68885785, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16023622, + "altHomGenotypeFreq": 4.7244094E-4, + "hetGenotypeFreq": 0.31952757, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.83976376, + "refHomGenotypeFreq": 0.68, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24148297, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.758517, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0917603, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.16853933, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9082397, + "refHomGenotypeFreq": 0.82397, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + } + ], + "start": 22691462, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22691462, + "id": "15:22691462:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22691462, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1472, + "ensemblGeneId": "ENSG00000259689", + "ensemblTranscriptId": "ENST00000558695", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.045766592 + } + ], + "geneName": "ABCB10P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.2070000022649765, + "source": "gerp" + }, + { + "score": 0.057999998331069946, + "source": "phastCons" + }, + { + "score": 0.289000004529953, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.06000041961669922, + "source": "cadd_raw" + }, + { + "score": 2.109999895095825, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558695(ENSG00000259689):n.1472C>G" + ], + "id": "rs71469079", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.16734397, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.33468795, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.832656, + "refHomGenotypeFreq": 0.66531205, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19030733, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.38061467, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.8096927, + "refHomGenotypeFreq": 0.61938536, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.009328358, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.018656716, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.99067163, + "refHomGenotypeFreq": 0.98134327, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.117486335, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23497267, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.88251364, + "refHomGenotypeFreq": 0.76502734, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16296296, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.32592592, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.837037, + "refHomGenotypeFreq": 0.67407405, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18022865, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3604573, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.81977135, + "refHomGenotypeFreq": 0.6395427, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21635267, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.43270534, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7836473, + "refHomGenotypeFreq": 0.56729466, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11437659, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22875318, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8856234, + "refHomGenotypeFreq": 0.7712468, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1656361, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3312722, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.8343639, + "refHomGenotypeFreq": 0.6687278, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16944489, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.33888978, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.8305551, + "refHomGenotypeFreq": 0.6611102, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1015625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.203125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.8984375, + "refHomGenotypeFreq": 0.796875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12240415, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24480832, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.87759584, + "refHomGenotypeFreq": 0.7551917, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15337424, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30674845, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.84662575, + "refHomGenotypeFreq": 0.69325155, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13829787, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.27659574, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.86170214, + "refHomGenotypeFreq": 0.7234042, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18137255, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3627451, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.8186275, + "refHomGenotypeFreq": 0.6372549, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12178517, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24357034, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.87821484, + "refHomGenotypeFreq": 0.7564297, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.014285714, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02857143, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.98571426, + "refHomGenotypeFreq": 0.9714286, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.014423077, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.028846154, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.9855769, + "refHomGenotypeFreq": 0.97115386, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11574074, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23148148, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.8842593, + "refHomGenotypeFreq": 0.7685185, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20833333, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.41666666, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.7916667, + "refHomGenotypeFreq": 0.5833333, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.092920355, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18584071, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.90707964, + "refHomGenotypeFreq": 0.8141593, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1764706, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.9117647, + "refHomGenotypeFreq": 0.8235294, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23076923, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.46153846, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.7692308, + "refHomGenotypeFreq": 0.53846157, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.005376344, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010752688, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.99462366, + "refHomGenotypeFreq": 0.9892473, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.015151516, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.030303031, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.9848485, + "refHomGenotypeFreq": 0.969697, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20093457, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.40186918, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.7990654, + "refHomGenotypeFreq": 0.5981308, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13372093, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.26744187, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.86627907, + "refHomGenotypeFreq": 0.73255813, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.114583336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22916667, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.8854167, + "refHomGenotypeFreq": 0.7708333, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17676768, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35353535, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.82323235, + "refHomGenotypeFreq": 0.64646465, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14646465, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2929293, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.85353535, + "refHomGenotypeFreq": 0.7070707, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21073559, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.42147118, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.78926444, + "refHomGenotypeFreq": 0.5785288, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10655738, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21311475, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.89344263, + "refHomGenotypeFreq": 0.78688526, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.113832854, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22766571, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.88616717, + "refHomGenotypeFreq": 0.7723343, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1882353, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.90588236, + "refHomGenotypeFreq": 0.8117647, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1553398, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3106796, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.8446602, + "refHomGenotypeFreq": 0.6893204, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1919192, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3838384, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.8080808, + "refHomGenotypeFreq": 0.61616164, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20560747, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.41121495, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.7943925, + "refHomGenotypeFreq": 0.58878505, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14423077, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.28846157, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.8557692, + "refHomGenotypeFreq": 0.71153843, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22727273, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.45454544, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.77272725, + "refHomGenotypeFreq": 0.54545456, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.05882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11764707, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.9411765, + "refHomGenotypeFreq": 0.88235295, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.010912699, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.021825397, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.9890873, + "refHomGenotypeFreq": 0.9781746, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.004854369, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009708738, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.9951456, + "refHomGenotypeFreq": 0.99029124, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.016853932, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.033707865, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9831461, + "refHomGenotypeFreq": 0.96629214, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + } + ], + "start": 22691729, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22691729, + "id": "15:22691729:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22691729, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1202, + "ensemblGeneId": "ENSG00000259689", + "ensemblTranscriptId": "ENST00000558695", + "exonOverlap": [ + { + "number": "1/1", + "percentage": -1 + } + ], + "geneName": "ABCB10P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.17399999499320984, + "source": "gerp" + }, + { + "score": 0.0689999982714653, + "source": "phastCons" + }, + { + "score": 0.28200000524520874, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558695(ENSG00000259689):n.1202_1203insA" + ], + "id": "rs201034536", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.25703552, + "altHomGenotypeFreq": 0.00589362, + "hetGenotypeFreq": 0.50228375, + "population": "ALL", + "refAllele": "", + "refAlleleFreq": 0.7429645, + "refHomGenotypeFreq": 0.4918226, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33415842, + "altHomGenotypeFreq": 0.004950495, + "hetGenotypeFreq": 0.65841585, + "population": "OTH", + "refAllele": "", + "refAlleleFreq": 0.6658416, + "refHomGenotypeFreq": 0.33663365, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4516129, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9032258, + "population": "EAS", + "refAllele": "", + "refAlleleFreq": 0.5483871, + "refHomGenotypeFreq": 0.09677419, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3642857, + "altHomGenotypeFreq": 0.004761905, + "hetGenotypeFreq": 0.7190476, + "population": "AMR", + "refAllele": "", + "refAlleleFreq": 0.6357143, + "refHomGenotypeFreq": 0.2761905, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1923077, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3846154, + "population": "ASJ", + "refAllele": "", + "refAlleleFreq": 0.8076923, + "refHomGenotypeFreq": 0.61538464, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43668407, + "altHomGenotypeFreq": 0.033942558, + "hetGenotypeFreq": 0.80548304, + "population": "FIN", + "refAllele": "", + "refAlleleFreq": 0.5633159, + "refHomGenotypeFreq": 0.1605744, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24407665, + "altHomGenotypeFreq": 0.0031358886, + "hetGenotypeFreq": 0.48188153, + "population": "NFE", + "refAllele": "", + "refAlleleFreq": 0.75592333, + "refHomGenotypeFreq": 0.5149826, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.159375, + "altHomGenotypeFreq": 0.0013392858, + "hetGenotypeFreq": 0.31607142, + "population": "AFR", + "refAllele": "", + "refAlleleFreq": 0.840625, + "refHomGenotypeFreq": 0.6825893, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25285828, + "altHomGenotypeFreq": 0.0063812817, + "hetGenotypeFreq": 0.49295402, + "population": "MALE", + "refAllele": "", + "refAlleleFreq": 0.7471417, + "refHomGenotypeFreq": 0.5006647, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26222736, + "altHomGenotypeFreq": 0.0052875085, + "hetGenotypeFreq": 0.5138797, + "population": "FEMALE", + "refAllele": "", + "refAlleleFreq": 0.73777264, + "refHomGenotypeFreq": 0.4808328, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + } + ], + "start": 22691999, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22691998, + "id": "15:22691999:-:T", + "length": 1, + "names": [], + "reference": "", + "start": 22691999, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1202, + "ensemblGeneId": "ENSG00000259689", + "ensemblTranscriptId": "ENST00000558695", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.045766592 + } + ], + "geneName": "ABCB10P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.3479999899864197, + "source": "gerp" + }, + { + "score": 0.054999999701976776, + "source": "phastCons" + }, + { + "score": -2.818000078201294, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.4499998092651367, + "source": "cadd_raw" + }, + { + "score": 0.28999999165534973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558695(ENSG00000259689):n.1202T>A" + ], + "id": "rs200037567", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.26871222, + "altHomGenotypeFreq": 0.013482101, + "hetGenotypeFreq": 0.5416086, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7157136, + "refHomGenotypeFreq": 0.44490933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34455958, + "altHomGenotypeFreq": 0.010362694, + "hetGenotypeFreq": 0.6839378, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6476684, + "refHomGenotypeFreq": 0.30569947, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45560747, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9135514, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5432243, + "refHomGenotypeFreq": 0.086448595, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36956522, + "altHomGenotypeFreq": 0.004830918, + "hetGenotypeFreq": 0.7342995, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.62801933, + "refHomGenotypeFreq": 0.26086956, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1985294, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.47058824, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7647059, + "refHomGenotypeFreq": 0.5294118, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42949548, + "altHomGenotypeFreq": 0.03492885, + "hetGenotypeFreq": 0.7968952, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.56662357, + "refHomGenotypeFreq": 0.16817594, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25243947, + "altHomGenotypeFreq": 0.019154318, + "hetGenotypeFreq": 0.5019877, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.72985184, + "refHomGenotypeFreq": 0.47885796, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1745166, + "altHomGenotypeFreq": 0.0019831434, + "hetGenotypeFreq": 0.3882003, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.8039167, + "refHomGenotypeFreq": 0.60981655, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26723164, + "altHomGenotypeFreq": 0.01638418, + "hetGenotypeFreq": 0.5355932, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.7158192, + "refHomGenotypeFreq": 0.4480226, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2705115, + "altHomGenotypeFreq": 0.009955373, + "hetGenotypeFreq": 0.5489186, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.7155853, + "refHomGenotypeFreq": 0.441126, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12172285, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.23970038, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.87265915, + "refHomGenotypeFreq": 0.752809, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + } + ], + "start": 22691999, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22691999, + "id": "15:22691999:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 22691999, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 990, + "ensemblGeneId": "ENSG00000259689", + "ensemblTranscriptId": "ENST00000558695", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.045766592 + } + ], + "geneName": "ABCB10P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.17399999499320984, + "source": "gerp" + }, + { + "score": 0.4269999861717224, + "source": "phastCons" + }, + { + "score": 0.28200000524520874, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.6999998092651367, + "source": "cadd_raw" + }, + { + "score": 8.84000015258789, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558695(ENSG00000259689):n.990C>G" + ], + "id": "rs200274223", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.25247937, + "altHomGenotypeFreq": 0.0024982966, + "hetGenotypeFreq": 0.49996215, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7475206, + "refHomGenotypeFreq": 0.49753955, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21274039, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.42548078, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.78725964, + "refHomGenotypeFreq": 0.5745192, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18147591, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.36295182, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.8185241, + "refHomGenotypeFreq": 0.6370482, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29679143, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.59358287, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.70320857, + "refHomGenotypeFreq": 0.4064171, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22900763, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.45801526, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.77099234, + "refHomGenotypeFreq": 0.54198474, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22037423, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.44074845, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7796258, + "refHomGenotypeFreq": 0.55925155, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21628639, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.43257278, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.78371364, + "refHomGenotypeFreq": 0.5674272, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.33782017, + "altHomGenotypeFreq": 0.008625196, + "hetGenotypeFreq": 0.65839, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.6621798, + "refHomGenotypeFreq": 0.33298483, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25575817, + "altHomGenotypeFreq": 0.0024677818, + "hetGenotypeFreq": 0.50658077, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.74424183, + "refHomGenotypeFreq": 0.49095148, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24843618, + "altHomGenotypeFreq": 0.0025359257, + "hetGenotypeFreq": 0.49180052, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.75156385, + "refHomGenotypeFreq": 0.5056636, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.020599252, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.041198503, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.97940075, + "refHomGenotypeFreq": 0.9588015, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + } + ], + "start": 22692211, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22692211, + "id": "15:22692211:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22692211, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 930, + "ensemblGeneId": "ENSG00000259689", + "ensemblTranscriptId": "ENST00000558695", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.045766592 + } + ], + "geneName": "ABCB10P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.17399999499320984, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": -0.7639999985694885, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 1.2799999713897705, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558695(ENSG00000259689):n.930T>C" + ], + "id": "rs9630501", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.3613212, + "altHomGenotypeFreq": 0.01737178, + "hetGenotypeFreq": 0.6878988, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6386788, + "refHomGenotypeFreq": 0.29472938, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39923954, + "altHomGenotypeFreq": 0.0076045627, + "hetGenotypeFreq": 0.78326994, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.60076046, + "refHomGenotypeFreq": 0.20912547, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47771835, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9554367, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.52228165, + "refHomGenotypeFreq": 0.04456328, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40748033, + "altHomGenotypeFreq": 0.007874016, + "hetGenotypeFreq": 0.7992126, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5925197, + "refHomGenotypeFreq": 0.19291338, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33522728, + "altHomGenotypeFreq": 0.011363637, + "hetGenotypeFreq": 0.64772725, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.66477275, + "refHomGenotypeFreq": 0.3409091, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47384307, + "altHomGenotypeFreq": 0.03420523, + "hetGenotypeFreq": 0.8792757, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.52615696, + "refHomGenotypeFreq": 0.086519115, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35824454, + "altHomGenotypeFreq": 0.028042626, + "hetGenotypeFreq": 0.6604038, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.64175546, + "refHomGenotypeFreq": 0.31155357, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29349416, + "altHomGenotypeFreq": 0.0029239766, + "hetGenotypeFreq": 0.58114034, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.70650584, + "refHomGenotypeFreq": 0.41593567, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36027688, + "altHomGenotypeFreq": 0.019808307, + "hetGenotypeFreq": 0.6809372, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.6397231, + "refHomGenotypeFreq": 0.29925454, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36262277, + "altHomGenotypeFreq": 0.014335015, + "hetGenotypeFreq": 0.6965755, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6373772, + "refHomGenotypeFreq": 0.28908947, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32771537, + "altHomGenotypeFreq": 0.033707865, + "hetGenotypeFreq": 0.58801496, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.67228466, + "refHomGenotypeFreq": 0.37827715, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + } + ], + "start": 22692271, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22692271, + "id": "15:22692271:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22692271, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 688, + "ensemblGeneId": "ENSG00000259689", + "ensemblTranscriptId": "ENST00000558695", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.045766592 + } + ], + "geneName": "ABCB10P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.008999999612569809, + "source": "phastCons" + }, + { + "score": -1.4259999990463257, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 3.5, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000558695(ENSG00000259689):n.688C>G" + ], + "id": "rs9630502", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.41286135, + "altHomGenotypeFreq": 0.01781711, + "hetGenotypeFreq": 0.7900885, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.58713865, + "refHomGenotypeFreq": 0.1920944, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44767442, + "altHomGenotypeFreq": 0.007751938, + "hetGenotypeFreq": 0.87984496, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5523256, + "refHomGenotypeFreq": 0.1124031, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4927302, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9854604, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5072698, + "refHomGenotypeFreq": 0.01453958, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43396226, + "altHomGenotypeFreq": 0.01509434, + "hetGenotypeFreq": 0.83773583, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5660377, + "refHomGenotypeFreq": 0.14716981, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45731708, + "altHomGenotypeFreq": 0.024390243, + "hetGenotypeFreq": 0.86585367, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.54268295, + "refHomGenotypeFreq": 0.1097561, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49228394, + "altHomGenotypeFreq": 0.037037037, + "hetGenotypeFreq": 0.91049385, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.50771606, + "refHomGenotypeFreq": 0.052469134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44478527, + "altHomGenotypeFreq": 0.027607363, + "hetGenotypeFreq": 0.83435583, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5552147, + "refHomGenotypeFreq": 0.1380368, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31656146, + "altHomGenotypeFreq": 0.0029706648, + "hetGenotypeFreq": 0.6271816, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.68343854, + "refHomGenotypeFreq": 0.36984774, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.411614, + "altHomGenotypeFreq": 0.019854825, + "hetGenotypeFreq": 0.7835184, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.588386, + "refHomGenotypeFreq": 0.19662681, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41440254, + "altHomGenotypeFreq": 0.015299393, + "hetGenotypeFreq": 0.79820627, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.58559746, + "refHomGenotypeFreq": 0.18649434, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3258427, + "altHomGenotypeFreq": 0.029962547, + "hetGenotypeFreq": 0.5917603, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6741573, + "refHomGenotypeFreq": 0.37827715, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + } + ], + "start": 22692513, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22692513, + "id": "15:22692513:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22692513, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000185182", + "ensemblTranscriptId": "ENST00000314246", + "geneName": "GOLGA8DP", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000185182", + "ensemblTranscriptId": "ENST00000341390", + "geneName": "GOLGA8DP", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "miRNA", + "ensemblGeneId": "ENSG00000221000", + "ensemblTranscriptId": "ENST00000408073", + "geneName": "AC116165.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "misc_RNA", + "ensemblGeneId": "ENSG00000241034", + "ensemblTranscriptId": "ENST00000495815", + "geneName": "RN7SL545P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.43299999833106995, + "source": "gerp" + }, + { + "score": 0.014999999664723873, + "source": "phastCons" + }, + { + "score": 0.2280000001192093, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.14999961853027344, + "source": "cadd_raw" + }, + { + "score": 1.409999966621399, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000314246(ENSG00000185182):n.1158-69T>C", + "ENST00000341390(ENSG00000185182):n.1151-69T>C" + ], + "id": "rs569464016", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.078125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.921875, + "refHomGenotypeFreq": 0.84375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09185304, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18370607, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.908147, + "refHomGenotypeFreq": 0.81629395, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.11349693, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22699386, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.88650304, + "refHomGenotypeFreq": 0.77300614, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04255319, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08510639, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.9574468, + "refHomGenotypeFreq": 0.9148936, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12254902, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24509805, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.877451, + "refHomGenotypeFreq": 0.75490195, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.06202723, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12405446, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9379728, + "refHomGenotypeFreq": 0.8759455, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.33333334, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17788461, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35576922, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.82211536, + "refHomGenotypeFreq": 0.6442308, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.046296295, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09259259, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.9537037, + "refHomGenotypeFreq": 0.9074074, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.046875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09375, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.953125, + "refHomGenotypeFreq": 0.90625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.092920355, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18584071, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.90707964, + "refHomGenotypeFreq": 0.8141593, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18137255, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3627451, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.8186275, + "refHomGenotypeFreq": 0.6372549, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.06043956, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12087913, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.9395604, + "refHomGenotypeFreq": 0.8791209, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13978495, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2795699, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.86021507, + "refHomGenotypeFreq": 0.72043014, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0959596, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1919192, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.9040404, + "refHomGenotypeFreq": 0.8080808, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.060747664, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12149532, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.9392523, + "refHomGenotypeFreq": 0.8785047, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0872093, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1744186, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.9127907, + "refHomGenotypeFreq": 0.8255814, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.067708336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13541667, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.9322917, + "refHomGenotypeFreq": 0.8645833, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11111111, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.8888889, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11111111, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.8888889, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.06560636, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13121273, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.93439364, + "refHomGenotypeFreq": 0.8687873, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.06557377, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13114753, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.93442625, + "refHomGenotypeFreq": 0.86885244, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.06628242, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13256484, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.9337176, + "refHomGenotypeFreq": 0.86743516, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.047058824, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09411765, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.9529412, + "refHomGenotypeFreq": 0.90588236, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.12135922, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24271844, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.8786408, + "refHomGenotypeFreq": 0.75728154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.116161615, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23232323, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.88383836, + "refHomGenotypeFreq": 0.7676768, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.037383176, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07476635, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.9626168, + "refHomGenotypeFreq": 0.92523366, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09615385, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1923077, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.90384614, + "refHomGenotypeFreq": 0.8076923, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.111111104, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.8888889, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.047058824, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09411765, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.9529412, + "refHomGenotypeFreq": 0.90588236, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15376984, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3075397, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.84623015, + "refHomGenotypeFreq": 0.6924603, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18446602, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.36893204, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.815534, + "refHomGenotypeFreq": 0.63106793, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9187", + "percentageMatch": 0.916494, + "source": "genomicSuperDup", + "start": 22695138 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9186", + "percentageMatch": 0.917518, + "source": "genomicSuperDup", + "start": 22695138 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9188", + "percentageMatch": 0.982065, + "source": "genomicSuperDup", + "start": 22695169 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9189", + "percentageMatch": 0.994907, + "source": "genomicSuperDup", + "start": 22698100 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9141", + "percentageMatch": 0.993724, + "source": "genomicSuperDup", + "start": 22698100 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716492, + "id": "9197", + "percentageMatch": 0.911669, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9195", + "percentageMatch": 0.926178, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9194", + "percentageMatch": 0.924754, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9193", + "percentageMatch": 0.92413, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9192", + "percentageMatch": 0.926202, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9191", + "percentageMatch": 0.924857, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9190", + "percentageMatch": 0.927258, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9200", + "percentageMatch": 0.924196, + "source": "genomicSuperDup", + "start": 22702115 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9199", + "percentageMatch": 0.925817, + "source": "genomicSuperDup", + "start": 22702115 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716615, + "id": "9202", + "percentageMatch": 0.919651, + "source": "genomicSuperDup", + "start": 22705479 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716339, + "id": "9205", + "percentageMatch": 0.908995, + "source": "genomicSuperDup", + "start": 22708635 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716339, + "id": "9204", + "percentageMatch": 0.908601, + "source": "genomicSuperDup", + "start": 22708635 + } + ], + "start": 22709308, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22709308, + "id": "15:22709308:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22709308, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000185182", + "ensemblTranscriptId": "ENST00000314246", + "geneName": "GOLGA8DP", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000185182", + "ensemblTranscriptId": "ENST00000341390", + "geneName": "GOLGA8DP", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "miRNA", + "ensemblGeneId": "ENSG00000221000", + "ensemblTranscriptId": "ENST00000408073", + "geneName": "AC116165.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "misc_RNA", + "ensemblGeneId": "ENSG00000241034", + "ensemblTranscriptId": "ENST00000495815", + "geneName": "RN7SL545P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.5139999985694885, + "source": "gerp" + }, + { + "score": 0.00800000037997961, + "source": "phastCons" + }, + { + "score": -0.8360000252723694, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.3900003433227539, + "source": "cadd_raw" + }, + { + "score": 0.41999998688697815, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000314246(ENSG00000185182):n.1069+65A>G", + "ENST00000341390(ENSG00000185182):n.1062+65A>G" + ], + "id": "rs74829243", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.0850141, + "altHomGenotypeFreq": 0.0118557075, + "hetGenotypeFreq": 0.14631678, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9149859, + "refHomGenotypeFreq": 0.8418275, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08795181, + "altHomGenotypeFreq": 0.009638554, + "hetGenotypeFreq": 0.15662651, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.9120482, + "refHomGenotypeFreq": 0.8337349, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22399445, + "altHomGenotypeFreq": 0.051317614, + "hetGenotypeFreq": 0.34535366, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.77600557, + "refHomGenotypeFreq": 0.6033287, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17914438, + "altHomGenotypeFreq": 0.026737968, + "hetGenotypeFreq": 0.30481285, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.8208556, + "refHomGenotypeFreq": 0.6684492, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.122137405, + "altHomGenotypeFreq": 0.007633588, + "hetGenotypeFreq": 0.22900763, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.8778626, + "refHomGenotypeFreq": 0.7633588, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07832481, + "altHomGenotypeFreq": 0.017902814, + "hetGenotypeFreq": 0.12084399, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.9216752, + "refHomGenotypeFreq": 0.8612532, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09538014, + "altHomGenotypeFreq": 0.012391005, + "hetGenotypeFreq": 0.16597828, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.9046199, + "refHomGenotypeFreq": 0.8216307, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.036421414, + "altHomGenotypeFreq": 7.3331705E-4, + "hetGenotypeFreq": 0.07137619, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9635786, + "refHomGenotypeFreq": 0.9278905, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08642216, + "altHomGenotypeFreq": 0.012615425, + "hetGenotypeFreq": 0.14761348, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.91357785, + "refHomGenotypeFreq": 0.8397711, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08325195, + "altHomGenotypeFreq": 0.010904948, + "hetGenotypeFreq": 0.14469402, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.91674805, + "refHomGenotypeFreq": 0.84440106, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08316633, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.91683364, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.5625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11261981, + "altHomGenotypeFreq": 0.013178914, + "hetGenotypeFreq": 0.19888179, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8873802, + "refHomGenotypeFreq": 0.7879393, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11042945, + "altHomGenotypeFreq": 0.012269938, + "hetGenotypeFreq": 0.19631901, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.88957053, + "refHomGenotypeFreq": 0.79141104, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13829787, + "altHomGenotypeFreq": 0.021276595, + "hetGenotypeFreq": 0.23404256, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.86170214, + "refHomGenotypeFreq": 0.7446808, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1127451, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.20588237, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.8872549, + "refHomGenotypeFreq": 0.78431374, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.019667171, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.039334342, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.98033285, + "refHomGenotypeFreq": 0.96066564, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17619048, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35238096, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.8238095, + "refHomGenotypeFreq": 0.64761907, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20673077, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.27884614, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.7932692, + "refHomGenotypeFreq": 0.65384614, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.018518519, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.037037037, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.9814815, + "refHomGenotypeFreq": 0.962963, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.083333336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16666667, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.9166667, + "refHomGenotypeFreq": 0.8333333, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.026548672, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.053097345, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.9734513, + "refHomGenotypeFreq": 0.94690263, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1127451, + "altHomGenotypeFreq": 0.029411765, + "hetGenotypeFreq": 0.16666667, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.8872549, + "refHomGenotypeFreq": 0.8039216, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10989011, + "altHomGenotypeFreq": 0.010989011, + "hetGenotypeFreq": 0.1978022, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.8901099, + "refHomGenotypeFreq": 0.7912088, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2795699, + "altHomGenotypeFreq": 0.05376344, + "hetGenotypeFreq": 0.45161292, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.72043014, + "refHomGenotypeFreq": 0.49462366, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24242425, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.46464646, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.75757575, + "refHomGenotypeFreq": 0.5252525, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10747664, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.19626167, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.89252335, + "refHomGenotypeFreq": 0.7943925, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12209302, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24418604, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.877907, + "refHomGenotypeFreq": 0.75581396, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.015625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03125, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.984375, + "refHomGenotypeFreq": 0.96875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.01010101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02020202, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.989899, + "refHomGenotypeFreq": 0.97979796, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08648112, + "altHomGenotypeFreq": 0.009940358, + "hetGenotypeFreq": 0.1530815, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.9135189, + "refHomGenotypeFreq": 0.83697814, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.040983606, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.081967205, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.9590164, + "refHomGenotypeFreq": 0.91803277, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18587896, + "altHomGenotypeFreq": 0.023054754, + "hetGenotypeFreq": 0.32564843, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.814121, + "refHomGenotypeFreq": 0.65129685, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.029411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.058823533, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.9705882, + "refHomGenotypeFreq": 0.9411765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12135922, + "altHomGenotypeFreq": 0.019417476, + "hetGenotypeFreq": 0.2038835, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.8786408, + "refHomGenotypeFreq": 0.776699, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.035353534, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07070707, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.96464646, + "refHomGenotypeFreq": 0.9292929, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08411215, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.1495327, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.91588783, + "refHomGenotypeFreq": 0.8411215, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.120192304, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.22115386, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.8798077, + "refHomGenotypeFreq": 0.7692308, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0959596, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.15151516, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.9040404, + "refHomGenotypeFreq": 0.82828283, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27058825, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.5176471, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.7294118, + "refHomGenotypeFreq": 0.47058824, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21230158, + "altHomGenotypeFreq": 0.027777778, + "hetGenotypeFreq": 0.36904764, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.7876984, + "refHomGenotypeFreq": 0.6031746, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16504854, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.3106796, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.83495146, + "refHomGenotypeFreq": 0.6796116, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.086142324, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.16479401, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9138577, + "refHomGenotypeFreq": 0.83146065, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9187", + "percentageMatch": 0.916494, + "source": "genomicSuperDup", + "start": 22695138 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9186", + "percentageMatch": 0.917518, + "source": "genomicSuperDup", + "start": 22695138 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9188", + "percentageMatch": 0.982065, + "source": "genomicSuperDup", + "start": 22695169 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9189", + "percentageMatch": 0.994907, + "source": "genomicSuperDup", + "start": 22698100 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9141", + "percentageMatch": 0.993724, + "source": "genomicSuperDup", + "start": 22698100 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716492, + "id": "9197", + "percentageMatch": 0.911669, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9195", + "percentageMatch": 0.926178, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9194", + "percentageMatch": 0.924754, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9193", + "percentageMatch": 0.92413, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9192", + "percentageMatch": 0.926202, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9191", + "percentageMatch": 0.924857, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9190", + "percentageMatch": 0.927258, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9200", + "percentageMatch": 0.924196, + "source": "genomicSuperDup", + "start": 22702115 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9199", + "percentageMatch": 0.925817, + "source": "genomicSuperDup", + "start": 22702115 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716615, + "id": "9202", + "percentageMatch": 0.919651, + "source": "genomicSuperDup", + "start": 22705479 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716339, + "id": "9205", + "percentageMatch": 0.908995, + "source": "genomicSuperDup", + "start": 22708635 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716339, + "id": "9204", + "percentageMatch": 0.908601, + "source": "genomicSuperDup", + "start": 22708635 + } + ], + "start": 22709847, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22709847, + "id": "15:22709847:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22709847, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000185182", + "ensemblTranscriptId": "ENST00000314246", + "geneName": "GOLGA8DP", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000185182", + "ensemblTranscriptId": "ENST00000341390", + "geneName": "GOLGA8DP", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "misc_RNA", + "ensemblGeneId": "ENSG00000241034", + "ensemblTranscriptId": "ENST00000495815", + "geneName": "RN7SL545P", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.15600000321865082, + "source": "gerp" + }, + { + "score": 0.014000000432133675, + "source": "phastCons" + }, + { + "score": 0.2809999883174896, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.31999969482421875, + "source": "cadd_raw" + }, + { + "score": 0.6100000143051147, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000314246(ENSG00000185182):n.874+20C>G", + "ENST00000341390(ENSG00000185182):n.864+20C>G" + ], + "id": "rs62012070", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.82103527, + "altHomGenotypeFreq": 0.7064978, + "hetGenotypeFreq": 0.24229075, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.17235683, + "refHomGenotypeFreq": 0.051211454, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9052632, + "altHomGenotypeFreq": 0.83157897, + "hetGenotypeFreq": 0.14736842, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.094736844, + "refHomGenotypeFreq": 0.021052632, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91544116, + "altHomGenotypeFreq": 0.8602941, + "hetGenotypeFreq": 0.11764706, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.080882356, + "refHomGenotypeFreq": 0.022058824, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8715596, + "altHomGenotypeFreq": 0.78899086, + "hetGenotypeFreq": 0.17431194, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.123853214, + "refHomGenotypeFreq": 0.036697246, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82857144, + "altHomGenotypeFreq": 0.7714286, + "hetGenotypeFreq": 0.22857143, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.114285715, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9525386, + "altHomGenotypeFreq": 0.9139073, + "hetGenotypeFreq": 0.07726269, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.04746137, + "refHomGenotypeFreq": 0.008830022, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86493695, + "altHomGenotypeFreq": 0.7526673, + "hetGenotypeFreq": 0.22841902, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.13312317, + "refHomGenotypeFreq": 0.018913677, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5707213, + "altHomGenotypeFreq": 0.37340873, + "hetGenotypeFreq": 0.437058, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.40806225, + "refHomGenotypeFreq": 0.18953323, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8204002, + "altHomGenotypeFreq": 0.7066862, + "hetGenotypeFreq": 0.24158126, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.17252319, + "refHomGenotypeFreq": 0.05173255, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8218572, + "altHomGenotypeFreq": 0.70625395, + "hetGenotypeFreq": 0.2432091, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.1721415, + "refHomGenotypeFreq": 0.050536957, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94288576, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.05711423, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8359375, + "altHomGenotypeFreq": 0.734375, + "hetGenotypeFreq": 0.203125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.1640625, + "refHomGenotypeFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7941294, + "altHomGenotypeFreq": 0.6797125, + "hetGenotypeFreq": 0.2296326, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.20547125, + "refHomGenotypeFreq": 0.090654954, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.87525564, + "altHomGenotypeFreq": 0.77300614, + "hetGenotypeFreq": 0.20449898, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.12474438, + "refHomGenotypeFreq": 0.022494888, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89361703, + "altHomGenotypeFreq": 0.78723407, + "hetGenotypeFreq": 0.21276596, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.10638298, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86764705, + "altHomGenotypeFreq": 0.74509805, + "hetGenotypeFreq": 0.24509805, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.13235295, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5249622, + "altHomGenotypeFreq": 0.3343419, + "hetGenotypeFreq": 0.38426626, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.47352496, + "refHomGenotypeFreq": 0.28139183, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9, + "altHomGenotypeFreq": 0.8095238, + "hetGenotypeFreq": 0.18095239, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.1, + "refHomGenotypeFreq": 0.00952381, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88461536, + "altHomGenotypeFreq": 0.77884614, + "hetGenotypeFreq": 0.21153846, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.115384616, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5324074, + "altHomGenotypeFreq": 0.3425926, + "hetGenotypeFreq": 0.3796296, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.4675926, + "refHomGenotypeFreq": 0.2777778, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.859375, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.21875, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.140625, + "refHomGenotypeFreq": 0.03125, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5176991, + "altHomGenotypeFreq": 0.31858408, + "hetGenotypeFreq": 0.39823008, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.48230088, + "refHomGenotypeFreq": 0.28318584, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8872549, + "altHomGenotypeFreq": 0.7941176, + "hetGenotypeFreq": 0.18627451, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.1127451, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9010989, + "altHomGenotypeFreq": 0.8131868, + "hetGenotypeFreq": 0.17582418, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.0989011, + "refHomGenotypeFreq": 0.010989011, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94623655, + "altHomGenotypeFreq": 0.8924731, + "hetGenotypeFreq": 0.10752688, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.05376344, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9141414, + "altHomGenotypeFreq": 0.85858583, + "hetGenotypeFreq": 0.11111111, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.08585858, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8598131, + "altHomGenotypeFreq": 0.74766356, + "hetGenotypeFreq": 0.22429907, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.14018692, + "refHomGenotypeFreq": 0.028037382, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9011628, + "altHomGenotypeFreq": 0.8488372, + "hetGenotypeFreq": 0.10465117, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.09883721, + "refHomGenotypeFreq": 0.046511628, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.59375, + "altHomGenotypeFreq": 0.4270833, + "hetGenotypeFreq": 0.34375, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.40104166, + "refHomGenotypeFreq": 0.22916667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45454547, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.33333334, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.540404, + "refHomGenotypeFreq": 0.37373737, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5151515, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.4242424, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.4848485, + "refHomGenotypeFreq": 0.27272728, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90457255, + "altHomGenotypeFreq": 0.82306165, + "hetGenotypeFreq": 0.16302186, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.09542744, + "refHomGenotypeFreq": 0.013916501, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.59836066, + "altHomGenotypeFreq": 0.36065573, + "hetGenotypeFreq": 0.47540984, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.40163934, + "refHomGenotypeFreq": 0.16393442, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85446686, + "altHomGenotypeFreq": 0.7579251, + "hetGenotypeFreq": 0.19308358, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.14553314, + "refHomGenotypeFreq": 0.048991356, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4882353, + "altHomGenotypeFreq": 0.30588236, + "hetGenotypeFreq": 0.3647059, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.5117647, + "refHomGenotypeFreq": 0.32941177, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8640777, + "altHomGenotypeFreq": 0.7378641, + "hetGenotypeFreq": 0.2524272, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.13592233, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91121495, + "altHomGenotypeFreq": 0.8411215, + "hetGenotypeFreq": 0.14018692, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.088785045, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84615386, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.1923077, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.15384616, + "refHomGenotypeFreq": 0.057692308, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90909094, + "altHomGenotypeFreq": 0.82828283, + "hetGenotypeFreq": 0.16161616, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.09090909, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8352941, + "altHomGenotypeFreq": 0.7529412, + "hetGenotypeFreq": 0.16470589, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.16470589, + "refHomGenotypeFreq": 0.08235294, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9166667, + "altHomGenotypeFreq": 0.8452381, + "hetGenotypeFreq": 0.14285715, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.083333336, + "refHomGenotypeFreq": 0.011904762, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94174755, + "altHomGenotypeFreq": 0.89320385, + "hetGenotypeFreq": 0.097087376, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.058252428, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7153558, + "altHomGenotypeFreq": 0.60674155, + "hetGenotypeFreq": 0.22097379, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.28277153, + "refHomGenotypeFreq": 0.17228465, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9182", + "percentageMatch": 0.993092, + "source": "genomicSuperDup", + "start": 22649544 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9183", + "percentageMatch": 0.99286, + "source": "genomicSuperDup", + "start": 22676835 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9187", + "percentageMatch": 0.916494, + "source": "genomicSuperDup", + "start": 22695138 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9186", + "percentageMatch": 0.917518, + "source": "genomicSuperDup", + "start": 22695138 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9188", + "percentageMatch": 0.982065, + "source": "genomicSuperDup", + "start": 22695169 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9189", + "percentageMatch": 0.994907, + "source": "genomicSuperDup", + "start": 22698100 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22749353, + "id": "9141", + "percentageMatch": 0.993724, + "source": "genomicSuperDup", + "start": 22698100 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716492, + "id": "9197", + "percentageMatch": 0.911669, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9195", + "percentageMatch": 0.926178, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9194", + "percentageMatch": 0.924754, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9193", + "percentageMatch": 0.92413, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9192", + "percentageMatch": 0.926202, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9191", + "percentageMatch": 0.924857, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9190", + "percentageMatch": 0.927258, + "source": "genomicSuperDup", + "start": 22701428 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716605, + "id": "9200", + "percentageMatch": 0.924196, + "source": "genomicSuperDup", + "start": 22702115 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716580, + "id": "9199", + "percentageMatch": 0.925817, + "source": "genomicSuperDup", + "start": 22702115 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716615, + "id": "9202", + "percentageMatch": 0.919651, + "source": "genomicSuperDup", + "start": 22705479 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716339, + "id": "9205", + "percentageMatch": 0.908995, + "source": "genomicSuperDup", + "start": 22708635 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22716339, + "id": "9204", + "percentageMatch": 0.908601, + "source": "genomicSuperDup", + "start": 22708635 + } + ], + "start": 22711216, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22711216, + "id": "15:22711216:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22711216, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259184", + "ensemblTranscriptId": "ENST00000560512", + "geneName": "RP11-566K19.4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -1.61899995803833, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 1.090000033378601, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560026(ENSG00000259596):n.465+152G>C" + ], + "id": "rs150630751", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.22424302, + "altHomGenotypeFreq": 0.062309537, + "hetGenotypeFreq": 0.32386696, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.775757, + "refHomGenotypeFreq": 0.61382353, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2822086, + "altHomGenotypeFreq": 0.08793456, + "hetGenotypeFreq": 0.38854805, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.71779144, + "refHomGenotypeFreq": 0.5235174, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.01236094, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02472188, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.98763907, + "refHomGenotypeFreq": 0.97527814, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24224344, + "altHomGenotypeFreq": 0.045346063, + "hetGenotypeFreq": 0.39379475, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7577566, + "refHomGenotypeFreq": 0.5608592, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29139072, + "altHomGenotypeFreq": 0.08609272, + "hetGenotypeFreq": 0.410596, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7086093, + "refHomGenotypeFreq": 0.5033113, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31731877, + "altHomGenotypeFreq": 0.10356732, + "hetGenotypeFreq": 0.42750287, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.68268126, + "refHomGenotypeFreq": 0.4689298, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2974692, + "altHomGenotypeFreq": 0.08918051, + "hetGenotypeFreq": 0.4165774, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7025308, + "refHomGenotypeFreq": 0.4942421, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.090135664, + "altHomGenotypeFreq": 0.009197516, + "hetGenotypeFreq": 0.16187629, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.90986437, + "refHomGenotypeFreq": 0.8289262, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21516466, + "altHomGenotypeFreq": 0.058361653, + "hetGenotypeFreq": 0.313606, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.78483534, + "refHomGenotypeFreq": 0.6280323, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23548621, + "altHomGenotypeFreq": 0.067198835, + "hetGenotypeFreq": 0.33657473, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7645138, + "refHomGenotypeFreq": 0.5962264, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28657314, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7134268, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2265625, + "altHomGenotypeFreq": 0.046875, + "hetGenotypeFreq": 0.359375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.7734375, + "refHomGenotypeFreq": 0.59375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.13338658, + "altHomGenotypeFreq": 0.030750798, + "hetGenotypeFreq": 0.20527157, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.86661345, + "refHomGenotypeFreq": 0.76397765, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10633947, + "altHomGenotypeFreq": 0.0040899795, + "hetGenotypeFreq": 0.20449898, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.89366055, + "refHomGenotypeFreq": 0.79141104, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2819149, + "altHomGenotypeFreq": 0.07446808, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.7180851, + "refHomGenotypeFreq": 0.5106383, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.068627454, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13725491, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.9313725, + "refHomGenotypeFreq": 0.8627451, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.04462935, + "altHomGenotypeFreq": 0.0030257185, + "hetGenotypeFreq": 0.083207265, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.95537066, + "refHomGenotypeFreq": 0.91376704, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.00952381, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01904762, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.9904762, + "refHomGenotypeFreq": 0.9809524, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.009615385, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01923077, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.99038464, + "refHomGenotypeFreq": 0.9807692, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.027777778, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.055555556, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.9722222, + "refHomGenotypeFreq": 0.9444444, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.1875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.375, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.8125, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.044247787, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.088495575, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.9557522, + "refHomGenotypeFreq": 0.91150445, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.068627454, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13725491, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.9313725, + "refHomGenotypeFreq": 0.8627451, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25824177, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.36263737, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.7417582, + "refHomGenotypeFreq": 0.5604396, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.021505376, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.043010753, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.97849464, + "refHomGenotypeFreq": 0.9569892, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.01010101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02020202, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.989899, + "refHomGenotypeFreq": 0.97979796, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26635513, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.43925232, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.73364484, + "refHomGenotypeFreq": 0.5140187, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.10465116, + "altHomGenotypeFreq": 0.011627907, + "hetGenotypeFreq": 0.18604651, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.89534885, + "refHomGenotypeFreq": 0.8023256, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.057291668, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.114583336, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.9427083, + "refHomGenotypeFreq": 0.8854167, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.025252525, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05050505, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.9747475, + "refHomGenotypeFreq": 0.94949496, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30119285, + "altHomGenotypeFreq": 0.099403575, + "hetGenotypeFreq": 0.40357852, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.6988072, + "refHomGenotypeFreq": 0.4970179, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.09016393, + "altHomGenotypeFreq": 0.016393442, + "hetGenotypeFreq": 0.14754099, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.90983605, + "refHomGenotypeFreq": 0.8360656, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27521613, + "altHomGenotypeFreq": 0.06628242, + "hetGenotypeFreq": 0.41786742, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.72478384, + "refHomGenotypeFreq": 0.5158501, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.0882353, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.15294118, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.9117647, + "refHomGenotypeFreq": 0.8352941, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.106796116, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.19417475, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.89320385, + "refHomGenotypeFreq": 0.79611653, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33838382, + "altHomGenotypeFreq": 0.16161616, + "hetGenotypeFreq": 0.35353535, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.66161615, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34579438, + "altHomGenotypeFreq": 0.10280374, + "hetGenotypeFreq": 0.48598132, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.6542056, + "refHomGenotypeFreq": 0.41121495, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27884614, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.42307693, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.72115386, + "refHomGenotypeFreq": 0.50961536, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2929293, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.36363637, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.7070707, + "refHomGenotypeFreq": 0.5252525, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3, + "altHomGenotypeFreq": 0.07058824, + "hetGenotypeFreq": 0.45882353, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.7, + "refHomGenotypeFreq": 0.47058824, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.010912699, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.021825397, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.9890873, + "refHomGenotypeFreq": 0.9781746, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.004854369, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009708738, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.9951456, + "refHomGenotypeFreq": 0.99029124, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.035580523, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.056179777, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9644195, + "refHomGenotypeFreq": 0.9363296, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9216", + "percentageMatch": 0.939574, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9215", + "percentageMatch": 0.939858, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9214", + "percentageMatch": 0.941327, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9213", + "percentageMatch": 0.939274, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9208", + "percentageMatch": 0.941042, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9144", + "percentageMatch": 0.93695, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754054, + "id": "9218", + "percentageMatch": 0.937374, + "source": "genomicSuperDup", + "start": 22750501 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754054, + "id": "9217", + "percentageMatch": 0.937283, + "source": "genomicSuperDup", + "start": 22750501 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754051, + "id": "10252", + "percentageMatch": 0.926901, + "source": "genomicSuperDup", + "start": 22751258 + } + ], + "start": 22751592, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22751592, + "id": "15:22751592:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22751592, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001575", + "name": "splice_donor_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 211, + "ensemblGeneId": "ENSG00000259184", + "ensemblTranscriptId": "ENST00000560512", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 1.4492754 + } + ], + "geneName": "RP11-566K19.4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.27399998903274536, + "source": "phastCons" + }, + { + "score": -2.0280001163482666, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "splice_donor_variant", + "functionalScore": [ + { + "score": 0.7299995422363281, + "source": "cadd_raw" + }, + { + "score": 9.0600004196167, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560026(ENSG00000259596):n.465+2A>T", + "ENST00000560512(ENSG00000259184):n.211A>T" + ], + "id": "rs7182953", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.46855998, + "altHomGenotypeFreq": 0.23036616, + "hetGenotypeFreq": 0.47638762, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.53144, + "refHomGenotypeFreq": 0.2932462, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45010182, + "altHomGenotypeFreq": 0.20366599, + "hetGenotypeFreq": 0.4928717, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.54989815, + "refHomGenotypeFreq": 0.30346233, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.06674907, + "altHomGenotypeFreq": 0.008652657, + "hetGenotypeFreq": 0.11619283, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.9332509, + "refHomGenotypeFreq": 0.8751545, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.51076555, + "altHomGenotypeFreq": 0.23205742, + "hetGenotypeFreq": 0.55741626, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.48923445, + "refHomGenotypeFreq": 0.21052632, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4437086, + "altHomGenotypeFreq": 0.205298, + "hetGenotypeFreq": 0.47682118, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.5562914, + "refHomGenotypeFreq": 0.3178808, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44988546, + "altHomGenotypeFreq": 0.20274915, + "hetGenotypeFreq": 0.49427262, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.5501146, + "refHomGenotypeFreq": 0.30297825, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4597302, + "altHomGenotypeFreq": 0.21023107, + "hetGenotypeFreq": 0.49899825, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.5402698, + "refHomGenotypeFreq": 0.29077068, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5647383, + "altHomGenotypeFreq": 0.32093665, + "hetGenotypeFreq": 0.4876033, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.4352617, + "refHomGenotypeFreq": 0.19146006, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46148443, + "altHomGenotypeFreq": 0.22453758, + "hetGenotypeFreq": 0.4738937, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.53851557, + "refHomGenotypeFreq": 0.30156872, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.477299, + "altHomGenotypeFreq": 0.23756507, + "hetGenotypeFreq": 0.4794679, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.52270097, + "refHomGenotypeFreq": 0.28296703, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46392787, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.53607213, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.484375, + "altHomGenotypeFreq": 0.265625, + "hetGenotypeFreq": 0.4375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.515625, + "refHomGenotypeFreq": 0.296875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38099042, + "altHomGenotypeFreq": 0.18769968, + "hetGenotypeFreq": 0.38658148, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6190096, + "refHomGenotypeFreq": 0.42571884, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24846625, + "altHomGenotypeFreq": 0.06952965, + "hetGenotypeFreq": 0.3578732, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.75153375, + "refHomGenotypeFreq": 0.57259715, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.55851066, + "altHomGenotypeFreq": 0.30851063, + "hetGenotypeFreq": 0.5, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.44148937, + "refHomGenotypeFreq": 0.19148937, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22058824, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.30392158, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.7794118, + "refHomGenotypeFreq": 0.627451, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.57261723, + "altHomGenotypeFreq": 0.33131617, + "hetGenotypeFreq": 0.48260212, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.42738277, + "refHomGenotypeFreq": 0.1860817, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.052380953, + "altHomGenotypeFreq": 0.00952381, + "hetGenotypeFreq": 0.08571429, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.947619, + "refHomGenotypeFreq": 0.9047619, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.048076924, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.07692308, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.9519231, + "refHomGenotypeFreq": 0.91346157, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6111111, + "altHomGenotypeFreq": 0.3425926, + "hetGenotypeFreq": 0.537037, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.3888889, + "refHomGenotypeFreq": 0.12037037, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.359375, + "altHomGenotypeFreq": 0.13541667, + "hetGenotypeFreq": 0.44791666, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.640625, + "refHomGenotypeFreq": 0.41666666, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48672566, + "altHomGenotypeFreq": 0.2920354, + "hetGenotypeFreq": 0.3893805, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.5132743, + "refHomGenotypeFreq": 0.31858408, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.19607843, + "altHomGenotypeFreq": 0.029411765, + "hetGenotypeFreq": 0.33333334, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.8039216, + "refHomGenotypeFreq": 0.6372549, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45054945, + "altHomGenotypeFreq": 0.21978022, + "hetGenotypeFreq": 0.46153846, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.5494506, + "refHomGenotypeFreq": 0.31868133, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.059139784, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11827957, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.9408602, + "refHomGenotypeFreq": 0.8817204, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0959596, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.15151516, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.9040404, + "refHomGenotypeFreq": 0.82828283, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48598132, + "altHomGenotypeFreq": 0.22429906, + "hetGenotypeFreq": 0.5233645, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.5140187, + "refHomGenotypeFreq": 0.25233644, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24418604, + "altHomGenotypeFreq": 0.058139537, + "hetGenotypeFreq": 0.37209302, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.75581396, + "refHomGenotypeFreq": 0.5697674, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.578125, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.4895833, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.421875, + "refHomGenotypeFreq": 0.17708333, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.57575756, + "altHomGenotypeFreq": 0.3131313, + "hetGenotypeFreq": 0.5252525, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.42424244, + "refHomGenotypeFreq": 0.16161616, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.54545456, + "altHomGenotypeFreq": 0.3131313, + "hetGenotypeFreq": 0.46464646, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.45454547, + "refHomGenotypeFreq": 0.22222222, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47415507, + "altHomGenotypeFreq": 0.23658052, + "hetGenotypeFreq": 0.4751491, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.52584493, + "refHomGenotypeFreq": 0.28827038, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.57377046, + "altHomGenotypeFreq": 0.3442623, + "hetGenotypeFreq": 0.45901638, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.4262295, + "refHomGenotypeFreq": 0.19672132, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5302594, + "altHomGenotypeFreq": 0.27089337, + "hetGenotypeFreq": 0.51873195, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.46974063, + "refHomGenotypeFreq": 0.21037464, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.65882355, + "altHomGenotypeFreq": 0.4, + "hetGenotypeFreq": 0.5176471, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.34117648, + "refHomGenotypeFreq": 0.08235294, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22815534, + "altHomGenotypeFreq": 0.058252428, + "hetGenotypeFreq": 0.3398058, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.7718447, + "refHomGenotypeFreq": 0.60194176, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45959595, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.41414142, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.540404, + "refHomGenotypeFreq": 0.33333334, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50934577, + "altHomGenotypeFreq": 0.24299066, + "hetGenotypeFreq": 0.5327103, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.4906542, + "refHomGenotypeFreq": 0.22429906, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49519232, + "altHomGenotypeFreq": 0.22115384, + "hetGenotypeFreq": 0.5480769, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.5048077, + "refHomGenotypeFreq": 0.23076923, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45959595, + "altHomGenotypeFreq": 0.24242425, + "hetGenotypeFreq": 0.43434343, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.540404, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5764706, + "altHomGenotypeFreq": 0.29411766, + "hetGenotypeFreq": 0.5647059, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.42352942, + "refHomGenotypeFreq": 0.14117648, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0625, + "altHomGenotypeFreq": 0.007936508, + "hetGenotypeFreq": 0.109126985, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.9375, + "refHomGenotypeFreq": 0.88293654, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.058252428, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11650485, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.94174755, + "refHomGenotypeFreq": 0.88349515, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46441948, + "altHomGenotypeFreq": 0.21348314, + "hetGenotypeFreq": 0.50187266, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5355805, + "refHomGenotypeFreq": 0.2846442, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4681301, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5318699, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46530497, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.534695, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46938246, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.53061754, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46682847, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.53317153, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9216", + "percentageMatch": 0.939574, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9215", + "percentageMatch": 0.939858, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9214", + "percentageMatch": 0.941327, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9213", + "percentageMatch": 0.939274, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9208", + "percentageMatch": 0.941042, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9144", + "percentageMatch": 0.93695, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754054, + "id": "9218", + "percentageMatch": 0.937374, + "source": "genomicSuperDup", + "start": 22750501 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754054, + "id": "9217", + "percentageMatch": 0.937283, + "source": "genomicSuperDup", + "start": 22750501 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754051, + "id": "10252", + "percentageMatch": 0.926901, + "source": "genomicSuperDup", + "start": 22751258 + } + ], + "start": 22751742, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22751742, + "id": "15:22751742:T:A", + "length": 1, + "names": [], + "reference": "T", + "start": 22751742, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259184", + "ensemblTranscriptId": "ENST00000560512", + "geneName": "RP11-566K19.4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.019999999552965164, + "source": "phastCons" + }, + { + "score": 0.28200000524520874, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.11999988555908203, + "source": "cadd_raw" + }, + { + "score": 1.6100000143051147, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560026(ENSG00000259596):n.399-57G>A", + "ENST00000560512(ENSG00000259184):n.143-57G>A" + ], + "id": "rs28578689", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.28812572, + "altHomGenotypeFreq": 0.091320656, + "hetGenotypeFreq": 0.39361015, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.71187425, + "refHomGenotypeFreq": 0.5150692, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32244897, + "altHomGenotypeFreq": 0.12040816, + "hetGenotypeFreq": 0.40408164, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.67755103, + "refHomGenotypeFreq": 0.4755102, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.012345679, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.024691358, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.9876543, + "refHomGenotypeFreq": 0.97530866, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27088305, + "altHomGenotypeFreq": 0.06443914, + "hetGenotypeFreq": 0.41288784, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7291169, + "refHomGenotypeFreq": 0.522673, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32119206, + "altHomGenotypeFreq": 0.09933775, + "hetGenotypeFreq": 0.4437086, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.678808, + "refHomGenotypeFreq": 0.45695364, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35738832, + "altHomGenotypeFreq": 0.12829325, + "hetGenotypeFreq": 0.45819014, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6426117, + "refHomGenotypeFreq": 0.4135166, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33544725, + "altHomGenotypeFreq": 0.1141522, + "hetGenotypeFreq": 0.44259012, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.66455275, + "refHomGenotypeFreq": 0.4432577, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22692837, + "altHomGenotypeFreq": 0.053259872, + "hetGenotypeFreq": 0.347337, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.77307165, + "refHomGenotypeFreq": 0.59940314, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28111112, + "altHomGenotypeFreq": 0.086900584, + "hetGenotypeFreq": 0.38842106, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7188889, + "refHomGenotypeFreq": 0.52467835, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29680267, + "altHomGenotypeFreq": 0.0967882, + "hetGenotypeFreq": 0.40002894, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.70319736, + "refHomGenotypeFreq": 0.5031829, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33767536, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.66232467, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2421875, + "altHomGenotypeFreq": 0.078125, + "hetGenotypeFreq": 0.328125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.7578125, + "refHomGenotypeFreq": 0.59375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19309105, + "altHomGenotypeFreq": 0.049920127, + "hetGenotypeFreq": 0.28634185, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.80690897, + "refHomGenotypeFreq": 0.663738, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1206544, + "altHomGenotypeFreq": 0.008179959, + "hetGenotypeFreq": 0.22494888, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.8793456, + "refHomGenotypeFreq": 0.76687115, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32446808, + "altHomGenotypeFreq": 0.11702128, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.6755319, + "refHomGenotypeFreq": 0.4680851, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.083333336, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.14705883, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.9166667, + "refHomGenotypeFreq": 0.84313726, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2118003, + "altHomGenotypeFreq": 0.045385778, + "hetGenotypeFreq": 0.33282906, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7881997, + "refHomGenotypeFreq": 0.62178516, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.023809524, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04761905, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.97619045, + "refHomGenotypeFreq": 0.95238096, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.01923077, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03846154, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.9807692, + "refHomGenotypeFreq": 0.96153843, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24074075, + "altHomGenotypeFreq": 0.046296295, + "hetGenotypeFreq": 0.3888889, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.7592593, + "refHomGenotypeFreq": 0.5648148, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.203125, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.38541666, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.796875, + "refHomGenotypeFreq": 0.6041667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19026549, + "altHomGenotypeFreq": 0.053097345, + "hetGenotypeFreq": 0.27433628, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.8097345, + "refHomGenotypeFreq": 0.67256635, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.083333336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16666667, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.9166667, + "refHomGenotypeFreq": 0.8333333, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31868133, + "altHomGenotypeFreq": 0.10989011, + "hetGenotypeFreq": 0.41758242, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.6813187, + "refHomGenotypeFreq": 0.47252747, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.021505376, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.043010753, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.97849464, + "refHomGenotypeFreq": 0.9569892, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.02020202, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04040404, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.97979796, + "refHomGenotypeFreq": 0.959596, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30373833, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.47663552, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.6962617, + "refHomGenotypeFreq": 0.45794392, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12209302, + "altHomGenotypeFreq": 0.011627907, + "hetGenotypeFreq": 0.22093025, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.877907, + "refHomGenotypeFreq": 0.76744187, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19791667, + "altHomGenotypeFreq": 0.052083332, + "hetGenotypeFreq": 0.2916667, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.8020833, + "refHomGenotypeFreq": 0.65625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21212122, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.34343433, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.7878788, + "refHomGenotypeFreq": 0.61616164, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17676768, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35353535, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.82323235, + "refHomGenotypeFreq": 0.64646465, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33996025, + "altHomGenotypeFreq": 0.12326044, + "hetGenotypeFreq": 0.43339962, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.6600398, + "refHomGenotypeFreq": 0.44333997, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26229507, + "altHomGenotypeFreq": 0.04918033, + "hetGenotypeFreq": 0.4262295, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.73770493, + "refHomGenotypeFreq": 0.52459013, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29971182, + "altHomGenotypeFreq": 0.08357349, + "hetGenotypeFreq": 0.43227667, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7002882, + "refHomGenotypeFreq": 0.48414984, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22352941, + "altHomGenotypeFreq": 0.08235294, + "hetGenotypeFreq": 0.28235295, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.7764706, + "refHomGenotypeFreq": 0.63529414, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.116504855, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.21359223, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.88349515, + "refHomGenotypeFreq": 0.776699, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36868685, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.3939394, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.63131315, + "refHomGenotypeFreq": 0.43434343, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36448598, + "altHomGenotypeFreq": 0.13084112, + "hetGenotypeFreq": 0.46728972, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.635514, + "refHomGenotypeFreq": 0.40186915, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3028846, + "altHomGenotypeFreq": 0.067307696, + "hetGenotypeFreq": 0.47115386, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.69711536, + "refHomGenotypeFreq": 0.46153846, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34343433, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.4040404, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.65656567, + "refHomGenotypeFreq": 0.45454547, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31176472, + "altHomGenotypeFreq": 0.07058824, + "hetGenotypeFreq": 0.48235294, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.6882353, + "refHomGenotypeFreq": 0.44705883, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.018849207, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.037698414, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.9811508, + "refHomGenotypeFreq": 0.9623016, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.009708738, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.019417476, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.99029124, + "refHomGenotypeFreq": 0.98058254, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9216", + "percentageMatch": 0.939574, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9215", + "percentageMatch": 0.939858, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9214", + "percentageMatch": 0.941327, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9213", + "percentageMatch": 0.939274, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9208", + "percentageMatch": 0.941042, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9144", + "percentageMatch": 0.93695, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754054, + "id": "9218", + "percentageMatch": 0.937374, + "source": "genomicSuperDup", + "start": 22750501 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754054, + "id": "9217", + "percentageMatch": 0.937283, + "source": "genomicSuperDup", + "start": 22750501 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754051, + "id": "10252", + "percentageMatch": 0.926901, + "source": "genomicSuperDup", + "start": 22751258 + } + ], + "start": 22751867, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22751867, + "id": "15:22751867:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22751867, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259184", + "ensemblTranscriptId": "ENST00000560512", + "geneName": "RP11-566K19.4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.20499999821186066, + "source": "phastCons" + }, + { + "score": 0.28200000524520874, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.5, + "source": "cadd_raw" + }, + { + "score": 7.480000019073486, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560026(ENSG00000259596):n.399-98C>T", + "ENST00000560512(ENSG00000259184):n.143-98C>T" + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9216", + "percentageMatch": 0.939574, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9215", + "percentageMatch": 0.939858, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9214", + "percentageMatch": 0.941327, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9213", + "percentageMatch": 0.939274, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9208", + "percentageMatch": 0.941042, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22753490, + "id": "9144", + "percentageMatch": 0.93695, + "source": "genomicSuperDup", + "start": 22749930 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754054, + "id": "9218", + "percentageMatch": 0.937374, + "source": "genomicSuperDup", + "start": 22750501 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754054, + "id": "9217", + "percentageMatch": 0.937283, + "source": "genomicSuperDup", + "start": 22750501 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22754051, + "id": "10252", + "percentageMatch": 0.926901, + "source": "genomicSuperDup", + "start": 22751258 + } + ], + "start": 22751908, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22751908, + "id": "15:22751908:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22751908, + "strand": "+", + "studies": [], + "type": "SNV" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.8029999732971191, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -1.128000020980835, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 1.840000033378601, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560026(ENSG00000259596):n.256+7970T>C" + ], + "id": "rs11857798", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.44919297, + "altHomGenotypeFreq": 0.20427367, + "hetGenotypeFreq": 0.4898386, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.55080706, + "refHomGenotypeFreq": 0.30588773, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38090348, + "altHomGenotypeFreq": 0.13963039, + "hetGenotypeFreq": 0.4825462, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6190965, + "refHomGenotypeFreq": 0.3778234, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.455335, + "altHomGenotypeFreq": 0.21091811, + "hetGenotypeFreq": 0.48883376, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.54466504, + "refHomGenotypeFreq": 0.30024815, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34578314, + "altHomGenotypeFreq": 0.12048193, + "hetGenotypeFreq": 0.4506024, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6542169, + "refHomGenotypeFreq": 0.42891565, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36092716, + "altHomGenotypeFreq": 0.1589404, + "hetGenotypeFreq": 0.40397352, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.63907284, + "refHomGenotypeFreq": 0.4370861, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41265234, + "altHomGenotypeFreq": 0.16831109, + "hetGenotypeFreq": 0.48868254, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5873476, + "refHomGenotypeFreq": 0.34300637, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4087033, + "altHomGenotypeFreq": 0.16269626, + "hetGenotypeFreq": 0.49201408, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.5912967, + "refHomGenotypeFreq": 0.34528965, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5522733, + "altHomGenotypeFreq": 0.30510038, + "hetGenotypeFreq": 0.49434572, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.44772676, + "refHomGenotypeFreq": 0.2005539, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45103246, + "altHomGenotypeFreq": 0.20613569, + "hetGenotypeFreq": 0.4897935, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.54896754, + "refHomGenotypeFreq": 0.3040708, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4469098, + "altHomGenotypeFreq": 0.2019625, + "hetGenotypeFreq": 0.48989454, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5530902, + "refHomGenotypeFreq": 0.30814293, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.296875, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.46875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.703125, + "refHomGenotypeFreq": 0.46875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41154152, + "altHomGenotypeFreq": 0.18330671, + "hetGenotypeFreq": 0.45646966, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5884585, + "refHomGenotypeFreq": 0.36022365, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24539877, + "altHomGenotypeFreq": 0.06339468, + "hetGenotypeFreq": 0.3640082, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.75460124, + "refHomGenotypeFreq": 0.57259715, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31914893, + "altHomGenotypeFreq": 0.11702128, + "hetGenotypeFreq": 0.40425533, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.68085104, + "refHomGenotypeFreq": 0.4787234, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24019608, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.4019608, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.75980395, + "refHomGenotypeFreq": 0.5588235, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5650529, + "altHomGenotypeFreq": 0.3192133, + "hetGenotypeFreq": 0.49167925, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.43494704, + "refHomGenotypeFreq": 0.18910742, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46666667, + "altHomGenotypeFreq": 0.20952381, + "hetGenotypeFreq": 0.51428574, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.53333336, + "refHomGenotypeFreq": 0.2761905, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39423078, + "altHomGenotypeFreq": 0.14423077, + "hetGenotypeFreq": 0.5, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.6057692, + "refHomGenotypeFreq": 0.35576922, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5972222, + "altHomGenotypeFreq": 0.3425926, + "hetGenotypeFreq": 0.5092593, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.4027778, + "refHomGenotypeFreq": 0.14814815, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.4166667, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.45833334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5442478, + "altHomGenotypeFreq": 0.30088496, + "hetGenotypeFreq": 0.48672566, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.45575222, + "refHomGenotypeFreq": 0.21238938, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.24509804, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.3529412, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.75490195, + "refHomGenotypeFreq": 0.57843137, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36813188, + "altHomGenotypeFreq": 0.14285715, + "hetGenotypeFreq": 0.45054945, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.6318681, + "refHomGenotypeFreq": 0.4065934, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4784946, + "altHomGenotypeFreq": 0.22580644, + "hetGenotypeFreq": 0.50537634, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.52150536, + "refHomGenotypeFreq": 0.26881722, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44444445, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.5454545, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.5555556, + "refHomGenotypeFreq": 0.28282827, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40186915, + "altHomGenotypeFreq": 0.1682243, + "hetGenotypeFreq": 0.46728975, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.5981308, + "refHomGenotypeFreq": 0.36448598, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22674419, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.3604651, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.7732558, + "refHomGenotypeFreq": 0.59302324, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5572917, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.5104166, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.44270834, + "refHomGenotypeFreq": 0.1875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6010101, + "altHomGenotypeFreq": 0.37373737, + "hetGenotypeFreq": 0.45454547, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.3989899, + "refHomGenotypeFreq": 0.17171717, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.56060606, + "altHomGenotypeFreq": 0.3131313, + "hetGenotypeFreq": 0.4949495, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.43939394, + "refHomGenotypeFreq": 0.1919192, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39662027, + "altHomGenotypeFreq": 0.16898608, + "hetGenotypeFreq": 0.45526838, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.6033797, + "refHomGenotypeFreq": 0.37574553, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55737704, + "altHomGenotypeFreq": 0.32786885, + "hetGenotypeFreq": 0.45901638, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.44262296, + "refHomGenotypeFreq": 0.21311475, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3184438, + "altHomGenotypeFreq": 0.095100865, + "hetGenotypeFreq": 0.44668588, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6815562, + "refHomGenotypeFreq": 0.45821327, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5294118, + "altHomGenotypeFreq": 0.27058825, + "hetGenotypeFreq": 0.5176471, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.47058824, + "refHomGenotypeFreq": 0.21176471, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18446602, + "altHomGenotypeFreq": 0.03883495, + "hetGenotypeFreq": 0.29126212, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.815534, + "refHomGenotypeFreq": 0.6699029, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.47474748, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.3838384, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42523363, + "altHomGenotypeFreq": 0.21495327, + "hetGenotypeFreq": 0.42056075, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.57476634, + "refHomGenotypeFreq": 0.36448598, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4278846, + "altHomGenotypeFreq": 0.15384616, + "hetGenotypeFreq": 0.5480769, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.57211536, + "refHomGenotypeFreq": 0.29807693, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4040404, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.46464646, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.5959596, + "refHomGenotypeFreq": 0.36363637, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.3529412, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.8, + "refHomGenotypeFreq": 0.62352943, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45039684, + "altHomGenotypeFreq": 0.19642857, + "hetGenotypeFreq": 0.5079365, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.54960316, + "refHomGenotypeFreq": 0.29563493, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47087377, + "altHomGenotypeFreq": 0.23300971, + "hetGenotypeFreq": 0.47572815, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.5291262, + "refHomGenotypeFreq": 0.29126215, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22772747, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22772747, + "id": "15:22772747:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22772747, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.9710000157356262, + "source": "gerp" + }, + { + "score": 0.07500000298023224, + "source": "phastCons" + }, + { + "score": -0.8130000233650208, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 4.130000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560026(ENSG00000259596):n.256+3037C>T" + ], + "id": "rs3890107", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.71229684, + "altHomGenotypeFreq": 0.51155865, + "hetGenotypeFreq": 0.40147638, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.28770316, + "refHomGenotypeFreq": 0.086964965, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.66290987, + "altHomGenotypeFreq": 0.4487705, + "hetGenotypeFreq": 0.42827868, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.33709016, + "refHomGenotypeFreq": 0.12295082, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5043478, + "altHomGenotypeFreq": 0.25590062, + "hetGenotypeFreq": 0.49689442, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.49565217, + "refHomGenotypeFreq": 0.24720497, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5119617, + "altHomGenotypeFreq": 0.24880382, + "hetGenotypeFreq": 0.5263158, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.48803827, + "refHomGenotypeFreq": 0.22488038, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.66887414, + "altHomGenotypeFreq": 0.4437086, + "hetGenotypeFreq": 0.45033112, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.33112583, + "refHomGenotypeFreq": 0.105960265, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.70916903, + "altHomGenotypeFreq": 0.5008596, + "hetGenotypeFreq": 0.4166189, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.29083094, + "refHomGenotypeFreq": 0.08252149, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.70543826, + "altHomGenotypeFreq": 0.49599144, + "hetGenotypeFreq": 0.41889364, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.29456174, + "refHomGenotypeFreq": 0.08511491, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7900965, + "altHomGenotypeFreq": 0.62454045, + "hetGenotypeFreq": 0.33111215, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.2099035, + "refHomGenotypeFreq": 0.044347428, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.71119833, + "altHomGenotypeFreq": 0.5093124, + "hetGenotypeFreq": 0.40377182, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.2888017, + "refHomGenotypeFreq": 0.086915776, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7136548, + "altHomGenotypeFreq": 0.51433533, + "hetGenotypeFreq": 0.39863887, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.2863452, + "refHomGenotypeFreq": 0.08702578, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.68937874, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.31062123, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4765625, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.5234375, + "refHomGenotypeFreq": 0.296875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6070288, + "altHomGenotypeFreq": 0.39696485, + "hetGenotypeFreq": 0.4201278, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.39297125, + "refHomGenotypeFreq": 0.18290734, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.396728, + "altHomGenotypeFreq": 0.15337424, + "hetGenotypeFreq": 0.48670757, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.60327196, + "refHomGenotypeFreq": 0.3599182, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5638298, + "altHomGenotypeFreq": 0.3617021, + "hetGenotypeFreq": 0.40425533, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.43617022, + "refHomGenotypeFreq": 0.23404256, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4117647, + "altHomGenotypeFreq": 0.13725491, + "hetGenotypeFreq": 0.54901963, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.5882353, + "refHomGenotypeFreq": 0.3137255, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.82072616, + "altHomGenotypeFreq": 0.67473525, + "hetGenotypeFreq": 0.29198185, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.17927383, + "refHomGenotypeFreq": 0.033282906, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53809524, + "altHomGenotypeFreq": 0.2761905, + "hetGenotypeFreq": 0.52380955, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.46190476, + "refHomGenotypeFreq": 0.2, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45192307, + "altHomGenotypeFreq": 0.1826923, + "hetGenotypeFreq": 0.53846157, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.5480769, + "refHomGenotypeFreq": 0.27884614, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8611111, + "altHomGenotypeFreq": 0.7314815, + "hetGenotypeFreq": 0.25925928, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.1388889, + "refHomGenotypeFreq": 0.009259259, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48958334, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.4791667, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.5104167, + "refHomGenotypeFreq": 0.27083334, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8318584, + "altHomGenotypeFreq": 0.6814159, + "hetGenotypeFreq": 0.30088496, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.16814159, + "refHomGenotypeFreq": 0.017699115, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37745097, + "altHomGenotypeFreq": 0.13725491, + "hetGenotypeFreq": 0.48039216, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.622549, + "refHomGenotypeFreq": 0.38235295, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7087912, + "altHomGenotypeFreq": 0.4945055, + "hetGenotypeFreq": 0.42857146, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.2912088, + "refHomGenotypeFreq": 0.07692308, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48924732, + "altHomGenotypeFreq": 0.22580644, + "hetGenotypeFreq": 0.5268817, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.5107527, + "refHomGenotypeFreq": 0.24731183, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45959595, + "altHomGenotypeFreq": 0.1919192, + "hetGenotypeFreq": 0.53535354, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.540404, + "refHomGenotypeFreq": 0.27272728, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.682243, + "altHomGenotypeFreq": 0.46728972, + "hetGenotypeFreq": 0.42990655, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.317757, + "refHomGenotypeFreq": 0.10280374, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30813953, + "altHomGenotypeFreq": 0.08139535, + "hetGenotypeFreq": 0.45348835, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.69186044, + "refHomGenotypeFreq": 0.4651163, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7916667, + "altHomGenotypeFreq": 0.6354167, + "hetGenotypeFreq": 0.3125, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.20833333, + "refHomGenotypeFreq": 0.052083332, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.83838385, + "altHomGenotypeFreq": 0.6969697, + "hetGenotypeFreq": 0.28282827, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.16161616, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7979798, + "altHomGenotypeFreq": 0.64646465, + "hetGenotypeFreq": 0.3030303, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.2020202, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7127237, + "altHomGenotypeFreq": 0.50695825, + "hetGenotypeFreq": 0.41153082, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.28727633, + "refHomGenotypeFreq": 0.08151093, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8032787, + "altHomGenotypeFreq": 0.6557377, + "hetGenotypeFreq": 0.29508197, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.19672132, + "refHomGenotypeFreq": 0.04918033, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50864553, + "altHomGenotypeFreq": 0.2910663, + "hetGenotypeFreq": 0.4351585, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.49135447, + "refHomGenotypeFreq": 0.27377522, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.80588233, + "altHomGenotypeFreq": 0.65882355, + "hetGenotypeFreq": 0.29411766, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.19411765, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3883495, + "altHomGenotypeFreq": 0.1553398, + "hetGenotypeFreq": 0.4660194, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.61165047, + "refHomGenotypeFreq": 0.37864077, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7323232, + "altHomGenotypeFreq": 0.54545456, + "hetGenotypeFreq": 0.37373737, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.26767677, + "refHomGenotypeFreq": 0.08080808, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7196262, + "altHomGenotypeFreq": 0.5233645, + "hetGenotypeFreq": 0.39252335, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.28037384, + "refHomGenotypeFreq": 0.08411215, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6682692, + "altHomGenotypeFreq": 0.44230768, + "hetGenotypeFreq": 0.45192307, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.33173078, + "refHomGenotypeFreq": 0.10576923, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7222222, + "altHomGenotypeFreq": 0.5050505, + "hetGenotypeFreq": 0.43434346, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.2777778, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2764706, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.43529412, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.7235294, + "refHomGenotypeFreq": 0.5058824, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49305555, + "altHomGenotypeFreq": 0.23214285, + "hetGenotypeFreq": 0.52182543, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5069444, + "refHomGenotypeFreq": 0.24603175, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52427185, + "altHomGenotypeFreq": 0.2815534, + "hetGenotypeFreq": 0.4854369, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.47572815, + "refHomGenotypeFreq": 0.23300971, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.68164796, + "altHomGenotypeFreq": 0.46441948, + "hetGenotypeFreq": 0.4344569, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.31835207, + "refHomGenotypeFreq": 0.101123594, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.68751657, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.31248346, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6863458, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.31365415, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6886352, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.31136483, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6863538, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.31364617, + "study": "UK10K" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22777680, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22777680, + "id": "15:22777680:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22777680, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.007600000128149986, + "source": "gerp" + }, + { + "score": 0.007000000216066837, + "source": "phastCons" + }, + { + "score": -0.5600000023841858, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.15999984741210938, + "source": "cadd_raw" + }, + { + "score": 1.3700000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560026(ENSG00000259596):n.256+2842T>C", + "ENST00000559072(ENSG00000259400):n.678-93T>C" + ], + "id": "rs4405519", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.4483965, + "altHomGenotypeFreq": 0.20518303, + "hetGenotypeFreq": 0.48642695, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5516035, + "refHomGenotypeFreq": 0.30839002, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38934427, + "altHomGenotypeFreq": 0.14139344, + "hetGenotypeFreq": 0.49590164, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6106557, + "refHomGenotypeFreq": 0.36270493, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.19727047, + "hetGenotypeFreq": 0.49007446, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.3126551, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34254807, + "altHomGenotypeFreq": 0.115384616, + "hetGenotypeFreq": 0.45432693, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6574519, + "refHomGenotypeFreq": 0.43028846, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38410595, + "altHomGenotypeFreq": 0.17880794, + "hetGenotypeFreq": 0.410596, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.615894, + "refHomGenotypeFreq": 0.410596, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40286532, + "altHomGenotypeFreq": 0.16217765, + "hetGenotypeFreq": 0.48137537, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.59713465, + "refHomGenotypeFreq": 0.35644698, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3984093, + "altHomGenotypeFreq": 0.1554605, + "hetGenotypeFreq": 0.4858976, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6015907, + "refHomGenotypeFreq": 0.3586419, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5727921, + "altHomGenotypeFreq": 0.32612696, + "hetGenotypeFreq": 0.49333027, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.42720792, + "refHomGenotypeFreq": 0.18054278, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4521576, + "altHomGenotypeFreq": 0.20954503, + "hetGenotypeFreq": 0.48522514, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.5478424, + "refHomGenotypeFreq": 0.30522984, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4437527, + "altHomGenotypeFreq": 0.1997973, + "hetGenotypeFreq": 0.4879108, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5562473, + "refHomGenotypeFreq": 0.3122919, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41082165, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5891783, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3203125, + "altHomGenotypeFreq": 0.078125, + "hetGenotypeFreq": 0.484375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.6796875, + "refHomGenotypeFreq": 0.4375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41853034, + "altHomGenotypeFreq": 0.18849841, + "hetGenotypeFreq": 0.46006387, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.58146966, + "refHomGenotypeFreq": 0.3514377, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26687115, + "altHomGenotypeFreq": 0.06748466, + "hetGenotypeFreq": 0.398773, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.73312885, + "refHomGenotypeFreq": 0.5337423, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32446808, + "altHomGenotypeFreq": 0.11702128, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.6755319, + "refHomGenotypeFreq": 0.4680851, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2647059, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.4509804, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.7352941, + "refHomGenotypeFreq": 0.50980395, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.580938, + "altHomGenotypeFreq": 0.33585477, + "hetGenotypeFreq": 0.49016643, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.41906202, + "refHomGenotypeFreq": 0.17397882, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46190476, + "altHomGenotypeFreq": 0.20952381, + "hetGenotypeFreq": 0.50476193, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.53809524, + "refHomGenotypeFreq": 0.2857143, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38942307, + "altHomGenotypeFreq": 0.13461539, + "hetGenotypeFreq": 0.5096154, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.6105769, + "refHomGenotypeFreq": 0.35576922, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5833333, + "altHomGenotypeFreq": 0.37962964, + "hetGenotypeFreq": 0.4074074, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.41666666, + "refHomGenotypeFreq": 0.21296297, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34375, + "altHomGenotypeFreq": 0.13541667, + "hetGenotypeFreq": 0.4166667, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.65625, + "refHomGenotypeFreq": 0.44791666, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.63716817, + "altHomGenotypeFreq": 0.39823008, + "hetGenotypeFreq": 0.47787613, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.36283186, + "refHomGenotypeFreq": 0.123893805, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26960784, + "altHomGenotypeFreq": 0.078431375, + "hetGenotypeFreq": 0.38235295, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.73039216, + "refHomGenotypeFreq": 0.5392157, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35164836, + "altHomGenotypeFreq": 0.13186814, + "hetGenotypeFreq": 0.43956044, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.64835167, + "refHomGenotypeFreq": 0.42857143, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4784946, + "altHomGenotypeFreq": 0.22580644, + "hetGenotypeFreq": 0.50537634, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.52150536, + "refHomGenotypeFreq": 0.26881722, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43434343, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.5252525, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.56565654, + "refHomGenotypeFreq": 0.3030303, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40654206, + "altHomGenotypeFreq": 0.18691589, + "hetGenotypeFreq": 0.43925232, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.59345794, + "refHomGenotypeFreq": 0.37383178, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.23255815, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.37209302, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.76744187, + "refHomGenotypeFreq": 0.5813953, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5416667, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.4791667, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.45833334, + "refHomGenotypeFreq": 0.21875, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65656567, + "altHomGenotypeFreq": 0.3939394, + "hetGenotypeFreq": 0.5252525, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.34343433, + "refHomGenotypeFreq": 0.08080808, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48989898, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.43434346, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.510101, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3916501, + "altHomGenotypeFreq": 0.17097415, + "hetGenotypeFreq": 0.4413519, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.6083499, + "refHomGenotypeFreq": 0.38767394, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.59836066, + "altHomGenotypeFreq": 0.3114754, + "hetGenotypeFreq": 0.5737705, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.40163934, + "refHomGenotypeFreq": 0.114754096, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32132566, + "altHomGenotypeFreq": 0.095100865, + "hetGenotypeFreq": 0.45244956, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.67867434, + "refHomGenotypeFreq": 0.45244956, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5529412, + "altHomGenotypeFreq": 0.25882354, + "hetGenotypeFreq": 0.5882353, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.44705883, + "refHomGenotypeFreq": 0.15294118, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22330096, + "altHomGenotypeFreq": 0.03883495, + "hetGenotypeFreq": 0.36893204, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.776699, + "refHomGenotypeFreq": 0.592233, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35858586, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.45454544, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.64141417, + "refHomGenotypeFreq": 0.41414142, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44392523, + "altHomGenotypeFreq": 0.23364486, + "hetGenotypeFreq": 0.42056075, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.55607474, + "refHomGenotypeFreq": 0.34579438, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41826922, + "altHomGenotypeFreq": 0.14423077, + "hetGenotypeFreq": 0.5480769, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.5817308, + "refHomGenotypeFreq": 0.30769232, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3888889, + "altHomGenotypeFreq": 0.16161616, + "hetGenotypeFreq": 0.45454547, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.6111111, + "refHomGenotypeFreq": 0.3838384, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2, + "altHomGenotypeFreq": 0.023529412, + "hetGenotypeFreq": 0.3529412, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.8, + "refHomGenotypeFreq": 0.62352943, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44642857, + "altHomGenotypeFreq": 0.19444445, + "hetGenotypeFreq": 0.50396824, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5535714, + "refHomGenotypeFreq": 0.3015873, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47087377, + "altHomGenotypeFreq": 0.23300971, + "hetGenotypeFreq": 0.47572815, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.5291262, + "refHomGenotypeFreq": 0.29126215, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.15730338, + "altHomGenotypeFreq": 0.074906364, + "hetGenotypeFreq": 0.16479401, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8426966, + "refHomGenotypeFreq": 0.7602996, + "study": "MGP" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39473686, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6052631, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39871293, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.60128707, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39154124, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.60845876, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39805827, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.6019417, + "study": "UK10K" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22777875, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22777875, + "id": "15:22777875:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22777875, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "cdnaPosition": 234, + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "exonOverlap": [ + { + "number": "2/5", + "percentage": 0.64102566 + } + ], + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 653, + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "exonOverlap": [ + { + "number": "7/8", + "percentage": 0.6329114 + } + ], + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.009999990463257, + "source": "gerp" + }, + { + "score": 0.8569999933242798, + "source": "phastCons" + }, + { + "score": 0.39500001072883606, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.989999771118164, + "source": "cadd_raw" + }, + { + "score": 16.15999984741211, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000560026(ENSG00000259596):n.234G>T", + "ENST00000559072(ENSG00000259400):n.653G>T" + ], + "id": "rs12437479", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.2059625, + "altHomGenotypeFreq": 0.053461365, + "hetGenotypeFreq": 0.30500227, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7940375, + "refHomGenotypeFreq": 0.64153636, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22801636, + "altHomGenotypeFreq": 0.06543967, + "hetGenotypeFreq": 0.32515338, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7719836, + "refHomGenotypeFreq": 0.60940695, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52487564, + "altHomGenotypeFreq": 0.26243782, + "hetGenotypeFreq": 0.52487564, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.4751244, + "refHomGenotypeFreq": 0.21268657, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2410072, + "altHomGenotypeFreq": 0.05995204, + "hetGenotypeFreq": 0.36211032, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7589928, + "refHomGenotypeFreq": 0.57793766, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30201343, + "altHomGenotypeFreq": 0.08053691, + "hetGenotypeFreq": 0.44295302, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.6979866, + "refHomGenotypeFreq": 0.47651008, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23625429, + "altHomGenotypeFreq": 0.053264603, + "hetGenotypeFreq": 0.36597937, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7637457, + "refHomGenotypeFreq": 0.580756, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25036848, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.3830899, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7496315, + "refHomGenotypeFreq": 0.5580866, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.04936709, + "altHomGenotypeFreq": 0.0027617952, + "hetGenotypeFreq": 0.093210585, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9506329, + "refHomGenotypeFreq": 0.90402764, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20780058, + "altHomGenotypeFreq": 0.054662757, + "hetGenotypeFreq": 0.30627567, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.79219943, + "refHomGenotypeFreq": 0.63906157, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20368758, + "altHomGenotypeFreq": 0.05197445, + "hetGenotypeFreq": 0.30342624, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.79631245, + "refHomGenotypeFreq": 0.6445993, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26553106, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.73446894, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21875, + "altHomGenotypeFreq": 0.015625, + "hetGenotypeFreq": 0.40625, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.78125, + "refHomGenotypeFreq": 0.578125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23961662, + "altHomGenotypeFreq": 0.0850639, + "hetGenotypeFreq": 0.30910543, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.76038337, + "refHomGenotypeFreq": 0.60583067, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2852761, + "altHomGenotypeFreq": 0.075664625, + "hetGenotypeFreq": 0.4192229, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.71472394, + "refHomGenotypeFreq": 0.50511247, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16489361, + "altHomGenotypeFreq": 0.031914894, + "hetGenotypeFreq": 0.26595744, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.8351064, + "refHomGenotypeFreq": 0.70212764, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3382353, + "altHomGenotypeFreq": 0.0882353, + "hetGenotypeFreq": 0.5, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.6617647, + "refHomGenotypeFreq": 0.4117647, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.013615734, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.027231468, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9863843, + "refHomGenotypeFreq": 0.97276855, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5095238, + "altHomGenotypeFreq": 0.22857143, + "hetGenotypeFreq": 0.5619048, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.4904762, + "refHomGenotypeFreq": 0.20952381, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45192307, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.44230768, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.5480769, + "refHomGenotypeFreq": 0.32692307, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0046296297, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.009259259, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.9953704, + "refHomGenotypeFreq": 0.9907407, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3125, + "altHomGenotypeFreq": 0.114583336, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.6875, + "refHomGenotypeFreq": 0.48958334, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27941176, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.42156863, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.7205882, + "refHomGenotypeFreq": 0.50980395, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24725275, + "altHomGenotypeFreq": 0.0989011, + "hetGenotypeFreq": 0.2967033, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.75274724, + "refHomGenotypeFreq": 0.6043956, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.23655914, + "hetGenotypeFreq": 0.5268817, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.23655914, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46464646, + "altHomGenotypeFreq": 0.22222222, + "hetGenotypeFreq": 0.4848485, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.53535354, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.317757, + "altHomGenotypeFreq": 0.1588785, + "hetGenotypeFreq": 0.317757, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.682243, + "refHomGenotypeFreq": 0.5233645, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2616279, + "altHomGenotypeFreq": 0.058139537, + "hetGenotypeFreq": 0.40697676, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.7383721, + "refHomGenotypeFreq": 0.53488374, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.036458332, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.072916664, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.9635417, + "refHomGenotypeFreq": 0.9270833, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27137178, + "altHomGenotypeFreq": 0.085487075, + "hetGenotypeFreq": 0.37176937, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.7286282, + "refHomGenotypeFreq": 0.54274356, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.06557377, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13114753, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.93442625, + "refHomGenotypeFreq": 0.86885244, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20317003, + "altHomGenotypeFreq": 0.04034582, + "hetGenotypeFreq": 0.32564843, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.79683, + "refHomGenotypeFreq": 0.6340058, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.005882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.011764706, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.9941176, + "refHomGenotypeFreq": 0.9882353, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23300971, + "altHomGenotypeFreq": 0.048543688, + "hetGenotypeFreq": 0.36893204, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.7669903, + "refHomGenotypeFreq": 0.5825243, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.43434343, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22429906, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.3551402, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.7757009, + "refHomGenotypeFreq": 0.5981308, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21153846, + "altHomGenotypeFreq": 0.048076924, + "hetGenotypeFreq": 0.32692307, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.78846157, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26767677, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.45454544, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.7323232, + "refHomGenotypeFreq": 0.5050505, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22352941, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.32941177, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.7764706, + "refHomGenotypeFreq": 0.6117647, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48511904, + "altHomGenotypeFreq": 0.2361111, + "hetGenotypeFreq": 0.49801588, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.51488096, + "refHomGenotypeFreq": 0.26587301, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.26213592, + "hetGenotypeFreq": 0.47572815, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.26213592, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.14794007, + "altHomGenotypeFreq": 0.04868914, + "hetGenotypeFreq": 0.19850187, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8520599, + "refHomGenotypeFreq": 0.752809, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2737371, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7262629, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27504197, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.72495806, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27503893, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.72496104, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27238405, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.72761595, + "study": "UK10K" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22780739, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22780739, + "id": "15:22780739:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 22780739, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.3310000002384186, + "source": "gerp" + }, + { + "score": 0.42899999022483826, + "source": "phastCons" + }, + { + "score": -1.3559999465942383, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 1.0799999237060547, + "source": "cadd_raw" + }, + { + "score": 11.109999656677246, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559072(ENSG00000259400):n.420-19C>T" + ], + "id": "rs4073409", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.3326618, + "altHomGenotypeFreq": 0.12360281, + "hetGenotypeFreq": 0.418118, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6673382, + "refHomGenotypeFreq": 0.4582792, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25619835, + "altHomGenotypeFreq": 0.07231405, + "hetGenotypeFreq": 0.3677686, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.74380165, + "refHomGenotypeFreq": 0.55991733, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5024814, + "altHomGenotypeFreq": 0.24813896, + "hetGenotypeFreq": 0.5086849, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.4975186, + "refHomGenotypeFreq": 0.24317618, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26794258, + "altHomGenotypeFreq": 0.07416268, + "hetGenotypeFreq": 0.3875598, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.7320574, + "refHomGenotypeFreq": 0.5382775, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.307947, + "altHomGenotypeFreq": 0.08609272, + "hetGenotypeFreq": 0.4437086, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.69205296, + "refHomGenotypeFreq": 0.47019866, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2369328, + "altHomGenotypeFreq": 0.05399196, + "hetGenotypeFreq": 0.36588168, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7630672, + "refHomGenotypeFreq": 0.58012635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2515757, + "altHomGenotypeFreq": 0.060614187, + "hetGenotypeFreq": 0.38192302, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7484243, + "refHomGenotypeFreq": 0.5574628, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4948049, + "altHomGenotypeFreq": 0.24867237, + "hetGenotypeFreq": 0.49226508, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5051951, + "refHomGenotypeFreq": 0.25906256, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33840638, + "altHomGenotypeFreq": 0.12939242, + "hetGenotypeFreq": 0.41802797, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.6615936, + "refHomGenotypeFreq": 0.45257962, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32555604, + "altHomGenotypeFreq": 0.11644135, + "hetGenotypeFreq": 0.4182294, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.67444396, + "refHomGenotypeFreq": 0.46532926, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26753506, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7324649, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2421875, + "altHomGenotypeFreq": 0.015625, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.7578125, + "refHomGenotypeFreq": 0.53125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39416933, + "altHomGenotypeFreq": 0.17252396, + "hetGenotypeFreq": 0.4432907, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.60583067, + "refHomGenotypeFreq": 0.3841853, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33537832, + "altHomGenotypeFreq": 0.10633947, + "hetGenotypeFreq": 0.45807773, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.66462165, + "refHomGenotypeFreq": 0.43558282, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21808511, + "altHomGenotypeFreq": 0.04255319, + "hetGenotypeFreq": 0.35106382, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.7819149, + "refHomGenotypeFreq": 0.60638297, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4019608, + "altHomGenotypeFreq": 0.12745099, + "hetGenotypeFreq": 0.54901963, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.5980392, + "refHomGenotypeFreq": 0.32352942, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5385779, + "altHomGenotypeFreq": 0.2965204, + "hetGenotypeFreq": 0.48411497, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.4614221, + "refHomGenotypeFreq": 0.2193646, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4952381, + "altHomGenotypeFreq": 0.22857143, + "hetGenotypeFreq": 0.53333336, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.50476193, + "refHomGenotypeFreq": 0.23809524, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47596154, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.45192307, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.52403843, + "refHomGenotypeFreq": 0.29807693, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5416667, + "altHomGenotypeFreq": 0.3148148, + "hetGenotypeFreq": 0.4537037, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.45833334, + "refHomGenotypeFreq": 0.23148148, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.13541667, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.46875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49115044, + "altHomGenotypeFreq": 0.26548672, + "hetGenotypeFreq": 0.45132744, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.50884956, + "refHomGenotypeFreq": 0.28318584, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32352942, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.43137255, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.6764706, + "refHomGenotypeFreq": 0.46078432, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24175824, + "altHomGenotypeFreq": 0.0989011, + "hetGenotypeFreq": 0.2857143, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.7582418, + "refHomGenotypeFreq": 0.61538464, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50537634, + "altHomGenotypeFreq": 0.24731183, + "hetGenotypeFreq": 0.516129, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.49462366, + "refHomGenotypeFreq": 0.23655914, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41414142, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.5252525, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.5858586, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3317757, + "altHomGenotypeFreq": 0.1588785, + "hetGenotypeFreq": 0.34579438, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.6682243, + "refHomGenotypeFreq": 0.49532712, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31976745, + "altHomGenotypeFreq": 0.069767445, + "hetGenotypeFreq": 0.5, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.6802326, + "refHomGenotypeFreq": 0.43023255, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.515625, + "altHomGenotypeFreq": 0.28125, + "hetGenotypeFreq": 0.46875, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.484375, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56060606, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.5151515, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.43939394, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6010101, + "altHomGenotypeFreq": 0.35353535, + "hetGenotypeFreq": 0.49494952, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.3989899, + "refHomGenotypeFreq": 0.15151516, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27833003, + "altHomGenotypeFreq": 0.091451295, + "hetGenotypeFreq": 0.37375745, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.72167, + "refHomGenotypeFreq": 0.53479123, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47540984, + "altHomGenotypeFreq": 0.22950819, + "hetGenotypeFreq": 0.49180326, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.52459013, + "refHomGenotypeFreq": 0.27868852, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24063401, + "altHomGenotypeFreq": 0.054755043, + "hetGenotypeFreq": 0.37175792, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.759366, + "refHomGenotypeFreq": 0.57348704, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.57058823, + "altHomGenotypeFreq": 0.30588236, + "hetGenotypeFreq": 0.5294118, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.42941177, + "refHomGenotypeFreq": 0.16470589, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2961165, + "altHomGenotypeFreq": 0.08737864, + "hetGenotypeFreq": 0.41747573, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.70388347, + "refHomGenotypeFreq": 0.49514562, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.43434343, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24299066, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.35514018, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.7570093, + "refHomGenotypeFreq": 0.5794392, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27403846, + "altHomGenotypeFreq": 0.09615385, + "hetGenotypeFreq": 0.35576922, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.72596157, + "refHomGenotypeFreq": 0.5480769, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27272728, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.44444442, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.72727275, + "refHomGenotypeFreq": 0.5050505, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22352941, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.3529412, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.7764706, + "refHomGenotypeFreq": 0.6, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48313493, + "altHomGenotypeFreq": 0.2361111, + "hetGenotypeFreq": 0.49404764, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5168651, + "refHomGenotypeFreq": 0.26984128, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52427185, + "altHomGenotypeFreq": 0.30097088, + "hetGenotypeFreq": 0.44660193, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.47572815, + "refHomGenotypeFreq": 0.2524272, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24531835, + "altHomGenotypeFreq": 0.059925094, + "hetGenotypeFreq": 0.37078652, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.75468165, + "refHomGenotypeFreq": 0.5692884, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.272018, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.72798204, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27336317, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.7266368, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27322263, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.7267774, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2707659, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.7292341, + "study": "UK10K" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22782355, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22782355, + "id": "15:22782355:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22782355, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.190000057220459, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": -0.7549999952316284, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.26000022888183594, + "source": "cadd_raw" + }, + { + "score": 0.8500000238418579, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559072(ENSG00000259400):n.419+164C>T" + ], + "id": "rs12900111", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.29662716, + "altHomGenotypeFreq": 0.09296303, + "hetGenotypeFreq": 0.40732828, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.70337284, + "refHomGenotypeFreq": 0.49970868, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24233128, + "altHomGenotypeFreq": 0.06543967, + "hetGenotypeFreq": 0.35378322, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.75766873, + "refHomGenotypeFreq": 0.5807771, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.503736, + "altHomGenotypeFreq": 0.249066, + "hetGenotypeFreq": 0.50934, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.496264, + "refHomGenotypeFreq": 0.24159402, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25656325, + "altHomGenotypeFreq": 0.06443914, + "hetGenotypeFreq": 0.3842482, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.74343675, + "refHomGenotypeFreq": 0.5513126, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.307947, + "altHomGenotypeFreq": 0.08609272, + "hetGenotypeFreq": 0.4437086, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.69205296, + "refHomGenotypeFreq": 0.47019866, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23697768, + "altHomGenotypeFreq": 0.053806525, + "hetGenotypeFreq": 0.3663423, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7630223, + "refHomGenotypeFreq": 0.57985115, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2506013, + "altHomGenotypeFreq": 0.061063603, + "hetGenotypeFreq": 0.37907535, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7493987, + "refHomGenotypeFreq": 0.55986106, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37103814, + "altHomGenotypeFreq": 0.14079008, + "hetGenotypeFreq": 0.4604961, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.62896186, + "refHomGenotypeFreq": 0.39871383, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30114836, + "altHomGenotypeFreq": 0.0963206, + "hetGenotypeFreq": 0.40965548, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.69885164, + "refHomGenotypeFreq": 0.49402392, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29104584, + "altHomGenotypeFreq": 0.08881817, + "hetGenotypeFreq": 0.40445536, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.70895416, + "refHomGenotypeFreq": 0.50672644, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26653308, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7334669, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.234375, + "altHomGenotypeFreq": 0.015625, + "hetGenotypeFreq": 0.4375, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.765625, + "refHomGenotypeFreq": 0.546875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3422524, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.4345048, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6577476, + "refHomGenotypeFreq": 0.4404952, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29038855, + "altHomGenotypeFreq": 0.07770961, + "hetGenotypeFreq": 0.42535788, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.7096115, + "refHomGenotypeFreq": 0.4969325, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21276596, + "altHomGenotypeFreq": 0.031914894, + "hetGenotypeFreq": 0.36170214, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.78723407, + "refHomGenotypeFreq": 0.60638297, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3529412, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.4901961, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.64705884, + "refHomGenotypeFreq": 0.4019608, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3827534, + "altHomGenotypeFreq": 0.14069591, + "hetGenotypeFreq": 0.48411494, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.61724657, + "refHomGenotypeFreq": 0.3751891, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4904762, + "altHomGenotypeFreq": 0.22857143, + "hetGenotypeFreq": 0.52380955, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.5095238, + "refHomGenotypeFreq": 0.24761905, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47596154, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.45192307, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.52403843, + "refHomGenotypeFreq": 0.29807693, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3935185, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.4537037, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.6064815, + "refHomGenotypeFreq": 0.37962964, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30208334, + "altHomGenotypeFreq": 0.114583336, + "hetGenotypeFreq": 0.375, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.6979167, + "refHomGenotypeFreq": 0.5104167, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34955752, + "altHomGenotypeFreq": 0.123893805, + "hetGenotypeFreq": 0.45132744, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.6504425, + "refHomGenotypeFreq": 0.42477876, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29411766, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.4509804, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.7058824, + "refHomGenotypeFreq": 0.48039216, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24175824, + "altHomGenotypeFreq": 0.0989011, + "hetGenotypeFreq": 0.2857143, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.7582418, + "refHomGenotypeFreq": 0.61538464, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.24731183, + "hetGenotypeFreq": 0.50537634, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.24731183, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41414142, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.5252525, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.5858586, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3271028, + "altHomGenotypeFreq": 0.1588785, + "hetGenotypeFreq": 0.3364486, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.6728972, + "refHomGenotypeFreq": 0.5046729, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27906978, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.4651163, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.7209302, + "refHomGenotypeFreq": 0.4883721, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.390625, + "altHomGenotypeFreq": 0.15625, + "hetGenotypeFreq": 0.46875, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.609375, + "refHomGenotypeFreq": 0.375, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3989899, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.5151515, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.6010101, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42424244, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.56565654, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.57575756, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27733597, + "altHomGenotypeFreq": 0.091451295, + "hetGenotypeFreq": 0.37176937, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.722664, + "refHomGenotypeFreq": 0.53677934, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33606556, + "altHomGenotypeFreq": 0.14754099, + "hetGenotypeFreq": 0.37704918, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.6639344, + "refHomGenotypeFreq": 0.47540984, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23054755, + "altHomGenotypeFreq": 0.048991356, + "hetGenotypeFreq": 0.3631124, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.76945245, + "refHomGenotypeFreq": 0.5878962, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37058824, + "altHomGenotypeFreq": 0.105882354, + "hetGenotypeFreq": 0.5294118, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.62941176, + "refHomGenotypeFreq": 0.3647059, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22330096, + "altHomGenotypeFreq": 0.048543688, + "hetGenotypeFreq": 0.34951454, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.776699, + "refHomGenotypeFreq": 0.60194176, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.43434343, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24299066, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.35514018, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.7570093, + "refHomGenotypeFreq": 0.5794392, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25480768, + "altHomGenotypeFreq": 0.086538464, + "hetGenotypeFreq": 0.33653846, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.7451923, + "refHomGenotypeFreq": 0.5769231, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27272728, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.44444442, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.72727275, + "refHomGenotypeFreq": 0.5050505, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21764706, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.34117648, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.7823529, + "refHomGenotypeFreq": 0.6117647, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4811508, + "altHomGenotypeFreq": 0.2361111, + "hetGenotypeFreq": 0.49007934, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5188492, + "refHomGenotypeFreq": 0.27380952, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52427185, + "altHomGenotypeFreq": 0.30097088, + "hetGenotypeFreq": 0.44660193, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.47572815, + "refHomGenotypeFreq": 0.2524272, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.123595506, + "altHomGenotypeFreq": 0.033707865, + "hetGenotypeFreq": 0.17977528, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8764045, + "refHomGenotypeFreq": 0.78651685, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27162126, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7283788, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2725238, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.72747624, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27322263, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.7267774, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26995686, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.7300432, + "study": "UK10K" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22784067, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22784067, + "id": "15:22784067:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22784067, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.05290000140666962, + "source": "gerp" + }, + { + "score": 0.7139999866485596, + "source": "phastCons" + }, + { + "score": 0.4000000059604645, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 1.390000343322754, + "source": "cadd_raw" + }, + { + "score": 12.739999771118164, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559072(ENSG00000259400):n.419+136C>A" + ], + "id": "rs12900257", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.30622086, + "altHomGenotypeFreq": 0.10007768, + "hetGenotypeFreq": 0.4123511, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.69374675, + "refHomGenotypeFreq": 0.4875712, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2489796, + "altHomGenotypeFreq": 0.06734694, + "hetGenotypeFreq": 0.3632653, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.75102043, + "refHomGenotypeFreq": 0.56938773, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50247526, + "altHomGenotypeFreq": 0.24876237, + "hetGenotypeFreq": 0.5074257, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.49752474, + "refHomGenotypeFreq": 0.24381188, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2613365, + "altHomGenotypeFreq": 0.06921241, + "hetGenotypeFreq": 0.3842482, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.7386635, + "refHomGenotypeFreq": 0.54653937, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.307947, + "altHomGenotypeFreq": 0.08609272, + "hetGenotypeFreq": 0.4437086, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.69205296, + "refHomGenotypeFreq": 0.47019866, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23696275, + "altHomGenotypeFreq": 0.053868193, + "hetGenotypeFreq": 0.36618912, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.76303726, + "refHomGenotypeFreq": 0.5799427, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25090182, + "altHomGenotypeFreq": 0.060921844, + "hetGenotypeFreq": 0.3799599, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7490982, + "refHomGenotypeFreq": 0.5591182, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40344828, + "altHomGenotypeFreq": 0.16551724, + "hetGenotypeFreq": 0.47609195, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5964368, + "refHomGenotypeFreq": 0.3583908, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31102777, + "altHomGenotypeFreq": 0.10441814, + "hetGenotypeFreq": 0.41333646, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.68891364, + "refHomGenotypeFreq": 0.4822454, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3002892, + "altHomGenotypeFreq": 0.09472162, + "hetGenotypeFreq": 0.41113523, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6997108, + "refHomGenotypeFreq": 0.49414316, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26653308, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7334669, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2421875, + "altHomGenotypeFreq": 0.015625, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.7578125, + "refHomGenotypeFreq": 0.53125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36242014, + "altHomGenotypeFreq": 0.13897763, + "hetGenotypeFreq": 0.446885, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.63757986, + "refHomGenotypeFreq": 0.4141374, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32719836, + "altHomGenotypeFreq": 0.09406953, + "hetGenotypeFreq": 0.46625766, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.6728016, + "refHomGenotypeFreq": 0.4396728, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21276596, + "altHomGenotypeFreq": 0.031914894, + "hetGenotypeFreq": 0.36170214, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.78723407, + "refHomGenotypeFreq": 0.60638297, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38235295, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.54901963, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.61764705, + "refHomGenotypeFreq": 0.34313726, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42889562, + "altHomGenotypeFreq": 0.18154311, + "hetGenotypeFreq": 0.49470496, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5711044, + "refHomGenotypeFreq": 0.3237519, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4904762, + "altHomGenotypeFreq": 0.22857143, + "hetGenotypeFreq": 0.52380955, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.5095238, + "refHomGenotypeFreq": 0.24761905, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47596154, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.45192307, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.52403843, + "refHomGenotypeFreq": 0.29807693, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44444445, + "altHomGenotypeFreq": 0.19444445, + "hetGenotypeFreq": 0.5, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.5555556, + "refHomGenotypeFreq": 0.30555555, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.13541667, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.46875, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3761062, + "altHomGenotypeFreq": 0.15044248, + "hetGenotypeFreq": 0.45132744, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.6238938, + "refHomGenotypeFreq": 0.39823008, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32352942, + "altHomGenotypeFreq": 0.09803922, + "hetGenotypeFreq": 0.4509804, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.6764706, + "refHomGenotypeFreq": 0.4509804, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23626374, + "altHomGenotypeFreq": 0.08791209, + "hetGenotypeFreq": 0.2967033, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.76373625, + "refHomGenotypeFreq": 0.61538464, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.24731183, + "hetGenotypeFreq": 0.50537634, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.24731183, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41414142, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.5252525, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.5858586, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3317757, + "altHomGenotypeFreq": 0.1588785, + "hetGenotypeFreq": 0.34579438, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.6682243, + "refHomGenotypeFreq": 0.49532712, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3139535, + "altHomGenotypeFreq": 0.058139537, + "hetGenotypeFreq": 0.5116279, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.68604654, + "refHomGenotypeFreq": 0.43023255, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42708334, + "altHomGenotypeFreq": 0.17708333, + "hetGenotypeFreq": 0.5, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.5729167, + "refHomGenotypeFreq": 0.32291666, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44949496, + "altHomGenotypeFreq": 0.1919192, + "hetGenotypeFreq": 0.5151515, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.55050504, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.510101, + "altHomGenotypeFreq": 0.24242425, + "hetGenotypeFreq": 0.53535354, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.48989898, + "refHomGenotypeFreq": 0.22222222, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27733597, + "altHomGenotypeFreq": 0.08946322, + "hetGenotypeFreq": 0.37574553, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.722664, + "refHomGenotypeFreq": 0.53479123, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37704918, + "altHomGenotypeFreq": 0.18032786, + "hetGenotypeFreq": 0.39344263, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.6229508, + "refHomGenotypeFreq": 0.4262295, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23775215, + "altHomGenotypeFreq": 0.0518732, + "hetGenotypeFreq": 0.37175792, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.76224786, + "refHomGenotypeFreq": 0.57636887, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4, + "altHomGenotypeFreq": 0.12941177, + "hetGenotypeFreq": 0.5411765, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.6, + "refHomGenotypeFreq": 0.32941177, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2815534, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.42718446, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.7184466, + "refHomGenotypeFreq": 0.5048544, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.43434343, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24299066, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.35514018, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.7570093, + "refHomGenotypeFreq": 0.5794392, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26923078, + "altHomGenotypeFreq": 0.09615385, + "hetGenotypeFreq": 0.34615386, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.7307692, + "refHomGenotypeFreq": 0.5576923, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27272728, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.44444442, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.72727275, + "refHomGenotypeFreq": 0.5050505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22352941, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.3529412, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.7764706, + "refHomGenotypeFreq": 0.6, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48015872, + "altHomGenotypeFreq": 0.2361111, + "hetGenotypeFreq": 0.48809522, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.51984125, + "refHomGenotypeFreq": 0.27579364, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.51941746, + "altHomGenotypeFreq": 0.30097088, + "hetGenotypeFreq": 0.43689322, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.48058254, + "refHomGenotypeFreq": 0.26213592, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21910113, + "altHomGenotypeFreq": 0.04868914, + "hetGenotypeFreq": 0.34082398, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.78089887, + "refHomGenotypeFreq": 0.61048687, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27188575, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.72811425, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2730834, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.7269166, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27322263, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.7267774, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27049622, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.72950375, + "study": "UK10K" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22784095, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22784095, + "id": "15:22784095:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22784095, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000259596", + "ensemblTranscriptId": "ENST00000560026", + "geneName": "RP11-566K19.3", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 384, + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "exonOverlap": [ + { + "number": "5/8", + "percentage": 0.5524862 + } + ], + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -4.050000190734863, + "source": "gerp" + }, + { + "score": 0.23800000548362732, + "source": "phastCons" + }, + { + "score": -0.9390000104904175, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.39999961853027344, + "source": "cadd_raw" + }, + { + "score": 6.610000133514404, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559072(ENSG00000259400):n.384G>A" + ], + "id": "rs11855955", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.2961008, + "altHomGenotypeFreq": 0.09242827, + "hetGenotypeFreq": 0.40734503, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7038992, + "refHomGenotypeFreq": 0.5002267, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24487706, + "altHomGenotypeFreq": 0.06762295, + "hetGenotypeFreq": 0.3545082, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.75512296, + "refHomGenotypeFreq": 0.5778689, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50310946, + "altHomGenotypeFreq": 0.24751244, + "hetGenotypeFreq": 0.51119405, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.49689054, + "refHomGenotypeFreq": 0.24129353, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25717703, + "altHomGenotypeFreq": 0.0645933, + "hetGenotypeFreq": 0.38516745, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.74282295, + "refHomGenotypeFreq": 0.5502392, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.307947, + "altHomGenotypeFreq": 0.08609272, + "hetGenotypeFreq": 0.4437086, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.69205296, + "refHomGenotypeFreq": 0.47019866, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23696275, + "altHomGenotypeFreq": 0.053868193, + "hetGenotypeFreq": 0.36618912, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.76303726, + "refHomGenotypeFreq": 0.5799427, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25033405, + "altHomGenotypeFreq": 0.060929984, + "hetGenotypeFreq": 0.3788081, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.749666, + "refHomGenotypeFreq": 0.5602619, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36939526, + "altHomGenotypeFreq": 0.13911244, + "hetGenotypeFreq": 0.46056566, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.63060474, + "refHomGenotypeFreq": 0.4003219, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30092648, + "altHomGenotypeFreq": 0.0958133, + "hetGenotypeFreq": 0.41022635, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.69907355, + "refHomGenotypeFreq": 0.49396035, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29014757, + "altHomGenotypeFreq": 0.08825231, + "hetGenotypeFreq": 0.4037905, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.70985246, + "refHomGenotypeFreq": 0.50795716, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26653308, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7334669, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.234375, + "altHomGenotypeFreq": 0.015625, + "hetGenotypeFreq": 0.4375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.765625, + "refHomGenotypeFreq": 0.546875, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34165335, + "altHomGenotypeFreq": 0.124201275, + "hetGenotypeFreq": 0.43490416, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.65834665, + "refHomGenotypeFreq": 0.44089457, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28936607, + "altHomGenotypeFreq": 0.075664625, + "hetGenotypeFreq": 0.42740285, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.71063393, + "refHomGenotypeFreq": 0.4969325, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21276596, + "altHomGenotypeFreq": 0.031914894, + "hetGenotypeFreq": 0.36170214, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.78723407, + "refHomGenotypeFreq": 0.60638297, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3529412, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.4901961, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.64705884, + "refHomGenotypeFreq": 0.4019608, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38124055, + "altHomGenotypeFreq": 0.13918306, + "hetGenotypeFreq": 0.484115, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.61875945, + "refHomGenotypeFreq": 0.37670198, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4904762, + "altHomGenotypeFreq": 0.22857143, + "hetGenotypeFreq": 0.52380955, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.5095238, + "refHomGenotypeFreq": 0.24761905, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47596154, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.45192307, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.52403843, + "refHomGenotypeFreq": 0.29807693, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3935185, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.4537037, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.6064815, + "refHomGenotypeFreq": 0.37962964, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30729166, + "altHomGenotypeFreq": 0.114583336, + "hetGenotypeFreq": 0.38541666, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.6927083, + "refHomGenotypeFreq": 0.5, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34955752, + "altHomGenotypeFreq": 0.123893805, + "hetGenotypeFreq": 0.45132744, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.6504425, + "refHomGenotypeFreq": 0.42477876, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28921568, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.44117647, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.7107843, + "refHomGenotypeFreq": 0.49019608, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24175824, + "altHomGenotypeFreq": 0.0989011, + "hetGenotypeFreq": 0.2857143, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.7582418, + "refHomGenotypeFreq": 0.61538464, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.24731183, + "hetGenotypeFreq": 0.50537634, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.24731183, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41414142, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.5252525, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.5858586, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3271028, + "altHomGenotypeFreq": 0.1588785, + "hetGenotypeFreq": 0.3364486, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.6728972, + "refHomGenotypeFreq": 0.5046729, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27325583, + "altHomGenotypeFreq": 0.034883723, + "hetGenotypeFreq": 0.47674417, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.7267442, + "refHomGenotypeFreq": 0.4883721, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.390625, + "altHomGenotypeFreq": 0.15625, + "hetGenotypeFreq": 0.46875, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.609375, + "refHomGenotypeFreq": 0.375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3989899, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.5151515, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.6010101, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41919193, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.57575756, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.5808081, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27733597, + "altHomGenotypeFreq": 0.091451295, + "hetGenotypeFreq": 0.37176937, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.722664, + "refHomGenotypeFreq": 0.53677934, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33606556, + "altHomGenotypeFreq": 0.14754099, + "hetGenotypeFreq": 0.37704918, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.6639344, + "refHomGenotypeFreq": 0.47540984, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23054755, + "altHomGenotypeFreq": 0.048991356, + "hetGenotypeFreq": 0.3631124, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.76945245, + "refHomGenotypeFreq": 0.5878962, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3647059, + "altHomGenotypeFreq": 0.105882354, + "hetGenotypeFreq": 0.5176471, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.63529414, + "refHomGenotypeFreq": 0.3764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22330096, + "altHomGenotypeFreq": 0.048543688, + "hetGenotypeFreq": 0.34951454, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.776699, + "refHomGenotypeFreq": 0.60194176, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2979798, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.43434343, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7020202, + "refHomGenotypeFreq": 0.4848485, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24299066, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.35514018, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.7570093, + "refHomGenotypeFreq": 0.5794392, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25480768, + "altHomGenotypeFreq": 0.086538464, + "hetGenotypeFreq": 0.33653846, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.7451923, + "refHomGenotypeFreq": 0.5769231, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27272728, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.44444442, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.72727275, + "refHomGenotypeFreq": 0.5050505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21764706, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.34117648, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.7823529, + "refHomGenotypeFreq": 0.6117647, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4811508, + "altHomGenotypeFreq": 0.2361111, + "hetGenotypeFreq": 0.49007934, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5188492, + "refHomGenotypeFreq": 0.27380952, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.52427185, + "altHomGenotypeFreq": 0.30097088, + "hetGenotypeFreq": 0.44660193, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.47572815, + "refHomGenotypeFreq": 0.2524272, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24157304, + "altHomGenotypeFreq": 0.056179777, + "hetGenotypeFreq": 0.37078652, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.75842696, + "refHomGenotypeFreq": 0.5730337, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27162126, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7283788, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27280357, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.72719646, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27296317, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.72703683, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27022654, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.72977346, + "study": "UK10K" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22784266, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22784266, + "id": "15:22784266:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22784266, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 207, + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "exonOverlap": [ + { + "number": "4/8", + "percentage": 2.173913 + } + ], + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.02500000037252903, + "source": "phastCons" + }, + { + "score": 0.054999999701976776, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559072(ENSG00000259400):n.207delA" + ], + "id": "rs33980587", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.287921, + "altHomGenotypeFreq": 0.07659846, + "hetGenotypeFreq": 0.45441517, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.696194, + "refHomGenotypeFreq": 0.4689864, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2876344, + "altHomGenotypeFreq": 0.07526881, + "hetGenotypeFreq": 0.45161292, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6989247, + "refHomGenotypeFreq": 0.47311828, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.46330276, + "altHomGenotypeFreq": 0.20576671, + "hetGenotypeFreq": 0.5190039, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5347313, + "refHomGenotypeFreq": 0.27522936, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3172043, + "altHomGenotypeFreq": 0.03942652, + "hetGenotypeFreq": 0.61648744, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.65232974, + "refHomGenotypeFreq": 0.34408602, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32170543, + "altHomGenotypeFreq": 0.13953489, + "hetGenotypeFreq": 0.5426357, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.58914727, + "refHomGenotypeFreq": 0.31782946, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3838973, + "altHomGenotypeFreq": 0.03967328, + "hetGenotypeFreq": 0.77012837, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.57526255, + "refHomGenotypeFreq": 0.19019836, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.29571587, + "altHomGenotypeFreq": 0.07749252, + "hetGenotypeFreq": 0.4495196, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.69774765, + "refHomGenotypeFreq": 0.47298786, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.21496063, + "altHomGenotypeFreq": 0.058267716, + "hetGenotypeFreq": 0.364042, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.75971127, + "refHomGenotypeFreq": 0.5776903, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.28588635, + "altHomGenotypeFreq": 0.07609465, + "hetGenotypeFreq": 0.45203346, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6978886, + "refHomGenotypeFreq": 0.4718719, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2905307, + "altHomGenotypeFreq": 0.07724463, + "hetGenotypeFreq": 0.45747003, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.69402033, + "refHomGenotypeFreq": 0.46528536, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.375, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.625, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.625, + "refHomGenotypeFreq": 0.3125, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.41473642, + "altHomGenotypeFreq": 0.092252396, + "hetGenotypeFreq": 0.64496803, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.58526355, + "refHomGenotypeFreq": 0.26277956, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.398773, + "altHomGenotypeFreq": 0.053169735, + "hetGenotypeFreq": 0.6912066, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.601227, + "refHomGenotypeFreq": 0.25562373, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.34042552, + "altHomGenotypeFreq": 0.031914894, + "hetGenotypeFreq": 0.61702126, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.65957445, + "refHomGenotypeFreq": 0.35106382, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.40686274, + "altHomGenotypeFreq": 0.039215688, + "hetGenotypeFreq": 0.7352941, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.59313726, + "refHomGenotypeFreq": 0.2254902, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3880484, + "altHomGenotypeFreq": 0.06959153, + "hetGenotypeFreq": 0.6369138, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.6119516, + "refHomGenotypeFreq": 0.2934947, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.48095238, + "altHomGenotypeFreq": 0.14285715, + "hetGenotypeFreq": 0.6761905, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.5190476, + "refHomGenotypeFreq": 0.18095239, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5817308, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.66346157, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.41826922, + "refHomGenotypeFreq": 0.086538464, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.037037037, + "hetGenotypeFreq": 0.5925926, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.37037036, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.41666666, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.7083334, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.5833333, + "refHomGenotypeFreq": 0.22916667, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4159292, + "altHomGenotypeFreq": 0.053097345, + "hetGenotypeFreq": 0.7256637, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.5840708, + "refHomGenotypeFreq": 0.22123894, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4117647, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.7058824, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.5882353, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3791209, + "altHomGenotypeFreq": 0.0989011, + "hetGenotypeFreq": 0.5604396, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.6208791, + "refHomGenotypeFreq": 0.34065935, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4247312, + "altHomGenotypeFreq": 0.086021505, + "hetGenotypeFreq": 0.67741936, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.5752688, + "refHomGenotypeFreq": 0.23655914, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.43939394, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.7171717, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.56060606, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.45327103, + "altHomGenotypeFreq": 0.14018692, + "hetGenotypeFreq": 0.62616825, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.54672897, + "refHomGenotypeFreq": 0.23364486, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3895349, + "altHomGenotypeFreq": 0.023255814, + "hetGenotypeFreq": 0.73255813, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.6104651, + "refHomGenotypeFreq": 0.24418604, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.390625, + "altHomGenotypeFreq": 0.09375, + "hetGenotypeFreq": 0.59375, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.609375, + "refHomGenotypeFreq": 0.3125, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.43434343, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.68686867, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.56565654, + "refHomGenotypeFreq": 0.22222222, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3989899, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.57575756, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.6010101, + "refHomGenotypeFreq": 0.3131313, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.41550696, + "altHomGenotypeFreq": 0.10934394, + "hetGenotypeFreq": 0.612326, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.58449304, + "refHomGenotypeFreq": 0.27833003, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.36065573, + "altHomGenotypeFreq": 0.06557377, + "hetGenotypeFreq": 0.59016395, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.6393443, + "refHomGenotypeFreq": 0.3442623, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3760807, + "altHomGenotypeFreq": 0.074927956, + "hetGenotypeFreq": 0.6023055, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.6239193, + "refHomGenotypeFreq": 0.32276657, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.37058824, + "altHomGenotypeFreq": 0.03529412, + "hetGenotypeFreq": 0.67058825, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.62941176, + "refHomGenotypeFreq": 0.29411766, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.36893204, + "altHomGenotypeFreq": 0.0776699, + "hetGenotypeFreq": 0.5825243, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.63106793, + "refHomGenotypeFreq": 0.3398058, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.45454547, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.6262626, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.54545456, + "refHomGenotypeFreq": 0.23232323, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.42523363, + "altHomGenotypeFreq": 0.093457945, + "hetGenotypeFreq": 0.6635514, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.57476634, + "refHomGenotypeFreq": 0.24299066, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.40865386, + "altHomGenotypeFreq": 0.10576923, + "hetGenotypeFreq": 0.6057693, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.59134614, + "refHomGenotypeFreq": 0.28846154, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.35858586, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.5757576, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.64141417, + "refHomGenotypeFreq": 0.35353535, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3764706, + "altHomGenotypeFreq": 0.09411765, + "hetGenotypeFreq": 0.5647059, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.62352943, + "refHomGenotypeFreq": 0.34117648, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.49107143, + "altHomGenotypeFreq": 0.15476191, + "hetGenotypeFreq": 0.67261904, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5089286, + "refHomGenotypeFreq": 0.17261904, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.51941746, + "altHomGenotypeFreq": 0.2038835, + "hetGenotypeFreq": 0.631068, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.48058254, + "refHomGenotypeFreq": 0.16504854, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.31896323, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6810368, + "study": "UK10K" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32372692, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.6762731, + "study": "UK10K" + }, + { + "altAllele": "", + "altAlleleFreq": 0.31629476, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.6837052, + "study": "UK10K" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32173678, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.6782632, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22788304, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22788304, + "id": "15:22788304:T:-", + "length": 1, + "names": [], + "reference": "T", + "start": 22788304, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.11400000005960464, + "source": "phastCons" + }, + { + "score": -1.8960000276565552, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.06000041961669922, + "source": "cadd_raw" + }, + { + "score": 3.240000009536743, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559072(ENSG00000259400):n.193-238A>G" + ], + "id": "rs6606791", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.3547175, + "altHomGenotypeFreq": 0.1378651, + "hetGenotypeFreq": 0.43370476, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6452825, + "refHomGenotypeFreq": 0.42843014, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2843552, + "altHomGenotypeFreq": 0.07399577, + "hetGenotypeFreq": 0.42071882, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.71564484, + "refHomGenotypeFreq": 0.50528544, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4353234, + "altHomGenotypeFreq": 0.17910448, + "hetGenotypeFreq": 0.5124378, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.56467664, + "refHomGenotypeFreq": 0.3084577, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26449275, + "altHomGenotypeFreq": 0.062801935, + "hetGenotypeFreq": 0.40338165, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.73550725, + "refHomGenotypeFreq": 0.5338164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25666666, + "altHomGenotypeFreq": 0.06666667, + "hetGenotypeFreq": 0.38, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.74333334, + "refHomGenotypeFreq": 0.55333334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2791863, + "altHomGenotypeFreq": 0.07606132, + "hetGenotypeFreq": 0.40625, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7208137, + "refHomGenotypeFreq": 0.5176887, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27380466, + "altHomGenotypeFreq": 0.07151614, + "hetGenotypeFreq": 0.40457705, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.72619534, + "refHomGenotypeFreq": 0.5239068, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52786195, + "altHomGenotypeFreq": 0.2849149, + "hetGenotypeFreq": 0.48589414, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.47213802, + "refHomGenotypeFreq": 0.22919096, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35965434, + "altHomGenotypeFreq": 0.14398094, + "hetGenotypeFreq": 0.43134683, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.64034563, + "refHomGenotypeFreq": 0.42467222, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34860557, + "altHomGenotypeFreq": 0.13029364, + "hetGenotypeFreq": 0.43662387, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.6513944, + "refHomGenotypeFreq": 0.4330825, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28857717, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7114228, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.5625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38478434, + "altHomGenotypeFreq": 0.16693291, + "hetGenotypeFreq": 0.43570286, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.61521566, + "refHomGenotypeFreq": 0.39736423, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28936607, + "altHomGenotypeFreq": 0.08793456, + "hetGenotypeFreq": 0.402863, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.71063393, + "refHomGenotypeFreq": 0.5092025, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22340426, + "altHomGenotypeFreq": 0.04255319, + "hetGenotypeFreq": 0.36170214, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.7765958, + "refHomGenotypeFreq": 0.59574467, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32352942, + "altHomGenotypeFreq": 0.078431375, + "hetGenotypeFreq": 0.4901961, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.6764706, + "refHomGenotypeFreq": 0.43137255, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.580938, + "altHomGenotypeFreq": 0.33736762, + "hetGenotypeFreq": 0.4871407, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.41906202, + "refHomGenotypeFreq": 0.17549168, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41428572, + "altHomGenotypeFreq": 0.14285715, + "hetGenotypeFreq": 0.54285717, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.5857143, + "refHomGenotypeFreq": 0.31428573, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.20192307, + "hetGenotypeFreq": 0.48076922, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.31730768, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5694444, + "altHomGenotypeFreq": 0.3148148, + "hetGenotypeFreq": 0.5092593, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.43055555, + "refHomGenotypeFreq": 0.17592593, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32291666, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.6770833, + "refHomGenotypeFreq": 0.47916666, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.24778761, + "hetGenotypeFreq": 0.50442475, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.24778761, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27941176, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.34313726, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.7205882, + "refHomGenotypeFreq": 0.54901963, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26373628, + "altHomGenotypeFreq": 0.10989011, + "hetGenotypeFreq": 0.30769232, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.73626375, + "refHomGenotypeFreq": 0.5824176, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37634408, + "altHomGenotypeFreq": 0.13978495, + "hetGenotypeFreq": 0.47311828, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.6236559, + "refHomGenotypeFreq": 0.38709676, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34343433, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.50505054, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.65656567, + "refHomGenotypeFreq": 0.4040404, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2897196, + "altHomGenotypeFreq": 0.08411215, + "hetGenotypeFreq": 0.41121495, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.71028036, + "refHomGenotypeFreq": 0.5046729, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26744187, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.44186047, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.73255813, + "refHomGenotypeFreq": 0.5116279, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5729167, + "altHomGenotypeFreq": 0.34375, + "hetGenotypeFreq": 0.45833334, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.42708334, + "refHomGenotypeFreq": 0.19791667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54545456, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.5454545, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.45454547, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67676765, + "altHomGenotypeFreq": 0.47474748, + "hetGenotypeFreq": 0.4040404, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.32323232, + "refHomGenotypeFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28827038, + "altHomGenotypeFreq": 0.08946322, + "hetGenotypeFreq": 0.3976143, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.71172965, + "refHomGenotypeFreq": 0.51292247, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.56557375, + "altHomGenotypeFreq": 0.3442623, + "hetGenotypeFreq": 0.44262296, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.43442622, + "refHomGenotypeFreq": 0.21311475, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25504324, + "altHomGenotypeFreq": 0.07204611, + "hetGenotypeFreq": 0.36599424, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7449568, + "refHomGenotypeFreq": 0.5619597, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65294117, + "altHomGenotypeFreq": 0.3882353, + "hetGenotypeFreq": 0.5294118, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.34705883, + "refHomGenotypeFreq": 0.08235294, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2524272, + "altHomGenotypeFreq": 0.0776699, + "hetGenotypeFreq": 0.34951457, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.74757284, + "refHomGenotypeFreq": 0.57281554, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34343433, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.44444445, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.65656567, + "refHomGenotypeFreq": 0.43434343, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26635513, + "altHomGenotypeFreq": 0.07476635, + "hetGenotypeFreq": 0.38317758, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.73364484, + "refHomGenotypeFreq": 0.5420561, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31730768, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.3846154, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.6826923, + "refHomGenotypeFreq": 0.4903846, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.43434343, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.5050505, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21764706, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.34117648, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.7823529, + "refHomGenotypeFreq": 0.6117647, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40575397, + "altHomGenotypeFreq": 0.16269842, + "hetGenotypeFreq": 0.4861111, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.59424603, + "refHomGenotypeFreq": 0.35119048, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44660193, + "altHomGenotypeFreq": 0.23300971, + "hetGenotypeFreq": 0.42718446, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.5533981, + "refHomGenotypeFreq": 0.3398058, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29277968, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.7072203, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29658645, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.70341355, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29164505, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.70835495, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29395902, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.706041, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22788556, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22788556, + "id": "15:22788556:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22788556, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001630", + "name": "splice_region_variant" + }, + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.9390000104904175, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": -2.130000114440918, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "splice_region_variant", + "functionalScore": [ + { + "score": -0.2700004577636719, + "source": "cadd_raw" + }, + { + "score": 0.8100000023841858, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559072(ENSG00000259400):n.192+5A>G" + ], + "id": "rs12102024", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.36576682, + "altHomGenotypeFreq": 0.14365248, + "hetGenotypeFreq": 0.44422865, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6342332, + "refHomGenotypeFreq": 0.41211885, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.299389, + "altHomGenotypeFreq": 0.089613035, + "hetGenotypeFreq": 0.41955194, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.700611, + "refHomGenotypeFreq": 0.49083504, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43548387, + "altHomGenotypeFreq": 0.17990075, + "hetGenotypeFreq": 0.5111663, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5645161, + "refHomGenotypeFreq": 0.308933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28400955, + "altHomGenotypeFreq": 0.07637232, + "hetGenotypeFreq": 0.41527447, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7159904, + "refHomGenotypeFreq": 0.50835323, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3112583, + "altHomGenotypeFreq": 0.09271523, + "hetGenotypeFreq": 0.4370861, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.68874174, + "refHomGenotypeFreq": 0.47019866, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2859599, + "altHomGenotypeFreq": 0.07736389, + "hetGenotypeFreq": 0.41719198, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7140401, + "refHomGenotypeFreq": 0.5054441, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29156095, + "altHomGenotypeFreq": 0.080651626, + "hetGenotypeFreq": 0.42181867, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.70843905, + "refHomGenotypeFreq": 0.49752972, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5300276, + "altHomGenotypeFreq": 0.28647032, + "hetGenotypeFreq": 0.48711458, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.4699724, + "refHomGenotypeFreq": 0.2264151, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3701664, + "altHomGenotypeFreq": 0.14905086, + "hetGenotypeFreq": 0.4422311, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6298336, + "refHomGenotypeFreq": 0.40871808, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3603356, + "altHomGenotypeFreq": 0.13698828, + "hetGenotypeFreq": 0.44669464, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.6396644, + "refHomGenotypeFreq": 0.41631708, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3046092, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6953908, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2890625, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.7109375, + "refHomGenotypeFreq": 0.484375, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39077476, + "altHomGenotypeFreq": 0.17252396, + "hetGenotypeFreq": 0.43650162, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6092252, + "refHomGenotypeFreq": 0.39097443, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29038855, + "altHomGenotypeFreq": 0.08793456, + "hetGenotypeFreq": 0.404908, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.7096115, + "refHomGenotypeFreq": 0.50715744, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23404256, + "altHomGenotypeFreq": 0.05319149, + "hetGenotypeFreq": 0.36170214, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.7659575, + "refHomGenotypeFreq": 0.5851064, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32352942, + "altHomGenotypeFreq": 0.078431375, + "hetGenotypeFreq": 0.4901961, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.6764706, + "refHomGenotypeFreq": 0.43137255, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5794251, + "altHomGenotypeFreq": 0.33736762, + "hetGenotypeFreq": 0.48411497, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.42057487, + "refHomGenotypeFreq": 0.1785174, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41428572, + "altHomGenotypeFreq": 0.14285715, + "hetGenotypeFreq": 0.54285717, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.5857143, + "refHomGenotypeFreq": 0.31428573, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.20192307, + "hetGenotypeFreq": 0.48076922, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.31730768, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5648148, + "altHomGenotypeFreq": 0.30555555, + "hetGenotypeFreq": 0.5185185, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.4351852, + "refHomGenotypeFreq": 0.17592593, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32291666, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.6770833, + "refHomGenotypeFreq": 0.47916666, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49557522, + "altHomGenotypeFreq": 0.24778761, + "hetGenotypeFreq": 0.4955752, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.50442475, + "refHomGenotypeFreq": 0.25663716, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27941176, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.34313726, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.7205882, + "refHomGenotypeFreq": 0.54901963, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26923078, + "altHomGenotypeFreq": 0.10989011, + "hetGenotypeFreq": 0.31868133, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.7307692, + "refHomGenotypeFreq": 0.5714286, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37634408, + "altHomGenotypeFreq": 0.13978495, + "hetGenotypeFreq": 0.47311828, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.6236559, + "refHomGenotypeFreq": 0.38709676, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.33838382, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.49494952, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.66161615, + "refHomGenotypeFreq": 0.41414142, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3504673, + "altHomGenotypeFreq": 0.1495327, + "hetGenotypeFreq": 0.40186918, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.64953274, + "refHomGenotypeFreq": 0.44859812, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26744187, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.44186047, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.73255813, + "refHomGenotypeFreq": 0.5116279, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5729167, + "altHomGenotypeFreq": 0.34375, + "hetGenotypeFreq": 0.45833334, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.42708334, + "refHomGenotypeFreq": 0.19791667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54545456, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.5454545, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.45454547, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67676765, + "altHomGenotypeFreq": 0.47474748, + "hetGenotypeFreq": 0.4040404, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.32323232, + "refHomGenotypeFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.30715707, + "altHomGenotypeFreq": 0.10934394, + "hetGenotypeFreq": 0.39562625, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.69284296, + "refHomGenotypeFreq": 0.4950298, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.58196723, + "altHomGenotypeFreq": 0.36065573, + "hetGenotypeFreq": 0.44262296, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.4180328, + "refHomGenotypeFreq": 0.19672132, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27377522, + "altHomGenotypeFreq": 0.08357349, + "hetGenotypeFreq": 0.38040346, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7262248, + "refHomGenotypeFreq": 0.5360231, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64117646, + "altHomGenotypeFreq": 0.3882353, + "hetGenotypeFreq": 0.5058824, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.35882354, + "refHomGenotypeFreq": 0.105882354, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25728154, + "altHomGenotypeFreq": 0.0776699, + "hetGenotypeFreq": 0.3592233, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.74271846, + "refHomGenotypeFreq": 0.5631068, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34848484, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.45454544, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.6515151, + "refHomGenotypeFreq": 0.42424244, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27570093, + "altHomGenotypeFreq": 0.08411215, + "hetGenotypeFreq": 0.38317758, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.7242991, + "refHomGenotypeFreq": 0.53271025, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.33173078, + "altHomGenotypeFreq": 0.14423077, + "hetGenotypeFreq": 0.375, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.6682692, + "refHomGenotypeFreq": 0.48076922, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28787878, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.41414142, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.7121212, + "refHomGenotypeFreq": 0.5050505, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23529412, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.3529412, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.7647059, + "refHomGenotypeFreq": 0.5882353, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4047619, + "altHomGenotypeFreq": 0.16269842, + "hetGenotypeFreq": 0.48412699, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5952381, + "refHomGenotypeFreq": 0.3531746, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44660193, + "altHomGenotypeFreq": 0.23300971, + "hetGenotypeFreq": 0.42718446, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.5533981, + "refHomGenotypeFreq": 0.3398058, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27715355, + "altHomGenotypeFreq": 0.08239701, + "hetGenotypeFreq": 0.3895131, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.72284645, + "refHomGenotypeFreq": 0.5280899, + "study": "MGP" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31274796, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.68725204, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31645215, + "population": "TWINSUK_NODUP", + "refAllele": "T", + "refAlleleFreq": 0.68354785, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3116243, + "population": "ALSPAC", + "refAllele": "T", + "refAlleleFreq": 0.6883757, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31391585, + "population": "TWINSUK", + "refAllele": "T", + "refAlleleFreq": 0.68608415, + "study": "UK10K" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22789021, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22789021, + "id": "15:22789021:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22789021, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "cdnaPosition": 125, + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "exonOverlap": [ + { + "number": "3/8", + "percentage": 1.369863 + } + ], + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.9199999570846558, + "source": "gerp" + }, + { + "score": 0.5659999847412109, + "source": "phastCons" + }, + { + "score": 0.3930000066757202, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.4799995422363281, + "source": "cadd_raw" + }, + { + "score": 13.229999542236328, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559072(ENSG00000259400):n.125C>T" + ], + "id": "rs117190602", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.010820413, + "altHomGenotypeFreq": 6.459948E-5, + "hetGenotypeFreq": 0.021511627, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9891796, + "refHomGenotypeFreq": 0.9784238, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.009183673, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.018367346, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.99081635, + "refHomGenotypeFreq": 0.98163265, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 6.1804696E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0012360939, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.99938196, + "refHomGenotypeFreq": 0.9987639, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.00477327, + "altHomGenotypeFreq": 0.002386635, + "hetGenotypeFreq": 0.00477327, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.99522674, + "refHomGenotypeFreq": 0.9928401, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0033112583, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0066225166, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.9966887, + "refHomGenotypeFreq": 0.9933775, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.010017172, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.020034345, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.98998284, + "refHomGenotypeFreq": 0.9799656, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.016728872, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.033457745, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.9832711, + "refHomGenotypeFreq": 0.96654224, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0038972949, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0077945897, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9961027, + "refHomGenotypeFreq": 0.9922054, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.009881885, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01976377, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.9901181, + "refHomGenotypeFreq": 0.98023623, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.01197864, + "altHomGenotypeFreq": 1.4432098E-4, + "hetGenotypeFreq": 0.02366864, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.9880214, + "refHomGenotypeFreq": 0.97618705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.031062124, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9689379, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0039936104, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.00798722, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.99600637, + "refHomGenotypeFreq": 0.9920128, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.027472528, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.054945055, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.97252744, + "refHomGenotypeFreq": 0.94505495, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.014018691, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.028037382, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.9859813, + "refHomGenotypeFreq": 0.97196263, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.019880716, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03976143, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.9801193, + "refHomGenotypeFreq": 0.9602386, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.01010101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02020202, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.989899, + "refHomGenotypeFreq": 0.97979796, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.03271028, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06542056, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.96728975, + "refHomGenotypeFreq": 0.93457943, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.015151516, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.030303031, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.9848485, + "refHomGenotypeFreq": 0.969697, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0037453184, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.007490637, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9962547, + "refHomGenotypeFreq": 0.99250937, + "study": "MGP" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.01772018, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.98227984, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.015668718, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.9843313, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.019460302, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.9805397, + "study": "UK10K" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.015911542, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.9840885, + "study": "UK10K" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22789093, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22789093, + "id": "15:22789093:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22789093, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.0700000524520874, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": -0.9070000052452087, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.11999988555908203, + "source": "cadd_raw" + }, + { + "score": 1.6200000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000559072(ENSG00000259400):n.119+144G>A" + ], + "id": "rs11263660", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.36658233, + "altHomGenotypeFreq": 0.14402491, + "hetGenotypeFreq": 0.44511482, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.63341767, + "refHomGenotypeFreq": 0.41086027, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29896906, + "altHomGenotypeFreq": 0.08865979, + "hetGenotypeFreq": 0.42061856, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7010309, + "refHomGenotypeFreq": 0.49072164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43711084, + "altHomGenotypeFreq": 0.1780822, + "hetGenotypeFreq": 0.5180573, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.56288916, + "refHomGenotypeFreq": 0.30386052, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28417265, + "altHomGenotypeFreq": 0.07673861, + "hetGenotypeFreq": 0.41486812, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.71582735, + "refHomGenotypeFreq": 0.5083933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.307947, + "altHomGenotypeFreq": 0.08609272, + "hetGenotypeFreq": 0.4437086, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.69205296, + "refHomGenotypeFreq": 0.47019866, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28542742, + "altHomGenotypeFreq": 0.07745267, + "hetGenotypeFreq": 0.41594952, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.71457255, + "refHomGenotypeFreq": 0.5065978, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29175588, + "altHomGenotypeFreq": 0.080701284, + "hetGenotypeFreq": 0.42210922, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7082441, + "refHomGenotypeFreq": 0.49718952, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5323509, + "altHomGenotypeFreq": 0.28804973, + "hetGenotypeFreq": 0.48860234, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.4676491, + "refHomGenotypeFreq": 0.22334792, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37185812, + "altHomGenotypeFreq": 0.1498708, + "hetGenotypeFreq": 0.44397464, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.6281419, + "refHomGenotypeFreq": 0.40615457, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36007246, + "altHomGenotypeFreq": 0.1368116, + "hetGenotypeFreq": 0.44652173, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.6399275, + "refHomGenotypeFreq": 0.41666666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30661324, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6933868, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2890625, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.7109375, + "refHomGenotypeFreq": 0.484375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39077476, + "altHomGenotypeFreq": 0.17252396, + "hetGenotypeFreq": 0.4365016, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6092252, + "refHomGenotypeFreq": 0.39097443, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28936607, + "altHomGenotypeFreq": 0.08588957, + "hetGenotypeFreq": 0.40695298, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.71063393, + "refHomGenotypeFreq": 0.50715744, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23404256, + "altHomGenotypeFreq": 0.05319149, + "hetGenotypeFreq": 0.36170214, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.7659575, + "refHomGenotypeFreq": 0.5851064, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32352942, + "altHomGenotypeFreq": 0.078431375, + "hetGenotypeFreq": 0.4901961, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.6764706, + "refHomGenotypeFreq": 0.43137255, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.58018154, + "altHomGenotypeFreq": 0.33888048, + "hetGenotypeFreq": 0.48260212, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.41981846, + "refHomGenotypeFreq": 0.1785174, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41428572, + "altHomGenotypeFreq": 0.14285715, + "hetGenotypeFreq": 0.54285717, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.5857143, + "refHomGenotypeFreq": 0.31428573, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.20192307, + "hetGenotypeFreq": 0.48076922, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.31730768, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5694444, + "altHomGenotypeFreq": 0.3148148, + "hetGenotypeFreq": 0.5092593, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.43055555, + "refHomGenotypeFreq": 0.17592593, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32291666, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.6770833, + "refHomGenotypeFreq": 0.47916666, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.24778761, + "hetGenotypeFreq": 0.50442475, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.24778761, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27941176, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.34313726, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.7205882, + "refHomGenotypeFreq": 0.54901963, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26923078, + "altHomGenotypeFreq": 0.10989011, + "hetGenotypeFreq": 0.31868133, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.7307692, + "refHomGenotypeFreq": 0.5714286, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37634408, + "altHomGenotypeFreq": 0.13978495, + "hetGenotypeFreq": 0.47311828, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.6236559, + "refHomGenotypeFreq": 0.38709676, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33838382, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.49494952, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.66161615, + "refHomGenotypeFreq": 0.41414142, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3504673, + "altHomGenotypeFreq": 0.1495327, + "hetGenotypeFreq": 0.40186918, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.64953274, + "refHomGenotypeFreq": 0.44859812, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2616279, + "altHomGenotypeFreq": 0.034883723, + "hetGenotypeFreq": 0.45348838, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.7383721, + "refHomGenotypeFreq": 0.5116279, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5729167, + "altHomGenotypeFreq": 0.34375, + "hetGenotypeFreq": 0.45833334, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.42708334, + "refHomGenotypeFreq": 0.19791667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.540404, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.53535354, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.45959595, + "refHomGenotypeFreq": 0.1919192, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67676765, + "altHomGenotypeFreq": 0.47474748, + "hetGenotypeFreq": 0.4040404, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.32323232, + "refHomGenotypeFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30715707, + "altHomGenotypeFreq": 0.10934394, + "hetGenotypeFreq": 0.39562625, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.69284296, + "refHomGenotypeFreq": 0.4950298, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.58196723, + "altHomGenotypeFreq": 0.36065573, + "hetGenotypeFreq": 0.44262296, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.4180328, + "refHomGenotypeFreq": 0.19672132, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27377522, + "altHomGenotypeFreq": 0.08357349, + "hetGenotypeFreq": 0.38040346, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7262248, + "refHomGenotypeFreq": 0.5360231, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.64117646, + "altHomGenotypeFreq": 0.3882353, + "hetGenotypeFreq": 0.5058824, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.35882354, + "refHomGenotypeFreq": 0.105882354, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25728154, + "altHomGenotypeFreq": 0.0776699, + "hetGenotypeFreq": 0.3592233, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.74271846, + "refHomGenotypeFreq": 0.5631068, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34848484, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.45454544, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6515151, + "refHomGenotypeFreq": 0.42424244, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27570093, + "altHomGenotypeFreq": 0.08411215, + "hetGenotypeFreq": 0.38317758, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.7242991, + "refHomGenotypeFreq": 0.53271025, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33173078, + "altHomGenotypeFreq": 0.14423077, + "hetGenotypeFreq": 0.375, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.6682692, + "refHomGenotypeFreq": 0.48076922, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28787878, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.41414142, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.7121212, + "refHomGenotypeFreq": 0.5050505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23529412, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.3529412, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.7647059, + "refHomGenotypeFreq": 0.5882353, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4047619, + "altHomGenotypeFreq": 0.16269842, + "hetGenotypeFreq": 0.48412699, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5952381, + "refHomGenotypeFreq": 0.3531746, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44660193, + "altHomGenotypeFreq": 0.23300971, + "hetGenotypeFreq": 0.42718446, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5533981, + "refHomGenotypeFreq": 0.3398058, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.039325844, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.06367041, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.96067417, + "refHomGenotypeFreq": 0.92883897, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31340915, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.68659085, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31729156, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.68270844, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31214324, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.6878568, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31472492, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.6852751, + "study": "UK10K" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22789413, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22789413, + "id": "15:22789413:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22789413, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "transcribed_unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000259400", + "ensemblTranscriptId": "ENST00000559072", + "geneName": "ELMO2P1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.7799999713897705, + "source": "gerp" + }, + { + "score": 0.014999999664723873, + "source": "phastCons" + }, + { + "score": 0.18400000035762787, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.48999977111816406, + "source": "cadd_raw" + }, + { + "score": 7.400000095367432, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs36051746", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.2310231, + "altHomGenotypeFreq": 0.06302983, + "hetGenotypeFreq": 0.33598655, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7689769, + "refHomGenotypeFreq": 0.6009836, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27561477, + "altHomGenotypeFreq": 0.079918034, + "hetGenotypeFreq": 0.39139345, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.72438526, + "refHomGenotypeFreq": 0.52868855, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43945068, + "altHomGenotypeFreq": 0.18102372, + "hetGenotypeFreq": 0.5168539, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5605493, + "refHomGenotypeFreq": 0.30212235, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25598085, + "altHomGenotypeFreq": 0.057416268, + "hetGenotypeFreq": 0.39712918, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.74401915, + "refHomGenotypeFreq": 0.54545456, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.294702, + "altHomGenotypeFreq": 0.0794702, + "hetGenotypeFreq": 0.43046358, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.705298, + "refHomGenotypeFreq": 0.49006623, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28628802, + "altHomGenotypeFreq": 0.07745267, + "hetGenotypeFreq": 0.4176707, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.713712, + "refHomGenotypeFreq": 0.5048767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28989184, + "altHomGenotypeFreq": 0.07958339, + "hetGenotypeFreq": 0.4206169, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.71010816, + "refHomGenotypeFreq": 0.4997997, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.060050424, + "altHomGenotypeFreq": 0.005271602, + "hetGenotypeFreq": 0.10955764, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.9399496, + "refHomGenotypeFreq": 0.88517076, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22968385, + "altHomGenotypeFreq": 0.062177986, + "hetGenotypeFreq": 0.33501172, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7703162, + "refHomGenotypeFreq": 0.6028103, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23267756, + "altHomGenotypeFreq": 0.06408216, + "hetGenotypeFreq": 0.3371908, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7673224, + "refHomGenotypeFreq": 0.59872705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3046092, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6953908, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2734375, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.421875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.7265625, + "refHomGenotypeFreq": 0.515625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23003195, + "altHomGenotypeFreq": 0.07428115, + "hetGenotypeFreq": 0.3115016, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.76996803, + "refHomGenotypeFreq": 0.6142173, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2402863, + "altHomGenotypeFreq": 0.059304703, + "hetGenotypeFreq": 0.36196318, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.7597137, + "refHomGenotypeFreq": 0.57873213, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19148937, + "altHomGenotypeFreq": 0.04255319, + "hetGenotypeFreq": 0.29787233, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.80851066, + "refHomGenotypeFreq": 0.65957445, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26960784, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.4019608, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.73039216, + "refHomGenotypeFreq": 0.5294118, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.031770047, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06354009, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.96822995, + "refHomGenotypeFreq": 0.9364599, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41428572, + "altHomGenotypeFreq": 0.14285715, + "hetGenotypeFreq": 0.54285717, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.5857143, + "refHomGenotypeFreq": 0.31428573, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44230768, + "altHomGenotypeFreq": 0.20192307, + "hetGenotypeFreq": 0.48076922, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.5576923, + "refHomGenotypeFreq": 0.31730768, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.013888889, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.027777778, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.9861111, + "refHomGenotypeFreq": 0.9722222, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.296875, + "altHomGenotypeFreq": 0.104166664, + "hetGenotypeFreq": 0.3854167, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.703125, + "refHomGenotypeFreq": 0.5104167, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0088495575, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.017699115, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.99115044, + "refHomGenotypeFreq": 0.9823009, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23529412, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.3529412, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.7647059, + "refHomGenotypeFreq": 0.5882353, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26923078, + "altHomGenotypeFreq": 0.10989011, + "hetGenotypeFreq": 0.31868133, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.7307692, + "refHomGenotypeFreq": 0.5714286, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37634408, + "altHomGenotypeFreq": 0.13978495, + "hetGenotypeFreq": 0.47311828, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.6236559, + "refHomGenotypeFreq": 0.38709676, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33838382, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.49494952, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.66161615, + "refHomGenotypeFreq": 0.41414142, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34579438, + "altHomGenotypeFreq": 0.1495327, + "hetGenotypeFreq": 0.39252335, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.6542056, + "refHomGenotypeFreq": 0.45794392, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22093023, + "altHomGenotypeFreq": 0.023255814, + "hetGenotypeFreq": 0.39534885, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.7790698, + "refHomGenotypeFreq": 0.5813953, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.057291668, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11458333, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.9427083, + "refHomGenotypeFreq": 0.8854167, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.005050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01010101, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.9949495, + "refHomGenotypeFreq": 0.989899, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.05050505, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1010101, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.94949496, + "refHomGenotypeFreq": 0.8989899, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30417496, + "altHomGenotypeFreq": 0.10735586, + "hetGenotypeFreq": 0.39363816, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.69582504, + "refHomGenotypeFreq": 0.49900597, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09836066, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19672132, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.90163934, + "refHomGenotypeFreq": 0.8032787, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23198847, + "altHomGenotypeFreq": 0.06051873, + "hetGenotypeFreq": 0.3429395, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7680115, + "refHomGenotypeFreq": 0.59654176, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.01764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.03529412, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.9823529, + "refHomGenotypeFreq": 0.9647059, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17961165, + "altHomGenotypeFreq": 0.03883495, + "hetGenotypeFreq": 0.2815534, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.8203884, + "refHomGenotypeFreq": 0.6796116, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34848484, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.45454544, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6515151, + "refHomGenotypeFreq": 0.42424244, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26635513, + "altHomGenotypeFreq": 0.07476635, + "hetGenotypeFreq": 0.38317758, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.73364484, + "refHomGenotypeFreq": 0.5420561, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25480768, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.35576922, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.7451923, + "refHomGenotypeFreq": 0.5673077, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28787878, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.41414142, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.7121212, + "refHomGenotypeFreq": 0.5050505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21764706, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.31764707, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.7823529, + "refHomGenotypeFreq": 0.62352943, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4047619, + "altHomGenotypeFreq": 0.16269842, + "hetGenotypeFreq": 0.48412699, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5952381, + "refHomGenotypeFreq": 0.3531746, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44660193, + "altHomGenotypeFreq": 0.23300971, + "hetGenotypeFreq": 0.42718446, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5533981, + "refHomGenotypeFreq": 0.3398058, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25093633, + "altHomGenotypeFreq": 0.07116105, + "hetGenotypeFreq": 0.35955057, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7490637, + "refHomGenotypeFreq": 0.5692884, + "study": "MGP" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31116107, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.68883896, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31421375, + "population": "TWINSUK_NODUP", + "refAllele": "C", + "refAlleleFreq": 0.68578625, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31084588, + "population": "ALSPAC", + "refAllele": "C", + "refAlleleFreq": 0.68915415, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3114887, + "population": "TWINSUK", + "refAllele": "C", + "refAlleleFreq": 0.6885113, + "study": "UK10K" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22798670, + "id": "10571", + "percentageMatch": 0.928811, + "source": "genomicSuperDup", + "start": 22770997 + } + ], + "start": 22790022, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22790022, + "id": "15:22790022:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22790022, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.4900000095367432, + "source": "gerp" + }, + { + "score": 0.08799999952316284, + "source": "phastCons" + }, + { + "score": -1.2079999446868896, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": -0.31999969482421875, + "source": "cadd_raw" + }, + { + "score": 0.6000000238418579, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs12148404", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.17016202, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.34032404, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.829838, + "refHomGenotypeFreq": 0.65967596, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17789757, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35579515, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.8221024, + "refHomGenotypeFreq": 0.64420485, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2536101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5072202, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.74638987, + "refHomGenotypeFreq": 0.4927798, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24916944, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.49833888, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7508306, + "refHomGenotypeFreq": 0.5016611, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13709678, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.27419356, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.86290324, + "refHomGenotypeFreq": 0.7258065, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2201902, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4403804, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.7798098, + "refHomGenotypeFreq": 0.5596196, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20187096, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.40374193, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.798129, + "refHomGenotypeFreq": 0.5962581, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08460919, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16921838, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9153908, + "refHomGenotypeFreq": 0.83078164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16664192, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.33328384, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.83335805, + "refHomGenotypeFreq": 0.66671616, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1745344, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3490688, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.8254656, + "refHomGenotypeFreq": 0.65093124, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21932379, + "id": "10478", + "percentageMatch": 0.95735, + "source": "genomicSuperDup", + "start": 21908164 + } + ], + "start": 21927930, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21927930, + "id": "15:21927930:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21927930, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.11800000071525574, + "source": "gerp" + }, + { + "score": 0.02800000086426735, + "source": "phastCons" + }, + { + "score": -1.031999945640564, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 0.010000228881835938, + "source": "cadd_raw" + }, + { + "score": 2.7100000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs7173442", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.5283859, + "altHomGenotypeFreq": 0.07096472, + "hetGenotypeFreq": 0.91484237, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.47161412, + "refHomGenotypeFreq": 0.014192943, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54219407, + "altHomGenotypeFreq": 0.0907173, + "hetGenotypeFreq": 0.90295357, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.4578059, + "refHomGenotypeFreq": 0.006329114, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5212766, + "altHomGenotypeFreq": 0.046307884, + "hetGenotypeFreq": 0.9499374, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.4787234, + "refHomGenotypeFreq": 0.0037546933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.580292, + "altHomGenotypeFreq": 0.16545013, + "hetGenotypeFreq": 0.8296837, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.41970804, + "refHomGenotypeFreq": 0.00486618, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5104167, + "altHomGenotypeFreq": 0.034722224, + "hetGenotypeFreq": 0.9513889, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.48958334, + "refHomGenotypeFreq": 0.013888889, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5359882, + "altHomGenotypeFreq": 0.08023599, + "hetGenotypeFreq": 0.91150445, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.4640118, + "refHomGenotypeFreq": 0.008259587, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.531397, + "altHomGenotypeFreq": 0.07399724, + "hetGenotypeFreq": 0.91479945, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.46860304, + "refHomGenotypeFreq": 0.01120332, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.51541585, + "altHomGenotypeFreq": 0.056405354, + "hetGenotypeFreq": 0.918021, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.48458412, + "refHomGenotypeFreq": 0.025573613, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5284366, + "altHomGenotypeFreq": 0.07127299, + "hetGenotypeFreq": 0.9143272, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.4715634, + "refHomGenotypeFreq": 0.014399806, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5283231, + "altHomGenotypeFreq": 0.07058295, + "hetGenotypeFreq": 0.9154803, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.47167692, + "refHomGenotypeFreq": 0.01393676, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 9, + "copyNumber": 6.2, + "end": 21928096, + "percentageMatch": 0.75, + "period": 9, + "score": 51, + "sequence": "AAGAGAGAG", + "source": "trf", + "start": 21928042 + }, + { + "chromosome": "15", + "consensusSize": 12, + "copyNumber": 4.5, + "end": 21928095, + "percentageMatch": 0.8, + "period": 13, + "score": 58, + "sequence": "AAGAGAGAGGAG", + "source": "trf", + "start": 21928042 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21932379, + "id": "10478", + "percentageMatch": 0.95735, + "source": "genomicSuperDup", + "start": 21908164 + } + ], + "start": 21928042, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21928042, + "id": "15:21928042:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21928042, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2899999618530273, + "source": "gerp" + }, + { + "score": 0.652999997138977, + "source": "phastCons" + }, + { + "score": 0.39500001072883606, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": 1.8100004196166992, + "source": "cadd_raw" + }, + { + "score": 15.079999923706055, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs8025772", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.2536102, + "altHomGenotypeFreq": 1.7089635E-4, + "hetGenotypeFreq": 0.50687855, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7463898, + "refHomGenotypeFreq": 0.49295053, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27534246, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5506849, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.72465754, + "refHomGenotypeFreq": 0.44931507, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32508835, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6501767, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6749117, + "refHomGenotypeFreq": 0.34982333, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3046875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.609375, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6953125, + "refHomGenotypeFreq": 0.390625, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19827586, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39655173, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.80172414, + "refHomGenotypeFreq": 0.6034483, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30521935, + "altHomGenotypeFreq": 0.0015128592, + "hetGenotypeFreq": 0.607413, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.69478065, + "refHomGenotypeFreq": 0.39107412, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28395393, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.56790787, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.71604604, + "refHomGenotypeFreq": 0.4320921, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16816208, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.33632416, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8318379, + "refHomGenotypeFreq": 0.66367584, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24918744, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.49837488, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7508126, + "refHomGenotypeFreq": 0.5016251, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25906143, + "altHomGenotypeFreq": 3.8153375E-4, + "hetGenotypeFreq": 0.5173598, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.74093854, + "refHomGenotypeFreq": 0.48225868, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.04681648, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09363296, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.95318353, + "refHomGenotypeFreq": 0.90636706, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21936649, + "id": "10661", + "percentageMatch": 0.961183, + "source": "genomicSuperDup", + "start": 21932389 + } + ], + "start": 21936464, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21936464, + "id": "15:21936464:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21936464, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 740, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1443, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.8370000123977661, + "source": "gerp" + }, + { + "score": 0.6890000104904175, + "source": "phastCons" + }, + { + "score": 0.39500001072883606, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.640000343322754, + "source": "cadd_raw" + }, + { + "score": 14.09000015258789, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.740G>T", + "ENST00000556425(ENSG00000237161):n.1443G>T" + ], + "id": "rs754776854", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.021881687, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.043763373, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9781183, + "refHomGenotypeFreq": 0.9562366, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.023076924, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.046153847, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.97692305, + "refHomGenotypeFreq": 0.95384616, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.021197008, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.042394016, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.978803, + "refHomGenotypeFreq": 0.95760596, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.029411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05882353, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.9705882, + "refHomGenotypeFreq": 0.9411765, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.015069319, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.030138638, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.9849307, + "refHomGenotypeFreq": 0.9698614, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.036069468, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.072138935, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.96393055, + "refHomGenotypeFreq": 0.9278611, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.006063433, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.012126866, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.99393654, + "refHomGenotypeFreq": 0.98787314, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.022597112, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.045194224, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.97740287, + "refHomGenotypeFreq": 0.9548058, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.02099148, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04198296, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.9790085, + "refHomGenotypeFreq": 0.95801705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0037453184, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.007490637, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9962547, + "refHomGenotypeFreq": 0.99250937, + "study": "MGP" + } + ], + "reference": "C", + "start": 21936669, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21936669, + "id": "15:21936669:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 21936669, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 695, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1398, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.2029999941587448, + "source": "gerp" + }, + { + "score": 0.9010000228881836, + "source": "phastCons" + }, + { + "score": 0.39500001072883606, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.8299999237060547, + "source": "cadd_raw" + }, + { + "score": 15.210000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.695G>A", + "ENST00000556425(ENSG00000237161):n.1398G>A" + ], + "id": "rs7165094", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.09910089, + "altHomGenotypeFreq": 1.591343E-4, + "hetGenotypeFreq": 0.19796309, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9008593, + "refHomGenotypeFreq": 0.8018778, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07107232, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14214464, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.92892766, + "refHomGenotypeFreq": 0.8578554, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.008519004, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.017038008, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.991481, + "refHomGenotypeFreq": 0.982962, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.05191257, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10382514, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.94808745, + "refHomGenotypeFreq": 0.89617485, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09322034, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18644068, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.90677965, + "refHomGenotypeFreq": 0.8135593, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06761566, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13523132, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.9323843, + "refHomGenotypeFreq": 0.8647687, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.081969894, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1641034, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.9179483, + "refHomGenotypeFreq": 0.8358966, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17176022, + "altHomGenotypeFreq": 5.877167E-4, + "hetGenotypeFreq": 0.342345, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8282398, + "refHomGenotypeFreq": 0.6570673, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10025873, + "altHomGenotypeFreq": 2.8748024E-4, + "hetGenotypeFreq": 0.20008624, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.8996694, + "refHomGenotypeFreq": 0.7996263, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0976653, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1953306, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.9023347, + "refHomGenotypeFreq": 0.8046694, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.014981274, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.029962547, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.98501873, + "refHomGenotypeFreq": 0.97003746, + "study": "MGP" + } + ], + "reference": "C", + "start": 21936714, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21936714, + "id": "15:21936714:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21936714, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 694, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1397, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.23000000417232513, + "source": "gerp" + }, + { + "score": 0.9070000052452087, + "source": "phastCons" + }, + { + "score": 0.39500001072883606, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.5799999237060547, + "source": "cadd_raw" + }, + { + "score": 13.75, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.694C>T", + "ENST00000556425(ENSG00000237161):n.1397C>T" + ], + "id": "rs4984138", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.24830145, + "altHomGenotypeFreq": 5.4666144E-4, + "hetGenotypeFreq": 0.49550956, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.75169855, + "refHomGenotypeFreq": 0.5039438, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32788944, + "altHomGenotypeFreq": 0.0050251256, + "hetGenotypeFreq": 0.64572865, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.67211056, + "refHomGenotypeFreq": 0.34924623, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32125604, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6425121, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.67874396, + "refHomGenotypeFreq": 0.35748792, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.23556231, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.47112462, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.7644377, + "refHomGenotypeFreq": 0.52887535, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29032257, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.58064514, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7096774, + "refHomGenotypeFreq": 0.41935483, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3443029, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6886058, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6556971, + "refHomGenotypeFreq": 0.31139418, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3193991, + "altHomGenotypeFreq": 8.164598E-4, + "hetGenotypeFreq": 0.63716525, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.68060094, + "refHomGenotypeFreq": 0.3620183, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07731823, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15463646, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.92268175, + "refHomGenotypeFreq": 0.84536356, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24420904, + "altHomGenotypeFreq": 7.062147E-4, + "hetGenotypeFreq": 0.48700565, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.75579095, + "refHomGenotypeFreq": 0.51228815, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25336245, + "altHomGenotypeFreq": 3.4934498E-4, + "hetGenotypeFreq": 0.5060262, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7466376, + "refHomGenotypeFreq": 0.49362445, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.041198503, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08239701, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9588015, + "refHomGenotypeFreq": 0.917603, + "study": "MGP" + } + ], + "reference": "G", + "start": 21936715, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21936715, + "id": "15:21936715:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 21936715, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 639, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1342, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.9660000205039978, + "source": "gerp" + }, + { + "score": 0.23100000619888306, + "source": "phastCons" + }, + { + "score": 0.4090000092983246, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.26000022888183594, + "source": "cadd_raw" + }, + { + "score": 5.340000152587891, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.639A>G", + "ENST00000556425(ENSG00000237161):n.1342A>G" + ], + "id": "rs2203858", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.3202041, + "altHomGenotypeFreq": 4.783926E-4, + "hetGenotypeFreq": 0.63945144, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.67979586, + "refHomGenotypeFreq": 0.36007017, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3409091, + "altHomGenotypeFreq": 0.005050505, + "hetGenotypeFreq": 0.67171717, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.65909094, + "refHomGenotypeFreq": 0.32323232, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39258698, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.78517395, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.607413, + "refHomGenotypeFreq": 0.21482602, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25873017, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.51746035, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7412698, + "refHomGenotypeFreq": 0.48253968, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.292, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.584, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.708, + "refHomGenotypeFreq": 0.416, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3460183, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6920366, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.6539817, + "refHomGenotypeFreq": 0.30796334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32052752, + "altHomGenotypeFreq": 6.55308E-4, + "hetGenotypeFreq": 0.6397444, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.6794725, + "refHomGenotypeFreq": 0.35960028, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29982963, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.59965926, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.70017034, + "refHomGenotypeFreq": 0.4003407, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31856054, + "altHomGenotypeFreq": 5.746301E-4, + "hetGenotypeFreq": 0.63597184, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.68143946, + "refHomGenotypeFreq": 0.36345354, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.32225406, + "altHomGenotypeFreq": 3.5835872E-4, + "hetGenotypeFreq": 0.64379144, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.67774594, + "refHomGenotypeFreq": 0.35585022, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1610487, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3220974, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8389513, + "refHomGenotypeFreq": 0.67790264, + "study": "MGP" + } + ], + "reference": "T", + "start": 21936770, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21936770, + "id": "15:21936770:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21936770, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 608, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1311, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.6799999475479126, + "source": "gerp" + }, + { + "score": 0.027000000700354576, + "source": "phastCons" + }, + { + "score": -0.47600001096725464, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.43000030517578125, + "source": "cadd_raw" + }, + { + "score": 0.3199999928474426, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.608A>G", + "ENST00000556425(ENSG00000237161):n.1311A>G" + ], + "id": "rs61999620", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.04867987, + "altHomGenotypeFreq": 7.1746304E-5, + "hetGenotypeFreq": 0.09721624, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9513201, + "refHomGenotypeFreq": 0.902712, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.043879908, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.087759815, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.9561201, + "refHomGenotypeFreq": 0.9122402, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.00955414, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01910828, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.99044585, + "refHomGenotypeFreq": 0.9808917, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.042857144, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08571429, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.95714283, + "refHomGenotypeFreq": 0.9142857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.06870229, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13740458, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.9312977, + "refHomGenotypeFreq": 0.86259544, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.034919653, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.069839306, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.9650803, + "refHomGenotypeFreq": 0.9301607, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.06160024, + "altHomGenotypeFreq": 1.5153812E-4, + "hetGenotypeFreq": 0.12289741, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.93839973, + "refHomGenotypeFreq": 0.87695104, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.04100828, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08201656, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9589917, + "refHomGenotypeFreq": 0.9179835, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.047145274, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09429055, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.95285475, + "refHomGenotypeFreq": 0.90570945, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.050568093, + "altHomGenotypeFreq": 1.6002561E-4, + "hetGenotypeFreq": 0.10081613, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.9494319, + "refHomGenotypeFreq": 0.89902383, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.029962547, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.059925094, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.97003746, + "refHomGenotypeFreq": 0.9400749, + "study": "MGP" + } + ], + "reference": "T", + "start": 21936801, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21936801, + "id": "15:21936801:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21936801, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 496, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1199, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.7100000381469727, + "source": "gerp" + }, + { + "score": 0.05700000002980232, + "source": "phastCons" + }, + { + "score": 0.4090000092983246, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.9600000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.496T>C", + "ENST00000556425(ENSG00000237161):n.1199T>C" + ], + "id": "rs4984137", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.3701484, + "altHomGenotypeFreq": 0.0037508153, + "hetGenotypeFreq": 0.7327952, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6298516, + "refHomGenotypeFreq": 0.26345402, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4028133, + "altHomGenotypeFreq": 0.0076726344, + "hetGenotypeFreq": 0.79028136, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.5971867, + "refHomGenotypeFreq": 0.20204604, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4491018, + "altHomGenotypeFreq": 0.004491018, + "hetGenotypeFreq": 0.88922155, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5508982, + "refHomGenotypeFreq": 0.10628743, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4532967, + "altHomGenotypeFreq": 0.021978023, + "hetGenotypeFreq": 0.86263734, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5467033, + "refHomGenotypeFreq": 0.115384616, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40186915, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.78504676, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5981308, + "refHomGenotypeFreq": 0.20560747, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43316832, + "altHomGenotypeFreq": 0.0021216408, + "hetGenotypeFreq": 0.8620933, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5668317, + "refHomGenotypeFreq": 0.13578501, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40078753, + "altHomGenotypeFreq": 0.0032528676, + "hetGenotypeFreq": 0.79506934, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.59921247, + "refHomGenotypeFreq": 0.2016778, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26458752, + "altHomGenotypeFreq": 0.0025869503, + "hetGenotypeFreq": 0.5240011, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7354125, + "refHomGenotypeFreq": 0.4734119, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36928296, + "altHomGenotypeFreq": 0.0039834757, + "hetGenotypeFreq": 0.730599, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.63071704, + "refHomGenotypeFreq": 0.26541752, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37121764, + "altHomGenotypeFreq": 0.0034633612, + "hetGenotypeFreq": 0.73550856, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.62878233, + "refHomGenotypeFreq": 0.26102808, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28089887, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.54681647, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.71910113, + "refHomGenotypeFreq": 0.4456929, + "study": "MGP" + } + ], + "reference": "A", + "start": 21936913, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21936913, + "id": "15:21936913:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21936913, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 484, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1187, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.7379999756813049, + "source": "gerp" + }, + { + "score": 0.009999999776482582, + "source": "phastCons" + }, + { + "score": 0.5, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.18999958038330078, + "source": "cadd_raw" + }, + { + "score": 4.639999866485596, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.484G>A", + "ENST00000556425(ENSG00000237161):n.1187G>A" + ], + "id": "rs28423023", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.26049602, + "altHomGenotypeFreq": 1.6929067E-4, + "hetGenotypeFreq": 0.5206535, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.739504, + "refHomGenotypeFreq": 0.47917724, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.525, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7375, + "refHomGenotypeFreq": 0.475, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32210708, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.64421415, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6778929, + "refHomGenotypeFreq": 0.35578585, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31012657, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.62025315, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6898734, + "refHomGenotypeFreq": 0.37974682, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.44, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.78, + "refHomGenotypeFreq": 0.56, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30810398, + "altHomGenotypeFreq": 0.001529052, + "hetGenotypeFreq": 0.6131498, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.691896, + "refHomGenotypeFreq": 0.3853211, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2836386, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5672772, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7163614, + "refHomGenotypeFreq": 0.43272278, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19069025, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3813805, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8093097, + "refHomGenotypeFreq": 0.6186195, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2564437, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5128874, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7435563, + "refHomGenotypeFreq": 0.4871126, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26548338, + "altHomGenotypeFreq": 3.776435E-4, + "hetGenotypeFreq": 0.5302115, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7345166, + "refHomGenotypeFreq": 0.46941087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1928839, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3857678, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8071161, + "refHomGenotypeFreq": 0.6142322, + "study": "MGP" + } + ], + "reference": "C", + "start": 21936925, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21936925, + "id": "15:21936925:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21936925, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 417, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1120, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.609999895095825, + "source": "gerp" + }, + { + "score": 0.02500000037252903, + "source": "phastCons" + }, + { + "score": -1.399999976158142, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.25, + "source": "cadd_raw" + }, + { + "score": 0.8700000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.417G>A", + "ENST00000556425(ENSG00000237161):n.1120G>A" + ], + "id": "rs4984136", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.5033273, + "altHomGenotypeFreq": 0.04949397, + "hetGenotypeFreq": 0.9076667, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.49667266, + "refHomGenotypeFreq": 0.04283932, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50765866, + "altHomGenotypeFreq": 0.054704595, + "hetGenotypeFreq": 0.9059081, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.49234137, + "refHomGenotypeFreq": 0.039387308, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50780237, + "altHomGenotypeFreq": 0.027308192, + "hetGenotypeFreq": 0.9609883, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.49219766, + "refHomGenotypeFreq": 0.011703511, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5580247, + "altHomGenotypeFreq": 0.14074074, + "hetGenotypeFreq": 0.8345679, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.4419753, + "refHomGenotypeFreq": 0.024691358, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.51086956, + "altHomGenotypeFreq": 0.028985508, + "hetGenotypeFreq": 0.9637681, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.48913044, + "refHomGenotypeFreq": 0.007246377, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5239952, + "altHomGenotypeFreq": 0.058188364, + "hetGenotypeFreq": 0.9316137, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.4760048, + "refHomGenotypeFreq": 0.010197961, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50890714, + "altHomGenotypeFreq": 0.0540082, + "hetGenotypeFreq": 0.90979785, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.4910929, + "refHomGenotypeFreq": 0.036193978, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4771509, + "altHomGenotypeFreq": 0.03267807, + "hetGenotypeFreq": 0.88894564, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.52284914, + "refHomGenotypeFreq": 0.07837631, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50288004, + "altHomGenotypeFreq": 0.049837217, + "hetGenotypeFreq": 0.90608567, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.49711996, + "refHomGenotypeFreq": 0.044077136, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.503882, + "altHomGenotypeFreq": 0.049068324, + "hetGenotypeFreq": 0.9096273, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.496118, + "refHomGenotypeFreq": 0.041304346, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46067417, + "altHomGenotypeFreq": 0.041198503, + "hetGenotypeFreq": 0.8389513, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.53932583, + "refHomGenotypeFreq": 0.11985019, + "study": "MGP" + } + ], + "reference": "C", + "start": 21936992, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21936992, + "id": "15:21936992:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21936992, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 312, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 1015, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.6399999856948853, + "source": "gerp" + }, + { + "score": 0.05299999937415123, + "source": "phastCons" + }, + { + "score": -2.2980000972747803, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.06999969482421875, + "source": "cadd_raw" + }, + { + "score": 2.009999990463257, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.312C>T", + "ENST00000556425(ENSG00000237161):n.1015C>T" + ], + "id": "rs4984135", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.36884028, + "altHomGenotypeFreq": 0.0033842344, + "hetGenotypeFreq": 0.7309121, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6311597, + "refHomGenotypeFreq": 0.26570368, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40025252, + "altHomGenotypeFreq": 0.007575758, + "hetGenotypeFreq": 0.78535354, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5997475, + "refHomGenotypeFreq": 0.20707071, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4479638, + "altHomGenotypeFreq": 0.0030165913, + "hetGenotypeFreq": 0.8898944, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5520362, + "refHomGenotypeFreq": 0.10708899, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45592287, + "altHomGenotypeFreq": 0.022038568, + "hetGenotypeFreq": 0.8677686, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.54407716, + "refHomGenotypeFreq": 0.110192835, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41363636, + "altHomGenotypeFreq": 0.009090909, + "hetGenotypeFreq": 0.8090909, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5863636, + "refHomGenotypeFreq": 0.18181819, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4329529, + "altHomGenotypeFreq": 0.0021398002, + "hetGenotypeFreq": 0.86162627, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.56704706, + "refHomGenotypeFreq": 0.13623396, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40140113, + "altHomGenotypeFreq": 0.0032866285, + "hetGenotypeFreq": 0.796229, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.59859884, + "refHomGenotypeFreq": 0.20048435, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25720587, + "altHomGenotypeFreq": 0.0014705883, + "hetGenotypeFreq": 0.5114706, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7427941, + "refHomGenotypeFreq": 0.48705882, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36835423, + "altHomGenotypeFreq": 0.0034348865, + "hetGenotypeFreq": 0.7298387, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.63164574, + "refHomGenotypeFreq": 0.2667264, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36944085, + "altHomGenotypeFreq": 0.003321646, + "hetGenotypeFreq": 0.7322384, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.63055915, + "refHomGenotypeFreq": 0.26443994, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29962546, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.58426964, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.70037454, + "refHomGenotypeFreq": 0.4082397, + "study": "MGP" + } + ], + "reference": "G", + "start": 21937097, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937097, + "id": "15:21937097:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 21937097, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 241, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 944, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.5099999904632568, + "source": "gerp" + }, + { + "score": 0.008999999612569809, + "source": "phastCons" + }, + { + "score": -0.527999997138977, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.36999988555908203, + "source": "cadd_raw" + }, + { + "score": 6.380000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.241G>A", + "ENST00000556425(ENSG00000237161):n.944G>A" + ], + "id": "rs12185110", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.30571383, + "altHomGenotypeFreq": 9.496676E-4, + "hetGenotypeFreq": 0.6095283, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.69428617, + "refHomGenotypeFreq": 0.389522, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.35906863, + "altHomGenotypeFreq": 0.004901961, + "hetGenotypeFreq": 0.7083333, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.64093137, + "refHomGenotypeFreq": 0.2867647, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33707866, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6741573, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.66292137, + "refHomGenotypeFreq": 0.3258427, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2597015, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.519403, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7402985, + "refHomGenotypeFreq": 0.48059702, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.324, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.648, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.676, + "refHomGenotypeFreq": 0.352, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3669693, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7339386, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6330307, + "refHomGenotypeFreq": 0.26606146, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3556726, + "altHomGenotypeFreq": 0.001458671, + "hetGenotypeFreq": 0.7084279, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.6443274, + "refHomGenotypeFreq": 0.29011345, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18600057, + "altHomGenotypeFreq": 2.8224668E-4, + "hetGenotypeFreq": 0.37143663, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8139994, + "refHomGenotypeFreq": 0.6282811, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3010768, + "altHomGenotypeFreq": 0.0012921751, + "hetGenotypeFreq": 0.59956926, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.6989232, + "refHomGenotypeFreq": 0.39913854, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31140894, + "altHomGenotypeFreq": 5.2900723E-4, + "hetGenotypeFreq": 0.62175983, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.68859106, + "refHomGenotypeFreq": 0.37771118, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3108614, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.6142322, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6891386, + "refHomGenotypeFreq": 0.38202247, + "study": "MGP" + } + ], + "reference": "C", + "start": 21937168, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937168, + "id": "15:21937168:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21937168, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 75, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.11778563 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 778, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.259999990463257, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.7260000109672546, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.5600004196166992, + "source": "cadd_raw" + }, + { + "score": 0.1599999964237213, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000431494(ENSG00000237161):n.75T>C", + "ENST00000556425(ENSG00000237161):n.778T>C" + ], + "id": "rs8035380", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.36461678, + "altHomGenotypeFreq": 0.0036222935, + "hetGenotypeFreq": 0.721989, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.63538325, + "refHomGenotypeFreq": 0.27438873, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3994709, + "altHomGenotypeFreq": 0.007936508, + "hetGenotypeFreq": 0.7830688, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6005291, + "refHomGenotypeFreq": 0.20899472, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44248468, + "altHomGenotypeFreq": 0.0030674846, + "hetGenotypeFreq": 0.87883437, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5575153, + "refHomGenotypeFreq": 0.11809816, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45543176, + "altHomGenotypeFreq": 0.022284122, + "hetGenotypeFreq": 0.8662953, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.54456824, + "refHomGenotypeFreq": 0.11142062, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4082569, + "altHomGenotypeFreq": 0.0091743115, + "hetGenotypeFreq": 0.79816514, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5917431, + "refHomGenotypeFreq": 0.19266056, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42676055, + "altHomGenotypeFreq": 0.0021126762, + "hetGenotypeFreq": 0.8492958, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.57323945, + "refHomGenotypeFreq": 0.14859155, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3963078, + "altHomGenotypeFreq": 0.0032781227, + "hetGenotypeFreq": 0.7860594, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6036922, + "refHomGenotypeFreq": 0.21066253, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25589862, + "altHomGenotypeFreq": 0.0023303234, + "hetGenotypeFreq": 0.50713664, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.74410135, + "refHomGenotypeFreq": 0.49053305, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36477426, + "altHomGenotypeFreq": 0.0038742363, + "hetGenotypeFreq": 0.7218, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.6352258, + "refHomGenotypeFreq": 0.27432573, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36442238, + "altHomGenotypeFreq": 0.0033112583, + "hetGenotypeFreq": 0.7222222, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6355776, + "refHomGenotypeFreq": 0.2744665, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17977528, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.3445693, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8202247, + "refHomGenotypeFreq": 0.6479401, + "study": "MGP" + } + ], + "reference": "A", + "start": 21937334, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937334, + "id": "15:21937334:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21937334, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 693, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.549999952316284, + "source": "gerp" + }, + { + "score": 0.02199999988079071, + "source": "phastCons" + }, + { + "score": 0.40400001406669617, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.5100002288818359, + "source": "cadd_raw" + }, + { + "score": 0.20000000298023224, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.693T>A" + ], + "id": "rs7179663", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.3182039, + "altHomGenotypeFreq": 4.854369E-4, + "hetGenotypeFreq": 0.6354369, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.68179613, + "refHomGenotypeFreq": 0.36407766, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34210527, + "altHomGenotypeFreq": 0.0050125313, + "hetGenotypeFreq": 0.67418545, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.65789473, + "refHomGenotypeFreq": 0.320802, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38431677, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.76863354, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.61568326, + "refHomGenotypeFreq": 0.23136646, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2631579, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5263158, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.7368421, + "refHomGenotypeFreq": 0.47368422, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28861788, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.57723576, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7113821, + "refHomGenotypeFreq": 0.42276424, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34393063, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.68786126, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.65606934, + "refHomGenotypeFreq": 0.31213874, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3197684, + "altHomGenotypeFreq": 6.617039E-4, + "hetGenotypeFreq": 0.6382134, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6802316, + "refHomGenotypeFreq": 0.3611249, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29619408, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.59238815, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.7038059, + "refHomGenotypeFreq": 0.40761185, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31582797, + "altHomGenotypeFreq": 5.851375E-4, + "hetGenotypeFreq": 0.63048565, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.68417203, + "refHomGenotypeFreq": 0.3689292, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3211441, + "altHomGenotypeFreq": 3.6205648E-4, + "hetGenotypeFreq": 0.6415641, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6788559, + "refHomGenotypeFreq": 0.35807386, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19662921, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39325842, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8033708, + "refHomGenotypeFreq": 0.60674155, + "study": "MGP" + } + ], + "reference": "A", + "start": 21937419, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937419, + "id": "15:21937419:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 21937419, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 584, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.0199999809265137, + "source": "gerp" + }, + { + "score": 0.01600000075995922, + "source": "phastCons" + }, + { + "score": 0.5, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.359999895095825, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.584C>T" + ], + "id": "rs60162183", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.16877338, + "altHomGenotypeFreq": 2.4948025E-4, + "hetGenotypeFreq": 0.33704782, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8312266, + "refHomGenotypeFreq": 0.6627027, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18253969, + "altHomGenotypeFreq": 0.0026455026, + "hetGenotypeFreq": 0.35978836, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.8174603, + "refHomGenotypeFreq": 0.63756615, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30884954, + "altHomGenotypeFreq": 0.003539823, + "hetGenotypeFreq": 0.6106195, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6911504, + "refHomGenotypeFreq": 0.3858407, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20153846, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.40307692, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.79846156, + "refHomGenotypeFreq": 0.59692305, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21698113, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.43396226, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7830189, + "refHomGenotypeFreq": 0.5660377, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1864344, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3728688, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.8135656, + "refHomGenotypeFreq": 0.6271312, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17592755, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3518551, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.8240724, + "refHomGenotypeFreq": 0.6481449, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.123236515, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24647303, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.87676346, + "refHomGenotypeFreq": 0.753527, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17146084, + "altHomGenotypeFreq": 3.0120483E-4, + "hetGenotypeFreq": 0.34231928, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.82853913, + "refHomGenotypeFreq": 0.6573795, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1654596, + "altHomGenotypeFreq": 1.8570102E-4, + "hetGenotypeFreq": 0.3305478, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.83454037, + "refHomGenotypeFreq": 0.66926646, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.086142324, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17228465, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9138577, + "refHomGenotypeFreq": 0.82771534, + "study": "MGP" + } + ], + "reference": "G", + "start": 21937528, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937528, + "id": "15:21937528:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 21937528, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 559, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.4800000190734863, + "source": "gerp" + }, + { + "score": 0.020999999716877937, + "source": "phastCons" + }, + { + "score": 0.4090000092983246, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.2200002670288086, + "source": "cadd_raw" + }, + { + "score": 1, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.559A>G" + ], + "id": "rs28626937", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.25909922, + "altHomGenotypeFreq": 1.6619578E-4, + "hetGenotypeFreq": 0.5178661, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.74090075, + "refHomGenotypeFreq": 0.48196775, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27111718, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.54223436, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.72888285, + "refHomGenotypeFreq": 0.45776567, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3237774, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6475548, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.6762226, + "refHomGenotypeFreq": 0.3524452, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31076923, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.62153846, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.68923074, + "refHomGenotypeFreq": 0.37846154, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.21666667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.43333334, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.78333336, + "refHomGenotypeFreq": 0.56666666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3078067, + "altHomGenotypeFreq": 0.0014869889, + "hetGenotypeFreq": 0.6126394, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.6921933, + "refHomGenotypeFreq": 0.38587362, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2789382, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5578764, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.72106177, + "refHomGenotypeFreq": 0.4421236, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19299237, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.38598475, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.8070076, + "refHomGenotypeFreq": 0.6140153, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25532395, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5106479, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.74467605, + "refHomGenotypeFreq": 0.48935214, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.26379055, + "altHomGenotypeFreq": 3.727171E-4, + "hetGenotypeFreq": 0.5268356, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.73620945, + "refHomGenotypeFreq": 0.47279164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20973782, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.41947564, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.79026216, + "refHomGenotypeFreq": 0.5805243, + "study": "MGP" + } + ], + "reference": "T", + "start": 21937553, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937553, + "id": "15:21937553:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21937553, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 520, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.3930000066757202, + "source": "gerp" + }, + { + "score": 0.007000000216066837, + "source": "phastCons" + }, + { + "score": -0.3540000021457672, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.43000030517578125, + "source": "cadd_raw" + }, + { + "score": 0.33000001311302185, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.520A>G" + ], + "id": "rs4984134", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.8361799, + "altHomGenotypeFreq": 0.6723598, + "hetGenotypeFreq": 0.32764015, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.16382007, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8041237, + "altHomGenotypeFreq": 0.6082474, + "hetGenotypeFreq": 0.39175257, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.19587629, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7531407, + "altHomGenotypeFreq": 0.50628144, + "hetGenotypeFreq": 0.4937186, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.2468593, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8633093, + "altHomGenotypeFreq": 0.7266187, + "hetGenotypeFreq": 0.2733813, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.13669065, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73333335, + "altHomGenotypeFreq": 0.46666667, + "hetGenotypeFreq": 0.53333336, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.26666668, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8146002, + "altHomGenotypeFreq": 0.62920046, + "hetGenotypeFreq": 0.37079954, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.18539977, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8111186, + "altHomGenotypeFreq": 0.6222372, + "hetGenotypeFreq": 0.3777628, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.1888814, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.907271, + "altHomGenotypeFreq": 0.8145421, + "hetGenotypeFreq": 0.18545789, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.09272894, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83669144, + "altHomGenotypeFreq": 0.6733828, + "hetGenotypeFreq": 0.32661718, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.16330859, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8355465, + "altHomGenotypeFreq": 0.6710929, + "hetGenotypeFreq": 0.32890704, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.16445352, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8984375, + "altHomGenotypeFreq": 0.796875, + "hetGenotypeFreq": 0.203125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.1015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8566294, + "altHomGenotypeFreq": 0.7132588, + "hetGenotypeFreq": 0.28674123, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.14337061, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.80368096, + "altHomGenotypeFreq": 0.607362, + "hetGenotypeFreq": 0.39263803, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.19631901, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.87765956, + "altHomGenotypeFreq": 0.7553192, + "hetGenotypeFreq": 0.24468085, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.122340426, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8137255, + "altHomGenotypeFreq": 0.627451, + "hetGenotypeFreq": 0.37254903, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.18627451, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.93570346, + "altHomGenotypeFreq": 0.871407, + "hetGenotypeFreq": 0.12859304, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.06429652, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78571427, + "altHomGenotypeFreq": 0.5714286, + "hetGenotypeFreq": 0.42857143, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.21428572, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8701923, + "altHomGenotypeFreq": 0.74038464, + "hetGenotypeFreq": 0.2596154, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.1298077, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9398148, + "altHomGenotypeFreq": 0.8796296, + "hetGenotypeFreq": 0.12037037, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.060185187, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.828125, + "altHomGenotypeFreq": 0.65625, + "hetGenotypeFreq": 0.34375, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.171875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9336283, + "altHomGenotypeFreq": 0.86725664, + "hetGenotypeFreq": 0.13274336, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.06637168, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.79901963, + "altHomGenotypeFreq": 0.5980392, + "hetGenotypeFreq": 0.4019608, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.2009804, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8296703, + "altHomGenotypeFreq": 0.6593407, + "hetGenotypeFreq": 0.34065935, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.17032968, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7741935, + "altHomGenotypeFreq": 0.5483871, + "hetGenotypeFreq": 0.45161292, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.22580644, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7676768, + "altHomGenotypeFreq": 0.53535354, + "hetGenotypeFreq": 0.46464646, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.23232323, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8130841, + "altHomGenotypeFreq": 0.62616825, + "hetGenotypeFreq": 0.37383178, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.18691589, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8197674, + "altHomGenotypeFreq": 0.6395349, + "hetGenotypeFreq": 0.3604651, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.18023255, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9166667, + "altHomGenotypeFreq": 0.8333333, + "hetGenotypeFreq": 0.16666666, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.083333336, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.111111104, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82703775, + "altHomGenotypeFreq": 0.65407556, + "hetGenotypeFreq": 0.34592444, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.17296223, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94262296, + "altHomGenotypeFreq": 0.8852459, + "hetGenotypeFreq": 0.114754096, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.057377048, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90057635, + "altHomGenotypeFreq": 0.80115277, + "hetGenotypeFreq": 0.19884726, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.09942363, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.92941177, + "altHomGenotypeFreq": 0.85882354, + "hetGenotypeFreq": 0.14117648, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.07058824, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7621359, + "altHomGenotypeFreq": 0.52427185, + "hetGenotypeFreq": 0.47572815, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.23786408, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83838385, + "altHomGenotypeFreq": 0.67676765, + "hetGenotypeFreq": 0.32323232, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.16161616, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75233644, + "altHomGenotypeFreq": 0.5046729, + "hetGenotypeFreq": 0.49532712, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.24766356, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8942308, + "altHomGenotypeFreq": 0.78846157, + "hetGenotypeFreq": 0.21153846, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.10576923, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90909094, + "altHomGenotypeFreq": 0.8181818, + "hetGenotypeFreq": 0.18181819, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.09090909, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9352941, + "altHomGenotypeFreq": 0.87058824, + "hetGenotypeFreq": 0.12941177, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.064705886, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8035714, + "altHomGenotypeFreq": 0.60714287, + "hetGenotypeFreq": 0.39285713, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.19642857, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.815534, + "altHomGenotypeFreq": 0.63106793, + "hetGenotypeFreq": 0.36893204, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.18446602, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.79588014, + "altHomGenotypeFreq": 0.60299623, + "hetGenotypeFreq": 0.3857678, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.20411985, + "refHomGenotypeFreq": 0.011235955, + "study": "MGP" + } + ], + "reference": "T", + "start": 21937592, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937592, + "id": "15:21937592:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21937592, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 454, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.2799999713897705, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -2.24399995803833, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.22999954223632812, + "source": "cadd_raw" + }, + { + "score": 0.9700000286102295, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.454G>A" + ], + "id": "rs28502402", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.26379746, + "altHomGenotypeFreq": 1.6877637E-4, + "hetGenotypeFreq": 0.5272574, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.73620254, + "refHomGenotypeFreq": 0.47257385, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5555556, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.44444445, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33110368, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.66220737, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6688963, + "refHomGenotypeFreq": 0.33779263, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31441718, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.62883437, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6855828, + "refHomGenotypeFreq": 0.37116563, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20614035, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4122807, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.79385966, + "refHomGenotypeFreq": 0.5877193, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31165412, + "altHomGenotypeFreq": 0.0015037594, + "hetGenotypeFreq": 0.62030077, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.68834585, + "refHomGenotypeFreq": 0.3781955, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28560016, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5712003, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7143999, + "refHomGenotypeFreq": 0.42879972, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1943407, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3886814, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8056593, + "refHomGenotypeFreq": 0.6113186, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25977996, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5195599, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.74022007, + "refHomGenotypeFreq": 0.4804401, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26875237, + "altHomGenotypeFreq": 3.7693177E-4, + "hetGenotypeFreq": 0.53675085, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.73124766, + "refHomGenotypeFreq": 0.4628722, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19662921, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39325842, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8033708, + "refHomGenotypeFreq": 0.60674155, + "study": "MGP" + } + ], + "reference": "C", + "start": 21937658, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937658, + "id": "15:21937658:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21937658, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 303, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.75, + "source": "gerp" + }, + { + "score": 0.010999999940395355, + "source": "phastCons" + }, + { + "score": -0.6470000147819519, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 0.6700000166893005, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.303A>G" + ], + "id": "rs113298770", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.045566592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.091133185, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9544334, + "refHomGenotypeFreq": 0.9088668, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.025842696, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.051685393, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.9741573, + "refHomGenotypeFreq": 0.9483146, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.010376135, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02075227, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.98962384, + "refHomGenotypeFreq": 0.97924775, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.016752576, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.033505153, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.9832474, + "refHomGenotypeFreq": 0.96649486, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.024647888, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.049295776, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.9753521, + "refHomGenotypeFreq": 0.9507042, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.021909745, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04381949, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.9780902, + "refHomGenotypeFreq": 0.9561805, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.03180737, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06361474, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.96819264, + "refHomGenotypeFreq": 0.9363853, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09274406, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18548812, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.90725595, + "refHomGenotypeFreq": 0.8145119, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.04532931, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09065862, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.95467067, + "refHomGenotypeFreq": 0.9093414, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.045859665, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09171933, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.9541403, + "refHomGenotypeFreq": 0.9082807, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0056179776, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.011235955, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.994382, + "refHomGenotypeFreq": 0.98876405, + "study": "MGP" + } + ], + "reference": "T", + "start": 21937809, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937809, + "id": "15:21937809:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21937809, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 293, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.8799999952316284, + "source": "gerp" + }, + { + "score": 0.04600000008940697, + "source": "phastCons" + }, + { + "score": 0.5, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.010000228881835938, + "source": "cadd_raw" + }, + { + "score": 2.690000057220459, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.293C>G" + ], + "id": "rs4984133", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.31750944, + "altHomGenotypeFreq": 6.4313854E-4, + "hetGenotypeFreq": 0.6337326, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6824905, + "refHomGenotypeFreq": 0.36562425, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34223917, + "altHomGenotypeFreq": 0.0050890585, + "hetGenotypeFreq": 0.67430025, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.6577608, + "refHomGenotypeFreq": 0.32061067, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38682172, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.77364343, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6131783, + "refHomGenotypeFreq": 0.2263566, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.25462964, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5092593, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.7453704, + "refHomGenotypeFreq": 0.49074075, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2952756, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5905512, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.70472443, + "refHomGenotypeFreq": 0.40944883, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3441467, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6882934, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.65585333, + "refHomGenotypeFreq": 0.31170663, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31836164, + "altHomGenotypeFreq": 9.889567E-4, + "hetGenotypeFreq": 0.63474536, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.68163836, + "refHomGenotypeFreq": 0.3642657, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2961039, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5922078, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7038961, + "refHomGenotypeFreq": 0.4077922, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31559458, + "altHomGenotypeFreq": 8.7120663E-4, + "hetGenotypeFreq": 0.6294468, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.6844054, + "refHomGenotypeFreq": 0.369682, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31988472, + "altHomGenotypeFreq": 3.6023054E-4, + "hetGenotypeFreq": 0.639049, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.6801153, + "refHomGenotypeFreq": 0.3605908, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15917604, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31835207, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.84082395, + "refHomGenotypeFreq": 0.68164796, + "study": "MGP" + } + ], + "reference": "G", + "start": 21937819, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937819, + "id": "15:21937819:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 21937819, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 148, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.490000009536743, + "source": "gerp" + }, + { + "score": 0.014999999664723873, + "source": "phastCons" + }, + { + "score": 0.4449999928474426, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 5.690000057220459, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.148T>C" + ], + "id": "rs28428761", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.26150325, + "altHomGenotypeFreq": 1.6947716E-4, + "hetGenotypeFreq": 0.5226676, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7384967, + "refHomGenotypeFreq": 0.47716296, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27247956, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5449591, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.7275204, + "refHomGenotypeFreq": 0.45504087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32899305, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6579861, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6710069, + "refHomGenotypeFreq": 0.3420139, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31388012, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.62776023, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.68611985, + "refHomGenotypeFreq": 0.37223974, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21428572, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.42857143, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.78571427, + "refHomGenotypeFreq": 0.5714286, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31051436, + "altHomGenotypeFreq": 0.0015128592, + "hetGenotypeFreq": 0.618003, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.6894856, + "refHomGenotypeFreq": 0.3804841, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28338966, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5667793, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7166104, + "refHomGenotypeFreq": 0.4332207, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19197585, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3839517, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.80802417, + "refHomGenotypeFreq": 0.61604834, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.25751305, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5150261, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.74248695, + "refHomGenotypeFreq": 0.48497394, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26643303, + "altHomGenotypeFreq": 3.7885964E-4, + "hetGenotypeFreq": 0.53210837, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.73356694, + "refHomGenotypeFreq": 0.4675128, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21348314, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.42696628, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.78651685, + "refHomGenotypeFreq": 0.5730337, + "study": "MGP" + } + ], + "reference": "A", + "start": 21937964, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21937964, + "id": "15:21937964:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21937964, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 63, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.5139999985694885, + "source": "gerp" + }, + { + "score": 0.7770000100135803, + "source": "phastCons" + }, + { + "score": -0.4020000100135803, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.7200002670288086, + "source": "cadd_raw" + }, + { + "score": 14.529999732971191, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.63G>A" + ], + "id": "rs2343906", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.84017414, + "altHomGenotypeFreq": 0.6803483, + "hetGenotypeFreq": 0.31965175, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.15982588, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.805383, + "altHomGenotypeFreq": 0.61076605, + "hetGenotypeFreq": 0.38923395, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.19461697, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7628931, + "altHomGenotypeFreq": 0.52578616, + "hetGenotypeFreq": 0.47421384, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.23710692, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8645084, + "altHomGenotypeFreq": 0.7290168, + "hetGenotypeFreq": 0.27098322, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.13549161, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7380952, + "altHomGenotypeFreq": 0.47619048, + "hetGenotypeFreq": 0.52380955, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.26190478, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8223837, + "altHomGenotypeFreq": 0.64476746, + "hetGenotypeFreq": 0.35523257, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.17761628, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.81205195, + "altHomGenotypeFreq": 0.6241039, + "hetGenotypeFreq": 0.37589613, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.18794806, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9146031, + "altHomGenotypeFreq": 0.8292062, + "hetGenotypeFreq": 0.1707938, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.0853969, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.84000474, + "altHomGenotypeFreq": 0.6800095, + "hetGenotypeFreq": 0.31999052, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.15999526, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.84038347, + "altHomGenotypeFreq": 0.680767, + "hetGenotypeFreq": 0.31923303, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.15961652, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.79026216, + "altHomGenotypeFreq": 0.5805243, + "hetGenotypeFreq": 0.41947564, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.20973782, + "refHomGenotypeFreq": 0, + "study": "MGP" + } + ], + "reference": "C", + "start": 21938049, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938049, + "id": "15:21938049:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21938049, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 43, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 2.490000009536743, + "source": "gerp" + }, + { + "score": 0.19200000166893005, + "source": "phastCons" + }, + { + "score": 0.4449999928474426, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.4499998092651367, + "source": "cadd_raw" + }, + { + "score": 7.079999923706055, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.43A>G" + ], + "id": "rs8025331", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.112853274, + "altHomGenotypeFreq": 1.5485869E-4, + "hetGenotypeFreq": 0.22539683, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8871467, + "refHomGenotypeFreq": 0.77444834, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09610706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19221412, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.90389293, + "refHomGenotypeFreq": 0.80778587, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12693499, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.25386998, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.873065, + "refHomGenotypeFreq": 0.74613005, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10422535, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2084507, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.89577466, + "refHomGenotypeFreq": 0.7915493, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.102564104, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.20512821, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.8974359, + "refHomGenotypeFreq": 0.7948718, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07339142, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14678285, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.92660856, + "refHomGenotypeFreq": 0.8532172, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10759494, + "altHomGenotypeFreq": 1.6023073E-4, + "hetGenotypeFreq": 0.21486941, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.8924051, + "refHomGenotypeFreq": 0.78497034, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13851629, + "altHomGenotypeFreq": 2.737476E-4, + "hetGenotypeFreq": 0.2764851, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.8614837, + "refHomGenotypeFreq": 0.72324115, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.115846, + "altHomGenotypeFreq": 1.3948946E-4, + "hetGenotypeFreq": 0.23141302, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.884154, + "refHomGenotypeFreq": 0.76844746, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.109119385, + "altHomGenotypeFreq": 1.7403411E-4, + "hetGenotypeFreq": 0.21789071, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.8908806, + "refHomGenotypeFreq": 0.7819353, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17228465, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3445693, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.82771534, + "refHomGenotypeFreq": 0.65543073, + "study": "MGP" + } + ], + "reference": "T", + "start": 21938069, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938069, + "id": "15:21938069:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21938069, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 30, + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.064557776 + } + ], + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -4.75, + "source": "gerp" + }, + { + "score": 0.08699999749660492, + "source": "phastCons" + }, + { + "score": -1.1449999809265137, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.07999992370605469, + "source": "cadd_raw" + }, + { + "score": 1.9199999570846558, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556425(ENSG00000237161):n.30C>T" + ], + "id": "rs28655354", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.25034118, + "altHomGenotypeFreq": 1.7059024E-4, + "hetGenotypeFreq": 0.5004265, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.74961615, + "refHomGenotypeFreq": 0.49940294, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25433525, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5086705, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7456647, + "refHomGenotypeFreq": 0.4913295, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3207547, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6415094, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6792453, + "refHomGenotypeFreq": 0.35849056, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30250785, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6050157, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6974922, + "refHomGenotypeFreq": 0.39498433, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20168068, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.40336135, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.79831934, + "refHomGenotypeFreq": 0.5966387, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3041316, + "altHomGenotypeFreq": 0.0015302219, + "hetGenotypeFreq": 0.60520273, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6958684, + "refHomGenotypeFreq": 0.39326704, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27659383, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.55318767, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.72340614, + "refHomGenotypeFreq": 0.44681233, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.17238893, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.34506637, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.82746685, + "refHomGenotypeFreq": 0.65493363, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2473555, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4948643, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7525678, + "refHomGenotypeFreq": 0.50513566, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25408575, + "altHomGenotypeFreq": 3.8454143E-4, + "hetGenotypeFreq": 0.5074024, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7459142, + "refHomGenotypeFreq": 0.49221304, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0018726592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0037453184, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.99812734, + "refHomGenotypeFreq": 0.9962547, + "study": "MGP" + } + ], + "reference": "G", + "start": 21938082, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938082, + "id": "15:21938082:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 21938082, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.0700000524520874, + "source": "gerp" + }, + { + "score": 0.05700000002980232, + "source": "phastCons" + }, + { + "score": -1.0720000267028809, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.46000003814697266, + "source": "cadd_raw" + }, + { + "score": 7.130000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs2343905", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.8412242, + "altHomGenotypeFreq": 0.6824483, + "hetGenotypeFreq": 0.31755167, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.15877584, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8056133, + "altHomGenotypeFreq": 0.6112266, + "hetGenotypeFreq": 0.38877338, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.19438669, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7654477, + "altHomGenotypeFreq": 0.53089535, + "hetGenotypeFreq": 0.46910468, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.23455234, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8705036, + "altHomGenotypeFreq": 0.7410072, + "hetGenotypeFreq": 0.2589928, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.1294964, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.74333334, + "altHomGenotypeFreq": 0.48666668, + "hetGenotypeFreq": 0.5133333, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.25666666, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8213248, + "altHomGenotypeFreq": 0.64264965, + "hetGenotypeFreq": 0.35735038, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.17867519, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8131252, + "altHomGenotypeFreq": 0.6262503, + "hetGenotypeFreq": 0.37374967, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.18687484, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91551244, + "altHomGenotypeFreq": 0.83102494, + "hetGenotypeFreq": 0.16897507, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.084487535, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8412042, + "altHomGenotypeFreq": 0.6824085, + "hetGenotypeFreq": 0.3175915, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.15879574, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8412489, + "altHomGenotypeFreq": 0.6824978, + "hetGenotypeFreq": 0.3175022, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.1587511, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8984375, + "altHomGenotypeFreq": 0.796875, + "hetGenotypeFreq": 0.203125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.1015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85503197, + "altHomGenotypeFreq": 0.7100639, + "hetGenotypeFreq": 0.28993613, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.14496805, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7985685, + "altHomGenotypeFreq": 0.59713703, + "hetGenotypeFreq": 0.40286297, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.2014315, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88297874, + "altHomGenotypeFreq": 0.7659575, + "hetGenotypeFreq": 0.23404256, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.11702128, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8088235, + "altHomGenotypeFreq": 0.61764705, + "hetGenotypeFreq": 0.38235295, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.19117647, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.93721634, + "altHomGenotypeFreq": 0.8744327, + "hetGenotypeFreq": 0.12556732, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.06278366, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7809524, + "altHomGenotypeFreq": 0.5619048, + "hetGenotypeFreq": 0.43809524, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.21904762, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8605769, + "altHomGenotypeFreq": 0.72115386, + "hetGenotypeFreq": 0.27884614, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.13942307, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8020833, + "altHomGenotypeFreq": 0.6041667, + "hetGenotypeFreq": 0.3958333, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.19791667, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.92477876, + "altHomGenotypeFreq": 0.8495575, + "hetGenotypeFreq": 0.15044248, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.07522124, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7941176, + "altHomGenotypeFreq": 0.5882353, + "hetGenotypeFreq": 0.4117647, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.20588236, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8076923, + "altHomGenotypeFreq": 0.61538464, + "hetGenotypeFreq": 0.3846154, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.1923077, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7688172, + "altHomGenotypeFreq": 0.53763443, + "hetGenotypeFreq": 0.46236557, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.2311828, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7626263, + "altHomGenotypeFreq": 0.5252525, + "hetGenotypeFreq": 0.47474748, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.23737374, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8271028, + "altHomGenotypeFreq": 0.6542056, + "hetGenotypeFreq": 0.34579438, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.17289719, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8313953, + "altHomGenotypeFreq": 0.6627907, + "hetGenotypeFreq": 0.33720928, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.16860466, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.921875, + "altHomGenotypeFreq": 0.84375, + "hetGenotypeFreq": 0.15625, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.078125, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94949496, + "altHomGenotypeFreq": 0.8989899, + "hetGenotypeFreq": 0.1010101, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.05050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.94949496, + "altHomGenotypeFreq": 0.8989899, + "hetGenotypeFreq": 0.1010101, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.05050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8260437, + "altHomGenotypeFreq": 0.65208745, + "hetGenotypeFreq": 0.34791252, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.17395626, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91803277, + "altHomGenotypeFreq": 0.8360656, + "hetGenotypeFreq": 0.16393442, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.08196721, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9020173, + "altHomGenotypeFreq": 0.8040346, + "hetGenotypeFreq": 0.19596541, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.09798271, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9470588, + "altHomGenotypeFreq": 0.89411765, + "hetGenotypeFreq": 0.105882354, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.052941177, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7621359, + "altHomGenotypeFreq": 0.52427185, + "hetGenotypeFreq": 0.47572815, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.23786408, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82828283, + "altHomGenotypeFreq": 0.65656567, + "hetGenotypeFreq": 0.34343433, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.17171717, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7757009, + "altHomGenotypeFreq": 0.55140185, + "hetGenotypeFreq": 0.44859815, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.22429906, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8942308, + "altHomGenotypeFreq": 0.78846157, + "hetGenotypeFreq": 0.21153846, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.10576923, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8939394, + "altHomGenotypeFreq": 0.7878788, + "hetGenotypeFreq": 0.21212122, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.10606061, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9352941, + "altHomGenotypeFreq": 0.87058824, + "hetGenotypeFreq": 0.12941177, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.064705886, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7986111, + "altHomGenotypeFreq": 0.5972222, + "hetGenotypeFreq": 0.4027778, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.2013889, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.815534, + "altHomGenotypeFreq": 0.63106793, + "hetGenotypeFreq": 0.36893204, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.18446602, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.79026216, + "altHomGenotypeFreq": 0.5805243, + "hetGenotypeFreq": 0.41947564, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.20973782, + "refHomGenotypeFreq": 0, + "study": "MGP" + } + ], + "reference": "T", + "start": 21938114, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938114, + "id": "15:21938114:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21938114, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.159999966621399, + "source": "gerp" + }, + { + "score": 0.052000001072883606, + "source": "phastCons" + }, + { + "score": 0.5440000295639038, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.6700000762939453, + "source": "cadd_raw" + }, + { + "score": 8.649999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs7176937", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.04294435, + "altHomGenotypeFreq": 7.0982394E-5, + "hetGenotypeFreq": 0.085746735, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9570556, + "refHomGenotypeFreq": 0.9141823, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.041855205, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08371041, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.9581448, + "refHomGenotypeFreq": 0.91628957, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.011479592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.022959184, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.9885204, + "refHomGenotypeFreq": 0.9770408, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.041131105, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08226221, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9588689, + "refHomGenotypeFreq": 0.9177378, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.06538462, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13076924, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.9346154, + "refHomGenotypeFreq": 0.86923075, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.026638089, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.053276177, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.9733619, + "refHomGenotypeFreq": 0.9467238, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.054102525, + "altHomGenotypeFreq": 1.4945448E-4, + "hetGenotypeFreq": 0.10790614, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.94589746, + "refHomGenotypeFreq": 0.8919444, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.036700673, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07340135, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.96329933, + "refHomGenotypeFreq": 0.92659867, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.042813063, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.085626125, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.95718694, + "refHomGenotypeFreq": 0.9143739, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.04310618, + "altHomGenotypeFreq": 1.5847861E-4, + "hetGenotypeFreq": 0.085895404, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.9568938, + "refHomGenotypeFreq": 0.9139461, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0234375, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.046875, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.9765625, + "refHomGenotypeFreq": 0.953125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.05011981, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10023962, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9498802, + "refHomGenotypeFreq": 0.89976037, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.05419223, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10838446, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.94580775, + "refHomGenotypeFreq": 0.89161557, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09042553, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18085107, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.90957445, + "refHomGenotypeFreq": 0.81914896, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.05882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11764707, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.9411765, + "refHomGenotypeFreq": 0.88235295, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.055975795, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11195159, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9440242, + "refHomGenotypeFreq": 0.8880484, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.00952381, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.01904762, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.9904762, + "refHomGenotypeFreq": 0.9809524, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.014423077, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.028846156, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.9855769, + "refHomGenotypeFreq": 0.97115386, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11111111, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.8888889, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.078125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15625, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.921875, + "refHomGenotypeFreq": 0.84375, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.03539823, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07079646, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.96460176, + "refHomGenotypeFreq": 0.9292035, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.024509804, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04901961, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.9754902, + "refHomGenotypeFreq": 0.95098037, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.06593407, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13186814, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.93406594, + "refHomGenotypeFreq": 0.8681319, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.02688172, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.05376344, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.9731183, + "refHomGenotypeFreq": 0.94623655, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.015151516, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.030303031, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.9848485, + "refHomGenotypeFreq": 0.969697, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07943925, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1588785, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.9205608, + "refHomGenotypeFreq": 0.8411215, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.046511628, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.093023255, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.95348835, + "refHomGenotypeFreq": 0.90697676, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.125, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.9375, + "refHomGenotypeFreq": 0.875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.065656565, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13131313, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.93434346, + "refHomGenotypeFreq": 0.86868685, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.055555556, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11111111, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.9444444, + "refHomGenotypeFreq": 0.8888889, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0666004, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1332008, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.9333996, + "refHomGenotypeFreq": 0.8667992, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.08196721, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16393442, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.91803277, + "refHomGenotypeFreq": 0.8360656, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.06051873, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12103747, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.93948126, + "refHomGenotypeFreq": 0.8789625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.047058824, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09411765, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.9529412, + "refHomGenotypeFreq": 0.90588236, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0631068, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1262136, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.9368932, + "refHomGenotypeFreq": 0.8737864, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.02020202, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04040404, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.97979796, + "refHomGenotypeFreq": 0.959596, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.093457945, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18691589, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.90654206, + "refHomGenotypeFreq": 0.8130841, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.08173077, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16346154, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.9182692, + "refHomGenotypeFreq": 0.83653843, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.07070707, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14141414, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.9292929, + "refHomGenotypeFreq": 0.85858583, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.029411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.058823533, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.9705882, + "refHomGenotypeFreq": 0.9411765, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.014880952, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.029761907, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.98511904, + "refHomGenotypeFreq": 0.9702381, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.009708738, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.019417476, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.99029124, + "refHomGenotypeFreq": 0.98058254, + "study": "1kG_phase3" + } + ], + "reference": "G", + "start": 21938115, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938115, + "id": "15:21938115:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 21938115, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.350000023841858, + "source": "gerp" + }, + { + "score": 0.02800000086426735, + "source": "phastCons" + }, + { + "score": -1.468999981880188, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.2700004577636719, + "source": "cadd_raw" + }, + { + "score": 0.800000011920929, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4247058", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.99977416, + "altHomGenotypeFreq": 0.99954826, + "hetGenotypeFreq": 4.517295E-4, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 2.2586474E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9997336, + "altHomGenotypeFreq": 0.9994673, + "hetGenotypeFreq": 5.326941E-4, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 2.6634705E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9996566, + "altHomGenotypeFreq": 0.9993132, + "hetGenotypeFreq": 6.868132E-4, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 3.434066E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.99988323, + "altHomGenotypeFreq": 0.99976647, + "hetGenotypeFreq": 2.3353573E-4, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 1.16767864E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.99963933, + "altHomGenotypeFreq": 0.9992787, + "hetGenotypeFreq": 7.2129257E-4, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 3.6064629E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.997996, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.002004008, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9962547, + "altHomGenotypeFreq": 0.9962547, + "hetGenotypeFreq": 0, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.0037453184, + "refHomGenotypeFreq": 0.0037453184, + "study": "MGP" + } + ], + "reference": "A", + "start": 21938136, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938136, + "id": "15:21938136:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 21938136, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.309999942779541, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -3.2279999256134033, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.5699996948242188, + "source": "cadd_raw" + }, + { + "score": 0.14000000059604645, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4247057", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.50100374, + "altHomGenotypeFreq": 0.048594765, + "hetGenotypeFreq": 0.90481794, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.49899626, + "refHomGenotypeFreq": 0.046587292, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5121413, + "altHomGenotypeFreq": 0.057395145, + "hetGenotypeFreq": 0.90949225, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.4878587, + "refHomGenotypeFreq": 0.03311258, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5052016, + "altHomGenotypeFreq": 0.024707412, + "hetGenotypeFreq": 0.9609883, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.49479845, + "refHomGenotypeFreq": 0.014304291, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5543478, + "altHomGenotypeFreq": 0.1352657, + "hetGenotypeFreq": 0.83816427, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.4456522, + "refHomGenotypeFreq": 0.026570048, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.51111114, + "altHomGenotypeFreq": 0.02962963, + "hetGenotypeFreq": 0.962963, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.4888889, + "refHomGenotypeFreq": 0.0074074073, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.52410716, + "altHomGenotypeFreq": 0.05952381, + "hetGenotypeFreq": 0.9291667, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.47589287, + "refHomGenotypeFreq": 0.011309524, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5060829, + "altHomGenotypeFreq": 0.052765597, + "hetGenotypeFreq": 0.9066346, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.4939171, + "refHomGenotypeFreq": 0.0405998, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.473892, + "altHomGenotypeFreq": 0.03158431, + "hetGenotypeFreq": 0.88461536, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.526108, + "refHomGenotypeFreq": 0.08380031, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49987483, + "altHomGenotypeFreq": 0.048185233, + "hetGenotypeFreq": 0.9033792, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.50012517, + "refHomGenotypeFreq": 0.048435543, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5024009, + "altHomGenotypeFreq": 0.04910161, + "hetGenotypeFreq": 0.9065985, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.49759912, + "refHomGenotypeFreq": 0.044299874, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46067417, + "altHomGenotypeFreq": 0.04494382, + "hetGenotypeFreq": 0.83146065, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.53932583, + "refHomGenotypeFreq": 0.123595506, + "study": "MGP" + } + ], + "reference": "T", + "start": 21938163, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938163, + "id": "15:21938163:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 21938163, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.3100000023841858, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": -1.2380000352859497, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.3399999141693115, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs2343904", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.8350344, + "altHomGenotypeFreq": 0.6700687, + "hetGenotypeFreq": 0.32993132, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.16496566, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.80206186, + "altHomGenotypeFreq": 0.6041237, + "hetGenotypeFreq": 0.3958763, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.19793814, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.75446427, + "altHomGenotypeFreq": 0.5089286, + "hetGenotypeFreq": 0.49107143, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.24553572, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.86778843, + "altHomGenotypeFreq": 0.7355769, + "hetGenotypeFreq": 0.26442307, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.13221154, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74161077, + "altHomGenotypeFreq": 0.48322147, + "hetGenotypeFreq": 0.5167785, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.25838926, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8154382, + "altHomGenotypeFreq": 0.63087636, + "hetGenotypeFreq": 0.3691236, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.1845618, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8077806, + "altHomGenotypeFreq": 0.61556125, + "hetGenotypeFreq": 0.38443875, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.19221938, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9078613, + "altHomGenotypeFreq": 0.8157225, + "hetGenotypeFreq": 0.18427746, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.09213873, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.83595973, + "altHomGenotypeFreq": 0.6719194, + "hetGenotypeFreq": 0.32808056, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.16404028, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.83389336, + "altHomGenotypeFreq": 0.6677867, + "hetGenotypeFreq": 0.33221328, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.16610664, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7865732, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.21342686, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9140625, + "altHomGenotypeFreq": 0.828125, + "hetGenotypeFreq": 0.171875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.0859375, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.85523164, + "altHomGenotypeFreq": 0.7104633, + "hetGenotypeFreq": 0.28953674, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.14476837, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.797546, + "altHomGenotypeFreq": 0.595092, + "hetGenotypeFreq": 0.40490797, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.20245399, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.86702126, + "altHomGenotypeFreq": 0.7340425, + "hetGenotypeFreq": 0.26595744, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.13297872, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7892157, + "altHomGenotypeFreq": 0.57843137, + "hetGenotypeFreq": 0.42156863, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.21078432, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.93419063, + "altHomGenotypeFreq": 0.86838126, + "hetGenotypeFreq": 0.13161875, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.06580938, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8, + "altHomGenotypeFreq": 0.6, + "hetGenotypeFreq": 0.4, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.2, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.875, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.25, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.125, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9490741, + "altHomGenotypeFreq": 0.8981481, + "hetGenotypeFreq": 0.10185185, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.050925925, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8072917, + "altHomGenotypeFreq": 0.6145833, + "hetGenotypeFreq": 0.3854167, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.19270833, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9159292, + "altHomGenotypeFreq": 0.8318584, + "hetGenotypeFreq": 0.1681416, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.084070794, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.78431374, + "altHomGenotypeFreq": 0.5686275, + "hetGenotypeFreq": 0.43137255, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.21568628, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8186813, + "altHomGenotypeFreq": 0.63736266, + "hetGenotypeFreq": 0.36263737, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.18131869, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7903226, + "altHomGenotypeFreq": 0.58064514, + "hetGenotypeFreq": 0.41935483, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.20967741, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.75757575, + "altHomGenotypeFreq": 0.5151515, + "hetGenotypeFreq": 0.48484847, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.24242425, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8130841, + "altHomGenotypeFreq": 0.62616825, + "hetGenotypeFreq": 0.37383178, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.18691589, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8255814, + "altHomGenotypeFreq": 0.6511628, + "hetGenotypeFreq": 0.3488372, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.1744186, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.9322917, + "altHomGenotypeFreq": 0.8645833, + "hetGenotypeFreq": 0.13541666, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.067708336, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.93939394, + "altHomGenotypeFreq": 0.8787879, + "hetGenotypeFreq": 0.121212125, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.060606062, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.94949496, + "altHomGenotypeFreq": 0.8989899, + "hetGenotypeFreq": 0.1010101, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.05050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.82803184, + "altHomGenotypeFreq": 0.6560636, + "hetGenotypeFreq": 0.34393638, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.17196819, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.91803277, + "altHomGenotypeFreq": 0.8360656, + "hetGenotypeFreq": 0.16393442, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.08196721, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8962536, + "altHomGenotypeFreq": 0.79250723, + "hetGenotypeFreq": 0.2074928, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.1037464, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.92941177, + "altHomGenotypeFreq": 0.85882354, + "hetGenotypeFreq": 0.14117648, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.07058824, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.78640777, + "altHomGenotypeFreq": 0.57281554, + "hetGenotypeFreq": 0.42718446, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.21359223, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8484849, + "altHomGenotypeFreq": 0.6969697, + "hetGenotypeFreq": 0.3030303, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.15151516, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.77102804, + "altHomGenotypeFreq": 0.5420561, + "hetGenotypeFreq": 0.45794392, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.22897196, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.88461536, + "altHomGenotypeFreq": 0.7692308, + "hetGenotypeFreq": 0.23076925, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.115384616, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8939394, + "altHomGenotypeFreq": 0.7878788, + "hetGenotypeFreq": 0.21212122, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.10606061, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.92941177, + "altHomGenotypeFreq": 0.85882354, + "hetGenotypeFreq": 0.14117648, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.07058824, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.80654764, + "altHomGenotypeFreq": 0.6130952, + "hetGenotypeFreq": 0.38690478, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.19345239, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.80582523, + "altHomGenotypeFreq": 0.61165047, + "hetGenotypeFreq": 0.38834953, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.19417475, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7621723, + "altHomGenotypeFreq": 0.5805243, + "hetGenotypeFreq": 0.36329588, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.23782772, + "refHomGenotypeFreq": 0.056179777, + "study": "MGP" + } + ], + "reference": "A", + "start": 21938182, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938182, + "id": "15:21938182:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21938182, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.2300000190734863, + "source": "gerp" + }, + { + "score": 0.007000000216066837, + "source": "phastCons" + }, + { + "score": -1.3289999961853027, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.5399999618530273, + "source": "cadd_raw" + }, + { + "score": 0.18000000715255737, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs11248829", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.3304579, + "altHomGenotypeFreq": 2.1701389E-4, + "hetGenotypeFreq": 0.66048175, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6695421, + "refHomGenotypeFreq": 0.33930123, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3448276, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6896552, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.6551724, + "refHomGenotypeFreq": 0.31034482, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42334095, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8466819, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.576659, + "refHomGenotypeFreq": 0.15331808, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37695312, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.75390625, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6230469, + "refHomGenotypeFreq": 0.24609375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32666665, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6533333, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.67333335, + "refHomGenotypeFreq": 0.34666666, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36766034, + "altHomGenotypeFreq": 0.0018066848, + "hetGenotypeFreq": 0.73170733, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.63233966, + "refHomGenotypeFreq": 0.266486, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3529084, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7058168, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.6470916, + "refHomGenotypeFreq": 0.2941832, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25312012, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.50624025, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7468799, + "refHomGenotypeFreq": 0.49375975, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32564104, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6512821, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.67435896, + "refHomGenotypeFreq": 0.34871796, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3363483, + "altHomGenotypeFreq": 4.8239267E-4, + "hetGenotypeFreq": 0.67173177, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.6636517, + "refHomGenotypeFreq": 0.32778582, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.054307114, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10861423, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9456929, + "refHomGenotypeFreq": 0.8913858, + "study": "MGP" + } + ], + "reference": "C", + "start": 21938209, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938209, + "id": "15:21938209:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21938209, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.07400000095367432, + "source": "phastCons" + }, + { + "score": -1.6799999475479126, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 4.409999847412109, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4641705", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.5015655, + "altHomGenotypeFreq": 0.04814918, + "hetGenotypeFreq": 0.90683275, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.49843445, + "refHomGenotypeFreq": 0.04501809, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5043384, + "altHomGenotypeFreq": 0.05206074, + "hetGenotypeFreq": 0.9045553, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.49566162, + "refHomGenotypeFreq": 0.04338395, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50850785, + "altHomGenotypeFreq": 0.028795812, + "hetGenotypeFreq": 0.9594241, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.49149215, + "refHomGenotypeFreq": 0.011780105, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55773956, + "altHomGenotypeFreq": 0.14004914, + "hetGenotypeFreq": 0.83538085, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.44226044, + "refHomGenotypeFreq": 0.024570024, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.51119405, + "altHomGenotypeFreq": 0.029850746, + "hetGenotypeFreq": 0.96268654, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.48880598, + "refHomGenotypeFreq": 0.0074626864, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.522903, + "altHomGenotypeFreq": 0.05651398, + "hetGenotypeFreq": 0.9327781, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.47709697, + "refHomGenotypeFreq": 0.010707912, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50677216, + "altHomGenotypeFreq": 0.052181352, + "hetGenotypeFreq": 0.90918165, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.49322784, + "refHomGenotypeFreq": 0.038637012, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47519815, + "altHomGenotypeFreq": 0.031705447, + "hetGenotypeFreq": 0.8869854, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.52480185, + "refHomGenotypeFreq": 0.081309125, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5006932, + "altHomGenotypeFreq": 0.048021175, + "hetGenotypeFreq": 0.90534407, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.49930677, + "refHomGenotypeFreq": 0.046634737, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50264055, + "altHomGenotypeFreq": 0.048306927, + "hetGenotypeFreq": 0.90866727, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.49735942, + "refHomGenotypeFreq": 0.043025784, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.59375, + "altHomGenotypeFreq": 0.203125, + "hetGenotypeFreq": 0.78125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.40625, + "refHomGenotypeFreq": 0.015625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4838259, + "altHomGenotypeFreq": 0.05551118, + "hetGenotypeFreq": 0.8566294, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.51617414, + "refHomGenotypeFreq": 0.08785942, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4815951, + "altHomGenotypeFreq": 0.026584867, + "hetGenotypeFreq": 0.9100205, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.5184049, + "refHomGenotypeFreq": 0.06339468, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5053192, + "altHomGenotypeFreq": 0.07446808, + "hetGenotypeFreq": 0.86170214, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.49468085, + "refHomGenotypeFreq": 0.06382979, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46568626, + "altHomGenotypeFreq": 0.029411765, + "hetGenotypeFreq": 0.87254906, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.53431374, + "refHomGenotypeFreq": 0.09803922, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42965204, + "altHomGenotypeFreq": 0.027231468, + "hetGenotypeFreq": 0.80484116, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.57034796, + "refHomGenotypeFreq": 0.16792738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47619048, + "altHomGenotypeFreq": 0.01904762, + "hetGenotypeFreq": 0.9142858, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.52380955, + "refHomGenotypeFreq": 0.06666667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52403843, + "altHomGenotypeFreq": 0.086538464, + "hetGenotypeFreq": 0.875, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.47596154, + "refHomGenotypeFreq": 0.03846154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45833334, + "altHomGenotypeFreq": 0.018518519, + "hetGenotypeFreq": 0.8796296, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.5416667, + "refHomGenotypeFreq": 0.10185185, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46875, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.9166667, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.53125, + "refHomGenotypeFreq": 0.072916664, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40707964, + "altHomGenotypeFreq": 0.017699115, + "hetGenotypeFreq": 0.778761, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.59292036, + "refHomGenotypeFreq": 0.20353982, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47549018, + "altHomGenotypeFreq": 0.009803922, + "hetGenotypeFreq": 0.9313725, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.5245098, + "refHomGenotypeFreq": 0.05882353, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.489011, + "altHomGenotypeFreq": 0.054945055, + "hetGenotypeFreq": 0.8681319, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.510989, + "refHomGenotypeFreq": 0.07692308, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49462366, + "altHomGenotypeFreq": 0.05376344, + "hetGenotypeFreq": 0.8817204, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.50537634, + "refHomGenotypeFreq": 0.06451613, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.8989899, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4906542, + "altHomGenotypeFreq": 0.037383176, + "hetGenotypeFreq": 0.90654206, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.50934577, + "refHomGenotypeFreq": 0.056074765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.90697676, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.046511628, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46354166, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.8645833, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.5364583, + "refHomGenotypeFreq": 0.104166664, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42424244, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.82828283, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.57575756, + "refHomGenotypeFreq": 0.16161616, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42929292, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.75757575, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.5707071, + "refHomGenotypeFreq": 0.1919192, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.500994, + "altHomGenotypeFreq": 0.059642147, + "hetGenotypeFreq": 0.8827038, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.49900597, + "refHomGenotypeFreq": 0.057654075, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40983605, + "altHomGenotypeFreq": 0.06557377, + "hetGenotypeFreq": 0.6885246, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.59016395, + "refHomGenotypeFreq": 0.24590164, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54178673, + "altHomGenotypeFreq": 0.14985591, + "hetGenotypeFreq": 0.78386164, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.45821327, + "refHomGenotypeFreq": 0.06628242, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40588236, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.7882353, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.59411764, + "refHomGenotypeFreq": 0.2, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.03883495, + "hetGenotypeFreq": 0.9223301, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55050504, + "altHomGenotypeFreq": 0.1010101, + "hetGenotypeFreq": 0.8989899, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.44949496, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47663552, + "altHomGenotypeFreq": 0.037383176, + "hetGenotypeFreq": 0.8785047, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.5233645, + "refHomGenotypeFreq": 0.08411215, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5048077, + "altHomGenotypeFreq": 0.13461539, + "hetGenotypeFreq": 0.7403846, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.49519232, + "refHomGenotypeFreq": 0.125, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.85858583, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5882353, + "altHomGenotypeFreq": 0.21176471, + "hetGenotypeFreq": 0.7529412, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.4117647, + "refHomGenotypeFreq": 0.03529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.051587302, + "hetGenotypeFreq": 0.8968254, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.051587302, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5048544, + "altHomGenotypeFreq": 0.048543688, + "hetGenotypeFreq": 0.9126214, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.49514562, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + } + ], + "reference": "T", + "start": 21938287, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21938287, + "id": "15:21938287:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21938287, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -3.2100000381469727, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": -2.747999906539917, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "upstream_gene_variant", + "functionalScore": [ + { + "score": 0.35000038146972656, + "source": "cadd_raw" + }, + { + "score": 6.190000057220459, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs2343903", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.48414668, + "altHomGenotypeFreq": 0.037523054, + "hetGenotypeFreq": 0.89324725, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5158533, + "refHomGenotypeFreq": 0.06922968, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49889135, + "altHomGenotypeFreq": 0.046563193, + "hetGenotypeFreq": 0.9046563, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.50110865, + "refHomGenotypeFreq": 0.048780486, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5064516, + "altHomGenotypeFreq": 0.027096774, + "hetGenotypeFreq": 0.95870966, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.4935484, + "refHomGenotypeFreq": 0.014193549, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.54656863, + "altHomGenotypeFreq": 0.12745099, + "hetGenotypeFreq": 0.8382353, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.45343137, + "refHomGenotypeFreq": 0.034313727, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49621212, + "altHomGenotypeFreq": 0.007575758, + "hetGenotypeFreq": 0.97727275, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.5037879, + "refHomGenotypeFreq": 0.015151516, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.51459855, + "altHomGenotypeFreq": 0.052311435, + "hetGenotypeFreq": 0.9245742, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.48540145, + "refHomGenotypeFreq": 0.023114355, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49385217, + "altHomGenotypeFreq": 0.038333576, + "hetGenotypeFreq": 0.91103715, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.50614786, + "refHomGenotypeFreq": 0.05062925, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43960264, + "altHomGenotypeFreq": 0.021986755, + "hetGenotypeFreq": 0.8352318, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5603973, + "refHomGenotypeFreq": 0.14278145, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4823998, + "altHomGenotypeFreq": 0.037127443, + "hetGenotypeFreq": 0.8905447, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.5176002, + "refHomGenotypeFreq": 0.07232785, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4863003, + "altHomGenotypeFreq": 0.03801077, + "hetGenotypeFreq": 0.896579, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.5136997, + "refHomGenotypeFreq": 0.0654102, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22659177, + "altHomGenotypeFreq": 0.018726591, + "hetGenotypeFreq": 0.41573033, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.77340823, + "refHomGenotypeFreq": 0.56554306, + "study": "MGP" + } + ], + "reference": "C", + "start": 21940114, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21940114, + "id": "15:21940114:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21940114, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.4900000095367432, + "source": "gerp" + }, + { + "score": 0.06800000369548798, + "source": "phastCons" + }, + { + "score": 0.10400000214576721, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "upstream_gene_variant", + "functionalScore": [ + { + "score": 0.23999977111816406, + "source": "cadd_raw" + }, + { + "score": 5.099999904632568, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs2880723", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.46730423, + "altHomGenotypeFreq": 0.03175749, + "hetGenotypeFreq": 0.87109345, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5326958, + "refHomGenotypeFreq": 0.097149044, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49017468, + "altHomGenotypeFreq": 0.04366812, + "hetGenotypeFreq": 0.8930131, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.50982535, + "refHomGenotypeFreq": 0.063318774, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50196594, + "altHomGenotypeFreq": 0.020969857, + "hetGenotypeFreq": 0.96199214, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.4980341, + "refHomGenotypeFreq": 0.017038008, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54218364, + "altHomGenotypeFreq": 0.12655087, + "hetGenotypeFreq": 0.8312655, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.45781636, + "refHomGenotypeFreq": 0.042183623, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49253732, + "altHomGenotypeFreq": 0.0074626864, + "hetGenotypeFreq": 0.9701493, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.5074627, + "refHomGenotypeFreq": 0.02238806, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.511875, + "altHomGenotypeFreq": 0.050625, + "hetGenotypeFreq": 0.9225, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.488125, + "refHomGenotypeFreq": 0.026875, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.48793507, + "altHomGenotypeFreq": 0.03422053, + "hetGenotypeFreq": 0.9074291, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.51206493, + "refHomGenotypeFreq": 0.058350395, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38999727, + "altHomGenotypeFreq": 0.010112053, + "hetGenotypeFreq": 0.75977045, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.61000276, + "refHomGenotypeFreq": 0.23011751, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.465256, + "altHomGenotypeFreq": 0.03187043, + "hetGenotypeFreq": 0.86677116, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.53474396, + "refHomGenotypeFreq": 0.10135841, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46983385, + "altHomGenotypeFreq": 0.031618003, + "hetGenotypeFreq": 0.8764317, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.53016615, + "refHomGenotypeFreq": 0.09195031, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.039325844, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07865169, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.96067417, + "refHomGenotypeFreq": 0.92134833, + "study": "MGP" + } + ], + "reference": "T", + "start": 21940175, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21940175, + "id": "15:21940175:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 21940175, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "cdnaPosition": 1832, + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.052438386 + } + ], + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.6010000109672546, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.8619999885559082, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.039999961853027344, + "source": "cadd_raw" + }, + { + "score": 2.2200000286102295, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000500487(ENSG00000247765):n.1832A>T" + ], + "id": "rs4603520", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.3315405, + "altHomGenotypeFreq": 0.0013138447, + "hetGenotypeFreq": 0.66045326, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.66845953, + "refHomGenotypeFreq": 0.33823287, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35750636, + "altHomGenotypeFreq": 0.0050890585, + "hetGenotypeFreq": 0.7048346, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.64249367, + "refHomGenotypeFreq": 0.29007635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33781514, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6756303, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.6621849, + "refHomGenotypeFreq": 0.32436976, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37386018, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.74772036, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.6261398, + "refHomGenotypeFreq": 0.25227964, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.007936508, + "hetGenotypeFreq": 0.6507937, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.34126985, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37406296, + "altHomGenotypeFreq": 0.0022488756, + "hetGenotypeFreq": 0.7436282, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.62593704, + "refHomGenotypeFreq": 0.25412294, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36253393, + "altHomGenotypeFreq": 0.0016960652, + "hetGenotypeFreq": 0.7216757, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.6374661, + "refHomGenotypeFreq": 0.27662823, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25520685, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5104137, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.7447932, + "refHomGenotypeFreq": 0.4895863, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32868436, + "altHomGenotypeFreq": 0.0010441528, + "hetGenotypeFreq": 0.6552804, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6713156, + "refHomGenotypeFreq": 0.3436754, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33503836, + "altHomGenotypeFreq": 0.0016441359, + "hetGenotypeFreq": 0.66678846, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.66496164, + "refHomGenotypeFreq": 0.3315674, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "start": 21941476, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21941476, + "id": "15:21941476:T:A", + "length": 1, + "names": [], + "reference": "T", + "start": 21941476, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "cdnaPosition": 1641, + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.052438386 + } + ], + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.3160000145435333, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.5180000066757202, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.5100002288818359, + "source": "cadd_raw" + }, + { + "score": 7.539999961853027, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000500487(ENSG00000247765):n.1641A>G" + ], + "id": "rs1976798", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.5750676, + "altHomGenotypeFreq": 0.16068016, + "hetGenotypeFreq": 0.8287748, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.42493245, + "refHomGenotypeFreq": 0.010545047, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6120332, + "altHomGenotypeFreq": 0.22614108, + "hetGenotypeFreq": 0.77178425, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.3879668, + "refHomGenotypeFreq": 0.002074689, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5958386, + "altHomGenotypeFreq": 0.19167717, + "hetGenotypeFreq": 0.80832285, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.40416142, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6507177, + "altHomGenotypeFreq": 0.3014354, + "hetGenotypeFreq": 0.6985646, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.3492823, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.557047, + "altHomGenotypeFreq": 0.11409396, + "hetGenotypeFreq": 0.88590604, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.44295302, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.62790024, + "altHomGenotypeFreq": 0.25580046, + "hetGenotypeFreq": 0.7441995, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.37209976, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.59207505, + "altHomGenotypeFreq": 0.18577021, + "hetGenotypeFreq": 0.8126097, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.40792495, + "refHomGenotypeFreq": 0.001620089, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5083333, + "altHomGenotypeFreq": 0.051666666, + "hetGenotypeFreq": 0.91333336, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.49166667, + "refHomGenotypeFreq": 0.035, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5740873, + "altHomGenotypeFreq": 0.15974708, + "hetGenotypeFreq": 0.8286805, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.42591268, + "refHomGenotypeFreq": 0.011572417, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.57627743, + "altHomGenotypeFreq": 0.16183184, + "hetGenotypeFreq": 0.82889116, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.42372257, + "refHomGenotypeFreq": 0.009276984, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.734375, + "altHomGenotypeFreq": 0.46875, + "hetGenotypeFreq": 0.53125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.265625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5770767, + "altHomGenotypeFreq": 0.17412141, + "hetGenotypeFreq": 0.8059106, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.42292333, + "refHomGenotypeFreq": 0.019968051, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5644172, + "altHomGenotypeFreq": 0.14314929, + "hetGenotypeFreq": 0.8425358, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.43558282, + "refHomGenotypeFreq": 0.014314928, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.61170214, + "altHomGenotypeFreq": 0.23404256, + "hetGenotypeFreq": 0.7553191, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.3882979, + "refHomGenotypeFreq": 0.010638298, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5392157, + "altHomGenotypeFreq": 0.10784314, + "hetGenotypeFreq": 0.8627451, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.46078432, + "refHomGenotypeFreq": 0.029411765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4977307, + "altHomGenotypeFreq": 0.051437218, + "hetGenotypeFreq": 0.892587, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.50226927, + "refHomGenotypeFreq": 0.055975795, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5809524, + "altHomGenotypeFreq": 0.16190477, + "hetGenotypeFreq": 0.83809525, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.41904762, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65384614, + "altHomGenotypeFreq": 0.30769232, + "hetGenotypeFreq": 0.6923077, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.34615386, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49537036, + "altHomGenotypeFreq": 0.037037037, + "hetGenotypeFreq": 0.9166667, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.5046296, + "refHomGenotypeFreq": 0.046296295, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.578125, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.8229166, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.421875, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48230088, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.91150445, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.5176991, + "refHomGenotypeFreq": 0.061946902, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54901963, + "altHomGenotypeFreq": 0.11764706, + "hetGenotypeFreq": 0.8627451, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.4509804, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5769231, + "altHomGenotypeFreq": 0.15384616, + "hetGenotypeFreq": 0.84615386, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.42307693, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6236559, + "altHomGenotypeFreq": 0.24731183, + "hetGenotypeFreq": 0.75268817, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.37634408, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6010101, + "altHomGenotypeFreq": 0.2020202, + "hetGenotypeFreq": 0.79797983, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.3989899, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5981308, + "altHomGenotypeFreq": 0.19626169, + "hetGenotypeFreq": 0.80373836, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.40186915, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60465115, + "altHomGenotypeFreq": 0.20930232, + "hetGenotypeFreq": 0.7906977, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.39534885, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.515625, + "altHomGenotypeFreq": 0.072916664, + "hetGenotypeFreq": 0.8854166, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.484375, + "refHomGenotypeFreq": 0.041666668, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5151515, + "altHomGenotypeFreq": 0.060606062, + "hetGenotypeFreq": 0.9090909, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.4848485, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4848485, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.82828283, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.5151515, + "refHomGenotypeFreq": 0.1010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6073559, + "altHomGenotypeFreq": 0.22067595, + "hetGenotypeFreq": 0.7733599, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.39264414, + "refHomGenotypeFreq": 0.005964215, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5409836, + "altHomGenotypeFreq": 0.114754096, + "hetGenotypeFreq": 0.852459, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.45901638, + "refHomGenotypeFreq": 0.032786883, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6541787, + "altHomGenotypeFreq": 0.3170029, + "hetGenotypeFreq": 0.6743516, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.34582132, + "refHomGenotypeFreq": 0.008645534, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46470588, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.92941177, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.5352941, + "refHomGenotypeFreq": 0.07058824, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55825245, + "altHomGenotypeFreq": 0.1262136, + "hetGenotypeFreq": 0.8640777, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.44174758, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64646465, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.7070707, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.35353535, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5794392, + "altHomGenotypeFreq": 0.18691589, + "hetGenotypeFreq": 0.7850467, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.42056075, + "refHomGenotypeFreq": 0.028037382, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6057692, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.75, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.39423078, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6363636, + "altHomGenotypeFreq": 0.27272728, + "hetGenotypeFreq": 0.72727275, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.36363637, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7, + "altHomGenotypeFreq": 0.4, + "hetGenotypeFreq": 0.6, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.3, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.61011904, + "altHomGenotypeFreq": 0.22023809, + "hetGenotypeFreq": 0.7797619, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.38988096, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.592233, + "altHomGenotypeFreq": 0.18446602, + "hetGenotypeFreq": 0.815534, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.407767, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.018726591, + "altHomGenotypeFreq": 0.011235955, + "hetGenotypeFreq": 0.014981274, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9812734, + "refHomGenotypeFreq": 0.9737828, + "study": "MGP" + } + ], + "reference": "T", + "start": 21941667, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21941667, + "id": "15:21941667:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21941667, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000431494", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000237161", + "ensemblTranscriptId": "ENST00000556425", + "geneName": "RP11-32B5.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "lincRNA", + "cdnaPosition": 1060, + "ensemblGeneId": "ENSG00000247765", + "ensemblTranscriptId": "ENST00000500487", + "exonOverlap": [ + { + "number": "2/2", + "percentage": 0.052438386 + } + ], + "geneName": "RP11-32B5.7", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.953000009059906, + "source": "gerp" + }, + { + "score": 0.23600000143051147, + "source": "phastCons" + }, + { + "score": 0.14900000393390656, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.359999656677246, + "source": "cadd_raw" + }, + { + "score": 12.619999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000500487(ENSG00000247765):n.1060A>T" + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22040711, + "id": "9174", + "percentageMatch": 0.996469, + "source": "genomicSuperDup", + "start": 21941706 + } + ], + "start": 21942248, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21942248, + "id": "15:21942248:T:A", + "length": 1, + "names": [], + "reference": "T", + "start": 21942248, + "strand": "+", + "studies": [], + "type": "SNV" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258415", + "ensemblTranscriptId": "ENST00000554326", + "geneName": "RP11-32B5.4", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.4169999957084656, + "source": "gerp" + }, + { + "score": 0.024000000208616257, + "source": "phastCons" + }, + { + "score": 0.14499999582767487, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.8500003814697266, + "source": "cadd_raw" + }, + { + "score": 9.819999694824219, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs566466360", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.29903537, + "altHomGenotypeFreq": 0.003215434, + "hetGenotypeFreq": 0.5916399, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7009646, + "refHomGenotypeFreq": 0.4051447, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28983516, + "altHomGenotypeFreq": 0.0054945056, + "hetGenotypeFreq": 0.5686813, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.71016484, + "refHomGenotypeFreq": 0.42582417, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44666666, + "altHomGenotypeFreq": 0.005925926, + "hetGenotypeFreq": 0.88148147, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.55333334, + "refHomGenotypeFreq": 0.11259259, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39910978, + "altHomGenotypeFreq": 0.017804155, + "hetGenotypeFreq": 0.76261127, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6008902, + "refHomGenotypeFreq": 0.21958457, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2826087, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5652174, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.7173913, + "refHomGenotypeFreq": 0.4347826, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2801252, + "altHomGenotypeFreq": 7.824726E-4, + "hetGenotypeFreq": 0.5586854, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.7198748, + "refHomGenotypeFreq": 0.4405321, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.27193433, + "altHomGenotypeFreq": 0.0010261673, + "hetGenotypeFreq": 0.5418163, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.72806567, + "refHomGenotypeFreq": 0.45715752, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31454596, + "altHomGenotypeFreq": 0.00569314, + "hetGenotypeFreq": 0.61770564, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.685454, + "refHomGenotypeFreq": 0.3766012, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3038416, + "altHomGenotypeFreq": 0.0032631266, + "hetGenotypeFreq": 0.60115695, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.6961584, + "refHomGenotypeFreq": 0.39557993, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29302025, + "altHomGenotypeFreq": 0.0031557453, + "hetGenotypeFreq": 0.57972896, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.70697975, + "refHomGenotypeFreq": 0.41711527, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.19338678, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8066132, + "study": "GONL" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22040711, + "id": "9174", + "percentageMatch": 0.996469, + "source": "genomicSuperDup", + "start": 21941706 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22037072, + "id": "10996", + "percentageMatch": 0.962183, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10993", + "percentageMatch": 0.96883, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22043868, + "id": "10594", + "percentageMatch": 0.961499, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22022943, + "id": "10386", + "percentageMatch": 0.961459, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22002264, + "id": "7581", + "percentageMatch": 0.957751, + "source": "genomicSuperDup", + "start": 21966964 + } + ], + "start": 21988039, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21988039, + "id": "15:21988039:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21988039, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000268531", + "ensemblTranscriptId": "ENST00000594169", + "geneName": "DKFZP547L112", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 598, + "ensemblGeneId": "ENSG00000258712", + "ensemblTranscriptId": "ENST00000556905", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.09182736 + } + ], + "geneName": "CXADRP2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0.36800000071525574, + "source": "gerp" + }, + { + "score": 0.2980000078678131, + "source": "phastCons" + }, + { + "score": 0.12099999934434891, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.1499996185302734, + "source": "cadd_raw" + }, + { + "score": 11.510000228881836, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556905(ENSG00000258712):n.598C>T" + ], + "id": "rs759283740", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.550169, + "altHomGenotypeFreq": 0.16873614, + "hetGenotypeFreq": 0.7628657, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.44983098, + "refHomGenotypeFreq": 0.06839812, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56339353, + "altHomGenotypeFreq": 0.17983446, + "hetGenotypeFreq": 0.76711816, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.43660647, + "refHomGenotypeFreq": 0.053047404, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.54838324, + "altHomGenotypeFreq": 0.13005231, + "hetGenotypeFreq": 0.83666193, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.45161673, + "refHomGenotypeFreq": 0.03328578, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41818413, + "altHomGenotypeFreq": 0.09104704, + "hetGenotypeFreq": 0.65427417, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5818159, + "refHomGenotypeFreq": 0.25467882, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6020004, + "altHomGenotypeFreq": 0.22796416, + "hetGenotypeFreq": 0.7480725, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.39799958, + "refHomGenotypeFreq": 0.023963327, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56385845, + "altHomGenotypeFreq": 0.17564555, + "hetGenotypeFreq": 0.7764258, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.43614155, + "refHomGenotypeFreq": 0.047928665, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.57409126, + "altHomGenotypeFreq": 0.18616371, + "hetGenotypeFreq": 0.77585506, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.42590877, + "refHomGenotypeFreq": 0.03798125, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6453644, + "altHomGenotypeFreq": 0.31055734, + "hetGenotypeFreq": 0.66961414, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.3546356, + "refHomGenotypeFreq": 0.01982851, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5527782, + "altHomGenotypeFreq": 0.1669821, + "hetGenotypeFreq": 0.77159214, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.44722185, + "refHomGenotypeFreq": 0.06142578, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.54700786, + "altHomGenotypeFreq": 0.1708613, + "hetGenotypeFreq": 0.75229305, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.45299217, + "refHomGenotypeFreq": 0.07684564, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5822884, + "altHomGenotypeFreq": 0.2051247, + "hetGenotypeFreq": 0.75432736, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4177116, + "refHomGenotypeFreq": 0.040547907, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5614407, + "altHomGenotypeFreq": 0.1779661, + "hetGenotypeFreq": 0.7669492, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.43855932, + "refHomGenotypeFreq": 0.055084746, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.53841144, + "altHomGenotypeFreq": 0.100260414, + "hetGenotypeFreq": 0.87630206, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.46158853, + "refHomGenotypeFreq": 0.0234375, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41644204, + "altHomGenotypeFreq": 0.08625337, + "hetGenotypeFreq": 0.6603774, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.58355796, + "refHomGenotypeFreq": 0.25336927, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.60211265, + "altHomGenotypeFreq": 0.2112676, + "hetGenotypeFreq": 0.7816901, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.39788732, + "refHomGenotypeFreq": 0.0070422534, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5667892, + "altHomGenotypeFreq": 0.18198529, + "hetGenotypeFreq": 0.76960784, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.4332108, + "refHomGenotypeFreq": 0.04840686, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56797075, + "altHomGenotypeFreq": 0.17520405, + "hetGenotypeFreq": 0.78553337, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.43202928, + "refHomGenotypeFreq": 0.039262597, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.63710254, + "altHomGenotypeFreq": 0.2976333, + "hetGenotypeFreq": 0.67893857, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.36289746, + "refHomGenotypeFreq": 0.02342816, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5849302, + "altHomGenotypeFreq": 0.20979108, + "hetGenotypeFreq": 0.7502782, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.41506985, + "refHomGenotypeFreq": 0.039930772, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.57904327, + "altHomGenotypeFreq": 0.19939256, + "hetGenotypeFreq": 0.7593014, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.42095673, + "refHomGenotypeFreq": 0.041306, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5559804, + "altHomGenotypeFreq": 0.16918474, + "hetGenotypeFreq": 0.7735912, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.44401962, + "refHomGenotypeFreq": 0.057224005, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5704698, + "altHomGenotypeFreq": 0.19239374, + "hetGenotypeFreq": 0.75615215, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.4295302, + "refHomGenotypeFreq": 0.051454138, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5291132, + "altHomGenotypeFreq": 0.111437306, + "hetGenotypeFreq": 0.8353517, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.47088686, + "refHomGenotypeFreq": 0.05321101, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.54385966, + "altHomGenotypeFreq": 0.12163743, + "hetGenotypeFreq": 0.84444445, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.45614034, + "refHomGenotypeFreq": 0.033918127, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41118014, + "altHomGenotypeFreq": 0.08110026, + "hetGenotypeFreq": 0.6601597, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.58881986, + "refHomGenotypeFreq": 0.25874, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5594983, + "altHomGenotypeFreq": 0.16702355, + "hetGenotypeFreq": 0.78494954, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.4405017, + "refHomGenotypeFreq": 0.04802692, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5744019, + "altHomGenotypeFreq": 0.182467, + "hetGenotypeFreq": 0.78386986, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.42559806, + "refHomGenotypeFreq": 0.033663124, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.64856577, + "altHomGenotypeFreq": 0.31454006, + "hetGenotypeFreq": 0.6680514, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.35143423, + "refHomGenotypeFreq": 0.017408507, + "study": "EXAC" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5955056, + "altHomGenotypeFreq": 0.27715355, + "hetGenotypeFreq": 0.63670415, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.40449437, + "refHomGenotypeFreq": 0.086142324, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22040711, + "id": "9174", + "percentageMatch": 0.996469, + "source": "genomicSuperDup", + "start": 21941706 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22037072, + "id": "10996", + "percentageMatch": 0.962183, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10993", + "percentageMatch": 0.96883, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22043868, + "id": "10594", + "percentageMatch": 0.961499, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22022943, + "id": "10386", + "percentageMatch": 0.961459, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22045178, + "id": "10638", + "percentageMatch": 0.923024, + "source": "genomicSuperDup", + "start": 21995971 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22034867, + "id": "10480", + "percentageMatch": 0.93417, + "source": "genomicSuperDup", + "start": 21995971 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22028437, + "id": "8427", + "percentageMatch": 0.931198, + "source": "genomicSuperDup", + "start": 21995971 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22028437, + "id": "8410", + "percentageMatch": 0.931335, + "source": "genomicSuperDup", + "start": 21995971 + } + ], + "start": 22016194, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22016194, + "id": "15:22016194:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22016194, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000268531", + "ensemblTranscriptId": "ENST00000594169", + "geneName": "DKFZP547L112", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 533, + "ensemblGeneId": "ENSG00000258712", + "ensemblTranscriptId": "ENST00000556905", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.09182736 + } + ], + "geneName": "CXADRP2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.2709999978542328, + "source": "phastCons" + }, + { + "score": 0.10199999809265137, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.1800003051757812, + "source": "cadd_raw" + }, + { + "score": 11.65999984741211, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556905(ENSG00000258712):n.533A>G" + ], + "id": "rs765332913", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.378945, + "altHomGenotypeFreq": 0.021579256, + "hetGenotypeFreq": 0.71473145, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.621055, + "refHomGenotypeFreq": 0.26368928, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3909217, + "altHomGenotypeFreq": 0.022232516, + "hetGenotypeFreq": 0.7373784, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6090783, + "refHomGenotypeFreq": 0.24038906, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4085436, + "altHomGenotypeFreq": 0.02193234, + "hetGenotypeFreq": 0.7732225, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5914564, + "refHomGenotypeFreq": 0.20484519, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.24752702, + "altHomGenotypeFreq": 0.0104245925, + "hetGenotypeFreq": 0.47420484, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.752473, + "refHomGenotypeFreq": 0.51537055, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45937023, + "altHomGenotypeFreq": 0.048755713, + "hetGenotypeFreq": 0.82122904, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.54062974, + "refHomGenotypeFreq": 0.13001524, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39297587, + "altHomGenotypeFreq": 0.019839142, + "hetGenotypeFreq": 0.74627346, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.60702413, + "refHomGenotypeFreq": 0.2338874, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40597418, + "altHomGenotypeFreq": 0.022658251, + "hetGenotypeFreq": 0.76663184, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.5940258, + "refHomGenotypeFreq": 0.21070988, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29864636, + "altHomGenotypeFreq": 0.004888137, + "hetGenotypeFreq": 0.5875164, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.7013536, + "refHomGenotypeFreq": 0.40759543, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3854087, + "altHomGenotypeFreq": 0.022041941, + "hetGenotypeFreq": 0.7267335, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6145913, + "refHomGenotypeFreq": 0.25122455, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37107408, + "altHomGenotypeFreq": 0.021015843, + "hetGenotypeFreq": 0.7001165, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.6289259, + "refHomGenotypeFreq": 0.27886766, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35504234, + "altHomGenotypeFreq": 0.015291719, + "hetGenotypeFreq": 0.67950124, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.64495766, + "refHomGenotypeFreq": 0.305207, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4, + "altHomGenotypeFreq": 0.0325, + "hetGenotypeFreq": 0.735, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6, + "refHomGenotypeFreq": 0.2325, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41079137, + "altHomGenotypeFreq": 0.017266188, + "hetGenotypeFreq": 0.78705037, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.58920866, + "refHomGenotypeFreq": 0.19568345, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.20658682, + "altHomGenotypeFreq": 0.002994012, + "hetGenotypeFreq": 0.4071856, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.79341316, + "refHomGenotypeFreq": 0.5898204, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43965518, + "altHomGenotypeFreq": 0.05172414, + "hetGenotypeFreq": 0.7758621, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.5603448, + "refHomGenotypeFreq": 0.1724138, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.36190477, + "altHomGenotypeFreq": 0.017582418, + "hetGenotypeFreq": 0.6886447, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.63809526, + "refHomGenotypeFreq": 0.2937729, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39224967, + "altHomGenotypeFreq": 0.02037869, + "hetGenotypeFreq": 0.743742, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.6077503, + "refHomGenotypeFreq": 0.23587933, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.28351802, + "altHomGenotypeFreq": 0.0033240998, + "hetGenotypeFreq": 0.5603878, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.716482, + "refHomGenotypeFreq": 0.4362881, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3542588, + "altHomGenotypeFreq": 0.016122129, + "hetGenotypeFreq": 0.67627335, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.64574116, + "refHomGenotypeFreq": 0.30760452, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3559986, + "altHomGenotypeFreq": 0.014278252, + "hetGenotypeFreq": 0.6834407, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.64400136, + "refHomGenotypeFreq": 0.30228105, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4163135, + "altHomGenotypeFreq": 0.01770697, + "hetGenotypeFreq": 0.7972352, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.58367544, + "refHomGenotypeFreq": 0.1850578, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42837077, + "altHomGenotypeFreq": 0.019662922, + "hetGenotypeFreq": 0.8174157, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.5716292, + "refHomGenotypeFreq": 0.16292135, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4273913, + "altHomGenotypeFreq": 0.026956521, + "hetGenotypeFreq": 0.8008696, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.5726087, + "refHomGenotypeFreq": 0.17217392, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.43047425, + "altHomGenotypeFreq": 0.015807962, + "hetGenotypeFreq": 0.82933253, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5695258, + "refHomGenotypeFreq": 0.15485948, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.29656488, + "altHomGenotypeFreq": 0.008396947, + "hetGenotypeFreq": 0.5763359, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.7034351, + "refHomGenotypeFreq": 0.41526717, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42816955, + "altHomGenotypeFreq": 0.019504877, + "hetGenotypeFreq": 0.81732935, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.57183045, + "refHomGenotypeFreq": 0.1631658, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4377854, + "altHomGenotypeFreq": 0.018550228, + "hetGenotypeFreq": 0.8385111, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.5621942, + "refHomGenotypeFreq": 0.14293869, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35004586, + "altHomGenotypeFreq": 0.003362886, + "hetGenotypeFreq": 0.69336593, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.64995414, + "refHomGenotypeFreq": 0.30327117, + "study": "EXAC" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14044943, + "altHomGenotypeFreq": 0.026217228, + "hetGenotypeFreq": 0.22846442, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.85955054, + "refHomGenotypeFreq": 0.74531835, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22040711, + "id": "9174", + "percentageMatch": 0.996469, + "source": "genomicSuperDup", + "start": 21941706 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22037072, + "id": "10996", + "percentageMatch": 0.962183, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10993", + "percentageMatch": 0.96883, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22043868, + "id": "10594", + "percentageMatch": 0.961499, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22022943, + "id": "10386", + "percentageMatch": 0.961459, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22045178, + "id": "10638", + "percentageMatch": 0.923024, + "source": "genomicSuperDup", + "start": 21995971 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22034867, + "id": "10480", + "percentageMatch": 0.93417, + "source": "genomicSuperDup", + "start": 21995971 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22028437, + "id": "8427", + "percentageMatch": 0.931198, + "source": "genomicSuperDup", + "start": 21995971 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22028437, + "id": "8410", + "percentageMatch": 0.931335, + "source": "genomicSuperDup", + "start": 21995971 + } + ], + "start": 22016259, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22016259, + "id": "15:22016259:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22016259, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000268531", + "ensemblTranscriptId": "ENST00000594169", + "geneName": "DKFZP547L112", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "biotype": "processed_pseudogene", + "cdnaPosition": 458, + "ensemblGeneId": "ENSG00000258712", + "ensemblTranscriptId": "ENST00000556905", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.09182736 + } + ], + "geneName": "CXADRP2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0.36800000071525574, + "source": "gerp" + }, + { + "score": 0.18000000715255737, + "source": "phastCons" + }, + { + "score": 0.12099999934434891, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.1700000762939453, + "source": "cadd_raw" + }, + { + "score": 11.619999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556905(ENSG00000258712):n.458G>A" + ], + "id": "rs771909217", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.12355183, + "altHomGenotypeFreq": 7.74396E-4, + "hetGenotypeFreq": 0.24556506, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8764431, + "refHomGenotypeFreq": 0.75366056, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12185817, + "altHomGenotypeFreq": 0.0022441652, + "hetGenotypeFreq": 0.23922801, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.8781418, + "refHomGenotypeFreq": 0.7585278, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23687115, + "altHomGenotypeFreq": 0.0014193344, + "hetGenotypeFreq": 0.47090364, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.7631288, + "refHomGenotypeFreq": 0.527677, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10810811, + "altHomGenotypeFreq": 4.233999E-4, + "hetGenotypeFreq": 0.21536942, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8918919, + "refHomGenotypeFreq": 0.78420717, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09823558, + "altHomGenotypeFreq": 2.3843587E-4, + "hetGenotypeFreq": 0.19599427, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.90176445, + "refHomGenotypeFreq": 0.80376726, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.07784338, + "altHomGenotypeFreq": 3.1075202E-4, + "hetGenotypeFreq": 0.15506525, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.92215663, + "refHomGenotypeFreq": 0.844624, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11220797, + "altHomGenotypeFreq": 8.2455337E-4, + "hetGenotypeFreq": 0.22278973, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.8877806, + "refHomGenotypeFreq": 0.7763857, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.113915645, + "altHomGenotypeFreq": 1.6605778E-4, + "hetGenotypeFreq": 0.22749917, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8860844, + "refHomGenotypeFreq": 0.77233475, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12592275, + "altHomGenotypeFreq": 7.829394E-4, + "hetGenotypeFreq": 0.2502983, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.8740679, + "refHomGenotypeFreq": 0.7489188, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12069353, + "altHomGenotypeFreq": 7.6409645E-4, + "hetGenotypeFreq": 0.23985887, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.8793065, + "refHomGenotypeFreq": 0.75937706, + "study": "GNOMAD_EXOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1087256, + "altHomGenotypeFreq": 1.5308075E-4, + "hetGenotypeFreq": 0.21714504, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8912744, + "refHomGenotypeFreq": 0.78270185, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09191176, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18382353, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.9080882, + "refHomGenotypeFreq": 0.8161765, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23306452, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.46612903, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.76693547, + "refHomGenotypeFreq": 0.533871, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09166667, + "altHomGenotypeFreq": 0.0027777778, + "hetGenotypeFreq": 0.17777778, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.90833336, + "refHomGenotypeFreq": 0.8194444, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10074627, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.20149253, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.8992537, + "refHomGenotypeFreq": 0.79850745, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0718933, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1437866, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.9281067, + "refHomGenotypeFreq": 0.8562134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1038578, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2077156, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.8961422, + "refHomGenotypeFreq": 0.79228437, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11518886, + "altHomGenotypeFreq": 2.6788106E-4, + "hetGenotypeFreq": 0.22984195, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.88481116, + "refHomGenotypeFreq": 0.7698902, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10865664, + "altHomGenotypeFreq": 1.3806434E-4, + "hetGenotypeFreq": 0.21703714, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.89134336, + "refHomGenotypeFreq": 0.7828248, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.10881141, + "altHomGenotypeFreq": 1.7176228E-4, + "hetGenotypeFreq": 0.21727929, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.8911886, + "refHomGenotypeFreq": 0.78254896, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19222914, + "altHomGenotypeFreq": 5.6162564E-4, + "hetGenotypeFreq": 0.38333502, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.80777085, + "refHomGenotypeFreq": 0.61610335, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18611987, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.37223974, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.81388015, + "refHomGenotypeFreq": 0.62776023, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24038921, + "altHomGenotypeFreq": 0.0011166055, + "hetGenotypeFreq": 0.47854522, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.7596108, + "refHomGenotypeFreq": 0.5203382, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30417228, + "altHomGenotypeFreq": 0.0010094213, + "hetGenotypeFreq": 0.6063257, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6958277, + "refHomGenotypeFreq": 0.39266488, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17405894, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3481179, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8259411, + "refHomGenotypeFreq": 0.6518821, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11595118, + "altHomGenotypeFreq": 4.208754E-4, + "hetGenotypeFreq": 0.23106061, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.8840488, + "refHomGenotypeFreq": 0.7685185, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17587365, + "altHomGenotypeFreq": 5.35384E-4, + "hetGenotypeFreq": 0.35067654, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.82412636, + "refHomGenotypeFreq": 0.6487881, + "study": "EXAC" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17595713, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.35191426, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.82404286, + "refHomGenotypeFreq": 0.6480858, + "study": "EXAC" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22040711, + "id": "9174", + "percentageMatch": 0.996469, + "source": "genomicSuperDup", + "start": 21941706 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22037072, + "id": "10996", + "percentageMatch": 0.962183, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10993", + "percentageMatch": 0.96883, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22043868, + "id": "10594", + "percentageMatch": 0.961499, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22022943, + "id": "10386", + "percentageMatch": 0.961459, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22045178, + "id": "10638", + "percentageMatch": 0.923024, + "source": "genomicSuperDup", + "start": 21995971 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22034867, + "id": "10480", + "percentageMatch": 0.93417, + "source": "genomicSuperDup", + "start": 21995971 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22028437, + "id": "8427", + "percentageMatch": 0.931198, + "source": "genomicSuperDup", + "start": 21995971 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22028437, + "id": "8410", + "percentageMatch": 0.931335, + "source": "genomicSuperDup", + "start": 21995971 + } + ], + "start": 22016334, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22016334, + "id": "15:22016334:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22016334, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000435397", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000439682", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000553662", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-" + } + ], + "conservation": [ + { + "score": -2.180000066757202, + "source": "gerp" + }, + { + "score": 0.006000000052154064, + "source": "phastCons" + }, + { + "score": 0.18400000035762787, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 3.6700000762939453, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000435397(ENSG00000233917):c.*16+412C>G", + "ENST00000439682(ENSG00000233917):c.1131+412C>G" + ], + "id": "rs775007129", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.13049705, + "altHomGenotypeFreq": 0.0019355838, + "hetGenotypeFreq": 0.25720036, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8694642, + "refHomGenotypeFreq": 0.74086404, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19, + "altHomGenotypeFreq": 0.0025, + "hetGenotypeFreq": 0.375, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.81, + "refHomGenotypeFreq": 0.6225, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.063739374, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12747875, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.93626064, + "refHomGenotypeFreq": 0.8725212, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.07744565, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1548913, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9225544, + "refHomGenotypeFreq": 0.8451087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.184, + "altHomGenotypeFreq": 0.008, + "hetGenotypeFreq": 0.352, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.816, + "refHomGenotypeFreq": 0.64, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17867436, + "altHomGenotypeFreq": 0.0028818443, + "hetGenotypeFreq": 0.351585, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.82132566, + "refHomGenotypeFreq": 0.64553314, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.17679466, + "altHomGenotypeFreq": 0.0030050084, + "hetGenotypeFreq": 0.34774625, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.82312185, + "refHomGenotypeFreq": 0.6492487, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.052297536, + "altHomGenotypeFreq": 2.5387155E-4, + "hetGenotypeFreq": 0.10408733, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.94770247, + "refHomGenotypeFreq": 0.8956588, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12731579, + "altHomGenotypeFreq": 0.0023680178, + "hetGenotypeFreq": 0.24989553, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.87268424, + "refHomGenotypeFreq": 0.74773645, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13447794, + "altHomGenotypeFreq": 0.0013944571, + "hetGenotypeFreq": 0.2663413, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.8654349, + "refHomGenotypeFreq": 0.7322642, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0018726592, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0037453184, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.99812734, + "refHomGenotypeFreq": 0.9962547, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10993", + "percentageMatch": 0.96883, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10387", + "percentageMatch": 0.975208, + "source": "genomicSuperDup", + "start": 22041405 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22071777, + "id": "10483", + "percentageMatch": 0.90108, + "source": "genomicSuperDup", + "start": 22051927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22071776, + "id": "10482", + "percentageMatch": 0.902145, + "source": "genomicSuperDup", + "start": 22051927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22071777, + "id": "10481", + "percentageMatch": 0.902267, + "source": "genomicSuperDup", + "start": 22051927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "10639", + "percentageMatch": 0.904024, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "10485", + "percentageMatch": 0.905737, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22071777, + "id": "10484", + "percentageMatch": 0.901301, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "8407", + "percentageMatch": 0.904388, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083736, + "id": "10489", + "percentageMatch": 0.918873, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083905, + "id": "10488", + "percentageMatch": 0.921328, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083905, + "id": "10487", + "percentageMatch": 0.920561, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083736, + "id": "10486", + "percentageMatch": 0.919429, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "8430", + "percentageMatch": 0.909773, + "source": "genomicSuperDup", + "start": 22063032 + } + ], + "start": 22063116, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22063116, + "id": "15:22063116:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22063116, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000435397", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000439682", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000553662", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000570157", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + } + ], + "conservation": [ + { + "score": 0.10300000011920929, + "source": "gerp" + }, + { + "score": 0.04500000178813934, + "source": "phastCons" + }, + { + "score": 0.1550000011920929, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.3900003433227539, + "source": "cadd_raw" + }, + { + "score": 6.539999961853027, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000435397(ENSG00000233917):c.699+236T>G", + "ENST00000439682(ENSG00000233917):c.699+236T>G", + "ENST00000553662(ENSG00000233917):n.642+236T>G" + ], + "id": "rs2664969", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.0264266, + "altHomGenotypeFreq": 2.904022E-4, + "hetGenotypeFreq": 0.052272398, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.9735734, + "refHomGenotypeFreq": 0.9474372, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.05952381, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.11904762, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.9404762, + "refHomGenotypeFreq": 0.88095236, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.023972603, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.047945205, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.97602737, + "refHomGenotypeFreq": 0.9520548, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.039772727, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07954545, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.96022725, + "refHomGenotypeFreq": 0.92045456, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.04597701, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09195402, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.954023, + "refHomGenotypeFreq": 0.90804595, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.007889546, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.015779093, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.99211043, + "refHomGenotypeFreq": 0.9842209, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.041584484, + "altHomGenotypeFreq": 3.287311E-4, + "hetGenotypeFreq": 0.08251151, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.9584155, + "refHomGenotypeFreq": 0.91715974, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.008100445, + "altHomGenotypeFreq": 4.0502226E-4, + "hetGenotypeFreq": 0.015390847, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.99189955, + "refHomGenotypeFreq": 0.9842041, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.028092783, + "altHomGenotypeFreq": 5.1546394E-4, + "hetGenotypeFreq": 0.05515464, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.9719072, + "refHomGenotypeFreq": 0.9443299, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.024276687, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.048553374, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.9757233, + "refHomGenotypeFreq": 0.95144665, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10993", + "percentageMatch": 0.96883, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10387", + "percentageMatch": 0.975208, + "source": "genomicSuperDup", + "start": 22041405 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "10639", + "percentageMatch": 0.904024, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "10485", + "percentageMatch": 0.905737, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "8407", + "percentageMatch": 0.904388, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083736, + "id": "10489", + "percentageMatch": 0.918873, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083905, + "id": "10488", + "percentageMatch": 0.921328, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083905, + "id": "10487", + "percentageMatch": 0.920561, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083736, + "id": "10486", + "percentageMatch": 0.919429, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "8430", + "percentageMatch": 0.909773, + "source": "genomicSuperDup", + "start": 22063032 + } + ], + "start": 22077295, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22077295, + "id": "15:22077295:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 22077295, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "nonsense_mediated_decay", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000435397", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001621", + "name": "NMD_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "protein_coding", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000439682", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "CCDS", + "basic" + ] + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000553662", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-" + }, + { + "biotype": "processed_transcript", + "ensemblGeneId": "ENSG00000233917", + "ensemblTranscriptId": "ENST00000570157", + "geneName": "POTEB", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-" + } + ], + "conservation": [ + { + "score": 0.37599998712539673, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": 0.1550000011920929, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000435397(ENSG00000233917):c.699+221delT", + "ENST00000439682(ENSG00000233917):c.699+221delT", + "ENST00000553662(ENSG00000233917):n.642+221delT" + ], + "id": "rs200070625", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.056725662, + "altHomGenotypeFreq": 0.03079646, + "hetGenotypeFreq": 0.13646019, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.90097344, + "refHomGenotypeFreq": 0.83274335, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.09271523, + "altHomGenotypeFreq": 0.06622516, + "hetGenotypeFreq": 0.1986755, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.8344371, + "refHomGenotypeFreq": 0.7350993, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.023631841, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.06467661, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.9676617, + "refHomGenotypeFreq": 0.93532336, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.035928145, + "altHomGenotypeFreq": 0.011976048, + "hetGenotypeFreq": 0.13772455, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.9191617, + "refHomGenotypeFreq": 0.8502994, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.17567568, + "altHomGenotypeFreq": 0.12162162, + "hetGenotypeFreq": 0.3918919, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.6824324, + "refHomGenotypeFreq": 0.4864865, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.0051150895, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.010230179, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.9948849, + "refHomGenotypeFreq": 0.9897698, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.09948372, + "altHomGenotypeFreq": 0.05520254, + "hetGenotypeFreq": 0.21882446, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.8353852, + "refHomGenotypeFreq": 0.725973, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.013097072, + "altHomGenotypeFreq": 0.0071905497, + "hetGenotypeFreq": 0.055469953, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.9650745, + "refHomGenotypeFreq": 0.9373395, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.05937693, + "altHomGenotypeFreq": 0.03331277, + "hetGenotypeFreq": 0.1363356, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.89851946, + "refHomGenotypeFreq": 0.83035165, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.053156145, + "altHomGenotypeFreq": 0.027408637, + "hetGenotypeFreq": 0.13662791, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.9042774, + "refHomGenotypeFreq": 0.8359634, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2109375, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.734375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.5078125, + "refHomGenotypeFreq": 0.140625, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.31329873, + "altHomGenotypeFreq": 0.23642172, + "hetGenotypeFreq": 0.60103834, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.4630591, + "refHomGenotypeFreq": 0.16253993, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3006135, + "altHomGenotypeFreq": 0.38854808, + "hetGenotypeFreq": 0.55010223, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.3364008, + "refHomGenotypeFreq": 0.061349694, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3723404, + "altHomGenotypeFreq": 0.27659574, + "hetGenotypeFreq": 0.59574467, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.42553192, + "refHomGenotypeFreq": 0.12765957, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2990196, + "altHomGenotypeFreq": 0.43137255, + "hetGenotypeFreq": 0.5, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.31862745, + "refHomGenotypeFreq": 0.068627454, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.36838123, + "altHomGenotypeFreq": 0.08472012, + "hetGenotypeFreq": 0.63237524, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5990923, + "refHomGenotypeFreq": 0.28290468, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.21428572, + "altHomGenotypeFreq": 0.17142858, + "hetGenotypeFreq": 0.63809526, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.5095238, + "refHomGenotypeFreq": 0.1904762, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.20192307, + "altHomGenotypeFreq": 0.18269232, + "hetGenotypeFreq": 0.6442308, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.49519232, + "refHomGenotypeFreq": 0.17307693, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3564815, + "altHomGenotypeFreq": 0.08333333, + "hetGenotypeFreq": 0.6481482, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.5925926, + "refHomGenotypeFreq": 0.2685185, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32291666, + "altHomGenotypeFreq": 0.37499997, + "hetGenotypeFreq": 0.5833333, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.041666668, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.34513274, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.6548673, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.6460177, + "refHomGenotypeFreq": 0.31858408, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.28921568, + "altHomGenotypeFreq": 0.3627451, + "hetGenotypeFreq": 0.5686275, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.3529412, + "refHomGenotypeFreq": 0.068627454, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3956044, + "altHomGenotypeFreq": 0.31868133, + "hetGenotypeFreq": 0.5604396, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.4010989, + "refHomGenotypeFreq": 0.12087912, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2956989, + "altHomGenotypeFreq": 0.34408602, + "hetGenotypeFreq": 0.5591397, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.37634408, + "refHomGenotypeFreq": 0.09677419, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.26767677, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.62626266, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.3939394, + "refHomGenotypeFreq": 0.08080808, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3411215, + "altHomGenotypeFreq": 0.36448598, + "hetGenotypeFreq": 0.46728972, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.40186915, + "refHomGenotypeFreq": 0.1682243, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27906978, + "altHomGenotypeFreq": 0.36046514, + "hetGenotypeFreq": 0.55813956, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.3604651, + "refHomGenotypeFreq": 0.08139535, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.38020834, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.62500006, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.5625, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3989899, + "altHomGenotypeFreq": 0.1010101, + "hetGenotypeFreq": 0.62626266, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.5858586, + "refHomGenotypeFreq": 0.27272728, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.42424244, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.62626266, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.5555556, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.361829, + "altHomGenotypeFreq": 0.3300199, + "hetGenotypeFreq": 0.5666004, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.38667992, + "refHomGenotypeFreq": 0.10337972, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32786885, + "altHomGenotypeFreq": 0.09836065, + "hetGenotypeFreq": 0.55737704, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.6229508, + "refHomGenotypeFreq": 0.3442623, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.26801154, + "altHomGenotypeFreq": 0.19884726, + "hetGenotypeFreq": 0.6167147, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.49279538, + "refHomGenotypeFreq": 0.18443803, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32941177, + "altHomGenotypeFreq": 0.03529412, + "hetGenotypeFreq": 0.65882355, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.63529414, + "refHomGenotypeFreq": 0.30588236, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3106796, + "altHomGenotypeFreq": 0.407767, + "hetGenotypeFreq": 0.5436893, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.32038835, + "refHomGenotypeFreq": 0.048543688, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32323232, + "altHomGenotypeFreq": 0.34343433, + "hetGenotypeFreq": 0.5656566, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.37373737, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.39719626, + "altHomGenotypeFreq": 0.35514018, + "hetGenotypeFreq": 0.58878505, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.3504673, + "refHomGenotypeFreq": 0.056074765, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3125, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.59615386, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.47115386, + "refHomGenotypeFreq": 0.17307693, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.35353535, + "altHomGenotypeFreq": 0.26262626, + "hetGenotypeFreq": 0.65656567, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.4090909, + "refHomGenotypeFreq": 0.08080808, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.14117648, + "altHomGenotypeFreq": 0.12941177, + "hetGenotypeFreq": 0.5764706, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.58235294, + "refHomGenotypeFreq": 0.29411766, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2361111, + "altHomGenotypeFreq": 0.2202381, + "hetGenotypeFreq": 0.6329365, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.46329364, + "refHomGenotypeFreq": 0.1468254, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.20873787, + "altHomGenotypeFreq": 0.1262136, + "hetGenotypeFreq": 0.6893204, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.5291262, + "refHomGenotypeFreq": 0.18446602, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "10485", + "percentageMatch": 0.905737, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "10639", + "percentageMatch": 0.904024, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083905, + "id": "10488", + "percentageMatch": 0.921328, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "8430", + "percentageMatch": 0.909773, + "source": "genomicSuperDup", + "start": 22063032 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22084143, + "id": "8407", + "percentageMatch": 0.904388, + "source": "genomicSuperDup", + "start": 22051936 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083736, + "id": "10489", + "percentageMatch": 0.918873, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10993", + "percentageMatch": 0.96883, + "source": "genomicSuperDup", + "start": 21966964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083905, + "id": "10487", + "percentageMatch": 0.920561, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22083736, + "id": "10486", + "percentageMatch": 0.919429, + "source": "genomicSuperDup", + "start": 22057809 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22091216, + "id": "10387", + "percentageMatch": 0.975208, + "source": "genomicSuperDup", + "start": 22041405 + } + ], + "start": 22077310, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22077310, + "id": "15:22077310:A:-", + "length": 1, + "names": [], + "reference": "A", + "start": 22077310, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000258585", + "ensemblTranscriptId": "ENST00000557158", + "geneName": "RP11-928F19.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.03700000047683716, + "source": "phastCons" + }, + { + "score": -1.8990000486373901, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "downstream_gene_variant", + "functionalScore": [ + { + "score": 0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.890000104904175, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs529641734", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.51997834, + "altHomGenotypeFreq": 0.07261173, + "hetGenotypeFreq": 0.8947333, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.48002163, + "refHomGenotypeFreq": 0.032654993, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5314465, + "altHomGenotypeFreq": 0.08385744, + "hetGenotypeFreq": 0.8951782, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.46855345, + "refHomGenotypeFreq": 0.02096436, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5355805, + "altHomGenotypeFreq": 0.07740325, + "hetGenotypeFreq": 0.91635454, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.46441948, + "refHomGenotypeFreq": 0.0062421975, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.509901, + "altHomGenotypeFreq": 0.05940594, + "hetGenotypeFreq": 0.9009901, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.490099, + "refHomGenotypeFreq": 0.03960396, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.537931, + "altHomGenotypeFreq": 0.096551724, + "hetGenotypeFreq": 0.8827586, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.46206897, + "refHomGenotypeFreq": 0.020689655, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53621, + "altHomGenotypeFreq": 0.10500905, + "hetGenotypeFreq": 0.8624019, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.46378997, + "refHomGenotypeFreq": 0.032589015, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52997786, + "altHomGenotypeFreq": 0.0801717, + "hetGenotypeFreq": 0.8996123, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.47002214, + "refHomGenotypeFreq": 0.020216007, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49167687, + "altHomGenotypeFreq": 0.044308446, + "hetGenotypeFreq": 0.8947368, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.50832313, + "refHomGenotypeFreq": 0.060954712, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52058893, + "altHomGenotypeFreq": 0.0730694, + "hetGenotypeFreq": 0.8950391, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.47941104, + "refHomGenotypeFreq": 0.031891495, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.519222, + "altHomGenotypeFreq": 0.072044805, + "hetGenotypeFreq": 0.89435446, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.48077795, + "refHomGenotypeFreq": 0.033600725, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5390625, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.828125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.4609375, + "refHomGenotypeFreq": 0.046875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.57208467, + "altHomGenotypeFreq": 0.19928116, + "hetGenotypeFreq": 0.745607, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.42791533, + "refHomGenotypeFreq": 0.05511182, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.593047, + "altHomGenotypeFreq": 0.20245399, + "hetGenotypeFreq": 0.7811861, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.40695298, + "refHomGenotypeFreq": 0.016359918, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5744681, + "altHomGenotypeFreq": 0.21276596, + "hetGenotypeFreq": 0.7234043, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.42553192, + "refHomGenotypeFreq": 0.06382979, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60294116, + "altHomGenotypeFreq": 0.21568628, + "hetGenotypeFreq": 0.7745098, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.3970588, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.098335855, + "hetGenotypeFreq": 0.8033283, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.098335855, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.63809526, + "altHomGenotypeFreq": 0.2857143, + "hetGenotypeFreq": 0.7047619, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.36190477, + "refHomGenotypeFreq": 0.00952381, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.61538464, + "altHomGenotypeFreq": 0.27884614, + "hetGenotypeFreq": 0.6730769, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.3846154, + "refHomGenotypeFreq": 0.048076924, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4814815, + "altHomGenotypeFreq": 0.10185185, + "hetGenotypeFreq": 0.7592592, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.5185185, + "refHomGenotypeFreq": 0.1388889, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5729167, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.8125, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.42708334, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49115044, + "altHomGenotypeFreq": 0.07079646, + "hetGenotypeFreq": 0.8407079, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.50884956, + "refHomGenotypeFreq": 0.088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60294116, + "altHomGenotypeFreq": 0.21568628, + "hetGenotypeFreq": 0.7745098, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.3970588, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5879121, + "altHomGenotypeFreq": 0.24175824, + "hetGenotypeFreq": 0.6923077, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.41208792, + "refHomGenotypeFreq": 0.06593407, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6344086, + "altHomGenotypeFreq": 0.2795699, + "hetGenotypeFreq": 0.70967746, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.3655914, + "refHomGenotypeFreq": 0.010752688, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64141417, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.6767677, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.35858586, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5981308, + "altHomGenotypeFreq": 0.26168224, + "hetGenotypeFreq": 0.6728972, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.40186915, + "refHomGenotypeFreq": 0.06542056, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5988372, + "altHomGenotypeFreq": 0.22093023, + "hetGenotypeFreq": 0.75581396, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.4011628, + "refHomGenotypeFreq": 0.023255814, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5052083, + "altHomGenotypeFreq": 0.13541667, + "hetGenotypeFreq": 0.7395834, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.49479166, + "refHomGenotypeFreq": 0.125, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5252525, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.8080808, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.47474748, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5050505, + "altHomGenotypeFreq": 0.121212125, + "hetGenotypeFreq": 0.7676768, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.4949495, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.59940356, + "altHomGenotypeFreq": 0.24850895, + "hetGenotypeFreq": 0.70178926, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.4005964, + "refHomGenotypeFreq": 0.049701788, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5081967, + "altHomGenotypeFreq": 0.08196721, + "hetGenotypeFreq": 0.852459, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.4918033, + "refHomGenotypeFreq": 0.06557377, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5360231, + "altHomGenotypeFreq": 0.15561959, + "hetGenotypeFreq": 0.7608069, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.46397695, + "refHomGenotypeFreq": 0.08357349, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4882353, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.88235295, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.5117647, + "refHomGenotypeFreq": 0.07058824, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5873786, + "altHomGenotypeFreq": 0.19417475, + "hetGenotypeFreq": 0.78640777, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.41262135, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5808081, + "altHomGenotypeFreq": 0.22222222, + "hetGenotypeFreq": 0.71717167, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.41919193, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60747665, + "altHomGenotypeFreq": 0.27102804, + "hetGenotypeFreq": 0.6728972, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.39252338, + "refHomGenotypeFreq": 0.056074765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5480769, + "altHomGenotypeFreq": 0.1826923, + "hetGenotypeFreq": 0.7307692, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.45192307, + "refHomGenotypeFreq": 0.086538464, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6212121, + "altHomGenotypeFreq": 0.24242425, + "hetGenotypeFreq": 0.75757575, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.37878788, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4764706, + "altHomGenotypeFreq": 0.08235294, + "hetGenotypeFreq": 0.7882353, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.5235294, + "refHomGenotypeFreq": 0.12941177, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6438492, + "altHomGenotypeFreq": 0.30952382, + "hetGenotypeFreq": 0.66865075, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.3561508, + "refHomGenotypeFreq": 0.021825397, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6893204, + "altHomGenotypeFreq": 0.39805827, + "hetGenotypeFreq": 0.5825243, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.3106796, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + } + ], + "start": 22115044, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22115044, + "id": "15:22115044:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22115044, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "cdnaPosition": 2025, + "ensemblGeneId": "ENSG00000258997", + "ensemblTranscriptId": "ENST00000556855", + "exonOverlap": [ + { + "number": "13/16", + "percentage": 0.6289308 + } + ], + "geneName": "NF1P2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0.8569999933242798, + "source": "gerp" + }, + { + "score": 0.05700000002980232, + "source": "phastCons" + }, + { + "score": 0.1940000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.9399995803833008, + "source": "cadd_raw" + }, + { + "score": 10.34000015258789, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556855(ENSG00000258997):n.2025C>T" + ], + "id": "rs765446853", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.32820097, + "altHomGenotypeFreq": 0.006482982, + "hetGenotypeFreq": 0.64343596, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.671799, + "refHomGenotypeFreq": 0.35008103, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3247549, + "altHomGenotypeFreq": 0.004901961, + "hetGenotypeFreq": 0.6397059, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.6752451, + "refHomGenotypeFreq": 0.35539216, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42692307, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.85384613, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5730769, + "refHomGenotypeFreq": 0.14615385, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35923752, + "altHomGenotypeFreq": 0.0029325513, + "hetGenotypeFreq": 0.71260995, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.64076245, + "refHomGenotypeFreq": 0.28445747, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27586207, + "altHomGenotypeFreq": 0.01724138, + "hetGenotypeFreq": 0.51724136, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7241379, + "refHomGenotypeFreq": 0.46551725, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30673143, + "altHomGenotypeFreq": 0.009715475, + "hetGenotypeFreq": 0.59403193, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.69326854, + "refHomGenotypeFreq": 0.3962526, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29389128, + "altHomGenotypeFreq": 0.004489338, + "hetGenotypeFreq": 0.5788039, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7061087, + "refHomGenotypeFreq": 0.41670674, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37539852, + "altHomGenotypeFreq": 0.009829968, + "hetGenotypeFreq": 0.7311371, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.6246015, + "refHomGenotypeFreq": 0.25903293, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32840893, + "altHomGenotypeFreq": 0.0073519214, + "hetGenotypeFreq": 0.64211404, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.67159104, + "refHomGenotypeFreq": 0.35053405, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32794017, + "altHomGenotypeFreq": 0.00539318, + "hetGenotypeFreq": 0.6450939, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.67205983, + "refHomGenotypeFreq": 0.34951288, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.21348314, + "altHomGenotypeFreq": 0.011235955, + "hetGenotypeFreq": 0.40449437, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.78651685, + "refHomGenotypeFreq": 0.58426964, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22142559, + "id": "10352", + "percentageMatch": 0.921922, + "source": "genomicSuperDup", + "start": 22132829 + } + ], + "start": 22140359, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22140359, + "id": "15:22140359:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22140359, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258997", + "ensemblTranscriptId": "ENST00000556855", + "geneName": "NF1P2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 1.7999999523162842, + "source": "gerp" + }, + { + "score": 0.05700000002980232, + "source": "phastCons" + }, + { + "score": 0.16300000250339508, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.3599996566772461, + "source": "cadd_raw" + }, + { + "score": 6.329999923706055, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556855(ENSG00000258997):n.1948-76T>G" + ], + "id": "rs775175845", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.5021873, + "altHomGenotypeFreq": 0.05748462, + "hetGenotypeFreq": 0.8894053, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.49781272, + "refHomGenotypeFreq": 0.05311005, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5147059, + "altHomGenotypeFreq": 0.05672269, + "hetGenotypeFreq": 0.9159664, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.4852941, + "refHomGenotypeFreq": 0.027310925, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52767295, + "altHomGenotypeFreq": 0.06666667, + "hetGenotypeFreq": 0.92201257, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.47232705, + "refHomGenotypeFreq": 0.011320755, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46514747, + "altHomGenotypeFreq": 0.018766755, + "hetGenotypeFreq": 0.8927614, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.53485256, + "refHomGenotypeFreq": 0.08847185, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49295774, + "altHomGenotypeFreq": 0.028169014, + "hetGenotypeFreq": 0.92957747, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5070422, + "refHomGenotypeFreq": 0.04225352, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.51823074, + "altHomGenotypeFreq": 0.07650927, + "hetGenotypeFreq": 0.88344294, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.48176926, + "refHomGenotypeFreq": 0.040047817, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5173877, + "altHomGenotypeFreq": 0.07052441, + "hetGenotypeFreq": 0.8937265, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.4826123, + "refHomGenotypeFreq": 0.035749063, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46521848, + "altHomGenotypeFreq": 0.02887996, + "hetGenotypeFreq": 0.872677, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5347815, + "refHomGenotypeFreq": 0.098442994, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5001236, + "altHomGenotypeFreq": 0.05488257, + "hetGenotypeFreq": 0.89048207, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.49987638, + "refHomGenotypeFreq": 0.054635353, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50474006, + "altHomGenotypeFreq": 0.060703363, + "hetGenotypeFreq": 0.8880734, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.49525994, + "refHomGenotypeFreq": 0.05122324, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.08239701, + "hetGenotypeFreq": 0.835206, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.08239701, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22142559, + "id": "10352", + "percentageMatch": 0.921922, + "source": "genomicSuperDup", + "start": 22132829 + } + ], + "start": 22140512, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22140512, + "id": "15:22140512:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 22140512, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "cdnaPosition": 1653, + "ensemblGeneId": "ENSG00000258997", + "ensemblTranscriptId": "ENST00000556855", + "exonOverlap": [ + { + "number": "10/16", + "percentage": 0.48076922 + } + ], + "geneName": "NF1P2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 1.7999999523162842, + "source": "gerp" + }, + { + "score": 0.23399999737739563, + "source": "phastCons" + }, + { + "score": 0.1940000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.0799999237060547, + "source": "cadd_raw" + }, + { + "score": 11.130000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556855(ENSG00000258997):n.1653C>A" + ], + "id": "rs140569468", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.42675364, + "altHomGenotypeFreq": 0.11037125, + "hetGenotypeFreq": 0.63276476, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.57324636, + "refHomGenotypeFreq": 0.256864, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42077923, + "altHomGenotypeFreq": 0.08311688, + "hetGenotypeFreq": 0.6753247, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5792208, + "refHomGenotypeFreq": 0.24155845, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4918167, + "altHomGenotypeFreq": 0.09328969, + "hetGenotypeFreq": 0.797054, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5081833, + "refHomGenotypeFreq": 0.109656304, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43730408, + "altHomGenotypeFreq": 0.0846395, + "hetGenotypeFreq": 0.7053292, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5626959, + "refHomGenotypeFreq": 0.21003135, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47247708, + "altHomGenotypeFreq": 0.14678898, + "hetGenotypeFreq": 0.6513761, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5275229, + "refHomGenotypeFreq": 0.20183486, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44657534, + "altHomGenotypeFreq": 0.13835616, + "hetGenotypeFreq": 0.6164383, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.55342466, + "refHomGenotypeFreq": 0.24520548, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42455176, + "altHomGenotypeFreq": 0.10296467, + "hetGenotypeFreq": 0.6431742, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5754483, + "refHomGenotypeFreq": 0.2538612, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40126738, + "altHomGenotypeFreq": 0.1210139, + "hetGenotypeFreq": 0.56050694, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.59873265, + "refHomGenotypeFreq": 0.31847915, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4255583, + "altHomGenotypeFreq": 0.11000827, + "hetGenotypeFreq": 0.63110006, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.5744417, + "refHomGenotypeFreq": 0.25889164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42822286, + "altHomGenotypeFreq": 0.1108174, + "hetGenotypeFreq": 0.6348109, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.57177716, + "refHomGenotypeFreq": 0.2543717, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45390782, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.54609215, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4375, + "altHomGenotypeFreq": 0.078125, + "hetGenotypeFreq": 0.71875, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.5625, + "refHomGenotypeFreq": 0.203125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45127794, + "altHomGenotypeFreq": 0.17611821, + "hetGenotypeFreq": 0.5503195, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.548722, + "refHomGenotypeFreq": 0.2735623, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44989774, + "altHomGenotypeFreq": 0.10224949, + "hetGenotypeFreq": 0.6952965, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.55010223, + "refHomGenotypeFreq": 0.20245399, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4893617, + "altHomGenotypeFreq": 0.17021276, + "hetGenotypeFreq": 0.63829786, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.5106383, + "refHomGenotypeFreq": 0.19148937, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47549018, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.61764705, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.5245098, + "refHomGenotypeFreq": 0.21568628, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42889562, + "altHomGenotypeFreq": 0.2344932, + "hetGenotypeFreq": 0.38880485, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5711044, + "refHomGenotypeFreq": 0.37670198, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50476193, + "altHomGenotypeFreq": 0.1904762, + "hetGenotypeFreq": 0.62857145, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.4952381, + "refHomGenotypeFreq": 0.18095239, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5048077, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.5480769, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.49519232, + "refHomGenotypeFreq": 0.22115384, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47685185, + "altHomGenotypeFreq": 0.28703704, + "hetGenotypeFreq": 0.3796296, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.5231481, + "refHomGenotypeFreq": 0.33333334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45833334, + "altHomGenotypeFreq": 0.114583336, + "hetGenotypeFreq": 0.6875, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.5416667, + "refHomGenotypeFreq": 0.19791667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38053098, + "altHomGenotypeFreq": 0.16814159, + "hetGenotypeFreq": 0.42477876, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.61946905, + "refHomGenotypeFreq": 0.40707964, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4362745, + "altHomGenotypeFreq": 0.09803922, + "hetGenotypeFreq": 0.67647064, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.5637255, + "refHomGenotypeFreq": 0.2254902, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41758242, + "altHomGenotypeFreq": 0.18681319, + "hetGenotypeFreq": 0.46153846, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.5824176, + "refHomGenotypeFreq": 0.35164836, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4623656, + "altHomGenotypeFreq": 0.10752688, + "hetGenotypeFreq": 0.7096774, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.53763443, + "refHomGenotypeFreq": 0.1827957, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45959595, + "altHomGenotypeFreq": 0.1010101, + "hetGenotypeFreq": 0.7171717, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.540404, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42523363, + "altHomGenotypeFreq": 0.1682243, + "hetGenotypeFreq": 0.5140187, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.57476634, + "refHomGenotypeFreq": 0.317757, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4011628, + "altHomGenotypeFreq": 0.058139537, + "hetGenotypeFreq": 0.6860465, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.5988372, + "refHomGenotypeFreq": 0.25581396, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43229166, + "altHomGenotypeFreq": 0.21875, + "hetGenotypeFreq": 0.4270833, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.5677083, + "refHomGenotypeFreq": 0.35416666, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36363637, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.42424244, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.6363636, + "refHomGenotypeFreq": 0.42424244, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47474748, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.36363634, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.5252525, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4274354, + "altHomGenotypeFreq": 0.1749503, + "hetGenotypeFreq": 0.5049702, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.5725646, + "refHomGenotypeFreq": 0.32007954, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39344263, + "altHomGenotypeFreq": 0.19672132, + "hetGenotypeFreq": 0.39344263, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.60655737, + "refHomGenotypeFreq": 0.40983605, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4668588, + "altHomGenotypeFreq": 0.16426513, + "hetGenotypeFreq": 0.6051873, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5331412, + "refHomGenotypeFreq": 0.23054755, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4764706, + "altHomGenotypeFreq": 0.32941177, + "hetGenotypeFreq": 0.29411766, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.5235294, + "refHomGenotypeFreq": 0.3764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47087377, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.80582523, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.5291262, + "refHomGenotypeFreq": 0.1262136, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3939394, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.4848485, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.6060606, + "refHomGenotypeFreq": 0.36363637, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48598132, + "altHomGenotypeFreq": 0.22429906, + "hetGenotypeFreq": 0.5233645, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.5140187, + "refHomGenotypeFreq": 0.25233644, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43269232, + "altHomGenotypeFreq": 0.16346154, + "hetGenotypeFreq": 0.53846157, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.5673077, + "refHomGenotypeFreq": 0.29807693, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4090909, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.53535354, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.59090906, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5058824, + "altHomGenotypeFreq": 0.22352941, + "hetGenotypeFreq": 0.5647059, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.49411765, + "refHomGenotypeFreq": 0.21176471, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49503967, + "altHomGenotypeFreq": 0.18055555, + "hetGenotypeFreq": 0.62896824, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5049603, + "refHomGenotypeFreq": 0.1904762, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5388349, + "altHomGenotypeFreq": 0.26213592, + "hetGenotypeFreq": 0.5533981, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.46116504, + "refHomGenotypeFreq": 0.18446602, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41385767, + "altHomGenotypeFreq": 0.16479401, + "hetGenotypeFreq": 0.49812734, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.5861423, + "refHomGenotypeFreq": 0.33707866, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152583, + "id": "10353", + "percentageMatch": 0.928725, + "source": "genomicSuperDup", + "start": 22142613 + } + ], + "start": 22145400, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22145400, + "id": "15:22145400:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22145400, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "cdnaPosition": 1652, + "ensemblGeneId": "ENSG00000258997", + "ensemblTranscriptId": "ENST00000556855", + "exonOverlap": [ + { + "number": "10/16", + "percentage": 0.48076922 + } + ], + "geneName": "NF1P2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 1.7999999523162842, + "source": "gerp" + }, + { + "score": 0.2290000021457672, + "source": "phastCons" + }, + { + "score": 0.1940000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.4300003051757812, + "source": "cadd_raw" + }, + { + "score": 12.960000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556855(ENSG00000258997):n.1652G>A" + ], + "id": "rs150450298", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.4253994, + "altHomGenotypeFreq": 0.11084033, + "hetGenotypeFreq": 0.62911814, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5746006, + "refHomGenotypeFreq": 0.2600415, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41968912, + "altHomGenotypeFreq": 0.08290155, + "hetGenotypeFreq": 0.6735751, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.5803109, + "refHomGenotypeFreq": 0.24352331, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48944804, + "altHomGenotypeFreq": 0.09253247, + "hetGenotypeFreq": 0.79383117, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5105519, + "refHomGenotypeFreq": 0.11363637, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4363354, + "altHomGenotypeFreq": 0.08695652, + "hetGenotypeFreq": 0.69875777, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.5636646, + "refHomGenotypeFreq": 0.21428572, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47247708, + "altHomGenotypeFreq": 0.14678898, + "hetGenotypeFreq": 0.6513761, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.5275229, + "refHomGenotypeFreq": 0.20183486, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44724303, + "altHomGenotypeFreq": 0.13955072, + "hetGenotypeFreq": 0.61538464, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.55275697, + "refHomGenotypeFreq": 0.24506468, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42397815, + "altHomGenotypeFreq": 0.1034179, + "hetGenotypeFreq": 0.6411205, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.57602185, + "refHomGenotypeFreq": 0.2554616, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39744103, + "altHomGenotypeFreq": 0.12115154, + "hetGenotypeFreq": 0.552579, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.602559, + "refHomGenotypeFreq": 0.32626948, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42409107, + "altHomGenotypeFreq": 0.110547006, + "hetGenotypeFreq": 0.6270881, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.57590896, + "refHomGenotypeFreq": 0.2623649, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42700583, + "altHomGenotypeFreq": 0.11120048, + "hetGenotypeFreq": 0.6316107, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.5729942, + "refHomGenotypeFreq": 0.25718883, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4529058, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5470942, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4375, + "altHomGenotypeFreq": 0.078125, + "hetGenotypeFreq": 0.71875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.5625, + "refHomGenotypeFreq": 0.203125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45127794, + "altHomGenotypeFreq": 0.17611821, + "hetGenotypeFreq": 0.5503195, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.548722, + "refHomGenotypeFreq": 0.2735623, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44989774, + "altHomGenotypeFreq": 0.10224949, + "hetGenotypeFreq": 0.6952965, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.55010223, + "refHomGenotypeFreq": 0.20245399, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4893617, + "altHomGenotypeFreq": 0.17021276, + "hetGenotypeFreq": 0.63829786, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.5106383, + "refHomGenotypeFreq": 0.19148937, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47549018, + "altHomGenotypeFreq": 0.16666667, + "hetGenotypeFreq": 0.61764705, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.5245098, + "refHomGenotypeFreq": 0.21568628, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42889562, + "altHomGenotypeFreq": 0.2344932, + "hetGenotypeFreq": 0.38880485, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5711044, + "refHomGenotypeFreq": 0.37670198, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.50476193, + "altHomGenotypeFreq": 0.1904762, + "hetGenotypeFreq": 0.62857145, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.4952381, + "refHomGenotypeFreq": 0.18095239, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5048077, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.5480769, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.49519232, + "refHomGenotypeFreq": 0.22115384, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47685185, + "altHomGenotypeFreq": 0.28703704, + "hetGenotypeFreq": 0.3796296, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.5231481, + "refHomGenotypeFreq": 0.33333334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45833334, + "altHomGenotypeFreq": 0.114583336, + "hetGenotypeFreq": 0.6875, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.5416667, + "refHomGenotypeFreq": 0.19791667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38053098, + "altHomGenotypeFreq": 0.16814159, + "hetGenotypeFreq": 0.42477876, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.61946905, + "refHomGenotypeFreq": 0.40707964, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4362745, + "altHomGenotypeFreq": 0.09803922, + "hetGenotypeFreq": 0.67647064, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.5637255, + "refHomGenotypeFreq": 0.2254902, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41758242, + "altHomGenotypeFreq": 0.18681319, + "hetGenotypeFreq": 0.46153846, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.5824176, + "refHomGenotypeFreq": 0.35164836, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4623656, + "altHomGenotypeFreq": 0.10752688, + "hetGenotypeFreq": 0.7096774, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.53763443, + "refHomGenotypeFreq": 0.1827957, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45959595, + "altHomGenotypeFreq": 0.1010101, + "hetGenotypeFreq": 0.7171717, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.540404, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42523363, + "altHomGenotypeFreq": 0.1682243, + "hetGenotypeFreq": 0.5140187, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.57476634, + "refHomGenotypeFreq": 0.317757, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4011628, + "altHomGenotypeFreq": 0.058139537, + "hetGenotypeFreq": 0.6860465, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.5988372, + "refHomGenotypeFreq": 0.25581396, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43229166, + "altHomGenotypeFreq": 0.21875, + "hetGenotypeFreq": 0.4270833, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.5677083, + "refHomGenotypeFreq": 0.35416666, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36363637, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.42424244, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.6363636, + "refHomGenotypeFreq": 0.42424244, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47474748, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.36363634, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.5252525, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4274354, + "altHomGenotypeFreq": 0.1749503, + "hetGenotypeFreq": 0.5049702, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.5725646, + "refHomGenotypeFreq": 0.32007954, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39344263, + "altHomGenotypeFreq": 0.19672132, + "hetGenotypeFreq": 0.39344263, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.60655737, + "refHomGenotypeFreq": 0.40983605, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4668588, + "altHomGenotypeFreq": 0.16426513, + "hetGenotypeFreq": 0.6051873, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.5331412, + "refHomGenotypeFreq": 0.23054755, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4764706, + "altHomGenotypeFreq": 0.32941177, + "hetGenotypeFreq": 0.29411766, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.5235294, + "refHomGenotypeFreq": 0.3764706, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47087377, + "altHomGenotypeFreq": 0.067961164, + "hetGenotypeFreq": 0.80582523, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.5291262, + "refHomGenotypeFreq": 0.1262136, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3939394, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.4848485, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6060606, + "refHomGenotypeFreq": 0.36363637, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48598132, + "altHomGenotypeFreq": 0.22429906, + "hetGenotypeFreq": 0.5233645, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.5140187, + "refHomGenotypeFreq": 0.25233644, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.43269232, + "altHomGenotypeFreq": 0.16346154, + "hetGenotypeFreq": 0.53846157, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.5673077, + "refHomGenotypeFreq": 0.29807693, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4090909, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.53535354, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.59090906, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5058824, + "altHomGenotypeFreq": 0.22352941, + "hetGenotypeFreq": 0.5647059, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.49411765, + "refHomGenotypeFreq": 0.21176471, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49503967, + "altHomGenotypeFreq": 0.18055555, + "hetGenotypeFreq": 0.62896824, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5049603, + "refHomGenotypeFreq": 0.1904762, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5388349, + "altHomGenotypeFreq": 0.26213592, + "hetGenotypeFreq": 0.5533981, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.46116504, + "refHomGenotypeFreq": 0.18446602, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41385767, + "altHomGenotypeFreq": 0.16479401, + "hetGenotypeFreq": 0.49812734, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5861423, + "refHomGenotypeFreq": 0.33707866, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152583, + "id": "10353", + "percentageMatch": 0.928725, + "source": "genomicSuperDup", + "start": 22142613 + } + ], + "start": 22145401, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22145401, + "id": "15:22145401:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22145401, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258997", + "ensemblTranscriptId": "ENST00000556855", + "geneName": "NF1P2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.039000000804662704, + "source": "phastCons" + }, + { + "score": 0.04399999976158142, + "source": "phastCons" + }, + { + "score": 0.07400000095367432, + "source": "phylop" + }, + { + "score": 0.06300000101327896, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556855(ENSG00000258997):n.1288+85_1288+86delAC" + ], + "id": "rs370892931", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.35431936, + "altHomGenotypeFreq": 0.2995314, + "hetGenotypeFreq": 0.48107654, + "population": "ALL", + "refAllele": "GT", + "refAlleleFreq": 0.4599303, + "refHomGenotypeFreq": 0.21939205, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.37413794, + "altHomGenotypeFreq": 0.22413795, + "hetGenotypeFreq": 0.5482758, + "population": "OTH", + "refAllele": "GT", + "refAlleleFreq": 0.5017241, + "refHomGenotypeFreq": 0.22758621, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.54880476, + "altHomGenotypeFreq": 0.6175299, + "hetGenotypeFreq": 0.30876493, + "population": "EAS", + "refAllele": "GT", + "refAlleleFreq": 0.22808765, + "refHomGenotypeFreq": 0.07370518, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5254237, + "altHomGenotypeFreq": 0.4632768, + "hetGenotypeFreq": 0.3559322, + "population": "AMR", + "refAllele": "GT", + "refAlleleFreq": 0.35875705, + "refHomGenotypeFreq": 0.18079096, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.42307693, + "altHomGenotypeFreq": 0.2948718, + "hetGenotypeFreq": 0.47435898, + "population": "ASJ", + "refAllele": "GT", + "refAlleleFreq": 0.4679487, + "refHomGenotypeFreq": 0.23076923, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.40282902, + "altHomGenotypeFreq": 0.18942188, + "hetGenotypeFreq": 0.6531365, + "population": "FIN", + "refAllele": "GT", + "refAlleleFreq": 0.48400983, + "refHomGenotypeFreq": 0.15744157, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.40430203, + "altHomGenotypeFreq": 0.28226513, + "hetGenotypeFreq": 0.4956102, + "population": "NFE", + "refAllele": "GT", + "refAlleleFreq": 0.46992975, + "refHomGenotypeFreq": 0.22212467, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.14132145, + "altHomGenotypeFreq": 0.30047193, + "hetGenotypeFreq": 0.42003146, + "population": "AFR", + "refAllele": "GT", + "refAlleleFreq": 0.48951232, + "refHomGenotypeFreq": 0.27949658, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.35046425, + "altHomGenotypeFreq": 0.30187866, + "hetGenotypeFreq": 0.47203624, + "population": "MALE", + "refAllele": "GT", + "refAlleleFreq": 0.46210322, + "refHomGenotypeFreq": 0.22608508, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.35915494, + "altHomGenotypeFreq": 0.2965872, + "hetGenotypeFreq": 0.49241602, + "population": "FEMALE", + "refAllele": "GT", + "refAlleleFreq": 0.45720476, + "refHomGenotypeFreq": 0.21099675, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6875, + "altHomGenotypeFreq": 0.4375, + "hetGenotypeFreq": 0.5, + "population": "MXL", + "refAllele": "GT", + "refAlleleFreq": 0.3125, + "refHomGenotypeFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.48801917, + "altHomGenotypeFreq": 0.1956869, + "hetGenotypeFreq": 0.5846646, + "population": "ALL", + "refAllele": "GT", + "refAlleleFreq": 0.51198083, + "refHomGenotypeFreq": 0.21964855, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5214724, + "altHomGenotypeFreq": 0.17586912, + "hetGenotypeFreq": 0.6912066, + "population": "SAS", + "refAllele": "GT", + "refAlleleFreq": 0.4785276, + "refHomGenotypeFreq": 0.13292433, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4787234, + "altHomGenotypeFreq": 0.19148937, + "hetGenotypeFreq": 0.5744681, + "population": "CLM", + "refAllele": "GT", + "refAlleleFreq": 0.5212766, + "refHomGenotypeFreq": 0.23404256, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.51960784, + "altHomGenotypeFreq": 0.19607843, + "hetGenotypeFreq": 0.64705884, + "population": "ITU", + "refAllele": "GT", + "refAlleleFreq": 0.48039216, + "refHomGenotypeFreq": 0.15686275, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.30030257, + "altHomGenotypeFreq": 0.034795765, + "hetGenotypeFreq": 0.5310136, + "population": "AFR", + "refAllele": "GT", + "refAlleleFreq": 0.69969743, + "refHomGenotypeFreq": 0.43419063, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.64285713, + "altHomGenotypeFreq": 0.36190477, + "hetGenotypeFreq": 0.5619048, + "population": "CHS", + "refAllele": "GT", + "refAlleleFreq": 0.35714287, + "refHomGenotypeFreq": 0.07619048, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6105769, + "altHomGenotypeFreq": 0.33653846, + "hetGenotypeFreq": 0.5480769, + "population": "JPT", + "refAllele": "GT", + "refAlleleFreq": 0.38942307, + "refHomGenotypeFreq": 0.115384616, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2962963, + "altHomGenotypeFreq": 0.046296295, + "hetGenotypeFreq": 0.5, + "population": "YRI", + "refAllele": "GT", + "refAlleleFreq": 0.7037037, + "refHomGenotypeFreq": 0.4537037, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.53125, + "altHomGenotypeFreq": 0.17708333, + "hetGenotypeFreq": 0.7083334, + "population": "PJL", + "refAllele": "GT", + "refAlleleFreq": 0.46875, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3318584, + "altHomGenotypeFreq": 0.017699115, + "hetGenotypeFreq": 0.62831855, + "population": "GWD", + "refAllele": "GT", + "refAlleleFreq": 0.6681416, + "refHomGenotypeFreq": 0.3539823, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5245098, + "altHomGenotypeFreq": 0.15686275, + "hetGenotypeFreq": 0.7352941, + "population": "STU", + "refAllele": "GT", + "refAlleleFreq": 0.47549018, + "refHomGenotypeFreq": 0.10784314, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.510989, + "altHomGenotypeFreq": 0.16483517, + "hetGenotypeFreq": 0.6923077, + "population": "GBR", + "refAllele": "GT", + "refAlleleFreq": 0.489011, + "refHomGenotypeFreq": 0.14285715, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6505376, + "altHomGenotypeFreq": 0.38709676, + "hetGenotypeFreq": 0.5268817, + "population": "CDX", + "refAllele": "GT", + "refAlleleFreq": 0.34946236, + "refHomGenotypeFreq": 0.086021505, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6363636, + "altHomGenotypeFreq": 0.36363637, + "hetGenotypeFreq": 0.5454545, + "population": "KHV", + "refAllele": "GT", + "refAlleleFreq": 0.36363637, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4813084, + "altHomGenotypeFreq": 0.17757009, + "hetGenotypeFreq": 0.6074766, + "population": "IBS", + "refAllele": "GT", + "refAlleleFreq": 0.5186916, + "refHomGenotypeFreq": 0.21495327, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.48255813, + "altHomGenotypeFreq": 0.093023255, + "hetGenotypeFreq": 0.7790698, + "population": "BEB", + "refAllele": "GT", + "refAlleleFreq": 0.51744187, + "refHomGenotypeFreq": 0.12790698, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32291666, + "altHomGenotypeFreq": 0.041666668, + "hetGenotypeFreq": 0.5625, + "population": "ACB", + "refAllele": "GT", + "refAlleleFreq": 0.6770833, + "refHomGenotypeFreq": 0.39583334, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27272728, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.5252525, + "population": "ESN", + "refAllele": "GT", + "refAlleleFreq": 0.72727275, + "refHomGenotypeFreq": 0.46464646, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2777778, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.4949495, + "population": "LWK", + "refAllele": "GT", + "refAlleleFreq": 0.7222222, + "refHomGenotypeFreq": 0.47474748, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.48210734, + "altHomGenotypeFreq": 0.1610338, + "hetGenotypeFreq": 0.6421471, + "population": "EUR", + "refAllele": "GT", + "refAlleleFreq": 0.51789266, + "refHomGenotypeFreq": 0.19681908, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.29508197, + "altHomGenotypeFreq": 0.06557377, + "hetGenotypeFreq": 0.45901638, + "population": "ASW", + "refAllele": "GT", + "refAlleleFreq": 0.704918, + "refHomGenotypeFreq": 0.47540984, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5951009, + "altHomGenotypeFreq": 0.3371758, + "hetGenotypeFreq": 0.5158502, + "population": "AMR", + "refAllele": "GT", + "refAlleleFreq": 0.40489915, + "refHomGenotypeFreq": 0.14697406, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3, + "altHomGenotypeFreq": 0.047058824, + "hetGenotypeFreq": 0.5058824, + "population": "MSL", + "refAllele": "GT", + "refAlleleFreq": 0.7, + "refHomGenotypeFreq": 0.44705883, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5436893, + "altHomGenotypeFreq": 0.24271844, + "hetGenotypeFreq": 0.6019417, + "population": "GIH", + "refAllele": "GT", + "refAlleleFreq": 0.4563107, + "refHomGenotypeFreq": 0.1553398, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.48989898, + "altHomGenotypeFreq": 0.14141414, + "hetGenotypeFreq": 0.6969697, + "population": "FIN", + "refAllele": "GT", + "refAlleleFreq": 0.510101, + "refHomGenotypeFreq": 0.16161616, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.43457943, + "altHomGenotypeFreq": 0.1588785, + "hetGenotypeFreq": 0.55140185, + "population": "TSI", + "refAllele": "GT", + "refAlleleFreq": 0.56542057, + "refHomGenotypeFreq": 0.2897196, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5048077, + "altHomGenotypeFreq": 0.23076923, + "hetGenotypeFreq": 0.5480769, + "population": "PUR", + "refAllele": "GT", + "refAlleleFreq": 0.49519232, + "refHomGenotypeFreq": 0.22115384, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.16161616, + "hetGenotypeFreq": 0.6767677, + "population": "CEU", + "refAllele": "GT", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.16161616, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.7647059, + "altHomGenotypeFreq": 0.5529412, + "hetGenotypeFreq": 0.42352942, + "population": "PEL", + "refAllele": "GT", + "refAlleleFreq": 0.23529412, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6339286, + "altHomGenotypeFreq": 0.36309522, + "hetGenotypeFreq": 0.5416666, + "population": "EAS", + "refAllele": "GT", + "refAlleleFreq": 0.36607143, + "refHomGenotypeFreq": 0.0952381, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.63106793, + "altHomGenotypeFreq": 0.36893204, + "hetGenotypeFreq": 0.52427185, + "population": "CHB", + "refAllele": "GT", + "refAlleleFreq": 0.36893204, + "refHomGenotypeFreq": 0.106796116, + "study": "1kG_phase3" + } + ], + "reference": "GT", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152583, + "id": "10353", + "percentageMatch": 0.928725, + "source": "genomicSuperDup", + "start": 22142613 + }, + { + "chromosome": "15", + "consensusSize": 2, + "copyNumber": 18.5, + "end": 22146407, + "percentageMatch": 0.94, + "period": 2, + "score": 65, + "sequence": "GT", + "source": "trf", + "start": 22146371 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + } + ], + "start": 22146377, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22146378, + "id": "15:22146377:GT:-", + "length": 2, + "names": [], + "reference": "GT", + "start": 22146377, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258997", + "ensemblTranscriptId": "ENST00000556855", + "geneName": "NF1P2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.8600000143051147, + "source": "gerp" + }, + { + "score": 0.012000000104308128, + "source": "phastCons" + }, + { + "score": -0.7070000171661377, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.5699996948242188, + "source": "cadd_raw" + }, + { + "score": 7.960000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556855(ENSG00000258997):n.1084-135C>T" + ], + "id": "rs145299859", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.99801785, + "altHomGenotypeFreq": 0.99610645, + "hetGenotypeFreq": 0.0038227383, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.0019821606, + "refHomGenotypeFreq": 7.079145E-5, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.99288076, + "altHomGenotypeFreq": 0.98601574, + "hetGenotypeFreq": 0.013729977, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.007119247, + "refHomGenotypeFreq": 2.5425883E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.99762547, + "altHomGenotypeFreq": 0.99537927, + "hetGenotypeFreq": 0.004492363, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.0023745347, + "refHomGenotypeFreq": 1.2835323E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9985004, + "altHomGenotypeFreq": 0.9970008, + "hetGenotypeFreq": 0.0029992107, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.0014996054, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9986022, + "altHomGenotypeFreq": 0.9972045, + "hetGenotypeFreq": 0.0027955272, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.0013977636, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.994705, + "altHomGenotypeFreq": 0.98941, + "hetGenotypeFreq": 0.010590015, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.0052950075, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9953704, + "altHomGenotypeFreq": 0.9907407, + "hetGenotypeFreq": 0.009259259, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.0046296297, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.99115044, + "altHomGenotypeFreq": 0.9823009, + "hetGenotypeFreq": 0.017699115, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.0088495575, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9947917, + "altHomGenotypeFreq": 0.9895833, + "hetGenotypeFreq": 0.010416667, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.0052083335, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9918033, + "altHomGenotypeFreq": 0.9836066, + "hetGenotypeFreq": 0.016393442, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.008196721, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9882353, + "altHomGenotypeFreq": 0.9764706, + "hetGenotypeFreq": 0.023529412, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.011764706, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.70411986, + "altHomGenotypeFreq": 0.70037454, + "hetGenotypeFreq": 0.007490637, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.29588014, + "refHomGenotypeFreq": 0.29213482, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152583, + "id": "10353", + "percentageMatch": 0.928725, + "source": "genomicSuperDup", + "start": 22142613 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "10640", + "percentageMatch": 0.925269, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "10490", + "percentageMatch": 0.929215, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "8432", + "percentageMatch": 0.92757, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "8405", + "percentageMatch": 0.927547, + "source": "genomicSuperDup", + "start": 22146927 + } + ], + "start": 22147955, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22147955, + "id": "15:22147955:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22147955, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "cdnaPosition": 972, + "ensemblGeneId": "ENSG00000258997", + "ensemblTranscriptId": "ENST00000556855", + "exonOverlap": [ + { + "number": "6/16", + "percentage": 0.8196721 + } + ], + "geneName": "NF1P2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 1.7999999523162842, + "source": "gerp" + }, + { + "score": 0.02500000037252903, + "source": "phastCons" + }, + { + "score": -1.0329999923706055, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.5699996948242188, + "source": "cadd_raw" + }, + { + "score": 7.989999771118164, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556855(ENSG00000258997):n.972A>G" + ], + "id": "rs145776300", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.79916734, + "altHomGenotypeFreq": 0.60818136, + "hetGenotypeFreq": 0.381972, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.20083268, + "refHomGenotypeFreq": 0.009846683, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72899157, + "altHomGenotypeFreq": 0.47478992, + "hetGenotypeFreq": 0.50840336, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.2710084, + "refHomGenotypeFreq": 0.016806724, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88998765, + "altHomGenotypeFreq": 0.7812114, + "hetGenotypeFreq": 0.21755253, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.11001236, + "refHomGenotypeFreq": 0.0012360939, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8683575, + "altHomGenotypeFreq": 0.74396133, + "hetGenotypeFreq": 0.24879228, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.1316425, + "refHomGenotypeFreq": 0.007246377, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8074324, + "altHomGenotypeFreq": 0.6283784, + "hetGenotypeFreq": 0.3581081, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.19256757, + "refHomGenotypeFreq": 0.013513514, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7409779, + "altHomGenotypeFreq": 0.49301514, + "hetGenotypeFreq": 0.4959255, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.25902212, + "refHomGenotypeFreq": 0.011059372, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.74549764, + "altHomGenotypeFreq": 0.5030467, + "hetGenotypeFreq": 0.48490182, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.25450236, + "refHomGenotypeFreq": 0.012051456, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9011239, + "altHomGenotypeFreq": 0.80870396, + "hetGenotypeFreq": 0.18483979, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.09887613, + "refHomGenotypeFreq": 0.006456241, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8031953, + "altHomGenotypeFreq": 0.61668265, + "hetGenotypeFreq": 0.37302536, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.19680469, + "refHomGenotypeFreq": 0.010292006, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7942001, + "altHomGenotypeFreq": 0.59769773, + "hetGenotypeFreq": 0.39300472, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.20579988, + "refHomGenotypeFreq": 0.009297521, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75050104, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.249499, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8203125, + "altHomGenotypeFreq": 0.640625, + "hetGenotypeFreq": 0.359375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.1796875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.845647, + "altHomGenotypeFreq": 0.69728434, + "hetGenotypeFreq": 0.29672524, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.15435304, + "refHomGenotypeFreq": 0.0059904153, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77300614, + "altHomGenotypeFreq": 0.55010223, + "hetGenotypeFreq": 0.44580775, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.22699386, + "refHomGenotypeFreq": 0.0040899795, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81914896, + "altHomGenotypeFreq": 0.63829786, + "hetGenotypeFreq": 0.36170214, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.18085106, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.79901963, + "altHomGenotypeFreq": 0.61764705, + "hetGenotypeFreq": 0.3627451, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.2009804, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.93721634, + "altHomGenotypeFreq": 0.881997, + "hetGenotypeFreq": 0.110438734, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.06278366, + "refHomGenotypeFreq": 0.0075642965, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9, + "altHomGenotypeFreq": 0.8, + "hetGenotypeFreq": 0.2, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.1, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90865386, + "altHomGenotypeFreq": 0.8173077, + "hetGenotypeFreq": 0.18269232, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.09134615, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9537037, + "altHomGenotypeFreq": 0.9074074, + "hetGenotypeFreq": 0.09259259, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.046296295, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.828125, + "altHomGenotypeFreq": 0.65625, + "hetGenotypeFreq": 0.34375, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.171875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.920354, + "altHomGenotypeFreq": 0.86725664, + "hetGenotypeFreq": 0.10619469, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.07964602, + "refHomGenotypeFreq": 0.026548672, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73039216, + "altHomGenotypeFreq": 0.46078432, + "hetGenotypeFreq": 0.5392157, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.26960784, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7197802, + "altHomGenotypeFreq": 0.47252747, + "hetGenotypeFreq": 0.49450552, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.2802198, + "refHomGenotypeFreq": 0.032967035, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88709676, + "altHomGenotypeFreq": 0.7741935, + "hetGenotypeFreq": 0.22580644, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.11290322, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84343433, + "altHomGenotypeFreq": 0.68686867, + "hetGenotypeFreq": 0.3131313, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.15656565, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7757009, + "altHomGenotypeFreq": 0.55140185, + "hetGenotypeFreq": 0.44859815, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.22429906, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73255813, + "altHomGenotypeFreq": 0.4651163, + "hetGenotypeFreq": 0.53488374, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.26744187, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9427083, + "altHomGenotypeFreq": 0.8854167, + "hetGenotypeFreq": 0.114583336, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.057291668, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97979796, + "altHomGenotypeFreq": 0.959596, + "hetGenotypeFreq": 0.04040404, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.02020202, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7564612, + "altHomGenotypeFreq": 0.52286285, + "hetGenotypeFreq": 0.46719682, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.24353877, + "refHomGenotypeFreq": 0.009940358, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8442623, + "altHomGenotypeFreq": 0.72131145, + "hetGenotypeFreq": 0.24590163, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.1557377, + "refHomGenotypeFreq": 0.032786883, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83429396, + "altHomGenotypeFreq": 0.67723346, + "hetGenotypeFreq": 0.31412104, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.16570605, + "refHomGenotypeFreq": 0.008645534, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9411765, + "altHomGenotypeFreq": 0.88235295, + "hetGenotypeFreq": 0.11764706, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.05882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7718447, + "altHomGenotypeFreq": 0.5436893, + "hetGenotypeFreq": 0.4563107, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.22815534, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7323232, + "altHomGenotypeFreq": 0.46464646, + "hetGenotypeFreq": 0.53535354, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.26767677, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7943925, + "altHomGenotypeFreq": 0.5981308, + "hetGenotypeFreq": 0.39252335, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.20560747, + "refHomGenotypeFreq": 0.009345794, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78365386, + "altHomGenotypeFreq": 0.59615386, + "hetGenotypeFreq": 0.375, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.21634616, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75252527, + "altHomGenotypeFreq": 0.5151515, + "hetGenotypeFreq": 0.47474748, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.24747474, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9235294, + "altHomGenotypeFreq": 0.84705883, + "hetGenotypeFreq": 0.15294118, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.07647059, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89285713, + "altHomGenotypeFreq": 0.78571427, + "hetGenotypeFreq": 0.21428572, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.10714286, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9223301, + "altHomGenotypeFreq": 0.8446602, + "hetGenotypeFreq": 0.1553398, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.0776699, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6123595, + "altHomGenotypeFreq": 0.4307116, + "hetGenotypeFreq": 0.36329588, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.38764045, + "refHomGenotypeFreq": 0.2059925, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152583, + "id": "10353", + "percentageMatch": 0.928725, + "source": "genomicSuperDup", + "start": 22142613 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "10640", + "percentageMatch": 0.925269, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "10490", + "percentageMatch": 0.929215, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "8432", + "percentageMatch": 0.92757, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "8405", + "percentageMatch": 0.927547, + "source": "genomicSuperDup", + "start": 22146927 + } + ], + "start": 22148395, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22148395, + "id": "15:22148395:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22148395, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258997", + "ensemblTranscriptId": "ENST00000556855", + "geneName": "NF1P2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -0.8289999961853027, + "source": "gerp" + }, + { + "score": 0.2329999953508377, + "source": "phastCons" + }, + { + "score": 0.16300000250339508, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.38000011444091797, + "source": "cadd_raw" + }, + { + "score": 6.5, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556855(ENSG00000258997):n.822-18T>C" + ], + "id": "rs151092027", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.63402617, + "altHomGenotypeFreq": 0.39245573, + "hetGenotypeFreq": 0.4831409, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.36597383, + "refHomGenotypeFreq": 0.12440339, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67198175, + "altHomGenotypeFreq": 0.43052393, + "hetGenotypeFreq": 0.48291573, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.32801822, + "refHomGenotypeFreq": 0.08656036, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54242, + "altHomGenotypeFreq": 0.1961057, + "hetGenotypeFreq": 0.6926286, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.45757997, + "refHomGenotypeFreq": 0.111265644, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5876712, + "altHomGenotypeFreq": 0.29589042, + "hetGenotypeFreq": 0.58356166, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.41232878, + "refHomGenotypeFreq": 0.12054794, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6678832, + "altHomGenotypeFreq": 0.4379562, + "hetGenotypeFreq": 0.459854, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.33211678, + "refHomGenotypeFreq": 0.10218978, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6745881, + "altHomGenotypeFreq": 0.4347275, + "hetGenotypeFreq": 0.47972116, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.32541192, + "refHomGenotypeFreq": 0.08555133, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.68556005, + "altHomGenotypeFreq": 0.44264507, + "hetGenotypeFreq": 0.48582995, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.31443995, + "refHomGenotypeFreq": 0.07152496, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5217321, + "altHomGenotypeFreq": 0.31203374, + "hetGenotypeFreq": 0.4193967, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.4782679, + "refHomGenotypeFreq": 0.2685696, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6284134, + "altHomGenotypeFreq": 0.38636047, + "hetGenotypeFreq": 0.48410586, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.37158662, + "refHomGenotypeFreq": 0.12953368, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6408788, + "altHomGenotypeFreq": 0.39989743, + "hetGenotypeFreq": 0.48196274, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.3591212, + "refHomGenotypeFreq": 0.118139856, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.62625253, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.3737475, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.66292137, + "altHomGenotypeFreq": 0.4681648, + "hetGenotypeFreq": 0.3895131, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.33707866, + "refHomGenotypeFreq": 0.1423221, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152583, + "id": "10353", + "percentageMatch": 0.928725, + "source": "genomicSuperDup", + "start": 22142613 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "10640", + "percentageMatch": 0.925269, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "10490", + "percentageMatch": 0.929215, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "8432", + "percentageMatch": 0.92757, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22152579, + "id": "8405", + "percentageMatch": 0.927547, + "source": "genomicSuperDup", + "start": 22146927 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22149739, + "id": "6265", + "percentageMatch": 0.947574, + "source": "genomicSuperDup", + "start": 22148460 + } + ], + "start": 22148845, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22148845, + "id": "15:22148845:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22148845, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "miRNA", + "ensemblGeneId": "ENSG00000264902", + "ensemblTranscriptId": "ENST00000578890", + "geneName": "MIR5701-2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.1940000057220459, + "source": "phastCons" + }, + { + "score": 0.12300000339746475, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": 0.7799997329711914, + "source": "cadd_raw" + }, + { + "score": 9.390000343322754, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs140097537", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.5195184, + "altHomGenotypeFreq": 0.25312763, + "hetGenotypeFreq": 0.5327815, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.48048162, + "refHomGenotypeFreq": 0.21409087, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5302198, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.5604396, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.4697802, + "refHomGenotypeFreq": 0.18956044, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.62932456, + "altHomGenotypeFreq": 0.35255355, + "hetGenotypeFreq": 0.553542, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.37067544, + "refHomGenotypeFreq": 0.09390445, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6941581, + "altHomGenotypeFreq": 0.5223368, + "hetGenotypeFreq": 0.34364262, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.30584192, + "refHomGenotypeFreq": 0.13402061, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5801887, + "altHomGenotypeFreq": 0.33962265, + "hetGenotypeFreq": 0.4811321, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.4198113, + "refHomGenotypeFreq": 0.17924528, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.54323953, + "altHomGenotypeFreq": 0.28689086, + "hetGenotypeFreq": 0.51269734, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.45676047, + "refHomGenotypeFreq": 0.20041181, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5417865, + "altHomGenotypeFreq": 0.25857773, + "hetGenotypeFreq": 0.56641746, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.45821354, + "refHomGenotypeFreq": 0.1750048, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41193512, + "altHomGenotypeFreq": 0.16647354, + "hetGenotypeFreq": 0.49092314, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.5880649, + "refHomGenotypeFreq": 0.34260333, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5182159, + "altHomGenotypeFreq": 0.2589377, + "hetGenotypeFreq": 0.51855636, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.48178414, + "refHomGenotypeFreq": 0.22250596, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.52112675, + "altHomGenotypeFreq": 0.24595334, + "hetGenotypeFreq": 0.55034685, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.47887325, + "refHomGenotypeFreq": 0.20369981, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.250501, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.74949896, + "study": "GONL" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + } + ], + "start": 22157651, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22157651, + "id": "15:22157651:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22157651, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "miRNA", + "ensemblGeneId": "ENSG00000264902", + "ensemblTranscriptId": "ENST00000578890", + "geneName": "MIR5701-2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.11299999803304672, + "source": "gerp" + }, + { + "score": 0.11299999803304672, + "source": "gerp" + }, + { + "score": 0.11299999803304672, + "source": "gerp" + }, + { + "score": 0.02199999988079071, + "source": "phastCons" + }, + { + "score": 0.026000000536441803, + "source": "phastCons" + }, + { + "score": 0.029999999329447746, + "source": "phastCons" + }, + { + "score": 0.15800000727176666, + "source": "phylop" + }, + { + "score": 0.18700000643730164, + "source": "phylop" + }, + { + "score": 0.18700000643730164, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "downstream_gene_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs200575216", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.45914835, + "altHomGenotypeFreq": 0.14601947, + "hetGenotypeFreq": 0.6262578, + "population": "ALL", + "refAllele": "AGG", + "refAlleleFreq": 0.54085165, + "refHomGenotypeFreq": 0.22772278, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.48143566, + "altHomGenotypeFreq": 0.16089109, + "hetGenotypeFreq": 0.6410891, + "population": "OTH", + "refAllele": "AGG", + "refAlleleFreq": 0.51856434, + "refHomGenotypeFreq": 0.1980198, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5782414, + "altHomGenotypeFreq": 0.23397914, + "hetGenotypeFreq": 0.6885246, + "population": "EAS", + "refAllele": "AGG", + "refAlleleFreq": 0.42175856, + "refHomGenotypeFreq": 0.077496275, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.58576053, + "altHomGenotypeFreq": 0.3106796, + "hetGenotypeFreq": 0.55016184, + "population": "AMR", + "refAllele": "AGG", + "refAlleleFreq": 0.4142395, + "refHomGenotypeFreq": 0.13915858, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5168067, + "altHomGenotypeFreq": 0.2184874, + "hetGenotypeFreq": 0.5966387, + "population": "ASJ", + "refAllele": "AGG", + "refAlleleFreq": 0.48319328, + "refHomGenotypeFreq": 0.18487395, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.49425676, + "altHomGenotypeFreq": 0.18040541, + "hetGenotypeFreq": 0.6277027, + "population": "FIN", + "refAllele": "AGG", + "refAlleleFreq": 0.50574327, + "refHomGenotypeFreq": 0.1918919, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.49311224, + "altHomGenotypeFreq": 0.16989796, + "hetGenotypeFreq": 0.6464286, + "population": "NFE", + "refAllele": "AGG", + "refAlleleFreq": 0.50688773, + "refHomGenotypeFreq": 0.18367347, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3505618, + "altHomGenotypeFreq": 0.05730337, + "hetGenotypeFreq": 0.58651686, + "population": "AFR", + "refAllele": "AGG", + "refAlleleFreq": 0.6494382, + "refHomGenotypeFreq": 0.35617977, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.45748723, + "altHomGenotypeFreq": 0.14813733, + "hetGenotypeFreq": 0.6186998, + "population": "MALE", + "refAllele": "AGG", + "refAlleleFreq": 0.5425128, + "refHomGenotypeFreq": 0.2331629, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4611868, + "altHomGenotypeFreq": 0.14342058, + "hetGenotypeFreq": 0.63553244, + "population": "FEMALE", + "refAllele": "AGG", + "refAlleleFreq": 0.5388132, + "refHomGenotypeFreq": 0.22104697, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.57815635, + "population": "ALL", + "refAllele": "AGG", + "refAlleleFreq": 0.42184368, + "study": "GONL" + }, + { + "altAllele": "", + "altAlleleFreq": 0.71875, + "altHomGenotypeFreq": 0.53125, + "hetGenotypeFreq": 0.375, + "population": "MXL", + "refAllele": "AGG", + "refAlleleFreq": 0.28125, + "refHomGenotypeFreq": 0.09375, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5509185, + "altHomGenotypeFreq": 0.3390575, + "hetGenotypeFreq": 0.42372206, + "population": "ALL", + "refAllele": "AGG", + "refAlleleFreq": 0.44908148, + "refHomGenotypeFreq": 0.23722045, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5899795, + "altHomGenotypeFreq": 0.3394683, + "hetGenotypeFreq": 0.5010225, + "population": "SAS", + "refAllele": "AGG", + "refAlleleFreq": 0.41002044, + "refHomGenotypeFreq": 0.1595092, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.59042555, + "altHomGenotypeFreq": 0.3723404, + "hetGenotypeFreq": 0.43617022, + "population": "CLM", + "refAllele": "AGG", + "refAlleleFreq": 0.40957448, + "refHomGenotypeFreq": 0.19148937, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6127451, + "altHomGenotypeFreq": 0.4019608, + "hetGenotypeFreq": 0.42156863, + "population": "ITU", + "refAllele": "AGG", + "refAlleleFreq": 0.3872549, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.38124055, + "altHomGenotypeFreq": 0.14674735, + "hetGenotypeFreq": 0.4689864, + "population": "AFR", + "refAllele": "AGG", + "refAlleleFreq": 0.61875945, + "refHomGenotypeFreq": 0.38426626, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.68095237, + "altHomGenotypeFreq": 0.50476193, + "hetGenotypeFreq": 0.35238096, + "population": "CHS", + "refAllele": "AGG", + "refAlleleFreq": 0.31904763, + "refHomGenotypeFreq": 0.14285715, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5817308, + "altHomGenotypeFreq": 0.375, + "hetGenotypeFreq": 0.41346154, + "population": "JPT", + "refAllele": "AGG", + "refAlleleFreq": 0.41826922, + "refHomGenotypeFreq": 0.21153846, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.3564815, + "altHomGenotypeFreq": 0.12037037, + "hetGenotypeFreq": 0.4722222, + "population": "YRI", + "refAllele": "AGG", + "refAlleleFreq": 0.6435185, + "refHomGenotypeFreq": 0.4074074, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6614583, + "altHomGenotypeFreq": 0.46875, + "hetGenotypeFreq": 0.3854167, + "population": "PJL", + "refAllele": "AGG", + "refAlleleFreq": 0.33854166, + "refHomGenotypeFreq": 0.14583333, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32743362, + "altHomGenotypeFreq": 0.053097345, + "hetGenotypeFreq": 0.54867256, + "population": "GWD", + "refAllele": "AGG", + "refAlleleFreq": 0.67256635, + "refHomGenotypeFreq": 0.39823008, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.53431374, + "altHomGenotypeFreq": 0.25490198, + "hetGenotypeFreq": 0.5588235, + "population": "STU", + "refAllele": "AGG", + "refAlleleFreq": 0.46568626, + "refHomGenotypeFreq": 0.18627451, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5879121, + "altHomGenotypeFreq": 0.41758242, + "hetGenotypeFreq": 0.34065935, + "population": "GBR", + "refAllele": "AGG", + "refAlleleFreq": 0.41208792, + "refHomGenotypeFreq": 0.24175824, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.67741936, + "altHomGenotypeFreq": 0.49462366, + "hetGenotypeFreq": 0.3655914, + "population": "CDX", + "refAllele": "AGG", + "refAlleleFreq": 0.32258064, + "refHomGenotypeFreq": 0.13978495, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6010101, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.43434346, + "population": "KHV", + "refAllele": "AGG", + "refAlleleFreq": 0.3989899, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.58878505, + "altHomGenotypeFreq": 0.39252338, + "hetGenotypeFreq": 0.39252338, + "population": "IBS", + "refAllele": "AGG", + "refAlleleFreq": 0.41121495, + "refHomGenotypeFreq": 0.21495327, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.54651165, + "altHomGenotypeFreq": 0.27906978, + "hetGenotypeFreq": 0.53488374, + "population": "BEB", + "refAllele": "AGG", + "refAlleleFreq": 0.45348838, + "refHomGenotypeFreq": 0.18604651, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.41145834, + "altHomGenotypeFreq": 0.19791667, + "hetGenotypeFreq": 0.4270833, + "population": "ACB", + "refAllele": "AGG", + "refAlleleFreq": 0.5885417, + "refHomGenotypeFreq": 0.375, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32323232, + "altHomGenotypeFreq": 0.05050505, + "hetGenotypeFreq": 0.54545456, + "population": "ESN", + "refAllele": "AGG", + "refAlleleFreq": 0.67676765, + "refHomGenotypeFreq": 0.4040404, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.43939394, + "altHomGenotypeFreq": 0.24242425, + "hetGenotypeFreq": 0.39393938, + "population": "LWK", + "refAllele": "AGG", + "refAlleleFreq": 0.56060606, + "refHomGenotypeFreq": 0.36363637, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5626243, + "altHomGenotypeFreq": 0.36978132, + "hetGenotypeFreq": 0.3856859, + "population": "EUR", + "refAllele": "AGG", + "refAlleleFreq": 0.43737575, + "refHomGenotypeFreq": 0.24453281, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.40163934, + "altHomGenotypeFreq": 0.18032786, + "hetGenotypeFreq": 0.44262296, + "population": "ASW", + "refAllele": "AGG", + "refAlleleFreq": 0.59836066, + "refHomGenotypeFreq": 0.37704918, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6801153, + "altHomGenotypeFreq": 0.5100865, + "hetGenotypeFreq": 0.3400576, + "population": "AMR", + "refAllele": "AGG", + "refAlleleFreq": 0.31988472, + "refHomGenotypeFreq": 0.14985591, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.43529412, + "altHomGenotypeFreq": 0.22352941, + "hetGenotypeFreq": 0.42352942, + "population": "MSL", + "refAllele": "AGG", + "refAlleleFreq": 0.5647059, + "refHomGenotypeFreq": 0.3529412, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.592233, + "altHomGenotypeFreq": 0.29126215, + "hetGenotypeFreq": 0.60194176, + "population": "GIH", + "refAllele": "AGG", + "refAlleleFreq": 0.407767, + "refHomGenotypeFreq": 0.106796116, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5050505, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.4040404, + "population": "FIN", + "refAllele": "AGG", + "refAlleleFreq": 0.4949495, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.59345794, + "altHomGenotypeFreq": 0.42056075, + "hetGenotypeFreq": 0.34579438, + "population": "TSI", + "refAllele": "AGG", + "refAlleleFreq": 0.40654206, + "refHomGenotypeFreq": 0.23364486, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.59134614, + "altHomGenotypeFreq": 0.40384614, + "hetGenotypeFreq": 0.375, + "population": "PUR", + "refAllele": "AGG", + "refAlleleFreq": 0.40865386, + "refHomGenotypeFreq": 0.22115384, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.53535354, + "altHomGenotypeFreq": 0.3131313, + "hetGenotypeFreq": 0.44444445, + "population": "CEU", + "refAllele": "AGG", + "refAlleleFreq": 0.46464646, + "refHomGenotypeFreq": 0.24242425, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.85882354, + "altHomGenotypeFreq": 0.7764706, + "hetGenotypeFreq": 0.16470589, + "population": "PEL", + "refAllele": "AGG", + "refAlleleFreq": 0.14117648, + "refHomGenotypeFreq": 0.05882353, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.63492066, + "altHomGenotypeFreq": 0.44246033, + "hetGenotypeFreq": 0.38492063, + "population": "EAS", + "refAllele": "AGG", + "refAlleleFreq": 0.36507937, + "refHomGenotypeFreq": 0.17261904, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6359223, + "altHomGenotypeFreq": 0.4563107, + "hetGenotypeFreq": 0.3592233, + "population": "CHB", + "refAllele": "AGG", + "refAlleleFreq": 0.36407766, + "refHomGenotypeFreq": 0.18446602, + "study": "1kG_phase3" + } + ], + "reference": "AGG", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22210800, + "id": "9175", + "percentageMatch": 0.9965, + "source": "genomicSuperDup", + "start": 22044595 + } + ], + "start": 22159151, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22159153, + "id": "15:22159151:AGG:-", + "length": 3, + "names": [], + "reference": "AGG", + "start": 22159151, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "cdnaPosition": 105, + "ensemblGeneId": "ENSG00000271507", + "ensemblTranscriptId": "ENST00000605422", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.29154518 + } + ], + "geneName": "RP11-603B24.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.100000023841858, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": 0.515999972820282, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": -0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 1.4900000095367432, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000605422(ENSG00000271507):n.105G>C" + ], + "id": "rs502106", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.55024976, + "altHomGenotypeFreq": 0.12201132, + "hetGenotypeFreq": 0.85647684, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.44975024, + "refHomGenotypeFreq": 0.021511821, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.52615064, + "altHomGenotypeFreq": 0.07322176, + "hetGenotypeFreq": 0.90585774, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.4738494, + "refHomGenotypeFreq": 0.020920502, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44301996, + "altHomGenotypeFreq": 0.014245015, + "hetGenotypeFreq": 0.85754985, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5569801, + "refHomGenotypeFreq": 0.12820514, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53258145, + "altHomGenotypeFreq": 0.0952381, + "hetGenotypeFreq": 0.8746867, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.46741855, + "refHomGenotypeFreq": 0.030075189, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.60738254, + "altHomGenotypeFreq": 0.26174498, + "hetGenotypeFreq": 0.6912752, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.39261746, + "refHomGenotypeFreq": 0.046979867, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.50791323, + "altHomGenotypeFreq": 0.033997655, + "hetGenotypeFreq": 0.9478312, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.49208674, + "refHomGenotypeFreq": 0.018171161, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5746594, + "altHomGenotypeFreq": 0.16416894, + "hetGenotypeFreq": 0.8209809, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.4253406, + "refHomGenotypeFreq": 0.014850136, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54515445, + "altHomGenotypeFreq": 0.10539967, + "hetGenotypeFreq": 0.87950957, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.45484555, + "refHomGenotypeFreq": 0.01509078, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5582571, + "altHomGenotypeFreq": 0.14034666, + "hetGenotypeFreq": 0.8358209, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.4417429, + "refHomGenotypeFreq": 0.023832452, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.540331, + "altHomGenotypeFreq": 0.09929924, + "hetGenotypeFreq": 0.8820635, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.459669, + "refHomGenotypeFreq": 0.018637246, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.71875, + "altHomGenotypeFreq": 0.5, + "hetGenotypeFreq": 0.4375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.28125, + "refHomGenotypeFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.620008, + "altHomGenotypeFreq": 0.29432908, + "hetGenotypeFreq": 0.6513578, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.379992, + "refHomGenotypeFreq": 0.0543131, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.58486706, + "altHomGenotypeFreq": 0.23517382, + "hetGenotypeFreq": 0.6993865, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.4151329, + "refHomGenotypeFreq": 0.06543967, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7765958, + "altHomGenotypeFreq": 0.5744681, + "hetGenotypeFreq": 0.40425533, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.22340426, + "refHomGenotypeFreq": 0.021276595, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5980392, + "altHomGenotypeFreq": 0.24509804, + "hetGenotypeFreq": 0.7058824, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.4019608, + "refHomGenotypeFreq": 0.04901961, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6535552, + "altHomGenotypeFreq": 0.3207262, + "hetGenotypeFreq": 0.6656581, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.3464448, + "refHomGenotypeFreq": 0.013615734, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4952381, + "altHomGenotypeFreq": 0.123809524, + "hetGenotypeFreq": 0.74285716, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.50476193, + "refHomGenotypeFreq": 0.13333334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5144231, + "altHomGenotypeFreq": 0.15384616, + "hetGenotypeFreq": 0.72115386, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.48557693, + "refHomGenotypeFreq": 0.125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6574074, + "altHomGenotypeFreq": 0.32407406, + "hetGenotypeFreq": 0.6666666, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.3425926, + "refHomGenotypeFreq": 0.009259259, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6145833, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.625, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.38541666, + "refHomGenotypeFreq": 0.072916664, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65486723, + "altHomGenotypeFreq": 0.33628318, + "hetGenotypeFreq": 0.63716817, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.34513274, + "refHomGenotypeFreq": 0.026548672, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5735294, + "altHomGenotypeFreq": 0.19607843, + "hetGenotypeFreq": 0.754902, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.42647058, + "refHomGenotypeFreq": 0.04901961, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6813187, + "altHomGenotypeFreq": 0.3846154, + "hetGenotypeFreq": 0.5934066, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.31868133, + "refHomGenotypeFreq": 0.021978023, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44623655, + "altHomGenotypeFreq": 0.043010753, + "hetGenotypeFreq": 0.80645156, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.55376345, + "refHomGenotypeFreq": 0.15053764, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.46464646, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.78787875, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.53535354, + "refHomGenotypeFreq": 0.14141414, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6775701, + "altHomGenotypeFreq": 0.39252338, + "hetGenotypeFreq": 0.57009345, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.3224299, + "refHomGenotypeFreq": 0.037383176, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53488374, + "altHomGenotypeFreq": 0.1744186, + "hetGenotypeFreq": 0.7209302, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.4651163, + "refHomGenotypeFreq": 0.10465116, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.625, + "altHomGenotypeFreq": 0.26041666, + "hetGenotypeFreq": 0.7291666, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.375, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7171717, + "altHomGenotypeFreq": 0.43434343, + "hetGenotypeFreq": 0.56565654, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.28282827, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6212121, + "altHomGenotypeFreq": 0.28282827, + "hetGenotypeFreq": 0.6767677, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.37878788, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67296225, + "altHomGenotypeFreq": 0.3717694, + "hetGenotypeFreq": 0.6023857, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.32703778, + "refHomGenotypeFreq": 0.02584493, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6229508, + "altHomGenotypeFreq": 0.24590164, + "hetGenotypeFreq": 0.75409836, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.37704918, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7334294, + "altHomGenotypeFreq": 0.4985591, + "hetGenotypeFreq": 0.46974063, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.2665706, + "refHomGenotypeFreq": 0.031700287, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6647059, + "altHomGenotypeFreq": 0.32941177, + "hetGenotypeFreq": 0.67058825, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.33529413, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5970874, + "altHomGenotypeFreq": 0.2524272, + "hetGenotypeFreq": 0.6893204, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.40291262, + "refHomGenotypeFreq": 0.058252428, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6060606, + "altHomGenotypeFreq": 0.24242425, + "hetGenotypeFreq": 0.72727275, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.3939394, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6962617, + "altHomGenotypeFreq": 0.41121495, + "hetGenotypeFreq": 0.57009345, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.30373833, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7067308, + "altHomGenotypeFreq": 0.43269232, + "hetGenotypeFreq": 0.5480769, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.29326922, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7020202, + "altHomGenotypeFreq": 0.42424244, + "hetGenotypeFreq": 0.5555556, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.2979798, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7294118, + "altHomGenotypeFreq": 0.49411765, + "hetGenotypeFreq": 0.47058827, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.27058825, + "refHomGenotypeFreq": 0.03529412, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47916666, + "altHomGenotypeFreq": 0.09920635, + "hetGenotypeFreq": 0.7599206, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5208333, + "refHomGenotypeFreq": 0.14087301, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.47087377, + "altHomGenotypeFreq": 0.097087376, + "hetGenotypeFreq": 0.7475728, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.5291262, + "refHomGenotypeFreq": 0.1553398, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.013108614, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.026217228, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9868914, + "refHomGenotypeFreq": 0.9737828, + "study": "MGP" + } + ], + "reference": "C", + "start": 22490581, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22490581, + "id": "15:22490581:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22490581, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000271507", + "ensemblTranscriptId": "ENST00000605422", + "geneName": "RP11-603B24.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.020999999716877937, + "source": "phastCons" + }, + { + "score": 0.017999999225139618, + "source": "phastCons" + }, + { + "score": 0.07599999755620956, + "source": "phylop" + }, + { + "score": 0.08900000154972076, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs145098206", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.54079986, + "altHomGenotypeFreq": 0.10799165, + "hetGenotypeFreq": 0.8656164, + "population": "ALL", + "refAllele": "TC", + "refAlleleFreq": 0.45920017, + "refHomGenotypeFreq": 0.026391976, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.52719665, + "altHomGenotypeFreq": 0.07112971, + "hetGenotypeFreq": 0.9121339, + "population": "OTH", + "refAllele": "TC", + "refAlleleFreq": 0.47280335, + "refHomGenotypeFreq": 0.016736401, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.45196506, + "altHomGenotypeFreq": 0.014556041, + "hetGenotypeFreq": 0.874818, + "population": "EAS", + "refAllele": "TC", + "refAlleleFreq": 0.5480349, + "refHomGenotypeFreq": 0.11062591, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5258621, + "altHomGenotypeFreq": 0.07635468, + "hetGenotypeFreq": 0.8990148, + "population": "AMR", + "refAllele": "TC", + "refAlleleFreq": 0.47413793, + "refHomGenotypeFreq": 0.024630541, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6013514, + "altHomGenotypeFreq": 0.25, + "hetGenotypeFreq": 0.7027027, + "population": "ASJ", + "refAllele": "TC", + "refAlleleFreq": 0.39864865, + "refHomGenotypeFreq": 0.0472973, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.50238097, + "altHomGenotypeFreq": 0.030952381, + "hetGenotypeFreq": 0.94285715, + "population": "FIN", + "refAllele": "TC", + "refAlleleFreq": 0.49761903, + "refHomGenotypeFreq": 0.026190476, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5716526, + "altHomGenotypeFreq": 0.15775838, + "hetGenotypeFreq": 0.8277884, + "population": "NFE", + "refAllele": "TC", + "refAlleleFreq": 0.4283474, + "refHomGenotypeFreq": 0.014453231, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.517233, + "altHomGenotypeFreq": 0.068689324, + "hetGenotypeFreq": 0.8970874, + "population": "AFR", + "refAllele": "TC", + "refAlleleFreq": 0.482767, + "refHomGenotypeFreq": 0.0342233, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5492665, + "altHomGenotypeFreq": 0.12713936, + "hetGenotypeFreq": 0.84425426, + "population": "MALE", + "refAllele": "TC", + "refAlleleFreq": 0.45073348, + "refHomGenotypeFreq": 0.028606357, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5304211, + "altHomGenotypeFreq": 0.08451971, + "hetGenotypeFreq": 0.8918028, + "population": "FEMALE", + "refAllele": "TC", + "refAlleleFreq": 0.4695789, + "refHomGenotypeFreq": 0.023677506, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.703125, + "altHomGenotypeFreq": 0.46875, + "hetGenotypeFreq": 0.46875, + "population": "MXL", + "refAllele": "TC", + "refAlleleFreq": 0.296875, + "refHomGenotypeFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.58027154, + "altHomGenotypeFreq": 0.26238018, + "hetGenotypeFreq": 0.6357827, + "population": "ALL", + "refAllele": "TC", + "refAlleleFreq": 0.41972843, + "refHomGenotypeFreq": 0.10183706, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5736196, + "altHomGenotypeFreq": 0.22699386, + "hetGenotypeFreq": 0.6932515, + "population": "SAS", + "refAllele": "TC", + "refAlleleFreq": 0.42638037, + "refHomGenotypeFreq": 0.0797546, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.7712766, + "altHomGenotypeFreq": 0.5638298, + "hetGenotypeFreq": 0.41489363, + "population": "CLM", + "refAllele": "TC", + "refAlleleFreq": 0.2287234, + "refHomGenotypeFreq": 0.021276595, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5882353, + "altHomGenotypeFreq": 0.2254902, + "hetGenotypeFreq": 0.7254902, + "population": "ITU", + "refAllele": "TC", + "refAlleleFreq": 0.4117647, + "refHomGenotypeFreq": 0.04901961, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.54236007, + "altHomGenotypeFreq": 0.19062027, + "hetGenotypeFreq": 0.7034795, + "population": "AFR", + "refAllele": "TC", + "refAlleleFreq": 0.45763993, + "refHomGenotypeFreq": 0.10590015, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.43333334, + "altHomGenotypeFreq": 0.114285715, + "hetGenotypeFreq": 0.63809526, + "population": "CHS", + "refAllele": "TC", + "refAlleleFreq": 0.56666666, + "refHomGenotypeFreq": 0.24761905, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4903846, + "altHomGenotypeFreq": 0.16346154, + "hetGenotypeFreq": 0.65384614, + "population": "JPT", + "refAllele": "TC", + "refAlleleFreq": 0.50961536, + "refHomGenotypeFreq": 0.1826923, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5740741, + "altHomGenotypeFreq": 0.22222222, + "hetGenotypeFreq": 0.7037037, + "population": "YRI", + "refAllele": "TC", + "refAlleleFreq": 0.42592594, + "refHomGenotypeFreq": 0.074074075, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.59375, + "altHomGenotypeFreq": 0.30208334, + "hetGenotypeFreq": 0.5833333, + "population": "PJL", + "refAllele": "TC", + "refAlleleFreq": 0.40625, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5575221, + "altHomGenotypeFreq": 0.19469027, + "hetGenotypeFreq": 0.7256637, + "population": "GWD", + "refAllele": "TC", + "refAlleleFreq": 0.44247788, + "refHomGenotypeFreq": 0.07964602, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5539216, + "altHomGenotypeFreq": 0.19607843, + "hetGenotypeFreq": 0.7156863, + "population": "STU", + "refAllele": "TC", + "refAlleleFreq": 0.44607842, + "refHomGenotypeFreq": 0.0882353, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6813187, + "altHomGenotypeFreq": 0.3956044, + "hetGenotypeFreq": 0.5714286, + "population": "GBR", + "refAllele": "TC", + "refAlleleFreq": 0.31868133, + "refHomGenotypeFreq": 0.032967035, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4139785, + "altHomGenotypeFreq": 0.05376344, + "hetGenotypeFreq": 0.72043014, + "population": "CDX", + "refAllele": "TC", + "refAlleleFreq": 0.5860215, + "refHomGenotypeFreq": 0.22580644, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.43939394, + "altHomGenotypeFreq": 0.08080808, + "hetGenotypeFreq": 0.7171717, + "population": "KHV", + "refAllele": "TC", + "refAlleleFreq": 0.56060606, + "refHomGenotypeFreq": 0.2020202, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6728972, + "altHomGenotypeFreq": 0.40186915, + "hetGenotypeFreq": 0.5420561, + "population": "IBS", + "refAllele": "TC", + "refAlleleFreq": 0.3271028, + "refHomGenotypeFreq": 0.056074765, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5290698, + "altHomGenotypeFreq": 0.1627907, + "hetGenotypeFreq": 0.73255813, + "population": "BEB", + "refAllele": "TC", + "refAlleleFreq": 0.47093022, + "refHomGenotypeFreq": 0.10465116, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5364583, + "altHomGenotypeFreq": 0.1875, + "hetGenotypeFreq": 0.6979167, + "population": "ACB", + "refAllele": "TC", + "refAlleleFreq": 0.46354166, + "refHomGenotypeFreq": 0.114583336, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.57575756, + "altHomGenotypeFreq": 0.21212122, + "hetGenotypeFreq": 0.72727275, + "population": "ESN", + "refAllele": "TC", + "refAlleleFreq": 0.42424244, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.55050504, + "altHomGenotypeFreq": 0.1919192, + "hetGenotypeFreq": 0.7171717, + "population": "LWK", + "refAllele": "TC", + "refAlleleFreq": 0.44949496, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6689861, + "altHomGenotypeFreq": 0.3856859, + "hetGenotypeFreq": 0.5666004, + "population": "EUR", + "refAllele": "TC", + "refAlleleFreq": 0.33101392, + "refHomGenotypeFreq": 0.04771372, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4918033, + "altHomGenotypeFreq": 0.14754099, + "hetGenotypeFreq": 0.6885246, + "population": "ASW", + "refAllele": "TC", + "refAlleleFreq": 0.5081967, + "refHomGenotypeFreq": 0.16393442, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.73054755, + "altHomGenotypeFreq": 0.49567723, + "hetGenotypeFreq": 0.46974063, + "population": "AMR", + "refAllele": "TC", + "refAlleleFreq": 0.26945245, + "refHomGenotypeFreq": 0.034582134, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4764706, + "altHomGenotypeFreq": 0.15294118, + "hetGenotypeFreq": 0.64705884, + "population": "MSL", + "refAllele": "TC", + "refAlleleFreq": 0.5235294, + "refHomGenotypeFreq": 0.2, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5970874, + "altHomGenotypeFreq": 0.24271844, + "hetGenotypeFreq": 0.70873785, + "population": "GIH", + "refAllele": "TC", + "refAlleleFreq": 0.40291262, + "refHomGenotypeFreq": 0.048543688, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.59090906, + "altHomGenotypeFreq": 0.26262626, + "hetGenotypeFreq": 0.65656567, + "population": "FIN", + "refAllele": "TC", + "refAlleleFreq": 0.4090909, + "refHomGenotypeFreq": 0.08080808, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.7009346, + "altHomGenotypeFreq": 0.42056075, + "hetGenotypeFreq": 0.5607476, + "population": "TSI", + "refAllele": "TC", + "refAlleleFreq": 0.2990654, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.7019231, + "altHomGenotypeFreq": 0.43269232, + "hetGenotypeFreq": 0.53846157, + "population": "PUR", + "refAllele": "TC", + "refAlleleFreq": 0.29807693, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6969697, + "altHomGenotypeFreq": 0.44444445, + "hetGenotypeFreq": 0.50505054, + "population": "CEU", + "refAllele": "TC", + "refAlleleFreq": 0.3030303, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.7411765, + "altHomGenotypeFreq": 0.5176471, + "hetGenotypeFreq": 0.44705883, + "population": "PEL", + "refAllele": "TC", + "refAlleleFreq": 0.25882354, + "refHomGenotypeFreq": 0.03529412, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.44444445, + "altHomGenotypeFreq": 0.10714286, + "hetGenotypeFreq": 0.6746032, + "population": "EAS", + "refAllele": "TC", + "refAlleleFreq": 0.5555556, + "refHomGenotypeFreq": 0.21825397, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.44174758, + "altHomGenotypeFreq": 0.116504855, + "hetGenotypeFreq": 0.6504854, + "population": "CHB", + "refAllele": "TC", + "refAlleleFreq": 0.55825245, + "refHomGenotypeFreq": 0.23300971, + "study": "1kG_phase3" + } + ], + "reference": "TC", + "start": 22490714, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22490715, + "id": "15:22490714:TC:-", + "length": 2, + "names": [], + "reference": "TC", + "start": 22490714, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000271507", + "ensemblTranscriptId": "ENST00000605422", + "geneName": "RP11-603B24.6", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.5490000247955322, + "source": "gerp" + }, + { + "score": 0.009999999776482582, + "source": "phastCons" + }, + { + "score": -1.9149999618530273, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.25, + "source": "cadd_raw" + }, + { + "score": 0.8600000143051147, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs652915", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.6774759, + "altHomGenotypeFreq": 0.3600208, + "hetGenotypeFreq": 0.63491035, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.32252404, + "refHomGenotypeFreq": 0.0050688847, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6751528, + "altHomGenotypeFreq": 0.35641548, + "hetGenotypeFreq": 0.63747454, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.32484725, + "refHomGenotypeFreq": 0.0061099795, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6257783, + "altHomGenotypeFreq": 0.25404733, + "hetGenotypeFreq": 0.743462, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.37422168, + "refHomGenotypeFreq": 0.00249066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7146283, + "altHomGenotypeFreq": 0.4292566, + "hetGenotypeFreq": 0.5707434, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.2853717, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6756757, + "altHomGenotypeFreq": 0.3918919, + "hetGenotypeFreq": 0.5675676, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.3243243, + "refHomGenotypeFreq": 0.04054054, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65545976, + "altHomGenotypeFreq": 0.3137931, + "hetGenotypeFreq": 0.68333334, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.34454024, + "refHomGenotypeFreq": 0.0028735632, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6966729, + "altHomGenotypeFreq": 0.3989804, + "hetGenotypeFreq": 0.595385, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.30332708, + "refHomGenotypeFreq": 0.005634559, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6596309, + "altHomGenotypeFreq": 0.32387543, + "hetGenotypeFreq": 0.67151093, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.34036908, + "refHomGenotypeFreq": 0.00461361, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6774744, + "altHomGenotypeFreq": 0.36048016, + "hetGenotypeFreq": 0.63398844, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.3225256, + "refHomGenotypeFreq": 0.005531364, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6774779, + "altHomGenotypeFreq": 0.35945436, + "hetGenotypeFreq": 0.636047, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.32252213, + "refHomGenotypeFreq": 0.0044986214, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7265625, + "altHomGenotypeFreq": 0.5, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.2734375, + "refHomGenotypeFreq": 0.046875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6421725, + "altHomGenotypeFreq": 0.32747602, + "hetGenotypeFreq": 0.629393, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.35782748, + "refHomGenotypeFreq": 0.04313099, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5981595, + "altHomGenotypeFreq": 0.25153375, + "hetGenotypeFreq": 0.69325155, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.40184048, + "refHomGenotypeFreq": 0.055214725, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.80851066, + "altHomGenotypeFreq": 0.62765956, + "hetGenotypeFreq": 0.36170214, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.19148937, + "refHomGenotypeFreq": 0.010638298, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60784316, + "altHomGenotypeFreq": 0.24509804, + "hetGenotypeFreq": 0.7254902, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.39215687, + "refHomGenotypeFreq": 0.029411765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.66263235, + "altHomGenotypeFreq": 0.3494705, + "hetGenotypeFreq": 0.62632376, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.33736762, + "refHomGenotypeFreq": 0.024205748, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5952381, + "altHomGenotypeFreq": 0.23809524, + "hetGenotypeFreq": 0.71428573, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.4047619, + "refHomGenotypeFreq": 0.04761905, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60096157, + "altHomGenotypeFreq": 0.28846154, + "hetGenotypeFreq": 0.625, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.39903846, + "refHomGenotypeFreq": 0.086538464, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6666667, + "altHomGenotypeFreq": 0.3611111, + "hetGenotypeFreq": 0.6111111, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.027777778, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6354167, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.6041667, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.36458334, + "refHomGenotypeFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6681416, + "altHomGenotypeFreq": 0.37168142, + "hetGenotypeFreq": 0.59292036, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.3318584, + "refHomGenotypeFreq": 0.03539823, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5882353, + "altHomGenotypeFreq": 0.2254902, + "hetGenotypeFreq": 0.7254902, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.4117647, + "refHomGenotypeFreq": 0.04901961, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6813187, + "altHomGenotypeFreq": 0.3846154, + "hetGenotypeFreq": 0.5934066, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.31868133, + "refHomGenotypeFreq": 0.021978023, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.516129, + "altHomGenotypeFreq": 0.12903225, + "hetGenotypeFreq": 0.7741935, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.48387095, + "refHomGenotypeFreq": 0.09677419, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.7777778, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6728972, + "altHomGenotypeFreq": 0.38317758, + "hetGenotypeFreq": 0.5794393, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.3271028, + "refHomGenotypeFreq": 0.037383176, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55813956, + "altHomGenotypeFreq": 0.20930232, + "hetGenotypeFreq": 0.6976744, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.44186047, + "refHomGenotypeFreq": 0.093023255, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.625, + "altHomGenotypeFreq": 0.27083334, + "hetGenotypeFreq": 0.7083333, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.375, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6969697, + "altHomGenotypeFreq": 0.43434343, + "hetGenotypeFreq": 0.5252525, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.3030303, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6666667, + "altHomGenotypeFreq": 0.36363637, + "hetGenotypeFreq": 0.6060606, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6739563, + "altHomGenotypeFreq": 0.37375745, + "hetGenotypeFreq": 0.6003976, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.32604373, + "refHomGenotypeFreq": 0.02584493, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.647541, + "altHomGenotypeFreq": 0.29508197, + "hetGenotypeFreq": 0.704918, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.352459, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75072044, + "altHomGenotypeFreq": 0.52737755, + "hetGenotypeFreq": 0.44668588, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.24927954, + "refHomGenotypeFreq": 0.0259366, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65882355, + "altHomGenotypeFreq": 0.31764707, + "hetGenotypeFreq": 0.68235296, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.34117648, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5970874, + "altHomGenotypeFreq": 0.24271844, + "hetGenotypeFreq": 0.70873785, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.40291262, + "refHomGenotypeFreq": 0.048543688, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.61616164, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.72727275, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.3838384, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7009346, + "altHomGenotypeFreq": 0.42056075, + "hetGenotypeFreq": 0.5607476, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.2990654, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72115386, + "altHomGenotypeFreq": 0.46153846, + "hetGenotypeFreq": 0.5192307, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.27884614, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6969697, + "altHomGenotypeFreq": 0.42424244, + "hetGenotypeFreq": 0.54545456, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.3030303, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7411765, + "altHomGenotypeFreq": 0.5176471, + "hetGenotypeFreq": 0.44705886, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.25882354, + "refHomGenotypeFreq": 0.03529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5515873, + "altHomGenotypeFreq": 0.18849206, + "hetGenotypeFreq": 0.72619045, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.4484127, + "refHomGenotypeFreq": 0.08531746, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5388349, + "altHomGenotypeFreq": 0.16504854, + "hetGenotypeFreq": 0.7475728, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.46116504, + "refHomGenotypeFreq": 0.08737864, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12734082, + "altHomGenotypeFreq": 0.06741573, + "hetGenotypeFreq": 0.11985019, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.87265915, + "refHomGenotypeFreq": 0.81273407, + "study": "MGP" + } + ], + "reference": "A", + "start": 22490721, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22490721, + "id": "15:22490721:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 22490721, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 0.18000030517578125, + "source": "cadd_raw" + }, + { + "score": 4.46999979019165, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs190754872", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.0018435862, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0036871724, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9981564, + "refHomGenotypeFreq": 0.99631286, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.00101833, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.00203666, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.99898165, + "refHomGenotypeFreq": 0.99796337, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0022935779, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.0045871558, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.9977064, + "refHomGenotypeFreq": 0.9954128, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.002937642, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.005875284, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.9970624, + "refHomGenotypeFreq": 0.9941247, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 4.5913682E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 9.1827364E-4, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.99954087, + "refHomGenotypeFreq": 0.99908173, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.001697296, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.003394592, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.9983027, + "refHomGenotypeFreq": 0.9966054, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0020242915, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.004048583, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.9979757, + "refHomGenotypeFreq": 0.9959514, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.008016032, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.99198395, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 3.9936102E-4, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 7.9872203E-4, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.99960065, + "refHomGenotypeFreq": 0.9992013, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0019880715, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.003976143, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.99801195, + "refHomGenotypeFreq": 0.99602383, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.01010101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.02020202, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.989899, + "refHomGenotypeFreq": 0.97979796, + "study": "1kG_phase3" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 345, + "copyNumber": 2.6, + "end": 22508186, + "percentageMatch": 0.81, + "period": 348, + "score": 924, + "sequence": "CTCACGCCTGTCATCACAGCACTTTGGGAGGCCAAGGCGAGGACACCTGAACTCAGGAGTTTGAGACCAGCCTGGCCAACATGGAGAAACCCCCATCTCTACCAAAAATACAAAATTAGCCAGGCGTGGTGGCAGTGTCTGTAATCCCAGCTACTTGGAAGGCTGAGGCAGGAGAATCACTTGAACCCAGGAGGCAGAGGTTGCAGTGAGCCGAGATCTGTGCCATCGCACTCCGGCCTGGGCAACAAGAGCAAAACTCTGTCTCAAAAAAAAAAAAAAAAAAAAAAAGAAAAACAAACTTGCAAACCTATTATAAAACAGCCACCCCCTGGCTGCGCACAGGGC", + "source": "trf", + "start": 22507272 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22514236, + "id": "11080", + "percentageMatch": 0.909685, + "source": "genomicSuperDup", + "start": 22507268 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22514236, + "id": "11015", + "percentageMatch": 0.909685, + "source": "genomicSuperDup", + "start": 22507268 + } + ], + "start": 22507515, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22507515, + "id": "15:22507515:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22507515, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "miRNA", + "ensemblGeneId": "ENSG00000221641", + "ensemblTranscriptId": "ENST00000408714", + "geneName": "MIR1268A", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.07500000298023224, + "source": "phastCons" + }, + { + "score": 0.07400000095367432, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "downstream_gene_variant", + "functionalScore": [ + { + "score": -0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.359999895095825, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22514236, + "id": "11080", + "percentageMatch": 0.909685, + "source": "genomicSuperDup", + "start": 22507268 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22514236, + "id": "11015", + "percentageMatch": 0.909685, + "source": "genomicSuperDup", + "start": 22507268 + } + ], + "start": 22510693, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22510693, + "id": "15:22510693:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 22510693, + "strand": "+", + "studies": [], + "type": "SNV" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.10100000351667404, + "source": "phastCons" + }, + { + "score": 0.12300000339746475, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intergenic_variant", + "functionalScore": [ + { + "score": 0.07999992370605469, + "source": "cadd_raw" + }, + { + "score": 3.4200000762939453, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1989025", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.34370026, + "altHomGenotypeFreq": 0.02926728, + "hetGenotypeFreq": 0.62886596, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6562997, + "refHomGenotypeFreq": 0.34186673, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40174672, + "altHomGenotypeFreq": 0.04366812, + "hetGenotypeFreq": 0.7161572, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.59825325, + "refHomGenotypeFreq": 0.24017467, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.13624339, + "altHomGenotypeFreq": 0.003968254, + "hetGenotypeFreq": 0.26455027, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.8637566, + "refHomGenotypeFreq": 0.7314815, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33125, + "altHomGenotypeFreq": 0.02, + "hetGenotypeFreq": 0.6225, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.66875, + "refHomGenotypeFreq": 0.3575, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4, + "altHomGenotypeFreq": 0.042857144, + "hetGenotypeFreq": 0.71428573, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.6, + "refHomGenotypeFreq": 0.24285714, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38304982, + "altHomGenotypeFreq": 0.034021873, + "hetGenotypeFreq": 0.69805586, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.61695015, + "refHomGenotypeFreq": 0.26792222, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40802583, + "altHomGenotypeFreq": 0.040970955, + "hetGenotypeFreq": 0.7341097, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.5919742, + "refHomGenotypeFreq": 0.22491932, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24286807, + "altHomGenotypeFreq": 0.009679062, + "hetGenotypeFreq": 0.466378, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.75713193, + "refHomGenotypeFreq": 0.52394295, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33751875, + "altHomGenotypeFreq": 0.029485257, + "hetGenotypeFreq": 0.616067, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.66248125, + "refHomGenotypeFreq": 0.35444778, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3513723, + "altHomGenotypeFreq": 0.028996743, + "hetGenotypeFreq": 0.64475113, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.6486277, + "refHomGenotypeFreq": 0.32625213, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22537901, + "id": "10245", + "percentageMatch": 0.95016, + "source": "genomicSuperDup", + "start": 22515923 + } + ], + "start": 22522883, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22522883, + "id": "15:22522883:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22522883, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.20200000703334808, + "source": "phastCons" + }, + { + "score": 0.12300000339746475, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intergenic_variant", + "functionalScore": [ + { + "score": 0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.940000057220459, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1988249", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.34379753, + "altHomGenotypeFreq": 0.02938736, + "hetGenotypeFreq": 0.62882036, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.65620244, + "refHomGenotypeFreq": 0.3417923, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4030501, + "altHomGenotypeFreq": 0.043572985, + "hetGenotypeFreq": 0.71895427, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5969499, + "refHomGenotypeFreq": 0.23747277, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1392904, + "altHomGenotypeFreq": 0.0039421814, + "hetGenotypeFreq": 0.27069646, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.8607096, + "refHomGenotypeFreq": 0.72536135, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33, + "altHomGenotypeFreq": 0.0175, + "hetGenotypeFreq": 0.625, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.67, + "refHomGenotypeFreq": 0.3575, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39928058, + "altHomGenotypeFreq": 0.043165468, + "hetGenotypeFreq": 0.7122302, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.60071945, + "refHomGenotypeFreq": 0.24460432, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38224527, + "altHomGenotypeFreq": 0.034167174, + "hetGenotypeFreq": 0.6961562, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.61775476, + "refHomGenotypeFreq": 0.26967663, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4080073, + "altHomGenotypeFreq": 0.04136867, + "hetGenotypeFreq": 0.73327726, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.59199274, + "refHomGenotypeFreq": 0.22535409, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.24345283, + "altHomGenotypeFreq": 0.009661836, + "hetGenotypeFreq": 0.467582, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.75654715, + "refHomGenotypeFreq": 0.52275616, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33764046, + "altHomGenotypeFreq": 0.029463172, + "hetGenotypeFreq": 0.6163546, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.66235954, + "refHomGenotypeFreq": 0.35418227, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3514414, + "altHomGenotypeFreq": 0.029293243, + "hetGenotypeFreq": 0.64429635, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.64855856, + "refHomGenotypeFreq": 0.3264104, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22537901, + "id": "10245", + "percentageMatch": 0.95016, + "source": "genomicSuperDup", + "start": 22515923 + } + ], + "start": 22522924, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22522924, + "id": "15:22522924:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22522924, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.7200000286102295, + "source": "gerp" + }, + { + "score": 0.02199999988079071, + "source": "phastCons" + }, + { + "score": -1.128000020980835, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intergenic_variant", + "functionalScore": [ + { + "score": -0.4099998474121094, + "source": "cadd_raw" + }, + { + "score": 0.3700000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4779374", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.44975078, + "altHomGenotypeFreq": 0.061969556, + "hetGenotypeFreq": 0.77556247, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5502492, + "refHomGenotypeFreq": 0.162468, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46413502, + "altHomGenotypeFreq": 0.06962025, + "hetGenotypeFreq": 0.78902954, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.53586495, + "refHomGenotypeFreq": 0.14135021, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33485046, + "altHomGenotypeFreq": 0.020806242, + "hetGenotypeFreq": 0.6280884, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.66514957, + "refHomGenotypeFreq": 0.35110533, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44607842, + "altHomGenotypeFreq": 0.073529415, + "hetGenotypeFreq": 0.74509805, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.5539216, + "refHomGenotypeFreq": 0.18137255, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46180555, + "altHomGenotypeFreq": 0.06944445, + "hetGenotypeFreq": 0.7847222, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.5381944, + "refHomGenotypeFreq": 0.14583333, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45395127, + "altHomGenotypeFreq": 0.072489604, + "hetGenotypeFreq": 0.76292336, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5460487, + "refHomGenotypeFreq": 0.16458705, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4544701, + "altHomGenotypeFreq": 0.06370043, + "hetGenotypeFreq": 0.7815393, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.5455299, + "refHomGenotypeFreq": 0.15476026, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45945293, + "altHomGenotypeFreq": 0.06003389, + "hetGenotypeFreq": 0.7988381, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.5405471, + "refHomGenotypeFreq": 0.14112806, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.44877425, + "altHomGenotypeFreq": 0.0640322, + "hetGenotypeFreq": 0.7694841, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.5512258, + "refHomGenotypeFreq": 0.16648372, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45095533, + "altHomGenotypeFreq": 0.059425306, + "hetGenotypeFreq": 0.78306, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.54904467, + "refHomGenotypeFreq": 0.15751466, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22537901, + "id": "10245", + "percentageMatch": 0.95016, + "source": "genomicSuperDup", + "start": 22515923 + } + ], + "start": 22525153, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22525153, + "id": "15:22525153:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22525153, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.5630000233650208, + "source": "gerp" + }, + { + "score": 0.08100000023841858, + "source": "phastCons" + }, + { + "score": -1.0449999570846558, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intergenic_variant", + "functionalScore": [ + { + "score": -0.039999961853027344, + "source": "cadd_raw" + }, + { + "score": 2.240000009536743, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1908937", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.9998709, + "altHomGenotypeFreq": 0.9997418, + "hetGenotypeFreq": 2.5823113E-4, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 1.2911556E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99954194, + "altHomGenotypeFreq": 0.9990838, + "hetGenotypeFreq": 9.161704E-4, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 4.580852E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99982476, + "altHomGenotypeFreq": 0.9996495, + "hetGenotypeFreq": 3.5046728E-4, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 1.7523364E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9999279, + "altHomGenotypeFreq": 0.9998557, + "hetGenotypeFreq": 1.4430014E-4, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 7.215007E-5, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0, + "study": "UK10K" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22537901, + "id": "10245", + "percentageMatch": 0.95016, + "source": "genomicSuperDup", + "start": 22515923 + } + ], + "start": 22531900, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22531900, + "id": "15:22531900:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 22531900, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.550000011920929, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -0.45899999141693115, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": -0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 1.8600000143051147, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs7183041", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.6217321, + "altHomGenotypeFreq": 0.44054163, + "hetGenotypeFreq": 0.5472584, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.2858292, + "refHomGenotypeFreq": 0.012200027, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.59549356, + "altHomGenotypeFreq": 0.44635195, + "hetGenotypeFreq": 0.5450644, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.2811159, + "refHomGenotypeFreq": 0.008583691, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.51644737, + "altHomGenotypeFreq": 0.49078947, + "hetGenotypeFreq": 0.49210525, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.2631579, + "refHomGenotypeFreq": 0.017105263, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6216216, + "altHomGenotypeFreq": 0.46928748, + "hetGenotypeFreq": 0.5085995, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.27641279, + "refHomGenotypeFreq": 0.022113021, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55517244, + "altHomGenotypeFreq": 0.42068964, + "hetGenotypeFreq": 0.57241374, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.29310346, + "refHomGenotypeFreq": 0.0068965517, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.607078, + "altHomGenotypeFreq": 0.4228675, + "hetGenotypeFreq": 0.56321836, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.2955233, + "refHomGenotypeFreq": 0.013914095, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.63153166, + "altHomGenotypeFreq": 0.48990875, + "hetGenotypeFreq": 0.5011059, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.2595383, + "refHomGenotypeFreq": 0.008985347, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.63472843, + "altHomGenotypeFreq": 0.3517517, + "hetGenotypeFreq": 0.63249475, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.33200094, + "refHomGenotypeFreq": 0.015753586, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.615702, + "altHomGenotypeFreq": 0.43878174, + "hetGenotypeFreq": 0.5482344, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.2871011, + "refHomGenotypeFreq": 0.012983861, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.62917477, + "altHomGenotypeFreq": 0.4427138, + "hetGenotypeFreq": 0.5460536, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.2842594, + "refHomGenotypeFreq": 0.011232589, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65625, + "altHomGenotypeFreq": 0.484375, + "hetGenotypeFreq": 0.5, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.265625, + "refHomGenotypeFreq": 0.015625, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.624401, + "altHomGenotypeFreq": 0.471246, + "hetGenotypeFreq": 0.50159746, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.27795526, + "refHomGenotypeFreq": 0.02715655, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5603272, + "altHomGenotypeFreq": 0.42535788, + "hetGenotypeFreq": 0.5419223, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.303681, + "refHomGenotypeFreq": 0.032719836, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64893615, + "altHomGenotypeFreq": 0.5106383, + "hetGenotypeFreq": 0.43617022, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.2712766, + "refHomGenotypeFreq": 0.05319149, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5392157, + "altHomGenotypeFreq": 0.37254903, + "hetGenotypeFreq": 0.5882354, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.039215688, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6815431, + "altHomGenotypeFreq": 0.40847203, + "hetGenotypeFreq": 0.5627837, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.31013617, + "refHomGenotypeFreq": 0.028744327, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5809524, + "altHomGenotypeFreq": 0.54285717, + "hetGenotypeFreq": 0.40952381, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.25238097, + "refHomGenotypeFreq": 0.04761905, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.42307693, + "hetGenotypeFreq": 0.5480769, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.3028846, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6851852, + "altHomGenotypeFreq": 0.4074074, + "hetGenotypeFreq": 0.5740741, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.30555555, + "refHomGenotypeFreq": 0.018518519, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6197917, + "altHomGenotypeFreq": 0.48958334, + "hetGenotypeFreq": 0.4895833, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.265625, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6902655, + "altHomGenotypeFreq": 0.42477876, + "hetGenotypeFreq": 0.53982306, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.30530974, + "refHomGenotypeFreq": 0.03539823, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5245098, + "altHomGenotypeFreq": 0.39215687, + "hetGenotypeFreq": 0.54901963, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.05882353, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6098901, + "altHomGenotypeFreq": 0.42857143, + "hetGenotypeFreq": 0.5604396, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.2912088, + "refHomGenotypeFreq": 0.010989011, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.52150536, + "altHomGenotypeFreq": 0.58064514, + "hetGenotypeFreq": 0.37634408, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.2311828, + "refHomGenotypeFreq": 0.043010753, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55050504, + "altHomGenotypeFreq": 0.5959596, + "hetGenotypeFreq": 0.38383842, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.21212122, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.682243, + "altHomGenotypeFreq": 0.588785, + "hetGenotypeFreq": 0.38317758, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.21962617, + "refHomGenotypeFreq": 0.028037382, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.50581396, + "altHomGenotypeFreq": 0.43023258, + "hetGenotypeFreq": 0.55813956, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.29069766, + "refHomGenotypeFreq": 0.011627907, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7239583, + "altHomGenotypeFreq": 0.5, + "hetGenotypeFreq": 0.4791667, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.26041666, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6969697, + "altHomGenotypeFreq": 0.41414142, + "hetGenotypeFreq": 0.57575756, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.2979798, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64141417, + "altHomGenotypeFreq": 0.35353535, + "hetGenotypeFreq": 0.57575756, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.35858586, + "refHomGenotypeFreq": 0.07070707, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65208745, + "altHomGenotypeFreq": 0.4970179, + "hetGenotypeFreq": 0.49105367, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.25745526, + "refHomGenotypeFreq": 0.01192843, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.647541, + "altHomGenotypeFreq": 0.36065573, + "hetGenotypeFreq": 0.60655737, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.33606556, + "refHomGenotypeFreq": 0.032786883, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.68443805, + "altHomGenotypeFreq": 0.54755044, + "hetGenotypeFreq": 0.42074928, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.24207492, + "refHomGenotypeFreq": 0.031700287, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67058825, + "altHomGenotypeFreq": 0.3764706, + "hetGenotypeFreq": 0.6117647, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.31764707, + "refHomGenotypeFreq": 0.011764706, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.60679615, + "altHomGenotypeFreq": 0.44660193, + "hetGenotypeFreq": 0.5242718, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.29126215, + "refHomGenotypeFreq": 0.029126214, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6666667, + "altHomGenotypeFreq": 0.4646465, + "hetGenotypeFreq": 0.53535354, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.26767677, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.635514, + "altHomGenotypeFreq": 0.49532712, + "hetGenotypeFreq": 0.49532712, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.25700936, + "refHomGenotypeFreq": 0.009345794, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.69711536, + "altHomGenotypeFreq": 0.5288462, + "hetGenotypeFreq": 0.44230768, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.25, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.66161615, + "altHomGenotypeFreq": 0.4949495, + "hetGenotypeFreq": 0.4949495, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.25757575, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7294118, + "altHomGenotypeFreq": 0.65882355, + "hetGenotypeFreq": 0.31764707, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.18235295, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.54265875, + "altHomGenotypeFreq": 0.5198413, + "hetGenotypeFreq": 0.44841272, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.2559524, + "refHomGenotypeFreq": 0.031746034, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55825245, + "altHomGenotypeFreq": 0.4660194, + "hetGenotypeFreq": 0.51456314, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.27669904, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22539747, + "id": "10246", + "percentageMatch": 0.931266, + "source": "genomicSuperDup", + "start": 22536945 + } + ], + "start": 22538095, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22538095, + "id": "15:22538095:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22538095, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.2699999809265137, + "source": "gerp" + }, + { + "score": 0.012000000104308128, + "source": "phastCons" + }, + { + "score": -2.688999891281128, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": -0.5799999237060547, + "source": "cadd_raw" + }, + { + "score": 0.14000000059604645, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs12913307", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.5210185, + "altHomGenotypeFreq": 0.11581902, + "hetGenotypeFreq": 0.810399, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.4789815, + "refHomGenotypeFreq": 0.073782, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5283613, + "altHomGenotypeFreq": 0.1092437, + "hetGenotypeFreq": 0.8382353, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.47163865, + "refHomGenotypeFreq": 0.05252101, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5019157, + "altHomGenotypeFreq": 0.11749681, + "hetGenotypeFreq": 0.7688378, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.49808428, + "refHomGenotypeFreq": 0.11366539, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.56416464, + "altHomGenotypeFreq": 0.20096852, + "hetGenotypeFreq": 0.72639227, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.43583536, + "refHomGenotypeFreq": 0.07263923, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5067568, + "altHomGenotypeFreq": 0.10135135, + "hetGenotypeFreq": 0.8108108, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.49324325, + "refHomGenotypeFreq": 0.08783784, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.54220396, + "altHomGenotypeFreq": 0.12133646, + "hetGenotypeFreq": 0.84173506, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.457796, + "refHomGenotypeFreq": 0.036928486, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5441921, + "altHomGenotypeFreq": 0.13777535, + "hetGenotypeFreq": 0.8128335, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.4558079, + "refHomGenotypeFreq": 0.04939116, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4702035, + "altHomGenotypeFreq": 0.067102715, + "hetGenotypeFreq": 0.8062016, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.52979654, + "refHomGenotypeFreq": 0.12669574, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.518877, + "altHomGenotypeFreq": 0.116529524, + "hetGenotypeFreq": 0.80469507, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.48112294, + "refHomGenotypeFreq": 0.07877541, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52366024, + "altHomGenotypeFreq": 0.11494253, + "hetGenotypeFreq": 0.81743544, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.47633976, + "refHomGenotypeFreq": 0.067622036, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22539747, + "id": "10246", + "percentageMatch": 0.931266, + "source": "genomicSuperDup", + "start": 22536945 + } + ], + "start": 22538759, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22538759, + "id": "15:22538759:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22538759, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.7910000085830688, + "source": "gerp" + }, + { + "score": 0.0020000000949949026, + "source": "phastCons" + }, + { + "score": 0.3720000088214874, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "TF_binding_site_variant", + "functionalScore": [ + { + "score": -0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 1.0399999618530273, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs67732625", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.26808718, + "altHomGenotypeFreq": 0.02729615, + "hetGenotypeFreq": 0.48158208, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7319128, + "refHomGenotypeFreq": 0.4911218, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30306345, + "altHomGenotypeFreq": 0.026258206, + "hetGenotypeFreq": 0.5536105, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.69693655, + "refHomGenotypeFreq": 0.4201313, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30066666, + "altHomGenotypeFreq": 0.033333335, + "hetGenotypeFreq": 0.53466666, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6993333, + "refHomGenotypeFreq": 0.432, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31829575, + "altHomGenotypeFreq": 0.05263158, + "hetGenotypeFreq": 0.5313283, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6817043, + "refHomGenotypeFreq": 0.4160401, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29787233, + "altHomGenotypeFreq": 0.021276595, + "hetGenotypeFreq": 0.5531915, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.70212764, + "refHomGenotypeFreq": 0.42553192, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36458975, + "altHomGenotypeFreq": 0.0394818, + "hetGenotypeFreq": 0.6502159, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.63541025, + "refHomGenotypeFreq": 0.3103023, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32908273, + "altHomGenotypeFreq": 0.03724098, + "hetGenotypeFreq": 0.58368355, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.6709173, + "refHomGenotypeFreq": 0.3790755, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.11119257, + "altHomGenotypeFreq": 0.0024437928, + "hetGenotypeFreq": 0.21749756, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8888074, + "refHomGenotypeFreq": 0.7800586, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2661523, + "altHomGenotypeFreq": 0.026470957, + "hetGenotypeFreq": 0.4793627, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7338477, + "refHomGenotypeFreq": 0.49416634, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27050078, + "altHomGenotypeFreq": 0.02832551, + "hetGenotypeFreq": 0.48435056, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.7294992, + "refHomGenotypeFreq": 0.48732394, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22539747, + "id": "10246", + "percentageMatch": 0.931266, + "source": "genomicSuperDup", + "start": 22536945 + } + ], + "start": 22539300, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22539300, + "id": "15:22539300:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 22539300, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.1799999475479126, + "source": "gerp" + }, + { + "score": 0.09799999743700027, + "source": "phastCons" + }, + { + "score": 0.3799999952316284, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "TF_binding_site_variant", + "functionalScore": [ + { + "score": 0.18000030517578125, + "source": "cadd_raw" + }, + { + "score": 4.559999942779541, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs11638593", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.33695188, + "altHomGenotypeFreq": 0.05144033, + "hetGenotypeFreq": 0.5710231, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6630481, + "refHomGenotypeFreq": 0.37753654, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39096916, + "altHomGenotypeFreq": 0.06387665, + "hetGenotypeFreq": 0.654185, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.60903084, + "refHomGenotypeFreq": 0.2819383, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29864866, + "altHomGenotypeFreq": 0.032432433, + "hetGenotypeFreq": 0.53243244, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.70135134, + "refHomGenotypeFreq": 0.43513513, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.375, + "altHomGenotypeFreq": 0.067010306, + "hetGenotypeFreq": 0.6159794, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.625, + "refHomGenotypeFreq": 0.3170103, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38321167, + "altHomGenotypeFreq": 0.04379562, + "hetGenotypeFreq": 0.6788321, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.6167883, + "refHomGenotypeFreq": 0.27737227, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42742968, + "altHomGenotypeFreq": 0.08184143, + "hetGenotypeFreq": 0.6911765, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5725703, + "refHomGenotypeFreq": 0.2269821, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41425243, + "altHomGenotypeFreq": 0.072062895, + "hetGenotypeFreq": 0.6843791, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.58574754, + "refHomGenotypeFreq": 0.24355802, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16197361, + "altHomGenotypeFreq": 0.0043125316, + "hetGenotypeFreq": 0.31532216, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8380264, + "refHomGenotypeFreq": 0.6803653, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33416474, + "altHomGenotypeFreq": 0.04860578, + "hetGenotypeFreq": 0.57111794, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.66583526, + "refHomGenotypeFreq": 0.3802763, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34042382, + "altHomGenotypeFreq": 0.05497132, + "hetGenotypeFreq": 0.570905, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.6595762, + "refHomGenotypeFreq": 0.37412363, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.0093632955, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.018726591, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9906367, + "refHomGenotypeFreq": 0.9812734, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22539747, + "id": "10246", + "percentageMatch": 0.931266, + "source": "genomicSuperDup", + "start": 22536945 + } + ], + "start": 22539446, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22539446, + "id": "15:22539446:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22539446, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.6869999766349792, + "source": "gerp" + }, + { + "score": 0.017000000923871994, + "source": "phastCons" + }, + { + "score": 0.4000000059604645, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 0.28999996185302734, + "source": "cadd_raw" + }, + { + "score": 5.650000095367432, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4039219", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.5223128, + "altHomGenotypeFreq": 0.15363702, + "hetGenotypeFreq": 0.73735166, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.47768715, + "refHomGenotypeFreq": 0.10901134, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49036402, + "altHomGenotypeFreq": 0.113490365, + "hetGenotypeFreq": 0.75374734, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.509636, + "refHomGenotypeFreq": 0.13276231, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43943298, + "altHomGenotypeFreq": 0.05541237, + "hetGenotypeFreq": 0.76804125, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.560567, + "refHomGenotypeFreq": 0.1765464, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44594595, + "altHomGenotypeFreq": 0.12776412, + "hetGenotypeFreq": 0.6363636, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5540541, + "refHomGenotypeFreq": 0.23587224, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43243244, + "altHomGenotypeFreq": 0.033783782, + "hetGenotypeFreq": 0.7972973, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.5675676, + "refHomGenotypeFreq": 0.16891892, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45088756, + "altHomGenotypeFreq": 0.08757397, + "hetGenotypeFreq": 0.72662723, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.54911244, + "refHomGenotypeFreq": 0.18579882, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5058187, + "altHomGenotypeFreq": 0.12650603, + "hetGenotypeFreq": 0.7586254, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.49418128, + "refHomGenotypeFreq": 0.11486857, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.6073677, + "altHomGenotypeFreq": 0.25460482, + "hetGenotypeFreq": 0.70552576, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.3926323, + "refHomGenotypeFreq": 0.039869435, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52091825, + "altHomGenotypeFreq": 0.15391992, + "hetGenotypeFreq": 0.7339966, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.47908175, + "refHomGenotypeFreq": 0.112083435, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.52403915, + "altHomGenotypeFreq": 0.15328684, + "hetGenotypeFreq": 0.74150467, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.47596082, + "refHomGenotypeFreq": 0.10520849, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50501, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.49499, + "study": "GONL" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22541053, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22541053, + "id": "15:22541053:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22541053, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.2639999985694885, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -1.6059999465942383, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "upstream_gene_variant", + "functionalScore": [ + { + "score": -0.18999958038330078, + "source": "cadd_raw" + }, + { + "score": 1.149999976158142, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs2342057", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.9498513, + "altHomGenotypeFreq": 0.8997672, + "hetGenotypeFreq": 0.10016813, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.050148733, + "refHomGenotypeFreq": 6.4666325E-5, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96836734, + "altHomGenotypeFreq": 0.9367347, + "hetGenotypeFreq": 0.06326531, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.031632654, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9857673, + "altHomGenotypeFreq": 0.9727723, + "hetGenotypeFreq": 0.025990099, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.014232674, + "refHomGenotypeFreq": 0.0012376237, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9725537, + "altHomGenotypeFreq": 0.9451074, + "hetGenotypeFreq": 0.0548926, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.0274463, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.98013246, + "altHomGenotypeFreq": 0.9602649, + "hetGenotypeFreq": 0.0397351, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.01986755, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9905552, + "altHomGenotypeFreq": 0.98111045, + "hetGenotypeFreq": 0.018889524, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.009444762, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97092557, + "altHomGenotypeFreq": 0.94185114, + "hetGenotypeFreq": 0.05814884, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.02907442, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.88519883, + "altHomGenotypeFreq": 0.7703976, + "hetGenotypeFreq": 0.2296024, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.1148012, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9485079, + "altHomGenotypeFreq": 0.8971328, + "hetGenotypeFreq": 0.102750145, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.051492102, + "refHomGenotypeFreq": 1.170275E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9515103, + "altHomGenotypeFreq": 0.9030207, + "hetGenotypeFreq": 0.096979335, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.048489667, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9799599, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.02004008, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9388978, + "altHomGenotypeFreq": 0.8777955, + "hetGenotypeFreq": 0.12220447, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.061102238, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.88752556, + "altHomGenotypeFreq": 0.7750511, + "hetGenotypeFreq": 0.22494888, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.112474434, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9734042, + "altHomGenotypeFreq": 0.9468085, + "hetGenotypeFreq": 0.05319149, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.026595745, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.877451, + "altHomGenotypeFreq": 0.75490195, + "hetGenotypeFreq": 0.24509805, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.12254902, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.90468985, + "altHomGenotypeFreq": 0.80937976, + "hetGenotypeFreq": 0.19062027, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.09531014, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96666664, + "altHomGenotypeFreq": 0.93333334, + "hetGenotypeFreq": 0.06666667, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.033333335, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9951923, + "altHomGenotypeFreq": 0.99038464, + "hetGenotypeFreq": 0.009615385, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.0048076925, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9212963, + "altHomGenotypeFreq": 0.8425926, + "hetGenotypeFreq": 0.1574074, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.0787037, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.921875, + "altHomGenotypeFreq": 0.84375, + "hetGenotypeFreq": 0.15625, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.078125, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.90707964, + "altHomGenotypeFreq": 0.8141593, + "hetGenotypeFreq": 0.18584071, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.092920355, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.872549, + "altHomGenotypeFreq": 0.74509805, + "hetGenotypeFreq": 0.25490198, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.12745099, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96153843, + "altHomGenotypeFreq": 0.9230769, + "hetGenotypeFreq": 0.07692308, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.03846154, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97849464, + "altHomGenotypeFreq": 0.9569892, + "hetGenotypeFreq": 0.043010753, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.021505376, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.94949496, + "altHomGenotypeFreq": 0.8989899, + "hetGenotypeFreq": 0.1010101, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.05050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9579439, + "altHomGenotypeFreq": 0.91588783, + "hetGenotypeFreq": 0.08411215, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.042056076, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.86627907, + "altHomGenotypeFreq": 0.73255813, + "hetGenotypeFreq": 0.26744187, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.13372093, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8854167, + "altHomGenotypeFreq": 0.7708333, + "hetGenotypeFreq": 0.22916666, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.114583336, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9040404, + "altHomGenotypeFreq": 0.8080808, + "hetGenotypeFreq": 0.1919192, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.0959596, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.93939394, + "altHomGenotypeFreq": 0.8787879, + "hetGenotypeFreq": 0.121212125, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.060606062, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9671968, + "altHomGenotypeFreq": 0.93439364, + "hetGenotypeFreq": 0.065606356, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.03280318, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.90163934, + "altHomGenotypeFreq": 0.8032787, + "hetGenotypeFreq": 0.19672132, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.09836066, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9798271, + "altHomGenotypeFreq": 0.95965415, + "hetGenotypeFreq": 0.04034582, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.02017291, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.86470586, + "altHomGenotypeFreq": 0.7294118, + "hetGenotypeFreq": 0.27058825, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.13529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.89805824, + "altHomGenotypeFreq": 0.79611653, + "hetGenotypeFreq": 0.2038835, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.10194175, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.95327103, + "altHomGenotypeFreq": 0.90654206, + "hetGenotypeFreq": 0.09345794, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.046728972, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96634614, + "altHomGenotypeFreq": 0.9326923, + "hetGenotypeFreq": 0.067307696, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.033653848, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.969697, + "altHomGenotypeFreq": 0.93939394, + "hetGenotypeFreq": 0.060606062, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.030303031, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97718257, + "altHomGenotypeFreq": 0.9543651, + "hetGenotypeFreq": 0.04563492, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.02281746, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9951456, + "altHomGenotypeFreq": 0.99029124, + "hetGenotypeFreq": 0.009708738, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.004854369, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22541428, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22541428, + "id": "15:22541428:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22541428, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.8799999952316284, + "source": "gerp" + }, + { + "score": 0.0010000000474974513, + "source": "phastCons" + }, + { + "score": -0.7200000286102295, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "upstream_gene_variant", + "functionalScore": [ + { + "score": -0.14999961853027344, + "source": "cadd_raw" + }, + { + "score": 1.440000057220459, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1814708", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.9503817, + "altHomGenotypeFreq": 0.90082806, + "hetGenotypeFreq": 0.09910726, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.049618322, + "refHomGenotypeFreq": 6.469142E-5, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9674134, + "altHomGenotypeFreq": 0.9348269, + "hetGenotypeFreq": 0.06517312, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.03258656, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9863861, + "altHomGenotypeFreq": 0.9740099, + "hetGenotypeFreq": 0.024752475, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.013613861, + "refHomGenotypeFreq": 0.0012376237, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9736842, + "altHomGenotypeFreq": 0.94736844, + "hetGenotypeFreq": 0.05263158, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.02631579, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.98013246, + "altHomGenotypeFreq": 0.9602649, + "hetGenotypeFreq": 0.0397351, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.01986755, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9905552, + "altHomGenotypeFreq": 0.98111045, + "hetGenotypeFreq": 0.018889524, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.009444762, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9708628, + "altHomGenotypeFreq": 0.94172555, + "hetGenotypeFreq": 0.058274437, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.029137218, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8869705, + "altHomGenotypeFreq": 0.77394104, + "hetGenotypeFreq": 0.22605893, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.113029465, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9489115, + "altHomGenotypeFreq": 0.8979401, + "hetGenotypeFreq": 0.10194288, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.051088482, + "refHomGenotypeFreq": 1.170412E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.95219845, + "altHomGenotypeFreq": 0.9043969, + "hetGenotypeFreq": 0.09560312, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.04780156, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97795594, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.022044089, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9404952, + "altHomGenotypeFreq": 0.8809904, + "hetGenotypeFreq": 0.119009584, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.059504792, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8854806, + "altHomGenotypeFreq": 0.77096117, + "hetGenotypeFreq": 0.22903885, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.114519425, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9734042, + "altHomGenotypeFreq": 0.9468085, + "hetGenotypeFreq": 0.05319149, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.026595745, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.89215684, + "altHomGenotypeFreq": 0.78431374, + "hetGenotypeFreq": 0.21568628, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.10784314, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.90922844, + "altHomGenotypeFreq": 0.8184569, + "hetGenotypeFreq": 0.18154311, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.090771556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96666664, + "altHomGenotypeFreq": 0.93333334, + "hetGenotypeFreq": 0.06666667, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.033333335, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9951923, + "altHomGenotypeFreq": 0.99038464, + "hetGenotypeFreq": 0.009615385, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.0048076925, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9305556, + "altHomGenotypeFreq": 0.8611111, + "hetGenotypeFreq": 0.1388889, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.06944445, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9114583, + "altHomGenotypeFreq": 0.8229167, + "hetGenotypeFreq": 0.17708334, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.088541664, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9026549, + "altHomGenotypeFreq": 0.8053097, + "hetGenotypeFreq": 0.19469026, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.097345136, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.872549, + "altHomGenotypeFreq": 0.74509805, + "hetGenotypeFreq": 0.25490198, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.12745099, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96703297, + "altHomGenotypeFreq": 0.93406594, + "hetGenotypeFreq": 0.06593407, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.032967035, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97849464, + "altHomGenotypeFreq": 0.9569892, + "hetGenotypeFreq": 0.043010753, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.021505376, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.95454544, + "altHomGenotypeFreq": 0.90909094, + "hetGenotypeFreq": 0.09090909, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.045454547, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9579439, + "altHomGenotypeFreq": 0.91588783, + "hetGenotypeFreq": 0.08411215, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.042056076, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.85465115, + "altHomGenotypeFreq": 0.7093023, + "hetGenotypeFreq": 0.2906977, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.14534883, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8854167, + "altHomGenotypeFreq": 0.7708333, + "hetGenotypeFreq": 0.22916666, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.114583336, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9040404, + "altHomGenotypeFreq": 0.8080808, + "hetGenotypeFreq": 0.1919192, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.0959596, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.95454544, + "altHomGenotypeFreq": 0.90909094, + "hetGenotypeFreq": 0.09090909, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.045454547, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9701789, + "altHomGenotypeFreq": 0.94035786, + "hetGenotypeFreq": 0.059642144, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.029821074, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.90983605, + "altHomGenotypeFreq": 0.8196721, + "hetGenotypeFreq": 0.18032786, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.09016393, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9798271, + "altHomGenotypeFreq": 0.95965415, + "hetGenotypeFreq": 0.04034582, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.02017291, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.87058824, + "altHomGenotypeFreq": 0.7411765, + "hetGenotypeFreq": 0.25882354, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.12941177, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.89320385, + "altHomGenotypeFreq": 0.78640777, + "hetGenotypeFreq": 0.21359223, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.106796116, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9579439, + "altHomGenotypeFreq": 0.91588783, + "hetGenotypeFreq": 0.084112145, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.042056076, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96634614, + "altHomGenotypeFreq": 0.9326923, + "hetGenotypeFreq": 0.067307696, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.033653848, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9747475, + "altHomGenotypeFreq": 0.94949496, + "hetGenotypeFreq": 0.05050505, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.025252525, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9781746, + "altHomGenotypeFreq": 0.9563492, + "hetGenotypeFreq": 0.043650795, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.021825397, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9951456, + "altHomGenotypeFreq": 0.99029124, + "hetGenotypeFreq": 0.009708738, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.004854369, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22541631, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22541631, + "id": "15:22541631:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22541631, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001631", + "name": "upstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.19200000166893005, + "source": "phastCons" + }, + { + "score": -2.186000108718872, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "upstream_gene_variant", + "functionalScore": [ + { + "score": -0.010000228881835938, + "source": "cadd_raw" + }, + { + "score": 2.490000009536743, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1814705", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.94942516, + "altHomGenotypeFreq": 0.8989149, + "hetGenotypeFreq": 0.10102054, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.05057486, + "refHomGenotypeFreq": 6.4591135E-5, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9674134, + "altHomGenotypeFreq": 0.9348269, + "hetGenotypeFreq": 0.06517312, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.03258656, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9858025, + "altHomGenotypeFreq": 0.97283953, + "hetGenotypeFreq": 0.025925925, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.014197531, + "refHomGenotypeFreq": 0.001234568, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9713604, + "altHomGenotypeFreq": 0.9427208, + "hetGenotypeFreq": 0.057279237, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.028639618, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9768212, + "altHomGenotypeFreq": 0.95364237, + "hetGenotypeFreq": 0.046357617, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.023178808, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9905552, + "altHomGenotypeFreq": 0.98111045, + "hetGenotypeFreq": 0.018889524, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.009444762, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9706157, + "altHomGenotypeFreq": 0.94123137, + "hetGenotypeFreq": 0.058768656, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.029384328, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.884633, + "altHomGenotypeFreq": 0.76926607, + "hetGenotypeFreq": 0.23073395, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.11536697, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.94828796, + "altHomGenotypeFreq": 0.89669275, + "hetGenotypeFreq": 0.10319037, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.051712047, + "refHomGenotypeFreq": 1.1686339E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.95083034, + "altHomGenotypeFreq": 0.9016606, + "hetGenotypeFreq": 0.09833935, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.049169675, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9789579, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.021042084, + "study": "GONL" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.93869805, + "altHomGenotypeFreq": 0.87739617, + "hetGenotypeFreq": 0.12260383, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.061301917, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.88650304, + "altHomGenotypeFreq": 0.77300614, + "hetGenotypeFreq": 0.22699386, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.11349693, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9734042, + "altHomGenotypeFreq": 0.9468085, + "hetGenotypeFreq": 0.05319149, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.026595745, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8872549, + "altHomGenotypeFreq": 0.7745098, + "hetGenotypeFreq": 0.2254902, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.1127451, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9039334, + "altHomGenotypeFreq": 0.8078669, + "hetGenotypeFreq": 0.19213313, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.096066564, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.96666664, + "altHomGenotypeFreq": 0.93333334, + "hetGenotypeFreq": 0.06666667, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.033333335, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9951923, + "altHomGenotypeFreq": 0.99038464, + "hetGenotypeFreq": 0.009615385, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.0048076925, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9166667, + "altHomGenotypeFreq": 0.8333333, + "hetGenotypeFreq": 0.16666666, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.083333336, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9166667, + "altHomGenotypeFreq": 0.8333333, + "hetGenotypeFreq": 0.16666667, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.083333336, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9026549, + "altHomGenotypeFreq": 0.8053097, + "hetGenotypeFreq": 0.19469026, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.097345136, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86764705, + "altHomGenotypeFreq": 0.7352941, + "hetGenotypeFreq": 0.2647059, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.13235295, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.96703297, + "altHomGenotypeFreq": 0.93406594, + "hetGenotypeFreq": 0.06593407, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.032967035, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.97849464, + "altHomGenotypeFreq": 0.9569892, + "hetGenotypeFreq": 0.043010753, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.021505376, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.95454544, + "altHomGenotypeFreq": 0.90909094, + "hetGenotypeFreq": 0.09090909, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.045454547, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.95327103, + "altHomGenotypeFreq": 0.90654206, + "hetGenotypeFreq": 0.09345794, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.046728972, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8604651, + "altHomGenotypeFreq": 0.7209302, + "hetGenotypeFreq": 0.27906978, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.13953489, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8802083, + "altHomGenotypeFreq": 0.7604167, + "hetGenotypeFreq": 0.23958334, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.119791664, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9141414, + "altHomGenotypeFreq": 0.82828283, + "hetGenotypeFreq": 0.17171717, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.08585858, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.93939394, + "altHomGenotypeFreq": 0.8787879, + "hetGenotypeFreq": 0.12121212, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.060606062, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9671968, + "altHomGenotypeFreq": 0.93439364, + "hetGenotypeFreq": 0.065606356, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.03280318, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.90163934, + "altHomGenotypeFreq": 0.8032787, + "hetGenotypeFreq": 0.19672132, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.09836066, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9798271, + "altHomGenotypeFreq": 0.95965415, + "hetGenotypeFreq": 0.04034582, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.02017291, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86470586, + "altHomGenotypeFreq": 0.7294118, + "hetGenotypeFreq": 0.27058825, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.13529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.89805824, + "altHomGenotypeFreq": 0.79611653, + "hetGenotypeFreq": 0.2038835, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.10194175, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.95327103, + "altHomGenotypeFreq": 0.90654206, + "hetGenotypeFreq": 0.09345794, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.046728972, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.96634614, + "altHomGenotypeFreq": 0.9326923, + "hetGenotypeFreq": 0.067307696, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.033653848, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.969697, + "altHomGenotypeFreq": 0.93939394, + "hetGenotypeFreq": 0.060606062, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.030303031, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9781746, + "altHomGenotypeFreq": 0.9563492, + "hetGenotypeFreq": 0.043650795, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.021825397, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9951456, + "altHomGenotypeFreq": 0.99029124, + "hetGenotypeFreq": 0.009708738, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.004854369, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.96588206, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.03411796, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.963906, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.036094014, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.96834457, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.031655423, + "study": "UK10K" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9633225, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.036677454, + "study": "UK10K" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22543390, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22543390, + "id": "15:22543390:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 22543390, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "cdnaPosition": 570, + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "exonOverlap": [ + { + "number": "1/1", + "percentage": 0.14064698 + } + ], + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.1399999856948853, + "source": "gerp" + }, + { + "score": 0.5350000262260437, + "source": "phastCons" + }, + { + "score": 0.1940000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.390000343322754, + "source": "cadd_raw" + }, + { + "score": 12.739999771118164, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000553429(ENSG00000259098):n.570G>A" + ], + "id": "rs4779392", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.3986234, + "altHomGenotypeFreq": 0.06454068, + "hetGenotypeFreq": 0.66816545, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6013766, + "refHomGenotypeFreq": 0.26729387, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.475162, + "altHomGenotypeFreq": 0.082073435, + "hetGenotypeFreq": 0.7861771, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.52483803, + "refHomGenotypeFreq": 0.13174947, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36002693, + "altHomGenotypeFreq": 0.04576043, + "hetGenotypeFreq": 0.62853295, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6399731, + "refHomGenotypeFreq": 0.3257066, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4220297, + "altHomGenotypeFreq": 0.08663366, + "hetGenotypeFreq": 0.6707921, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5779703, + "refHomGenotypeFreq": 0.24257426, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46575344, + "altHomGenotypeFreq": 0.047945205, + "hetGenotypeFreq": 0.8356164, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.53424656, + "refHomGenotypeFreq": 0.11643836, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49907693, + "altHomGenotypeFreq": 0.09846154, + "hetGenotypeFreq": 0.8012308, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.5009231, + "refHomGenotypeFreq": 0.100307696, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49164325, + "altHomGenotypeFreq": 0.089325845, + "hetGenotypeFreq": 0.8046348, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.50835675, + "refHomGenotypeFreq": 0.10603932, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.18331227, + "altHomGenotypeFreq": 0.0058154236, + "hetGenotypeFreq": 0.35499367, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.81668776, + "refHomGenotypeFreq": 0.6391909, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3930849, + "altHomGenotypeFreq": 0.062148307, + "hetGenotypeFreq": 0.6618732, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.6069151, + "refHomGenotypeFreq": 0.2759785, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4054807, + "altHomGenotypeFreq": 0.06750271, + "hetGenotypeFreq": 0.675956, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.59451926, + "refHomGenotypeFreq": 0.25654125, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38376755, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.61623245, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29962546, + "altHomGenotypeFreq": 0.074906364, + "hetGenotypeFreq": 0.4494382, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.70037454, + "refHomGenotypeFreq": 0.47565544, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22546658, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22546658, + "id": "15:22546658:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22546658, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.4909999966621399, + "source": "gerp" + }, + { + "score": 0.020999999716877937, + "source": "phastCons" + }, + { + "score": -1.0329999923706055, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": -0.06000041961669922, + "source": "cadd_raw" + }, + { + "score": 2.069999933242798, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs2173171", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.69508594, + "altHomGenotypeFreq": 0.399029, + "hetGenotypeFreq": 0.5921139, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.30491406, + "refHomGenotypeFreq": 0.008857105, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7105809, + "altHomGenotypeFreq": 0.4294606, + "hetGenotypeFreq": 0.56224066, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.28941908, + "refHomGenotypeFreq": 0.008298756, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7327478, + "altHomGenotypeFreq": 0.47678795, + "hetGenotypeFreq": 0.5119197, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.2672522, + "refHomGenotypeFreq": 0.011292347, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7070218, + "altHomGenotypeFreq": 0.44067797, + "hetGenotypeFreq": 0.53268766, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.2929782, + "refHomGenotypeFreq": 0.026634382, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7350993, + "altHomGenotypeFreq": 0.47019866, + "hetGenotypeFreq": 0.5298013, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.26490065, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7287449, + "altHomGenotypeFreq": 0.459225, + "hetGenotypeFreq": 0.5390399, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.27125505, + "refHomGenotypeFreq": 0.001735107, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70945764, + "altHomGenotypeFreq": 0.4239072, + "hetGenotypeFreq": 0.5711009, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.29054236, + "refHomGenotypeFreq": 0.004991905, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.64502114, + "altHomGenotypeFreq": 0.30671677, + "hetGenotypeFreq": 0.67660874, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.35497886, + "refHomGenotypeFreq": 0.016674494, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6995015, + "altHomGenotypeFreq": 0.40956563, + "hetGenotypeFreq": 0.57987183, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.30049846, + "refHomGenotypeFreq": 0.010562545, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.68962735, + "altHomGenotypeFreq": 0.38600352, + "hetGenotypeFreq": 0.60724765, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.31037265, + "refHomGenotypeFreq": 0.0067488262, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7244489, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.2755511, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7109375, + "altHomGenotypeFreq": 0.453125, + "hetGenotypeFreq": 0.515625, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.2890625, + "refHomGenotypeFreq": 0.03125, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.71445686, + "altHomGenotypeFreq": 0.45646966, + "hetGenotypeFreq": 0.5159744, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.28554314, + "refHomGenotypeFreq": 0.02755591, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7249489, + "altHomGenotypeFreq": 0.46625766, + "hetGenotypeFreq": 0.51738244, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.27505112, + "refHomGenotypeFreq": 0.016359918, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7180851, + "altHomGenotypeFreq": 0.4680851, + "hetGenotypeFreq": 0.5, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.2819149, + "refHomGenotypeFreq": 0.031914894, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7107843, + "altHomGenotypeFreq": 0.44117647, + "hetGenotypeFreq": 0.5392157, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.28921568, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65960664, + "altHomGenotypeFreq": 0.3540091, + "hetGenotypeFreq": 0.61119515, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.34039333, + "refHomGenotypeFreq": 0.034795765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7285714, + "altHomGenotypeFreq": 0.4857143, + "hetGenotypeFreq": 0.48571432, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.27142859, + "refHomGenotypeFreq": 0.028571429, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7355769, + "altHomGenotypeFreq": 0.52884614, + "hetGenotypeFreq": 0.41346154, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.26442307, + "refHomGenotypeFreq": 0.057692308, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6157407, + "altHomGenotypeFreq": 0.2685185, + "hetGenotypeFreq": 0.6944444, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.38425925, + "refHomGenotypeFreq": 0.037037037, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7395833, + "altHomGenotypeFreq": 0.47916666, + "hetGenotypeFreq": 0.5208333, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.26041666, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6814159, + "altHomGenotypeFreq": 0.40707964, + "hetGenotypeFreq": 0.54867256, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.31858408, + "refHomGenotypeFreq": 0.044247787, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73039216, + "altHomGenotypeFreq": 0.49019608, + "hetGenotypeFreq": 0.48039216, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.26960784, + "refHomGenotypeFreq": 0.029411765, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8021978, + "altHomGenotypeFreq": 0.6043956, + "hetGenotypeFreq": 0.3956044, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.1978022, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78494626, + "altHomGenotypeFreq": 0.5913978, + "hetGenotypeFreq": 0.38709676, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.21505377, + "refHomGenotypeFreq": 0.021505376, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72727275, + "altHomGenotypeFreq": 0.45454547, + "hetGenotypeFreq": 0.54545456, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.27272728, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.74766356, + "altHomGenotypeFreq": 0.5233645, + "hetGenotypeFreq": 0.44859815, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.25233644, + "refHomGenotypeFreq": 0.028037382, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7383721, + "altHomGenotypeFreq": 0.4883721, + "hetGenotypeFreq": 0.5, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.2616279, + "refHomGenotypeFreq": 0.011627907, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6927083, + "altHomGenotypeFreq": 0.41666666, + "hetGenotypeFreq": 0.5520833, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.30729166, + "refHomGenotypeFreq": 0.03125, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.65656567, + "altHomGenotypeFreq": 0.35353535, + "hetGenotypeFreq": 0.6060606, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.34343433, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67171717, + "altHomGenotypeFreq": 0.37373737, + "hetGenotypeFreq": 0.59595954, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.32828283, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7554672, + "altHomGenotypeFreq": 0.5248509, + "hetGenotypeFreq": 0.4612326, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.24453281, + "refHomGenotypeFreq": 0.013916501, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6639344, + "altHomGenotypeFreq": 0.36065573, + "hetGenotypeFreq": 0.60655737, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.33606556, + "refHomGenotypeFreq": 0.032786883, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.721902, + "altHomGenotypeFreq": 0.4870317, + "hetGenotypeFreq": 0.46974063, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.278098, + "refHomGenotypeFreq": 0.043227665, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.63529414, + "altHomGenotypeFreq": 0.29411766, + "hetGenotypeFreq": 0.68235296, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.3647059, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70873785, + "altHomGenotypeFreq": 0.4368932, + "hetGenotypeFreq": 0.5436893, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.29126215, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7979798, + "altHomGenotypeFreq": 0.5959596, + "hetGenotypeFreq": 0.4040404, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.2020202, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.682243, + "altHomGenotypeFreq": 0.39252338, + "hetGenotypeFreq": 0.5794392, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.317757, + "refHomGenotypeFreq": 0.028037382, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.72115386, + "altHomGenotypeFreq": 0.47115386, + "hetGenotypeFreq": 0.5, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.27884614, + "refHomGenotypeFreq": 0.028846154, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75757575, + "altHomGenotypeFreq": 0.5252525, + "hetGenotypeFreq": 0.46464646, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.24242425, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7352941, + "altHomGenotypeFreq": 0.5529412, + "hetGenotypeFreq": 0.3647059, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.2647059, + "refHomGenotypeFreq": 0.08235294, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.73015875, + "altHomGenotypeFreq": 0.4920635, + "hetGenotypeFreq": 0.47619045, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.26984128, + "refHomGenotypeFreq": 0.031746034, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.6796116, + "altHomGenotypeFreq": 0.407767, + "hetGenotypeFreq": 0.5436893, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.32038835, + "refHomGenotypeFreq": 0.048543688, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0093632955, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.011235955, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9906367, + "refHomGenotypeFreq": 0.98501873, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22547025, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22547025, + "id": "15:22547025:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22547025, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.375, + "source": "gerp" + }, + { + "score": 0.003000000026077032, + "source": "phastCons" + }, + { + "score": -1.3869999647140503, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": -0.07999992370605469, + "source": "cadd_raw" + }, + { + "score": 1.899999976158142, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs2132808", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.6749253, + "altHomGenotypeFreq": 0.36238474, + "hetGenotypeFreq": 0.6250812, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.32507467, + "refHomGenotypeFreq": 0.012534095, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.70408165, + "altHomGenotypeFreq": 0.41836736, + "hetGenotypeFreq": 0.5714286, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.29591838, + "refHomGenotypeFreq": 0.010204081, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67745954, + "altHomGenotypeFreq": 0.369863, + "hetGenotypeFreq": 0.615193, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.32254046, + "refHomGenotypeFreq": 0.01494396, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6966427, + "altHomGenotypeFreq": 0.4172662, + "hetGenotypeFreq": 0.558753, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.3033573, + "refHomGenotypeFreq": 0.023980815, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.68874174, + "altHomGenotypeFreq": 0.38410595, + "hetGenotypeFreq": 0.6092715, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.3112583, + "refHomGenotypeFreq": 0.0066225166, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7270642, + "altHomGenotypeFreq": 0.45584863, + "hetGenotypeFreq": 0.5424312, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.27293578, + "refHomGenotypeFreq": 0.0017201835, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7029412, + "altHomGenotypeFreq": 0.4106952, + "hetGenotypeFreq": 0.58449197, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.29705882, + "refHomGenotypeFreq": 0.0048128343, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5988871, + "altHomGenotypeFreq": 0.22698818, + "hetGenotypeFreq": 0.74379784, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.4011129, + "refHomGenotypeFreq": 0.029214004, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67653626, + "altHomGenotypeFreq": 0.36846435, + "hetGenotypeFreq": 0.6161438, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.32346374, + "refHomGenotypeFreq": 0.015391846, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67293453, + "altHomGenotypeFreq": 0.3548715, + "hetGenotypeFreq": 0.63612604, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.3270655, + "refHomGenotypeFreq": 0.009002469, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7034068, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.2965932, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.671875, + "altHomGenotypeFreq": 0.421875, + "hetGenotypeFreq": 0.5, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.328125, + "refHomGenotypeFreq": 0.078125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6513578, + "altHomGenotypeFreq": 0.35263577, + "hetGenotypeFreq": 0.5974441, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.34864217, + "refHomGenotypeFreq": 0.049920127, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6830266, + "altHomGenotypeFreq": 0.398773, + "hetGenotypeFreq": 0.5685072, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.31697342, + "refHomGenotypeFreq": 0.032719836, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67021275, + "altHomGenotypeFreq": 0.41489363, + "hetGenotypeFreq": 0.5106383, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.32978722, + "refHomGenotypeFreq": 0.07446808, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.70098037, + "altHomGenotypeFreq": 0.42156863, + "hetGenotypeFreq": 0.5588236, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.2990196, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5824508, + "altHomGenotypeFreq": 0.23600605, + "hetGenotypeFreq": 0.6928896, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.41754916, + "refHomGenotypeFreq": 0.071104385, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.64761907, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.62857145, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.35238096, + "refHomGenotypeFreq": 0.03809524, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6201923, + "altHomGenotypeFreq": 0.34615386, + "hetGenotypeFreq": 0.5480769, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.37980768, + "refHomGenotypeFreq": 0.10576923, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5787037, + "altHomGenotypeFreq": 0.18518518, + "hetGenotypeFreq": 0.787037, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.4212963, + "refHomGenotypeFreq": 0.027777778, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6875, + "altHomGenotypeFreq": 0.39583334, + "hetGenotypeFreq": 0.5833334, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.3125, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.58849555, + "altHomGenotypeFreq": 0.25663716, + "hetGenotypeFreq": 0.6637168, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.41150442, + "refHomGenotypeFreq": 0.07964602, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6813725, + "altHomGenotypeFreq": 0.4117647, + "hetGenotypeFreq": 0.5392157, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.31862745, + "refHomGenotypeFreq": 0.04901961, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.78571427, + "altHomGenotypeFreq": 0.5714286, + "hetGenotypeFreq": 0.42857143, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.21428572, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.67741936, + "altHomGenotypeFreq": 0.37634408, + "hetGenotypeFreq": 0.60215056, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.32258064, + "refHomGenotypeFreq": 0.021505376, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6212121, + "altHomGenotypeFreq": 0.25252524, + "hetGenotypeFreq": 0.7373737, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.37878788, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7242991, + "altHomGenotypeFreq": 0.47663552, + "hetGenotypeFreq": 0.49532712, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.27570093, + "refHomGenotypeFreq": 0.028037382, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6802326, + "altHomGenotypeFreq": 0.39534885, + "hetGenotypeFreq": 0.5697675, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.31976745, + "refHomGenotypeFreq": 0.034883723, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5677083, + "altHomGenotypeFreq": 0.20833333, + "hetGenotypeFreq": 0.71875, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.43229166, + "refHomGenotypeFreq": 0.072916664, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.63131315, + "altHomGenotypeFreq": 0.3131313, + "hetGenotypeFreq": 0.6363636, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.36868685, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5555556, + "altHomGenotypeFreq": 0.23232323, + "hetGenotypeFreq": 0.64646465, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.44444445, + "refHomGenotypeFreq": 0.121212125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.73061633, + "altHomGenotypeFreq": 0.47912526, + "hetGenotypeFreq": 0.5029821, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.2693837, + "refHomGenotypeFreq": 0.017892644, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6147541, + "altHomGenotypeFreq": 0.29508197, + "hetGenotypeFreq": 0.6393443, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.3852459, + "refHomGenotypeFreq": 0.06557377, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6628242, + "altHomGenotypeFreq": 0.39769453, + "hetGenotypeFreq": 0.5302594, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.3371758, + "refHomGenotypeFreq": 0.07204611, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5470588, + "altHomGenotypeFreq": 0.1764706, + "hetGenotypeFreq": 0.7411765, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.45294118, + "refHomGenotypeFreq": 0.08235294, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.66504854, + "altHomGenotypeFreq": 0.36893204, + "hetGenotypeFreq": 0.592233, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.33495146, + "refHomGenotypeFreq": 0.03883495, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.75252527, + "altHomGenotypeFreq": 0.53535354, + "hetGenotypeFreq": 0.43434343, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.24747474, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6775701, + "altHomGenotypeFreq": 0.37383178, + "hetGenotypeFreq": 0.60747665, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.3224299, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6682692, + "altHomGenotypeFreq": 0.375, + "hetGenotypeFreq": 0.58653843, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.33173078, + "refHomGenotypeFreq": 0.03846154, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7222222, + "altHomGenotypeFreq": 0.45454547, + "hetGenotypeFreq": 0.53535354, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.2777778, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.64117646, + "altHomGenotypeFreq": 0.3882353, + "hetGenotypeFreq": 0.5058824, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.35882354, + "refHomGenotypeFreq": 0.105882354, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.62400794, + "altHomGenotypeFreq": 0.30357143, + "hetGenotypeFreq": 0.640873, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.37599206, + "refHomGenotypeFreq": 0.055555556, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.55825245, + "altHomGenotypeFreq": 0.21359223, + "hetGenotypeFreq": 0.6893204, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.44174758, + "refHomGenotypeFreq": 0.097087376, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22547500, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22547500, + "id": "15:22547500:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 22547500, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.659999966621399, + "source": "gerp" + }, + { + "score": 0.008999999612569809, + "source": "phastCons" + }, + { + "score": -1.0329999923706055, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": -0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 1.8200000524520874, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4779226", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.47719288, + "altHomGenotypeFreq": 0.077769674, + "hetGenotypeFreq": 0.79884636, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5228071, + "refHomGenotypeFreq": 0.12338394, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46113446, + "altHomGenotypeFreq": 0.037815128, + "hetGenotypeFreq": 0.8466387, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.53886557, + "refHomGenotypeFreq": 0.11554622, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5190355, + "altHomGenotypeFreq": 0.14467005, + "hetGenotypeFreq": 0.74873096, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.48096448, + "refHomGenotypeFreq": 0.10659899, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4304878, + "altHomGenotypeFreq": 0.07560976, + "hetGenotypeFreq": 0.7097561, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.5695122, + "refHomGenotypeFreq": 0.21463415, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49333334, + "altHomGenotypeFreq": 0.093333334, + "hetGenotypeFreq": 0.8, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.50666666, + "refHomGenotypeFreq": 0.10666667, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4554715, + "altHomGenotypeFreq": 0.034924332, + "hetGenotypeFreq": 0.8410943, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.54452854, + "refHomGenotypeFreq": 0.12398137, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44655597, + "altHomGenotypeFreq": 0.046377607, + "hetGenotypeFreq": 0.80035675, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.553444, + "refHomGenotypeFreq": 0.15326564, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.53644484, + "altHomGenotypeFreq": 0.14060663, + "hetGenotypeFreq": 0.79167646, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.46355513, + "refHomGenotypeFreq": 0.067716904, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47866476, + "altHomGenotypeFreq": 0.08270406, + "hetGenotypeFreq": 0.7919214, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.52133524, + "refHomGenotypeFreq": 0.12537457, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4753709, + "altHomGenotypeFreq": 0.07166172, + "hetGenotypeFreq": 0.8074184, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.52462906, + "refHomGenotypeFreq": 0.12091988, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22547516, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22547516, + "id": "15:22547516:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22547516, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.8109999895095825, + "source": "gerp" + }, + { + "score": 0.010999999940395355, + "source": "phastCons" + }, + { + "score": 0.16300000250339508, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": -0.05000019073486328, + "source": "cadd_raw" + }, + { + "score": 2.180000066757202, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs11635936", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.4117647, + "altHomGenotypeFreq": 0.056658246, + "hetGenotypeFreq": 0.9014796, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.49260196, + "refHomGenotypeFreq": 0.041862145, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40753424, + "altHomGenotypeFreq": 0.05479452, + "hetGenotypeFreq": 0.9041096, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.49315068, + "refHomGenotypeFreq": 0.04109589, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44188598, + "altHomGenotypeFreq": 0.059210528, + "hetGenotypeFreq": 0.89692986, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.49232456, + "refHomGenotypeFreq": 0.04385965, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4019231, + "altHomGenotypeFreq": 0.10769231, + "hetGenotypeFreq": 0.8230769, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.48076922, + "refHomGenotypeFreq": 0.06923077, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39583334, + "altHomGenotypeFreq": 0.03125, + "hetGenotypeFreq": 0.8541667, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5416667, + "refHomGenotypeFreq": 0.114583336, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42217392, + "altHomGenotypeFreq": 0.07826087, + "hetGenotypeFreq": 0.8956522, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.47391304, + "refHomGenotypeFreq": 0.026086956, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44457623, + "altHomGenotypeFreq": 0.06361872, + "hetGenotypeFreq": 0.89583784, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.48846236, + "refHomGenotypeFreq": 0.040543456, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.290436, + "altHomGenotypeFreq": 0.008438818, + "hetGenotypeFreq": 0.943038, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.5200422, + "refHomGenotypeFreq": 0.048523206, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4069514, + "altHomGenotypeFreq": 0.053824365, + "hetGenotypeFreq": 0.9039006, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.49422532, + "refHomGenotypeFreq": 0.042275004, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41769603, + "altHomGenotypeFreq": 0.060150377, + "hetGenotypeFreq": 0.89849627, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.4906015, + "refHomGenotypeFreq": 0.041353382, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28657314, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7134268, + "study": "GONL" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29833376, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.70166624, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29854503, + "population": "TWINSUK_NODUP", + "refAllele": "A", + "refAlleleFreq": 0.701455, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29839128, + "population": "ALSPAC", + "refAllele": "A", + "refAlleleFreq": 0.7016087, + "study": "UK10K" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.298274, + "population": "TWINSUK", + "refAllele": "A", + "refAlleleFreq": 0.70172596, + "study": "UK10K" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22548797, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22548797, + "id": "15:22548797:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22548797, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.090000033378601, + "source": "gerp" + }, + { + "score": 0.1080000028014183, + "source": "phastCons" + }, + { + "score": 0.1940000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "downstream_gene_variant", + "functionalScore": [ + { + "score": 0.3599996566772461, + "source": "cadd_raw" + }, + { + "score": 6.289999961853027, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1817960", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.39938167, + "altHomGenotypeFreq": 0.062394604, + "hetGenotypeFreq": 0.67404443, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6005832, + "refHomGenotypeFreq": 0.26356098, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.47555557, + "altHomGenotypeFreq": 0.08222222, + "hetGenotypeFreq": 0.7866667, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.52444446, + "refHomGenotypeFreq": 0.13111112, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.36388507, + "altHomGenotypeFreq": 0.047879618, + "hetGenotypeFreq": 0.63201094, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6361149, + "refHomGenotypeFreq": 0.32010943, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42455244, + "altHomGenotypeFreq": 0.08439898, + "hetGenotypeFreq": 0.6803069, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.57544756, + "refHomGenotypeFreq": 0.23529412, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46153846, + "altHomGenotypeFreq": 0.04195804, + "hetGenotypeFreq": 0.83916086, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.53846157, + "refHomGenotypeFreq": 0.11888112, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49969077, + "altHomGenotypeFreq": 0.09894867, + "hetGenotypeFreq": 0.8014842, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.5003092, + "refHomGenotypeFreq": 0.0995671, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4913274, + "altHomGenotypeFreq": 0.085865825, + "hetGenotypeFreq": 0.8110665, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.5086009, + "refHomGenotypeFreq": 0.10306766, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.18769114, + "altHomGenotypeFreq": 0.0045871558, + "hetGenotypeFreq": 0.36620796, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.81230885, + "refHomGenotypeFreq": 0.62920487, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.39377943, + "altHomGenotypeFreq": 0.05966162, + "hetGenotypeFreq": 0.6682356, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.6062206, + "refHomGenotypeFreq": 0.27210277, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.40629414, + "altHomGenotypeFreq": 0.06576676, + "hetGenotypeFreq": 0.6812117, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.5936274, + "refHomGenotypeFreq": 0.2530215, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.46392787, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.53607213, + "study": "GONL" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22548816, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22548816, + "id": "15:22548816:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 22548816, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.07959999889135361, + "source": "gerp" + }, + { + "score": 0.6100000143051147, + "source": "phastCons" + }, + { + "score": 0.16300000250339508, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "downstream_gene_variant", + "functionalScore": [ + { + "score": 1.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 12.270000457763672, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs3901374", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.42459366, + "altHomGenotypeFreq": 0.064878955, + "hetGenotypeFreq": 0.7194294, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5754064, + "refHomGenotypeFreq": 0.21569166, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4764957, + "altHomGenotypeFreq": 0.07478633, + "hetGenotypeFreq": 0.8034188, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.52350426, + "refHomGenotypeFreq": 0.12179487, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4052835, + "altHomGenotypeFreq": 0.05025773, + "hetGenotypeFreq": 0.71005154, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5947165, + "refHomGenotypeFreq": 0.23969072, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4269802, + "altHomGenotypeFreq": 0.08415841, + "hetGenotypeFreq": 0.68564355, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5730198, + "refHomGenotypeFreq": 0.23019803, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4727891, + "altHomGenotypeFreq": 0.054421768, + "hetGenotypeFreq": 0.8367347, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5272109, + "refHomGenotypeFreq": 0.108843535, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49510103, + "altHomGenotypeFreq": 0.09369259, + "hetGenotypeFreq": 0.8028169, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.50489897, + "refHomGenotypeFreq": 0.10349051, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.49327415, + "altHomGenotypeFreq": 0.08847594, + "hetGenotypeFreq": 0.8095965, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.50672585, + "refHomGenotypeFreq": 0.10192761, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26534754, + "altHomGenotypeFreq": 0.009893456, + "hetGenotypeFreq": 0.5109082, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.73465246, + "refHomGenotypeFreq": 0.47919837, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.420628, + "altHomGenotypeFreq": 0.062181953, + "hetGenotypeFreq": 0.7168921, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.579372, + "refHomGenotypeFreq": 0.2209259, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4294911, + "altHomGenotypeFreq": 0.068209685, + "hetGenotypeFreq": 0.72256285, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5705089, + "refHomGenotypeFreq": 0.20922747, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22549284, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22549284, + "id": "15:22549284:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22549284, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.2699999809265137, + "source": "gerp" + }, + { + "score": 0.035999998450279236, + "source": "phastCons" + }, + { + "score": -1.0410000085830688, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "downstream_gene_variant", + "functionalScore": [ + { + "score": -0.11999988555908203, + "source": "cadd_raw" + }, + { + "score": 1.5800000429153442, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1845989", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.9602019, + "altHomGenotypeFreq": 0.9204685, + "hetGenotypeFreq": 0.07946677, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.039798096, + "refHomGenotypeFreq": 6.471235E-5, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97046846, + "altHomGenotypeFreq": 0.94093686, + "hetGenotypeFreq": 0.059063137, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.029531568, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9858025, + "altHomGenotypeFreq": 0.97283953, + "hetGenotypeFreq": 0.025925925, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.014197531, + "refHomGenotypeFreq": 0.001234568, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97482014, + "altHomGenotypeFreq": 0.9496403, + "hetGenotypeFreq": 0.05035971, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.025179856, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9768212, + "altHomGenotypeFreq": 0.95364237, + "hetGenotypeFreq": 0.046357617, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.023178808, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.99084145, + "altHomGenotypeFreq": 0.9816829, + "hetGenotypeFreq": 0.018317115, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.009158557, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9713924, + "altHomGenotypeFreq": 0.9427847, + "hetGenotypeFreq": 0.05721526, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.02860763, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9206038, + "altHomGenotypeFreq": 0.8412076, + "hetGenotypeFreq": 0.15879235, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.07939617, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9588215, + "altHomGenotypeFreq": 0.9177601, + "hetGenotypeFreq": 0.08212277, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.04117854, + "refHomGenotypeFreq": 1.1715089E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9619055, + "altHomGenotypeFreq": 0.9238109, + "hetGenotypeFreq": 0.0761891, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.03809455, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9789579, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.021042084, + "study": "GONL" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.984375, + "altHomGenotypeFreq": 0.96875, + "hetGenotypeFreq": 0.03125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9440895, + "altHomGenotypeFreq": 0.8881789, + "hetGenotypeFreq": 0.111821085, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.055910543, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8854806, + "altHomGenotypeFreq": 0.77096117, + "hetGenotypeFreq": 0.22903885, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.114519425, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9840425, + "altHomGenotypeFreq": 0.9680851, + "hetGenotypeFreq": 0.031914894, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.015957447, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.877451, + "altHomGenotypeFreq": 0.75490195, + "hetGenotypeFreq": 0.24509805, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.12254902, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9228442, + "altHomGenotypeFreq": 0.84568834, + "hetGenotypeFreq": 0.15431166, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.07715582, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96666664, + "altHomGenotypeFreq": 0.93333334, + "hetGenotypeFreq": 0.06666667, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.033333335, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9951923, + "altHomGenotypeFreq": 0.99038464, + "hetGenotypeFreq": 0.009615385, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.0048076925, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8981481, + "altHomGenotypeFreq": 0.7962963, + "hetGenotypeFreq": 0.2037037, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.10185185, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9114583, + "altHomGenotypeFreq": 0.8229167, + "hetGenotypeFreq": 0.17708334, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.088541664, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9159292, + "altHomGenotypeFreq": 0.8318584, + "hetGenotypeFreq": 0.1681416, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.084070794, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.877451, + "altHomGenotypeFreq": 0.75490195, + "hetGenotypeFreq": 0.24509805, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.12254902, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96703297, + "altHomGenotypeFreq": 0.93406594, + "hetGenotypeFreq": 0.06593407, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.032967035, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97849464, + "altHomGenotypeFreq": 0.9569892, + "hetGenotypeFreq": 0.043010753, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.021505376, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.95454544, + "altHomGenotypeFreq": 0.90909094, + "hetGenotypeFreq": 0.09090909, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.045454547, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.95327103, + "altHomGenotypeFreq": 0.90654206, + "hetGenotypeFreq": 0.09345794, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.046728972, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.872093, + "altHomGenotypeFreq": 0.74418604, + "hetGenotypeFreq": 0.25581396, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.12790698, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9270833, + "altHomGenotypeFreq": 0.8541667, + "hetGenotypeFreq": 0.14583333, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.072916664, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9141414, + "altHomGenotypeFreq": 0.82828283, + "hetGenotypeFreq": 0.17171717, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.08585858, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97979796, + "altHomGenotypeFreq": 0.959596, + "hetGenotypeFreq": 0.04040404, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.02020202, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9691849, + "altHomGenotypeFreq": 0.9383698, + "hetGenotypeFreq": 0.06163022, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.03081511, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91803277, + "altHomGenotypeFreq": 0.8360656, + "hetGenotypeFreq": 0.16393442, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.08196721, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.981268, + "altHomGenotypeFreq": 0.96253604, + "hetGenotypeFreq": 0.037463978, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.018731989, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90588236, + "altHomGenotypeFreq": 0.8117647, + "hetGenotypeFreq": 0.1882353, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.09411765, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88834953, + "altHomGenotypeFreq": 0.776699, + "hetGenotypeFreq": 0.22330096, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.11165048, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9626168, + "altHomGenotypeFreq": 0.92523366, + "hetGenotypeFreq": 0.07476635, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.037383176, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96153843, + "altHomGenotypeFreq": 0.9230769, + "hetGenotypeFreq": 0.07692308, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.03846154, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.969697, + "altHomGenotypeFreq": 0.93939394, + "hetGenotypeFreq": 0.060606062, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.030303031, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 1, + "altHomGenotypeFreq": 1, + "hetGenotypeFreq": 0, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9781746, + "altHomGenotypeFreq": 0.9563492, + "hetGenotypeFreq": 0.043650795, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.021825397, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9951456, + "altHomGenotypeFreq": 0.99029124, + "hetGenotypeFreq": 0.009708738, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.004854369, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96694, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.033060037, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9641858, + "population": "TWINSUK_NODUP", + "refAllele": "G", + "refAlleleFreq": 0.035814214, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.97016084, + "population": "ALSPAC", + "refAllele": "G", + "refAlleleFreq": 0.029839128, + "study": "UK10K" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96359223, + "population": "TWINSUK", + "refAllele": "G", + "refAlleleFreq": 0.03640777, + "study": "UK10K" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22550489, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22550489, + "id": "15:22550489:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 22550489, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "processed_pseudogene", + "ensemblGeneId": "ENSG00000259098", + "ensemblTranscriptId": "ENST00000553429", + "geneName": "RP11-603B24.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001632", + "name": "downstream_gene_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -2.180000066757202, + "source": "gerp" + }, + { + "score": 0.027000000700354576, + "source": "phastCons" + }, + { + "score": 0.16300000250339508, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "downstream_gene_variant", + "functionalScore": [ + { + "score": 0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 3.7100000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs8025848", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.4035239, + "altHomGenotypeFreq": 0.063788705, + "hetGenotypeFreq": 0.67947036, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5964761, + "refHomGenotypeFreq": 0.25674093, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.47463003, + "altHomGenotypeFreq": 0.08033827, + "hetGenotypeFreq": 0.7885835, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.52537, + "refHomGenotypeFreq": 0.13107823, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3650266, + "altHomGenotypeFreq": 0.04654255, + "hetGenotypeFreq": 0.6369681, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.6349734, + "refHomGenotypeFreq": 0.31648937, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42469135, + "altHomGenotypeFreq": 0.086419754, + "hetGenotypeFreq": 0.67654324, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.5753086, + "refHomGenotypeFreq": 0.23703703, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4652778, + "altHomGenotypeFreq": 0.048611112, + "hetGenotypeFreq": 0.8333333, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.5347222, + "refHomGenotypeFreq": 0.11805555, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49876392, + "altHomGenotypeFreq": 0.09826947, + "hetGenotypeFreq": 0.80098885, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.5012361, + "refHomGenotypeFreq": 0.100741655, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49119988, + "altHomGenotypeFreq": 0.08772175, + "hetGenotypeFreq": 0.8069563, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.5088001, + "refHomGenotypeFreq": 0.10532197, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2, + "altHomGenotypeFreq": 0.0058227847, + "hetGenotypeFreq": 0.38835442, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.8, + "refHomGenotypeFreq": 0.6058228, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39890233, + "altHomGenotypeFreq": 0.061743796, + "hetGenotypeFreq": 0.67431706, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.60109764, + "refHomGenotypeFreq": 0.26393914, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40923813, + "altHomGenotypeFreq": 0.06631709, + "hetGenotypeFreq": 0.6858421, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.5907619, + "refHomGenotypeFreq": 0.24784084, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.375, + "altHomGenotypeFreq": 0.078125, + "hetGenotypeFreq": 0.59375, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.625, + "refHomGenotypeFreq": 0.328125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34285143, + "altHomGenotypeFreq": 0.052715655, + "hetGenotypeFreq": 0.5802716, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.65714854, + "refHomGenotypeFreq": 0.36701277, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41615543, + "altHomGenotypeFreq": 0.059304703, + "hetGenotypeFreq": 0.7137014, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.5838446, + "refHomGenotypeFreq": 0.22699386, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.43085107, + "altHomGenotypeFreq": 0.095744684, + "hetGenotypeFreq": 0.67021275, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.56914896, + "refHomGenotypeFreq": 0.23404256, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42647058, + "altHomGenotypeFreq": 0.0882353, + "hetGenotypeFreq": 0.67647064, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.5735294, + "refHomGenotypeFreq": 0.23529412, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15582451, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31164902, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.8441755, + "refHomGenotypeFreq": 0.688351, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31904763, + "altHomGenotypeFreq": 0.01904762, + "hetGenotypeFreq": 0.6, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.68095237, + "refHomGenotypeFreq": 0.3809524, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27884614, + "altHomGenotypeFreq": 0.028846154, + "hetGenotypeFreq": 0.5, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.72115386, + "refHomGenotypeFreq": 0.47115386, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12962963, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.25925928, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.8703704, + "refHomGenotypeFreq": 0.7407407, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41145834, + "altHomGenotypeFreq": 0.0625, + "hetGenotypeFreq": 0.6979167, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.5885417, + "refHomGenotypeFreq": 0.23958333, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1460177, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2920354, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.8539823, + "refHomGenotypeFreq": 0.7079646, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3970588, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.754902, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.60294116, + "refHomGenotypeFreq": 0.2254902, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.50549453, + "altHomGenotypeFreq": 0.10989011, + "hetGenotypeFreq": 0.7912088, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.4945055, + "refHomGenotypeFreq": 0.0989011, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37096775, + "altHomGenotypeFreq": 0.021505376, + "hetGenotypeFreq": 0.6989248, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.62903225, + "refHomGenotypeFreq": 0.2795699, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37878788, + "altHomGenotypeFreq": 0.04040404, + "hetGenotypeFreq": 0.6767677, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.6212121, + "refHomGenotypeFreq": 0.28282827, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45327103, + "altHomGenotypeFreq": 0.10280374, + "hetGenotypeFreq": 0.7009346, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.54672897, + "refHomGenotypeFreq": 0.19626169, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.39534885, + "altHomGenotypeFreq": 0.046511628, + "hetGenotypeFreq": 0.6976744, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.60465115, + "refHomGenotypeFreq": 0.25581396, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.1875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.375, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.8125, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.121212125, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24242425, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.8787879, + "refHomGenotypeFreq": 0.75757575, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15151516, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3030303, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.8484849, + "refHomGenotypeFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4811133, + "altHomGenotypeFreq": 0.105367795, + "hetGenotypeFreq": 0.75149107, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.5188867, + "refHomGenotypeFreq": 0.14314115, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.22950819, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.45901638, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.7704918, + "refHomGenotypeFreq": 0.5409836, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42074928, + "altHomGenotypeFreq": 0.1037464, + "hetGenotypeFreq": 0.6340058, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.5792507, + "refHomGenotypeFreq": 0.26224783, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.15882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31764707, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.84117645, + "refHomGenotypeFreq": 0.68235296, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44660193, + "altHomGenotypeFreq": 0.0776699, + "hetGenotypeFreq": 0.7378641, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.5533981, + "refHomGenotypeFreq": 0.18446602, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.48989898, + "altHomGenotypeFreq": 0.16161616, + "hetGenotypeFreq": 0.65656567, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.510101, + "refHomGenotypeFreq": 0.18181819, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.46728972, + "altHomGenotypeFreq": 0.06542056, + "hetGenotypeFreq": 0.80373836, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.53271025, + "refHomGenotypeFreq": 0.13084112, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41826922, + "altHomGenotypeFreq": 0.07692308, + "hetGenotypeFreq": 0.6826923, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.5817308, + "refHomGenotypeFreq": 0.24038461, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4949495, + "altHomGenotypeFreq": 0.09090909, + "hetGenotypeFreq": 0.8080808, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.5050505, + "refHomGenotypeFreq": 0.1010101, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44705883, + "altHomGenotypeFreq": 0.16470589, + "hetGenotypeFreq": 0.5647059, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.5529412, + "refHomGenotypeFreq": 0.27058825, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32539684, + "altHomGenotypeFreq": 0.027777778, + "hetGenotypeFreq": 0.5952381, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.67460316, + "refHomGenotypeFreq": 0.37698412, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28640777, + "altHomGenotypeFreq": 0.029126214, + "hetGenotypeFreq": 0.5145631, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.71359223, + "refHomGenotypeFreq": 0.4563107, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22551080, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22551080, + "id": "15:22551080:T:A", + "length": 1, + "names": [], + "reference": "T", + "start": 22551080, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.4309999942779541, + "source": "gerp" + }, + { + "score": 0.012000000104308128, + "source": "phastCons" + }, + { + "score": -1.2359999418258667, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": -0.010000228881835938, + "source": "cadd_raw" + }, + { + "score": 2.5199999809265137, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4779403", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.68698025, + "altHomGenotypeFreq": 0.3841606, + "hetGenotypeFreq": 0.6056393, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.31301975, + "refHomGenotypeFreq": 0.010200104, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.70696723, + "altHomGenotypeFreq": 0.42418033, + "hetGenotypeFreq": 0.56557375, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.2930328, + "refHomGenotypeFreq": 0.0102459015, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.65336657, + "altHomGenotypeFreq": 0.33665836, + "hetGenotypeFreq": 0.6334165, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.3466334, + "refHomGenotypeFreq": 0.029925186, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.66306955, + "altHomGenotypeFreq": 0.35971224, + "hetGenotypeFreq": 0.6067146, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.33693045, + "refHomGenotypeFreq": 0.033573143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.73, + "altHomGenotypeFreq": 0.46, + "hetGenotypeFreq": 0.54, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.27, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.74126077, + "altHomGenotypeFreq": 0.48424068, + "hetGenotypeFreq": 0.5140401, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.25873926, + "refHomGenotypeFreq": 0.0017191977, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7089791, + "altHomGenotypeFreq": 0.42330304, + "hetGenotypeFreq": 0.57135224, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.29102084, + "refHomGenotypeFreq": 0.0053447355, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6315606, + "altHomGenotypeFreq": 0.27960986, + "hetGenotypeFreq": 0.7039015, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.36843938, + "refHomGenotypeFreq": 0.016488621, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6902046, + "altHomGenotypeFreq": 0.39299154, + "hetGenotypeFreq": 0.59442616, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.30979538, + "refHomGenotypeFreq": 0.012582314, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.68299943, + "altHomGenotypeFreq": 0.37325785, + "hetGenotypeFreq": 0.6194832, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.31700057, + "refHomGenotypeFreq": 0.007259001, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6484375, + "altHomGenotypeFreq": 0.328125, + "hetGenotypeFreq": 0.640625, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.3515625, + "refHomGenotypeFreq": 0.03125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6876997, + "altHomGenotypeFreq": 0.4069489, + "hetGenotypeFreq": 0.5615016, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.31230032, + "refHomGenotypeFreq": 0.03154952, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7137014, + "altHomGenotypeFreq": 0.4417178, + "hetGenotypeFreq": 0.54396725, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.28629857, + "refHomGenotypeFreq": 0.014314928, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.69148934, + "altHomGenotypeFreq": 0.41489363, + "hetGenotypeFreq": 0.5531915, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.30851063, + "refHomGenotypeFreq": 0.031914894, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7058824, + "altHomGenotypeFreq": 0.43137255, + "hetGenotypeFreq": 0.54901963, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.29411766, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6580938, + "altHomGenotypeFreq": 0.35098335, + "hetGenotypeFreq": 0.61422086, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.3419062, + "refHomGenotypeFreq": 0.034795765, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.60952383, + "altHomGenotypeFreq": 0.26666668, + "hetGenotypeFreq": 0.6857143, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.3904762, + "refHomGenotypeFreq": 0.04761905, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6682692, + "altHomGenotypeFreq": 0.41346154, + "hetGenotypeFreq": 0.5096154, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.33173078, + "refHomGenotypeFreq": 0.07692308, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6296296, + "altHomGenotypeFreq": 0.30555555, + "hetGenotypeFreq": 0.6481482, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.37037036, + "refHomGenotypeFreq": 0.046296295, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7239583, + "altHomGenotypeFreq": 0.45833334, + "hetGenotypeFreq": 0.53125, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.27604166, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6637168, + "altHomGenotypeFreq": 0.37168142, + "hetGenotypeFreq": 0.5840708, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.33628318, + "refHomGenotypeFreq": 0.044247787, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7254902, + "altHomGenotypeFreq": 0.47058824, + "hetGenotypeFreq": 0.50980395, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.27450982, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7912088, + "altHomGenotypeFreq": 0.5934066, + "hetGenotypeFreq": 0.3956044, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.20879121, + "refHomGenotypeFreq": 0.010989011, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.68817204, + "altHomGenotypeFreq": 0.40860215, + "hetGenotypeFreq": 0.5591398, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.31182796, + "refHomGenotypeFreq": 0.032258064, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6666667, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.56565654, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.33333334, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.74766356, + "altHomGenotypeFreq": 0.5140187, + "hetGenotypeFreq": 0.46728972, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.25233644, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7209302, + "altHomGenotypeFreq": 0.45348838, + "hetGenotypeFreq": 0.53488374, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.27906978, + "refHomGenotypeFreq": 0.011627907, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6614583, + "altHomGenotypeFreq": 0.34375, + "hetGenotypeFreq": 0.6354166, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.33854166, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6969697, + "altHomGenotypeFreq": 0.42424244, + "hetGenotypeFreq": 0.54545456, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.3030303, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6818182, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.5959596, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.3181818, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7435388, + "altHomGenotypeFreq": 0.49900597, + "hetGenotypeFreq": 0.4890656, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.25646123, + "refHomGenotypeFreq": 0.01192843, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6639344, + "altHomGenotypeFreq": 0.36065573, + "hetGenotypeFreq": 0.60655737, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.33606556, + "refHomGenotypeFreq": 0.032786883, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6930836, + "altHomGenotypeFreq": 0.42363113, + "hetGenotypeFreq": 0.5389049, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.30691642, + "refHomGenotypeFreq": 0.037463978, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.60588235, + "altHomGenotypeFreq": 0.25882354, + "hetGenotypeFreq": 0.69411767, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.39411765, + "refHomGenotypeFreq": 0.047058824, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.69417477, + "altHomGenotypeFreq": 0.39805827, + "hetGenotypeFreq": 0.592233, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.30582523, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.75757575, + "altHomGenotypeFreq": 0.5151515, + "hetGenotypeFreq": 0.48484847, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.24242425, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6869159, + "altHomGenotypeFreq": 0.39252338, + "hetGenotypeFreq": 0.58878505, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.31308413, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7067308, + "altHomGenotypeFreq": 0.42307693, + "hetGenotypeFreq": 0.5673077, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.29326922, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.74242425, + "altHomGenotypeFreq": 0.4949495, + "hetGenotypeFreq": 0.4949495, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.25757575, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7117647, + "altHomGenotypeFreq": 0.5058824, + "hetGenotypeFreq": 0.4117647, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.2882353, + "refHomGenotypeFreq": 0.08235294, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6418651, + "altHomGenotypeFreq": 0.34325397, + "hetGenotypeFreq": 0.5972222, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.35813493, + "refHomGenotypeFreq": 0.05952381, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5825243, + "altHomGenotypeFreq": 0.2524272, + "hetGenotypeFreq": 0.66019416, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.41747573, + "refHomGenotypeFreq": 0.08737864, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22562432, + "id": "10247", + "percentageMatch": 0.958638, + "source": "genomicSuperDup", + "start": 22539899 + } + ], + "start": 22561919, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22561919, + "id": "15:22561919:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 22561919, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258732", + "ensemblTranscriptId": "ENST00000556034", + "geneName": "RP11-603B24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -2.7699999809265137, + "source": "gerp" + }, + { + "score": 0.004000000189989805, + "source": "phastCons" + }, + { + "score": -3.8489999771118164, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.8199996948242188, + "source": "cadd_raw" + }, + { + "score": 0.03999999910593033, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4779234", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.6488966, + "altHomGenotypeFreq": 0.31398538, + "hetGenotypeFreq": 0.6698224, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.35110343, + "refHomGenotypeFreq": 0.016192216, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6919918, + "altHomGenotypeFreq": 0.3963039, + "hetGenotypeFreq": 0.59137577, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.30800822, + "refHomGenotypeFreq": 0.0123203285, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6239103, + "altHomGenotypeFreq": 0.27521792, + "hetGenotypeFreq": 0.69738483, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.37608966, + "refHomGenotypeFreq": 0.02739726, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.65311, + "altHomGenotypeFreq": 0.34449762, + "hetGenotypeFreq": 0.6172249, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.34688994, + "refHomGenotypeFreq": 0.03827751, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6986755, + "altHomGenotypeFreq": 0.397351, + "hetGenotypeFreq": 0.60264903, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.30132452, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7036186, + "altHomGenotypeFreq": 0.40953475, + "hetGenotypeFreq": 0.5881677, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.29638138, + "refHomGenotypeFreq": 0.0022975302, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.68412954, + "altHomGenotypeFreq": 0.37428075, + "hetGenotypeFreq": 0.6196976, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.31587046, + "refHomGenotypeFreq": 0.006021678, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5619844, + "altHomGenotypeFreq": 0.16049965, + "hetGenotypeFreq": 0.8029696, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.43801555, + "refHomGenotypeFreq": 0.036530755, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6510817, + "altHomGenotypeFreq": 0.3181227, + "hetGenotypeFreq": 0.66591793, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.34891832, + "refHomGenotypeFreq": 0.015959334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.64620095, + "altHomGenotypeFreq": 0.30888143, + "hetGenotypeFreq": 0.67463905, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.35379905, + "refHomGenotypeFreq": 0.01647951, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6328125, + "altHomGenotypeFreq": 0.296875, + "hetGenotypeFreq": 0.671875, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.3671875, + "refHomGenotypeFreq": 0.03125, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6523562, + "altHomGenotypeFreq": 0.3474441, + "hetGenotypeFreq": 0.6098243, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.34764376, + "refHomGenotypeFreq": 0.042731628, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7464213, + "altHomGenotypeFreq": 0.5030675, + "hetGenotypeFreq": 0.48670757, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.25357872, + "refHomGenotypeFreq": 0.010224949, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.69148934, + "altHomGenotypeFreq": 0.40425533, + "hetGenotypeFreq": 0.5744681, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.30851063, + "refHomGenotypeFreq": 0.021276595, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7352941, + "altHomGenotypeFreq": 0.48039216, + "hetGenotypeFreq": 0.50980395, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.2647059, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5438729, + "altHomGenotypeFreq": 0.17549168, + "hetGenotypeFreq": 0.7367625, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.45612708, + "refHomGenotypeFreq": 0.08774584, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6142857, + "altHomGenotypeFreq": 0.25714287, + "hetGenotypeFreq": 0.71428573, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.3857143, + "refHomGenotypeFreq": 0.028571429, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.63461536, + "altHomGenotypeFreq": 0.34615386, + "hetGenotypeFreq": 0.5769231, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.3653846, + "refHomGenotypeFreq": 0.07692308, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5138889, + "altHomGenotypeFreq": 0.1388889, + "hetGenotypeFreq": 0.75, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.4861111, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7239583, + "altHomGenotypeFreq": 0.45833334, + "hetGenotypeFreq": 0.53125, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.27604166, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49557522, + "altHomGenotypeFreq": 0.10619469, + "hetGenotypeFreq": 0.778761, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.50442475, + "refHomGenotypeFreq": 0.11504425, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7647059, + "altHomGenotypeFreq": 0.54901963, + "hetGenotypeFreq": 0.43137258, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.23529412, + "refHomGenotypeFreq": 0.019607844, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.75274724, + "altHomGenotypeFreq": 0.50549453, + "hetGenotypeFreq": 0.49450552, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.24725275, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67741936, + "altHomGenotypeFreq": 0.38709676, + "hetGenotypeFreq": 0.58064514, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.32258064, + "refHomGenotypeFreq": 0.032258064, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67676765, + "altHomGenotypeFreq": 0.3838384, + "hetGenotypeFreq": 0.5858586, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.32323232, + "refHomGenotypeFreq": 0.030303031, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7196262, + "altHomGenotypeFreq": 0.45794392, + "hetGenotypeFreq": 0.5233645, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.28037384, + "refHomGenotypeFreq": 0.018691588, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.76744187, + "altHomGenotypeFreq": 0.53488374, + "hetGenotypeFreq": 0.4651163, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.23255815, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.546875, + "altHomGenotypeFreq": 0.17708333, + "hetGenotypeFreq": 0.7395834, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.453125, + "refHomGenotypeFreq": 0.083333336, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.510101, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.75757575, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.48989898, + "refHomGenotypeFreq": 0.11111111, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6010101, + "altHomGenotypeFreq": 0.26262626, + "hetGenotypeFreq": 0.6767677, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.3989899, + "refHomGenotypeFreq": 0.060606062, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7137177, + "altHomGenotypeFreq": 0.43538767, + "hetGenotypeFreq": 0.55666006, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.2862823, + "refHomGenotypeFreq": 0.007952286, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6147541, + "altHomGenotypeFreq": 0.27868852, + "hetGenotypeFreq": 0.6721312, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.3852459, + "refHomGenotypeFreq": 0.04918033, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.67146975, + "altHomGenotypeFreq": 0.38040346, + "hetGenotypeFreq": 0.5821326, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.32853025, + "refHomGenotypeFreq": 0.037463978, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5647059, + "altHomGenotypeFreq": 0.1882353, + "hetGenotypeFreq": 0.7529412, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.43529412, + "refHomGenotypeFreq": 0.05882353, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.74271846, + "altHomGenotypeFreq": 0.49514562, + "hetGenotypeFreq": 0.49514562, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.25728154, + "refHomGenotypeFreq": 0.009708738, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7020202, + "altHomGenotypeFreq": 0.4040404, + "hetGenotypeFreq": 0.59595954, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.2979798, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6775701, + "altHomGenotypeFreq": 0.36448598, + "hetGenotypeFreq": 0.62616825, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.3224299, + "refHomGenotypeFreq": 0.009345794, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.6682692, + "altHomGenotypeFreq": 0.35576922, + "hetGenotypeFreq": 0.625, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.33173078, + "refHomGenotypeFreq": 0.01923077, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7222222, + "altHomGenotypeFreq": 0.45454547, + "hetGenotypeFreq": 0.53535354, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.2777778, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.68235296, + "altHomGenotypeFreq": 0.44705883, + "hetGenotypeFreq": 0.47058827, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.31764707, + "refHomGenotypeFreq": 0.08235294, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.62896824, + "altHomGenotypeFreq": 0.31150794, + "hetGenotypeFreq": 0.6349206, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.37103173, + "refHomGenotypeFreq": 0.05357143, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5485437, + "altHomGenotypeFreq": 0.19417475, + "hetGenotypeFreq": 0.70873785, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.4514563, + "refHomGenotypeFreq": 0.097087376, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22569486, + "id": "9051", + "percentageMatch": 0.962504, + "source": "genomicSuperDup", + "start": 22563506 + } + ], + "start": 22566619, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22566619, + "id": "15:22566619:A:T", + "length": 1, + "names": [], + "reference": "A", + "start": 22566619, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258732", + "ensemblTranscriptId": "ENST00000556034", + "geneName": "RP11-603B24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.4339999854564667, + "source": "gerp" + }, + { + "score": 0.37599998712539673, + "source": "phastCons" + }, + { + "score": 0.14499999582767487, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.6000003814697266, + "source": "cadd_raw" + }, + { + "score": 8.199999809265137, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs7403787", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.13954787, + "altHomGenotypeFreq": 4.884175E-4, + "hetGenotypeFreq": 0.2781189, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8604521, + "refHomGenotypeFreq": 0.7213927, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13907285, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2781457, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.86092716, + "refHomGenotypeFreq": 0.7218543, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08616188, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17232376, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.91383815, + "refHomGenotypeFreq": 0.82767624, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.082706764, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16541353, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.91729325, + "refHomGenotypeFreq": 0.83458644, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14685315, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2937063, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.85314685, + "refHomGenotypeFreq": 0.7062937, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11197754, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22395508, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.8880225, + "refHomGenotypeFreq": 0.7760449, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14318508, + "altHomGenotypeFreq": 5.738881E-4, + "hetGenotypeFreq": 0.28522238, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.8568149, + "refHomGenotypeFreq": 0.7142037, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15995498, + "altHomGenotypeFreq": 7.503752E-4, + "hetGenotypeFreq": 0.3184092, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.84004503, + "refHomGenotypeFreq": 0.68084043, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13518472, + "altHomGenotypeFreq": 5.060729E-4, + "hetGenotypeFreq": 0.2693573, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.8648153, + "refHomGenotypeFreq": 0.73013663, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14491288, + "altHomGenotypeFreq": 4.6670815E-4, + "hetGenotypeFreq": 0.28889236, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.8550871, + "refHomGenotypeFreq": 0.71064097, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0390625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.078125, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.9609375, + "refHomGenotypeFreq": 0.921875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.13598242, + "altHomGenotypeFreq": 0.0019968052, + "hetGenotypeFreq": 0.26797125, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.86401755, + "refHomGenotypeFreq": 0.73003197, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09202454, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.18404907, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.90797544, + "refHomGenotypeFreq": 0.81595093, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11702128, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23404256, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.88297874, + "refHomGenotypeFreq": 0.7659575, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.068627454, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.13725491, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.9313725, + "refHomGenotypeFreq": 0.8627451, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.19062027, + "altHomGenotypeFreq": 0.006051437, + "hetGenotypeFreq": 0.36913764, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.80937976, + "refHomGenotypeFreq": 0.6248109, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12857144, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.25714287, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.87142855, + "refHomGenotypeFreq": 0.74285716, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.125, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.9375, + "refHomGenotypeFreq": 0.875, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1712963, + "altHomGenotypeFreq": 0.009259259, + "hetGenotypeFreq": 0.3240741, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.8287037, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.072916664, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.14583333, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.9270833, + "refHomGenotypeFreq": 0.8541667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16814159, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3362832, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.8318584, + "refHomGenotypeFreq": 0.6637168, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.09803922, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.19607843, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.9019608, + "refHomGenotypeFreq": 0.8039216, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16483517, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.32967034, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.83516484, + "refHomGenotypeFreq": 0.6703297, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18817204, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.37634408, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.81182796, + "refHomGenotypeFreq": 0.6236559, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15656565, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.2929293, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.84343433, + "refHomGenotypeFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1495327, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2990654, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.85046726, + "refHomGenotypeFreq": 0.7009346, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.10465116, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.20930232, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.89534885, + "refHomGenotypeFreq": 0.7906977, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22916667, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.4375, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.7708333, + "refHomGenotypeFreq": 0.5520833, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1969697, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.3737374, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.8030303, + "refHomGenotypeFreq": 0.61616164, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22727273, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.43434346, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.77272725, + "refHomGenotypeFreq": 0.5555556, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1610338, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3220676, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.8389662, + "refHomGenotypeFreq": 0.6779324, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1557377, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3114754, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.8442623, + "refHomGenotypeFreq": 0.6885246, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.076368876, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.15273775, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.92363113, + "refHomGenotypeFreq": 0.84726226, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3529412, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.8235294, + "refHomGenotypeFreq": 0.64705884, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.116504855, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23300973, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.88349515, + "refHomGenotypeFreq": 0.7669903, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.15151516, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3030303, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.8484849, + "refHomGenotypeFreq": 0.6969697, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1542056, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.30841124, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.8457944, + "refHomGenotypeFreq": 0.69158876, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.120192304, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24038462, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.8798077, + "refHomGenotypeFreq": 0.75961536, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18686868, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3737374, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.81313133, + "refHomGenotypeFreq": 0.6262626, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.005882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.011764706, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.9941176, + "refHomGenotypeFreq": 0.9882353, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12301587, + "altHomGenotypeFreq": 0.001984127, + "hetGenotypeFreq": 0.24206349, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.8769841, + "refHomGenotypeFreq": 0.75595236, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.08737864, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17475729, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.9126214, + "refHomGenotypeFreq": 0.8252427, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.12546816, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.25093633, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.8745318, + "refHomGenotypeFreq": 0.7490637, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22569486, + "id": "9051", + "percentageMatch": 0.962504, + "source": "genomicSuperDup", + "start": 22563506 + } + ], + "start": 22566750, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22566750, + "id": "15:22566750:A:C", + "length": 1, + "names": [], + "reference": "A", + "start": 22566750, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258732", + "ensemblTranscriptId": "ENST00000556034", + "geneName": "RP11-603B24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.42899999022483826, + "source": "gerp" + }, + { + "score": 0.00800000037997961, + "source": "phastCons" + }, + { + "score": -1.9049999713897705, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.18000030517578125, + "source": "cadd_raw" + }, + { + "score": 1.2100000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556034(ENSG00000258732):n.304+39A>G" + ], + "id": "rs1826883", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.36311707, + "altHomGenotypeFreq": 0.03274943, + "hetGenotypeFreq": 0.6607353, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.6368829, + "refHomGenotypeFreq": 0.30651528, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39978448, + "altHomGenotypeFreq": 0.036637932, + "hetGenotypeFreq": 0.7262931, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.6002155, + "refHomGenotypeFreq": 0.23706897, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3939394, + "altHomGenotypeFreq": 0.03557312, + "hetGenotypeFreq": 0.71673256, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6060606, + "refHomGenotypeFreq": 0.24769433, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33291456, + "altHomGenotypeFreq": 0.030150754, + "hetGenotypeFreq": 0.60552764, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6670854, + "refHomGenotypeFreq": 0.36432162, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41549295, + "altHomGenotypeFreq": 0.049295776, + "hetGenotypeFreq": 0.73239434, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.58450705, + "refHomGenotypeFreq": 0.21830986, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40591073, + "altHomGenotypeFreq": 0.046441495, + "hetGenotypeFreq": 0.71893847, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.59408927, + "refHomGenotypeFreq": 0.23462002, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37804878, + "altHomGenotypeFreq": 0.039334554, + "hetGenotypeFreq": 0.6774284, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.6219512, + "refHomGenotypeFreq": 0.28323698, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3089845, + "altHomGenotypeFreq": 0.013743956, + "hetGenotypeFreq": 0.59048104, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.69101554, + "refHomGenotypeFreq": 0.39577502, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36565948, + "altHomGenotypeFreq": 0.035356067, + "hetGenotypeFreq": 0.6606068, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.6343405, + "refHomGenotypeFreq": 0.30403712, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35998145, + "altHomGenotypeFreq": 0.02953456, + "hetGenotypeFreq": 0.6608938, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.6400186, + "refHomGenotypeFreq": 0.30957168, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35955057, + "altHomGenotypeFreq": 0.033707865, + "hetGenotypeFreq": 0.6516854, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.64044946, + "refHomGenotypeFreq": 0.31460676, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22569486, + "id": "9051", + "percentageMatch": 0.962504, + "source": "genomicSuperDup", + "start": 22563506 + } + ], + "start": 22567264, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22567264, + "id": "15:22567264:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 22567264, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258732", + "ensemblTranscriptId": "ENST00000556034", + "geneName": "RP11-603B24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.7599999904632568, + "source": "gerp" + }, + { + "score": 0.4729999899864197, + "source": "phastCons" + }, + { + "score": 0.17299999296665192, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.9700002670288086, + "source": "cadd_raw" + }, + { + "score": 10.510000228881836, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556034(ENSG00000258732):n.304+140G>A" + ], + "id": "rs4278706", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.102343425, + "altHomGenotypeFreq": 2.7651043E-4, + "hetGenotypeFreq": 0.20413384, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.89765656, + "refHomGenotypeFreq": 0.7955897, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.11648352, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.23296703, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.8835165, + "refHomGenotypeFreq": 0.767033, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.08692811, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.17385621, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.9130719, + "refHomGenotypeFreq": 0.8261438, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0730198, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1460396, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.9269802, + "refHomGenotypeFreq": 0.8539604, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.114583336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22916667, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8854167, + "refHomGenotypeFreq": 0.7708333, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10545678, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21091355, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.89454323, + "refHomGenotypeFreq": 0.78908646, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12598822, + "altHomGenotypeFreq": 4.3122037E-4, + "hetGenotypeFreq": 0.25111398, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.8740118, + "refHomGenotypeFreq": 0.7484548, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.06484185, + "altHomGenotypeFreq": 2.43309E-4, + "hetGenotypeFreq": 0.12919708, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.93515813, + "refHomGenotypeFreq": 0.87055963, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0988778, + "altHomGenotypeFreq": 3.7406484E-4, + "hetGenotypeFreq": 0.19700748, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.9011222, + "refHomGenotypeFreq": 0.80261844, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.10665529, + "altHomGenotypeFreq": 1.5513497E-4, + "hetGenotypeFreq": 0.21300031, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.8933447, + "refHomGenotypeFreq": 0.78684455, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13827655, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8617234, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.014981274, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.029962547, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.98501873, + "refHomGenotypeFreq": 0.97003746, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22569486, + "id": "9051", + "percentageMatch": 0.962504, + "source": "genomicSuperDup", + "start": 22563506 + } + ], + "start": 22567365, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22567365, + "id": "15:22567365:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 22567365, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258732", + "ensemblTranscriptId": "ENST00000556034", + "geneName": "RP11-603B24.1", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.0544000007212162, + "source": "gerp" + }, + { + "score": 0.6600000262260437, + "source": "phastCons" + }, + { + "score": 0.14499999582767487, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": 1.2899999618530273, + "source": "cadd_raw" + }, + { + "score": 12.25, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs6602959", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.47271487, + "altHomGenotypeFreq": 0.09529331, + "hetGenotypeFreq": 0.7548431, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.52728516, + "refHomGenotypeFreq": 0.14986357, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49261603, + "altHomGenotypeFreq": 0.10548523, + "hetGenotypeFreq": 0.7742616, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.50738394, + "refHomGenotypeFreq": 0.12025317, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4072633, + "altHomGenotypeFreq": 0.050583657, + "hetGenotypeFreq": 0.7133593, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5927367, + "refHomGenotypeFreq": 0.23605707, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4516129, + "altHomGenotypeFreq": 0.11414392, + "hetGenotypeFreq": 0.67493796, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.5483871, + "refHomGenotypeFreq": 0.21091811, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48979592, + "altHomGenotypeFreq": 0.10204082, + "hetGenotypeFreq": 0.7755102, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.5102041, + "refHomGenotypeFreq": 0.12244898, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5120296, + "altHomGenotypeFreq": 0.12646514, + "hetGenotypeFreq": 0.77112895, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.48797038, + "refHomGenotypeFreq": 0.10240592, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5129673, + "altHomGenotypeFreq": 0.122775555, + "hetGenotypeFreq": 0.7803835, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.48703268, + "refHomGenotypeFreq": 0.09684094, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.39549437, + "altHomGenotypeFreq": 0.03804756, + "hetGenotypeFreq": 0.71489364, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.60450566, + "refHomGenotypeFreq": 0.24705882, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46762857, + "altHomGenotypeFreq": 0.09076335, + "hetGenotypeFreq": 0.7537304, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.53237146, + "refHomGenotypeFreq": 0.15550622, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47901085, + "altHomGenotypeFreq": 0.10090063, + "hetGenotypeFreq": 0.7562204, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.5209892, + "refHomGenotypeFreq": 0.14287895, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22578582, + "id": "11082", + "percentageMatch": 0.972189, + "source": "genomicSuperDup", + "start": 22567545 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22578582, + "id": "11081", + "percentageMatch": 0.972372, + "source": "genomicSuperDup", + "start": 22567545 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22578582, + "id": "9052", + "percentageMatch": 0.967235, + "source": "genomicSuperDup", + "start": 22569605 + } + ], + "start": 22570980, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22570980, + "id": "15:22570980:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 22570980, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.1399999856948853, + "source": "gerp" + }, + { + "score": 0.05700000002980232, + "source": "phastCons" + }, + { + "score": -2.0869998931884766, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intergenic_variant", + "functionalScore": [ + { + "score": 0.010000228881835938, + "source": "cadd_raw" + }, + { + "score": 2.7200000286102295, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1826886", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.92547005, + "altHomGenotypeFreq": 0.85119855, + "hetGenotypeFreq": 0.148543, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.074529946, + "refHomGenotypeFreq": 2.58448E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96639514, + "altHomGenotypeFreq": 0.9327902, + "hetGenotypeFreq": 0.06720977, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.033604886, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.98458695, + "altHomGenotypeFreq": 0.9704069, + "hetGenotypeFreq": 0.02836005, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.01541307, + "refHomGenotypeFreq": 0.0012330456, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9642005, + "altHomGenotypeFreq": 0.92840093, + "hetGenotypeFreq": 0.071599044, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.035799522, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9768212, + "altHomGenotypeFreq": 0.95364237, + "hetGenotypeFreq": 0.046357617, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.023178808, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9905552, + "altHomGenotypeFreq": 0.98111045, + "hetGenotypeFreq": 0.018889524, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.009444762, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.970553, + "altHomGenotypeFreq": 0.9411059, + "hetGenotypeFreq": 0.05889407, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.029447036, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.80048245, + "altHomGenotypeFreq": 0.60165405, + "hetGenotypeFreq": 0.3976568, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.19951758, + "refHomGenotypeFreq": 6.8917987E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9232433, + "altHomGenotypeFreq": 0.84672046, + "hetGenotypeFreq": 0.15304571, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.07675669, + "refHomGenotypeFreq": 2.3383608E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9282207, + "altHomGenotypeFreq": 0.8567302, + "hetGenotypeFreq": 0.14298093, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.07177932, + "refHomGenotypeFreq": 2.8885037E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97795594, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.022044089, + "study": "GONL" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9765625, + "altHomGenotypeFreq": 0.953125, + "hetGenotypeFreq": 0.046875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.0234375, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.913139, + "altHomGenotypeFreq": 0.827476, + "hetGenotypeFreq": 0.17132588, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.08686102, + "refHomGenotypeFreq": 0.001198083, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.88445807, + "altHomGenotypeFreq": 0.77096117, + "hetGenotypeFreq": 0.22699386, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.11554192, + "refHomGenotypeFreq": 0.0020449897, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96276593, + "altHomGenotypeFreq": 0.9361702, + "hetGenotypeFreq": 0.053191487, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.03723404, + "refHomGenotypeFreq": 0.010638298, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.877451, + "altHomGenotypeFreq": 0.75490195, + "hetGenotypeFreq": 0.24509805, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.12254902, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.81467474, + "altHomGenotypeFreq": 0.63086236, + "hetGenotypeFreq": 0.36762482, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.18532526, + "refHomGenotypeFreq": 0.0015128592, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.96666664, + "altHomGenotypeFreq": 0.93333334, + "hetGenotypeFreq": 0.06666667, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.033333335, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9951923, + "altHomGenotypeFreq": 0.99038464, + "hetGenotypeFreq": 0.009615385, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.0048076925, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8009259, + "altHomGenotypeFreq": 0.6018519, + "hetGenotypeFreq": 0.39814815, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.19907407, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9114583, + "altHomGenotypeFreq": 0.8229167, + "hetGenotypeFreq": 0.17708334, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.088541664, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8097345, + "altHomGenotypeFreq": 0.61946905, + "hetGenotypeFreq": 0.38053095, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.19026549, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8627451, + "altHomGenotypeFreq": 0.7352941, + "hetGenotypeFreq": 0.25490198, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.13725491, + "refHomGenotypeFreq": 0.009803922, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97252744, + "altHomGenotypeFreq": 0.94505495, + "hetGenotypeFreq": 0.054945055, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.027472528, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97849464, + "altHomGenotypeFreq": 0.9569892, + "hetGenotypeFreq": 0.043010753, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.021505376, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.94949496, + "altHomGenotypeFreq": 0.8989899, + "hetGenotypeFreq": 0.1010101, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.05050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.95327103, + "altHomGenotypeFreq": 0.90654206, + "hetGenotypeFreq": 0.09345794, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.046728972, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.872093, + "altHomGenotypeFreq": 0.74418604, + "hetGenotypeFreq": 0.25581396, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.12790698, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.796875, + "altHomGenotypeFreq": 0.59375, + "hetGenotypeFreq": 0.40625, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.203125, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.82323235, + "altHomGenotypeFreq": 0.64646465, + "hetGenotypeFreq": 0.35353535, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.17676768, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8484849, + "altHomGenotypeFreq": 0.7070707, + "hetGenotypeFreq": 0.28282827, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.15151516, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9691849, + "altHomGenotypeFreq": 0.9383698, + "hetGenotypeFreq": 0.06163022, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.03081511, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.8360656, + "altHomGenotypeFreq": 0.6721311, + "hetGenotypeFreq": 0.32786885, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.16393442, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9668588, + "altHomGenotypeFreq": 0.93659943, + "hetGenotypeFreq": 0.060518734, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.03314121, + "refHomGenotypeFreq": 0.0028818443, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.7941176, + "altHomGenotypeFreq": 0.5882353, + "hetGenotypeFreq": 0.4117647, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.20588236, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.89805824, + "altHomGenotypeFreq": 0.79611653, + "hetGenotypeFreq": 0.2038835, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.10194175, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9949495, + "altHomGenotypeFreq": 0.989899, + "hetGenotypeFreq": 0.01010101, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.005050505, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9579439, + "altHomGenotypeFreq": 0.91588783, + "hetGenotypeFreq": 0.084112145, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.042056076, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9423077, + "altHomGenotypeFreq": 0.88461536, + "hetGenotypeFreq": 0.115384616, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.057692308, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.969697, + "altHomGenotypeFreq": 0.93939394, + "hetGenotypeFreq": 0.060606062, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.030303031, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9941176, + "altHomGenotypeFreq": 0.9882353, + "hetGenotypeFreq": 0.011764706, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.005882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.97718257, + "altHomGenotypeFreq": 0.9543651, + "hetGenotypeFreq": 0.04563492, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.02281746, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.9951456, + "altHomGenotypeFreq": 0.99029124, + "hetGenotypeFreq": 0.009708738, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.004854369, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 22582524, + "id": "9053", + "percentageMatch": 0.963443, + "source": "genomicSuperDup", + "start": 22578625 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22580082, + "id": "11084", + "percentageMatch": 0.962121, + "source": "genomicSuperDup", + "start": 22578631 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 22580082, + "id": "11083", + "percentageMatch": 0.962121, + "source": "genomicSuperDup", + "start": 22578631 + } + ], + "start": 22579116, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 22579116, + "id": "15:22579116:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 22579116, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258684", + "ensemblTranscriptId": "ENST00000556075", + "geneName": "BMS1P16", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -0.7409999966621399, + "source": "gerp" + }, + { + "score": 0.0729999989271164, + "source": "phastCons" + }, + { + "score": 0.1940000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.23999977111816406, + "source": "cadd_raw" + }, + { + "score": 0.9399999976158142, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs75470069", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.17459853, + "altHomGenotypeFreq": 0.007033173, + "hetGenotypeFreq": 0.3351307, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.8254015, + "refHomGenotypeFreq": 0.65783614, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23404256, + "altHomGenotypeFreq": 0.0070921984, + "hetGenotypeFreq": 0.4539007, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7659575, + "refHomGenotypeFreq": 0.53900707, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.14818548, + "altHomGenotypeFreq": 0.006048387, + "hetGenotypeFreq": 0.2842742, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.8518145, + "refHomGenotypeFreq": 0.7096774, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18217054, + "altHomGenotypeFreq": 0.011627907, + "hetGenotypeFreq": 0.34108528, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.81782943, + "refHomGenotypeFreq": 0.64728683, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.18817204, + "altHomGenotypeFreq": 0.032258064, + "hetGenotypeFreq": 0.31182796, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.81182796, + "refHomGenotypeFreq": 0.65591395, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2479748, + "altHomGenotypeFreq": 0.00810081, + "hetGenotypeFreq": 0.47974798, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.7520252, + "refHomGenotypeFreq": 0.51215124, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.22449489, + "altHomGenotypeFreq": 0.009478673, + "hetGenotypeFreq": 0.43003243, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7755051, + "refHomGenotypeFreq": 0.5604889, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.04820333, + "altHomGenotypeFreq": 8.764242E-4, + "hetGenotypeFreq": 0.094653815, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.95179665, + "refHomGenotypeFreq": 0.9044698, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.16909899, + "altHomGenotypeFreq": 0.008037225, + "hetGenotypeFreq": 0.32212353, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.830901, + "refHomGenotypeFreq": 0.66983926, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.1814357, + "altHomGenotypeFreq": 0.0057849064, + "hetGenotypeFreq": 0.3513016, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.8185643, + "refHomGenotypeFreq": 0.64291346, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.0917603, + "altHomGenotypeFreq": 0.014981274, + "hetGenotypeFreq": 0.15355805, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9082397, + "refHomGenotypeFreq": 0.83146065, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "9121", + "percentageMatch": 0.997178, + "source": "genomicSuperDup", + "start": 21205313 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21377410, + "id": "10631", + "percentageMatch": 0.973411, + "source": "genomicSuperDup", + "start": 21318894 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10960", + "percentageMatch": 0.969018, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10959", + "percentageMatch": 0.969266, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10958", + "percentageMatch": 0.969428, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10957", + "percentageMatch": 0.969295, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10956", + "percentageMatch": 0.969077, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "10240", + "percentageMatch": 0.968879, + "source": "genomicSuperDup", + "start": 21352524 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21397580, + "id": "3430", + "percentageMatch": 0.958728, + "source": "genomicSuperDup", + "start": 21360744 + } + ], + "start": 21365577, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21365577, + "id": "15:21365577:G:C", + "length": 1, + "names": [], + "reference": "G", + "start": 21365577, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258684", + "ensemblTranscriptId": "ENST00000556075", + "geneName": "BMS1P16", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + } + ], + "conservation": [ + { + "score": -0.5339999794960022, + "source": "gerp" + }, + { + "score": 0.125, + "source": "phastCons" + }, + { + "score": 0.1940000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556075(ENSG00000258684):n.76-42delC" + ], + "id": "rs199931394", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.24267529, + "altHomGenotypeFreq": 0.0107381595, + "hetGenotypeFreq": 0.46387428, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7573247, + "refHomGenotypeFreq": 0.5253876, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2816594, + "altHomGenotypeFreq": 0.01091703, + "hetGenotypeFreq": 0.5414847, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.71834064, + "refHomGenotypeFreq": 0.44759825, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27247956, + "altHomGenotypeFreq": 0.0027247956, + "hetGenotypeFreq": 0.53950953, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.7275204, + "refHomGenotypeFreq": 0.45776567, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27040815, + "altHomGenotypeFreq": 0.0076530613, + "hetGenotypeFreq": 0.5255102, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.72959185, + "refHomGenotypeFreq": 0.46683672, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.29432625, + "altHomGenotypeFreq": 0.0070921984, + "hetGenotypeFreq": 0.5744681, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.70567375, + "refHomGenotypeFreq": 0.41843972, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.28229365, + "altHomGenotypeFreq": 0.018273473, + "hetGenotypeFreq": 0.52804035, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7177064, + "refHomGenotypeFreq": 0.4536862, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.28230357, + "altHomGenotypeFreq": 0.010852264, + "hetGenotypeFreq": 0.54290265, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7176964, + "refHomGenotypeFreq": 0.4462451, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.13988018, + "altHomGenotypeFreq": 0.009377442, + "hetGenotypeFreq": 0.26100546, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.8601198, + "refHomGenotypeFreq": 0.72961706, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.24200796, + "altHomGenotypeFreq": 0.012196688, + "hetGenotypeFreq": 0.45962253, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.757992, + "refHomGenotypeFreq": 0.5281808, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2435039, + "altHomGenotypeFreq": 0.008927148, + "hetGenotypeFreq": 0.46915352, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7564961, + "refHomGenotypeFreq": 0.5219193, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2265625, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.7734375, + "refHomGenotypeFreq": 0.546875, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.18809904, + "altHomGenotypeFreq": 0.007987221, + "hetGenotypeFreq": 0.36022365, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.811901, + "refHomGenotypeFreq": 0.63178915, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.15848671, + "altHomGenotypeFreq": 0.006134969, + "hetGenotypeFreq": 0.30470347, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.8415133, + "refHomGenotypeFreq": 0.68916154, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.75, + "refHomGenotypeFreq": 0.5, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.1764706, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.3137255, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.8235294, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.09152799, + "altHomGenotypeFreq": 0.009077156, + "hetGenotypeFreq": 0.16490166, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.908472, + "refHomGenotypeFreq": 0.8260212, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.1952381, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3904762, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.8047619, + "refHomGenotypeFreq": 0.60952383, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.21153846, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.42307693, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.78846157, + "refHomGenotypeFreq": 0.5769231, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.074074075, + "altHomGenotypeFreq": 0.009259259, + "hetGenotypeFreq": 0.12962963, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.9259259, + "refHomGenotypeFreq": 0.8611111, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.13541667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2708333, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.8645833, + "refHomGenotypeFreq": 0.7291667, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.123893805, + "altHomGenotypeFreq": 0.026548672, + "hetGenotypeFreq": 0.19469027, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.8761062, + "refHomGenotypeFreq": 0.7787611, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.1764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3529412, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.8235294, + "refHomGenotypeFreq": 0.64705884, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2747253, + "altHomGenotypeFreq": 0.010989011, + "hetGenotypeFreq": 0.52747256, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.72527474, + "refHomGenotypeFreq": 0.46153846, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2956989, + "altHomGenotypeFreq": 0.021505376, + "hetGenotypeFreq": 0.54838705, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.70430106, + "refHomGenotypeFreq": 0.43010753, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.26767677, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.53535354, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.7323232, + "refHomGenotypeFreq": 0.46464646, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.28037384, + "altHomGenotypeFreq": 0.018691588, + "hetGenotypeFreq": 0.5233645, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.7196262, + "refHomGenotypeFreq": 0.45794392, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.1627907, + "altHomGenotypeFreq": 0.011627907, + "hetGenotypeFreq": 0.30232558, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.8372093, + "refHomGenotypeFreq": 0.68604654, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.083333336, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.16666666, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.9166667, + "refHomGenotypeFreq": 0.8333333, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.1010101, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2020202, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.8989899, + "refHomGenotypeFreq": 0.7979798, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.060606062, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.10101011, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.93939394, + "refHomGenotypeFreq": 0.8888889, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25944334, + "altHomGenotypeFreq": 0.015904572, + "hetGenotypeFreq": 0.48707753, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.74055666, + "refHomGenotypeFreq": 0.4970179, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.10655738, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.21311474, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.89344263, + "refHomGenotypeFreq": 0.78688526, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.23919308, + "altHomGenotypeFreq": 0.0028818443, + "hetGenotypeFreq": 0.47262248, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7608069, + "refHomGenotypeFreq": 0.52449566, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.09411765, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.16470589, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.90588236, + "refHomGenotypeFreq": 0.8235294, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.1407767, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2815534, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.8592233, + "refHomGenotypeFreq": 0.7184466, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.22727273, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.45454544, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.77272725, + "refHomGenotypeFreq": 0.54545456, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.24766356, + "altHomGenotypeFreq": 0.018691588, + "hetGenotypeFreq": 0.45794392, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.75233644, + "refHomGenotypeFreq": 0.5233645, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.26923078, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5384615, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.7307692, + "refHomGenotypeFreq": 0.46153846, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.26767677, + "altHomGenotypeFreq": 0.030303031, + "hetGenotypeFreq": 0.47474748, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.7323232, + "refHomGenotypeFreq": 0.4949495, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2, + "altHomGenotypeFreq": 0.011764706, + "hetGenotypeFreq": 0.3764706, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.8, + "refHomGenotypeFreq": 0.6117647, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.23710318, + "altHomGenotypeFreq": 0.003968254, + "hetGenotypeFreq": 0.46626985, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.76289684, + "refHomGenotypeFreq": 0.5297619, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.22330096, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.44660193, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.776699, + "refHomGenotypeFreq": 0.5533981, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21377410, + "id": "10631", + "percentageMatch": 0.973411, + "source": "genomicSuperDup", + "start": 21318894 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "10240", + "percentageMatch": 0.968879, + "source": "genomicSuperDup", + "start": 21352524 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "9121", + "percentageMatch": 0.997178, + "source": "genomicSuperDup", + "start": 21205313 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21397580, + "id": "3430", + "percentageMatch": 0.958728, + "source": "genomicSuperDup", + "start": 21360744 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10956", + "percentageMatch": 0.969077, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10959", + "percentageMatch": 0.969266, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10958", + "percentageMatch": 0.969428, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10960", + "percentageMatch": 0.969018, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10957", + "percentageMatch": 0.969295, + "source": "genomicSuperDup", + "start": 21341172 + } + ], + "start": 21366311, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21366311, + "id": "15:21366311:C:-", + "length": 1, + "names": [], + "reference": "C", + "start": 21366311, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258684", + "ensemblTranscriptId": "ENST00000556075", + "geneName": "BMS1P16", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.6970000267028809, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -3.575000047683716, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.2700004577636719, + "source": "cadd_raw" + }, + { + "score": 0.7799999713897705, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556075(ENSG00000258684):n.248-26C>T" + ], + "id": "rs199685244", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.22143218, + "altHomGenotypeFreq": 0.0127080185, + "hetGenotypeFreq": 0.4174483, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.77856785, + "refHomGenotypeFreq": 0.56984365, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23054755, + "altHomGenotypeFreq": 0.02017291, + "hetGenotypeFreq": 0.42074928, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.76945245, + "refHomGenotypeFreq": 0.5590778, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06351791, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12703583, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.9364821, + "refHomGenotypeFreq": 0.87296414, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14130434, + "altHomGenotypeFreq": 0.00931677, + "hetGenotypeFreq": 0.26397514, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8586956, + "refHomGenotypeFreq": 0.72670805, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26605505, + "altHomGenotypeFreq": 0.018348623, + "hetGenotypeFreq": 0.49541286, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.73394495, + "refHomGenotypeFreq": 0.48623854, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2421014, + "altHomGenotypeFreq": 0.017634092, + "hetGenotypeFreq": 0.4489346, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7578986, + "refHomGenotypeFreq": 0.5334313, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22473799, + "altHomGenotypeFreq": 0.011666996, + "hetGenotypeFreq": 0.42614198, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.775262, + "refHomGenotypeFreq": 0.562191, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25463182, + "altHomGenotypeFreq": 0.014726841, + "hetGenotypeFreq": 0.47980997, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7453682, + "refHomGenotypeFreq": 0.5054632, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.21847747, + "altHomGenotypeFreq": 0.0123546515, + "hetGenotypeFreq": 0.41224563, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7815225, + "refHomGenotypeFreq": 0.5753997, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22511902, + "altHomGenotypeFreq": 0.013148946, + "hetGenotypeFreq": 0.42394015, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.774881, + "refHomGenotypeFreq": 0.5629109, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12172285, + "altHomGenotypeFreq": 0.02247191, + "hetGenotypeFreq": 0.19850187, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8782772, + "refHomGenotypeFreq": 0.7790262, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "9121", + "percentageMatch": 0.997178, + "source": "genomicSuperDup", + "start": 21205313 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21377410, + "id": "10631", + "percentageMatch": 0.973411, + "source": "genomicSuperDup", + "start": 21318894 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10960", + "percentageMatch": 0.969018, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10959", + "percentageMatch": 0.969266, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10958", + "percentageMatch": 0.969428, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10957", + "percentageMatch": 0.969295, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10956", + "percentageMatch": 0.969077, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "10240", + "percentageMatch": 0.968879, + "source": "genomicSuperDup", + "start": 21352524 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21397580, + "id": "3430", + "percentageMatch": 0.958728, + "source": "genomicSuperDup", + "start": 21360744 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10962", + "percentageMatch": 0.974793, + "source": "genomicSuperDup", + "start": 21366941 + } + ], + "start": 21369251, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21369251, + "id": "15:21369251:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21369251, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "cdnaPosition": 329, + "ensemblGeneId": "ENSG00000258684", + "ensemblTranscriptId": "ENST00000556075", + "exonOverlap": [ + { + "number": "3/8", + "percentage": 0.52910054 + } + ], + "geneName": "BMS1P16", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.5569999814033508, + "source": "gerp" + }, + { + "score": 0.7960000038146973, + "source": "phastCons" + }, + { + "score": 0.18400000035762787, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 1.4499998092651367, + "source": "cadd_raw" + }, + { + "score": 13.069999694824219, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556075(ENSG00000258684):n.329G>A" + ], + "id": "rs3892230", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.32484287, + "altHomGenotypeFreq": 0.051521666, + "hetGenotypeFreq": 0.5466424, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.6751571, + "refHomGenotypeFreq": 0.40183592, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38137755, + "altHomGenotypeFreq": 0.048469387, + "hetGenotypeFreq": 0.6658163, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.6186224, + "refHomGenotypeFreq": 0.2857143, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31911966, + "altHomGenotypeFreq": 0.03301238, + "hetGenotypeFreq": 0.5722146, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6808803, + "refHomGenotypeFreq": 0.39477304, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3497191, + "altHomGenotypeFreq": 0.06460674, + "hetGenotypeFreq": 0.5702247, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6502809, + "refHomGenotypeFreq": 0.36516854, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35470086, + "altHomGenotypeFreq": 0.051282052, + "hetGenotypeFreq": 0.60683763, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.64529914, + "refHomGenotypeFreq": 0.34188035, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36420158, + "altHomGenotypeFreq": 0.041230366, + "hetGenotypeFreq": 0.6459424, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.63579845, + "refHomGenotypeFreq": 0.31282723, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40241483, + "altHomGenotypeFreq": 0.07476017, + "hetGenotypeFreq": 0.6553093, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.5975852, + "refHomGenotypeFreq": 0.26993054, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.13362953, + "altHomGenotypeFreq": 0.012303486, + "hetGenotypeFreq": 0.24265209, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.8663705, + "refHomGenotypeFreq": 0.7450444, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3209424, + "altHomGenotypeFreq": 0.052954376, + "hetGenotypeFreq": 0.53597605, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.6790576, + "refHomGenotypeFreq": 0.41106957, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32966524, + "altHomGenotypeFreq": 0.049750324, + "hetGenotypeFreq": 0.55982983, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.67033476, + "refHomGenotypeFreq": 0.39041984, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3515625, + "altHomGenotypeFreq": 0.125, + "hetGenotypeFreq": 0.453125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.6484375, + "refHomGenotypeFreq": 0.421875, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26497602, + "altHomGenotypeFreq": 0.06589457, + "hetGenotypeFreq": 0.39816296, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.735024, + "refHomGenotypeFreq": 0.5359425, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3404908, + "altHomGenotypeFreq": 0.08588957, + "hetGenotypeFreq": 0.5092024, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.6595092, + "refHomGenotypeFreq": 0.40490797, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3882979, + "altHomGenotypeFreq": 0.095744684, + "hetGenotypeFreq": 0.5851064, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.61170214, + "refHomGenotypeFreq": 0.31914893, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34313726, + "altHomGenotypeFreq": 0.05882353, + "hetGenotypeFreq": 0.5686275, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.65686274, + "refHomGenotypeFreq": 0.37254903, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.045385778, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.090771556, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.9546142, + "refHomGenotypeFreq": 0.90922844, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33333334, + "altHomGenotypeFreq": 0.06666667, + "hetGenotypeFreq": 0.53333336, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.6666667, + "refHomGenotypeFreq": 0.4, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.25480768, + "altHomGenotypeFreq": 0.01923077, + "hetGenotypeFreq": 0.47115386, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.7451923, + "refHomGenotypeFreq": 0.50961536, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.041666668, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08333333, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.9583333, + "refHomGenotypeFreq": 0.9166667, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34375, + "altHomGenotypeFreq": 0.09375, + "hetGenotypeFreq": 0.5, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.65625, + "refHomGenotypeFreq": 0.40625, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.0088495575, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.017699115, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.99115044, + "refHomGenotypeFreq": 0.9823009, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29411766, + "altHomGenotypeFreq": 0.068627454, + "hetGenotypeFreq": 0.45098042, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.7058824, + "refHomGenotypeFreq": 0.48039216, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45054945, + "altHomGenotypeFreq": 0.20879121, + "hetGenotypeFreq": 0.4835165, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.5494506, + "refHomGenotypeFreq": 0.30769232, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.33870968, + "altHomGenotypeFreq": 0.032258064, + "hetGenotypeFreq": 0.61290324, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.66129035, + "refHomGenotypeFreq": 0.3548387, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35353535, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.56565654, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.64646465, + "refHomGenotypeFreq": 0.36363637, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36448598, + "altHomGenotypeFreq": 0.11214953, + "hetGenotypeFreq": 0.5046729, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.635514, + "refHomGenotypeFreq": 0.38317758, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34302327, + "altHomGenotypeFreq": 0.093023255, + "hetGenotypeFreq": 0.5, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.65697676, + "refHomGenotypeFreq": 0.40697673, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.09375, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1875, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.90625, + "refHomGenotypeFreq": 0.8125, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.04040404, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.08080808, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.959596, + "refHomGenotypeFreq": 0.9191919, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.030303031, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.060606062, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.969697, + "refHomGenotypeFreq": 0.93939394, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37475148, + "altHomGenotypeFreq": 0.12326044, + "hetGenotypeFreq": 0.50298214, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.6252485, + "refHomGenotypeFreq": 0.37375745, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.12295082, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.24590164, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.8770492, + "refHomGenotypeFreq": 0.75409836, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35590777, + "altHomGenotypeFreq": 0.1037464, + "hetGenotypeFreq": 0.50432277, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6440922, + "refHomGenotypeFreq": 0.39193085, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.011764706, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.023529412, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.9882353, + "refHomGenotypeFreq": 0.9764706, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37864077, + "altHomGenotypeFreq": 0.116504855, + "hetGenotypeFreq": 0.52427185, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.6213592, + "refHomGenotypeFreq": 0.3592233, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3838384, + "altHomGenotypeFreq": 0.11111111, + "hetGenotypeFreq": 0.5454545, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.61616164, + "refHomGenotypeFreq": 0.34343433, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.31308413, + "altHomGenotypeFreq": 0.046728972, + "hetGenotypeFreq": 0.53271025, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.6869159, + "refHomGenotypeFreq": 0.42056075, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26923078, + "altHomGenotypeFreq": 0.048076924, + "hetGenotypeFreq": 0.4423077, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.7307692, + "refHomGenotypeFreq": 0.50961536, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.37373737, + "altHomGenotypeFreq": 0.15151516, + "hetGenotypeFreq": 0.44444445, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.6262626, + "refHomGenotypeFreq": 0.4040404, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.42941177, + "altHomGenotypeFreq": 0.16470589, + "hetGenotypeFreq": 0.5294118, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.57058823, + "refHomGenotypeFreq": 0.30588236, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.30753967, + "altHomGenotypeFreq": 0.049603175, + "hetGenotypeFreq": 0.515873, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6924603, + "refHomGenotypeFreq": 0.43452382, + "study": "1kG_phase3" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.26213592, + "altHomGenotypeFreq": 0.058252428, + "hetGenotypeFreq": 0.407767, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.7378641, + "refHomGenotypeFreq": 0.5339806, + "study": "1kG_phase3" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "9121", + "percentageMatch": 0.997178, + "source": "genomicSuperDup", + "start": 21205313 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21377410, + "id": "10631", + "percentageMatch": 0.973411, + "source": "genomicSuperDup", + "start": 21318894 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10960", + "percentageMatch": 0.969018, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10959", + "percentageMatch": 0.969266, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10958", + "percentageMatch": 0.969428, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10957", + "percentageMatch": 0.969295, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10956", + "percentageMatch": 0.969077, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "10240", + "percentageMatch": 0.968879, + "source": "genomicSuperDup", + "start": 21352524 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21397580, + "id": "3430", + "percentageMatch": 0.958728, + "source": "genomicSuperDup", + "start": 21360744 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10962", + "percentageMatch": 0.974793, + "source": "genomicSuperDup", + "start": 21366941 + } + ], + "start": 21369358, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21369358, + "id": "15:21369358:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 21369358, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258684", + "ensemblTranscriptId": "ENST00000556075", + "geneName": "BMS1P16", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "+", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.399999976158142, + "source": "gerp" + }, + { + "score": 0.07100000232458115, + "source": "phastCons" + }, + { + "score": -1.815000057220459, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.3400001525878906, + "source": "cadd_raw" + }, + { + "score": 0.550000011920929, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000556075(ENSG00000258684):n.971+67T>C" + ], + "id": "rs200194841", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.4870869, + "altHomGenotypeFreq": 0.08382578, + "hetGenotypeFreq": 0.8065222, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5129131, + "refHomGenotypeFreq": 0.109652005, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4831081, + "altHomGenotypeFreq": 0.058558557, + "hetGenotypeFreq": 0.8490991, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.5168919, + "refHomGenotypeFreq": 0.09234234, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5325798, + "altHomGenotypeFreq": 0.099734046, + "hetGenotypeFreq": 0.8656915, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.46742022, + "refHomGenotypeFreq": 0.034574468, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44300517, + "altHomGenotypeFreq": 0.010362694, + "hetGenotypeFreq": 0.865285, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.5569948, + "refHomGenotypeFreq": 0.12435233, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.55, + "altHomGenotypeFreq": 0.1923077, + "hetGenotypeFreq": 0.7153846, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.45, + "refHomGenotypeFreq": 0.092307694, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47268108, + "altHomGenotypeFreq": 0.052731894, + "hetGenotypeFreq": 0.83989835, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.52731895, + "refHomGenotypeFreq": 0.10736976, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.5090388, + "altHomGenotypeFreq": 0.10229277, + "hetGenotypeFreq": 0.81349206, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.4909612, + "refHomGenotypeFreq": 0.084215164, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44553497, + "altHomGenotypeFreq": 0.06635333, + "hetGenotypeFreq": 0.7583633, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.55446506, + "refHomGenotypeFreq": 0.17528339, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49347827, + "altHomGenotypeFreq": 0.093939394, + "hetGenotypeFreq": 0.79907775, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.50652176, + "refHomGenotypeFreq": 0.10698287, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47915643, + "altHomGenotypeFreq": 0.07127677, + "hetGenotypeFreq": 0.81575936, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.52084357, + "refHomGenotypeFreq": 0.11296387, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "9121", + "percentageMatch": 0.997178, + "source": "genomicSuperDup", + "start": 21205313 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21377410, + "id": "10631", + "percentageMatch": 0.973411, + "source": "genomicSuperDup", + "start": 21318894 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10960", + "percentageMatch": 0.969018, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10959", + "percentageMatch": 0.969266, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10958", + "percentageMatch": 0.969428, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10957", + "percentageMatch": 0.969295, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10956", + "percentageMatch": 0.969077, + "source": "genomicSuperDup", + "start": 21341172 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "10240", + "percentageMatch": 0.968879, + "source": "genomicSuperDup", + "start": 21352524 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21397580, + "id": "3430", + "percentageMatch": 0.958728, + "source": "genomicSuperDup", + "start": 21360744 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21378778, + "id": "10962", + "percentageMatch": 0.974793, + "source": "genomicSuperDup", + "start": 21366941 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21375072, + "id": "10634", + "percentageMatch": 0.92892, + "source": "genomicSuperDup", + "start": 21371357 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21375072, + "id": "8423", + "percentageMatch": 0.927894, + "source": "genomicSuperDup", + "start": 21371357 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21375072, + "id": "8414", + "percentageMatch": 0.928319, + "source": "genomicSuperDup", + "start": 21371357 + } + ], + "start": 21372236, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21372236, + "id": "15:21372236:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21372236, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.020999999716877937, + "source": "phastCons" + }, + { + "score": -1.3530000448226929, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": 0.3000001907348633, + "source": "cadd_raw" + }, + { + "score": 5.75, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4037384", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.85828185, + "altHomGenotypeFreq": 0.7200186, + "hetGenotypeFreq": 0.27652648, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.14171816, + "refHomGenotypeFreq": 0.00345492, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.79813665, + "altHomGenotypeFreq": 0.6004141, + "hetGenotypeFreq": 0.39544514, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.20186335, + "refHomGenotypeFreq": 0.004140787, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.99936306, + "altHomGenotypeFreq": 0.9987261, + "hetGenotypeFreq": 0.0012738854, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 6.369427E-4, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8871359, + "altHomGenotypeFreq": 0.7815534, + "hetGenotypeFreq": 0.21116506, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.11286408, + "refHomGenotypeFreq": 0.0072815535, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.75503355, + "altHomGenotypeFreq": 0.5167785, + "hetGenotypeFreq": 0.47651008, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.24496645, + "refHomGenotypeFreq": 0.0067114094, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.797235, + "altHomGenotypeFreq": 0.59619814, + "hetGenotypeFreq": 0.40207374, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.20276497, + "refHomGenotypeFreq": 0.0017281106, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8072535, + "altHomGenotypeFreq": 0.61953276, + "hetGenotypeFreq": 0.37544146, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.19274653, + "refHomGenotypeFreq": 0.0050258082, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9561106, + "altHomGenotypeFreq": 0.913676, + "hetGenotypeFreq": 0.08486906, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.04388943, + "refHomGenotypeFreq": 0.0014548982, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86281586, + "altHomGenotypeFreq": 0.7302046, + "hetGenotypeFreq": 0.2652226, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.13718411, + "refHomGenotypeFreq": 0.0045728036, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8526925, + "altHomGenotypeFreq": 0.7074618, + "hetGenotypeFreq": 0.29046136, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.14730752, + "refHomGenotypeFreq": 0.0020768433, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8036072, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.19639279, + "study": "GONL" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21901264, + "id": "9173", + "percentageMatch": 0.994177, + "source": "genomicSuperDup", + "start": 21885001 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21896955, + "id": "7595", + "percentageMatch": 0.9416, + "source": "genomicSuperDup", + "start": 21885009 + } + ], + "start": 21892816, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21892816, + "id": "15:21892816:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21892816, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0002083", + "name": "2KB_downstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.090000033378601, + "source": "gerp" + }, + { + "score": 0.15399999916553497, + "source": "phastCons" + }, + { + "score": -1.3530000448226929, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_downstream_variant", + "functionalScore": [ + { + "score": 1.0299997329711914, + "source": "cadd_raw" + }, + { + "score": 10.880000114440918, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs370109551", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.25673452, + "altHomGenotypeFreq": 0.010913815, + "hetGenotypeFreq": 0.4916414, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7432655, + "refHomGenotypeFreq": 0.49744478, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24362606, + "altHomGenotypeFreq": 0.0028328612, + "hetGenotypeFreq": 0.4815864, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.75637394, + "refHomGenotypeFreq": 0.5155807, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32564104, + "altHomGenotypeFreq": 0.0051282053, + "hetGenotypeFreq": 0.64102566, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.67435896, + "refHomGenotypeFreq": 0.35384616, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20793651, + "altHomGenotypeFreq": 0.0031746032, + "hetGenotypeFreq": 0.40952381, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7920635, + "refHomGenotypeFreq": 0.5873016, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28761062, + "altHomGenotypeFreq": 0.0088495575, + "hetGenotypeFreq": 0.5575221, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7123894, + "refHomGenotypeFreq": 0.43362832, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25873017, + "altHomGenotypeFreq": 0.007936508, + "hetGenotypeFreq": 0.50158733, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7412698, + "refHomGenotypeFreq": 0.4904762, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23249222, + "altHomGenotypeFreq": 0.0032912781, + "hetGenotypeFreq": 0.4584019, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.7675078, + "refHomGenotypeFreq": 0.53830683, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28753623, + "altHomGenotypeFreq": 0.026666667, + "hetGenotypeFreq": 0.5217391, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.7124638, + "refHomGenotypeFreq": 0.4515942, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25369996, + "altHomGenotypeFreq": 0.0101261875, + "hetGenotypeFreq": 0.48714754, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.74630004, + "refHomGenotypeFreq": 0.50272626, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26053452, + "altHomGenotypeFreq": 0.011900117, + "hetGenotypeFreq": 0.49726883, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7394655, + "refHomGenotypeFreq": 0.49083105, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27153558, + "altHomGenotypeFreq": 0.011235955, + "hetGenotypeFreq": 0.52059925, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7284644, + "refHomGenotypeFreq": 0.4681648, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21901264, + "id": "9173", + "percentageMatch": 0.994177, + "source": "genomicSuperDup", + "start": 21885001 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21896955, + "id": "7595", + "percentageMatch": 0.9416, + "source": "genomicSuperDup", + "start": 21885009 + } + ], + "start": 21893086, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21893086, + "id": "15:21893086:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21893086, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "cdnaPosition": 162, + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "exonOverlap": [ + { + "number": "2/3", + "percentage": 0.70422536 + } + ], + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.090000033378601, + "source": "gerp" + }, + { + "score": 0.11900000274181366, + "source": "phastCons" + }, + { + "score": 0.12800000607967377, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.6999998092651367, + "source": "cadd_raw" + }, + { + "score": 8.859999656677246, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000555285(ENSG00000258883):n.162T>C" + ], + "id": "rs374248488", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.42345706, + "altHomGenotypeFreq": 0.056385096, + "hetGenotypeFreq": 0.7341439, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.576543, + "refHomGenotypeFreq": 0.20947099, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43421054, + "altHomGenotypeFreq": 0.04605263, + "hetGenotypeFreq": 0.7763158, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.56578946, + "refHomGenotypeFreq": 0.17763157, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.44246033, + "altHomGenotypeFreq": 0.03042328, + "hetGenotypeFreq": 0.8240741, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5575397, + "refHomGenotypeFreq": 0.14550264, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42125985, + "altHomGenotypeFreq": 0.015748031, + "hetGenotypeFreq": 0.8110236, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5787402, + "refHomGenotypeFreq": 0.17322835, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41489363, + "altHomGenotypeFreq": 0.014184397, + "hetGenotypeFreq": 0.8014184, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5851064, + "refHomGenotypeFreq": 0.18439716, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.43966058, + "altHomGenotypeFreq": 0.058453802, + "hetGenotypeFreq": 0.76241356, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5603394, + "refHomGenotypeFreq": 0.17913263, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.45080796, + "altHomGenotypeFreq": 0.04804805, + "hetGenotypeFreq": 0.8055198, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.5491921, + "refHomGenotypeFreq": 0.14643215, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3609183, + "altHomGenotypeFreq": 0.08328884, + "hetGenotypeFreq": 0.5552589, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6390817, + "refHomGenotypeFreq": 0.36145222, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42049697, + "altHomGenotypeFreq": 0.05652118, + "hetGenotypeFreq": 0.7279516, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.579503, + "refHomGenotypeFreq": 0.21552724, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.42710814, + "altHomGenotypeFreq": 0.056217246, + "hetGenotypeFreq": 0.7417818, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.57289183, + "refHomGenotypeFreq": 0.20200095, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.40074906, + "altHomGenotypeFreq": 0.04868914, + "hetGenotypeFreq": 0.70411986, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5992509, + "refHomGenotypeFreq": 0.24719101, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21901264, + "id": "9173", + "percentageMatch": 0.994177, + "source": "genomicSuperDup", + "start": 21885001 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "7592", + "percentageMatch": 0.939484, + "source": "genomicSuperDup", + "start": 21896964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "10476", + "percentageMatch": 0.951332, + "source": "genomicSuperDup", + "start": 21896967 + } + ], + "start": 21900326, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21900326, + "id": "15:21900326:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21900326, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.5299999713897705, + "source": "gerp" + }, + { + "score": 0.15399999916553497, + "source": "phastCons" + }, + { + "score": 0.3310000002384186, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000555285(ENSG00000258883):n.123+113delT" + ], + "id": "rs56050550", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.2841628, + "altHomGenotypeFreq": 0.05594086, + "hetGenotypeFreq": 0.8400274, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.5240454, + "refHomGenotypeFreq": 0.104031704, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.27737227, + "altHomGenotypeFreq": 0.03649635, + "hetGenotypeFreq": 0.85401464, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.53649634, + "refHomGenotypeFreq": 0.10948905, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.31386292, + "altHomGenotypeFreq": 0.009345794, + "hetGenotypeFreq": 0.8909657, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5451713, + "refHomGenotypeFreq": 0.09968847, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25, + "altHomGenotypeFreq": 0.034883723, + "hetGenotypeFreq": 0.7383721, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.5959302, + "refHomGenotypeFreq": 0.22674419, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2653846, + "altHomGenotypeFreq": 0.06923077, + "hetGenotypeFreq": 0.84615386, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.50769234, + "refHomGenotypeFreq": 0.08461539, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.30793318, + "altHomGenotypeFreq": 0.0361865, + "hetGenotypeFreq": 0.8336813, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.5469729, + "refHomGenotypeFreq": 0.13013221, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.25633758, + "altHomGenotypeFreq": 0.055581797, + "hetGenotypeFreq": 0.8417572, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.5235396, + "refHomGenotypeFreq": 0.102661, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.32107198, + "altHomGenotypeFreq": 0.07540725, + "hetGenotypeFreq": 0.838413, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.50538623, + "refHomGenotypeFreq": 0.08617972, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.28415868, + "altHomGenotypeFreq": 0.059231516, + "hetGenotypeFreq": 0.8370093, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.5222638, + "refHomGenotypeFreq": 0.10375919, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.2841678, + "altHomGenotypeFreq": 0.05192828, + "hetGenotypeFreq": 0.84370774, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.5262179, + "refHomGenotypeFreq": 0.10436401, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "7592", + "percentageMatch": 0.939484, + "source": "genomicSuperDup", + "start": 21896964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "10476", + "percentageMatch": 0.951332, + "source": "genomicSuperDup", + "start": 21896967 + } + ], + "start": 21902822, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21902822, + "id": "15:21902822:A:-", + "length": 1, + "names": [], + "reference": "A", + "start": 21902822, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.25, + "source": "gerp" + }, + { + "score": 0.06599999964237213, + "source": "phastCons" + }, + { + "score": 0.3310000002384186, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": 0.05000019073486328, + "source": "cadd_raw" + }, + { + "score": 3.0899999141693115, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000555285(ENSG00000258883):n.123+61A>G" + ], + "id": "rs28642802", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.40020013, + "altHomGenotypeFreq": 0.010545762, + "hetGenotypeFreq": 0.77930874, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.5997999, + "refHomGenotypeFreq": 0.21014549, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42142856, + "altHomGenotypeFreq": 0.016666668, + "hetGenotypeFreq": 0.8095238, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.57857144, + "refHomGenotypeFreq": 0.17380953, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4712885, + "altHomGenotypeFreq": 0.019607844, + "hetGenotypeFreq": 0.9033613, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5287115, + "refHomGenotypeFreq": 0.077030815, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.45, + "altHomGenotypeFreq": 0.019444445, + "hetGenotypeFreq": 0.8611111, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.55, + "refHomGenotypeFreq": 0.119444445, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40625, + "altHomGenotypeFreq": 0.0078125, + "hetGenotypeFreq": 0.796875, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.59375, + "refHomGenotypeFreq": 0.1953125, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.44025367, + "altHomGenotypeFreq": 0.016021362, + "hetGenotypeFreq": 0.8484646, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.5597463, + "refHomGenotypeFreq": 0.13551402, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4352784, + "altHomGenotypeFreq": 0.011481598, + "hetGenotypeFreq": 0.8475936, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.5647216, + "refHomGenotypeFreq": 0.14092483, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.2973242, + "altHomGenotypeFreq": 0.0031312269, + "hetGenotypeFreq": 0.588386, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.70267576, + "refHomGenotypeFreq": 0.4084828, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3991969, + "altHomGenotypeFreq": 0.009692606, + "hetGenotypeFreq": 0.77900857, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6008031, + "refHomGenotypeFreq": 0.21129881, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.40145606, + "altHomGenotypeFreq": 0.011613798, + "hetGenotypeFreq": 0.77968454, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.59854394, + "refHomGenotypeFreq": 0.20870169, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4213483, + "altHomGenotypeFreq": 0.0037453184, + "hetGenotypeFreq": 0.835206, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.57865167, + "refHomGenotypeFreq": 0.1610487, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "7592", + "percentageMatch": 0.939484, + "source": "genomicSuperDup", + "start": 21896964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "10476", + "percentageMatch": 0.951332, + "source": "genomicSuperDup", + "start": 21896967 + } + ], + "start": 21902874, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21902874, + "id": "15:21902874:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21902874, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001619", + "name": "non_coding_transcript_variant" + }, + { + "accession": "SO:0001627", + "name": "intron_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.090000033378601, + "source": "gerp" + }, + { + "score": 0.012000000104308128, + "source": "phastCons" + }, + { + "score": -1.906000018119812, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intron_variant", + "functionalScore": [ + { + "score": -0.020000457763671875, + "source": "cadd_raw" + }, + { + "score": 2.450000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000555285(ENSG00000258883):n.123+43G>T" + ], + "id": "rs4984170", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.40690792, + "altHomGenotypeFreq": 5.2446243E-4, + "hetGenotypeFreq": 0.8127669, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5930921, + "refHomGenotypeFreq": 0.18670863, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41046512, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.82093024, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.5895349, + "refHomGenotypeFreq": 0.17906977, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.437409, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.874818, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.56259096, + "refHomGenotypeFreq": 0.12518194, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3523677, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7047354, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6476323, + "refHomGenotypeFreq": 0.29526463, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4185185, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.837037, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.58148146, + "refHomGenotypeFreq": 0.16296296, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40285146, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8057029, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.59714854, + "refHomGenotypeFreq": 0.19429708, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40285134, + "altHomGenotypeFreq": 3.1162356E-4, + "hetGenotypeFreq": 0.80507946, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.59714866, + "refHomGenotypeFreq": 0.19460891, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.41417322, + "altHomGenotypeFreq": 0.001312336, + "hetGenotypeFreq": 0.8257218, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.58582675, + "refHomGenotypeFreq": 0.17296588, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40718645, + "altHomGenotypeFreq": 5.423729E-4, + "hetGenotypeFreq": 0.81328815, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.59281355, + "refHomGenotypeFreq": 0.18616949, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.40656397, + "altHomGenotypeFreq": 5.023443E-4, + "hetGenotypeFreq": 0.81212324, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.59343606, + "refHomGenotypeFreq": 0.18737441, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36891386, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7378277, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6310862, + "refHomGenotypeFreq": 0.26217228, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "7592", + "percentageMatch": 0.939484, + "source": "genomicSuperDup", + "start": 21896964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "10476", + "percentageMatch": 0.951332, + "source": "genomicSuperDup", + "start": 21896967 + } + ], + "start": 21902892, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21902892, + "id": "15:21902892:C:A", + "length": 1, + "names": [], + "reference": "C", + "start": 21902892, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "cdnaPosition": 67, + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "exonOverlap": [ + { + "number": "1/3", + "percentage": 0.8130081 + } + ], + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001792", + "name": "non_coding_transcript_exon_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.3600000143051147, + "source": "gerp" + }, + { + "score": 0.20499999821186066, + "source": "phastCons" + }, + { + "score": 0.15199999511241913, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "non_coding_transcript_exon_variant", + "functionalScore": [ + { + "score": 0.5299997329711914, + "source": "cadd_raw" + }, + { + "score": 7.679999828338623, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [ + "ENST00000555285(ENSG00000258883):n.67G>A" + ], + "id": "rs4984169", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.3006115, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.601223, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6993885, + "refHomGenotypeFreq": 0.398777, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32070708, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.64141417, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.6792929, + "refHomGenotypeFreq": 0.35858586, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34440842, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.68881685, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.65559155, + "refHomGenotypeFreq": 0.31118315, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25451806, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5090361, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7454819, + "refHomGenotypeFreq": 0.49096385, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31932774, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6386555, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.6806723, + "refHomGenotypeFreq": 0.36134455, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.33570918, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.67141837, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.6642908, + "refHomGenotypeFreq": 0.3285816, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30171695, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6034339, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.6982831, + "refHomGenotypeFreq": 0.3965661, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27772874, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5554575, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.72227126, + "refHomGenotypeFreq": 0.44454253, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29955754, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5991151, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.7004425, + "refHomGenotypeFreq": 0.40088496, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3019143, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6038286, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.69808567, + "refHomGenotypeFreq": 0.3961714, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14794007, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.29588014, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.8520599, + "refHomGenotypeFreq": 0.70411986, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "7592", + "percentageMatch": 0.939484, + "source": "genomicSuperDup", + "start": 21896964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "10476", + "percentageMatch": 0.951332, + "source": "genomicSuperDup", + "start": 21896967 + } + ], + "start": 21902991, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21902991, + "id": "15:21902991:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21902991, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.090000033378601, + "source": "gerp" + }, + { + "score": 0.25099998712539673, + "source": "phastCons" + }, + { + "score": 0.12800000607967377, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.039999961853027344, + "source": "cadd_raw" + }, + { + "score": 3, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4983775", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.31374225, + "altHomGenotypeFreq": 4.072988E-4, + "hetGenotypeFreq": 0.62666994, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.6862577, + "refHomGenotypeFreq": 0.37292278, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35696518, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.71393037, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6430348, + "refHomGenotypeFreq": 0.28606966, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.27649006, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5529801, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.7235099, + "refHomGenotypeFreq": 0.44701988, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31213018, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.62426037, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.68786985, + "refHomGenotypeFreq": 0.37573963, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.35080644, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7016129, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.6491935, + "refHomGenotypeFreq": 0.2983871, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37796375, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7559275, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.6220363, + "refHomGenotypeFreq": 0.24407253, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.34327745, + "altHomGenotypeFreq": 6.574622E-4, + "hetGenotypeFreq": 0.68524, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.65672255, + "refHomGenotypeFreq": 0.31410256, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.23145896, + "altHomGenotypeFreq": 3.0395135E-4, + "hetGenotypeFreq": 0.46231002, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.76854104, + "refHomGenotypeFreq": 0.537386, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3115362, + "altHomGenotypeFreq": 5.931198E-4, + "hetGenotypeFreq": 0.62188613, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.6884638, + "refHomGenotypeFreq": 0.37752077, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31643167, + "altHomGenotypeFreq": 1.8076645E-4, + "hetGenotypeFreq": 0.6325018, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.68356836, + "refHomGenotypeFreq": 0.36731744, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.11423221, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.22846442, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.8857678, + "refHomGenotypeFreq": 0.7715356, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "7592", + "percentageMatch": 0.939484, + "source": "genomicSuperDup", + "start": 21896964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "10476", + "percentageMatch": 0.951332, + "source": "genomicSuperDup", + "start": 21896967 + } + ], + "start": 21903156, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21903156, + "id": "15:21903156:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21903156, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -1.3600000143051147, + "source": "gerp" + }, + { + "score": 0.16200000047683716, + "source": "phastCons" + }, + { + "score": 0.15199999511241913, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.010000228881835938, + "source": "cadd_raw" + }, + { + "score": 2.700000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs11248817", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.24476658, + "altHomGenotypeFreq": 8.307028E-4, + "hetGenotypeFreq": 0.48787174, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7552334, + "refHomGenotypeFreq": 0.5112976, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.264, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.528, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.736, + "refHomGenotypeFreq": 0.472, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2685665, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.537133, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.7314335, + "refHomGenotypeFreq": 0.46286702, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31931463, + "altHomGenotypeFreq": 0.0031152647, + "hetGenotypeFreq": 0.6323987, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.68068534, + "refHomGenotypeFreq": 0.36448598, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22457626, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.44915253, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7754237, + "refHomGenotypeFreq": 0.5508475, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28234398, + "altHomGenotypeFreq": 0.002283105, + "hetGenotypeFreq": 0.5601218, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.717656, + "refHomGenotypeFreq": 0.43759513, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28689668, + "altHomGenotypeFreq": 8.712319E-4, + "hetGenotypeFreq": 0.57205087, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.71310335, + "refHomGenotypeFreq": 0.4270779, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15186526, + "altHomGenotypeFreq": 2.7839644E-4, + "hetGenotypeFreq": 0.30317372, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.84813476, + "refHomGenotypeFreq": 0.69654787, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24089615, + "altHomGenotypeFreq": 5.994305E-4, + "hetGenotypeFreq": 0.48059344, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.75910383, + "refHomGenotypeFreq": 0.5188071, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24958062, + "altHomGenotypeFreq": 0.0011183597, + "hetGenotypeFreq": 0.49692452, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.7504194, + "refHomGenotypeFreq": 0.5019571, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "7592", + "percentageMatch": 0.939484, + "source": "genomicSuperDup", + "start": 21896964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "10476", + "percentageMatch": 0.951332, + "source": "genomicSuperDup", + "start": 21896967 + } + ], + "start": 21903266, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21903266, + "id": "15:21903266:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21903266, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.12600000202655792, + "source": "gerp" + }, + { + "score": 0.1940000057220459, + "source": "phastCons" + }, + { + "score": -1.902999997138977, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.43000030517578125, + "source": "cadd_raw" + }, + { + "score": 0.33000001311302185, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4247065", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.8280047, + "altHomGenotypeFreq": 0.65607464, + "hetGenotypeFreq": 0.34386012, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.1719953, + "refHomGenotypeFreq": 6.52486E-5, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.77926075, + "altHomGenotypeFreq": 0.55852157, + "hetGenotypeFreq": 0.44147843, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.22073922, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7484316, + "altHomGenotypeFreq": 0.49686325, + "hetGenotypeFreq": 0.50313675, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.25156838, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8542169, + "altHomGenotypeFreq": 0.70843375, + "hetGenotypeFreq": 0.29156625, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.14578313, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7263514, + "altHomGenotypeFreq": 0.4527027, + "hetGenotypeFreq": 0.5472973, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.27364865, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7978538, + "altHomGenotypeFreq": 0.59570765, + "hetGenotypeFreq": 0.40429235, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.20214617, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7924324, + "altHomGenotypeFreq": 0.585, + "hetGenotypeFreq": 0.41486487, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.20756757, + "refHomGenotypeFreq": 1.3513514E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9213548, + "altHomGenotypeFreq": 0.84270954, + "hetGenotypeFreq": 0.15729047, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.07864524, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8302433, + "altHomGenotypeFreq": 0.66060466, + "hetGenotypeFreq": 0.33927727, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.16975673, + "refHomGenotypeFreq": 1.1809164E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8252406, + "altHomGenotypeFreq": 0.65048116, + "hetGenotypeFreq": 0.3495188, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.1747594, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8984375, + "altHomGenotypeFreq": 0.796875, + "hetGenotypeFreq": 0.203125, + "population": "MXL", + "refAllele": "G", + "refAlleleFreq": 0.1015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8596246, + "altHomGenotypeFreq": 0.7192492, + "hetGenotypeFreq": 0.2807508, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.1403754, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7801636, + "altHomGenotypeFreq": 0.5603272, + "hetGenotypeFreq": 0.4396728, + "population": "SAS", + "refAllele": "G", + "refAlleleFreq": 0.2198364, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8351064, + "altHomGenotypeFreq": 0.67021275, + "hetGenotypeFreq": 0.32978722, + "population": "CLM", + "refAllele": "G", + "refAlleleFreq": 0.16489361, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.75980395, + "altHomGenotypeFreq": 0.51960784, + "hetGenotypeFreq": 0.48039216, + "population": "ITU", + "refAllele": "G", + "refAlleleFreq": 0.24019608, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9621785, + "altHomGenotypeFreq": 0.92435706, + "hetGenotypeFreq": 0.075642966, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.037821483, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.81904763, + "altHomGenotypeFreq": 0.63809526, + "hetGenotypeFreq": 0.36190477, + "population": "CHS", + "refAllele": "G", + "refAlleleFreq": 0.18095239, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8942308, + "altHomGenotypeFreq": 0.78846157, + "hetGenotypeFreq": 0.21153846, + "population": "JPT", + "refAllele": "G", + "refAlleleFreq": 0.10576923, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9351852, + "altHomGenotypeFreq": 0.8703704, + "hetGenotypeFreq": 0.12962963, + "population": "YRI", + "refAllele": "G", + "refAlleleFreq": 0.06481481, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8072917, + "altHomGenotypeFreq": 0.6145833, + "hetGenotypeFreq": 0.3854167, + "population": "PJL", + "refAllele": "G", + "refAlleleFreq": 0.19270833, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9734513, + "altHomGenotypeFreq": 0.94690263, + "hetGenotypeFreq": 0.053097345, + "population": "GWD", + "refAllele": "G", + "refAlleleFreq": 0.026548672, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.75980395, + "altHomGenotypeFreq": 0.51960784, + "hetGenotypeFreq": 0.48039216, + "population": "STU", + "refAllele": "G", + "refAlleleFreq": 0.24019608, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7912088, + "altHomGenotypeFreq": 0.5824176, + "hetGenotypeFreq": 0.41758242, + "population": "GBR", + "refAllele": "G", + "refAlleleFreq": 0.20879121, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.76344085, + "altHomGenotypeFreq": 0.5268817, + "hetGenotypeFreq": 0.47311828, + "population": "CDX", + "refAllele": "G", + "refAlleleFreq": 0.23655914, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.77272725, + "altHomGenotypeFreq": 0.54545456, + "hetGenotypeFreq": 0.45454544, + "population": "KHV", + "refAllele": "G", + "refAlleleFreq": 0.22727273, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.80841124, + "altHomGenotypeFreq": 0.6168224, + "hetGenotypeFreq": 0.38317758, + "population": "IBS", + "refAllele": "G", + "refAlleleFreq": 0.19158879, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.7790698, + "altHomGenotypeFreq": 0.55813956, + "hetGenotypeFreq": 0.44186047, + "population": "BEB", + "refAllele": "G", + "refAlleleFreq": 0.22093023, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9427083, + "altHomGenotypeFreq": 0.8854167, + "hetGenotypeFreq": 0.11458333, + "population": "ACB", + "refAllele": "G", + "refAlleleFreq": 0.057291668, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.989899, + "altHomGenotypeFreq": 0.97979796, + "hetGenotypeFreq": 0.02020202, + "population": "ESN", + "refAllele": "G", + "refAlleleFreq": 0.01010101, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.97979796, + "altHomGenotypeFreq": 0.959596, + "hetGenotypeFreq": 0.04040404, + "population": "LWK", + "refAllele": "G", + "refAlleleFreq": 0.02020202, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8190855, + "altHomGenotypeFreq": 0.63817096, + "hetGenotypeFreq": 0.361829, + "population": "EUR", + "refAllele": "G", + "refAlleleFreq": 0.1809145, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.93442625, + "altHomGenotypeFreq": 0.86885244, + "hetGenotypeFreq": 0.13114753, + "population": "ASW", + "refAllele": "G", + "refAlleleFreq": 0.06557377, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.889049, + "altHomGenotypeFreq": 0.778098, + "hetGenotypeFreq": 0.22190201, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.11095101, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9705882, + "altHomGenotypeFreq": 0.9411765, + "hetGenotypeFreq": 0.05882353, + "population": "MSL", + "refAllele": "G", + "refAlleleFreq": 0.029411765, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.79611653, + "altHomGenotypeFreq": 0.592233, + "hetGenotypeFreq": 0.407767, + "population": "GIH", + "refAllele": "G", + "refAlleleFreq": 0.2038835, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.85858583, + "altHomGenotypeFreq": 0.7171717, + "hetGenotypeFreq": 0.28282827, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.14141414, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.77102804, + "altHomGenotypeFreq": 0.5420561, + "hetGenotypeFreq": 0.45794392, + "population": "TSI", + "refAllele": "G", + "refAlleleFreq": 0.22897196, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8942308, + "altHomGenotypeFreq": 0.78846157, + "hetGenotypeFreq": 0.21153846, + "population": "PUR", + "refAllele": "G", + "refAlleleFreq": 0.10576923, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.86868685, + "altHomGenotypeFreq": 0.7373737, + "hetGenotypeFreq": 0.26262626, + "population": "CEU", + "refAllele": "G", + "refAlleleFreq": 0.13131313, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.9352941, + "altHomGenotypeFreq": 0.87058824, + "hetGenotypeFreq": 0.12941177, + "population": "PEL", + "refAllele": "G", + "refAlleleFreq": 0.064705886, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.82242066, + "altHomGenotypeFreq": 0.64484125, + "hetGenotypeFreq": 0.35515875, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.17757936, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.8543689, + "altHomGenotypeFreq": 0.70873785, + "hetGenotypeFreq": 0.29126215, + "population": "CHB", + "refAllele": "G", + "refAlleleFreq": 0.14563107, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "7592", + "percentageMatch": 0.939484, + "source": "genomicSuperDup", + "start": 21896964 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21903486, + "id": "10476", + "percentageMatch": 0.951332, + "source": "genomicSuperDup", + "start": 21896967 + } + ], + "start": 21903477, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21903477, + "id": "15:21903477:G:T", + "length": 1, + "names": [], + "reference": "G", + "start": 21903477, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.05400000140070915, + "source": "phastCons" + }, + { + "score": 0.06300000101327896, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs59850291", + "populationFrequencies": [ + { + "altAllele": "", + "altAlleleFreq": 0.5781663, + "altHomGenotypeFreq": 0.15692756, + "hetGenotypeFreq": 0.8425436, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.42180064, + "refHomGenotypeFreq": 5.2882073E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.55925155, + "altHomGenotypeFreq": 0.118503116, + "hetGenotypeFreq": 0.8814969, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.44074845, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5855181, + "altHomGenotypeFreq": 0.1710362, + "hetGenotypeFreq": 0.8289638, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.4144819, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.60895884, + "altHomGenotypeFreq": 0.21791768, + "hetGenotypeFreq": 0.7820823, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.39104116, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.54642856, + "altHomGenotypeFreq": 0.092857145, + "hetGenotypeFreq": 0.9071429, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.45357144, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5514881, + "altHomGenotypeFreq": 0.10357143, + "hetGenotypeFreq": 0.8958333, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.4485119, + "refHomGenotypeFreq": 5.952381E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.56619567, + "altHomGenotypeFreq": 0.13348882, + "hetGenotypeFreq": 0.8655509, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.43373576, + "refHomGenotypeFreq": 9.603512E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6075393, + "altHomGenotypeFreq": 0.21507864, + "hetGenotypeFreq": 0.78492135, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.39246067, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.57884985, + "altHomGenotypeFreq": 0.15853658, + "hetGenotypeFreq": 0.84074605, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.4210904, + "refHomGenotypeFreq": 7.173601E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5773211, + "altHomGenotypeFreq": 0.15493791, + "hetGenotypeFreq": 0.84476644, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.4226789, + "refHomGenotypeFreq": 2.95683E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5625, + "altHomGenotypeFreq": 0.140625, + "hetGenotypeFreq": 0.84375, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.4375, + "refHomGenotypeFreq": 0.015625, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5545128, + "altHomGenotypeFreq": 0.153754, + "hetGenotypeFreq": 0.8015176, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.44548723, + "refHomGenotypeFreq": 0.044728436, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5173824, + "altHomGenotypeFreq": 0.096114516, + "hetGenotypeFreq": 0.8425358, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.4826176, + "refHomGenotypeFreq": 0.061349694, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5319149, + "altHomGenotypeFreq": 0.10638298, + "hetGenotypeFreq": 0.85106385, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.4680851, + "refHomGenotypeFreq": 0.04255319, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5294118, + "altHomGenotypeFreq": 0.12745099, + "hetGenotypeFreq": 0.8039216, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.47058824, + "refHomGenotypeFreq": 0.068627454, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.59077156, + "altHomGenotypeFreq": 0.19062027, + "hetGenotypeFreq": 0.80030257, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.40922844, + "refHomGenotypeFreq": 0.009077156, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.51428574, + "altHomGenotypeFreq": 0.114285715, + "hetGenotypeFreq": 0.8, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.4857143, + "refHomGenotypeFreq": 0.08571429, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6298077, + "altHomGenotypeFreq": 0.26923078, + "hetGenotypeFreq": 0.72115386, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.37019232, + "refHomGenotypeFreq": 0.009615385, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.6018519, + "altHomGenotypeFreq": 0.22222222, + "hetGenotypeFreq": 0.7592593, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.39814815, + "refHomGenotypeFreq": 0.018518519, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.515625, + "altHomGenotypeFreq": 0.09375, + "hetGenotypeFreq": 0.84375, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.484375, + "refHomGenotypeFreq": 0.0625, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.58849555, + "altHomGenotypeFreq": 0.18584071, + "hetGenotypeFreq": 0.8053098, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.41150442, + "refHomGenotypeFreq": 0.0088495575, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5245098, + "altHomGenotypeFreq": 0.0882353, + "hetGenotypeFreq": 0.87254906, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.47549018, + "refHomGenotypeFreq": 0.039215688, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.53296703, + "altHomGenotypeFreq": 0.13186814, + "hetGenotypeFreq": 0.8021978, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.46703297, + "refHomGenotypeFreq": 0.06593407, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5268817, + "altHomGenotypeFreq": 0.12903225, + "hetGenotypeFreq": 0.79569894, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.47311828, + "refHomGenotypeFreq": 0.07526882, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5151515, + "altHomGenotypeFreq": 0.07070707, + "hetGenotypeFreq": 0.8888889, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.4848485, + "refHomGenotypeFreq": 0.04040404, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.50934577, + "altHomGenotypeFreq": 0.13084112, + "hetGenotypeFreq": 0.7570094, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.4906542, + "refHomGenotypeFreq": 0.11214953, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.4883721, + "altHomGenotypeFreq": 0.058139537, + "hetGenotypeFreq": 0.8604651, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.5116279, + "refHomGenotypeFreq": 0.08139535, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5572917, + "altHomGenotypeFreq": 0.114583336, + "hetGenotypeFreq": 0.8854166, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.44270834, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5858586, + "altHomGenotypeFreq": 0.17171717, + "hetGenotypeFreq": 0.82828283, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.41414142, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.64646465, + "altHomGenotypeFreq": 0.3030303, + "hetGenotypeFreq": 0.68686867, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.35353535, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5198807, + "altHomGenotypeFreq": 0.12326044, + "hetGenotypeFreq": 0.79324055, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.4801193, + "refHomGenotypeFreq": 0.08349901, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.58196723, + "altHomGenotypeFreq": 0.16393442, + "hetGenotypeFreq": 0.83606553, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.4180328, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5878962, + "altHomGenotypeFreq": 0.2074928, + "hetGenotypeFreq": 0.7608069, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.41210374, + "refHomGenotypeFreq": 0.031700287, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5647059, + "altHomGenotypeFreq": 0.15294118, + "hetGenotypeFreq": 0.8235295, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.43529412, + "refHomGenotypeFreq": 0.023529412, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.52427185, + "altHomGenotypeFreq": 0.106796116, + "hetGenotypeFreq": 0.83495146, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.47572815, + "refHomGenotypeFreq": 0.058252428, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.52020204, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.7777778, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.479798, + "refHomGenotypeFreq": 0.09090909, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5, + "altHomGenotypeFreq": 0.093457945, + "hetGenotypeFreq": 0.8130841, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.5, + "refHomGenotypeFreq": 0.093457945, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5673077, + "altHomGenotypeFreq": 0.1923077, + "hetGenotypeFreq": 0.75, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.43269232, + "refHomGenotypeFreq": 0.057692308, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.540404, + "altHomGenotypeFreq": 0.13131313, + "hetGenotypeFreq": 0.8181818, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.45959595, + "refHomGenotypeFreq": 0.05050505, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.69411767, + "altHomGenotypeFreq": 0.3882353, + "hetGenotypeFreq": 0.6117647, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.30588236, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.55456346, + "altHomGenotypeFreq": 0.15476191, + "hetGenotypeFreq": 0.7996032, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.4454365, + "refHomGenotypeFreq": 0.04563492, + "study": "1kG_phase3" + }, + { + "altAllele": "", + "altAlleleFreq": 0.5825243, + "altHomGenotypeFreq": 0.18446602, + "hetGenotypeFreq": 0.7961165, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.41747573, + "refHomGenotypeFreq": 0.019417476, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10349", + "percentageMatch": 0.909996, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10848", + "percentageMatch": 0.905631, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10350", + "percentageMatch": 0.91345, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10348", + "percentageMatch": 0.905135, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906111, + "id": "10351", + "percentageMatch": 0.908065, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10570", + "percentageMatch": 0.908949, + "source": "genomicSuperDup", + "start": 21903488 + } + ], + "start": 21903812, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21903812, + "id": "15:21903812:A:-", + "length": 1, + "names": [], + "reference": "A", + "start": 21903812, + "strand": "+", + "studies": [], + "type": "INDEL" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.026000000536441803, + "source": "phastCons" + }, + { + "score": -1.9730000495910645, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 1.4900000095367432, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs8025343", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.53876406, + "altHomGenotypeFreq": 0.09193655, + "hetGenotypeFreq": 0.893655, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.46123594, + "refHomGenotypeFreq": 0.01440846, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53586495, + "altHomGenotypeFreq": 0.0907173, + "hetGenotypeFreq": 0.8902954, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.46413502, + "refHomGenotypeFreq": 0.01898734, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.56398994, + "altHomGenotypeFreq": 0.13299875, + "hetGenotypeFreq": 0.8619824, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.43601003, + "refHomGenotypeFreq": 0.0050188205, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.532767, + "altHomGenotypeFreq": 0.08009709, + "hetGenotypeFreq": 0.9053398, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.467233, + "refHomGenotypeFreq": 0.014563107, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.53, + "altHomGenotypeFreq": 0.07333333, + "hetGenotypeFreq": 0.91333336, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.47, + "refHomGenotypeFreq": 0.013333334, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.54979616, + "altHomGenotypeFreq": 0.11182295, + "hetGenotypeFreq": 0.8759464, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.45020384, + "refHomGenotypeFreq": 0.012230635, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5380524, + "altHomGenotypeFreq": 0.08715221, + "hetGenotypeFreq": 0.90180033, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.46194762, + "refHomGenotypeFreq": 0.011047463, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5320151, + "altHomGenotypeFreq": 0.086393595, + "hetGenotypeFreq": 0.8912429, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.46798494, + "refHomGenotypeFreq": 0.022363465, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5386407, + "altHomGenotypeFreq": 0.09233158, + "hetGenotypeFreq": 0.89261824, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.4613593, + "refHomGenotypeFreq": 0.015050167, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5389168, + "altHomGenotypeFreq": 0.091447175, + "hetGenotypeFreq": 0.8949393, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.46108317, + "refHomGenotypeFreq": 0.013613495, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.26404494, + "altHomGenotypeFreq": 0.059925094, + "hetGenotypeFreq": 0.4082397, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.73595506, + "refHomGenotypeFreq": 0.5318352, + "study": "MGP" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10848", + "percentageMatch": 0.905631, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10570", + "percentageMatch": 0.908949, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10349", + "percentageMatch": 0.909996, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10348", + "percentageMatch": 0.905135, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906111, + "id": "10351", + "percentageMatch": 0.908065, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10350", + "percentageMatch": 0.91345, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10964", + "percentageMatch": 0.910746, + "source": "genomicSuperDup", + "start": 21903834 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10963", + "percentageMatch": 0.908848, + "source": "genomicSuperDup", + "start": 21903834 + } + ], + "start": 21903842, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21903842, + "id": "15:21903842:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21903842, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.36500000953674316, + "source": "phastCons" + }, + { + "score": 0.06300000101327896, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 1.0800000429153442, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs8030669", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.41907513, + "altHomGenotypeFreq": 0.016878612, + "hetGenotypeFreq": 0.80439305, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.58092487, + "refHomGenotypeFreq": 0.17872833, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.37468356, + "altHomGenotypeFreq": 0.0075949365, + "hetGenotypeFreq": 0.73417723, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.62531644, + "refHomGenotypeFreq": 0.25822785, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.46901408, + "altHomGenotypeFreq": 0.01971831, + "hetGenotypeFreq": 0.8985916, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5309859, + "refHomGenotypeFreq": 0.08169014, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.42732558, + "altHomGenotypeFreq": 0.011627907, + "hetGenotypeFreq": 0.8313953, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.5726744, + "refHomGenotypeFreq": 0.15697674, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31512606, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6302521, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.68487394, + "refHomGenotypeFreq": 0.3697479, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38439512, + "altHomGenotypeFreq": 0.005010737, + "hetGenotypeFreq": 0.7587688, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.6156049, + "refHomGenotypeFreq": 0.23622048, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3774829, + "altHomGenotypeFreq": 0.0036721749, + "hetGenotypeFreq": 0.7476214, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.6225171, + "refHomGenotypeFreq": 0.24870639, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.49104255, + "altHomGenotypeFreq": 0.04205026, + "hetGenotypeFreq": 0.89798456, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.50895745, + "refHomGenotypeFreq": 0.059965167, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.4193347, + "altHomGenotypeFreq": 0.015661815, + "hetGenotypeFreq": 0.8073458, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.5806653, + "refHomGenotypeFreq": 0.17699237, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41875, + "altHomGenotypeFreq": 0.018402778, + "hetGenotypeFreq": 0.80069447, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.58125, + "refHomGenotypeFreq": 0.18090278, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.06367041, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.12734082, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9363296, + "refHomGenotypeFreq": 0.87265915, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10848", + "percentageMatch": 0.905631, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10570", + "percentageMatch": 0.908949, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10349", + "percentageMatch": 0.909996, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10348", + "percentageMatch": 0.905135, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906111, + "id": "10351", + "percentageMatch": 0.908065, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10350", + "percentageMatch": 0.91345, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10964", + "percentageMatch": 0.910746, + "source": "genomicSuperDup", + "start": 21903834 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10963", + "percentageMatch": 0.908848, + "source": "genomicSuperDup", + "start": 21903834 + } + ], + "start": 21903929, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21903929, + "id": "15:21903929:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21903929, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.07999999821186066, + "source": "phastCons" + }, + { + "score": 0.07400000095367432, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.10000038146972656, + "source": "cadd_raw" + }, + { + "score": 1.7699999809265137, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs28417205", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.35706678, + "altHomGenotypeFreq": 0.0027038099, + "hetGenotypeFreq": 0.7087259, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.64293325, + "refHomGenotypeFreq": 0.28857026, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36010364, + "altHomGenotypeFreq": 0.0025906735, + "hetGenotypeFreq": 0.7150259, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.6398964, + "refHomGenotypeFreq": 0.2823834, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3980424, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7960848, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.60195756, + "refHomGenotypeFreq": 0.20391516, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.419403, + "altHomGenotypeFreq": 0.0059701493, + "hetGenotypeFreq": 0.8268657, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.58059704, + "refHomGenotypeFreq": 0.16716418, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35840708, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.71681416, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.6415929, + "refHomGenotypeFreq": 0.28318584, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36129507, + "altHomGenotypeFreq": 0.0029433407, + "hetGenotypeFreq": 0.7167035, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.63870496, + "refHomGenotypeFreq": 0.2803532, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.384538, + "altHomGenotypeFreq": 0.0033540165, + "hetGenotypeFreq": 0.76236796, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.615462, + "refHomGenotypeFreq": 0.23427805, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.29394644, + "altHomGenotypeFreq": 0.0017462166, + "hetGenotypeFreq": 0.5844005, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.70605356, + "refHomGenotypeFreq": 0.41385332, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.35392013, + "altHomGenotypeFreq": 0.0032544378, + "hetGenotypeFreq": 0.7013314, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.6460799, + "refHomGenotypeFreq": 0.2954142, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.36097336, + "altHomGenotypeFreq": 0.002020202, + "hetGenotypeFreq": 0.71790636, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.63902664, + "refHomGenotypeFreq": 0.28007346, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.08052435, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1610487, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.9194757, + "refHomGenotypeFreq": 0.8389513, + "study": "MGP" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10848", + "percentageMatch": 0.905631, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10570", + "percentageMatch": 0.908949, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10349", + "percentageMatch": 0.909996, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10348", + "percentageMatch": 0.905135, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906111, + "id": "10351", + "percentageMatch": 0.908065, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10350", + "percentageMatch": 0.91345, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10964", + "percentageMatch": 0.910746, + "source": "genomicSuperDup", + "start": 21903834 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10963", + "percentageMatch": 0.908848, + "source": "genomicSuperDup", + "start": 21903834 + } + ], + "start": 21904049, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21904049, + "id": "15:21904049:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 21904049, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.041999999433755875, + "source": "phastCons" + }, + { + "score": 0.07400000095367432, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.1400003433227539, + "source": "cadd_raw" + }, + { + "score": 1.4600000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs56038907", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.3297951, + "altHomGenotypeFreq": 0.001557377, + "hetGenotypeFreq": 0.6564754, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.67020494, + "refHomGenotypeFreq": 0.34196723, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28457448, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.56914896, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.71542555, + "refHomGenotypeFreq": 0.43085107, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3069728, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6139456, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6930272, + "refHomGenotypeFreq": 0.38605443, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36253777, + "altHomGenotypeFreq": 0.003021148, + "hetGenotypeFreq": 0.71903324, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.63746226, + "refHomGenotypeFreq": 0.2779456, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2584746, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5169492, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.7415254, + "refHomGenotypeFreq": 0.48305085, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29807693, + "altHomGenotypeFreq": 0.0023076923, + "hetGenotypeFreq": 0.5915385, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.7019231, + "refHomGenotypeFreq": 0.40615386, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30355296, + "altHomGenotypeFreq": 8.6236635E-4, + "hetGenotypeFreq": 0.6053812, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.6964471, + "refHomGenotypeFreq": 0.39375648, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38980752, + "altHomGenotypeFreq": 0.0027107617, + "hetGenotypeFreq": 0.7741935, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.6101925, + "refHomGenotypeFreq": 0.22309569, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32745647, + "altHomGenotypeFreq": 0.001032753, + "hetGenotypeFreq": 0.65284747, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.6725435, + "refHomGenotypeFreq": 0.3461198, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33271855, + "altHomGenotypeFreq": 0.0022132054, + "hetGenotypeFreq": 0.6610107, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.66728145, + "refHomGenotypeFreq": 0.3367761, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3359375, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.671875, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.6640625, + "refHomGenotypeFreq": 0.328125, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35363418, + "altHomGenotypeFreq": 0.0019968052, + "hetGenotypeFreq": 0.7032747, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.6463658, + "refHomGenotypeFreq": 0.29472843, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3210634, + "altHomGenotypeFreq": 0.0040899795, + "hetGenotypeFreq": 0.63394684, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.6789366, + "refHomGenotypeFreq": 0.36196318, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36702126, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7340425, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.63297874, + "refHomGenotypeFreq": 0.26595744, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3137255, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.627451, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.6862745, + "refHomGenotypeFreq": 0.37254903, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3880484, + "altHomGenotypeFreq": 0.0015128592, + "hetGenotypeFreq": 0.7730711, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.6119516, + "refHomGenotypeFreq": 0.22541603, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34761906, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6952381, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.65238094, + "refHomGenotypeFreq": 0.30476192, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39423078, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.78846157, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.6057692, + "refHomGenotypeFreq": 0.21153846, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.37962964, + "altHomGenotypeFreq": 0.009259259, + "hetGenotypeFreq": 0.7407408, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.6203704, + "refHomGenotypeFreq": 0.25, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35416666, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.6875, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.6458333, + "refHomGenotypeFreq": 0.30208334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39823008, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.79646015, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.6017699, + "refHomGenotypeFreq": 0.20353982, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30392158, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.60784316, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.6960784, + "refHomGenotypeFreq": 0.39215687, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.32417583, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.64835167, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.67582417, + "refHomGenotypeFreq": 0.35164836, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3548387, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.70967746, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.6451613, + "refHomGenotypeFreq": 0.29032257, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35353535, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7070707, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.64646465, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36915886, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7383177, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.63084114, + "refHomGenotypeFreq": 0.26168224, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33139536, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.66279066, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.6686047, + "refHomGenotypeFreq": 0.3372093, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.38020834, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7604166, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.6197917, + "refHomGenotypeFreq": 0.23958333, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.41919193, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.83838385, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.5808081, + "refHomGenotypeFreq": 0.16161616, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.33838382, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6767677, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.66161615, + "refHomGenotypeFreq": 0.32323232, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34095427, + "altHomGenotypeFreq": 0.0019880715, + "hetGenotypeFreq": 0.6779324, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.6590457, + "refHomGenotypeFreq": 0.32007954, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.39344263, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.78688526, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.60655737, + "refHomGenotypeFreq": 0.21311475, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3429395, + "altHomGenotypeFreq": 0.0028818443, + "hetGenotypeFreq": 0.6801153, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.6570605, + "refHomGenotypeFreq": 0.3170029, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.4117647, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.8235295, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.5882353, + "refHomGenotypeFreq": 0.1764706, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30582523, + "altHomGenotypeFreq": 0.009708738, + "hetGenotypeFreq": 0.592233, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.69417477, + "refHomGenotypeFreq": 0.39805827, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3131313, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.6060606, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.68686867, + "refHomGenotypeFreq": 0.3838384, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3411215, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.682243, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.6588785, + "refHomGenotypeFreq": 0.317757, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31730768, + "altHomGenotypeFreq": 0.009615385, + "hetGenotypeFreq": 0.6153846, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.6826923, + "refHomGenotypeFreq": 0.375, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.35353535, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7070707, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.64646465, + "refHomGenotypeFreq": 0.2929293, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.3529412, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7058824, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.64705884, + "refHomGenotypeFreq": 0.29411766, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.36011904, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.7202381, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.63988096, + "refHomGenotypeFreq": 0.2797619, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34951457, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6990291, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.65048546, + "refHomGenotypeFreq": 0.30097088, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.054307114, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.10861423, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.9456929, + "refHomGenotypeFreq": 0.8913858, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10848", + "percentageMatch": 0.905631, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10570", + "percentageMatch": 0.908949, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10349", + "percentageMatch": 0.909996, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10348", + "percentageMatch": 0.905135, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906111, + "id": "10351", + "percentageMatch": 0.908065, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10350", + "percentageMatch": 0.91345, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10964", + "percentageMatch": 0.910746, + "source": "genomicSuperDup", + "start": 21903834 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10963", + "percentageMatch": 0.908848, + "source": "genomicSuperDup", + "start": 21903834 + } + ], + "start": 21904078, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21904078, + "id": "15:21904078:C:G", + "length": 1, + "names": [], + "reference": "C", + "start": 21904078, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.18400000035762787, + "source": "phastCons" + }, + { + "score": 0.07400000095367432, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.029999732971191406, + "source": "cadd_raw" + }, + { + "score": 2.950000047683716, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4591094", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.41745958, + "altHomGenotypeFreq": 0.015084706, + "hetGenotypeFreq": 0.8047497, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.5825404, + "refHomGenotypeFreq": 0.18016554, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38395062, + "altHomGenotypeFreq": 0.004938272, + "hetGenotypeFreq": 0.7580247, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.6160494, + "refHomGenotypeFreq": 0.23703703, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4732017, + "altHomGenotypeFreq": 0.019746121, + "hetGenotypeFreq": 0.90691113, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.5267983, + "refHomGenotypeFreq": 0.07334273, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.42329547, + "altHomGenotypeFreq": 0.011363637, + "hetGenotypeFreq": 0.8238636, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.57670456, + "refHomGenotypeFreq": 0.16477273, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30932203, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.61864406, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.69067794, + "refHomGenotypeFreq": 0.38135594, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38610315, + "altHomGenotypeFreq": 0.0050143264, + "hetGenotypeFreq": 0.76217765, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.61389685, + "refHomGenotypeFreq": 0.23280802, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.37827903, + "altHomGenotypeFreq": 0.0036758564, + "hetGenotypeFreq": 0.74920636, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.62172097, + "refHomGenotypeFreq": 0.24711779, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.48384655, + "altHomGenotypeFreq": 0.036850076, + "hetGenotypeFreq": 0.89399296, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.51615345, + "refHomGenotypeFreq": 0.06915699, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4176626, + "altHomGenotypeFreq": 0.013062812, + "hetGenotypeFreq": 0.8091996, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.58233744, + "refHomGenotypeFreq": 0.17773764, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.41720468, + "altHomGenotypeFreq": 0.01762345, + "hetGenotypeFreq": 0.79916245, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.5827953, + "refHomGenotypeFreq": 0.1832141, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.06554307, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.11610487, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.93445694, + "refHomGenotypeFreq": 0.8764045, + "study": "MGP" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10848", + "percentageMatch": 0.905631, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10570", + "percentageMatch": 0.908949, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10349", + "percentageMatch": 0.909996, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10348", + "percentageMatch": 0.905135, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906111, + "id": "10351", + "percentageMatch": 0.908065, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10350", + "percentageMatch": 0.91345, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10964", + "percentageMatch": 0.910746, + "source": "genomicSuperDup", + "start": 21903834 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10963", + "percentageMatch": 0.908848, + "source": "genomicSuperDup", + "start": 21903834 + } + ], + "start": 21904262, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21904262, + "id": "15:21904262:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21904262, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.2720000147819519, + "source": "phastCons" + }, + { + "score": 0.06300000101327896, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.3100004196166992, + "source": "cadd_raw" + }, + { + "score": 0.6299999952316284, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4271559", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.41886762, + "altHomGenotypeFreq": 0.01556812, + "hetGenotypeFreq": 0.8076059, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.58062893, + "refHomGenotypeFreq": 0.17682596, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.3825, + "altHomGenotypeFreq": 0.005, + "hetGenotypeFreq": 0.755, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.6175, + "refHomGenotypeFreq": 0.24, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.47517732, + "altHomGenotypeFreq": 0.019858155, + "hetGenotypeFreq": 0.9106383, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.5248227, + "refHomGenotypeFreq": 0.069503546, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.421875, + "altHomGenotypeFreq": 0.011363637, + "hetGenotypeFreq": 0.82102275, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.578125, + "refHomGenotypeFreq": 0.16761364, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.31355932, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.62711865, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.6864407, + "refHomGenotypeFreq": 0.37288135, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38864627, + "altHomGenotypeFreq": 0.0050946143, + "hetGenotypeFreq": 0.7671034, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.6113537, + "refHomGenotypeFreq": 0.22780204, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.38031694, + "altHomGenotypeFreq": 0.0038365305, + "hetGenotypeFreq": 0.7529608, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.6196831, + "refHomGenotypeFreq": 0.24320267, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.48411897, + "altHomGenotypeFreq": 0.038064025, + "hetGenotypeFreq": 0.89538693, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.51424253, + "refHomGenotypeFreq": 0.06654903, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41882303, + "altHomGenotypeFreq": 0.013494713, + "hetGenotypeFreq": 0.8114914, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.5807596, + "refHomGenotypeFreq": 0.17501391, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.41892365, + "altHomGenotypeFreq": 0.018172288, + "hetGenotypeFreq": 0.80272585, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.5804648, + "refHomGenotypeFreq": 0.17910187, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.052434456, + "altHomGenotypeFreq": 0.007490637, + "hetGenotypeFreq": 0.08988764, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.94756556, + "refHomGenotypeFreq": 0.90262175, + "study": "MGP" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10848", + "percentageMatch": 0.905631, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10570", + "percentageMatch": 0.908949, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10349", + "percentageMatch": 0.909996, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10348", + "percentageMatch": 0.905135, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906111, + "id": "10351", + "percentageMatch": 0.908065, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10350", + "percentageMatch": 0.91345, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10964", + "percentageMatch": 0.910746, + "source": "genomicSuperDup", + "start": 21903834 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10963", + "percentageMatch": 0.908848, + "source": "genomicSuperDup", + "start": 21903834 + } + ], + "start": 21904323, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21904323, + "id": "15:21904323:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21904323, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.4580000042915344, + "source": "phastCons" + }, + { + "score": 0.06300000101327896, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": -0.21000003814697266, + "source": "cadd_raw" + }, + { + "score": 1.0800000429153442, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4271558", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.82146835, + "altHomGenotypeFreq": 0.64306766, + "hetGenotypeFreq": 0.35686687, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.17849892, + "refHomGenotypeFreq": 6.5492175E-5, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77868855, + "altHomGenotypeFreq": 0.55737704, + "hetGenotypeFreq": 0.44262296, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.22131148, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75188917, + "altHomGenotypeFreq": 0.50377834, + "hetGenotypeFreq": 0.49622166, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.24811083, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8566265, + "altHomGenotypeFreq": 0.713253, + "hetGenotypeFreq": 0.28674698, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.14337349, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7266667, + "altHomGenotypeFreq": 0.45333335, + "hetGenotypeFreq": 0.5466667, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.27333334, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.79231656, + "altHomGenotypeFreq": 0.5846332, + "hetGenotypeFreq": 0.41536683, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.20768341, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78771216, + "altHomGenotypeFreq": 0.5755601, + "hetGenotypeFreq": 0.42430413, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.21228784, + "refHomGenotypeFreq": 1.3577733E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9081137, + "altHomGenotypeFreq": 0.8164586, + "hetGenotypeFreq": 0.18354137, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.091770686, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8232789, + "altHomGenotypeFreq": 0.6466761, + "hetGenotypeFreq": 0.3532056, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.17672108, + "refHomGenotypeFreq": 1.182872E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81922233, + "altHomGenotypeFreq": 0.63859135, + "hetGenotypeFreq": 0.36140865, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.18070433, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9609375, + "altHomGenotypeFreq": 0.921875, + "hetGenotypeFreq": 0.078125, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.0390625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.90634984, + "altHomGenotypeFreq": 0.8126997, + "hetGenotypeFreq": 0.18730032, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.09365016, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84458077, + "altHomGenotypeFreq": 0.68916154, + "hetGenotypeFreq": 0.31083846, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.15541922, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.89893615, + "altHomGenotypeFreq": 0.79787236, + "hetGenotypeFreq": 0.20212767, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.10106383, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84313726, + "altHomGenotypeFreq": 0.6862745, + "hetGenotypeFreq": 0.3137255, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.15686275, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.96066564, + "altHomGenotypeFreq": 0.9213313, + "hetGenotypeFreq": 0.078668684, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.039334342, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8666667, + "altHomGenotypeFreq": 0.73333335, + "hetGenotypeFreq": 0.26666668, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.13333334, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.92788464, + "altHomGenotypeFreq": 0.8557692, + "hetGenotypeFreq": 0.14423078, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.072115384, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8697917, + "altHomGenotypeFreq": 0.7395833, + "hetGenotypeFreq": 0.2604167, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.13020833, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.960177, + "altHomGenotypeFreq": 0.920354, + "hetGenotypeFreq": 0.07964602, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.03982301, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8088235, + "altHomGenotypeFreq": 0.61764705, + "hetGenotypeFreq": 0.38235295, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.19117647, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9010989, + "altHomGenotypeFreq": 0.8021978, + "hetGenotypeFreq": 0.1978022, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.0989011, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8817204, + "altHomGenotypeFreq": 0.76344085, + "hetGenotypeFreq": 0.23655914, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.11827957, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8888889, + "altHomGenotypeFreq": 0.7777778, + "hetGenotypeFreq": 0.22222222, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.11111111, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.864486, + "altHomGenotypeFreq": 0.72897196, + "hetGenotypeFreq": 0.27102804, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.13551402, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.84302324, + "altHomGenotypeFreq": 0.68604654, + "hetGenotypeFreq": 0.3139535, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.15697674, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.953125, + "altHomGenotypeFreq": 0.90625, + "hetGenotypeFreq": 0.09375, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.046875, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9747475, + "altHomGenotypeFreq": 0.94949496, + "hetGenotypeFreq": 0.05050505, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.025252525, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9747475, + "altHomGenotypeFreq": 0.94949496, + "hetGenotypeFreq": 0.05050505, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.025252525, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88469183, + "altHomGenotypeFreq": 0.76938367, + "hetGenotypeFreq": 0.2306163, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.11530815, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9508197, + "altHomGenotypeFreq": 0.90163934, + "hetGenotypeFreq": 0.09836065, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.04918033, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9351585, + "altHomGenotypeFreq": 0.870317, + "hetGenotypeFreq": 0.12968299, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.0648415, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9647059, + "altHomGenotypeFreq": 0.92941177, + "hetGenotypeFreq": 0.07058824, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.03529412, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8592233, + "altHomGenotypeFreq": 0.7184466, + "hetGenotypeFreq": 0.2815534, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.1407767, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.88383836, + "altHomGenotypeFreq": 0.7676768, + "hetGenotypeFreq": 0.23232323, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.116161615, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8364486, + "altHomGenotypeFreq": 0.6728972, + "hetGenotypeFreq": 0.32710278, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.1635514, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9326923, + "altHomGenotypeFreq": 0.86538464, + "hetGenotypeFreq": 0.13461539, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.067307696, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9444444, + "altHomGenotypeFreq": 0.8888889, + "hetGenotypeFreq": 0.11111111, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.055555556, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9588235, + "altHomGenotypeFreq": 0.91764706, + "hetGenotypeFreq": 0.08235294, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.04117647, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8968254, + "altHomGenotypeFreq": 0.7936508, + "hetGenotypeFreq": 0.20634921, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.103174604, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.9174757, + "altHomGenotypeFreq": 0.83495146, + "hetGenotypeFreq": 0.16504854, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.08252427, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10848", + "percentageMatch": 0.905631, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10570", + "percentageMatch": 0.908949, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10349", + "percentageMatch": 0.909996, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10348", + "percentageMatch": 0.905135, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906111, + "id": "10351", + "percentageMatch": 0.908065, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10350", + "percentageMatch": 0.91345, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10964", + "percentageMatch": 0.910746, + "source": "genomicSuperDup", + "start": 21903834 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10963", + "percentageMatch": 0.908848, + "source": "genomicSuperDup", + "start": 21903834 + } + ], + "start": 21904594, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21904594, + "id": "15:21904594:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21904594, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "biotype": "unprocessed_pseudogene", + "ensemblGeneId": "ENSG00000258883", + "ensemblTranscriptId": "ENST00000555285", + "geneName": "RP11-32B5.2", + "sequenceOntologyTerms": [ + { + "accession": "SO:0001636", + "name": "2KB_upstream_variant" + } + ], + "strand": "-", + "transcriptAnnotationFlags": [ + "basic" + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.2759999930858612, + "source": "phastCons" + }, + { + "score": 0.07400000095367432, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "2KB_upstream_variant", + "functionalScore": [ + { + "score": 0.06000041961669922, + "source": "cadd_raw" + }, + { + "score": 3.2100000381469727, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs2880750", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.2969402, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5938804, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7030598, + "refHomGenotypeFreq": 0.4061196, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31505102, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.63010204, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.684949, + "refHomGenotypeFreq": 0.36989796, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32792208, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.65584415, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.6720779, + "refHomGenotypeFreq": 0.34415585, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25887573, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.51775146, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.7411243, + "refHomGenotypeFreq": 0.4822485, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3237705, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.647541, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.67622954, + "refHomGenotypeFreq": 0.352459, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.34079602, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.68159205, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.659204, + "refHomGenotypeFreq": 0.31840795, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30063716, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6012743, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.6993628, + "refHomGenotypeFreq": 0.3987257, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26728722, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.53457445, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.73271275, + "refHomGenotypeFreq": 0.46542552, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29466012, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.58932024, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.70533985, + "refHomGenotypeFreq": 0.41067976, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.29972726, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5994545, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.70027274, + "refHomGenotypeFreq": 0.40054545, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.375, + "population": "MXL", + "refAllele": "C", + "refAlleleFreq": 0.8125, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22963259, + "altHomGenotypeFreq": 0.0019968052, + "hetGenotypeFreq": 0.45527154, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.7703674, + "refHomGenotypeFreq": 0.54273164, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30777097, + "altHomGenotypeFreq": 0.0020449897, + "hetGenotypeFreq": 0.611452, + "population": "SAS", + "refAllele": "C", + "refAlleleFreq": 0.69222903, + "refHomGenotypeFreq": 0.38650307, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17021276, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.34042552, + "population": "CLM", + "refAllele": "C", + "refAlleleFreq": 0.82978725, + "refHomGenotypeFreq": 0.65957445, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30392158, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.60784316, + "population": "ITU", + "refAllele": "C", + "refAlleleFreq": 0.6960784, + "refHomGenotypeFreq": 0.39215687, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16717096, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3343419, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.83282906, + "refHomGenotypeFreq": 0.6656581, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26666668, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.53333336, + "population": "CHS", + "refAllele": "C", + "refAlleleFreq": 0.73333335, + "refHomGenotypeFreq": 0.46666667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.22115384, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4423077, + "population": "JPT", + "refAllele": "C", + "refAlleleFreq": 0.77884614, + "refHomGenotypeFreq": 0.5576923, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.14814815, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.2962963, + "population": "YRI", + "refAllele": "C", + "refAlleleFreq": 0.8518519, + "refHomGenotypeFreq": 0.7037037, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.31770834, + "altHomGenotypeFreq": 0.010416667, + "hetGenotypeFreq": 0.6145834, + "population": "PJL", + "refAllele": "C", + "refAlleleFreq": 0.6822917, + "refHomGenotypeFreq": 0.375, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17256637, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.34513274, + "population": "GWD", + "refAllele": "C", + "refAlleleFreq": 0.82743365, + "refHomGenotypeFreq": 0.65486723, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30882353, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.61764705, + "population": "STU", + "refAllele": "C", + "refAlleleFreq": 0.6911765, + "refHomGenotypeFreq": 0.38235295, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.23076923, + "altHomGenotypeFreq": 0.010989011, + "hetGenotypeFreq": 0.43956047, + "population": "GBR", + "refAllele": "C", + "refAlleleFreq": 0.7692308, + "refHomGenotypeFreq": 0.5494506, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28494623, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5698925, + "population": "CDX", + "refAllele": "C", + "refAlleleFreq": 0.71505374, + "refHomGenotypeFreq": 0.43010753, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.30808082, + "altHomGenotypeFreq": 0.01010101, + "hetGenotypeFreq": 0.5959596, + "population": "KHV", + "refAllele": "C", + "refAlleleFreq": 0.6919192, + "refHomGenotypeFreq": 0.3939394, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20560747, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.41121495, + "population": "IBS", + "refAllele": "C", + "refAlleleFreq": 0.7943925, + "refHomGenotypeFreq": 0.58878505, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.3139535, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.627907, + "population": "BEB", + "refAllele": "C", + "refAlleleFreq": 0.68604654, + "refHomGenotypeFreq": 0.37209302, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.19791667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.39583334, + "population": "ACB", + "refAllele": "C", + "refAlleleFreq": 0.8020833, + "refHomGenotypeFreq": 0.6041667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.16666667, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3333333, + "population": "ESN", + "refAllele": "C", + "refAlleleFreq": 0.8333333, + "refHomGenotypeFreq": 0.6666667, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.12626262, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.25252524, + "population": "LWK", + "refAllele": "C", + "refAlleleFreq": 0.8737374, + "refHomGenotypeFreq": 0.74747473, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24353877, + "altHomGenotypeFreq": 0.005964215, + "hetGenotypeFreq": 0.4751491, + "population": "EUR", + "refAllele": "C", + "refAlleleFreq": 0.7564612, + "refHomGenotypeFreq": 0.5188867, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.20491803, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.40983605, + "population": "ASW", + "refAllele": "C", + "refAlleleFreq": 0.795082, + "refHomGenotypeFreq": 0.59016395, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.15994236, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.31988472, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.8400576, + "refHomGenotypeFreq": 0.6801153, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17058824, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.34117648, + "population": "MSL", + "refAllele": "C", + "refAlleleFreq": 0.82941175, + "refHomGenotypeFreq": 0.65882355, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.2961165, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.592233, + "population": "GIH", + "refAllele": "C", + "refAlleleFreq": 0.70388347, + "refHomGenotypeFreq": 0.407767, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.25252524, + "altHomGenotypeFreq": 0.02020202, + "hetGenotypeFreq": 0.46464646, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.74747473, + "refHomGenotypeFreq": 0.5151515, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.24299066, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4859813, + "population": "TSI", + "refAllele": "C", + "refAlleleFreq": 0.7570093, + "refHomGenotypeFreq": 0.5140187, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.1875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.375, + "population": "PUR", + "refAllele": "C", + "refAlleleFreq": 0.8125, + "refHomGenotypeFreq": 0.625, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.28787878, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.57575756, + "population": "CEU", + "refAllele": "C", + "refAlleleFreq": 0.7121212, + "refHomGenotypeFreq": 0.42424244, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.09411765, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.1882353, + "population": "PEL", + "refAllele": "C", + "refAlleleFreq": 0.90588236, + "refHomGenotypeFreq": 0.8117647, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.26984128, + "altHomGenotypeFreq": 0.001984127, + "hetGenotypeFreq": 0.53571427, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.73015875, + "refHomGenotypeFreq": 0.46230158, + "study": "1kG_phase3" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.27184466, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.54368937, + "population": "CHB", + "refAllele": "C", + "refAlleleFreq": 0.7281553, + "refHomGenotypeFreq": 0.4563107, + "study": "1kG_phase3" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10848", + "percentageMatch": 0.905631, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10570", + "percentageMatch": 0.908949, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10349", + "percentageMatch": 0.909996, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906157, + "id": "10348", + "percentageMatch": 0.905135, + "source": "genomicSuperDup", + "start": 21903488 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906111, + "id": "10351", + "percentageMatch": 0.908065, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906179, + "id": "10350", + "percentageMatch": 0.91345, + "source": "genomicSuperDup", + "start": 21903491 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10964", + "percentageMatch": 0.910746, + "source": "genomicSuperDup", + "start": 21903834 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21906110, + "id": "10963", + "percentageMatch": 0.908848, + "source": "genomicSuperDup", + "start": 21903834 + } + ], + "start": 21904789, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21904789, + "id": "15:21904789:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21904789, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 1.4299999475479126, + "source": "gerp" + }, + { + "score": 0.012000000104308128, + "source": "phastCons" + }, + { + "score": 0.1720000058412552, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 0.28999996185302734, + "source": "cadd_raw" + }, + { + "score": 5.610000133514404, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.02444659, + "altHomGenotypeFreq": 6.896076E-5, + "hetGenotypeFreq": 0.04875526, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.9755534, + "refHomGenotypeFreq": 0.9511758, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.029867256, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.059734512, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.97013277, + "refHomGenotypeFreq": 0.9402655, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.022670025, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.04534005, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.97732997, + "refHomGenotypeFreq": 0.95465994, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.049242426, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.09848485, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.95075756, + "refHomGenotypeFreq": 0.9015151, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.039329465, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.07865893, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.96067053, + "refHomGenotypeFreq": 0.92134106, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.034787048, + "altHomGenotypeFreq": 1.4585764E-4, + "hetGenotypeFreq": 0.06928238, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.96521294, + "refHomGenotypeFreq": 0.93057173, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.006042296, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.012084592, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.9939577, + "refHomGenotypeFreq": 0.9879154, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.025077784, + "altHomGenotypeFreq": 1.244555E-4, + "hetGenotypeFreq": 0.04990666, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.97492224, + "refHomGenotypeFreq": 0.9499689, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.023662234, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.047324467, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.9763378, + "refHomGenotypeFreq": 0.9526755, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21932379, + "id": "10478", + "percentageMatch": 0.95735, + "source": "genomicSuperDup", + "start": 21908164 + } + ], + "start": 21914681, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21914681, + "id": "15:21914681:T:A", + "length": 1, + "names": [], + "reference": "T", + "start": 21914681, + "strand": "+", + "studies": [], + "type": "SNV" + }, + { + "alternate": "C", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "C", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.5690000057220459, + "source": "gerp" + }, + { + "score": 0.28600001335144043, + "source": "phastCons" + }, + { + "score": -1.1950000524520874, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 0.39999961853027344, + "source": "cadd_raw" + }, + { + "score": 6.619999885559082, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1850805", + "populationFrequencies": [ + { + "altAllele": "C", + "altAlleleFreq": 0.753895, + "altHomGenotypeFreq": 0.50798637, + "hetGenotypeFreq": 0.49181724, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.246105, + "refHomGenotypeFreq": 1.9638649E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7494759, + "altHomGenotypeFreq": 0.4989518, + "hetGenotypeFreq": 0.5010482, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.2505241, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7452351, + "altHomGenotypeFreq": 0.49047014, + "hetGenotypeFreq": 0.5095299, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.25476494, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8084337, + "altHomGenotypeFreq": 0.6168675, + "hetGenotypeFreq": 0.38313252, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.19156626, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.67, + "altHomGenotypeFreq": 0.34, + "hetGenotypeFreq": 0.66, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.33, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7552265, + "altHomGenotypeFreq": 0.510453, + "hetGenotypeFreq": 0.48954704, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.24477352, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.742653, + "altHomGenotypeFreq": 0.48544082, + "hetGenotypeFreq": 0.5144244, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.257347, + "refHomGenotypeFreq": 1.3480723E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.77246344, + "altHomGenotypeFreq": 0.5453912, + "hetGenotypeFreq": 0.45414442, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.22753657, + "refHomGenotypeFreq": 4.6436035E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7559967, + "altHomGenotypeFreq": 0.5123479, + "hetGenotypeFreq": 0.48729765, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.24400331, + "refHomGenotypeFreq": 3.5448422E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7512843, + "altHomGenotypeFreq": 0.5025686, + "hetGenotypeFreq": 0.49743137, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.24871568, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8515625, + "altHomGenotypeFreq": 0.703125, + "hetGenotypeFreq": 0.296875, + "population": "MXL", + "refAllele": "T", + "refAlleleFreq": 0.1484375, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7907348, + "altHomGenotypeFreq": 0.5826677, + "hetGenotypeFreq": 0.41613418, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.20926517, + "refHomGenotypeFreq": 0.001198083, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7034765, + "altHomGenotypeFreq": 0.40899795, + "hetGenotypeFreq": 0.5889571, + "population": "SAS", + "refAllele": "T", + "refAlleleFreq": 0.2965235, + "refHomGenotypeFreq": 0.0020449897, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8244681, + "altHomGenotypeFreq": 0.64893615, + "hetGenotypeFreq": 0.35106385, + "population": "CLM", + "refAllele": "T", + "refAlleleFreq": 0.17553191, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7107843, + "altHomGenotypeFreq": 0.42156863, + "hetGenotypeFreq": 0.57843137, + "population": "ITU", + "refAllele": "T", + "refAlleleFreq": 0.28921568, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.83736765, + "altHomGenotypeFreq": 0.67473525, + "hetGenotypeFreq": 0.32526475, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.16263238, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7619048, + "altHomGenotypeFreq": 0.52380955, + "hetGenotypeFreq": 0.4761905, + "population": "CHS", + "refAllele": "T", + "refAlleleFreq": 0.23809524, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.875, + "altHomGenotypeFreq": 0.75, + "hetGenotypeFreq": 0.25, + "population": "JPT", + "refAllele": "T", + "refAlleleFreq": 0.125, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8287037, + "altHomGenotypeFreq": 0.6574074, + "hetGenotypeFreq": 0.3425926, + "population": "YRI", + "refAllele": "T", + "refAlleleFreq": 0.1712963, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.671875, + "altHomGenotypeFreq": 0.35416666, + "hetGenotypeFreq": 0.6354166, + "population": "PJL", + "refAllele": "T", + "refAlleleFreq": 0.328125, + "refHomGenotypeFreq": 0.010416667, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8318584, + "altHomGenotypeFreq": 0.6637168, + "hetGenotypeFreq": 0.3362832, + "population": "GWD", + "refAllele": "T", + "refAlleleFreq": 0.16814159, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7058824, + "altHomGenotypeFreq": 0.4117647, + "hetGenotypeFreq": 0.5882353, + "population": "STU", + "refAllele": "T", + "refAlleleFreq": 0.29411766, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7197802, + "altHomGenotypeFreq": 0.45054945, + "hetGenotypeFreq": 0.53846157, + "population": "GBR", + "refAllele": "T", + "refAlleleFreq": 0.2802198, + "refHomGenotypeFreq": 0.010989011, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.78494626, + "altHomGenotypeFreq": 0.56989247, + "hetGenotypeFreq": 0.43010753, + "population": "CDX", + "refAllele": "T", + "refAlleleFreq": 0.21505377, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.75757575, + "altHomGenotypeFreq": 0.5151515, + "hetGenotypeFreq": 0.4848485, + "population": "KHV", + "refAllele": "T", + "refAlleleFreq": 0.24242425, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.76635516, + "altHomGenotypeFreq": 0.53271025, + "hetGenotypeFreq": 0.46728972, + "population": "IBS", + "refAllele": "T", + "refAlleleFreq": 0.23364486, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7267442, + "altHomGenotypeFreq": 0.45348838, + "hetGenotypeFreq": 0.54651165, + "population": "BEB", + "refAllele": "T", + "refAlleleFreq": 0.27325583, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8333333, + "altHomGenotypeFreq": 0.6666667, + "hetGenotypeFreq": 0.3333333, + "population": "ACB", + "refAllele": "T", + "refAlleleFreq": 0.16666667, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86868685, + "altHomGenotypeFreq": 0.7373737, + "hetGenotypeFreq": 0.26262626, + "population": "ESN", + "refAllele": "T", + "refAlleleFreq": 0.13131313, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82828283, + "altHomGenotypeFreq": 0.65656567, + "hetGenotypeFreq": 0.34343433, + "population": "LWK", + "refAllele": "T", + "refAlleleFreq": 0.17171717, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.7614314, + "altHomGenotypeFreq": 0.52683896, + "hetGenotypeFreq": 0.46918488, + "population": "EUR", + "refAllele": "T", + "refAlleleFreq": 0.23856859, + "refHomGenotypeFreq": 0.003976143, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.86885244, + "altHomGenotypeFreq": 0.73770493, + "hetGenotypeFreq": 0.26229507, + "population": "ASW", + "refAllele": "T", + "refAlleleFreq": 0.13114753, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.85158503, + "altHomGenotypeFreq": 0.70317, + "hetGenotypeFreq": 0.29682997, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.14841498, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8117647, + "altHomGenotypeFreq": 0.62352943, + "hetGenotypeFreq": 0.3764706, + "population": "MSL", + "refAllele": "T", + "refAlleleFreq": 0.1882353, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.70388347, + "altHomGenotypeFreq": 0.407767, + "hetGenotypeFreq": 0.592233, + "population": "GIH", + "refAllele": "T", + "refAlleleFreq": 0.2961165, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8181818, + "altHomGenotypeFreq": 0.64646465, + "hetGenotypeFreq": 0.34343433, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.18181819, + "refHomGenotypeFreq": 0.01010101, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.69158876, + "altHomGenotypeFreq": 0.38317758, + "hetGenotypeFreq": 0.6168224, + "population": "TSI", + "refAllele": "T", + "refAlleleFreq": 0.3084112, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.82211536, + "altHomGenotypeFreq": 0.6442308, + "hetGenotypeFreq": 0.35576922, + "population": "PUR", + "refAllele": "T", + "refAlleleFreq": 0.17788461, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.81313133, + "altHomGenotypeFreq": 0.6262626, + "hetGenotypeFreq": 0.3737374, + "population": "CEU", + "refAllele": "T", + "refAlleleFreq": 0.18686868, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.91764706, + "altHomGenotypeFreq": 0.8352941, + "hetGenotypeFreq": 0.16470589, + "population": "PEL", + "refAllele": "T", + "refAlleleFreq": 0.08235294, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8015873, + "altHomGenotypeFreq": 0.6031746, + "hetGenotypeFreq": 0.3968254, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.1984127, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "C", + "altAlleleFreq": 0.8252427, + "altHomGenotypeFreq": 0.65048546, + "hetGenotypeFreq": 0.34951457, + "population": "CHB", + "refAllele": "T", + "refAlleleFreq": 0.17475729, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21932379, + "id": "10478", + "percentageMatch": 0.95735, + "source": "genomicSuperDup", + "start": 21908164 + } + ], + "start": 21914720, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21914720, + "id": "15:21914720:T:C", + "length": 1, + "names": [], + "reference": "T", + "start": 21914720, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001782", + "name": "TF_binding_site_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.27900001406669617, + "source": "gerp" + }, + { + "score": 0.024000000208616257, + "source": "phastCons" + }, + { + "score": -1.1399999856948853, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "TF_binding_site_variant", + "functionalScore": [ + { + "score": -0.4200000762939453, + "source": "cadd_raw" + }, + { + "score": 0.3499999940395355, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs1949497", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.7119038, + "altHomGenotypeFreq": 0.42485586, + "hetGenotypeFreq": 0.5740959, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.28809616, + "refHomGenotypeFreq": 0.001048218, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74481326, + "altHomGenotypeFreq": 0.49170125, + "hetGenotypeFreq": 0.5062241, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.25518674, + "refHomGenotypeFreq": 0.002074689, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.75472885, + "altHomGenotypeFreq": 0.50945777, + "hetGenotypeFreq": 0.49054223, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.24527112, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8060241, + "altHomGenotypeFreq": 0.6120482, + "hetGenotypeFreq": 0.38795182, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.19397591, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.71666664, + "altHomGenotypeFreq": 0.43333334, + "hetGenotypeFreq": 0.56666666, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.28333333, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7648256, + "altHomGenotypeFreq": 0.52965117, + "hetGenotypeFreq": 0.47034883, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.23517442, + "refHomGenotypeFreq": 0, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.74736416, + "altHomGenotypeFreq": 0.49486348, + "hetGenotypeFreq": 0.50500137, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.25263584, + "refHomGenotypeFreq": 1.3517166E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6090339, + "altHomGenotypeFreq": 0.2213191, + "hetGenotypeFreq": 0.7754296, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.3909661, + "refHomGenotypeFreq": 0.0032512774, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.70988166, + "altHomGenotypeFreq": 0.42118344, + "hetGenotypeFreq": 0.57739645, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.29011834, + "refHomGenotypeFreq": 0.0014201184, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7144115, + "altHomGenotypeFreq": 0.42941004, + "hetGenotypeFreq": 0.5700029, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.2855885, + "refHomGenotypeFreq": 5.870267E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8984375, + "altHomGenotypeFreq": 0.796875, + "hetGenotypeFreq": 0.203125, + "population": "MXL", + "refAllele": "A", + "refAlleleFreq": 0.1015625, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7464058, + "altHomGenotypeFreq": 0.4960064, + "hetGenotypeFreq": 0.5007987, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.25359425, + "refHomGenotypeFreq": 0.0031948881, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7494888, + "altHomGenotypeFreq": 0.4989775, + "hetGenotypeFreq": 0.5010225, + "population": "SAS", + "refAllele": "A", + "refAlleleFreq": 0.25051126, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7765958, + "altHomGenotypeFreq": 0.5531915, + "hetGenotypeFreq": 0.44680852, + "population": "CLM", + "refAllele": "A", + "refAlleleFreq": 0.22340426, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.75980395, + "altHomGenotypeFreq": 0.51960784, + "hetGenotypeFreq": 0.48039216, + "population": "ITU", + "refAllele": "A", + "refAlleleFreq": 0.24019608, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.63464445, + "altHomGenotypeFreq": 0.28139183, + "hetGenotypeFreq": 0.7065053, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.36535552, + "refHomGenotypeFreq": 0.012102874, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8, + "altHomGenotypeFreq": 0.6, + "hetGenotypeFreq": 0.4, + "population": "CHS", + "refAllele": "A", + "refAlleleFreq": 0.2, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.88461536, + "altHomGenotypeFreq": 0.7692308, + "hetGenotypeFreq": 0.23076925, + "population": "JPT", + "refAllele": "A", + "refAlleleFreq": 0.115384616, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.587963, + "altHomGenotypeFreq": 0.18518518, + "hetGenotypeFreq": 0.8055556, + "population": "YRI", + "refAllele": "A", + "refAlleleFreq": 0.41203704, + "refHomGenotypeFreq": 0.009259259, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7760417, + "altHomGenotypeFreq": 0.5520833, + "hetGenotypeFreq": 0.4479167, + "population": "PJL", + "refAllele": "A", + "refAlleleFreq": 0.22395833, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.61504424, + "altHomGenotypeFreq": 0.25663716, + "hetGenotypeFreq": 0.71681416, + "population": "GWD", + "refAllele": "A", + "refAlleleFreq": 0.38495576, + "refHomGenotypeFreq": 0.026548672, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7254902, + "altHomGenotypeFreq": 0.4509804, + "hetGenotypeFreq": 0.54901963, + "population": "STU", + "refAllele": "A", + "refAlleleFreq": 0.27450982, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.77472526, + "altHomGenotypeFreq": 0.5494506, + "hetGenotypeFreq": 0.45054945, + "population": "GBR", + "refAllele": "A", + "refAlleleFreq": 0.22527473, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7688172, + "altHomGenotypeFreq": 0.53763443, + "hetGenotypeFreq": 0.46236557, + "population": "CDX", + "refAllele": "A", + "refAlleleFreq": 0.2311828, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7323232, + "altHomGenotypeFreq": 0.46464646, + "hetGenotypeFreq": 0.53535354, + "population": "KHV", + "refAllele": "A", + "refAlleleFreq": 0.26767677, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7383177, + "altHomGenotypeFreq": 0.47663552, + "hetGenotypeFreq": 0.5233645, + "population": "IBS", + "refAllele": "A", + "refAlleleFreq": 0.26168224, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.73255813, + "altHomGenotypeFreq": 0.4651163, + "hetGenotypeFreq": 0.53488374, + "population": "BEB", + "refAllele": "A", + "refAlleleFreq": 0.26744187, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65625, + "altHomGenotypeFreq": 0.33333334, + "hetGenotypeFreq": 0.6458334, + "population": "ACB", + "refAllele": "A", + "refAlleleFreq": 0.34375, + "refHomGenotypeFreq": 0.020833334, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.64646465, + "altHomGenotypeFreq": 0.2929293, + "hetGenotypeFreq": 0.7070707, + "population": "ESN", + "refAllele": "A", + "refAlleleFreq": 0.35353535, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6212121, + "altHomGenotypeFreq": 0.26262626, + "hetGenotypeFreq": 0.7171717, + "population": "LWK", + "refAllele": "A", + "refAlleleFreq": 0.37878788, + "refHomGenotypeFreq": 0.02020202, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.77435386, + "altHomGenotypeFreq": 0.5487078, + "hetGenotypeFreq": 0.45129225, + "population": "EUR", + "refAllele": "A", + "refAlleleFreq": 0.22564612, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6885246, + "altHomGenotypeFreq": 0.37704918, + "hetGenotypeFreq": 0.6229508, + "population": "ASW", + "refAllele": "A", + "refAlleleFreq": 0.3114754, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.8371758, + "altHomGenotypeFreq": 0.6743516, + "hetGenotypeFreq": 0.32564843, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.16282421, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.65882355, + "altHomGenotypeFreq": 0.31764707, + "hetGenotypeFreq": 0.68235296, + "population": "MSL", + "refAllele": "A", + "refAlleleFreq": 0.34117648, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.75242716, + "altHomGenotypeFreq": 0.5048544, + "hetGenotypeFreq": 0.49514565, + "population": "GIH", + "refAllele": "A", + "refAlleleFreq": 0.24757281, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.81313133, + "altHomGenotypeFreq": 0.6262626, + "hetGenotypeFreq": 0.3737374, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.18686868, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.7383177, + "altHomGenotypeFreq": 0.47663552, + "hetGenotypeFreq": 0.5233645, + "population": "TSI", + "refAllele": "A", + "refAlleleFreq": 0.26168224, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.78846157, + "altHomGenotypeFreq": 0.5769231, + "hetGenotypeFreq": 0.42307693, + "population": "PUR", + "refAllele": "A", + "refAlleleFreq": 0.21153846, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.81313133, + "altHomGenotypeFreq": 0.6262626, + "hetGenotypeFreq": 0.37373737, + "population": "CEU", + "refAllele": "A", + "refAlleleFreq": 0.18686868, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.91764706, + "altHomGenotypeFreq": 0.8352941, + "hetGenotypeFreq": 0.16470589, + "population": "PEL", + "refAllele": "A", + "refAlleleFreq": 0.08235294, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.79960316, + "altHomGenotypeFreq": 0.5992063, + "hetGenotypeFreq": 0.40079367, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.20039682, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.80582523, + "altHomGenotypeFreq": 0.61165047, + "hetGenotypeFreq": 0.38834953, + "population": "CHB", + "refAllele": "A", + "refAlleleFreq": 0.19417475, + "refHomGenotypeFreq": 0, + "study": "1kG_phase3" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21932379, + "id": "10478", + "percentageMatch": 0.95735, + "source": "genomicSuperDup", + "start": 21908164 + } + ], + "start": 21915396, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21915396, + "id": "15:21915396:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21915396, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0.7699999809265137, + "source": "gerp" + }, + { + "score": 0.009999999776482582, + "source": "phastCons" + }, + { + "score": 0.16300000250339508, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 0.09000015258789062, + "source": "cadd_raw" + }, + { + "score": 3.5899999141693115, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs4086054", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.2974496, + "altHomGenotypeFreq": 1.694628E-4, + "hetGenotypeFreq": 0.59456027, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.7025504, + "refHomGenotypeFreq": 0.40527028, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.276, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.552, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.724, + "refHomGenotypeFreq": 0.448, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.34214875, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6842975, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.6578512, + "refHomGenotypeFreq": 0.31570247, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31944445, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6388889, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.6805556, + "refHomGenotypeFreq": 0.3611111, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.8, + "refHomGenotypeFreq": 0.6, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.30120483, + "altHomGenotypeFreq": 0.001506024, + "hetGenotypeFreq": 0.5993976, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.6987952, + "refHomGenotypeFreq": 0.3990964, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.28105727, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.56211454, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.7189427, + "refHomGenotypeFreq": 0.43788546, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.31925926, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6385185, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.6807407, + "refHomGenotypeFreq": 0.3614815, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29604658, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.59209317, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.70395344, + "refHomGenotypeFreq": 0.40790683, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.29918498, + "altHomGenotypeFreq": 3.7907506E-4, + "hetGenotypeFreq": 0.59761184, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.700815, + "refHomGenotypeFreq": 0.4020091, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21932379, + "id": "10478", + "percentageMatch": 0.95735, + "source": "genomicSuperDup", + "start": 21908164 + } + ], + "start": 21922974, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21922974, + "id": "15:21922974:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21922974, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.42500001192092896, + "source": "gerp" + }, + { + "score": 0, + "source": "phastCons" + }, + { + "score": -1.031000018119812, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": -0.3100004196166992, + "source": "cadd_raw" + }, + { + "score": 0.6299999952316284, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs11631952", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.27456647, + "altHomGenotypeFreq": 2.181263E-4, + "hetGenotypeFreq": 0.5486967, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.7254335, + "refHomGenotypeFreq": 0.45108518, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28214285, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5642857, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.7178571, + "refHomGenotypeFreq": 0.43571427, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.32672414, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6534483, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.6732759, + "refHomGenotypeFreq": 0.34655172, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34848484, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.6969697, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.6515151, + "refHomGenotypeFreq": 0.3030303, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.2254902, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.4509804, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.7745098, + "refHomGenotypeFreq": 0.54901963, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.34516618, + "altHomGenotypeFreq": 0.003021148, + "hetGenotypeFreq": 0.68429005, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.65483385, + "refHomGenotypeFreq": 0.31268883, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.28941888, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.57883775, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.7105811, + "refHomGenotypeFreq": 0.42116225, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.20990847, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.41981694, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.7900915, + "refHomGenotypeFreq": 0.580183, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27311006, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.5462201, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.7268899, + "refHomGenotypeFreq": 0.45377988, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.27639675, + "altHomGenotypeFreq": 4.922471E-4, + "hetGenotypeFreq": 0.551809, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.72360325, + "refHomGenotypeFreq": 0.44769874, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21932379, + "id": "10478", + "percentageMatch": 0.95735, + "source": "genomicSuperDup", + "start": 21908164 + } + ], + "start": 21924872, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21924872, + "id": "15:21924872:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 21924872, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": -0.3059999942779541, + "source": "gerp" + }, + { + "score": 0.10100000351667404, + "source": "phastCons" + }, + { + "score": -1.0440000295639038, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 0.2700004577636719, + "source": "cadd_raw" + }, + { + "score": 5.489999771118164, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs6600089", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.69163555, + "altHomGenotypeFreq": 0.38580576, + "hetGenotypeFreq": 0.6116595, + "population": "ALL", + "refAllele": "T", + "refAlleleFreq": 0.30836445, + "refHomGenotypeFreq": 0.0025346852, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6371308, + "altHomGenotypeFreq": 0.2763713, + "hetGenotypeFreq": 0.721519, + "population": "OTH", + "refAllele": "T", + "refAlleleFreq": 0.3628692, + "refHomGenotypeFreq": 0.0021097045, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6103405, + "altHomGenotypeFreq": 0.221942, + "hetGenotypeFreq": 0.776797, + "population": "EAS", + "refAllele": "T", + "refAlleleFreq": 0.38965952, + "refHomGenotypeFreq": 0.001261034, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.5942928, + "altHomGenotypeFreq": 0.20099255, + "hetGenotypeFreq": 0.7866005, + "population": "AMR", + "refAllele": "T", + "refAlleleFreq": 0.4057072, + "refHomGenotypeFreq": 0.012406948, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.60738254, + "altHomGenotypeFreq": 0.22147651, + "hetGenotypeFreq": 0.7718121, + "population": "ASJ", + "refAllele": "T", + "refAlleleFreq": 0.39261746, + "refHomGenotypeFreq": 0.0067114094, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6344538, + "altHomGenotypeFreq": 0.27430972, + "hetGenotypeFreq": 0.7202881, + "population": "FIN", + "refAllele": "T", + "refAlleleFreq": 0.36554623, + "refHomGenotypeFreq": 0.005402161, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.64449036, + "altHomGenotypeFreq": 0.29173553, + "hetGenotypeFreq": 0.70550966, + "population": "NFE", + "refAllele": "T", + "refAlleleFreq": 0.35550964, + "refHomGenotypeFreq": 0.002754821, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.828114, + "altHomGenotypeFreq": 0.6564634, + "hetGenotypeFreq": 0.34330115, + "population": "AFR", + "refAllele": "T", + "refAlleleFreq": 0.17188604, + "refHomGenotypeFreq": 2.3546032E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6947057, + "altHomGenotypeFreq": 0.39158225, + "hetGenotypeFreq": 0.606247, + "population": "MALE", + "refAllele": "T", + "refAlleleFreq": 0.30529425, + "refHomGenotypeFreq": 0.002170767, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.6878358, + "altHomGenotypeFreq": 0.37865672, + "hetGenotypeFreq": 0.6183582, + "population": "FEMALE", + "refAllele": "T", + "refAlleleFreq": 0.3121642, + "refHomGenotypeFreq": 0.0029850747, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "T", + "repeat": [ + { + "chromosome": "15", + "copyNumber": 2, + "end": 21932379, + "id": "10478", + "percentageMatch": 0.95735, + "source": "genomicSuperDup", + "start": 21908164 + } + ], + "start": 21924898, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21924898, + "id": "15:21924898:T:G", + "length": 1, + "names": [], + "reference": "T", + "start": 21924898, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "G", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "G", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.00800000037997961, + "source": "phastCons" + }, + { + "score": -1.5219999551773071, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "intergenic_variant", + "functionalScore": [ + { + "score": -0.7600002288818359, + "source": "cadd_raw" + }, + { + "score": 0.05000000074505806, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs112452259", + "populationFrequencies": [ + { + "altAllele": "G", + "altAlleleFreq": 0.22033691, + "altHomGenotypeFreq": 0.11340332, + "hetGenotypeFreq": 0.7750244, + "population": "ALL", + "refAllele": "A", + "refAlleleFreq": 0.49908447, + "refHomGenotypeFreq": 0.111572266, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18683274, + "altHomGenotypeFreq": 0.08540925, + "hetGenotypeFreq": 0.8256228, + "population": "OTH", + "refAllele": "A", + "refAlleleFreq": 0.5017794, + "refHomGenotypeFreq": 0.08896797, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17838542, + "altHomGenotypeFreq": 0.06770833, + "hetGenotypeFreq": 0.78645825, + "population": "EAS", + "refAllele": "A", + "refAlleleFreq": 0.5390625, + "refHomGenotypeFreq": 0.14583333, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.17281106, + "altHomGenotypeFreq": 0.05990784, + "hetGenotypeFreq": 0.7235023, + "population": "AMR", + "refAllele": "A", + "refAlleleFreq": 0.578341, + "refHomGenotypeFreq": 0.21658987, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2857143, + "altHomGenotypeFreq": 0.035714287, + "hetGenotypeFreq": 0.90476197, + "population": "ASJ", + "refAllele": "A", + "refAlleleFreq": 0.5119048, + "refHomGenotypeFreq": 0.05952381, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.18259935, + "altHomGenotypeFreq": 0.11493019, + "hetGenotypeFreq": 0.7937702, + "population": "FIN", + "refAllele": "A", + "refAlleleFreq": 0.48818475, + "refHomGenotypeFreq": 0.091299675, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.20781751, + "altHomGenotypeFreq": 0.12517196, + "hetGenotypeFreq": 0.80444753, + "population": "NFE", + "refAllele": "A", + "refAlleleFreq": 0.4726043, + "refHomGenotypeFreq": 0.07038056, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.2824625, + "altHomGenotypeFreq": 0.10863943, + "hetGenotypeFreq": 0.690119, + "population": "AFR", + "refAllele": "A", + "refAlleleFreq": 0.54630107, + "refHomGenotypeFreq": 0.2012416, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.21474645, + "altHomGenotypeFreq": 0.11476867, + "hetGenotypeFreq": 0.7660142, + "population": "MALE", + "refAllele": "A", + "refAlleleFreq": 0.5022242, + "refHomGenotypeFreq": 0.11921708, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "G", + "altAlleleFreq": 0.22713745, + "altHomGenotypeFreq": 0.11174243, + "hetGenotypeFreq": 0.7859849, + "population": "FEMALE", + "refAllele": "A", + "refAlleleFreq": 0.49526516, + "refHomGenotypeFreq": 0.10227273, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "A", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 12, + "copyNumber": 12.1, + "end": 21270462, + "percentageMatch": 0.82, + "period": 12, + "score": 148, + "sequence": "GAAGGAAGGAAG", + "source": "trf", + "start": 21270318 + }, + { + "chromosome": "15", + "consensusSize": 8, + "copyNumber": 18.1, + "end": 21270462, + "percentageMatch": 0.87, + "period": 8, + "score": 148, + "sequence": "GAAGGAAG", + "source": "trf", + "start": 21270318 + }, + { + "chromosome": "15", + "consensusSize": 4, + "copyNumber": 15.5, + "end": 21270462, + "percentageMatch": 0.93, + "period": 4, + "score": 106, + "sequence": "GGAA", + "source": "trf", + "start": 21270402 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "9121", + "percentageMatch": 0.997178, + "source": "genomicSuperDup", + "start": 21205313 + } + ], + "start": 21270450, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21270450, + "id": "15:21270450:A:G", + "length": 1, + "names": [], + "reference": "A", + "start": 21270450, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "T", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "T", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.17000000178813934, + "source": "phastCons" + }, + { + "score": 0.12099999934434891, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 0.4399995803833008, + "source": "cadd_raw" + }, + { + "score": 6.960000038146973, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs74203523", + "populationFrequencies": [ + { + "altAllele": "T", + "altAlleleFreq": 0.41045883, + "altHomGenotypeFreq": 0.0010796222, + "hetGenotypeFreq": 0.8187584, + "population": "ALL", + "refAllele": "C", + "refAlleleFreq": 0.58954114, + "refHomGenotypeFreq": 0.18016194, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.45623633, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.91247267, + "population": "OTH", + "refAllele": "C", + "refAlleleFreq": 0.5437637, + "refHomGenotypeFreq": 0.08752735, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49677002, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.99354005, + "population": "EAS", + "refAllele": "C", + "refAlleleFreq": 0.50323, + "refHomGenotypeFreq": 0.006459948, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4863184, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9726368, + "population": "AMR", + "refAllele": "C", + "refAlleleFreq": 0.5136816, + "refHomGenotypeFreq": 0.027363185, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.17037037, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.34074074, + "population": "ASJ", + "refAllele": "C", + "refAlleleFreq": 0.8296296, + "refHomGenotypeFreq": 0.65925926, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.5005995, + "altHomGenotypeFreq": 0.0017985612, + "hetGenotypeFreq": 0.9976019, + "population": "FIN", + "refAllele": "C", + "refAlleleFreq": 0.49940047, + "refHomGenotypeFreq": 5.995204E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.32602257, + "altHomGenotypeFreq": 4.2313116E-4, + "hetGenotypeFreq": 0.65119886, + "population": "NFE", + "refAllele": "C", + "refAlleleFreq": 0.67397743, + "refHomGenotypeFreq": 0.348378, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.49487656, + "altHomGenotypeFreq": 0.002328831, + "hetGenotypeFreq": 0.9850955, + "population": "AFR", + "refAllele": "C", + "refAlleleFreq": 0.50512344, + "refHomGenotypeFreq": 0.012575687, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.38323975, + "altHomGenotypeFreq": 0.0012207031, + "hetGenotypeFreq": 0.7640381, + "population": "MALE", + "refAllele": "C", + "refAlleleFreq": 0.61676025, + "refHomGenotypeFreq": 0.23474121, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "T", + "altAlleleFreq": 0.4441008, + "altHomGenotypeFreq": 9.0525043E-4, + "hetGenotypeFreq": 0.88639104, + "population": "FEMALE", + "refAllele": "C", + "refAlleleFreq": 0.5558992, + "refHomGenotypeFreq": 0.11270368, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "C", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 172, + "copyNumber": 2.6, + "end": 21326298, + "percentageMatch": 0.86, + "period": 172, + "score": 665, + "sequence": "GCCACAGCCAGCTCTGCCCGCGGATGCCACGTCCATTTGCTTCAGTAGGATCTGCACCCTGTAAACCCTGGTTCCTGCCTCTCCAGGACACCCCACTGAGGTCAGCACACTCCCCAGGTTTACAAGCGGTCTCTGGGTGAAATGTGGTGACACCCCAGGCAGAAGGGGGGAC", + "source": "trf", + "start": 21325849 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "9121", + "percentageMatch": 0.997178, + "source": "genomicSuperDup", + "start": 21205313 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21362639, + "id": "10469", + "percentageMatch": 0.95299, + "source": "genomicSuperDup", + "start": 21311029 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21362639, + "id": "10470", + "percentageMatch": 0.958799, + "source": "genomicSuperDup", + "start": 21311032 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21362639, + "id": "10471", + "percentageMatch": 0.963765, + "source": "genomicSuperDup", + "start": 21311033 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21331568, + "id": "11077", + "percentageMatch": 0.923564, + "source": "genomicSuperDup", + "start": 21318361 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21326298, + "id": "11013", + "percentageMatch": 0.923794, + "source": "genomicSuperDup", + "start": 21318361 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21377410, + "id": "10631", + "percentageMatch": 0.973411, + "source": "genomicSuperDup", + "start": 21318894 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21362639, + "id": "10472", + "percentageMatch": 0.972509, + "source": "genomicSuperDup", + "start": 21323431 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21359035, + "id": "10632", + "percentageMatch": 0.965769, + "source": "genomicSuperDup", + "start": 21325159 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21359035, + "id": "9124", + "percentageMatch": 0.973343, + "source": "genomicSuperDup", + "start": 21325164 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21331568, + "id": "11014", + "percentageMatch": 0.923725, + "source": "genomicSuperDup", + "start": 21326090 + } + ], + "start": 21326175, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21326175, + "id": "15:21326175:C:T", + "length": 1, + "names": [], + "reference": "C", + "start": 21326175, + "strand": "+", + "studies": [], + "type": "SNP" + }, + { + "alternate": "A", + "annotation": { + "additionalAttributes": { + "opencga": { + "attribute": { + "annotationId": "CURRENT", + "release": "1" + } + } + }, + "alternate": "A", + "chromosome": "15", + "consequenceTypes": [ + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001628", + "name": "intergenic_variant" + } + ] + }, + { + "sequenceOntologyTerms": [ + { + "accession": "SO:0001566", + "name": "regulatory_region_variant" + } + ] + } + ], + "conservation": [ + { + "score": 0, + "source": "gerp" + }, + { + "score": 0.39100000262260437, + "source": "phastCons" + }, + { + "score": 0.12099999934434891, + "source": "phylop" + } + ], + "cytoband": [ + { + "chromosome": "15", + "end": 25500000, + "name": "q11.2", + "stain": "gneg", + "start": 20500001 + } + ], + "displayConsequenceType": "regulatory_region_variant", + "functionalScore": [ + { + "score": 1.0500001907348633, + "source": "cadd_raw" + }, + { + "score": 10.970000267028809, + "source": "cadd_scaled" + } + ], + "geneDrugInteraction": [], + "geneTraitAssociation": [], + "hgvs": [], + "id": "rs62006602", + "populationFrequencies": [ + { + "altAllele": "A", + "altAlleleFreq": 0.41011465, + "altHomGenotypeFreq": 0.0010114632, + "hetGenotypeFreq": 0.8182063, + "population": "ALL", + "refAllele": "G", + "refAlleleFreq": 0.58988535, + "refHomGenotypeFreq": 0.1807822, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.45723686, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9144737, + "population": "OTH", + "refAllele": "G", + "refAlleleFreq": 0.5427632, + "refHomGenotypeFreq": 0.08552632, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49805447, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.99610895, + "population": "EAS", + "refAllele": "G", + "refAlleleFreq": 0.5019455, + "refHomGenotypeFreq": 0.0038910506, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.4863184, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.9726368, + "population": "AMR", + "refAllele": "G", + "refAlleleFreq": 0.5136816, + "refHomGenotypeFreq": 0.027363185, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.16911764, + "altHomGenotypeFreq": 0, + "hetGenotypeFreq": 0.3382353, + "population": "ASJ", + "refAllele": "G", + "refAlleleFreq": 0.8308824, + "refHomGenotypeFreq": 0.6617647, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.5005981, + "altHomGenotypeFreq": 0.0017942584, + "hetGenotypeFreq": 0.99760765, + "population": "FIN", + "refAllele": "G", + "refAlleleFreq": 0.49940193, + "refHomGenotypeFreq": 5.980861E-4, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.3251901, + "altHomGenotypeFreq": 2.8161082E-4, + "hetGenotypeFreq": 0.64981693, + "population": "NFE", + "refAllele": "G", + "refAlleleFreq": 0.67480993, + "refHomGenotypeFreq": 0.34990144, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.49510604, + "altHomGenotypeFreq": 0.0023304592, + "hetGenotypeFreq": 0.9855512, + "population": "AFR", + "refAllele": "G", + "refAlleleFreq": 0.50489396, + "refHomGenotypeFreq": 0.012118387, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.38274014, + "altHomGenotypeFreq": 0.0010970258, + "hetGenotypeFreq": 0.7632862, + "population": "MALE", + "refAllele": "G", + "refAlleleFreq": 0.61725986, + "refHomGenotypeFreq": 0.23561677, + "study": "GNOMAD_GENOMES" + }, + { + "altAllele": "A", + "altAlleleFreq": 0.44400844, + "altHomGenotypeFreq": 9.055237E-4, + "hetGenotypeFreq": 0.88620585, + "population": "FEMALE", + "refAllele": "G", + "refAlleleFreq": 0.55599153, + "refHomGenotypeFreq": 0.11288862, + "study": "GNOMAD_GENOMES" + } + ], + "reference": "G", + "repeat": [ + { + "chromosome": "15", + "consensusSize": 172, + "copyNumber": 2.6, + "end": 21326298, + "percentageMatch": 0.86, + "period": 172, + "score": 665, + "sequence": "GCCACAGCCAGCTCTGCCCGCGGATGCCACGTCCATTTGCTTCAGTAGGATCTGCACCCTGTAAACCCTGGTTCCTGCCTCTCCAGGACACCCCACTGAGGTCAGCACACTCCCCAGGTTTACAAGCGGTCTCTGGGTGAAATGTGGTGACACCCCAGGCAGAAGGGGGGAC", + "source": "trf", + "start": 21325849 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21398819, + "id": "9121", + "percentageMatch": 0.997178, + "source": "genomicSuperDup", + "start": 21205313 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21362639, + "id": "10469", + "percentageMatch": 0.95299, + "source": "genomicSuperDup", + "start": 21311029 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21362639, + "id": "10470", + "percentageMatch": 0.958799, + "source": "genomicSuperDup", + "start": 21311032 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21362639, + "id": "10471", + "percentageMatch": 0.963765, + "source": "genomicSuperDup", + "start": 21311033 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21331568, + "id": "11077", + "percentageMatch": 0.923564, + "source": "genomicSuperDup", + "start": 21318361 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21326298, + "id": "11013", + "percentageMatch": 0.923794, + "source": "genomicSuperDup", + "start": 21318361 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21377410, + "id": "10631", + "percentageMatch": 0.973411, + "source": "genomicSuperDup", + "start": 21318894 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21362639, + "id": "10472", + "percentageMatch": 0.972509, + "source": "genomicSuperDup", + "start": 21323431 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21359035, + "id": "10632", + "percentageMatch": 0.965769, + "source": "genomicSuperDup", + "start": 21325159 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21359035, + "id": "9124", + "percentageMatch": 0.973343, + "source": "genomicSuperDup", + "start": 21325164 + }, + { + "chromosome": "15", + "copyNumber": 2, + "end": 21331568, + "id": "11014", + "percentageMatch": 0.923725, + "source": "genomicSuperDup", + "start": 21326090 + } + ], + "start": 21326191, + "traitAssociation": [] + }, + "chromosome": "15", + "end": 21326191, + "id": "15:21326191:G:A", + "length": 1, + "names": [], + "reference": "G", + "start": 21326191, + "strand": "+", + "studies": [], + "type": "SNP" + } + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": { + "application/json": { + "expanded": false, + "root": "root" + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "## Filter by a small region of chromsome 15\n", + "variants = oc.variants.query(study=study, region='15:21242091-23226874', exclude='studies', limit=500)\n", + "variants.print_results(fields='id,annotation.consequenceTypes.geneName,annotation.displayConsequenceType', title='Filter by Region', limit=10) # metadata=False\n", + "print(RESULT_SEPARATOR)\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer\n", + "# JSON(variants.get_results())" ] }, { From bc5e13d3fe1051c96a844da7382f16f3c792aff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 2 Jun 2021 09:11:51 +0200 Subject: [PATCH 364/412] analysis: clean code, #1765 --- .../MutationalSignatureAnalysis.java | 77 ++----- ...ationalSignatureLocalAnalysisExecutor.java | 218 +++--------------- .../client/rest/clients/VariantClient.java | 6 +- .../MutationalSignatureAnalysisExecutor.java | 100 -------- .../rest/analysis/VariantWebService.java | 11 +- 5 files changed, 65 insertions(+), 347 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java index 0ae38a66bb9..6712b7d8ca7 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java @@ -18,7 +18,6 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.models.clinical.qc.MutationalSignature; import org.opencb.biodata.models.clinical.qc.Signature; import org.opencb.biodata.models.clinical.qc.SignatureFitting; import org.opencb.commons.datastore.core.QueryOptions; @@ -38,11 +37,9 @@ import org.opencb.opencga.core.tools.variant.MutationalSignatureAnalysisExecutor; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Path; -import java.util.Base64; import java.util.Collections; import java.util.List; import java.util.Map; @@ -55,6 +52,8 @@ public class MutationalSignatureAnalysis extends OpenCgaToolScopeStudy { public final static String SIGNATURES_FILENAME = "signatures_probabilities_v2.txt"; public final static String GENOME_CONTEXT_FILENAME = "genome_context.txt"; + public final static String SIGNATURE_COEFFS_FILENAME = "signature_coefficients.json"; + public final static String SIGNATURE_FITTING_FILENAME = "signature_summary.png"; public final static String QC_UPDATE_KEYNAME = "qcUpdate"; @@ -125,59 +124,30 @@ protected void run() throws ToolException { // Remove quality control update key signatureParams.getQuery().remove(QC_UPDATE_KEYNAME); - OpenCGAResult sampleResult = getCatalogManager().getSampleManager().get(getStudy(), signatureParams.getSample(), - QueryOptions.empty(), getToken()); + OpenCGAResult sampleResult = getCatalogManager().getSampleManager().get(getStudy(), signatureParams.getSample(), QueryOptions.empty(), getToken()); Sample sample = sampleResult.first(); if (sample != null) { - // Get genome context file - File contextFile = getOutDir().resolve(GENOME_CONTEXT_FILENAME).toFile(); - if (contextFile.exists()) { - Signature.GenomeContextCount[] genomeContextCounts = parseGenomeContextFile(contextFile); - Signature signature = new Signature(signatureParams.getId(), signatureParams.getDescription(), - signatureParams.getQuery(), "SNV", genomeContextCounts, null); - - File imgFile = getOutDir().resolve("signature_summary.png").toFile(); - if (imgFile.exists()) { - int index = imgFile.getAbsolutePath().indexOf("JOBS/"); - String relativeFilePath = (index == -1 ? imgFile.getName() : imgFile.getAbsolutePath().substring(index)); - signature.setFiles(Collections.singletonList(relativeFilePath)); - } - - SampleQualityControl qc = sampleResult.first().getQualityControl(); - if (qc == null) { - qc = new SampleQualityControl(); - } - qc.getVariantMetrics().getSignatures().add(signature); - - catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), - QueryOptions.empty(), getToken()); - } else { - throw new ToolException("It could not find the genome context file after running mutational signature"); + + Signature signature = parse(getOutDir()); + SampleQualityControl qc = sampleResult.first().getQualityControl(); + if (qc == null) { + qc = new SampleQualityControl(); } + qc.getVariantMetrics().getSignatures().add(signature); + + catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), + QueryOptions.empty(), getToken()); } } }); } - private Signature.GenomeContextCount[] parseGenomeContextFile(File contextFile) throws IOException { - // Genome context counts - if (contextFile.exists()) { - List lines = FileUtils.readLines(contextFile, Charset.defaultCharset()); - Signature.GenomeContextCount[] sigCounts = new Signature.GenomeContextCount[lines.size() - 1]; - for (int i = 1; i < lines.size(); i++) { - String[] fields = lines.get(i).split("\t"); - sigCounts[i - 1] = new Signature.GenomeContextCount(fields[2], Math.round(Float.parseFloat((fields[3])))); - } - return sigCounts; - } - return null; - } - - public MutationalSignature parse(Path dir) throws IOException { - MutationalSignature result = new MutationalSignature(); + public Signature parse(Path dir) throws IOException { + Signature result = new Signature(signatureParams.getId(), signatureParams.getDescription(), + signatureParams.getQuery(), "SNV", null, Collections.emptyList(), null); // Context counts - File contextFile = dir.resolve("context.txt").toFile(); + File contextFile = dir.resolve(GENOME_CONTEXT_FILENAME).toFile(); if (contextFile.exists()) { List lines = FileUtils.readLines(contextFile, Charset.defaultCharset()); Signature.GenomeContextCount[] sigCounts = new Signature.GenomeContextCount[lines.size() - 1]; @@ -185,12 +155,11 @@ public MutationalSignature parse(Path dir) throws IOException { String[] fields = lines.get(i).split("\t"); sigCounts[i-1] = new Signature.GenomeContextCount(fields[2], Math.round(Float.parseFloat((fields[3])))); } - result.setSignature(new Signature(signatureParams.getId(), signatureParams.getDescription(), signatureParams.getQuery(), "SNV", - sigCounts, Collections.emptyList())); + result.setCounts(sigCounts); } // Signatures coefficients - File coeffsFile = dir.resolve("signature_coefficients.json").toFile(); + File coeffsFile = dir.resolve(SIGNATURE_COEFFS_FILENAME).toFile(); if (coeffsFile.exists()) { SignatureFitting fitting = new SignatureFitting() .setMethod("GEL") @@ -209,13 +178,11 @@ public MutationalSignature parse(Path dir) throws IOException { fitting.setCoeff((Double) content.get("rss")); // Signature summary image - File imgFile = dir.resolve("signature_summary.png").toFile(); + File imgFile = dir.resolve(SIGNATURE_FITTING_FILENAME).toFile(); if (imgFile.exists()) { - FileInputStream fileInputStreamReader = new FileInputStream(imgFile); - byte[] bytes = new byte[(int) imgFile.length()]; - fileInputStreamReader.read(bytes); - - fitting.setImage(new String(Base64.getEncoder().encode(bytes), "UTF-8")); + int index = imgFile.getAbsolutePath().indexOf("JOBS/"); + String relativeFilePath = (index == -1 ? imgFile.getName() : imgFile.getAbsolutePath().substring(index)); + fitting.setImage(relativeFilePath); } result.setFitting(fitting); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java index 52de5a7240b..7f2f12222ac 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java @@ -27,7 +27,6 @@ import org.opencb.commons.utils.DockerUtils; import org.opencb.opencga.analysis.ResourceUtils; import org.opencb.opencga.analysis.StorageToolExecutor; -import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.core.common.GitRepositoryState; import org.opencb.opencga.core.exceptions.ToolException; @@ -253,192 +252,45 @@ private void createGenomeContextFile(File indexFile) throws ToolExecutorExceptio } } -// VariantDBIterator iterator = getVariantStorageManager().iterator(query, queryOptions, getToken()); -// -// -// Map> countMap = initFreqMap(); -// -// while (iterator.hasNext()) { -// Variant variant = iterator.next(); -// -// -// -// -// -// -// PrintWriter pw = new PrintWriter(indexFile); -// -// try { -// // Compute signature profile: contextual frequencies of each type of base substitution -// -// Query query = new Query() -// .append(VariantQueryParam.STUDY.key(), getStudy()) -// .append(VariantQueryParam.SAMPLE.key(), getSampleName()) -// .append(VariantQueryParam.TYPE.key(), VariantType.SNV); -// -// QueryOptions queryOptions = new QueryOptions(QueryOptions.INCLUDE, "id"); -// -// // Get variant iterator -// VariantDBIterator iterator = getVariantIterator(query, queryOptions); -// -// // Read mutation context from reference genome (.gz, .gz.fai and .gz.gzi files) -// String base = getRefGenomePath().toAbsolutePath().toString(); -// BlockCompressedIndexedFastaSequenceFile indexed = new BlockCompressedIndexedFastaSequenceFile(getRefGenomePath(), -// new FastaSequenceIndex(new File(base + ".fai")), GZIIndex.loadIndex(Paths.get(base + ".gzi"))); -// -// Map> countMap = initFreqMap(); -// -// while (iterator.hasNext()) { -// Variant variant = iterator.next(); -// -// // Accessing to the context sequence and write it into the context index file -// ReferenceSequence refSeq = indexed.getSubsequenceAt(variant.getChromosome(), variant.getStart() - 1, -// variant.getEnd() + 1); -// String sequence = new String(refSeq.getBases()); -// -// // Write context index -// pw.println(variant.toString() + "\t" + sequence); -// -// // Update count map -// updateCountMap(variant, sequence, countMap); -// } -// -// // Write context counts -// writeCountMap(countMap, getOutDir().resolve(CONTEXT_FILENAME).toFile()); -// -// // Close context index file -// pw.close(); -// -// // Execute R script in docker -// executeRScript(); -// } catch (Exception e) { -// throw new ToolExecutorException(e); -// } -// -// // Check output files -// if (!new File(getOutDir() + "/signature_summary.png").exists() -// || !new File(getOutDir() + "/signature_coefficients.json").exists()) { -// String msg = "Something wrong executing mutational signature."; -// throw new ToolException(msg); -// } -// } -// -// public MutationalSignature query(Query query, QueryOptions queryOptions) -// throws CatalogException, ToolException, StorageEngineException, IOException { -// -// File signatureFile = ResourceUtils.downloadAnalysis(MutationalSignatureAnalysis.ID, SIGNATURES_FILENAME, getOutDir(), -// getOpenCgaHome()); -// if (signatureFile == null) { -// throw new ToolException("Error downloading mutational signatures file from " + ResourceUtils.URL); -// } -// setMutationalSignaturePath(signatureFile.toPath()); -// -// // Get context index filename -// String name = getContextIndexFilename(getSampleName()); -// Query fileQuery = new Query("name", name); -// QueryOptions fileQueryOptions = new QueryOptions("include", "uri"); -// OpenCGAResult fileResult = getVariantStorageManager().getCatalogManager() -// .getFileManager().search(getStudy(), fileQuery, fileQueryOptions, getToken()); -// -// if (CollectionUtils.isEmpty(fileResult.getResults())) { -// throw new ToolException("Missing mutational signature context index file for sample " + getSampleName() + " in catalog"); -// } -// -// File indexFile = null; -// long maxSize = 0; -// for (org.opencb.opencga.core.models.file.File file : fileResult.getResults()) { -// File auxFile = new File(file.getUri().getPath()); -// if (auxFile.exists() && auxFile.length() > maxSize) { -// maxSize = auxFile.length(); -// indexFile = auxFile; -// } -// } -// if (indexFile == null) { -// throw new ToolException("Missing mutational signature context index file for sample " + getSampleName()); -// } -// -// // Read context index -// long start = System.currentTimeMillis(); -// Map indexMap = new HashMap<>(); -// BufferedReader br = new BufferedReader( new FileReader(indexFile)); -// String line; -// while ( (line = br.readLine()) != null ){ -// String[] parts = line.split("\t"); -// indexMap.put(parts[0], parts[1]); -// } -// -// // Get variant iterator -// query.append(VariantQueryParam.TYPE.key(), VariantType.SNV); -// queryOptions.append(QueryOptions.INCLUDE, "id"); -// VariantDBIterator iterator = getVariantIterator(query, queryOptions); -// -// Map> countMap = initFreqMap(); -// -// while (iterator.hasNext()) { -// Variant variant = iterator.next(); -// -// // Update count map -// updateCountMap(variant, indexMap.get(variant.toString()), countMap); -// } -// -// // Write context counts -// writeCountMap(countMap, getOutDir().resolve(CONTEXT_FILENAME).toFile()); -// -// // Run R script -// if (getExecutorParams().getBoolean("fitting")) { -// executeRScript(); -// } -// -// return parse(getOutDir()); -// } - - private void updateCountMap(Variant variant, String sequence, Map> countMap) { - String k, seq; - - String key = variant.getReference() + ">" + variant.getAlternate(); - - if (countMap.containsKey(key)) { - k = key; - seq = sequence; - } else { - k = MutationalSignatureAnalysisExecutor.complement(key); - seq = MutationalSignatureAnalysisExecutor.reverseComplement(sequence); - } - if (countMap.get(k).containsKey(seq)) { - countMap.get(k).put(seq, countMap.get(k).get(seq) + 1); - } else { - logger.error("Something wrong happened counting mutational signature substitutions: variant = " + variant.toString() - + ", key = " + key + ", k = " + k + ", sequence = " + sequence + ", seq = " + seq); - } - } + private void updateCountMap(Variant variant, String sequence, Map> countMap) { + String k, seq; - private VariantDBIterator getVariantIterator(Query query, QueryOptions queryOptions) throws ToolExecutorException, CatalogException, - StorageEngineException { - VariantStorageManager storageManager = getVariantStorageManager(); + String key = variant.getReference() + ">" + variant.getAlternate(); - // Compute signature profile: contextual frequencies of each type of base substitution - return storageManager.iterator(query, queryOptions, getToken()); + if (countMap.containsKey(key)) { + k = key; + seq = sequence; + } else { + k = MutationalSignatureAnalysisExecutor.complement(key); + seq = MutationalSignatureAnalysisExecutor.reverseComplement(sequence); + } + if (countMap.get(k).containsKey(seq)) { + countMap.get(k).put(seq, countMap.get(k).get(seq) + 1); + } else { + logger.error("Something wrong happened counting mutational signature substitutions: variant = " + variant.toString() + + ", key = " + key + ", k = " + k + ", sequence = " + sequence + ", seq = " + seq); + } + } + + private String executeRScript() throws IOException, ToolExecutorException { + // Download signature profiles + File signatureFile = ResourceUtils.downloadAnalysis(MutationalSignatureAnalysis.ID, SIGNATURES_FILENAME, getOutDir(), + opencgaHome); + if (signatureFile == null) { + throw new ToolExecutorException("Error downloading mutational signatures file from " + ResourceUtils.URL); } - private String executeRScript() throws IOException, ToolExecutorException { - // Download signature profiles - File signatureFile = ResourceUtils.downloadAnalysis(MutationalSignatureAnalysis.ID, SIGNATURES_FILENAME, getOutDir(), - opencgaHome); - if (signatureFile == null) { - throw new ToolExecutorException("Error downloading mutational signatures file from " + ResourceUtils.URL); - } - - String rScriptPath = opencgaHome + "/analysis/R/" + getToolId(); - List> inputBindings = new ArrayList<>(); - inputBindings.add(new AbstractMap.SimpleEntry<>(rScriptPath, "/data/input")); - AbstractMap.SimpleEntry outputBinding = new AbstractMap.SimpleEntry<>(getOutDir().toAbsolutePath().toString(), - "/data/output"); - String scriptParams = "R CMD Rscript --vanilla /data/input/mutational-signature.r /data/output/" + GENOME_CONTEXT_FILENAME + " " - + "/data/output/" + SIGNATURES_FILENAME + " /data/output "; + String rScriptPath = opencgaHome + "/analysis/R/" + getToolId(); + List> inputBindings = new ArrayList<>(); + inputBindings.add(new AbstractMap.SimpleEntry<>(rScriptPath, "/data/input")); + AbstractMap.SimpleEntry outputBinding = new AbstractMap.SimpleEntry<>(getOutDir().toAbsolutePath().toString(), + "/data/output"); + String scriptParams = "R CMD Rscript --vanilla /data/input/mutational-signature.r /data/output/" + GENOME_CONTEXT_FILENAME + " " + + "/data/output/" + SIGNATURES_FILENAME + " /data/output "; - String cmdline = DockerUtils.run(R_DOCKER_IMAGE, inputBindings, outputBinding, scriptParams, null); - logger.info("Docker command line: " + cmdline); + String cmdline = DockerUtils.run(R_DOCKER_IMAGE, inputBindings, outputBinding, scriptParams, null); + logger.info("Docker command line: " + cmdline); - return cmdline; - } + return cmdline; } +} diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index cf79e090d01..a106e49057f 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -16,7 +16,7 @@ package org.opencb.opencga.client.rest.clients; -import org.opencb.biodata.models.clinical.qc.MutationalSignature; +import org.opencb.biodata.models.clinical.qc.Signature; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; @@ -504,9 +504,9 @@ public RestResponse metadata(ObjectMap params) throws ClientExc * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse queryMutationalSignature(ObjectMap params) throws ClientException { + public RestResponse queryMutationalSignature(ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); - return execute("analysis", null, "variant/mutationalSignature", null, "query", params, GET, MutationalSignature.class); + return execute("analysis", null, "variant/mutationalSignature", null, "query", params, GET, Signature.class); } /** diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java index f68d6c4a1d7..5a0397eeb72 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java @@ -41,59 +41,9 @@ public abstract class MutationalSignatureAnalysisExecutor extends OpenCgaToolExe private ObjectMap query; private boolean fitting; -// private String sampleName; -// private Path refGenomePath; -// private Path mutationalSignaturePath; -// private Path openCgaHome; - public MutationalSignatureAnalysisExecutor() { } -// public String getStudy() { -// return study; -// } -// -// public MutationalSignatureAnalysisExecutor setStudy(String study) { -// this.study = study; -// return this; -// } -// -// public String getSampleName() { -// return sampleName; -// } -// -// public MutationalSignatureAnalysisExecutor setSampleName(String sampleName) { -// this.sampleName = sampleName; -// return this; -// } -// -// public Path getRefGenomePath() { -// return refGenomePath; -// } -// -// public MutationalSignatureAnalysisExecutor setRefGenomePath(Path refGenomePath) { -// this.refGenomePath = refGenomePath; -// return this; -// } -// -// public Path getMutationalSignaturePath() { -// return mutationalSignaturePath; -// } -// -// public MutationalSignatureAnalysisExecutor setMutationalSignaturePath(Path mutationalSignaturePath) { -// this.mutationalSignaturePath = mutationalSignaturePath; -// return this; -// } -// -// public Path getOpenCgaHome() { -// return openCgaHome; -// } -// -// public MutationalSignatureAnalysisExecutor setOpenCgaHome(Path openCgaHome) { -// this.openCgaHome = openCgaHome; -// return this; -// } - public static String getContextIndexFilename(String sampleName) { return "OPENCGA_" + sampleName + "_genome_context.csv"; } @@ -193,56 +143,6 @@ private static Double sumFreqMap(Map> map) { return sum; } -// private MutationalSignature parse(Path dir) throws IOException { -// MutationalSignature result = new MutationalSignature(); -// -// // Context counts -// File contextFile = dir.resolve("context.txt").toFile(); -// if (contextFile.exists()) { -// List lines = FileUtils.readLines(contextFile, Charset.defaultCharset()); -// Signature.SignatureCount[] sigCounts = new Signature.SignatureCount[lines.size() - 1]; -// for (int i = 1; i < lines.size(); i++) { -// String[] fields = lines.get(i).split("\t"); -// sigCounts[i-1] = new Signature.SignatureCount(fields[2], Math.round(Float.parseFloat((fields[3])))); -// } -// result.setSignature(new Signature("SNV", sigCounts)); -// } -// -// // Signatures coefficients -// File coeffsFile = dir.resolve("signature_coefficients.json").toFile(); -// if (coeffsFile.exists()) { -// SignatureFitting fitting = new SignatureFitting() -// .setMethod("GEL") -// .setSignatureSource("Cosmic") -// .setSignatureVersion("2.0"); -// -// Map content = JacksonUtils.getDefaultObjectMapper().readValue(coeffsFile, Map.class); -// Map coefficients = (Map) content.get("coefficients"); -// SignatureFitting.Score[] scores = new SignatureFitting.Score[coefficients.size()]; -// int i = 0; -// for (Object key : coefficients.keySet()) { -// Number coeff = (Number) coefficients.get(key); -// scores[i++] = new SignatureFitting.Score((String) key, coeff.doubleValue()); -// } -// fitting.setScores(scores); -// fitting.setCoeff((Double) content.get("rss")); -// -// // Signature summary image -// File imgFile = dir.resolve("signature_summary.png").toFile(); -// if (imgFile.exists()) { -// FileInputStream fileInputStreamReader = new FileInputStream(imgFile); -// byte[] bytes = new byte[(int) imgFile.length()]; -// fileInputStreamReader.read(bytes); -// -// fitting.setImage(new String(Base64.getEncoder().encode(bytes), "UTF-8")); -// } -// -// result.setFitting(fitting); -// } -// -// return result; -// } - public String getStudy() { return study; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index b667857f246..613e670a5eb 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -22,7 +22,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.opencb.biodata.models.clinical.ClinicalProperty; -import org.opencb.biodata.models.clinical.qc.MutationalSignature; +import org.opencb.biodata.models.clinical.qc.Signature; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; @@ -78,7 +78,6 @@ import org.opencb.opencga.core.models.variant.*; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.response.RestResponse; -import org.opencb.opencga.core.tools.ToolParams; import org.opencb.opencga.server.WebServiceException; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationManager; @@ -901,7 +900,7 @@ public Response mutationalSignatureRun( @GET @Path("/mutationalSignature/query") - @ApiOperation(value = MutationalSignatureAnalysis.DESCRIPTION + " Use context index.", response = MutationalSignature.class) + @ApiOperation(value = MutationalSignatureAnalysis.DESCRIPTION + " Use context index.", response = Signature.class) @ApiImplicitParams({ @ApiImplicitParam(name = "study", value = STUDY_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "sample", value = "Sample name", dataType = "string", paramType = "query"), @@ -954,10 +953,10 @@ public Response mutationalSignatureQuery( mutationalSignatureAnalysis.start(); watch.stop(); - MutationalSignature mutationalSignature = mutationalSignatureAnalysis.parse(outDir.toPath()); + Signature signature = mutationalSignatureAnalysis.parse(outDir.toPath()); - OpenCGAResult result = new OpenCGAResult<>(((int) watch.getTime()), Collections.emptyList(), 1, - Collections.singletonList(mutationalSignature), 1); + OpenCGAResult result = new OpenCGAResult<>(((int) watch.getTime()), Collections.emptyList(), 1, + Collections.singletonList(signature), 1); return createOkResponse(result); } catch (ToolException | IOException e) { return createErrorResponse(e); From 24bd967181388edc2a26f4bc42ebadcb60365774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 2 Jun 2021 11:47:55 +0200 Subject: [PATCH 365/412] analysis: improve genome plot analysis and sample quality control analysis --- .../analysis/sample/qc/SampleQcAnalysis.java | 11 ++-- .../genomePlot/GenomePlotAnalysis.java | 2 +- ...ationalSignatureLocalAnalysisExecutor.java | 2 +- .../internal/InternalCliOptionsParser.java | 2 + .../VariantInternalCommandExecutor.java | 20 ++++++ .../options/VariantCommandOptions.java | 63 +++++++++++++++++++ .../app/cli/main/OpencgaCliOptionsParser.java | 2 + .../analysis/VariantCommandExecutor.java | 21 ++++++- .../client/rest/clients/VariantClient.java | 4 +- .../variant/GenomePlotAnalysisParams.java | 14 ++++- .../variant/SampleQcAnalysisParams.java | 14 ++++- .../rest/analysis/VariantWebService.java | 63 +++---------------- 12 files changed, 152 insertions(+), 66 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index a5ab9f2da05..831ec9e5f73 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -17,6 +17,7 @@ package org.opencb.opencga.analysis.sample.qc; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.commons.datastore.core.Event; @@ -127,9 +128,9 @@ protected void check() throws Exception { } // Check mutational signature -// if (!sample.isSomatic()) { -// runSignature = false; -// } + if (MapUtils.isEmpty(analysisParams.getSignatureQuery())) { + runSignature = false; + } // Check genome plot if (StringUtils.isEmpty(analysisParams.getGenomePlotConfigFile())) { @@ -184,8 +185,8 @@ protected void run() throws ToolException { if (runGenomePlot) { // Run genome plot - params = new GenomePlotAnalysisParams(analysisParams.getSample(), analysisParams.getGenomePlotDescription(), - analysisParams.getGenomePlotConfigFile(), null) + params = new GenomePlotAnalysisParams(analysisParams.getSample(), analysisParams.getGenomePlotId(), + analysisParams.getGenomePlotDescription(), analysisParams.getGenomePlotConfigFile(), null) .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudy())); genomePlotJobResult = catalogManager.getJobManager() diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java index 9093babe757..ce566d38fbc 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java @@ -60,7 +60,7 @@ protected void check() throws Exception { } if (StringUtils.isEmpty(genomePlotParams.getConfigFile())) { - throw new ToolException("Missing Genome plot configuration file"); + throw new ToolException("Missing genome plot configuration file"); } File catalogFile = AnalysisUtils.getCatalogFile(genomePlotParams.getConfigFile(), getStudy(), getCatalogManager().getFileManager(), diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java index 7f2f12222ac..b807098e2ae 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java @@ -271,7 +271,7 @@ private void updateCountMap(Variant variant, String sequence, Map signatureQuery = new HashMap<>(); + @Parameter(names = {"--gpi", "--genome-plot-id"}, description = "Genome plot ID.") + public String genomePlotId; + @Parameter(names = {"--gpd", "--genome-plot-description"}, description = "Genome plot description.") public String genomePlotDescr; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java index 322dbb79d1b..80638a453c9 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/OpencgaCliOptionsParser.java @@ -36,6 +36,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.CohortVariantStatsCommandOptions.COHORT_VARIANT_STATS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.FamilyQcCommandOptions.FAMILY_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GatkCommandOptions.GATK_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GenomePlotCommandOptions.GENOME_PLOT_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GwasCommandOptions.GWAS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.IndividualQcCommandOptions.INDIVIDUAL_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.InferredSexCommandOptions.INFERRED_SEX_RUN_COMMAND; @@ -289,6 +290,7 @@ public OpencgaCliOptionsParser() { variantSubCommands.addCommand(KNOCKOUT_RUN_COMMAND, variantCommandOptions.knockoutCommandOptions); variantSubCommands.addCommand(SAMPLE_ELIGIBILITY_RUN_COMMAND, variantCommandOptions.sampleEligibilityCommandOptions); variantSubCommands.addCommand(MUTATIONAL_SIGNATURE_RUN_COMMAND, variantCommandOptions.mutationalSignatureCommandOptions); + variantSubCommands.addCommand(GENOME_PLOT_RUN_COMMAND, variantCommandOptions.genomePlotCommandOptions); variantSubCommands.addCommand(MENDELIAN_ERROR_RUN_COMMAND, variantCommandOptions.mendelianErrorCommandOptions); variantSubCommands.addCommand(INFERRED_SEX_RUN_COMMAND, variantCommandOptions.inferredSexCommandOptions); variantSubCommands.addCommand(RELATEDNESS_RUN_COMMAND, variantCommandOptions.relatednessCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 0f9b7bea4dc..8b37db93297 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -59,6 +59,7 @@ import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.CohortVariantStatsQueryCommandOptions.COHORT_VARIANT_STATS_QUERY_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.FamilyQcCommandOptions.FAMILY_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GatkCommandOptions.GATK_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GenomePlotCommandOptions.GENOME_PLOT_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.GwasCommandOptions.GWAS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.IndividualQcCommandOptions.INDIVIDUAL_QC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.InferredSexCommandOptions.INFERRED_SEX_RUN_COMMAND; @@ -177,6 +178,10 @@ public void execute() throws Exception { queryResponse = mutationalSignature(); break; + case GENOME_PLOT_RUN_COMMAND: + queryResponse = genomePlot(); + break; + case MENDELIAN_ERROR_RUN_COMMAND: queryResponse = mendelianError(); break; @@ -338,8 +343,6 @@ private RestResponse sampleEligibility() throws ClientException { // } private RestResponse mutationalSignature() throws ClientException { - // Build signature query from cli options - return openCGAClient.getVariantClient().runMutationalSignature( new MutationalSignatureAnalysisParams( variantCommandOptions.mutationalSignatureCommandOptions.sample, @@ -353,6 +356,19 @@ private RestResponse mutationalSignature() throws ClientException { ); } + private RestResponse genomePlot() throws ClientException { + return openCGAClient.getVariantClient().runGenomePlot( + new GenomePlotAnalysisParams( + null, + variantCommandOptions.genomePlotCommandOptions.id, + variantCommandOptions.genomePlotCommandOptions.description, + variantCommandOptions.genomePlotCommandOptions.configFile, + variantCommandOptions.genomePlotCommandOptions.outdir + ), + getParams(variantCommandOptions.genomePlotCommandOptions.study) + ); + } + private RestResponse mendelianError() throws ClientException { return openCGAClient.getVariantClient().runMendelianError( new MendelianErrorAnalysisParams( @@ -429,6 +445,7 @@ private RestResponse sampleQc() throws ClientException { cliOptions.signatureId, cliOptions.signatureDescription, new ObjectMap(cliOptions.signatureQuery), + cliOptions.genomePlotId, cliOptions.genomePlotDescr, cliOptions.genomePlotConfigFile, cliOptions.outdir diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index a106e49057f..1b52583b335 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -153,10 +153,10 @@ public RestResponse queryAnnotation(ObjectMap params) throws * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ - public RestResponse runGenomePlot(GenomePlotAnalysisParams data, ObjectMap params) throws ClientException { + public RestResponse runGenomePlot(GenomePlotAnalysisParams data, ObjectMap params) throws ClientException { params = params != null ? params : new ObjectMap(); params.put("body", data); - return execute("analysis", null, "variant/genomePlot", null, "run", params, POST, String.class); + return execute("analysis", null, "variant/genomePlot", null, "run", params, POST, Job.class); } /** diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java index 39a41a4ae98..f5899bfa1ed 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/GenomePlotAnalysisParams.java @@ -24,6 +24,7 @@ public class GenomePlotAnalysisParams extends ToolParams { + "track types are: COPY-NUMBER, INDEL, REARRANGEMENT and SNV. In addition, each track can contain a specific query"; private String sample; + private String id; private String description; private String configFile; private String outdir; @@ -31,8 +32,9 @@ public class GenomePlotAnalysisParams extends ToolParams { public GenomePlotAnalysisParams() { } - public GenomePlotAnalysisParams(String sample, String description, String configFile, String outdir) { + public GenomePlotAnalysisParams(String sample, String id, String description, String configFile, String outdir) { this.sample = sample; + this.id = id; this.description = description; this.configFile = configFile; this.outdir = outdir; @@ -42,6 +44,7 @@ public GenomePlotAnalysisParams(String sample, String description, String config public String toString() { final StringBuilder sb = new StringBuilder("GenomePlotAnalysisParams{"); sb.append("sample='").append(sample).append('\''); + sb.append(", id='").append(id).append('\''); sb.append(", description='").append(description).append('\''); sb.append(", configFile='").append(configFile).append('\''); sb.append(", outdir='").append(outdir).append('\''); @@ -58,6 +61,15 @@ public GenomePlotAnalysisParams setSample(String sample) { return this; } + public String getId() { + return id; + } + + public GenomePlotAnalysisParams setId(String id) { + this.id = id; + return this; + } + public String getDescription() { return description; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java index 6379d41caf9..75d6fdf656e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java @@ -28,6 +28,7 @@ public class SampleQcAnalysisParams extends ToolParams { private String signatureId; private String signatureDescription; private ObjectMap signatureQuery; + private String genomePlotId; private String genomePlotDescription; private String genomePlotConfigFile; private String outdir; @@ -37,7 +38,7 @@ public SampleQcAnalysisParams() { public SampleQcAnalysisParams(String sample, String variantStatsId, String variantStatsDescription, AnnotationVariantQueryParams variantStatsQuery, String signatureId, String signatureDescription, - ObjectMap signatureQuery, String genomePlotDescription, String genomePlotConfigFile, + ObjectMap signatureQuery, String genomePlotId, String genomePlotDescription, String genomePlotConfigFile, String outdir) { this.sample = sample; this.variantStatsId = variantStatsId; @@ -46,6 +47,7 @@ public SampleQcAnalysisParams(String sample, String variantStatsId, String varia this.signatureId = signatureId; this.signatureDescription = signatureDescription; this.signatureQuery = signatureQuery; + this.genomePlotId = genomePlotId; this.genomePlotDescription = genomePlotDescription; this.genomePlotConfigFile = genomePlotConfigFile; this.outdir = outdir; @@ -61,6 +63,7 @@ public String toString() { sb.append(", signatureId='").append(signatureId).append('\''); sb.append(", signatureDescription='").append(signatureDescription).append('\''); sb.append(", signatureQuery=").append(signatureQuery); + sb.append(", genomePlotId='").append(genomePlotId).append('\''); sb.append(", genomePlotDescription='").append(genomePlotDescription).append('\''); sb.append(", genomePlotConfigFile='").append(genomePlotConfigFile).append('\''); sb.append(", outdir='").append(outdir).append('\''); @@ -131,6 +134,15 @@ public SampleQcAnalysisParams setSignatureQuery(ObjectMap signatureQuery) { return this; } + public String getGenomePlotId() { + return genomePlotId; + } + + public SampleQcAnalysisParams setGenomePlotId(String genomePlotId) { + this.genomePlotId = genomePlotId; + return this; + } + public String getGenomePlotDescription() { return genomePlotDescription; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 613e670a5eb..df781f59fab 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -1217,60 +1217,17 @@ public Response knockoutByIndividualQuery( @POST @Path("/genomePlot/run") - @ApiOperation(value = GenomePlotAnalysis.DESCRIPTION, response = String.class) - public Response genomePlot( - @ApiParam(value = ParamConstants.STUDY_PARAM) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiOperation(value = GenomePlotAnalysis.DESCRIPTION, response = Job.class) + public Response genomePlotRun( + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, + @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, + @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, + @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, @ApiParam(value = GenomePlotAnalysisParams.DESCRIPTION, required = true) GenomePlotAnalysisParams params) { - File outDir = null; - try { - // Create temporal directory - outDir = Paths.get(configuration.getAnalysis().getScratchDir(), "plot-" + System.nanoTime()).toFile(); - outDir.mkdir(); - if (!outDir.exists()) { - return createErrorResponse(new Exception("Error creating temporal directory for genome plot analysis")); - } - - StopWatch watch = StopWatch.createStarted(); - - GenomePlotAnalysis genomePlotAnalysis = new GenomePlotAnalysis(); - genomePlotAnalysis.setUp(opencgaHome.toString(), catalogManager, storageEngineFactory, new ObjectMap(), outDir.toPath(), null, - token); - genomePlotAnalysis.setStudy(study) - .setGenomePlotParams(params) - .start(); - - // Check results by reading the output file - for (File imgfile : outDir.toPath().toFile().listFiles()) { - if (imgfile.getName().endsWith(GenomePlotAnalysis.SUFFIX_FILENAME)) { - FileInputStream fileInputStreamReader = new FileInputStream(imgfile); - byte[] bytes = new byte[(int) imgfile.length()]; - fileInputStreamReader.read(bytes); - - String img = new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); - - watch.stop(); - OpenCGAResult result = new OpenCGAResult<>(((int) watch.getTime()), Collections.emptyList(), 1, - Collections.singletonList(img), 1); - - //System.out.println(result.toString()); - return createOkResponse(result); - } - } - return createErrorResponse(new Exception("Error plotting Genome graph")); - } catch (ToolException | IOException e) { - return createErrorResponse(e); - } finally { - if (outDir != null) { - // Delete temporal directory - try { - if (outDir.exists()) { - FileUtils.deleteDirectory(outDir); - } - } catch (IOException e) { - logger.warn("Error cleaning scratch directory " + outDir, e); - } - } - } + // To be sure: do not update quality control sample + params.setSample(null); + return submitJob(GenomePlotAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } @POST From ba9bbf49cfe558eb33bb5c090a30b7ba6d9b88ec Mon Sep 17 00:00:00 2001 From: Laura Date: Wed, 2 Jun 2021 13:52:37 +0000 Subject: [PATCH 366/412] GitBook: [develop] one page modified --- .../data-management/adding-custom-metadata.md | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/docs/manual/data-management/adding-custom-metadata.md b/docs/manual/data-management/adding-custom-metadata.md index 3191c26d07d..64d3c370a81 100644 --- a/docs/manual/data-management/adding-custom-metadata.md +++ b/docs/manual/data-management/adding-custom-metadata.md @@ -1,2 +1,167 @@ # Adding Custom Metadata +## Variables and Annotations + +Clinical Data in OpenCGA is managed through what we have called _Variable Sets_ and _Annotation Sets_. + +### Variables + +A [_Variable Set_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/VariableSet.java) is a free modelled data model. The fields of a _Variable Set_ are explained below: + +* **id:** Unique String that can be used to identify the defined _Variable Set_. +* **unique:** Boolean indicating whether there can only exist one single _Annotation Set_ annotating the _Variable Set_ per each _Annotable\*_ entry or not. If false, many _Annotation Sets_ annotating the same _Variable Set_ per _Annotable_ entry will be allowed. +* **confidential:** Boolean indicating whether the _Variable Set_ as well as the _Annotation Sets_ annotating the _Variable Set_ are confidential or not. In case of confidentiality, only the users with that CONFIDENTIAL permission will be able to access it. +* **description:** String containing a description of the _Variable Set_ defined. +* **variables:** List containing all the different _Variables_ that will form the _Variable Set._ Explained in detail below. + +\* _Annotable_: We consider an entry to be _Annotable_ if the entry can have _Annotation Sets._ At this stage, only [_File_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/File.java)_,_ [_Sample_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Sample.java)_,_ [_Individual_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Individual.java)_,_ [_Cohort_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Cohort.java) and [_Family_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Family.java) __are _Annotable._ + +{% hint style="warning" %} +Confidential: Explained in Sharing and Permissions section ! +{% endhint %} + +A _Variable Set_ is composed of a set of [_Variables_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Variable.java)_._ A _Variable_ can be understood as a user-defined field that can be of any type \(Boolean, String, Integer, Float, Object, List...\). The different fields of a _Variable_ are: + +* **id:** String containing the unique identifier of the field \(_Variable_\) defined by the user. +* **name:**Nice identifier of the _name_. This field is intended to be used in a web application to show the field _name_ in a nicer way. +* **category:** Free String that can contain anything useful for the user to group and categorise _Variables_ of a same _Variable Set._ +* **type:** Type of the field \(_Variable_\) defined. It can be one of BOOLEAN, CATEGORICAL\*, INTEGER, DOUBLE, TEXT, OBJECT. +* **defaultValue:** Object containing the default value of the _Variable_ in case the user has not given any value when creating the _Annotation Set_. +* **required:** Boolean indicating whether the field is mandatory to be filled in or not. +* **multivalue:** Boolean indicating whether the field being annotated is a List of type _type_ or it will only contain a single value. +* **allowedValues:** A list containing all the possible values a field could have. +* **rank:** Integer containing the order in which the annotations will be shown \(only for web purposes\). +* **dependsOn:** String containing the _Variable_ the current _Variable_ would depend on. Let's say we have defined two different _Variables_ in a _Variable Set_ called _country_ and _city._ We can decide that we could only give a value to _city_ once the _country_ have been filled in, so _city_ would depend on _country._ +* **description:** String containing a description for the _Variable._ +* **variableSet:** List of _Variables_ that would only be used if the _Variable_ being modelled is of type _Object._ Every _Variable_ from the list will have the fields explained in this list. __ + +\* _Categorical_: A _Categorical_ variable can be understood as an Enum object where the possible values that can be assigned are already known. Example of some categorical _Variables_ are: _month,_ that can only contain values from January to December, _gender,_ that could only contain values from MALE, FEMALE, UNKNOWN; etc. + +#### Examples + +We are going to create two different _Variable Sets_, remember that the Variable Sets are defined at _study_ level. The first one will be used to properly identify every single _Individual_ created in OpenCGA. + +The other one will be used to store some additional metadata from the _Samples_ extracted from the _Individuals._ + +```text +{ + "id": "individual_private_details", + "unique": true, + "confidential": true, + "description": "Private details of the individual", + "variables": [ + { + "id": "full_name", + "name": "Full name", + "category": "Personal", + "type": "TEXT", + "defaultValue": "", + "required": true, + "multiValue": false, + "allowedValues": [], + "rank": 1, + "dependsOn": "", + "description": "Individual full name", + "attributes": {} + }, + { + "id": "age", + "name": "Age", + "category": "Personal", + "type": "INTEGER", + "required": true, + "multiValue": false, + "allowedValues": [ + "0:120" + ], + "rank": 2, + "dependsOn": "", + "description": "Individual age", + "attributes": {} + }] +} +``` + +```text +{ + "unique": true, + "confidential": false, + "id": "sample_metadata", + "description": "Sample origin", + "variables": [ + { + "id": "tissue", + "name": "Tissue", + "category": "string", + "type": "TEXT", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 1, + "dependsOn": "", + "description": "Sample tissue", + "attributes": {} + }, + { + "id": "cell_line", + "name": "Cell line", + "category": "string", + "type": "TEXT", + "required": false, + "multiValue": false, + "allowedValues": [], + "rank": 2, + "dependsOn": "", + "description": "Sample cell line", + "attributes": {} + }, +} +``` + +### Annotations + +An [_Annotation Set_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/AnnotationSet.java) is the set of [_Annotations_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Annotation.java) __given for a concrete _Annotable_ entry using a particular _Variable Set_ template. The most important fields of an _Annotation Set_ are: + +* **id:** Unique name to identify the annotation set created. +* **variableSetId:**Unique value identifying the _Variable Set_ the _Annotation Set_ is using to define the _Annotations._ +* **annotations:** List of _Annotations_ or, in other words, values assigned for each _Variable_ defined in the _Variable Set_ corresponding to the _variableSetId._ + +The _Annotations_ are just key-value objects where each key need to match any of the _Variable names_ defined in the _Variable Set,_ and the values will correspond to the actual _Annotation_ of the _Variable._ + +Every time an annotation is made, OpenCGA will make, at least, the following checks: + +* The data types of the _Annotations_ match the types defined for the _Variables._ +* No mandatory _Variable_ is missing an _Annotation_. +* The value for a particular _Variable_ matches any of the allowed values if this array is provided and non empty. + +#### Examples + +An _Annotation_ example for both _Variable Sets_ examples can be found below: + +```text +{ + "id": "annotation_set_id", + "variableSetId": "individual_private_details", + "annotations": { + "full_name": "John Smith", + "age": 60, + "gender": "MALE", + "hpo": ["HP:0000118", "HP:0000220"] + } +} +``` + +```text +{ + "id": "annotation_set_id", + "variableSetId": "sample_metadata", + "annotations": { + "tissue": " umbilical cord blood", + "cell_type": "multipotent progenitor", + "preparation": "100 (or less, if 100 were not available) highly purified Haematopoietic stem and progenitor cells..." + } +} +``` + + + From ea7fa613b2622eb2de67a05c71098c13e8ff2162 Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Wed, 2 Jun 2021 15:26:11 +0100 Subject: [PATCH 367/412] add annotation sets --- .../admin-training/pyopencga_admin.ipynb | 393 +++++++++++++++--- 1 file changed, 346 insertions(+), 47 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb index fea35295891..49cfeb4e6a3 100644 --- a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb +++ b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb @@ -22,15 +22,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "## Table of Contents:\n", + "\n", "## Table of Contents:\n", "\n", "This Notebook is organised in the following sections:\n", "\n", - "* __Grant/edit permissions to groups or individual users__\n", - "* __Asign samples to individuals__\n", - "* __Define phenotypes or diseases for individuals__\n", - "* __Define, add, edit and remove variable sets__\n", - "* __Use Cases__" + "* [Permission Management](#Permission-management)\n", + "* [Assign Samples to Individuals](#Asign-Samples-to-Individuals)\n", + "* [Define phenotypes or diseases for Individuals](#Define-phenotypes-or-disorders-for-Individuals)\n", + "* [Define, add, edit and remove variable sets](#Define,-add,-edit-and-remove-variable-sets)\n", + "* [Use Cases](#Use-Cases)\n" ] }, { @@ -48,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -87,25 +89,25 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "## Step 5. Define admin user credentials\n", "admin_user = 'demo-admin'\n", - "password = 'quBocgIvQ2r83SG'" + "password = 'demo-admin'" ] }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWFkbWluIiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjU1NDkxNCwiZXhwIjoxNjIyNTU4NTE0fQ.gI1TQQyNk--4UB6XLxgClgOiMBy5UPEvUC5ETFWGWV8 well done!\n" + "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWFkbWluIiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjY0MzEwNywiZXhwIjoxNjIyNjQ2NzA3fQ.E3flYTKmmMTARE4GD5ejLj0qwdb9LHsAHWpidd1GE6g well done!\n" ] } ], @@ -135,7 +137,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -159,7 +161,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In OpenCGA all the permissions are established at the study level. \n", + "In OpenCGA all the permissions are established at the study level. For this part of the notebook, it is really handy to take a look at the documentation about [Sharing and Permissions](https://app.gitbook.com/@opencb/s/opencga/manual/data-management/sharing-and-permissions) in OpenCGA.\n", "\n", "All the studies come intrinsically with two administrative groups: `@admins` and `@members`.\n", "- All the users added to a new study belong to the `@members` group. This is useful for keeping track of the users that have access to that specific study. However, `@members` doesn't have any permission defined by default.\n", @@ -170,21 +172,34 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 1. Add/remove users from a Study\n", + "## 1. Add/remove users from a Study\n", "\n", - "## Add users\n", + "### - Add users\n", "\n", - "First, we're going to add the users `trainee1` and `trainee2` to the study. Internally, this means that we are adding those users to the `@members` group of the study." + "First, we're going to add the users `trainee1` and `trainee2` to the study. Internally, this means that we are adding those users to the `@members` group of the study.\n", + "The `studies.update_users()` function has a parameter `action`, which by default is set to **ADD**." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Groups in Study demo@training:admin\n", + "----------------------------------------\n", + "#id\tuserIds\n", + "@members\ttrainee1,demo,imedina,pfurio,demo-admin,trainee2,llopez,jcoll,wspooner\n" + ] + } + ], "source": [ "## Add users to study\n", "update_users = oc.studies.update_users(study=study, group='members', data={\"users\": [\"trainee1\",\"trainee2\"]})\n", + "update_users.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", "# JSON(update_users.get_results())" @@ -194,67 +209,182 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Check users in the Study\n", - "We can always check the current status of the `@members` group i.e check which users has access to the study, as well that of any other group defined for the study.\n", + "### - Remove users\n", "\n", - "### Hands-on exercise: \n", - "Run the next cell after adding users `trainee1` and `trainee2`. Then remove them from the group `@members` (code cell below) and run it again. \n", - "- Do you notice any difference in the output?" + "Inversely, we can remove the users `trainee1` and `trainee2` from the study. Internally, this means that we are removing those users from the `@members` group of the study.\n", + "\n", + "In this case, we need to set the parameter `action`, (which by default is **ADD**) to **REMOVE**." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [], + "source": [ + "## Remove users from members group of study\n", + "remove_users = oc.studies.update_users(study=study, group='members', action='REMOVE', data={\"users\": [\"trainee1\",\"trainee2\"]})\n", + "remove_users.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(remove_users.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Create a group and asign permissions\n", + "\n", + "The defaul group `@members` does not have any permission for the study. This group only defines which users belong to the study.\n", + "\n", + "OpenCGA allows to create admin-defined groups of users. Then, one can grant permissions to this group and assign users. The users in the new group will inherit the permissions granted at a group level." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Create a new `training_group`\n", + "\n", + "We can create a new group `training_group` and add the user `trainee1` to the group. The `studies.update_groups()` function has a parameter `action`, which by default is set to **ADD**." ] }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "## Define the python dict with the name of the group and the users\n", + "group_data = {\n", + " \"id\": \"training_group\",\n", + " \"users\": [\n", + " \"trainee1\"\n", + " ]}\n", + "\n", + "## Define a new Training group.\n", + "update_groups = oc.studies.update_groups(study=study, action='ADD', data=group_data)\n", + "update_groups.print_results(fields='', metadata=False, title='Info about groups')\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(update_groups.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### - Grant permissions to the group `training_group`\n", + "\n", + "For granting permissions, we are going to use the template `view_only`. The permissions included in `view_only` are: The member (user or group) will be given full READ permissions to all the entities (samples, individuals, files etc.)." + ] + }, + { + "cell_type": "code", + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Groups in Study demo@training:admin\n", - "----------------------------------------\n", - "#id\tuserIds\n", - "@members\timedina,llopez,jcoll,wspooner,demo-admin,pfurio,demo\n", - "@admins\timedina,llopez,jcoll,wspooner,demo-admin,pfurio\n" + "Info about permissions for new group\n", + "-----------------------------------------\n", + "#@training_group\n", + "DOWNLOAD_FILES,VIEW_COHORTS,VIEW_AGGREGATED_VARIANTS,VIEW_FAMILIES,VIEW_CLINICAL_ANALYSIS,VIEW_SAMPLES,VIEW_FILES,VIEW_FILE_HEADER,VIEW_COHORT_ANNOTATIONS,VIEW_FAMILY_ANNOTATIONS,VIEW_INDIVIDUALS,VIEW_INDIVIDUAL_ANNOTATIONS,VIEW_FILE_CONTENT,VIEW_JOBS,VIEW_SAMPLE_ANNOTATIONS,VIEW_SAMPLE_VARIANTS,VIEW_PANELS\n" ] } ], "source": [ - "## Check Study groups\n", - "groups = oc.studies.groups(study=study)\n", - "groups.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n", + "## Define the python dict.\n", + "permission_data = {\n", + " \"study\": study,\n", + " \"template\": \"view_only\"}\n", + "\n", + "## Update the permissions\n", + "update_acl = oc.studies.update_acl(study=study, members='@training_group', action='ADD', data=permission_data)\n", + "update_acl.print_results(metadata=False, title='Info about permissions for new group')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", - "# JSON(groups.get_results())" + "# JSON(update_acl.get_results())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Remove users\n", + "### - Remove `training_group`\n", "\n", - "Inversely, we can remove the users `trainee1` and `trainee2` from the study. Internally, this means that we are removing those users from the `@members` group of the study." + "Don't forget to remove the group before running the cells above. Otherwise you will get an error because the group that you're trying to create already exists." ] }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "## Remove users from members group of study\n", - "remove_users = oc.studies.update_users(study=study, group='members', action='REMOVE', data={\"users\": [\"trainee1\",\"trainee2\"]})\n", + "## Define the python dict with the name of the group and the users\n", + "# group_data = {\n", + "# \"id\": \"training_group\",\n", + "# \"users\": [\n", + "# \"trainee1\"\n", + "# ]}\n", + "\n", + "## Uncomment this to delete the samples\n", + "# delete_group = oc.studies.update_groups(study=study, action='REMOVE', data=group_data)\n", + "# delete_group.print_results(metadata=False, title='Info about groups')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", - "# JSON(remove_users.get_results())" + "# JSON(delete_samples.get_results())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Asign samples to individuals\n", + "## 3. Check users and groups in the Study\n", + "We can always check the current status of the `@members` group i.e check which users has access to the study, as well that of any other group defined for the study.\n", + "\n", + "#### Hands-on exercise: \n", + "Run the next cell after adding users `trainee1` and `trainee2`. Then remove them from the group `@members` (code cell below) and run it again. \n", + "- Do you notice any difference in the output? \n", + "Independently of the group **ALL** the users always belong to the group `@members`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Groups in Study demo@training:admin\n", + "----------------------------------------\n", + "#id\tuserIds\n", + "@members\ttrainee1,demo,imedina,pfurio,demo-admin,trainee2,llopez,jcoll,wspooner\n", + "@admins\timedina,pfurio,demo-admin,llopez,jcoll,wspooner\n", + "@training_group\ttrainee1\n" + ] + } + ], + "source": [ + "## Check Study groups\n", + "groups = oc.studies.groups(study=study)\n", + "groups.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n", + "\n", + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "# JSON(groups.get_results())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Asign Samples to Individuals\n", "-------\n" ] }, @@ -279,9 +409,19 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 53, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The sample: sample1 has been created successfully\n", + "The sample: sample2-germinal has been created successfully\n", + "The sample: sample2-somatic has been created successfully\n" + ] + } + ], "source": [ "## Create 3 samples taking into account if they're somatic or germinal\n", "sample_ids = ['sample1', 'sample2-germinal', 'sample2-somatic']\n", @@ -342,14 +482,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### - Delete Samples:\n", + "### - Remove Samples:\n", "\n", "__[NOTE]:__ Be aware that if you delete the samples at this stage, you won't be able to associate the `samples` to the correspondent `individuals` in the next subsection." ] }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 52, "metadata": {}, "outputs": [], "source": [ @@ -427,7 +567,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2. Associate samples with individuals\n", + "## 3. Associate samples with individuals\n", "\n", "Remember that OpenCGA `individual` data model allows to have multiple samples assigned to the same individual. A typical use case can be found in cancer genetic screen, where usually two samples are taken from the same individual: one from the tumour (somatic sample), and one germinal.\n", "\n", @@ -500,7 +640,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Define phenotypes or diseases for individuals\n", + "# Define phenotypes or disorders for Individuals\n", "------\n", "\n", "OpenCGA defines a set of rich data models, that can be useful for storing any kind of annotation. The individual entity can be associated with phenotypes and diseases ontologies. We support many ontology sources. Individuals that can be easily queried by its associated phenotypes and diseases once they are annotated.\n", @@ -813,7 +953,166 @@ "metadata": {}, "source": [ "# Define, add, edit and remove variable sets\n", - "----------" + "----------\n", + "One incredibly practical utility of OpenCGA is the possibility of defining variable sets (i.e: groups of variables) for a specific entity or group of entities (Samples, Individuals, Cohorts, etc.)\n", + "\n", + "For more information, and before running this part of the notebook, refer to the section of [Adding custom metadata](https://app.gitbook.com/@opencb/s/opencga/manual/data-management/adding-custom-metadata) in our OpenCGA GitBook Documentation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Define the Variable Set\n", + "In this case, we will create a Variable set for the *annotable* entity `Sample`. \n", + "\n", + "According to our documentation, we consider an entry to be Annotable if the entry can have Annotation Sets. At this stage, only **File, Sample, Individual, Cohort and Family** are Annotable." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "## Define the variable set\n", + "sample_variable_set = {\n", + " \"id\": \"sample_metadata\", \n", + " \"unique\": \"true\",\n", + " \"confidential\": \"false\",\n", + " \"description\": \"Sample origin\",\n", + " \"entities\": [\n", + " \"SAMPLE\"\n", + " ],\n", + " \"variables\": [\n", + " {\n", + " \"id\": \"cell_line\",\n", + " \"name\": \"Cell line\",\n", + " \"category\": \"string\",\n", + " \"type\": \"TEXT\",\n", + " \"required\": \"false\",\n", + " \"multiValue\": \"false\",\n", + " \"allowedValues\": [],\n", + " \"rank\": 2,\n", + " \"dependsOn\": \"\",\n", + " \"description\": \"Sample cell line\",\n", + " \"attributes\": {}\n", + " },\n", + " {\n", + " \"id\": \"cell_type\",\n", + " \"name\": \"Cell type\",\n", + " \"category\": \"string\",\n", + " \"type\": \"TEXT\",\n", + " \"required\": \"false\",\n", + " \"multiValue\": \"false\",\n", + " \"allowedValues\": [],\n", + " \"rank\": 3,\n", + " \"dependsOn\": \"\",\n", + " \"description\": \"Sample cell type\",\n", + " \"attributes\": {}\n", + " }]\n", + "}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "## Add the variable set to the Sample data model of the study\n", + "add_variable_set = oc.studies.update_variable_sets(study=study, action='ADD', data=sample_variable_set)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "List of Variable Sets in study: demo@training:admin\n", + "--------------------------------------------------------\n", + "#id\tname\tunique\tdescription\n", + "opencga_file_variant_stats\topencga_file_variant_stats\tTrue\tOpenCGA file variant stats\n", + "opencga_alignment_stats\topencga_alignment_stats\tTrue\tOpenCGA alignment stats\n", + "opencga_sample_qc\topencga_sample_qc\tTrue\tOpenCGA variable set for sample quality control (QC)\n", + "opencga_cohort_variant_stats\topencga_cohort_variant_stats\tTrue\tOpenCGA cohort variant stats\n", + "sample_metadata\tsample_metadata\tTrue\tSample origin\n" + ] + } + ], + "source": [ + "## Search for the variable set\n", + "variable_sets = oc.studies.variable_sets(study=study)\n", + "variable_sets.print_results(fields='id,name,unique,description', metadata=False, title='List of Variable Sets in study: {}'.format(study))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## - Remove Variable Set" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "## Remove the variable set to the Sample data model of the study\n", + "#remove_variable_set = oc.studies.update_variable_sets(study=study, action='REMOVE', data=sample_variable_set)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Annotate the Variable Set: Annotation Set" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "ename": "Exception", + "evalue": "b'{\"apiVersion\":\"v2\",\"time\":190,\"events\":[{\"type\":\"ERROR\",\"code\":0,\"id\":\"org.opencb.opencga.catalog.exceptions.CatalogException\",\"name\":\"CatalogException\",\"message\":\"AnnotationSet annotation_set_id not found. Annotations could not be updated.\"}],\"params\":{\"limit\":\"1000\",\"skip\":\"0\",\"annotationSet\":\"annotation_set_id\",\"sample\":\"sample1\"},\"responses\":[{\"time\":0,\"events\":[],\"numResults\":0,\"results\":[],\"resultType\":\"\",\"numTotalResults\":0,\"numMatches\":0,\"numInserted\":0,\"numUpdated\":0,\"numDeleted\":0,\"attributes\":{}}]}'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;31m## Annotate the variable set\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0moc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msamples\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate_annotations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'sample1'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mannotation_set\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'annotation_set_id'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_annotation_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/rest_clients/sample_client.py\u001b[0m in \u001b[0;36mupdate_annotations\u001b[0;34m(self, sample, annotation_set, data, **options)\u001b[0m\n\u001b[1;32m 332\u001b[0m \"\"\"\n\u001b[1;32m 333\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 334\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_post\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcategory\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'samples'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresource\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'annotations/update'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquery_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubcategory\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'annotationSets'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecond_query_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mannotation_set\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 335\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/rest_clients/_parent_rest_clients.py\u001b[0m in \u001b[0;36m_post\u001b[0;34m(self, category, resource, data, query_id, subcategory, second_query_id, **options)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0;34m\"\"\"Queries the REST service and returns the result\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 85\u001b[0;31m return self._rest_retry(\n\u001b[0m\u001b[1;32m 86\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'post'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcategory\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcategory\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresource\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mresource\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquery_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mquery_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0msubcategory\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msubcategory\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecond_query_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msecond_query_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/rest_clients/_parent_rest_clients.py\u001b[0m in \u001b[0;36m_rest_retry\u001b[0;34m(self, method, category, resource, query_id, subcategory, second_query_id, data, dont_retry, **options)\u001b[0m\n\u001b[1;32m 60\u001b[0m ))\n\u001b[1;32m 61\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 62\u001b[0;31m response = retry(\n\u001b[0m\u001b[1;32m 63\u001b[0m \u001b[0mexec_retry\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cfg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_attempts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cfg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmin_retry_secs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cfg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_retry_secs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogin_handler\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogin_handler\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/retry.py\u001b[0m in \u001b[0;36mretry\u001b[0;34m(func, max_attempts, initial_retry_seconds, max_retry_seconds, login_handler, on_retry, dont_retry)\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 36\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 37\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mOpencgaInvalidToken\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/rest_clients/_parent_rest_clients.py\u001b[0m in \u001b[0;36mexec_retry\u001b[0;34m()\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mexec_retry\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m return execute(host=self._cfg.host,\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0mversion\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cfg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mversion\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0msid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoken\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/commons.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(host, version, sid, category, resource, method, subcategory, query_id, second_query_id, data, options)\u001b[0m\n\u001b[1;32m 282\u001b[0m \u001b[0;31m# Multithread if the number of queries is greater than _CALL_BATCH_SIZE\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 283\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mquery_id\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mquery_id\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m','\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0m_CALL_BATCH_SIZE\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 284\u001b[0;31m response = _fetch(host=host, version=version, sid=sid, category=category, subcategory=subcategory,\n\u001b[0m\u001b[1;32m 285\u001b[0m \u001b[0mresource\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mresource\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquery_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mquery_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 286\u001b[0m second_query_id=second_query_id, options=options)\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/commons.py\u001b[0m in \u001b[0;36m_fetch\u001b[0;34m(host, version, sid, category, resource, method, subcategory, query_id, second_query_id, data, options)\u001b[0m\n\u001b[1;32m 172\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 173\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatus_code\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m200\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 174\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 175\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mException\u001b[0m: b'{\"apiVersion\":\"v2\",\"time\":190,\"events\":[{\"type\":\"ERROR\",\"code\":0,\"id\":\"org.opencb.opencga.catalog.exceptions.CatalogException\",\"name\":\"CatalogException\",\"message\":\"AnnotationSet annotation_set_id not found. Annotations could not be updated.\"}],\"params\":{\"limit\":\"1000\",\"skip\":\"0\",\"annotationSet\":\"annotation_set_id\",\"sample\":\"sample1\"},\"responses\":[{\"time\":0,\"events\":[],\"numResults\":0,\"results\":[],\"resultType\":\"\",\"numTotalResults\":0,\"numMatches\":0,\"numInserted\":0,\"numUpdated\":0,\"numDeleted\":0,\"attributes\":{}}]}'" + ] + } + ], + "source": [ + "## Define the annotation set\n", + "sample_annotation_set = {\n", + " \"id\": \"annotation_set_id\",\n", + " \"variableSetId\": \"sample_metadata\",\n", + " \"annotations\": {\n", + " \"cell_line\": \"umbilical cord\",\n", + " \"cell_type\": \"multipotent progenitor\",\n", + " }\n", + "}\n", + "\n", + "\n", + "## Annotate the variable set\n", + "\n", + "oc.samples.update_annotations(sample='sample1', annotation_set='annotation_set_id', data=sample_annotation_set)" ] }, { @@ -846,4 +1145,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} From 47e40c308f8b25f813684aea80487bf9d8003c85 Mon Sep 17 00:00:00 2001 From: Laura Date: Wed, 2 Jun 2021 16:39:17 +0000 Subject: [PATCH 368/412] GitBook: [develop] one page modified --- .../data-management/adding-custom-metadata.md | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/docs/manual/data-management/adding-custom-metadata.md b/docs/manual/data-management/adding-custom-metadata.md index 64d3c370a81..b4f3626235b 100644 --- a/docs/manual/data-management/adding-custom-metadata.md +++ b/docs/manual/data-management/adding-custom-metadata.md @@ -14,7 +14,7 @@ A [_Variable Set_](https://github.com/opencb/opencga/blob/develop/opencga-core/s * **description:** String containing a description of the _Variable Set_ defined. * **variables:** List containing all the different _Variables_ that will form the _Variable Set._ Explained in detail below. -\* _Annotable_: We consider an entry to be _Annotable_ if the entry can have _Annotation Sets._ At this stage, only [_File_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/File.java)_,_ [_Sample_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Sample.java)_,_ [_Individual_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Individual.java)_,_ [_Cohort_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Cohort.java) and [_Family_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Family.java) __are _Annotable._ +**Annotable**: We consider an entry to be _Annotable_ if the entry can have _Annotation Sets._ At this stage, only [_File_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/File.java)_,_ [_Sample_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Sample.java)_,_ [_Individual_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Individual.java)_,_ [_Cohort_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Cohort.java) and [_Family_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/Family.java) __are _Annotable._ {% hint style="warning" %} Confidential: Explained in Sharing and Permissions section ! @@ -33,16 +33,13 @@ A _Variable Set_ is composed of a set of [_Variables_](https://github.com/opencb * **rank:** Integer containing the order in which the annotations will be shown \(only for web purposes\). * **dependsOn:** String containing the _Variable_ the current _Variable_ would depend on. Let's say we have defined two different _Variables_ in a _Variable Set_ called _country_ and _city._ We can decide that we could only give a value to _city_ once the _country_ have been filled in, so _city_ would depend on _country._ * **description:** String containing a description for the _Variable._ -* **variableSet:** List of _Variables_ that would only be used if the _Variable_ being modelled is of type _Object._ Every _Variable_ from the list will have the fields explained in this list. __ - -\* _Categorical_: A _Categorical_ variable can be understood as an Enum object where the possible values that can be assigned are already known. Example of some categorical _Variables_ are: _month,_ that can only contain values from January to December, _gender,_ that could only contain values from MALE, FEMALE, UNKNOWN; etc. +* **variableSet:** List of _Variables_ that would only be used if the _Variable_ being modelled is of type _Object._ Every _Variable_ from the list will have the fields explained in this list. +* **Categorical**: A _Categorical_ variable can be understood as an _Enum_ object where the possible values that can be assigned are already known. Example of some categorical _Variables_ are: _month,_ that can only contain values from January to December, _gender,_ that could only contain values from MALE, FEMALE, UNKNOWN; etc. #### Examples We are going to create two different _Variable Sets_, remember that the Variable Sets are defined at _study_ level. The first one will be used to properly identify every single _Individual_ created in OpenCGA. -The other one will be used to store some additional metadata from the _Samples_ extracted from the _Individuals._ - ```text { "id": "individual_private_details", @@ -82,6 +79,8 @@ The other one will be used to store some additional metadata from the _Samples_ } ``` +The next one will be used to store some additional metadata from the _Samples_ extracted from the _Individuals._ + ```text { "unique": true, @@ -89,32 +88,32 @@ The other one will be used to store some additional metadata from the _Samples_ "id": "sample_metadata", "description": "Sample origin", "variables": [ - { - "id": "tissue", - "name": "Tissue", +{ + "id": "cell_line", + "name": "Cell line", "category": "string", "type": "TEXT", "required": false, "multiValue": false, "allowedValues": [], - "rank": 1, + "rank": 2, "dependsOn": "", - "description": "Sample tissue", + "description": "Sample cell line", "attributes": {} }, - { - "id": "cell_line", - "name": "Cell line", + { + "id": "cell_type", + "name": "Cell type", "category": "string", "type": "TEXT", "required": false, "multiValue": false, "allowedValues": [], - "rank": 2, + "rank": 3, "dependsOn": "", - "description": "Sample cell line", + "description": "Sample cell type", "attributes": {} - }, + } } ``` @@ -124,7 +123,7 @@ An [_Annotation Set_](https://github.com/opencb/opencga/blob/develop/opencga-cor * **id:** Unique name to identify the annotation set created. * **variableSetId:**Unique value identifying the _Variable Set_ the _Annotation Set_ is using to define the _Annotations._ -* **annotations:** List of _Annotations_ or, in other words, values assigned for each _Variable_ defined in the _Variable Set_ corresponding to the _variableSetId._ +* **annotations:** List of _Annotations_ or, in other words, values assigned for each _Variable_ defined in the _Variable Set_ corresponding to the _variableSetId._ The _Annotations_ are just key-value objects where each key need to match any of the _Variable names_ defined in the _Variable Set,_ and the values will correspond to the actual _Annotation_ of the _Variable._ From 1670230399a018b9a5c4de4043f1244043f0b4d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 3 Jun 2021 11:01:40 +0200 Subject: [PATCH 369/412] analysis: support for different COSMIC releases of mutational signatures, #1765 --- .../mutational-signature/mutational-signature.r | 12 +++++++----- .../analysis/sample/qc/SampleQcAnalysis.java | 3 ++- .../MutationalSignatureAnalysis.java | 4 ++-- ...MutationalSignatureLocalAnalysisExecutor.java | 5 ++--- .../opencb/opencga/app/cli/CommandExecutor.java | 14 ++++++++++++++ .../VariantInternalCommandExecutor.java | 8 ++++++++ .../internal/options/VariantCommandOptions.java | 7 +++++++ .../analysis/VariantCommandExecutor.java | 8 ++++++++ .../MutationalSignatureAnalysisParams.java | 14 +++++++++++++- .../models/variant/SampleQcAnalysisParams.java | 16 ++++++++++++++-- .../MutationalSignatureAnalysisExecutor.java | 14 ++++++++++++++ 11 files changed, 91 insertions(+), 14 deletions(-) diff --git a/opencga-analysis/src/main/R/mutational-signature/mutational-signature.r b/opencga-analysis/src/main/R/mutational-signature/mutational-signature.r index 7ac9ab1baa0..30517e786f1 100644 --- a/opencga-analysis/src/main/R/mutational-signature/mutational-signature.r +++ b/opencga-analysis/src/main/R/mutational-signature/mutational-signature.r @@ -13,9 +13,9 @@ context <- args[1] signatures <- args[2] outdir <- args[3] -context -signatures -outdir +print(paste("Genome context file: ", context)) +print(paste("Mutational signatures file: ", signatures)) +print(paste("Output directory: ", outdir)) # Getting absolute counts for each SNV trinucleotide context @@ -29,7 +29,9 @@ dataTable <- dataTable / sum(dataTable) # Getting signature probabilities reference table #signatureTable <- read.table(args[2], sep = "\t", header = TRUE) signatureTable <- read.table(signatures, sep = "\t", header = TRUE) -signatureTable <- as.matrix(signatureTable[1:96,4:33]) +header <- scan(args[2], nlines = 1, what = character()) +tags <- header[2:length(header)]; +signatureTable <- as.matrix(signatureTable[1:96,2:length(header)]) # Applying non-negative least squares (NNLS) coefficients <- nnls(signatureTable, dataTable) @@ -83,7 +85,7 @@ RSS <- round(RSS, digits = 4) coefficients <- coefficients$x / sum(coefficients$x) * 100 # Creating signature names -tags <- paste("Signature", 1:30, sep = " ") +#tags <- paste("Signature", 1:30, sep = " ") # Writing coefficients and RSS to JSON file dfCoeff <- as.data.frame(t(data.frame(coefficients))) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 831ec9e5f73..19c055436f2 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -173,7 +173,8 @@ protected void run() throws ToolException { // Be sure to update sample quality control analysisParams.getSignatureQuery().put(MutationalSignatureAnalysis.QC_UPDATE_KEYNAME, "true"); params = new MutationalSignatureAnalysisParams(analysisParams.getSample(), analysisParams.getSignatureId(), - analysisParams.getSignatureDescription(), analysisParams.getSignatureQuery(), true, null) + analysisParams.getSignatureDescription(), analysisParams.getSignatureQuery(), + analysisParams.getSignatureRelease(), true, null) .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, getStudy())); signatureJobResult = catalogManager.getJobManager() diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java index 6712b7d8ca7..22905b28251 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java @@ -50,7 +50,6 @@ public class MutationalSignatureAnalysis extends OpenCgaToolScopeStudy { public static final String ID = "mutational-signature"; public static final String DESCRIPTION = "Run mutational signature analysis for a given sample."; - public final static String SIGNATURES_FILENAME = "signatures_probabilities_v2.txt"; public final static String GENOME_CONTEXT_FILENAME = "genome_context.txt"; public final static String SIGNATURE_COEFFS_FILENAME = "signature_coefficients.json"; public final static String SIGNATURE_FITTING_FILENAME = "signature_summary.png"; @@ -116,6 +115,7 @@ protected void run() throws ToolException { .setQueryId(signatureParams.getId()) .setQueryDescription(signatureParams.getDescription()) .setQuery(signatureParams.getQuery()) + .setRelease(signatureParams.getRelease()) .setFitting(signatureParams.isFitting()) .execute(); @@ -164,7 +164,7 @@ public Signature parse(Path dir) throws IOException { SignatureFitting fitting = new SignatureFitting() .setMethod("GEL") .setSignatureSource("Cosmic") - .setSignatureVersion("2.0"); + .setSignatureVersion(signatureParams.getRelease()); Map content = JacksonUtils.getDefaultObjectMapper().readValue(coeffsFile, Map.class); Map coefficients = (Map) content.get("coefficients"); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java index b807098e2ae..ad7edef121d 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java @@ -47,7 +47,6 @@ import java.util.*; import static org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis.GENOME_CONTEXT_FILENAME; -import static org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis.SIGNATURES_FILENAME; @ToolExecutor(id="opencga-local", tool = MutationalSignatureAnalysis.ID, framework = ToolExecutor.Framework.LOCAL, source = ToolExecutor.Source.STORAGE) @@ -274,7 +273,7 @@ private void updateCountMap(Variant variant, String sequence, Map outputBinding = new AbstractMap.SimpleEntry<>(getOutDir().toAbsolutePath().toString(), "/data/output"); String scriptParams = "R CMD Rscript --vanilla /data/input/mutational-signature.r /data/output/" + GENOME_CONTEXT_FILENAME + " " - + "/data/output/" + SIGNATURES_FILENAME + " /data/output "; + + "/data/output/" + getMutationalSignatureFilename() + " /data/output "; String cmdline = DockerUtils.run(R_DOCKER_IMAGE, inputBindings, outputBinding, scriptParams, null); logger.info("Docker command line: " + cmdline); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/CommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/CommandExecutor.java index cddda4b6cf1..1857cea4e72 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/CommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/CommandExecutor.java @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.config.Configurator; import org.opencb.commons.utils.FileUtils; import org.opencb.opencga.client.config.ClientConfiguration; +import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; @@ -303,6 +304,19 @@ protected void logoutCliSessionFile() throws IOException { } } + protected void checkSignatureRelease(String release) throws ClientException { + switch (release) { + case "2": + case "3": + case "3.1": + case "3.2": + break; + default: + throw new ClientException("Invalid value " + release + " for the mutational signature release. " + + "Valid values are: 2, 3, 3.1 and 3.2"); + } + } + public static String getParsedSubCommand(JCommander jCommander) { return CliOptionsParser.getSubCommand(jCommander); } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index 8db51ca947d..d2e083522bb 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -788,11 +788,15 @@ private void julie() throws Exception { private void mutationalSignature() throws Exception { VariantCommandOptions.MutationalSignatureCommandOptions cliOptions = variantCommandOptions.mutationalSignatureCommandOptions; + // Check signature release + checkSignatureRelease(cliOptions.release); + ObjectMap params = new MutationalSignatureAnalysisParams( cliOptions.sample, cliOptions.id, cliOptions.description, new ObjectMap(cliOptions.query), + cliOptions.release, cliOptions.fitting, cliOptions.outdir) .toObjectMap(cliOptions.commonOptions.params).append(ParamConstants.STUDY_PARAM, cliOptions.study); @@ -891,6 +895,9 @@ private void individualQc() throws Exception { private void sampleQc() throws Exception { VariantCommandOptions.SampleQcCommandOptions cliOptions = variantCommandOptions.sampleQcCommandOptions; + // Check signature release + checkSignatureRelease(cliOptions.signatureRelease); + // Build variant query from cli options AnnotationVariantQueryParams variantStatsQuery = ToolParams.fromParams(AnnotationVariantQueryParams.class, cliOptions.variantStatsQuery); @@ -903,6 +910,7 @@ private void sampleQc() throws Exception { cliOptions.signatureId, cliOptions.signatureDescription, new ObjectMap(cliOptions.signatureQuery), + cliOptions.signatureRelease, cliOptions.genomePlotId, cliOptions.genomePlotDescr, cliOptions.genomePlotConfigFile, diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index 1a5b140ead5..dc7a2a09da9 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1258,6 +1258,9 @@ public class MutationalSignatureCommandOptions { @DynamicParameter(names = {"-q", "--query"}, description = "Signature query, e.g.:. -q type=\"SNV\" -q ct=\"missense_variant\"") public Map query = new HashMap<>(); + @Parameter(names = {"--release"}, description = "Release of COSMIC mutational signatures. Valid values: 2, 3, 3.1 and 3.2.") + public String release = "2"; + @Parameter(names = {"--fitting"}, description = "Compute the relative proportions of the different mutational signatures demonstrated by the tumour.") public boolean fitting; @@ -1484,6 +1487,10 @@ public class SampleQcCommandOptions { @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") public Map signatureQuery = new HashMap<>(); + @Parameter(names = {"--signature-release"}, description = "Release of COSMIC mutational signatures. Valid values: 2, 3, 3.1 and 3.2.") + public String signatureRelease = "2"; + + @Parameter(names = {"--gpi", "--genome-plot-id"}, description = "Genome plot ID.") public String genomePlotId; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java index 8b37db93297..cd2cb5ddb85 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/VariantCommandExecutor.java @@ -343,12 +343,16 @@ private RestResponse sampleEligibility() throws ClientException { // } private RestResponse mutationalSignature() throws ClientException { + // Check signature release + checkSignatureRelease(variantCommandOptions.mutationalSignatureCommandOptions.release); + return openCGAClient.getVariantClient().runMutationalSignature( new MutationalSignatureAnalysisParams( variantCommandOptions.mutationalSignatureCommandOptions.sample, variantCommandOptions.mutationalSignatureCommandOptions.id, variantCommandOptions.mutationalSignatureCommandOptions.description, new ObjectMap(variantCommandOptions.mutationalSignatureCommandOptions.query), + variantCommandOptions.mutationalSignatureCommandOptions.release, variantCommandOptions.mutationalSignatureCommandOptions.fitting, variantCommandOptions.mutationalSignatureCommandOptions.outdir ), @@ -432,6 +436,9 @@ private RestResponse individualQc() throws ClientException { private RestResponse sampleQc() throws ClientException { VariantCommandOptions.SampleQcCommandOptions cliOptions = variantCommandOptions.sampleQcCommandOptions; + // Check signature release + checkSignatureRelease(cliOptions.signatureRelease); + // Build variant query from cli options AnnotationVariantQueryParams variantStatsQuery = ToolParams.fromParams(AnnotationVariantQueryParams.class, cliOptions.variantStatsQuery); @@ -445,6 +452,7 @@ private RestResponse sampleQc() throws ClientException { cliOptions.signatureId, cliOptions.signatureDescription, new ObjectMap(cliOptions.signatureQuery), + cliOptions.signatureRelease, cliOptions.genomePlotId, cliOptions.genomePlotDescr, cliOptions.genomePlotConfigFile, diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java index 2d234acc28e..ed903ab2761 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/MutationalSignatureAnalysisParams.java @@ -26,6 +26,7 @@ public class MutationalSignatureAnalysisParams extends ToolParams { private String id; private String description; private ObjectMap query; + private String release; private boolean fitting; private String outdir; @@ -33,12 +34,13 @@ public class MutationalSignatureAnalysisParams extends ToolParams { public MutationalSignatureAnalysisParams() { } - public MutationalSignatureAnalysisParams(String sample, String id, String description, ObjectMap query, + public MutationalSignatureAnalysisParams(String sample, String id, String description, ObjectMap query, String release, boolean fitting, String outdir) { this.sample = sample; this.id = id; this.description = description; this.query = query; + this.release = release; this.fitting = fitting; this.outdir = outdir; } @@ -50,6 +52,7 @@ public String toString() { sb.append(", id='").append(id).append('\''); sb.append(", description='").append(description).append('\''); sb.append(", query=").append(query); + sb.append(", release='").append(release).append('\''); sb.append(", fitting=").append(fitting); sb.append(", outdir='").append(outdir).append('\''); sb.append('}'); @@ -92,6 +95,15 @@ public MutationalSignatureAnalysisParams setQuery(ObjectMap query) { return this; } + public String getRelease() { + return release; + } + + public MutationalSignatureAnalysisParams setRelease(String release) { + this.release = release; + return this; + } + public boolean isFitting() { return fitting; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java index 75d6fdf656e..641059d7140 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java @@ -28,6 +28,7 @@ public class SampleQcAnalysisParams extends ToolParams { private String signatureId; private String signatureDescription; private ObjectMap signatureQuery; + private String signatureRelease; private String genomePlotId; private String genomePlotDescription; private String genomePlotConfigFile; @@ -38,8 +39,8 @@ public SampleQcAnalysisParams() { public SampleQcAnalysisParams(String sample, String variantStatsId, String variantStatsDescription, AnnotationVariantQueryParams variantStatsQuery, String signatureId, String signatureDescription, - ObjectMap signatureQuery, String genomePlotId, String genomePlotDescription, String genomePlotConfigFile, - String outdir) { + ObjectMap signatureQuery, String signatureRelease, String genomePlotId, String genomePlotDescription, + String genomePlotConfigFile, String outdir) { this.sample = sample; this.variantStatsId = variantStatsId; this.variantStatsDescription = variantStatsDescription; @@ -47,6 +48,7 @@ public SampleQcAnalysisParams(String sample, String variantStatsId, String varia this.signatureId = signatureId; this.signatureDescription = signatureDescription; this.signatureQuery = signatureQuery; + this.signatureRelease = signatureRelease; this.genomePlotId = genomePlotId; this.genomePlotDescription = genomePlotDescription; this.genomePlotConfigFile = genomePlotConfigFile; @@ -63,6 +65,7 @@ public String toString() { sb.append(", signatureId='").append(signatureId).append('\''); sb.append(", signatureDescription='").append(signatureDescription).append('\''); sb.append(", signatureQuery=").append(signatureQuery); + sb.append(", signatureRelease=").append(signatureRelease); sb.append(", genomePlotId='").append(genomePlotId).append('\''); sb.append(", genomePlotDescription='").append(genomePlotDescription).append('\''); sb.append(", genomePlotConfigFile='").append(genomePlotConfigFile).append('\''); @@ -134,6 +137,15 @@ public SampleQcAnalysisParams setSignatureQuery(ObjectMap signatureQuery) { return this; } + public String getSignatureRelease() { + return signatureRelease; + } + + public SampleQcAnalysisParams setSignatureRelease(String signatureRelease) { + this.signatureRelease = signatureRelease; + return this; + } + public String getGenomePlotId() { return genomePlotId; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java index 5a0397eeb72..c817ec48a21 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/variant/MutationalSignatureAnalysisExecutor.java @@ -39,6 +39,7 @@ public abstract class MutationalSignatureAnalysisExecutor extends OpenCgaToolExe private String queryId; private String queryDescription; private ObjectMap query; + private String release; private boolean fitting; public MutationalSignatureAnalysisExecutor() { @@ -48,6 +49,10 @@ public static String getContextIndexFilename(String sampleName) { return "OPENCGA_" + sampleName + "_genome_context.csv"; } + protected String getMutationalSignatureFilename() { + return "COSMIC_v" + release + "_SBS_" + assembly + ".txt"; + } + protected static Map> initFreqMap() { Map> map = new LinkedHashMap<>(); for (String firstKey : FIRST_LEVEL_KEYS) { @@ -197,6 +202,15 @@ public MutationalSignatureAnalysisExecutor setQuery(ObjectMap query) { return this; } + public String getRelease() { + return release; + } + + public MutationalSignatureAnalysisExecutor setRelease(String release) { + this.release = release; + return this; + } + public boolean isFitting() { return fitting; } From 135e2009879a3386a0a390337f708a878d2b8a03 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 3 Jun 2021 14:38:37 +0200 Subject: [PATCH 370/412] docs: add sample-individual example to templates --- docs/manual/administrator/templates-manifest.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index d31fe7ca914..25aa8dc6212 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -44,6 +44,12 @@ You can load data for the entities using **TAB separated .txt files**. There are * The order of the columns is not relevant. ```text +samples.txt +#id individualId somatic +s1 NA001 true +s2 NA001 true +s3 NA002 true + individuals.txt: #id name sex status.name NA001 uk1 female READY @@ -55,5 +61,11 @@ individuals.phenotypes.txt NA001 HP:0002664 Neoplasm HPO NA001 HP:0002664 Lung Adenocarcinoma HPO +individuals.samples.txt +#IndividualId id +NA001 s1 +NA001 s2 +NA002 s3 + ``` From 4d7ba144599b9f4e38c5bec4b51567bb8f6847c2 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 3 Jun 2021 15:27:02 +0200 Subject: [PATCH 371/412] catalog: change to IndividualUpdateParam data model, closes #1774 --- .../administrator/templates-manifest.md | 2 + .../models/IndividualPrivateUpdateParams.java | 3 +- .../catalog/IndividualCommandExecutor.java | 5 ++- .../catalog/managers/IndividualManager.java | 21 +++++++--- .../catalog/managers/CatalogManagerTest.java | 13 +++--- .../catalog/managers/FamilyManagerTest.java | 10 +++-- .../individual/IndividualUpdateParams.java | 9 ++-- .../models/sample/SampleReferenceParam.java | 42 +++++++++++++++++++ 8 files changed, 84 insertions(+), 21 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleReferenceParam.java diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index 25aa8dc6212..2848b9dac91 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -50,6 +50,7 @@ s1 NA001 true s2 NA001 true s3 NA002 true + individuals.txt: #id name sex status.name NA001 uk1 female READY @@ -61,6 +62,7 @@ individuals.phenotypes.txt NA001 HP:0002664 Neoplasm HPO NA001 HP:0002664 Lung Adenocarcinoma HPO + individuals.samples.txt #IndividualId id NA001 s1 diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java index aa8db38c993..cca95d19987 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java @@ -6,6 +6,7 @@ import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.CustomStatusParams; import org.opencb.opencga.core.models.individual.*; +import org.opencb.opencga.core.models.sample.SampleReferenceParam; import java.util.List; import java.util.Map; @@ -21,7 +22,7 @@ public IndividualPrivateUpdateParams(String id, String name, String father, Stri Location location, IndividualProperty.Sex sex, String ethnicity, IndividualPopulation population, String dateOfBirth, IndividualProperty.KaryotypicSex karyotypicSex, IndividualProperty.LifeStatus lifeStatus, IndividualProperty.AffectationStatus affectationStatus, - List samples, List annotationSets, List phenotypes, + List samples, List annotationSets, List phenotypes, List disorders, CustomStatusParams status, IndividualQualityControl qualityControl, Map attributes, IndividualInternal internal) { super(id, name, father, mother, parentalConsanguinity, location, sex, ethnicity, population, dateOfBirth, karyotypicSex, lifeStatus, diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/IndividualCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/IndividualCommandExecutor.java index f3dd2c2b01e..fca32f1c522 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/IndividualCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/IndividualCommandExecutor.java @@ -35,6 +35,7 @@ import org.opencb.opencga.core.models.individual.*; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleCreateParams; +import org.opencb.opencga.core.models.sample.SampleReferenceParam; import org.opencb.opencga.core.response.RestResponse; import java.io.File; @@ -187,7 +188,9 @@ private RestResponse update() throws ClientException { .setMother(commandOptions.motherId) .setDateOfBirth(commandOptions.dateOfBirth) .setSex(commandOptions.sex) - .setSamples(commandOptions.samples) + .setSamples(commandOptions.samples != null + ? commandOptions.samples.stream().map(s -> new SampleReferenceParam().setId(s)).collect(Collectors.toList()) + : null) .setEthnicity(commandOptions.ethnicity) .setKaryotypicSex(commandOptions.karyotypicSex) .setLifeStatus(commandOptions.lifeStatus) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java index 146465e08eb..dd4a2c4f153 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java @@ -17,12 +17,12 @@ package org.opencb.opencga.catalog.managers; import com.fasterxml.jackson.core.JsonProcessingException; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.pedigree.IndividualProperty; import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; @@ -38,6 +38,7 @@ import org.opencb.opencga.catalog.utils.UuidUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.CustomStatus; import org.opencb.opencga.core.models.common.Enums; @@ -45,6 +46,7 @@ import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.individual.*; import org.opencb.opencga.core.models.sample.Sample; +import org.opencb.opencga.core.models.sample.SampleReferenceParam; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.study.StudyAclEntry; import org.opencb.opencga.core.models.study.VariableSet; @@ -1333,11 +1335,20 @@ private OpenCGAResult update(Study study, Individual individual, IndividualUpdat } } } - if (updateParams != null && ListUtils.isNotEmpty(updateParams.getSamples())) { + if (updateParams != null && CollectionUtils.isNotEmpty(updateParams.getSamples())) { // Check those samples can be used - List sampleStringList = updateParams.getSamples(); - List sampleList = catalogManager.getSampleManager().internalGet(studyUid, sampleStringList, - SampleManager.INCLUDE_SAMPLE_IDS, userId, false).getResults(); + List idList = new ArrayList<>(updateParams.getSamples().size()); + for (SampleReferenceParam sample : updateParams.getSamples()) { + if (StringUtils.isNotEmpty(sample.getId())) { + idList.add(sample.getId()); + } else if (StringUtils.isNotEmpty(sample.getUuid())) { + idList.add(sample.getUuid()); + } else { + throw new CatalogException("Missing id or uuid in 'samples'"); + } + } + List sampleList = catalogManager.getSampleManager().internalGet(studyUid, idList, SampleManager.INCLUDE_SAMPLE_IDS, + userId, false).getResults(); // Check those samples are not in use by other individuals checkSamplesNotInUseInOtherIndividual(sampleList.stream().map(Sample::getUid).collect(Collectors.toSet()), studyUid, diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java index ae4e4b3c0de..1200e214233 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerTest.java @@ -44,10 +44,7 @@ import org.opencb.opencga.core.models.individual.IndividualUpdateParams; import org.opencb.opencga.core.models.job.*; import org.opencb.opencga.core.models.project.Project; -import org.opencb.opencga.core.models.sample.Sample; -import org.opencb.opencga.core.models.sample.SampleAclEntry; -import org.opencb.opencga.core.models.sample.SampleAclParams; -import org.opencb.opencga.core.models.sample.SampleUpdateParams; +import org.opencb.opencga.core.models.sample.*; import org.opencb.opencga.core.models.study.*; import org.opencb.opencga.core.models.user.Account; import org.opencb.opencga.core.models.user.User; @@ -1542,7 +1539,8 @@ public void testUpdateIndividualSamples() throws CatalogException { actionMap.put(IndividualDBAdaptor.QueryParams.SAMPLES.key(), ParamUtils.BasicUpdateAction.ADD); QueryOptions options = new QueryOptions(Constants.ACTIONS, actionMap); - IndividualUpdateParams updateParams = new IndividualUpdateParams().setSamples(Arrays.asList(sample2.getId(), sample3.getId())); + IndividualUpdateParams updateParams = new IndividualUpdateParams().setSamples(Arrays.asList( + new SampleReferenceParam().setId(sample2.getId()), new SampleReferenceParam().setId(sample3.getId()))); OpenCGAResult update = catalogManager.getIndividualManager().update(studyFqn, individual.getId(), updateParams, options, token); assertEquals(1, update.getNumUpdated()); @@ -1561,7 +1559,7 @@ public void testUpdateIndividualSamples() throws CatalogException { actionMap.put(IndividualDBAdaptor.QueryParams.SAMPLES.key(), ParamUtils.BasicUpdateAction.REMOVE); options = new QueryOptions(Constants.ACTIONS, actionMap); - updateParams = new IndividualUpdateParams().setSamples(Collections.singletonList(sample2.getId())); + updateParams = new IndividualUpdateParams().setSamples(Collections.singletonList(new SampleReferenceParam().setId(sample2.getId()))); update = catalogManager.getIndividualManager().update(studyFqn, individual.getId(), updateParams, options, token); assertEquals(1, update.getNumUpdated()); @@ -1574,7 +1572,8 @@ public void testUpdateIndividualSamples() throws CatalogException { actionMap.put(IndividualDBAdaptor.QueryParams.SAMPLES.key(), ParamUtils.BasicUpdateAction.SET); options = new QueryOptions(Constants.ACTIONS, actionMap); - updateParams = new IndividualUpdateParams().setSamples(Arrays.asList(sample.getId(), sample2.getId())); + updateParams = new IndividualUpdateParams().setSamples(Arrays.asList( + new SampleReferenceParam().setId(sample.getId()), new SampleReferenceParam().setId(sample2.getId()))); update = catalogManager.getIndividualManager().update(studyFqn, individual.getId(), updateParams, options, token); assertEquals(1, update.getNumUpdated()); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java index 295b3c9a5f6..cde26cc3dd4 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java @@ -48,6 +48,7 @@ import org.opencb.opencga.core.models.individual.IndividualUpdateParams; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAclEntry; +import org.opencb.opencga.core.models.sample.SampleReferenceParam; import org.opencb.opencga.core.models.user.Account; import org.opencb.opencga.core.response.OpenCGAResult; @@ -654,11 +655,14 @@ private DataResult createDummyFamily(String familyName, boolean createMi if (createMissingMembers) { catalogManager.getIndividualManager().update(STUDY, relChild1.getId(), - new IndividualUpdateParams().setSamples(Collections.singletonList("sample1")), QueryOptions.empty(), sessionIdUser); + new IndividualUpdateParams().setSamples(Collections.singletonList(new SampleReferenceParam().setId("sample1"))), + QueryOptions.empty(), sessionIdUser); catalogManager.getIndividualManager().update(STUDY, relFather.getId(), - new IndividualUpdateParams().setSamples(Collections.singletonList("sample2")), QueryOptions.empty(), sessionIdUser); + new IndividualUpdateParams().setSamples(Collections.singletonList(new SampleReferenceParam().setId("sample2"))), + QueryOptions.empty(), sessionIdUser); catalogManager.getIndividualManager().update(STUDY, relMother.getId(), - new IndividualUpdateParams().setSamples(Collections.singletonList("sample3")), QueryOptions.empty(), sessionIdUser); + new IndividualUpdateParams().setSamples(Collections.singletonList(new SampleReferenceParam().setId("sample3"))), + QueryOptions.empty(), sessionIdUser); } return familyOpenCGAResult; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualUpdateParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualUpdateParams.java index 6eda2f93079..ffe1970d0ba 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualUpdateParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualUpdateParams.java @@ -24,6 +24,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.CustomStatusParams; +import org.opencb.opencga.core.models.sample.SampleReferenceParam; import java.util.List; import java.util.Map; @@ -46,7 +47,7 @@ public class IndividualUpdateParams { private IndividualProperty.KaryotypicSex karyotypicSex; private IndividualProperty.LifeStatus lifeStatus; private IndividualProperty.AffectationStatus affectationStatus; - private List samples; + private List samples; private List annotationSets; private List phenotypes; private List disorders; @@ -61,7 +62,7 @@ public IndividualUpdateParams(String id, String name, String father, String moth Location location, IndividualProperty.Sex sex, String ethnicity, IndividualPopulation population, String dateOfBirth, IndividualProperty.KaryotypicSex karyotypicSex, IndividualProperty.LifeStatus lifeStatus, IndividualProperty.AffectationStatus affectationStatus, - List samples, List annotationSets, List phenotypes, + List samples, List annotationSets, List phenotypes, List disorders, CustomStatusParams status, IndividualQualityControl qualityControl, Map attributes) { this.id = id; @@ -246,11 +247,11 @@ public IndividualUpdateParams setAffectationStatus(IndividualProperty.Affectatio return this; } - public List getSamples() { + public List getSamples() { return samples; } - public IndividualUpdateParams setSamples(List samples) { + public IndividualUpdateParams setSamples(List samples) { this.samples = samples; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleReferenceParam.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleReferenceParam.java new file mode 100644 index 00000000000..da116de89ff --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleReferenceParam.java @@ -0,0 +1,42 @@ +package org.opencb.opencga.core.models.sample; + +public class SampleReferenceParam { + + private String id; + private String uuid; + + public SampleReferenceParam() { + } + + public SampleReferenceParam(String id, String uuid) { + this.id = id; + this.uuid = uuid; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("SampleReferenceParam{"); + sb.append("id='").append(id).append('\''); + sb.append(", uuid='").append(uuid).append('\''); + sb.append('}'); + return sb.toString(); + } + + public String getId() { + return id; + } + + public SampleReferenceParam setId(String id) { + this.id = id; + return this; + } + + public String getUuid() { + return uuid; + } + + public SampleReferenceParam setUuid(String uuid) { + this.uuid = uuid; + return this; + } +} From 5982fb562d25f2d1bda2e5f72ee595569e1d7cdd Mon Sep 17 00:00:00 2001 From: lauralopezreal Date: Thu, 3 Jun 2021 14:41:58 +0100 Subject: [PATCH 372/412] client: add annotation to variable set + admin_client and guest_client #1716 --- .../admin-training/pyopencga_admin.ipynb | 156 ++++++++---------- 1 file changed, 72 insertions(+), 84 deletions(-) diff --git a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb index 49cfeb4e6a3..47b52fd7945 100644 --- a/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb +++ b/opencga-client/src/main/python/notebooks/admin-training/pyopencga_admin.ipynb @@ -8,10 +8,10 @@ "------\n", "This notebook is intended to provide guidance on performing advanced common administrator actios required for maintaining a OpenCGA installation, from granting permission to other users to updating the metadata for samples or individuals in the database.\n", "\n", - "It is highly recommended to check the documentation about [Sharing and Permissions](https://app.gitbook.com/@opencb/s/opencga/~/drafts/-Magktiifb08PPiPnoYk/manual/data-management/sharing-and-permissions) in OpenCGA before trying to run this notebook.\n", + "Before running this notebook, it is highly recommended to check the official OpenCGA documentation about [Sharing and Permissions](https://app.gitbook.com/@opencb/s/opencga/~/drafts/-Magktiifb08PPiPnoYk/manual/data-management/sharing-and-permissions), [Adding Custom Metadata](https://app.gitbook.com/@opencb/s/opencga/~/drafts/-MbG9-KDgXf7z8BZJCXq/manual/data-management/adding-custom-metadata) and [Data Models](https://app.gitbook.com/@opencb/s/opencga/~/drafts/-MbG9-KDgXf7z8BZJCXq/manual/data-models).\n", "\n", "**[NOTES]** \n", - "- For guidance on how to loggin and get started with *opencga* you can refer to : [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", + "- For guidance on how to loggin and get started with *pyopencga* you can refer to : [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", "\n", "- A good first step when start working with OpenCGA is to explore **Catalog** the OpenCGA component which holds information about our user, the projects and studies our user has permission to access and the clinical data from the studies. For guidance you can refer to : [pyopencga_catalog.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)
\n", "\n", @@ -22,8 +22,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Table of Contents:\n", - "\n", "## Table of Contents:\n", "\n", "This Notebook is organised in the following sections:\n", @@ -41,7 +39,7 @@ "source": [ "## Setup the Client and Login into *pyopencga* \n", "\n", - "**Configuration and Credentials** \n", + "### Configuration and Credentials\n", "\n", "Let's assume we already have *pyopencga* installed in our python setup (all the steps described on [pyopencga_first_steps.ipynb](https://github.com/opencb/opencga/tree/develop/opencga-client/src/main/python/notebooks/user-training)).\n", "\n", @@ -50,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -74,61 +72,68 @@ " }\n", "\n", "## Step 4. Create the ClientConfiguration and OpenCGA client\n", - "config = ClientConfiguration(config_dict)\n", - "oc = OpencgaClient(config)\n" + "config = ClientConfiguration(config_dict)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "For the purpose of the training, we will work with an user that belongs to the `@admins group`. This means the user has admin priviledges. \n", + "### Working with two clients: **`demo-admin`** and **`demo-guest`** \n", + "For the purpose of the training, we will work with two users: **`demo-admin`** (which belongs to the `@admins` group, and thus it has admin priviledges) and **`demo-guest`** (which is not admin of the study). \n", "\n", - "__[NOTE]:__ Working with an admin user is required for follow up with the queries used in this notebook." + "__[NOTE]:__ Working with both users is required for following up the queries used in this notebook." ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Logged succesfuly as demo-admin to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWFkbWluIiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjcxNzA2OCwiZXhwIjoxNjIyNzIwNjY4fQ.gMDKB5cy23MMuD3P1SRcDYoo4FftBi21NO7TQjlN4Qo well done!\n" + ] + } + ], "source": [ - "## Step 5. Define admin user credentials\n", + "## Step 5.1 Define admin user credentials\n", "admin_user = 'demo-admin'\n", - "password = 'demo-admin'" + "password = 'demo-admin'\n", + "admin_client = OpencgaClient(config)\n", + "admin_client.login(admin_user, password)\n", + "print('Logged succesfuly as {} to {}, your token is: {} well done!'.format(admin_user, host, admin_client.token))" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Logged succesfuly to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWFkbWluIiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjY0MzEwNywiZXhwIjoxNjIyNjQ2NzA3fQ.E3flYTKmmMTARE4GD5ejLj0qwdb9LHsAHWpidd1GE6g well done!\n" + "Logged succesfuly as demo-guest to https://ws.opencb.org/opencga-prod, your token is: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vLWd1ZXN0IiwiYXVkIjoiT3BlbkNHQSB1c2VycyIsImlhdCI6MTYyMjcxNzA3MCwiZXhwIjoxNjIyNzIwNjcwfQ.AP1xeBZbGTUQ6JdE0pWGksLbmm8w-LzhBPpN0r4LmPw well done!\n" ] } ], "source": [ - "## Step 6. Login to OpenCGA using the OpenCGA client \n", - "# Pass the credentials to the client\n", - "\n", - "# (here we put only the user in order to be asked for the password interactively)\n", - "#oc.login(admin_user)\n", - "\n", - "## or you can pass the user and passwd\n", - "oc.login(admin_user, password)\n", - "\n", - "print('Logged succesfuly to {}, your token is: {} well done!'.format(host, oc.token))" + "## Step 5.2 Define guest user credentials\n", + "guest_user = 'demo-guest'\n", + "password = 'demo-guest'\n", + "guest_client = OpencgaClient(config)\n", + "guest_client.login(guest_user, password)\n", + "print('Logged succesfuly as {} to {}, your token is: {} well done!'.format(guest_user, host, guest_client.token))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Setup OpenCGA Variables\n", + "### Setup OpenCGA Variables\n", "\n", "Once we have defined a variable with the client configuration and credentials, we can access to all the methods defined for the client. These methods implement calls to query different data models in *OpenCGA*. \n", "\n", @@ -198,7 +203,7 @@ ], "source": [ "## Add users to study\n", - "update_users = oc.studies.update_users(study=study, group='members', data={\"users\": [\"trainee1\",\"trainee2\"]})\n", + "update_users = admin_client.studies.update_users(study=study, group='members', data={\"users\": [\"trainee1\", \"trainee2\"]})\n", "update_users.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", @@ -223,7 +228,7 @@ "outputs": [], "source": [ "## Remove users from members group of study\n", - "remove_users = oc.studies.update_users(study=study, group='members', action='REMOVE', data={\"users\": [\"trainee1\",\"trainee2\"]})\n", + "remove_users = admin_client.studies.update_users(study=study, group='members', action='REMOVE', data={\"users\": [\"trainee1\", \"trainee2\"]})\n", "remove_users.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", @@ -264,7 +269,7 @@ " ]}\n", "\n", "## Define a new Training group.\n", - "update_groups = oc.studies.update_groups(study=study, action='ADD', data=group_data)\n", + "update_groups = admin_client.studies.update_groups(study=study, action='ADD', data=group_data)\n", "update_groups.print_results(fields='', metadata=False, title='Info about groups')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", @@ -303,7 +308,7 @@ " \"template\": \"view_only\"}\n", "\n", "## Update the permissions\n", - "update_acl = oc.studies.update_acl(study=study, members='@training_group', action='ADD', data=permission_data)\n", + "update_acl = admin_client.studies.update_acl(study=study, members='@training_group', action='ADD', data=permission_data)\n", "update_acl.print_results(metadata=False, title='Info about permissions for new group')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", @@ -333,7 +338,7 @@ "# ]}\n", "\n", "## Uncomment this to delete the samples\n", - "# delete_group = oc.studies.update_groups(study=study, action='REMOVE', data=group_data)\n", + "# delete_group = admin_client.studies.update_groups(study=study, action='REMOVE', data=group_data)\n", "# delete_group.print_results(metadata=False, title='Info about groups')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", @@ -373,7 +378,7 @@ ], "source": [ "## Check Study groups\n", - "groups = oc.studies.groups(study=study)\n", + "groups = admin_client.studies.groups(study=study)\n", "groups.print_results(fields='', metadata=False, title='Groups in Study {}'.format(study))\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", @@ -446,7 +451,7 @@ " \"somatic\": somatic\n", " }\n", "\n", - " oc.samples.create(study=study, data=sample_data)\n", + " admin_client.samples.create(study=study, data=sample_data)\n", " print('The sample: {} has been created successfully'.format(sample))\n" ] }, @@ -469,12 +474,12 @@ "sample_ids = ['sample1', 'sample2-germinal', 'sample2-somatic']\n", "\n", "for sample in sample_ids:\n", - " samples = oc.samples.search(study=study, id=sample)\n", + " samples = admin_client.samples.search(study=study, id=sample)\n", " samples.print_results(fields='id,collection,somatic', metadata=False, title='Info about sample {}'.format(sample))\n", " print('\\n')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", - "samples = oc.samples.search(study=study, id=sample_ids)\n", + "samples = admin_client.samples.search(study=study, id=sample_ids)\n", "# JSON(samples.get_results())" ] }, @@ -494,7 +499,7 @@ "outputs": [], "source": [ "## Uncomment this to delete the samples\n", - "# delete_samples = oc.samples.delete(study=study, samples=['sample1,sample2-germinal,sample2-somatic'])\n", + "# delete_samples = admin_client.samples.delete(study=study, samples=['sample1,sample2-germinal,sample2-somatic'])\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", "# JSON(delete_samples.get_results())" @@ -534,7 +539,7 @@ " \"dateOfBirth\": \"19900587\",\n", " \"karyotypicSex\": \"XY\",\n", " \"lifeStatus\": \"ALIVE\"}\n", - " oc.individuals.create(study=study, data=individual_data)\n", + " admin_client.individuals.create(study=study, data=individual_data)\n", " print('The individual {} has been created succesfully'.format(individual))\n" ] }, @@ -554,12 +559,12 @@ "## Print information about the individuals\n", "individual_ids = ['individual1', 'individual2']\n", "for individual in individual_ids:\n", - " individuals = oc.individuals.search(study=study, id=individual)\n", + " individuals = admin_client.individuals.search(study=study, id=individual)\n", " individuals.print_results(fields='id,name,sex,ethnicity,lifeStatus,population,dateOfBirth', metadata=False, title='Info about individual {}'.format(individual))\n", " print('\\n')\n", " \n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", - "individuals = oc.individuals.search(study=study, id=individual_ids)\n", + "individuals = admin_client.individuals.search(study=study, id=individual_ids)\n", "# JSON(individuals.get_results())" ] }, @@ -587,7 +592,7 @@ "## Asign Samples to individuals\n", "for individual in individual_ids:\n", " samples_associated = sample_dict[individual]\n", - " oc.individuals.update(study=study, individuals=individual, data={'samples':samples_associated})\n", + " admin_client.individuals.update(study=study, individuals=individual, data={'samples':samples_associated})\n", " print('The individual {} has been updated successfully!'.format(individual))" ] }, @@ -607,12 +612,12 @@ "## Print information about the individuals with their correspondent samples\n", "individual_ids = ['individual1', 'individual2']\n", "for individual in individual_ids:\n", - " individuals = oc.individuals.search(study=study, id=individual)\n", + " individuals = admin_client.individuals.search(study=study, id=individual)\n", " individuals.print_results(fields='id,samples.id,samples.somatic,samples.collection.tissue,samples.collection.method', metadata=False, title='Info about individual {} with the samples'.format(individual))\n", " print('\\n')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", - "individuals = oc.individuals.search(study=study, id=individual_ids, include='samples')\n", + "individuals = admin_client.individuals.search(study=study, id=individual_ids, include='samples')\n", "# JSON(individuals.get_results())" ] }, @@ -630,7 +635,7 @@ "outputs": [], "source": [ "## Uncomment this to delete the individuals\n", - "delete_individuals = oc.individuals.delete(study=study, individuals='individual1,individual2')\n", + "delete_individuals = admin_client.individuals.delete(study=study, individuals='individual1,individual2')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", "# JSON(delete_individuals.get_results())" @@ -682,7 +687,7 @@ " \"dateOfBirth\": \"19900587\",\n", " \"karyotypicSex\": \"XX\",\n", " \"lifeStatus\": \"ALIVE\"}\n", - " oc.individuals.create(study=study, data=individual_data)\n", + " admin_client.individuals.create(study=study, data=individual_data)\n", " print('The individual {} has been created succesfully'.format(individual))\n" ] }, @@ -724,7 +729,7 @@ "## Assign Phenotypes to individuals\n", "for individual in individual_ids:\n", " phenotypes_associated = phenotype_dict[individual]\n", - " oc.individuals.update(study=study, individuals=individual, data={'phenotypes':phenotypes_associated})\n", + " admin_client.individuals.update(study=study, individuals=individual, data={'phenotypes':phenotypes_associated})\n", " print('The individual {} has been updated successfully!'.format(individual))" ] }, @@ -763,12 +768,12 @@ "## Print information about the individuals with their correspondent samples\n", "individual_ids = ['individual_A', 'individual_B'] \n", "for individual in individual_ids:\n", - " individuals = oc.individuals.search(study=study, id=individual)\n", + " individuals = admin_client.individuals.search(study=study, id=individual)\n", " individuals.print_results(fields='id,phenotypes.id,phenotypes.name,phenotypes.source,phenotypes.status', metadata=False, title='Info about the phenotypes of individual: {}'.format(individual))\n", " print('\\n')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", - "individuals = oc.individuals.search(study=study, id=individual_ids, include='phenotypes')\n", + "individuals = admin_client.individuals.search(study=study, id=individual_ids, include='phenotypes')\n", "# JSON(individuals.get_results())" ] }, @@ -807,7 +812,7 @@ "## Assign Disorders to Individuals\n", "for individual in individual_ids:\n", " disorders_associated = disorders_dict[individual]\n", - " oc.individuals.update(study=study, individuals=individual, data={'disorders':disorders_associated})\n", + " admin_client.individuals.update(study=study, individuals=individual, data={'disorders':disorders_associated})\n", " print('The individual {} has been updated successfully!'.format(individual))" ] }, @@ -827,12 +832,12 @@ "## Print information about the individuals with their correspondent samples\n", "individual_ids = ['individual_A', 'individual_B'] \n", "for individual in individual_ids:\n", - " individuals = oc.individuals.search(study=study, id=individual)\n", + " individuals = admin_client.individuals.search(study=study, id=individual)\n", " individuals.print_results(fields='id,disorders.id,disorders.name,disorders.source,disorders.description', metadata=False, title='Info about the disorders of individual: {}'.format(individual))\n", " print('\\n')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", - "individuals = oc.individuals.search(study=study, id=individual_ids, include='disorders')\n", + "individuals = admin_client.individuals.search(study=study, id=individual_ids, include='disorders')\n", "# JSON(individuals.get_results())" ] }, @@ -850,7 +855,7 @@ "outputs": [], "source": [ "## Uncomment this to delete the individuals\n", - "delete_individuals = oc.individuals.delete(study=study, individuals=individual_ids)\n", + "delete_individuals = admin_client.individuals.delete(study=study, individuals=individual_ids)\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", "# JSON(delete_individuals.get_results())" @@ -902,7 +907,7 @@ " }\n", "\n", "## Create the individual\n", - "Individual_with_data = oc.individuals.create(study=study, data=individual_data)\n", + "Individual_with_data = admin_client.individuals.create(study=study, data=individual_data)\n", "print('The individual has been successfully created')" ] }, @@ -924,7 +929,7 @@ "outputs": [], "source": [ "## Display an interactive JSON viewer of the REST response\n", - "individuals = oc.individuals.search(study=study, id='Individual_with_data')\n", + "individuals = admin_client.individuals.search(study=study, id='Individual_with_data')\n", "JSON(individuals.get_results())" ] }, @@ -942,7 +947,7 @@ "outputs": [], "source": [ "## Uncomment this to delete the individuals\n", - "delete_individuals = oc.individuals.delete(study=study, individuals='Individual_with_data')\n", + "delete_individuals = admin_client.individuals.delete(study=study, individuals='Individual_with_data')\n", "\n", "## Uncomment next line to display an interactive JSON viewer of the REST response\n", "# JSON(delete_individuals.get_results())" @@ -1021,7 +1026,7 @@ "outputs": [], "source": [ "## Add the variable set to the Sample data model of the study\n", - "add_variable_set = oc.studies.update_variable_sets(study=study, action='ADD', data=sample_variable_set)" + "add_variable_set = admin_client.studies.update_variable_sets(study=study, action='ADD', data=sample_variable_set)" ] }, { @@ -1046,7 +1051,7 @@ ], "source": [ "## Search for the variable set\n", - "variable_sets = oc.studies.variable_sets(study=study)\n", + "variable_sets = admin_client.studies.variable_sets(study=study)\n", "variable_sets.print_results(fields='id,name,unique,description', metadata=False, title='List of Variable Sets in study: {}'.format(study))" ] }, @@ -1064,7 +1069,7 @@ "outputs": [], "source": [ "## Remove the variable set to the Sample data model of the study\n", - "#remove_variable_set = oc.studies.update_variable_sets(study=study, action='REMOVE', data=sample_variable_set)" + "#remove_variable_set = admin_client.studies.update_variable_sets(study=study, action='REMOVE', data=sample_variable_set)" ] }, { @@ -1076,43 +1081,26 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 8, "metadata": {}, - "outputs": [ - { - "ename": "Exception", - "evalue": "b'{\"apiVersion\":\"v2\",\"time\":190,\"events\":[{\"type\":\"ERROR\",\"code\":0,\"id\":\"org.opencb.opencga.catalog.exceptions.CatalogException\",\"name\":\"CatalogException\",\"message\":\"AnnotationSet annotation_set_id not found. Annotations could not be updated.\"}],\"params\":{\"limit\":\"1000\",\"skip\":\"0\",\"annotationSet\":\"annotation_set_id\",\"sample\":\"sample1\"},\"responses\":[{\"time\":0,\"events\":[],\"numResults\":0,\"results\":[],\"resultType\":\"\",\"numTotalResults\":0,\"numMatches\":0,\"numInserted\":0,\"numUpdated\":0,\"numDeleted\":0,\"attributes\":{}}]}'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;31m## Annotate the variable set\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0moc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msamples\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate_annotations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'sample1'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mannotation_set\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'annotation_set_id'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_annotation_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/rest_clients/sample_client.py\u001b[0m in \u001b[0;36mupdate_annotations\u001b[0;34m(self, sample, annotation_set, data, **options)\u001b[0m\n\u001b[1;32m 332\u001b[0m \"\"\"\n\u001b[1;32m 333\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 334\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_post\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcategory\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'samples'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresource\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'annotations/update'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquery_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubcategory\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'annotationSets'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecond_query_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mannotation_set\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 335\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/rest_clients/_parent_rest_clients.py\u001b[0m in \u001b[0;36m_post\u001b[0;34m(self, category, resource, data, query_id, subcategory, second_query_id, **options)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0;34m\"\"\"Queries the REST service and returns the result\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 85\u001b[0;31m return self._rest_retry(\n\u001b[0m\u001b[1;32m 86\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'post'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcategory\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcategory\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresource\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mresource\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquery_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mquery_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0msubcategory\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msubcategory\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecond_query_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msecond_query_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/rest_clients/_parent_rest_clients.py\u001b[0m in \u001b[0;36m_rest_retry\u001b[0;34m(self, method, category, resource, query_id, subcategory, second_query_id, data, dont_retry, **options)\u001b[0m\n\u001b[1;32m 60\u001b[0m ))\n\u001b[1;32m 61\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 62\u001b[0;31m response = retry(\n\u001b[0m\u001b[1;32m 63\u001b[0m \u001b[0mexec_retry\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cfg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_attempts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cfg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmin_retry_secs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cfg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_retry_secs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogin_handler\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogin_handler\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/retry.py\u001b[0m in \u001b[0;36mretry\u001b[0;34m(func, max_attempts, initial_retry_seconds, max_retry_seconds, login_handler, on_retry, dont_retry)\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 36\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 37\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mOpencgaInvalidToken\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/rest_clients/_parent_rest_clients.py\u001b[0m in \u001b[0;36mexec_retry\u001b[0;34m()\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mexec_retry\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m return execute(host=self._cfg.host,\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0mversion\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cfg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mversion\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0msid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoken\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/commons.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(host, version, sid, category, resource, method, subcategory, query_id, second_query_id, data, options)\u001b[0m\n\u001b[1;32m 282\u001b[0m \u001b[0;31m# Multithread if the number of queries is greater than _CALL_BATCH_SIZE\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 283\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mquery_id\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mquery_id\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m','\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0m_CALL_BATCH_SIZE\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 284\u001b[0;31m response = _fetch(host=host, version=version, sid=sid, category=category, subcategory=subcategory,\n\u001b[0m\u001b[1;32m 285\u001b[0m \u001b[0mresource\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mresource\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquery_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mquery_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 286\u001b[0m second_query_id=second_query_id, options=options)\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pyopencga/commons.py\u001b[0m in \u001b[0;36m_fetch\u001b[0;34m(host, version, sid, category, resource, method, subcategory, query_id, second_query_id, data, options)\u001b[0m\n\u001b[1;32m 172\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 173\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatus_code\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m200\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 174\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 175\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mException\u001b[0m: b'{\"apiVersion\":\"v2\",\"time\":190,\"events\":[{\"type\":\"ERROR\",\"code\":0,\"id\":\"org.opencb.opencga.catalog.exceptions.CatalogException\",\"name\":\"CatalogException\",\"message\":\"AnnotationSet annotation_set_id not found. Annotations could not be updated.\"}],\"params\":{\"limit\":\"1000\",\"skip\":\"0\",\"annotationSet\":\"annotation_set_id\",\"sample\":\"sample1\"},\"responses\":[{\"time\":0,\"events\":[],\"numResults\":0,\"results\":[],\"resultType\":\"\",\"numTotalResults\":0,\"numMatches\":0,\"numInserted\":0,\"numUpdated\":0,\"numDeleted\":0,\"attributes\":{}}]}'" - ] - } - ], + "outputs": [], "source": [ "## Define the annotation set\n", - "sample_annotation_set = {\n", + "sample_annotation_set = [{\n", " \"id\": \"annotation_set_id\",\n", " \"variableSetId\": \"sample_metadata\",\n", " \"annotations\": {\n", " \"cell_line\": \"umbilical cord\",\n", " \"cell_type\": \"multipotent progenitor\",\n", " }\n", - "}\n", - "\n", + "}]\n", "\n", "## Annotate the variable set\n", + "admin_client.samples.update(samples='sample1', data={'annotationSets':sample_annotation_set})\n", + "samples = admin_client.samples.search(study=study)\n", "\n", - "oc.samples.update_annotations(sample='sample1', annotation_set='annotation_set_id', data=sample_annotation_set)" + "## Uncomment next line to display an interactive JSON viewer of the REST response\n", + "JSON(samples.get_results())" ] }, { @@ -1145,4 +1133,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file From 10f9863df4cc147d809b7371a1048eb29907e822 Mon Sep 17 00:00:00 2001 From: imedina Date: Thu, 3 Jun 2021 15:58:23 +0100 Subject: [PATCH 373/412] docs: test table --- docs/manual/data-models/individual.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/manual/data-models/individual.md b/docs/manual/data-models/individual.md index a51aed2547e..ec01a614cd3 100644 --- a/docs/manual/data-models/individual.md +++ b/docs/manual/data-models/individual.md @@ -1,2 +1,7 @@ # Individual +| Syntax | Description | +| ----------- | ----------- | +| Header | Title | +| Paragraph | Text | + From 4e2831e6f87999780515854f4a8ab90a2bff5c81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Mon, 7 Jun 2021 16:19:37 +0200 Subject: [PATCH 374/412] analysis: improve alignment quality control by adding the parameters skip and overwrite --- .../alignment/qc/AlignmentQcAnalysis.java | 58 +++++++++++++--- .../executors/AlignmentCommandExecutor.java | 6 +- .../options/AlignmentCommandOptions.java | 19 ++---- .../analysis/AlignmentCommandExecutor.java | 3 +- .../models/alignment/AlignmentQcParams.java | 66 +++++++------------ .../alignment/AlignmentQualityControl.java | 2 +- 6 files changed, 85 insertions(+), 69 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentQcAnalysis.java index bd4733107e8..1a290f9a85a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentQcAnalysis.java @@ -28,13 +28,13 @@ import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.alignment.*; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.tools.annotations.ToolParams; -import java.util.Collections; -import java.util.Map; +import java.util.*; import static org.opencb.opencga.core.api.ParamConstants.ALIGNMENT_QC_DESCRIPTION; @@ -47,6 +47,11 @@ public class AlignmentQcAnalysis extends OpenCgaToolScopeStudy { @ToolParams protected final AlignmentQcParams analysisParams = new AlignmentQcParams(); + private boolean runStats = true; + private boolean runFlagStats = true; + private boolean runFastqc = true; + private boolean runHsmetrics = true; + @Override protected void check() throws Exception { super.check(); @@ -56,12 +61,49 @@ protected void check() throws Exception { } try { - AnalysisUtils.getCatalogFile(analysisParams.getBamFile(), study, catalogManager.getFileManager(), token); + File catalogFile = AnalysisUtils.getCatalogFile(analysisParams.getBamFile(), study, catalogManager.getFileManager(), token); + AlignmentQualityControl alignmentQc = null; + if (catalogFile.getQualityControl() != null) { + alignmentQc = catalogFile.getQualityControl().getAlignment(); + } + + // Prepare flags + String skip = null; + if (StringUtils.isNotEmpty(analysisParams.getSkip())) { + skip = analysisParams.getSkip().toLowerCase().replace(" ", ""); + } + if (StringUtils.isNotEmpty(skip)) { + Set skipValues = new HashSet<>(Arrays.asList(skip.split(","))); + if (skipValues.contains(AlignmentQcParams.STATS_SKIP_VALUE) + || + (!analysisParams.isOverwrite() && alignmentQc != null && alignmentQc.getSamtoolsStats() != null)) { + runStats = false; + } + if (skipValues.contains(AlignmentQcParams.FLAGSTATS_SKIP_VALUE) + || + (!analysisParams.isOverwrite() && alignmentQc != null && alignmentQc.getSamtoolsFlagStats() != null)) { + runFlagStats = false; + } + if (skipValues.contains(AlignmentQcParams.FASTQC_METRICS_SKIP_VALUE) + || + (!analysisParams.isOverwrite() && alignmentQc != null && alignmentQc.getFastQcMetrics() != null)) { + runFastqc = false; + } + if (skipValues.contains(AlignmentQcParams.HS_METRICS_SKIP_VALUE) + || + (!analysisParams.isOverwrite() && alignmentQc != null && alignmentQc.getHsMetrics() != null) + || + StringUtils.isEmpty(analysisParams.getBedFile()) + || + StringUtils.isEmpty(analysisParams.getDictFile())) { + runHsmetrics = false; + } + } } catch (CatalogException e) { throw new ToolException("Error accessing to the BAM file '" + analysisParams.getBamFile() + "'", e); } - if (analysisParams.isRunHsMetrics()) { + if (runHsmetrics) { try { AnalysisUtils.getCatalogFile(analysisParams.getBedFile(), study, catalogManager.getFileManager(), token); } catch (CatalogException e) { @@ -88,7 +130,7 @@ protected void run() throws ToolException { OpenCGAResult fastQcMetricsJobResult; OpenCGAResult hsMetricsJobResult; - if (analysisParams.isRunSamtoolsStats()) { + if (runStats) { // Stats params = new AlignmentStatsParams(analysisParams.getBamFile(), null) .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, study)); @@ -100,7 +142,7 @@ protected void run() throws ToolException { + AlignmentStatsAnalysis.ID + ")"); } - if (analysisParams.isRunSamtoolsFlagStats()) { + if (runFlagStats) { // Flag stats params = new AlignmentFlagStatsParams(analysisParams.getBamFile(), null) .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, study)); @@ -112,7 +154,7 @@ protected void run() throws ToolException { + AlignmentFlagStatsAnalysis.ID + ")"); } - if (analysisParams.isRunFastQc()) { + if (runFastqc) { // FastQC metrics params = new AlignmentFastQcMetricsParams(analysisParams.getBamFile(), null) .toParams(new ObjectMap(ParamConstants.STUDY_PARAM, study)); @@ -125,7 +167,7 @@ protected void run() throws ToolException { + AlignmentFastQcMetricsAnalysis.ID + ")"); } - if (analysisParams.isRunHsMetrics()) { + if (runHsmetrics) { // HS metrics params = new AlignmentHsMetricsParams(analysisParams.getBamFile(), analysisParams.getBedFile(), analysisParams.getDictFile(), null).toParams(new ObjectMap(ParamConstants.STUDY_PARAM, study)); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java index cd084dd17e8..08725047a6d 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/AlignmentCommandExecutor.java @@ -159,10 +159,8 @@ private void qcRun() throws ToolException { cliOptions.bamFile, cliOptions.bedFile, cliOptions.dictFile, - cliOptions.runSamtoolsStats, - cliOptions.runSamtoolsFlagStats, - cliOptions.runFastQC, - cliOptions.runHsMetrics, + cliOptions.skip, + cliOptions.overwrite, cliOptions.outdir ).toObjectMap(cliOptions.commonOptions.params) .append(ParamConstants.STUDY_PARAM, cliOptions.study); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java index fc427a57c25..43a05c50270 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/AlignmentCommandOptions.java @@ -202,23 +202,18 @@ public class QcAlignmentCommandOptions extends GeneralCliOptions.StudyOption { @Parameter(names = {"--bam-file"}, description = FILE_ID_DESCRIPTION + " for the BAM file", required = true, arity = 1) public String bamFile; - @Parameter(names = {"--bed-file"}, description = FILE_ID_DESCRIPTION + " for the BED file, mandatory to compute hybrid-selection (HS) metrics", required = false, arity = 1) + @Parameter(names = {"--bed-file"}, description = FILE_ID_DESCRIPTION + " for the BED file, mandatory to compute hybrid-selection (HS) metrics", arity = 1) public String bedFile; - @Parameter(names = {"--dict-file"}, description = FILE_ID_DESCRIPTION + " for the dictionary file, mandatory to compute hybrid-selection (Hs) metrics", required = false, arity = 1) + @Parameter(names = {"--dict-file"}, description = FILE_ID_DESCRIPTION + " for the dictionary file, mandatory to compute hybrid-selection (Hs) metrics", arity = 1) public String dictFile; - @Parameter(names = {"--run-samtools-stats"}, description = ALIGNMENT_QC_SAMTOOLS_STATS_DESCRIPTION, required = false, arity = 0) - public boolean runSamtoolsStats; + @Parameter(names = {"--skip"}, description = "Do not compute some metrics. Use the following keywords (separated by commas): " + + "stats, flagstats, fastqc and hsmetrics", arity = 1) + public String skip; - @Parameter(names = {"--run-samtools-flagstats"}, description = ALIGNMENT_QC_SAMTOOLS_FLAG_STATS_DESCRIPTION, required = false, arity = 0) - public boolean runSamtoolsFlagStats; - - @Parameter(names = {"--run-fastqc"}, description = ALIGNMENT_QC_FASTQC_DESCRIPTION, required = false, arity = 0) - public boolean runFastQC; - - @Parameter(names = {"--run-hs-metrics"}, description = ALIGNMENT_QC_HS_METRICS_DESCRIPTION, required = false, arity = 0) - public boolean runHsMetrics; + @Parameter(names = {"--overwrite"}, description = "Force to overwrite the metrics", arity = 0) + public boolean overwrite; @Parameter(names = {"-o", "--outdir"}, description = OUTPUT_DIRECTORY_DESCRIPTION) public String outdir; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java index ab525126c43..cd37f2504d8 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/analysis/AlignmentCommandExecutor.java @@ -337,8 +337,7 @@ private RestResponse qcRun() throws ClientException { params.putAll(getJobParams()); return openCGAClient.getAlignmentClient().runQc(new AlignmentQcParams(cliOptions.bamFile, cliOptions.bedFile, cliOptions.dictFile, - cliOptions.runSamtoolsStats, cliOptions.runSamtoolsFlagStats, cliOptions.runFastQC, cliOptions.runHsMetrics, - cliOptions.outdir), params); + cliOptions.skip, cliOptions.overwrite, cliOptions.outdir), params); } private RestResponse geneCoverageStatsRun() throws ClientException { diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQcParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQcParams.java index 90d24a9b04b..b4becf1deb0 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQcParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQcParams.java @@ -3,30 +3,32 @@ import org.opencb.opencga.core.tools.ToolParams; public class AlignmentQcParams extends ToolParams { - public static final String DESCRIPTION = "Alignment quality control (QC) parameters. The BAM file is mandatory ever but the BED file" + - " and the dictionary files are only mandatory for computing hybrid-selection (HS) metrics"; + public static String STATS_SKIP_VALUE = "stats"; + public static String FLAGSTATS_SKIP_VALUE = "flagstats"; + public static String FASTQC_METRICS_SKIP_VALUE = "fastqc"; + public static String HS_METRICS_SKIP_VALUE = "hsmetrics"; + + public static final String DESCRIPTION = "Alignment quality control (QC) parameters. It computes: stats, flag stats, fastqc and" + + " hybrid-selection metrics. The BAM file is mandatory ever but the BED fileand the dictionary files are only mandatory for" + + " computing hybrid-selection (HS) metrics. In order to skip some metrics, use the following keywords (separated by commas): " + + "stats, flagstats, fastqc and hsmetrics"; private String bamFile; private String bedFile; private String dictFile; - private boolean runSamtoolsStats; - private boolean runSamtoolsFlagStats; - private boolean runFastQc; - private boolean runHsMetrics; + private String skip; + private boolean overwrite; private String outdir; public AlignmentQcParams() { } - public AlignmentQcParams(String bamFile, String bedFile, String dictFile, boolean runSamtoolsStats, boolean runSamtoolsFlagStats, - boolean runFastQc, boolean runHsMetrics, String outdir) { + public AlignmentQcParams(String bamFile, String bedFile, String dictFile, String skip, boolean overwrite, String outdir) { this.bamFile = bamFile; this.bedFile = bedFile; this.dictFile = dictFile; - this.runSamtoolsStats = runSamtoolsStats; - this.runSamtoolsFlagStats = runSamtoolsFlagStats; - this.runFastQc = runFastQc; - this.runHsMetrics = runHsMetrics; + this.skip = skip; + this.overwrite = overwrite; this.outdir = outdir; } @@ -36,10 +38,8 @@ public String toString() { sb.append("bamFile='").append(bamFile).append('\''); sb.append(", bedFile='").append(bedFile).append('\''); sb.append(", dictFile='").append(dictFile).append('\''); - sb.append(", runSamtoolsStats=").append(runSamtoolsStats); - sb.append(", runSamtoolsFlagStats=").append(runSamtoolsFlagStats); - sb.append(", runFastQc=").append(runFastQc); - sb.append(", runHsMetrics=").append(runHsMetrics); + sb.append(", skip='").append(skip).append('\''); + sb.append(", overwrite=").append(overwrite); sb.append(", outdir='").append(outdir).append('\''); sb.append('}'); return sb.toString(); @@ -72,39 +72,21 @@ public AlignmentQcParams setDictFile(String dictFile) { return this; } - public boolean isRunSamtoolsStats() { - return runSamtoolsStats; - } - - public AlignmentQcParams setRunSamtoolsStats(boolean runSamtoolsStats) { - this.runSamtoolsStats = runSamtoolsStats; - return this; - } - - public boolean isRunSamtoolsFlagStats() { - return runSamtoolsFlagStats; - } - - public AlignmentQcParams setRunSamtoolsFlagStats(boolean runSamtoolsFlagStats) { - this.runSamtoolsFlagStats = runSamtoolsFlagStats; - return this; - } - - public boolean isRunFastQc() { - return runFastQc; + public String getSkip() { + return skip; } - public AlignmentQcParams setRunFastQc(boolean runFastQc) { - this.runFastQc = runFastQc; + public AlignmentQcParams setSkip(String skip) { + this.skip = skip; return this; } - public boolean isRunHsMetrics() { - return runHsMetrics; + public boolean isOverwrite() { + return overwrite; } - public AlignmentQcParams setRunHsMetrics(boolean runHsMetrics) { - this.runHsMetrics = runHsMetrics; + public AlignmentQcParams setOverwrite(boolean overwrite) { + this.overwrite = overwrite; return this; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java index f1e4f7b1d4e..db802553526 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/alignment/AlignmentQualityControl.java @@ -15,7 +15,7 @@ public class AlignmentQualityControl implements Serializable { private HsMetrics hsMetrics; public AlignmentQualityControl() { - this(new FastQcMetrics(), new SamtoolsStats(), new SamtoolsFlagstats(), new HsMetrics()); + this(null, null, null, null); } public AlignmentQualityControl(FastQcMetrics fastQcMetrics, SamtoolsStats samtoolsStats, SamtoolsFlagstats samtoolsFlagStats, HsMetrics hsMetrics) { From a7312466792180fe45b4e800bafd9ae26040f58c Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 7 Jun 2021 16:12:25 +0000 Subject: [PATCH 375/412] GitBook: [develop] 4 pages and 10 assets modified --- ... (5) (1).png => image (6) (5) (5) (1).png} | Bin ... (5) (2).png => image (6) (5) (5) (2).png} | Bin ... (5) (3).png => image (6) (5) (5) (3).png} | Bin ... (5) (4).png => image (6) (5) (5) (4).png} | Bin ... (6) (5).png => image (6) (5) (5) (5).png} | Bin docs/SUMMARY.md | 1 + .../administrator/templates-manifest.md | 7 +- .../data-management/data-ingestion-process.md | 328 ++++++++++++++++++ docs/manual/data-models/individual.md | 8 +- 9 files changed, 336 insertions(+), 8 deletions(-) rename docs/.gitbook/assets/{image (6) (5) (1).png => image (6) (5) (5) (1).png} (100%) rename docs/.gitbook/assets/{image (6) (5) (2).png => image (6) (5) (5) (2).png} (100%) rename docs/.gitbook/assets/{image (6) (5) (3).png => image (6) (5) (5) (3).png} (100%) rename docs/.gitbook/assets/{image (6) (5) (4).png => image (6) (5) (5) (4).png} (100%) rename docs/.gitbook/assets/{image (6) (5).png => image (6) (5) (5) (5).png} (100%) create mode 100644 docs/manual/data-management/data-ingestion-process.md diff --git a/docs/.gitbook/assets/image (6) (5) (1).png b/docs/.gitbook/assets/image (6) (5) (5) (1).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5) (1).png rename to docs/.gitbook/assets/image (6) (5) (5) (1).png diff --git a/docs/.gitbook/assets/image (6) (5) (2).png b/docs/.gitbook/assets/image (6) (5) (5) (2).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5) (2).png rename to docs/.gitbook/assets/image (6) (5) (5) (2).png diff --git a/docs/.gitbook/assets/image (6) (5) (3).png b/docs/.gitbook/assets/image (6) (5) (5) (3).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5) (3).png rename to docs/.gitbook/assets/image (6) (5) (5) (3).png diff --git a/docs/.gitbook/assets/image (6) (5) (4).png b/docs/.gitbook/assets/image (6) (5) (5) (4).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5) (4).png rename to docs/.gitbook/assets/image (6) (5) (5) (4).png diff --git a/docs/.gitbook/assets/image (6) (5).png b/docs/.gitbook/assets/image (6) (5) (5) (5).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5).png rename to docs/.gitbook/assets/image (6) (5) (5) (5).png diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 79d140a32fd..426b3e90ef1 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -48,6 +48,7 @@ * [Login](manual/login.md) * [Data Management](manual/data-management/README.md) + * [Data Ingestion Process](manual/data-management/data-ingestion-process.md) * [Projects and Studies](manual/data-management/projects-and-studies.md) * [Working with Files](manual/data-management/working-with-files.md) * [Sharing and Permissions](manual/data-management/sharing-and-permissions/README.md) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index 2848b9dac91..a0bad3e746c 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -1,10 +1,10 @@ # Templates / Manifest -Since OpenCGA v2.1.x, the OpenCGA users with administration roles are offered the possibility to work with templates. Templates are a set of files with a defined specification that allow the user to perform a series of different operations, related to the ingestion of metadata in OpenCGA, e.g: define the samples, individuals, permission groups, etc. For more information on how OpenCGA stores metadata in Catalog refer to [Catalog](../../components-1/catalog/) +Since OpenCGA v2.1.x, the OpenCGA users with administration roles are offered the possibility to work with templates. Templates are a set of files with a defined specification that allow the user to perform a series of different operations, related to the ingestion of metadata in OpenCGA, e.g: define the samples, individuals, permission groups, etc. For more information on how OpenCGA stores metadata in Catalog refer to [Catalog](../../components-1/catalog/) Templates are defined at a study level and could be provided in different formats accordingly to the user's needs. The file format and some common use cases are illustrated in the following section. -Remember that OpenCGA is highly configurable, and the use of templates constitutes a useful resource to reduce some common artifacts on the ingestion of metadata, but you can always use the OpenCGA clients \([Client Libraries](../../using-opencga/client-libraries/)\), command line \([Command Line](../../using-opencga/command-line.md)\) or [REST Web Service API](../../using-opencga/restful-web-service-api.md) to perform different operations in OpenCGA. +Remember that OpenCGA is highly configurable, and the use of templates constitutes a useful resource to reduce some common artifacts on the ingestion of metadata, but you can always use the OpenCGA clients \([Client Libraries](../../using-opencga/client-libraries/)\), command line \([Command Line](../../using-opencga/command-line.md)\) or [REST Web Service API](../../using-opencga/restful-web-service-api.md) to perform different operations in OpenCGA. ## How it Works @@ -26,7 +26,7 @@ NOTE: All the fields within each entity that are subjected to be manipulable by You might want to provide a single JSON or YAML file per entity. In the case of using JSON you should write one JSON per line, if YAML is used then you can just concat them separating by '---'. -The following entities are supported. +The following entities are supported. * For [Individual](../data-models/individual.md): `individuals.{json|yaml}` * For [Sample](../data-models/sample.md): `samples.{json|yaml}` @@ -68,6 +68,5 @@ individuals.samples.txt NA001 s1 NA001 s2 NA002 s3 - ``` diff --git a/docs/manual/data-management/data-ingestion-process.md b/docs/manual/data-management/data-ingestion-process.md new file mode 100644 index 00000000000..e13c9f87ded --- /dev/null +++ b/docs/manual/data-management/data-ingestion-process.md @@ -0,0 +1,328 @@ +# Data Ingestion Process + +## **Introduction** + +The first stage in discovery and analysis of variants using OpenCGA is to load the source data, typically VCF files, into the system. + +The data load process is divided into 5 steps: + +1. Register files into OpenCGA Catalog metadata file register +2. Index Variant Data- including transform and load +3. Annotate the new-indexed Variants \(Variant Annotation\) - as part of the database enrichment +4. Calculate the Statistics - as part of the database enrichment +5. Build/Update the Secondary Index + +![](https://lh4.googleusercontent.com/O1IDTz7z5AGUjYe0wuugmEIJNlle5gkO-wt9wc2xjTJKmlfVbBE3HWNLTQglVlGSPXGN1NlHGEfC5TtZbtRHIuFMOE93QnZTU_Z34l4n9jrAQ2mPC99ltfZJ5b7hu2D2w0sO6ih6) + +## **Prerequisites** + +This document assumes the following: + +* A workstation with network access to the web services on an OpenCGA server; this document assumes version 2.0 or later. +* OpenCGA client software installed on the workstation. Find [here]() the instructions on how to build OpenCGA from source. +* OpenCGA credentials with appropriate permissions. The owner user is the owner of the data; it’s the user who creates the project/study where the new data will be loaded. The users with permission to perform data ingestion into a concrete study in OpenCGA are the owner user, and other users with admin privileges for the specific study \(provided by the owner\). +* Sample Genomic \(e.g. VCF\) data and associated sample and phenotypic metadata + +## **Project and Study organisation** + +The project/study organisation is a key in order to optimise the data usability. + +Projects provide physical separation of data into different database tables. +Studies provide logical separation of data within a Project. + +* You MUST store your data in different projects when they are on different genome assemblies \(e.g you should create a project for data from GRCh37 and other for data from GRCh38\) +* You CAN store your data in different projects when there is no foreseeable need to process them jointly. +* You may divide your data in studies corresponding to different independent datasets that may be used together in some analysis, with the aim of having homogeneous datasets for each study. + +After deciding structure, the new projects and studies may need to be created. This step must be performed by the owner of the new created elements. + +#### **Creating new projects** + +Once logged in to OpenCGA as the owner, a Project can be created with this command: + +```text +$ ./opencga.sh projects create --id + -n + --organism-scientific-name hsapiens + --organism-assembly +``` + +Optionally, you can add other parameters like `--description` . You can get the full list of parameters by adding to the command. + +#### **Creating new studies** + +Similar to the project creation, studies are created with this command: + +```text +$ ./opencga.sh studies create --project + --id + -n +``` + +{% hint style="info" %} +You don’t need to provide the organism assembly again, as it’s inherited from the project. Remember that all studies from the same project will share the same assembly. +{% endhint %} + +To get the list of all projects and studies belonging to one specific user, run: + +```text +$ ./opencga.sh users info +``` + +### **Catalog file register** + +This step presents the data to OpenCGA and registers the new files into the system. Samples will be created automatically after linking the file, by reading the VCF Header. This step can be further extended with extra annotations, defining individuals, creating cohorts or even families. + +It is important to note that this step is a synchronous operation that does not upload the genomic data \(e.g:VCFs\) into OpenCGA, instead, the files will only be “linked” \(registered\) with OpenCGA. Therefore, the files to link must be in a location that is accessible by the OpenCGA server \(REST servers and the Master service\). + +#### **Catalog Path Structure** + +**I**nternally, the Catalog metadata holds a logical tree view of the linked files that can easily be explored or listed. Try using: + +```text +$ ./opencga.sh files tree --study --folder +``` + +New folders can be created with this command: + +```text +$ ./opencga files create --study --path +``` + +Being `` the directory that you’d like to create within catalog. + +#### **Linking files synchronously \(less than 5000 samples\)** + +{% hint style="warning" %} +Note that for files with more than 5000 samples, the linking step needs to be performed as an asynchronous job using the command described below. +{% endhint %} + +Each file needs to be “linked” into OpenCGA using this command line: + +```text +$ ./opencga.sh files link --study + --path + --input +``` + +Multiple files can be linked using the same command typing multiple input files separated by space or comma. + +#### **Linking files asynchronously \(more than 5000 samples\)** + +For VCFs containing more than 5000 samples, the linking steps needs to be performed as an asynchronous job. In this case, a different command needs to be run: + +```text +$ ./opencga.sh files link-run --study + --path + --input +``` + +**Full example:** + +```text +## Create one folder “data/” in study “myStudy” +$ ./opencga.sh files create --study --path + +## Link the files “myFirstFile.vcf.gz” and “mySecondFile.vcf.gz” in the newly created folder +$ ./opencga.sh files link --study + --path + -i /data/myFirstFile.vcf.gz /data/mySecondFile.vcf.gz +``` + +### **Variant storage index** + +This operation will read the content of the file, run some simple validations to detect possible errors or data corruptions, and ingest the variants into the Hadoop system, building some high performance indexes. + +Each file index operation will be run by an asynchronous job, to be executed by the OpenCGA Master service. + +Contrary to the Catalog File Register step, only one file should be provided as input in the Variant storage index command line. This will create separate asynchronous indexing jobs for each one of the files. This is important in order to avoid failure of the jobs. + +Use this command to launch a variant index job: + +```text +$ ./opencga.sh variant index-run --study + --file +``` + +All the jobs along with their current status can be either inspected from IVA, or running this command line: + +```text +$ ./opencga.sh jobs top ---study +``` + +**Special scenarios** + +* **Samples data split by chromosome or region** + +By default, OpenCGA doesn’t allow you to index a VCF file if any of its samples is already indexed as part of another VCF file. This restriction is to avoid accidental data duplications. In case of having one dataset split by chromosome or region, this restriction can be bypassed by adding the param `--load-split-data ` to the variant index command line. + +* **Multiple files for the same samples** + +Similarly to the previous scenario, a dataset may contain multiple files from the same set of samples that may want to be indexed together, for example, when using multiple VCF callers for the same sample. In this case, you can bypass the restriction by adding the param `--load-multi-file-data.` + +* **Family or Somatic callers** + +When using special callers it is important to specify it in the command line with either`--family / --somatic.` + +{% hint style="danger" %} +Note: Be aware that the misuse of this parameters may lead to data corruption. +{% endhint %} + +### **Variant Annotation** + +Once all the data is loaded, we need to run the Variant Annotation. This is a key enrichment operation that will attach CellBase Variant Annotations with the loaded data, allowing filtering by a large number of fields. + +Find more information at**:** [**http://docs.opencb.org/display/cellbase/Variant+Annotation**](http://docs.opencb.org/display/cellbase/Variant+Annotation) + +The Variant Storage Engine will run the annotation just for the new variants, being able to reuse the existing annotations to save time and disk usage. This operation is executed at the project level, so shared variants between studies won’t need to be annotated twice. + +```text +$ ./opencga.sh operations variant-annotation-index --project + --study +``` + +Similar to the variant-index process, this command line will queue an asynchronous job to be executed by the OpenCGA Master service. + +### **Variant Statistics calculation** + +The second enrichment operation is the Variant Statistics Calculation. After defining a cohort, you might decide to compute the Variant Stats for that cohort. These statistics include the most typical values like allele and genotype frequencies, MAF, QUAL average, FILTER count... + +```text +$ ./opencga.sh variant stats-run --study + --index --cohort ,.., +``` + +For updating the stats of all the cohorts, or when there are no cohorts in the study apart from the default `ALL cohort`: + +```text +$ ./opencga.sh variant stats-run --study --index --cohort ALL +``` + +**Special scenario:** when loading new files split by chromosome/region to a study that already contains data the annotation step can be performed as usual. However, when calculating the variant stats you need to add the param --update-stats. E.g: + +```text +$ ./opencga.sh variant stats-run --study + --index --cohort + --update-stats +``` + +#### **Aggregated VCFs \[TODO\]** + +In case of having computed stats codified in the INFO column of a VCF using standard or non-standard keys, these values can be converted into `VariantStats` models, and be used for filtering. + +To extract the statistics, you need to create a mapping file between the INFO keys containing the information, and it’s meaning. Each line will have this format: +**<COHORT>.<KNOWN\_KEY>=<INFO\_KEY>** + +Then, this file needs to be linked in catalog, and referred when computing the stats. + +OpenCGA supports 3 different “ways” of codifying the information, known as “aggregation method”. Some of these are named after public studies that started using them. Each one defines a set of known keys that will be used to parse the statistics. + +* **BASIC : Using standard vcf-spec INFO keys.** + * **AN : Total number of alleles in called genotypes** + * **AC : Total number of alternate alleles in called genotypes** + * **AF : Allele Frequency, for each ALT allele, in the same order as listed** +* **EXAC** + * **HET: Count of HET genotypes. For multi allelic variants, the genotype order is 0/1, 0/2, 0/3, 0/4... 1/2, 1/3, 1/4... 2/3, 2/4... 3/4...** + * **HOM : Count of HOM genotypes. For multi allelic variants, the genotype order is 1/1, 2/2, …** +* **EVS** + * **GTS: List of Genotypes** + * **GTC: Genotypes count, ordered according to “GTS”** + * **GROUPS\_ORDER: Order of cohorts for key “MAF”** + * **MAF: Minor allele frequency value for each cohort, ordered according to “GROUPS\_ORDER”** + +**e.g. Single cohort variant stats +custom\_mapping.properties** + + + + + + + + +
+

ALL.AC =AC +

+

ALL.AN =AN +

+

ALL.AF =AF +

+

ALL.HET=AC_Het +

+

ALL.HOM=AC_Hom/2 +

+

#Key “HEMI” is not supported +

+

#ALL.HEMI=AC_Hemi +

+
+ +```text +$ ./opencga.sh variant stats-run --study + --index --cohort + --aggregation EXAC + --aggregation-mapping-file custom_mapping.properties +``` + +### **Variant Secondary Index Build** + +Secondary indexes are built using the search engine Apache Solr for improving the performance of some queries and aggregations, allowing full text search and faceted queries to the Variant database. + +This secondary index will include the Variant Annotation and all computed Variant Stats. Therefore, this step needs to be executed only once all annotations and statistics are finished. + +```text +$ ./opencga.sh operations variant-secondary-index --project + --study +``` + +## **Enrichment Operations** + +This steps are optional operations, that can be indexed to enrich the data displayed at the IVA web application: + +### **Sample Variant Stats** + +Sample Variant Stats will contain a set of aggregated statistics values for each sample. + +```text +$ ./opencga.sh variant sample-stats-run --study --sample all +``` + +These aggregated values can be computed across all variants from each sample, or using a subset of variants using a variant filter query. e.g: + +```text +$ ./opencga.sh variant sample-stats-run --study + --sample all + --variant-query ct=missense_variant + --variant-query biotype=protein_coding +``` + +By default, this analysis will produce a file, and optionally, the result can be indexed in the catalog metadata store, given an ID. + +```text +./opencga.sh variant sample-stats-run --study + --sample all + --index + --index-id missense_variants + --variant-query ct=missense_variant + --variant-query biotype=protein_coding +``` + +The ID ALL can only be used if without any variant query filter. + +```text +$ ./opencga.sh variant sample-stats-run --study + --sample all + --index + --index-id ALL +``` + +### **Cohort Variant Stats** + +### **Family Index** + + + +\*\*\*\* + +## + diff --git a/docs/manual/data-models/individual.md b/docs/manual/data-models/individual.md index ec01a614cd3..994ea65efff 100644 --- a/docs/manual/data-models/individual.md +++ b/docs/manual/data-models/individual.md @@ -1,7 +1,7 @@ # Individual -| Syntax | Description | -| ----------- | ----------- | -| Header | Title | -| Paragraph | Text | +| Syntax | Description | +| :--- | :--- | +| Header | Title | +| Paragraph | Text | From 4decb920ad2cfab31800264294753bb48b0a7673 Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 7 Jun 2021 16:13:19 +0000 Subject: [PATCH 376/412] GitBook: [develop] one page modified --- docs/manual/data-management/data-ingestion-process.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/manual/data-management/data-ingestion-process.md b/docs/manual/data-management/data-ingestion-process.md index e13c9f87ded..1354151c3b2 100644 --- a/docs/manual/data-management/data-ingestion-process.md +++ b/docs/manual/data-management/data-ingestion-process.md @@ -206,7 +206,11 @@ $ ./opencga.sh variant stats-run --study --update-stats ``` -#### **Aggregated VCFs \[TODO\]** +#### **Aggregated VCFs** + +{% hint style="danger" %} +**This section is a draft.** +{% endhint %} In case of having computed stats codified in the INFO column of a VCF using standard or non-standard keys, these values can be converted into `VariantStats` models, and be used for filtering. From 5888efacd007fc2d8939e84e4bf961b458c18eb1 Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 7 Jun 2021 16:13:36 +0000 Subject: [PATCH 377/412] GitBook: [release-2.0.0] no pages and 10 assets modified --- ...ge (6) (5) (1).png => image (6) (5) (5) (1).png} | Bin ...ge (6) (5) (2).png => image (6) (5) (5) (2).png} | Bin ...ge (6) (5) (3).png => image (6) (5) (5) (3).png} | Bin ...ge (6) (5) (4).png => image (6) (5) (5) (4).png} | Bin ...{image (6) (5).png => image (6) (5) (5) (5).png} | Bin 5 files changed, 0 insertions(+), 0 deletions(-) rename docs/.gitbook/assets/{image (6) (5) (1).png => image (6) (5) (5) (1).png} (100%) rename docs/.gitbook/assets/{image (6) (5) (2).png => image (6) (5) (5) (2).png} (100%) rename docs/.gitbook/assets/{image (6) (5) (3).png => image (6) (5) (5) (3).png} (100%) rename docs/.gitbook/assets/{image (6) (5) (4).png => image (6) (5) (5) (4).png} (100%) rename docs/.gitbook/assets/{image (6) (5).png => image (6) (5) (5) (5).png} (100%) diff --git a/docs/.gitbook/assets/image (6) (5) (1).png b/docs/.gitbook/assets/image (6) (5) (5) (1).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5) (1).png rename to docs/.gitbook/assets/image (6) (5) (5) (1).png diff --git a/docs/.gitbook/assets/image (6) (5) (2).png b/docs/.gitbook/assets/image (6) (5) (5) (2).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5) (2).png rename to docs/.gitbook/assets/image (6) (5) (5) (2).png diff --git a/docs/.gitbook/assets/image (6) (5) (3).png b/docs/.gitbook/assets/image (6) (5) (5) (3).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5) (3).png rename to docs/.gitbook/assets/image (6) (5) (5) (3).png diff --git a/docs/.gitbook/assets/image (6) (5) (4).png b/docs/.gitbook/assets/image (6) (5) (5) (4).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5) (4).png rename to docs/.gitbook/assets/image (6) (5) (5) (4).png diff --git a/docs/.gitbook/assets/image (6) (5).png b/docs/.gitbook/assets/image (6) (5) (5) (5).png similarity index 100% rename from docs/.gitbook/assets/image (6) (5).png rename to docs/.gitbook/assets/image (6) (5) (5) (5).png From 6fb3838fdc11f051bb5f017a4eb0d55c5c8b9e85 Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 7 Jun 2021 16:13:37 +0000 Subject: [PATCH 378/412] GitBook: [develop] one page modified --- docs/manual/data-management/adding-custom-metadata.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual/data-management/adding-custom-metadata.md b/docs/manual/data-management/adding-custom-metadata.md index b4f3626235b..e5cbc21a68f 100644 --- a/docs/manual/data-management/adding-custom-metadata.md +++ b/docs/manual/data-management/adding-custom-metadata.md @@ -2,9 +2,9 @@ ## Variables and Annotations -Clinical Data in OpenCGA is managed through what we have called _Variable Sets_ and _Annotation Sets_. +Clinical Data in OpenCGA can be enriched with custom annotations _Variable Sets_ and _Annotation Sets_. -### Variables +### Variable Set A [_Variable Set_](https://github.com/opencb/opencga/blob/develop/opencga-core/src/main/java/org/opencb/opencga/core/models/VariableSet.java) is a free modelled data model. The fields of a _Variable Set_ are explained below: From 9b04773d1f0f21f9b8edd8a1a11e1a1deceff239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Mon, 7 Jun 2021 19:11:49 +0100 Subject: [PATCH 379/412] pom: increase version to 2.0.5-SNAPSHOT --- opencga-analysis/pom.xml | 2 +- opencga-app/pom.xml | 2 +- opencga-catalog/pom.xml | 2 +- opencga-client/pom.xml | 2 +- opencga-core/pom.xml | 2 +- opencga-master/pom.xml | 2 +- opencga-server/pom.xml | 2 +- opencga-storage/opencga-storage-app/pom.xml | 2 +- opencga-storage/opencga-storage-benchmark/pom.xml | 2 +- opencga-storage/opencga-storage-core/pom.xml | 2 +- .../opencga-storage-hadoop-core/pom.xml | 2 +- .../opencga-storage-hadoop-deps-cdh5.13/pom.xml | 2 +- .../opencga-storage-hadoop-deps-emr5.31/pom.xml | 2 +- .../opencga-storage-hadoop-deps-emr5.8/pom.xml | 2 +- .../opencga-storage-hadoop-deps-emr6.1/pom.xml | 2 +- .../opencga-storage-hadoop-deps-hdp2.5/pom.xml | 2 +- .../opencga-storage-hadoop-deps-hdp2.6/pom.xml | 2 +- .../opencga-storage-hadoop-deps-hdp3.1/pom.xml | 2 +- .../opencga-storage-hadoop-deps/pom.xml | 4 ++-- opencga-storage/opencga-storage-hadoop/pom.xml | 4 ++-- opencga-storage/opencga-storage-mongodb/pom.xml | 2 +- opencga-storage/opencga-storage-server/pom.xml | 2 +- opencga-storage/pom.xml | 4 ++-- opencga-test/pom.xml | 2 +- pom.xml | 6 +++--- 25 files changed, 30 insertions(+), 30 deletions(-) diff --git a/opencga-analysis/pom.xml b/opencga-analysis/pom.xml index cd1755fb8a2..59eb8d96554 100644 --- a/opencga-analysis/pom.xml +++ b/opencga-analysis/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-app/pom.xml b/opencga-app/pom.xml index 37328d70aa0..e801522716d 100644 --- a/opencga-app/pom.xml +++ b/opencga-app/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-catalog/pom.xml b/opencga-catalog/pom.xml index be66b6aafa7..c4b68a8ed47 100644 --- a/opencga-catalog/pom.xml +++ b/opencga-catalog/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-client/pom.xml b/opencga-client/pom.xml index bc7013a4212..0abe8fe70b1 100644 --- a/opencga-client/pom.xml +++ b/opencga-client/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-core/pom.xml b/opencga-core/pom.xml index 7250630b032..88a6ffa9dd5 100644 --- a/opencga-core/pom.xml +++ b/opencga-core/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-master/pom.xml b/opencga-master/pom.xml index d5136339b67..a17ac5f2d4a 100644 --- a/opencga-master/pom.xml +++ b/opencga-master/pom.xml @@ -22,7 +22,7 @@ opencga org.opencb.opencga - 2.0.4 + 2.0.5-SNAPSHOT .. diff --git a/opencga-server/pom.xml b/opencga-server/pom.xml index de0a7ff5823..7feb0a05b71 100644 --- a/opencga-server/pom.xml +++ b/opencga-server/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-app/pom.xml b/opencga-storage/opencga-storage-app/pom.xml index 7f3afc8199c..4e0bfceee5b 100644 --- a/opencga-storage/opencga-storage-app/pom.xml +++ b/opencga-storage/opencga-storage-app/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-benchmark/pom.xml b/opencga-storage/opencga-storage-benchmark/pom.xml index 7b82f3655ec..1f8db619099 100644 --- a/opencga-storage/opencga-storage-benchmark/pom.xml +++ b/opencga-storage/opencga-storage-benchmark/pom.xml @@ -21,7 +21,7 @@ opencga-storage org.opencb.opencga - 2.0.4 + 2.0.5-SNAPSHOT 4.0.0 diff --git a/opencga-storage/opencga-storage-core/pom.xml b/opencga-storage/opencga-storage-core/pom.xml index f76c45544c2..9bd0df9a46d 100644 --- a/opencga-storage/opencga-storage-core/pom.xml +++ b/opencga-storage/opencga-storage-core/pom.xml @@ -25,7 +25,7 @@ org.opencb.opencga opencga-storage - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml index 1f20d88ded0..94916d7e430 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml @@ -23,7 +23,7 @@ org.opencb.opencga opencga-storage-hadoop - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml index 9e717215a42..b4e64108ac7 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.31/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.31/pom.xml index e3e49aad6e5..cf630203ce2 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.31/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.31/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml index a75da0a6a29..02892a1c0d8 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr6.1/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr6.1/pom.xml index d01cbceef85..5ab8cd611e0 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr6.1/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr6.1/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml index 6ed7803e681..3d02f10cbbb 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml index 595a71e8629..6ad085255c0 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml index e2e05d5879b..2e7f204aa77 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml index 3982429d542..20a22ab042d 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml @@ -50,7 +50,7 @@ org.opencb.opencga opencga-storage-hadoop - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml @@ -66,7 +66,7 @@ opencga-storage-hadoop-deps - 2.0.4 + 2.0.5-SNAPSHOT pom diff --git a/opencga-storage/opencga-storage-hadoop/pom.xml b/opencga-storage/opencga-storage-hadoop/pom.xml index 2a43419ffe7..fe14f39897c 100644 --- a/opencga-storage/opencga-storage-hadoop/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/pom.xml @@ -30,12 +30,12 @@ org.opencb.opencga opencga-storage - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml opencga-storage-hadoop - 2.0.4 + 2.0.5-SNAPSHOT pom diff --git a/opencga-storage/opencga-storage-mongodb/pom.xml b/opencga-storage/opencga-storage-mongodb/pom.xml index aafb6134701..caffad92df7 100644 --- a/opencga-storage/opencga-storage-mongodb/pom.xml +++ b/opencga-storage/opencga-storage-mongodb/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-server/pom.xml b/opencga-storage/opencga-storage-server/pom.xml index ec553d30e3a..6b469e65521 100644 --- a/opencga-storage/opencga-storage-server/pom.xml +++ b/opencga-storage/opencga-storage-server/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml diff --git a/opencga-storage/pom.xml b/opencga-storage/pom.xml index 729cd233bad..01778a1302b 100644 --- a/opencga-storage/pom.xml +++ b/opencga-storage/pom.xml @@ -22,13 +22,13 @@ org.opencb.opencga opencga - 2.0.4 + 2.0.5-SNAPSHOT ../pom.xml opencga-storage - 2.0.4 + 2.0.5-SNAPSHOT pom diff --git a/opencga-test/pom.xml b/opencga-test/pom.xml index a9ccaa99fc3..30bd6719175 100644 --- a/opencga-test/pom.xml +++ b/opencga-test/pom.xml @@ -24,7 +24,7 @@ org.opencb.opencga opencga-test - 2.0.4 + 2.0.5-SNAPSHOT pom diff --git a/pom.xml b/pom.xml index d1ac109cd1c..81fdf49ac58 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.4 + 2.0.5-SNAPSHOT pom OpenCGA @@ -41,8 +41,8 @@ - 2.0.4 - 2.0.4 + 2.0.5-SNAPSHOT + 2.0.5-SNAPSHOT 2.1.0-beta 4.8.0 2.0.5 From 9e52f3dd48b4c52aef07ade3df298105e95afb9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Mon, 7 Jun 2021 19:12:09 +0100 Subject: [PATCH 380/412] storage: Fix JulieTool to create VariantAnnotation object if missing --- .../analysis/julie/JulieToolMapper.java | 23 ++++++++++--------- .../hadoop/variant/converters/VariantRow.java | 6 +++++ .../stats/HBaseToVariantStatsConverter.java | 2 +- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java index 2485e019d09..55b80d8d470 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java @@ -5,7 +5,8 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.VariantAnnotation; -import org.opencb.biodata.models.variant.protobuf.VariantProto; +import org.opencb.biodata.models.variant.stats.VariantStats; +import org.opencb.biodata.tools.variant.converters.avro.VariantStatsToPopulationFrequencyConverter; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.hadoop.variant.converters.VariantRow; import org.opencb.opencga.storage.hadoop.variant.converters.annotation.HBaseToVariantAnnotationConverter; @@ -26,6 +27,7 @@ public class JulieToolMapper extends VariantRowMapper studyIdMap; private Map> cohortIdMap; @@ -35,6 +37,7 @@ protected void setup(Context context) throws IOException, InterruptedException { fromHBaseConverter = new HBaseToVariantAnnotationConverter(); toHBaseConverter = new VariantAnnotationToHBaseConverter(); overwrite = context.getConfiguration().getBoolean(JulieToolDriver.OVERWRITE, false); + popFreqConverter = new VariantStatsToPopulationFrequencyConverter(); try (VariantStorageMetadataManager metadataManager = new VariantStorageMetadataManager( new HBaseVariantStorageMetadataDBAdaptorFactory(getHelper()))) { studyIdMap = new HashMap<>(); @@ -64,7 +67,7 @@ protected void map(Object key, VariantRow value, Context context) throws IOExcep value.walker() .onVariantAnnotation(a -> annotationRef.set(fromHBaseConverter.convert(a.toBytesWritable()))) .onCohortStats(column -> { - VariantProto.VariantStats variantStats = column.toProto(); + VariantStats variantStats = column.toJava(); if (variantStats.getAltAlleleFreq() <= 0) { context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "skip_stats").increment(1); // Ignore when alternate allele is 0 @@ -72,11 +75,10 @@ protected void map(Object key, VariantRow value, Context context) throws IOExcep } int studyId = column.getStudyId(); int cohortId = column.getCohortId(); - populationFrequencies.add(new PopulationFrequency( - studyIdMap.get(studyId), - cohortIdMap.get(studyId).get(cohortId), - variant.getReference(), variant.getAlternate(), - variantStats.getRefAlleleFreq(), variantStats.getAltAlleleFreq(), null, null, null)); + + populationFrequencies.add(popFreqConverter.convert( + studyIdMap.get(studyId), cohortIdMap.get(studyId).get(cohortId), variantStats, + variant.getReference(), variant.getAlternate())); }) .walk(); @@ -87,16 +89,15 @@ protected void map(Object key, VariantRow value, Context context) throws IOExcep } VariantAnnotation annotation = annotationRef.get(); if (annotation == null) { + annotation = new VariantAnnotation(); context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "empty_annotation").increment(1); } if (overwrite) { - if (annotation == null) { - return; - } annotation.setPopulationFrequencies(populationFrequencies); } else { - if (populationFrequencies.isEmpty() || annotation == null) { + if (populationFrequencies.isEmpty()) { + // Nothing to do, nothing to add return; } if (annotation.getPopulationFrequencies() == null || annotation.getPopulationFrequencies().isEmpty()) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/VariantRow.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/VariantRow.java index 9a321972a7a..d59f36e77cd 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/VariantRow.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/VariantRow.java @@ -13,11 +13,13 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.biodata.models.variant.protobuf.VariantProto; +import org.opencb.biodata.models.variant.stats.VariantStats; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.PhoenixHelper; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory; import org.opencb.opencga.storage.hadoop.variant.converters.annotation.HBaseToVariantAnnotationConverter; +import org.opencb.opencga.storage.hadoop.variant.converters.stats.HBaseToVariantStatsConverter; import org.opencb.opencga.storage.hadoop.variant.converters.study.HBaseToStudyEntryConverter; import org.opencb.opencga.storage.hadoop.variant.gaps.VariantOverlappingStatus; @@ -410,6 +412,10 @@ public interface StatsColumn extends Column { int getCohortId(); VariantProto.VariantStats toProto(); + + default VariantStats toJava() { + return HBaseToVariantStatsConverter.convert(toProto()); + } } public interface VariantScoreColumn extends Column { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/stats/HBaseToVariantStatsConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/stats/HBaseToVariantStatsConverter.java index 15a99304985..52380871f79 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/stats/HBaseToVariantStatsConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/stats/HBaseToVariantStatsConverter.java @@ -128,7 +128,7 @@ protected VariantStats convert(byte[] data) { } } - protected VariantStats convert(VariantProto.VariantStats protoStats) { + public static VariantStats convert(VariantProto.VariantStats protoStats) { VariantStats stats = new VariantStats(); stats.setSampleCount(protoStats.getSampleCount()); From efba761d3bea7d8ed96db72f7261228dc9429267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Mon, 7 Jun 2021 19:47:13 +0100 Subject: [PATCH 381/412] storage: Fix NPE at JulieTool on missing annotation --- .../hadoop/variant/analysis/julie/JulieToolMapper.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java index 55b80d8d470..fe31107dafd 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/julie/JulieToolMapper.java @@ -90,6 +90,11 @@ protected void map(Object key, VariantRow value, Context context) throws IOExcep VariantAnnotation annotation = annotationRef.get(); if (annotation == null) { annotation = new VariantAnnotation(); + annotation.setChromosome(variant.getChromosome()); + annotation.setStart(variant.getStart()); + annotation.setEnd(variant.getEnd()); + annotation.setReference(variant.getReference()); + annotation.setAlternate(variant.getAlternate()); context.getCounter(VariantsTableMapReduceHelper.COUNTER_GROUP_NAME, "empty_annotation").increment(1); } From a1b536a5726b36bbf11cb71180ae61892ff3ed0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Tue, 8 Jun 2021 08:49:36 +0200 Subject: [PATCH 382/412] analysis: mutational signature and genome plot are computed for somatic samples only in sample quality control analysis --- .../analysis/sample/qc/SampleQcAnalysis.java | 25 +++++++++++++------ .../options/VariantCommandOptions.java | 8 +++--- .../variant/SampleQcAnalysisParams.java | 3 ++- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 19c055436f2..35338449630 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -55,8 +55,8 @@ public class SampleQcAnalysis extends OpenCgaToolScopeStudy { public static final String ID = "sample-qc"; - public static final String DESCRIPTION = "Run quality control (QC) for a given sample. It includes variant stats and genome plot; and " - + " for somatic samples, mutational signature."; + public static final String DESCRIPTION = "Run quality control (QC) for a given sample. It includes variant stats, and if the sample " + + "is somatic, mutational signature and genome plot are calculated."; @ToolParams protected final SampleQcAnalysisParams analysisParams = new SampleQcAnalysisParams(); @@ -132,17 +132,28 @@ protected void check() throws Exception { runSignature = false; } + if (runSignature && !sample.isSomatic()) { + addWarning("Skipping mutational signature: sample '" + sample.getId() + "' is not somatic."); + runSignature = false; + } + // Check genome plot if (StringUtils.isEmpty(analysisParams.getGenomePlotConfigFile())) { runGenomePlot = false; } else { - File genomePlotConfFile = AnalysisUtils.getCatalogFile(analysisParams.getGenomePlotConfigFile(), getStudy(), - catalogManager.getFileManager(), getToken()); - genomePlotConfigPath = Paths.get(genomePlotConfFile.getUri().getPath()); - if (!genomePlotConfigPath.toFile().exists()) { - throw new ToolException("Invalid parameters: genome plot configuration file does not exist (" + genomePlotConfigPath + ")"); + if (runGenomePlot && !sample.isSomatic()) { + addWarning("Skipping genome plot: sample '" + sample.getId() + "' is not somatic."); + runGenomePlot = false; + } else { + File genomePlotConfFile = AnalysisUtils.getCatalogFile(analysisParams.getGenomePlotConfigFile(), getStudy(), + catalogManager.getFileManager(), getToken()); + genomePlotConfigPath = Paths.get(genomePlotConfFile.getUri().getPath()); + if (!genomePlotConfigPath.toFile().exists()) { + throw new ToolException("Invalid parameters: genome plot configuration file does not exist (" + genomePlotConfigPath + ")"); + } } } + } @Override diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java index dc7a2a09da9..7dd4578cc9d 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/VariantCommandOptions.java @@ -1478,20 +1478,20 @@ public class SampleQcCommandOptions { @DynamicParameter(names = {"--vsq", "--variant-stats-query"}, description = "Variant stats query, e.g.:. --vsq gene=\"BRCA2\" --vsq ct=\"missense_variant\"") public Map variantStatsQuery = new HashMap<>(); - @Parameter(names = {"--si", "--signature-id"}, description = "Signature ID.") + @Parameter(names = {"--si", "--signature-id"}, description = "Mutational signature ID (mutational signature is calculated for somatic samples only).") public String signatureId; - @Parameter(names = {"--sd", "--signature-description"}, description = "Signature description.") + @Parameter(names = {"--sd", "--signature-description"}, description = "Mutational signature description.") public String signatureDescription; - @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") + @DynamicParameter(names = {"--sq", "--signature-query"}, description = "Mutational signature query, e.g.:. --sq type=\"SNV\" --sq ct=\"missense_variant\"") public Map signatureQuery = new HashMap<>(); @Parameter(names = {"--signature-release"}, description = "Release of COSMIC mutational signatures. Valid values: 2, 3, 3.1 and 3.2.") public String signatureRelease = "2"; - @Parameter(names = {"--gpi", "--genome-plot-id"}, description = "Genome plot ID.") + @Parameter(names = {"--gpi", "--genome-plot-id"}, description = "Genome plot ID (genome plot is calculated for somatic samples only).") public String genomePlotId; @Parameter(names = {"--gpd", "--genome-plot-description"}, description = "Genome plot description.") diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java index 641059d7140..300ad09201d 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/SampleQcAnalysisParams.java @@ -20,7 +20,8 @@ import org.opencb.opencga.core.tools.ToolParams; public class SampleQcAnalysisParams extends ToolParams { - public static final String DESCRIPTION = "Sample QC analysis params"; + public static final String DESCRIPTION = "Sample QC analysis params. Mutational signature and genome plot are calculated for somatic" + + " samples only"; private String sample; private String variantStatsId; private String variantStatsDescription; From ed513d45aa6f3d96c666c70788b364b1043bacc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 8 Jun 2021 11:25:22 +0100 Subject: [PATCH 383/412] app: format and bioformat params should not be mandatory in "files upload" --- .../app/cli/main/executors/catalog/FileCommandExecutor.java | 5 +++-- .../opencga/app/cli/main/options/FileCommandOptions.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/FileCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/FileCommandExecutor.java index 2ab72360bc6..4e48485edde 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/FileCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/executors/catalog/FileCommandExecutor.java @@ -32,6 +32,7 @@ import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.utils.Constants; +import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.UriUtils; @@ -336,8 +337,8 @@ private RestResponse upload() throws ClientException { FileCommandOptions.UploadCommandOptions commandOptions = filesCommandOptions.uploadCommandOptions; ObjectMap params = new ObjectMap() - .append("fileFormat", commandOptions.fileFormat) - .append("bioformat", commandOptions.bioformat) + .append("fileFormat", ParamUtils.defaultString(commandOptions.fileFormat, File.Format.UNKNOWN.toString())) + .append("bioformat", ParamUtils.defaultString(commandOptions.bioformat, File.Bioformat.UNKNOWN.toString())) .append("parents", commandOptions.parents); params.putIfNotEmpty(FileDBAdaptor.QueryParams.STUDY.key(), commandOptions.study); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/FileCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/FileCommandOptions.java index 6d5e5d6591a..dcb9d4c173f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/FileCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/main/options/FileCommandOptions.java @@ -459,12 +459,12 @@ public class UploadCommandOptions extends StudyOption { @Parameter(names = {"-i","--input"}, description = "Input file", required = true, arity = 1) public String inputFile; - @Parameter(names = {"--file-format"}, description = "Format of the file (VCF, BCF, GVCF, SAM, BAM, BAI...UNKNOWN)", required = true, + @Parameter(names = {"--file-format"}, description = "Format of the file (VCF, BCF, GVCF, SAM, BAM, BAI...UNKNOWN)", arity = 1) public String fileFormat; @Parameter(names = {"--bioformat"}, description = "Bioformat of the file (VARIANT, ALIGNMENT, SEQUENCE, PEDIGREE...NONE)", - required = true, arity = 1) + arity = 1) public String bioformat; @Parameter(names = {"--catalog-path"}, description = "Path within catalog where the file will be located (Default: root folder)", From 5b10cb7470c73c703273502cfee9536e907fa406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 8 Jun 2021 11:28:24 +0000 Subject: [PATCH 384/412] GitBook: [develop] 5 pages modified --- docs/SUMMARY.md | 3 +- .../administrator/templates-manifest.md | 2 +- docs/using-opencga/command-line.md | 2 - docs/using-opencga/command-line/README.md | 44 +++++++++++++++++++ docs/using-opencga/command-line/files.md | 22 ++++++++++ 5 files changed, 69 insertions(+), 4 deletions(-) delete mode 100644 docs/using-opencga/command-line.md create mode 100644 docs/using-opencga/command-line/README.md create mode 100644 docs/using-opencga/command-line/files.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 426b3e90ef1..854d4985689 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -38,7 +38,8 @@ * [Python](using-opencga/client-libraries/python.md) * [R](using-opencga/client-libraries/r.md) * [JavaScript](using-opencga/client-libraries/javascript.md) - * [Command Line](using-opencga/command-line.md) + * [Command Line](using-opencga/command-line/README.md) + * [Files](using-opencga/command-line/files.md) * [Public Demo](using-opencga/public-demo.md) * [Case Studies](case-studies/README.md) * [Genomics England Research](case-studies/genomics-england-research.md) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index a0bad3e746c..90807289c49 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -4,7 +4,7 @@ Since OpenCGA v2.1.x, the OpenCGA users with administration roles are offered th Templates are defined at a study level and could be provided in different formats accordingly to the user's needs. The file format and some common use cases are illustrated in the following section. -Remember that OpenCGA is highly configurable, and the use of templates constitutes a useful resource to reduce some common artifacts on the ingestion of metadata, but you can always use the OpenCGA clients \([Client Libraries](../../using-opencga/client-libraries/)\), command line \([Command Line](../../using-opencga/command-line.md)\) or [REST Web Service API](../../using-opencga/restful-web-service-api.md) to perform different operations in OpenCGA. +Remember that OpenCGA is highly configurable, and the use of templates constitutes a useful resource to reduce some common artifacts on the ingestion of metadata, but you can always use the OpenCGA clients \([Client Libraries](../../using-opencga/client-libraries/)\), command line \([Command Line](../../using-opencga/command-line/)\) or [REST Web Service API](../../using-opencga/restful-web-service-api.md) to perform different operations in OpenCGA. ## How it Works diff --git a/docs/using-opencga/command-line.md b/docs/using-opencga/command-line.md deleted file mode 100644 index d6a9dc3f0ad..00000000000 --- a/docs/using-opencga/command-line.md +++ /dev/null @@ -1,2 +0,0 @@ -# Command Line - diff --git a/docs/using-opencga/command-line/README.md b/docs/using-opencga/command-line/README.md new file mode 100644 index 00000000000..4734b9d57bd --- /dev/null +++ b/docs/using-opencga/command-line/README.md @@ -0,0 +1,44 @@ +# Command Line + +## Overview + +**opencga.sh** is the officially recommended command line tool for users. It implements most of the functionality with many different _commands_ and _subcommands._ These _commands_ are a one-to-one mapping of _Resources_ from __REST web services and _subcommands_ are mapping to end-points. All the operations that can be performed using the command line internally create one or several REST calls, so access to REST machine/cluster is required. + +## Installation + +OpenCGA command line can be downloaded from the main GitHub repository: + +{% embed url="https://github.com/opencb/opencga/releases/download/v2.0.3/opencga-client-2.0.3.tar.gz" %} + +The client needs to be configured to point to the OpenCGA REST server by editing the section "rest.host" at the file `conf/client-configuration.yml` + +## Correlation Between REST and CLI + +In the following URL, "_samples"_ is the resource and "_search"_ is the endpoint: + +[https://ws.opencb.org/opencga-demo/webservices/rest/v1/**samples**/**search**](https://ws.opencb.org/opencga-demo/webservices/rest/v1/samples/search) + +the corresponding command in the command line is : + +| `./opencga.sh samples` | +| :--- | + + +and the corresponding subcommand is : + +| `./opencga.sh samples search` | +| :--- | + + +## CLI Session Management + +Generally, unless we are pointing to a public OpenCGA installation, users will first need to log in using the "users login" command line. Once the user has successfully logged in, a session file will be generated in their home folder: + +| `~/.opencga/session.json` | +| :--- | + + +This session file contains the following information: + +This makes it easier for users to login only once and execute any number of commands till the session token is expired. Session expiration is set by OpenCGA server independently from the client. Once the token is expired, the user has to login again and can perform desired operations as normal. + diff --git a/docs/using-opencga/command-line/files.md b/docs/using-opencga/command-line/files.md new file mode 100644 index 00000000000..128dee0df85 --- /dev/null +++ b/docs/using-opencga/command-line/files.md @@ -0,0 +1,22 @@ +--- +description: opencga.sh files +--- + +# Files + +## Upload + +Upload a physical local file to one specific study in OpenCGA. + +| Name | Usage | +| :--- | :--- | +| -i --input | Input file | +| -s --study | Study \[\[user@\]project:\]study where study and project can be either the ID or UUID | +| --catalog-path | Path within catalog where the file will be located | +| --file-name | Name of the file by which it will be stored in catalog | +| --description | Description of the file | +| --bioformat | Bioformat of the file \(VARIANT, ALIGNMENT, SEQUENCE, PEDIGREE...NONE\) | +| --file-format | Format of the file \(VCF, BCF, GVCF, SAM, BAM, BAI...UNKNOWN\) | + + + From a826a26c22ce2430f51fd88fa0536645e166db25 Mon Sep 17 00:00:00 2001 From: imedina Date: Wed, 9 Jun 2021 00:32:23 +0100 Subject: [PATCH 385/412] analysis: use new cellbase API when getting gene IDs --- .../analysis/clinical/ClinicalInterpretationManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java index 79f61bb5cdc..d6dde662734 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java @@ -366,11 +366,11 @@ private ClinicalVariant createClinicalVariant(Variant variant, Map(genePanelMap.get(ct.getEnsemblGeneId())); + if (genePanelMap.containsKey(ct.getGeneId())) { + panelIds = new ArrayList<>(genePanelMap.get(ct.getGeneId())); } else if (genePanelMap.containsKey(ct.getGeneName())) { panelIds = new ArrayList<>(genePanelMap.get(ct.getGeneName())); } From e87d9291c3b38b18f2e8f22127ed3f2dd6ee672e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 9 Jun 2021 09:16:23 +0200 Subject: [PATCH 386/412] analysis: do not use the fileId from the SamtoolsStats data model (this field will be removed) --- .../analysis/alignment/qc/AlignmentStatsAnalysis.java | 2 +- .../analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java index 26bc67cd75a..71c821f1506 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentStatsAnalysis.java @@ -133,7 +133,7 @@ protected void run() throws ToolException { }); step(SAVE_ALIGNMENT_STATS_STEP, () -> { - SamtoolsStats alignmentStats = SamtoolsWrapperAnalysis.parseSamtoolsStats(statsFile.toFile(), catalogBamFile.getId()); + SamtoolsStats alignmentStats = SamtoolsWrapperAnalysis.parseSamtoolsStats(statsFile.toFile()); List images = new ArrayList<>(); for (java.io.File file : getOutDir().toFile().listFiles()) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java index 7095c0163af..25dabac64b9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/wrappers/samtools/SamtoolsWrapperAnalysis.java @@ -133,7 +133,7 @@ protected void run() throws Exception { } - public static SamtoolsStats parseSamtoolsStats(java.io.File file, String fileId) throws IOException { + public static SamtoolsStats parseSamtoolsStats(java.io.File file) throws IOException { // Create a map with the summary numbers of the statistics (samtools stats) Map map = new HashMap<>(); @@ -157,9 +157,6 @@ public static SamtoolsStats parseSamtoolsStats(java.io.File file, String fileId) // Convert map to AlignmentStats SamtoolsStats alignmentStats = JacksonUtils.getDefaultObjectMapper().convertValue(map, SamtoolsStats.class); - // Set file ID - alignmentStats.setFileId(fileId); - return alignmentStats; } From f2336a257ef214cacc204b1c0239beca8ce71764 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 10 Jun 2021 15:35:42 +0200 Subject: [PATCH 387/412] app: add new fields to migration, #1730 --- .../app/misc/migration/v2.1.0/migration4.js | 16 +++++++++++++++- .../v2_1_0/catalog/javascript/Migration4.java | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/opencga-app/app/misc/migration/v2.1.0/migration4.js b/opencga-app/app/misc/migration/v2.1.0/migration4.js index 870eeaf59d6..125aa33a966 100644 --- a/opencga-app/app/misc/migration/v2.1.0/migration4.js +++ b/opencga-app/app/misc/migration/v2.1.0/migration4.js @@ -38,4 +38,18 @@ var fileQC = { } }; db.file.update({"qualityControl": {"$exists": false}}, {"$set": {"qualityControl": fileQC}, - "$unset": {"variant": "", "alignment": "", "coverage": ""}}); \ No newline at end of file + "$unset": {"variant": "", "alignment": "", "coverage": ""}}); + +// Rename variantMetrics to variant +migrateCollection("sample", {"qualityControl.variantMetrics": {"$exists": true}}, {qualityControl: 1}, function(bulk, doc) { + // Rename variantMetrics to variant + if (isNotUndefinedOrNull(doc.qualityControl)) { + doc.qualityControl['variant'] = doc.qualityControl.variantMetrics; + delete doc.qualityControl['variantMetrics']; + bulk.find({"_id": doc._id}).updateOne({"$set": {"qualityControl": doc.qualityControl}}); + } +}); + +// Remove fileId from SamtoolStats +db.file.update({"qualityControl.alignment.samtoolsStats.fileId": {"$exists": true}}, + {"$unset": {"qualityControl.alignment.samtoolsStats.fileId": ""}}); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java index 6c7a3cb8e14..670b4919890 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java @@ -8,7 +8,7 @@ import java.nio.file.Paths; @Migration(id="update_qc_file_sample_fields", description = "Update QC fields from Sample and File #1730", version = "2.1.0", - language = Migration.MigrationLanguage.JAVASCRIPT, rank = 4, patch = 3) + language = Migration.MigrationLanguage.JAVASCRIPT, rank = 4, patch = 4) public class Migration4 extends MigrationTool { @Override From 4bf29669a5d71e62c5530c2b8642d75013485958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 10 Jun 2021 16:49:24 +0200 Subject: [PATCH 388/412] models: minor changes in sample quality control and update analysis according to data model changes --- .../analysis/sample/qc/SampleQcAnalysis.java | 6 +++--- .../variant/genomePlot/GenomePlotAnalysis.java | 2 +- .../MutationalSignatureAnalysis.java | 7 ++++--- .../stats/SampleVariantStatsAnalysis.java | 16 ++++++++-------- .../analysis/variant/VariantAnalysisTest.java | 2 +- .../opencga/catalog/managers/SampleManager.java | 12 ++++++------ .../converters/AnnotableConverterTest.java | 2 +- .../core/models/sample/SampleQualityControl.java | 16 ++++++++-------- 8 files changed, 32 insertions(+), 31 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 35338449630..af4eafe56a7 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -113,12 +113,12 @@ protected void check() throws Exception { analysisParams.setVariantStatsId(OPENCGA_ALL); } - if (sample.getQualityControl() != null && sample.getQualityControl().getVariantMetrics() != null) { - if (CollectionUtils.isNotEmpty(sample.getQualityControl().getVariantMetrics().getVariantStats()) + if (sample.getQualityControl() != null && sample.getQualityControl().getVariant() != null) { + if (CollectionUtils.isNotEmpty(sample.getQualityControl().getVariant().getVariantStats()) && OPENCGA_ALL.equals(analysisParams.getVariantStatsId())) { runVariantStats = false; } else { - for (SampleQcVariantStats variantStats : sample.getQualityControl().getVariantMetrics().getVariantStats()) { + for (SampleQcVariantStats variantStats : sample.getQualityControl().getVariant().getVariantStats()) { if (variantStats.getId().equals(analysisParams.getVariantStatsId())) { throw new ToolException("Invalid parameters: variant stats ID '" + analysisParams.getVariantStatsId() + "' is already used"); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java index ce566d38fbc..a125f057b30 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java @@ -104,7 +104,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new SampleQualityControl(); } - qc.getVariantMetrics().getGenomePlots().add(genomePlot); + qc.getVariant().getGenomePlots().add(genomePlot); catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java index 22905b28251..15a7752774e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java @@ -40,6 +40,7 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -133,7 +134,7 @@ protected void run() throws ToolException { if (qc == null) { qc = new SampleQualityControl(); } - qc.getVariantMetrics().getSignatures().add(signature); + qc.getVariant().getSignatures().add(signature); catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); @@ -150,10 +151,10 @@ public Signature parse(Path dir) throws IOException { File contextFile = dir.resolve(GENOME_CONTEXT_FILENAME).toFile(); if (contextFile.exists()) { List lines = FileUtils.readLines(contextFile, Charset.defaultCharset()); - Signature.GenomeContextCount[] sigCounts = new Signature.GenomeContextCount[lines.size() - 1]; + List sigCounts = new ArrayList<>(lines.size() - 1); for (int i = 1; i < lines.size(); i++) { String[] fields = lines.get(i).split("\t"); - sigCounts[i-1] = new Signature.GenomeContextCount(fields[2], Math.round(Float.parseFloat((fields[3])))); + sigCounts.add(new Signature.GenomeContextCount(fields[2], Math.round(Float.parseFloat((fields[3]))))); } result.setCounts(sigCounts); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java index 87e4a77c465..5b647cc5ae5 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java @@ -306,22 +306,22 @@ protected void run() throws ToolException { if (qualityControl == null) { qualityControl = new SampleQualityControl(); } - if (qualityControl.getVariantMetrics() == null) { - qualityControl.setVariantMetrics(new SampleVariantQualityControlMetrics()); + if (qualityControl.getVariant() == null) { + qualityControl.setVariant(new SampleVariantQualityControlMetrics()); } - if (CollectionUtils.isEmpty(qualityControl.getVariantMetrics().getVariantStats())) { - qualityControl.getVariantMetrics().setVariantStats(Collections.singletonList(o)); + if (CollectionUtils.isEmpty(qualityControl.getVariant().getVariantStats())) { + qualityControl.getVariant().setVariantStats(Collections.singletonList(o)); } else { boolean hasItem = false; - for (int i = 0; i < qualityControl.getVariantMetrics().getVariantStats().size(); i++) { - if (qualityControl.getVariantMetrics().getVariantStats().get(i).getId().equals(o.getId())) { - qualityControl.getVariantMetrics().getVariantStats().set(i, o); + for (int i = 0; i < qualityControl.getVariant().getVariantStats().size(); i++) { + if (qualityControl.getVariant().getVariantStats().get(i).getId().equals(o.getId())) { + qualityControl.getVariant().getVariantStats().set(i, o); hasItem = true; break; } } if (!hasItem) { - qualityControl.getVariantMetrics().getVariantStats().add(o); + qualityControl.getVariant().getVariantStats().add(o); } } SampleUpdateParams updateParams = new SampleUpdateParams().setQualityControl(qualityControl); diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java index 14374b4c0e5..79ea4dcd210 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java @@ -410,7 +410,7 @@ private ExecutionResult sampleVariantStats(String region, String indexId, boolea } for (String sample : samples) { Sample sampleObj = catalogManager.getSampleManager().get(STUDY, sample, QueryOptions.empty(), token).first(); - List variantStats = sampleObj.getQualityControl().getVariantMetrics().getVariantStats(); + List variantStats = sampleObj.getQualityControl().getVariant().getVariantStats(); assertEquals(expectedStats, variantStats.size()); assertThat(variantStats.stream().map(SampleQcVariantStats::getId).collect(Collectors.toSet()), hasItem(indexId)); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java index 6cd1d23573d..d3d73f5a22d 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java @@ -25,7 +25,6 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; @@ -39,6 +38,7 @@ import org.opencb.opencga.catalog.utils.UuidUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.cohort.CohortStatus; import org.opencb.opencga.core.models.common.*; @@ -1471,8 +1471,8 @@ private void fixQualityControlUpdateParams(SampleUpdateParams sampleUpdateParams String variableSetId = "opencga_sample_variant_stats"; - if (sampleUpdateParams.getQualityControl().getVariantMetrics() == null - || sampleUpdateParams.getQualityControl().getVariantMetrics().getVariantStats().isEmpty()) { + if (sampleUpdateParams.getQualityControl().getVariant() == null + || sampleUpdateParams.getQualityControl().getVariant().getVariantStats().isEmpty()) { // Add REMOVE Action Map map = options.getMap(Constants.ACTIONS); if (map == null) { @@ -1488,10 +1488,10 @@ private void fixQualityControlUpdateParams(SampleUpdateParams sampleUpdateParams List annotationSetList = new LinkedList<>(); - if (sampleUpdateParams.getQualityControl().getVariantMetrics() != null) { + if (sampleUpdateParams.getQualityControl().getVariant() != null) { - if (CollectionUtils.isNotEmpty(sampleUpdateParams.getQualityControl().getVariantMetrics().getVariantStats())) { - for (SampleQcVariantStats variantStat : sampleUpdateParams.getQualityControl().getVariantMetrics().getVariantStats()) { + if (CollectionUtils.isNotEmpty(sampleUpdateParams.getQualityControl().getVariant().getVariantStats())) { + for (SampleQcVariantStats variantStat : sampleUpdateParams.getQualityControl().getVariant().getVariantStats()) { SampleVariantStats stats = variantStat.getStats(); if (stats != null) { Map indelLengthCount = new HashMap<>(); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/AnnotableConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/AnnotableConverterTest.java index 368a917e97c..c8b1baea4e1 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/AnnotableConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/AnnotableConverterTest.java @@ -289,7 +289,7 @@ public void convertAvroTest() throws Exception { AnnotableConverter c = new AnnotableConverter<>(Sample.class); c.convertToStorageType( new Sample().setQualityControl( - new SampleQualityControl().setVariantMetrics( + new SampleQualityControl().setVariant( new SampleVariantQualityControlMetrics().setVariantStats(Collections.singletonList( new SampleQcVariantStats().setStats( new SampleVariantStats())))))); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java index c3ee5e0fde8..df8b5061721 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleQualityControl.java @@ -26,16 +26,16 @@ public class SampleQualityControl implements Serializable { private List files; private List comments; - private SampleVariantQualityControlMetrics variantMetrics; + private SampleVariantQualityControlMetrics variant; public SampleQualityControl() { this(new ArrayList<>(), new ArrayList<>(), new SampleVariantQualityControlMetrics()); } - public SampleQualityControl(List files, List comments, SampleVariantQualityControlMetrics variantMetrics) { + public SampleQualityControl(List files, List comments, SampleVariantQualityControlMetrics variant) { this.files = files; this.comments = comments; - this.variantMetrics = variantMetrics; + this.variant = variant; } @Override @@ -43,7 +43,7 @@ public String toString() { final StringBuilder sb = new StringBuilder("SampleQualityControl{"); sb.append("files=").append(files); sb.append(", comments=").append(comments); - sb.append(", variantMetrics=").append(variantMetrics); + sb.append(", variant=").append(variant); sb.append('}'); return sb.toString(); } @@ -66,12 +66,12 @@ public SampleQualityControl setComments(List comments) { return this; } - public SampleVariantQualityControlMetrics getVariantMetrics() { - return variantMetrics; + public SampleVariantQualityControlMetrics getVariant() { + return variant; } - public SampleQualityControl setVariantMetrics(SampleVariantQualityControlMetrics variantMetrics) { - this.variantMetrics = variantMetrics; + public SampleQualityControl setVariant(SampleVariantQualityControlMetrics variant) { + this.variant = variant; return this; } } From 52ca43a1fc707c14011b645bd84c50a66e2a5cb6 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 10 Jun 2021 17:32:04 +0200 Subject: [PATCH 389/412] analysis: fix compilation issue --- .../mutationalSignature/MutationalSignatureAnalysis.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java index 15a7752774e..2a3644ff016 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java @@ -169,11 +169,10 @@ public Signature parse(Path dir) throws IOException { Map content = JacksonUtils.getDefaultObjectMapper().readValue(coeffsFile, Map.class); Map coefficients = (Map) content.get("coefficients"); - SignatureFitting.Score[] scores = new SignatureFitting.Score[coefficients.size()]; - int i = 0; + List scores = new ArrayList<>(coefficients.size()); for (Object key : coefficients.keySet()) { Number coeff = (Number) coefficients.get(key); - scores[i++] = new SignatureFitting.Score((String) key, coeff.doubleValue()); + scores.add(new SignatureFitting.Score((String) key, coeff.doubleValue())); } fitting.setScores(scores); fitting.setCoeff((Double) content.get("rss")); From f8cd690a38bbacadb6c1bbb84a865b7365589cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Thu, 10 Jun 2021 11:48:05 +0100 Subject: [PATCH 390/412] storage: Use configurable indexes on all sample index annotation fields #1699 --- .../variant/knockout/KnockoutAnalysis.java | 2 +- .../KnockoutLocalAnalysisExecutor.java | 2 +- .../analysis/variant/VariantAnalysisTest.java | 2 +- .../core/config/ConfigurationOption.java | 4 + .../storage/IndexFieldConfiguration.java | 50 +- .../storage/SampleIndexConfiguration.java | 267 ++++++++- .../core/models/project/DataStore.java | 1 + .../variant}/VariantAnnotationConstants.java | 2 +- .../storage/core/io/bit/BitBuffer.java | 21 +- .../storage/core/io/bit/BitOutputStream.java | 46 +- ...itAssociationToEvidenceEntryConverter.java | 2 +- .../variant/query/VariantQueryParser.java | 2 +- .../core/variant/query/VariantQueryUtils.java | 2 +- .../CompoundHeterozygousQueryExecutor.java | 2 +- .../hadoop/variant/index/IndexUtils.java | 4 + ...SampleIndexVariantAggregationExecutor.java | 20 +- .../annotation/AnnotationIndexConverter.java | 539 ++---------------- .../annotation/AnnotationIndexEntry.java | 87 ++- .../annotation/AnnotationIndexPutBuilder.java | 41 +- .../AnnotationSummaryIndexSchema.java | 9 + .../index/annotation/BiotypeIndexSchema.java | 15 + .../index/annotation/ClinicalIndexSchema.java | 29 + .../ConsequenceTypeIndexSchema.java | 14 + .../CtBtCombinationIndexSchema.java | 248 ++++++++ .../PopulationFrequencyIndexSchema.java | 10 +- .../index/core/CategoricalIndexField.java | 58 +- .../CategoricalMultiValuedIndexField.java | 78 ++- .../index/core/DynamicIndexSchema.java | 7 +- .../index/core/FixedSizeIndexSchema.java | 45 ++ .../hadoop/variant/index/core/IndexField.java | 6 + .../variant/index/core/IndexSchema.java | 26 +- .../index/core/SingleFieldIndexSchema.java | 24 + .../index/core/filters/IndexFieldFilter.java | 4 + .../index/core/filters/IndexFilter.java | 153 +++++ .../core/filters/MaskIndexFieldFilter.java | 1 + .../core/filters/NoOpIndexFieldFilter.java | 10 + .../core/filters/RangeIndexFieldFilter.java | 2 +- .../query/SampleAnnotationIndexQuery.java | 133 ++--- .../variant/index/query/SampleIndexQuery.java | 6 +- .../AbstractSampleIndexEntryFilter.java | 95 +-- .../variant/index/sample/FileIndexSchema.java | 7 +- .../sample/SampleIndexAnnotationLoader.java | 4 +- .../index/sample/SampleIndexDBAdaptor.java | 42 +- .../index/sample/SampleIndexEntry.java | 32 +- .../index/sample/SampleIndexQueryParser.java | 127 ++--- .../index/sample/SampleIndexSchema.java | 38 +- .../sample/SampleIndexVariantBiConverter.java | 61 +- .../AnnotationIndexConverterTest.java | 33 +- .../AnnotationIndexPutBuilderTest.java | 128 ----- .../variant/index/family/FamilyIndexTest.java | 11 +- .../sample/SampleIndexEntryFilterTest.java | 164 +++--- .../sample/SampleIndexQueryParserTest.java | 245 ++++---- .../variant/index/sample/SampleIndexTest.java | 21 +- 53 files changed, 1662 insertions(+), 1320 deletions(-) rename {opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation => opencga-core/src/main/java/org/opencb/opencga/core/models/variant}/VariantAnnotationConstants.java (99%) create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationSummaryIndexSchema.java create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/BiotypeIndexSchema.java create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/ClinicalIndexSchema.java create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/ConsequenceTypeIndexSchema.java create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/CtBtCombinationIndexSchema.java create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/FixedSizeIndexSchema.java create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/SingleFieldIndexSchema.java create mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/IndexFilter.java delete mode 100644 opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexPutBuilderTest.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index 1ed2fe24036..ab395ca1880 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -44,7 +44,7 @@ import org.opencb.opencga.core.tools.annotations.ToolParams; import org.opencb.opencga.storage.core.metadata.models.Trio; import org.opencb.opencga.storage.core.utils.CellBaseUtils; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; +import org.opencb.opencga.core.models.variant.VariantAnnotationConstants; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import java.io.BufferedWriter; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index 7e4f97c8295..1baa3b21e17 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -58,7 +58,7 @@ import java.util.function.Predicate; import static org.opencb.biodata.models.clinical.ClinicalProperty.ModeOfInheritance.COMPOUND_HETEROZYGOUS; -import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.PROTEIN_CODING; +import static org.opencb.opencga.core.models.variant.VariantAnnotationConstants.PROTEIN_CODING; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.ALL; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.IS; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java index 14374b4c0e5..37c03e7baf6 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java @@ -70,7 +70,7 @@ import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; +import org.opencb.opencga.core.models.variant.VariantAnnotationConstants; import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageEngine; import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageTest; import org.opencb.opencga.storage.hadoop.variant.VariantHbaseTestUtils; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/ConfigurationOption.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/ConfigurationOption.java index 83a8e137e22..20024e91520 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/ConfigurationOption.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/ConfigurationOption.java @@ -9,4 +9,8 @@ public interface ConfigurationOption { // default boolean isFinal() { // return false; // } + +// default boolean isModifiableAfterLoading() { +// return false; +// } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java index 1009820bc62..232d795c87b 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/IndexFieldConfiguration.java @@ -5,8 +5,7 @@ import org.apache.commons.lang3.ArrayUtils; import java.beans.ConstructorProperties; -import java.util.Arrays; -import java.util.Objects; +import java.util.*; public class IndexFieldConfiguration { protected final Source source; @@ -14,6 +13,7 @@ public class IndexFieldConfiguration { protected Type type; protected double[] thresholds; protected String[] values; + protected Map> valuesMapping; protected boolean nullable = true; public IndexFieldConfiguration(IndexFieldConfiguration other) { @@ -87,11 +87,20 @@ public String[] getValues() { return values; } - public IndexFieldConfiguration setValues(String[] values) { + public IndexFieldConfiguration setValues(String... values) { this.values = values; return this; } + public Map> getValuesMapping() { + return valuesMapping; + } + + public IndexFieldConfiguration setValuesMapping(Map> valuesMapping) { + this.valuesMapping = valuesMapping; + return this; + } + public boolean getNullable() { return nullable; } @@ -103,19 +112,19 @@ public IndexFieldConfiguration setNullable(boolean nullable) { public void validate() { if (key == null) { - throw new IllegalArgumentException("Missing field KEY in index custom field"); + throw new IllegalArgumentException("Missing field KEY in index field"); } if (source == null) { - throw new IllegalArgumentException("Missing field SOURCE in index custom field " + key); + throw new IllegalArgumentException("Missing field SOURCE in index field " + key); } if (type == null) { - throw new IllegalArgumentException("Missing field TYPE in index custom field " + source + ":" + key); + throw new IllegalArgumentException("Missing field TYPE in index field " + source + ":" + key); } switch (type) { case RANGE_LT: case RANGE_GT: if (thresholds == null || thresholds.length == 0) { - throw new IllegalArgumentException("Missing 'thresholds' for index custom field " + getId()); + throw new IllegalArgumentException("Missing 'thresholds' for index field " + getId()); } if (!ArrayUtils.isSorted(thresholds)) { throw new IllegalArgumentException("Thresholds must be sorted!"); @@ -125,15 +134,38 @@ public void validate() { // + thresholds.length + " thresholds. " // + "Must be a power of 2 minus 1. e.g. 1, 3, 7, 15..."); // } + if (values != null && values.length != 0) { + throw new IllegalArgumentException("Invalid 'values' with type " + type + " in field " + getId()); + } + if (valuesMapping != null && !valuesMapping.isEmpty()) { + throw new IllegalArgumentException("Invalid 'valuesMapping' with type " + type + " in field " + getId()); + } break; case CATEGORICAL: case CATEGORICAL_MULTI_VALUE: if (values == null || values.length == 0) { - throw new IllegalArgumentException("Missing 'values' for index custom field " + getId()); + throw new IllegalArgumentException("Missing 'values' for index field " + getId()); + } + if (valuesMapping != null) { + for (String key : valuesMapping.keySet()) { + if (!ArrayUtils.contains(values, key)) { + throw new IllegalArgumentException("Unknown value mapping from '" + key + "'"); + } + } + Set allValues = new HashSet<>(); + Set duplicatedValues = new HashSet<>(); + for (List strings : valuesMapping.values()) { + for (String string : strings) { + if (!allValues.add(string)) { + duplicatedValues.add(string); + } + } + } + throw new IllegalArgumentException("Found multiple mappings for these values: " + duplicatedValues); } break; default: - throw new IllegalArgumentException("Unknown type " + type + " for index custom field " + getId()); + throw new IllegalArgumentException("Unknown type " + type + " for index field " + getId()); } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java index 54d2aed0198..a7da1b9408d 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java @@ -2,22 +2,24 @@ import htsjdk.variant.vcf.VCFConstants; import org.opencb.biodata.models.variant.StudyEntry; +import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import java.beans.ConstructorProperties; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; + +import static org.opencb.opencga.core.models.variant.VariantAnnotationConstants.*; public class SampleIndexConfiguration { - public static final int DEFAULT_FILE_POSITION_SIZE_BITS = 4; + + public static final int DEFAULT_FILE_POSITION_SIZE_BITS = 3; private static final double[] QUAL_THRESHOLDS = new double[]{10, 20, 30}; private static final double[] DP_THRESHOLDS = new double[]{5, 10, 15, 20, 30, 40, 50}; - + private static final double[] DP_THRESHOLDS_NULLABLE = new double[]{5, 10, 15, 20, 30, 50}; private final List populationRanges = new ArrayList<>(); private final FileIndexConfiguration fileIndexConfiguration = new FileIndexConfiguration(); + private final AnnotationIndexConfiguration annotationIndexConfiguration = new AnnotationIndexConfiguration(); - public static SampleIndexConfiguration defaultConfiguration() { + public static SampleIndexConfiguration backwardCompatibleConfiguration() { SampleIndexConfiguration sampleIndexConfiguration = new SampleIndexConfiguration() .addPopulationRange(new PopulationFrequencyRange("1kG_phase3", "ALL")) .addPopulationRange(new PopulationFrequencyRange("GNOMAD_GENOMES", "ALL")) @@ -31,14 +33,196 @@ public static SampleIndexConfiguration defaultConfiguration() { .addFileIndexField(new IndexFieldConfiguration( IndexFieldConfiguration.Source.SAMPLE, VCFConstants.DEPTH_KEY, DP_THRESHOLDS).setNullable(false)); - sampleIndexConfiguration.getFileIndexConfiguration() - .setFilePositionBits(DEFAULT_FILE_POSITION_SIZE_BITS); + sampleIndexConfiguration.getFileIndexConfiguration().setFilePositionBits(4); // Ensure backward compatibility with these two params: sampleIndexConfiguration.addFileIndexField(new IndexFieldConfiguration( IndexFieldConfiguration.Source.SAMPLE, "padding", IndexFieldConfiguration.Type.CATEGORICAL, "add_two_extra_bits", "to_allow_backward", "compatibility")); sampleIndexConfiguration.getFileIndexConfiguration().setFixedFieldsFirst(false); + + IndexFieldConfiguration biotypeConfiguration = new IndexFieldConfiguration(IndexFieldConfiguration.Source.ANNOTATION, + "biotype", + IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE) + .setValues( + NONSENSE_MEDIATED_DECAY, + LINCRNA, + MIRNA, + RETAINED_INTRON, + SNRNA, + SNORNA, + "other_non_pseudo_gene", +// "other", + PROTEIN_CODING + ).setValuesMapping(new HashMap<>()); + biotypeConfiguration.getValuesMapping().put(LINCRNA, Arrays.asList( + "lncRNA", + NON_CODING, + LINCRNA, + "macro_lncRNA", + ANTISENSE, + SENSE_INTRONIC, + SENSE_OVERLAPPING, + THREEPRIME_OVERLAPPING_NCRNA, + "bidirectional_promoter_lncRNA")); + biotypeConfiguration.getValuesMapping().put("other_non_pseudo_gene", Arrays.asList( + PROCESSED_TRANSCRIPT + )); + biotypeConfiguration.setNullable(false); + + sampleIndexConfiguration.getAnnotationIndexConfiguration().setBiotype(biotypeConfiguration); + IndexFieldConfiguration consequenceType = new IndexFieldConfiguration( + IndexFieldConfiguration.Source.ANNOTATION, + "consequenceType", + IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE) + .setValues( + MISSENSE_VARIANT, + FRAMESHIFT_VARIANT, + INFRAME_DELETION, + INFRAME_INSERTION, + START_LOST, + STOP_GAINED, + STOP_LOST, + SPLICE_ACCEPTOR_VARIANT, + SPLICE_DONOR_VARIANT, + TRANSCRIPT_ABLATION, + TRANSCRIPT_AMPLIFICATION, + INITIATOR_CODON_VARIANT, + SPLICE_REGION_VARIANT, + INCOMPLETE_TERMINAL_CODON_VARIANT, + "mirna_tfbs", + "utr" + ).setValuesMapping(new HashMap<>()); + consequenceType.getValuesMapping().put("mirna_tfbs", Arrays.asList( + TF_BINDING_SITE_VARIANT, + MATURE_MIRNA_VARIANT)); + consequenceType.getValuesMapping().put("utr", Arrays.asList( + THREE_PRIME_UTR_VARIANT, + FIVE_PRIME_UTR_VARIANT)); + consequenceType.setNullable(false); + + sampleIndexConfiguration.getAnnotationIndexConfiguration().setConsequenceType(consequenceType); + + sampleIndexConfiguration.getAnnotationIndexConfiguration().setClinicalSource( + new IndexFieldConfiguration( + IndexFieldConfiguration.Source.ANNOTATION, "clinicalSource", + IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE, "cosmic") + .setNullable(false)); + sampleIndexConfiguration.getAnnotationIndexConfiguration().setClinicalSignificance( + new IndexFieldConfiguration( + IndexFieldConfiguration.Source.ANNOTATION, "clinicalSignificance", + IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE, + ClinicalSignificance.likely_benign.toString(), + ClinicalSignificance.uncertain_significance.toString(), + ClinicalSignificance.likely_pathogenic.toString(), + ClinicalSignificance.pathogenic.toString(), + "unused_target_drug", + "unused_pgx", + "unused_bit8" + ).setNullable(false)); + + return sampleIndexConfiguration; + } + + public static SampleIndexConfiguration defaultConfiguration() { + SampleIndexConfiguration sampleIndexConfiguration = new SampleIndexConfiguration() + .addPopulationRange(new PopulationFrequencyRange("1kG_phase3", "ALL")) + .addPopulationRange(new PopulationFrequencyRange("GNOMAD_GENOMES", "ALL")) + .addFileIndexField(new IndexFieldConfiguration( + IndexFieldConfiguration.Source.FILE, + StudyEntry.FILTER, + IndexFieldConfiguration.Type.CATEGORICAL, + VCFConstants.PASSES_FILTERS_v4)) + .addFileIndexField(new IndexFieldConfiguration( + IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL, QUAL_THRESHOLDS).setNullable(false)) + .addFileIndexField(new IndexFieldConfiguration( + IndexFieldConfiguration.Source.SAMPLE, VCFConstants.DEPTH_KEY, DP_THRESHOLDS_NULLABLE).setNullable(true)); + + sampleIndexConfiguration.getFileIndexConfiguration() + .setFilePositionBits(DEFAULT_FILE_POSITION_SIZE_BITS); + + IndexFieldConfiguration biotypeConfiguration = new IndexFieldConfiguration(IndexFieldConfiguration.Source.ANNOTATION, + "biotype", + IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE) + .setValues( + NONSENSE_MEDIATED_DECAY, + LINCRNA, + MIRNA, + RETAINED_INTRON, + SNRNA, + SNORNA, + "other_non_pseudo_gene", +// "other", + PROTEIN_CODING + ).setValuesMapping(new HashMap<>()); + biotypeConfiguration.getValuesMapping().put(LINCRNA, Arrays.asList( + "lncRNA", + NON_CODING, + LINCRNA, + "macro_lncRNA", + ANTISENSE, + SENSE_INTRONIC, + SENSE_OVERLAPPING, + THREEPRIME_OVERLAPPING_NCRNA, + "bidirectional_promoter_lncRNA")); + biotypeConfiguration.getValuesMapping().put("other_non_pseudo_gene", Arrays.asList( + PROCESSED_TRANSCRIPT + )); + + sampleIndexConfiguration.getAnnotationIndexConfiguration().setBiotype(biotypeConfiguration); + IndexFieldConfiguration consequenceType = new IndexFieldConfiguration( + IndexFieldConfiguration.Source.ANNOTATION, + "consequenceType", + IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE) + .setValues( + MISSENSE_VARIANT, + FRAMESHIFT_VARIANT, + INFRAME_DELETION, + INFRAME_INSERTION, + START_LOST, + STOP_GAINED, + STOP_LOST, + SPLICE_ACCEPTOR_VARIANT, + SPLICE_DONOR_VARIANT, + TRANSCRIPT_ABLATION, + TRANSCRIPT_AMPLIFICATION, + INITIATOR_CODON_VARIANT, + SPLICE_REGION_VARIANT, + INCOMPLETE_TERMINAL_CODON_VARIANT, + FEATURE_TRUNCATION, + SYNONYMOUS_VARIANT, + REGULATORY_REGION_VARIANT, + TF_BINDING_SITE_VARIANT, + MATURE_MIRNA_VARIANT, + UPSTREAM_GENE_VARIANT, + DOWNSTREAM_GENE_VARIANT, + THREE_PRIME_UTR_VARIANT, + FIVE_PRIME_UTR_VARIANT, + INTRON_VARIANT + ).setValuesMapping(new HashMap<>()); + + sampleIndexConfiguration.getAnnotationIndexConfiguration().setConsequenceType(consequenceType); + + sampleIndexConfiguration.getAnnotationIndexConfiguration().setClinicalSignificance( + new IndexFieldConfiguration( + IndexFieldConfiguration.Source.ANNOTATION, "clinicalSignificance", + IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE, + ClinicalSignificance.benign.toString(), + ClinicalSignificance.likely_benign.toString(), +// ClinicalSignificance.VUS.toString(), + ClinicalSignificance.uncertain_significance.toString(), + ClinicalSignificance.likely_pathogenic.toString(), + ClinicalSignificance.pathogenic.toString()) + .setNullable(false)); + sampleIndexConfiguration.getAnnotationIndexConfiguration().setClinicalSource( + new IndexFieldConfiguration( + IndexFieldConfiguration.Source.ANNOTATION, "clinicalSource", + IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE, + "clinvar", + "cosmic") + .setNullable(false) + ); + return sampleIndexConfiguration; } @@ -118,9 +302,7 @@ public String toString() { } public static class PopulationFrequencyRange extends IndexFieldConfiguration { - @Deprecated - //TODO: This field should be private - public static final double[] DEFAULT_THRESHOLDS = new double[]{0.001, 0.005, 0.01}; + private static final double[] DEFAULT_THRESHOLDS = new double[]{0.001, 0.005, 0.01}; private String study; private String population; @@ -193,6 +375,67 @@ public String toString() { } } + public static class AnnotationIndexConfiguration { + + private List populationFrequency; + + private IndexFieldConfiguration biotype; + + private IndexFieldConfiguration consequenceType; + + private IndexFieldConfiguration clinicalSignificance; + + private IndexFieldConfiguration clinicalSource; + + public List getPopulationFrequency() { + return populationFrequency; + } + + public AnnotationIndexConfiguration setPopulationFrequency(List populationFrequency) { + this.populationFrequency = populationFrequency; + return this; + } + + public IndexFieldConfiguration getBiotype() { + return biotype; + } + + public AnnotationIndexConfiguration setBiotype(IndexFieldConfiguration biotype) { + this.biotype = biotype; + return this; + } + + public IndexFieldConfiguration getConsequenceType() { + return consequenceType; + } + + public AnnotationIndexConfiguration setConsequenceType(IndexFieldConfiguration consequenceType) { + this.consequenceType = consequenceType; + return this; + } + + public IndexFieldConfiguration getClinicalSignificance() { + return clinicalSignificance; + } + + public AnnotationIndexConfiguration setClinicalSignificance(IndexFieldConfiguration clinicalSignificance) { + this.clinicalSignificance = clinicalSignificance; + return this; + } + + public IndexFieldConfiguration getClinicalSource() { + return clinicalSource; + } + + public AnnotationIndexConfiguration setClinicalSource(IndexFieldConfiguration clinicalSource) { + this.clinicalSource = clinicalSource; + return this; + } + } + + public AnnotationIndexConfiguration getAnnotationIndexConfiguration() { + return annotationIndexConfiguration; + } public List getPopulationRanges() { return populationRanges; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/project/DataStore.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/project/DataStore.java index f4bfeaba3c3..a5fb128a117 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/project/DataStore.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/project/DataStore.java @@ -25,6 +25,7 @@ public class DataStore { private String storageEngine; private String dbName; + //TODO: Rename to "options" private ObjectMap configuration; public DataStore() { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/VariantAnnotationConstants.java similarity index 99% rename from opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationConstants.java rename to opencga-core/src/main/java/org/opencb/opencga/core/models/variant/VariantAnnotationConstants.java index 61e9aeb7118..2da6ab49c54 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/VariantAnnotationConstants.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.storage.core.variant.annotation; +package org.opencb.opencga.core.models.variant; import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.DrugResponseClassification; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitBuffer.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitBuffer.java index 7cde140e85d..c6e8971043f 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitBuffer.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitBuffer.java @@ -264,6 +264,16 @@ public void clear() { @Override public String toString() { StringBuilder msg = new StringBuilder("BitBuffer{bitOffset:" + bitOffset + ", bitLength:" + bitLength + ", ["); + bitsToString(msg); + msg.append("]}"); + return msg.toString(); + } + + public String bitsToString() { + return bitsToString(new StringBuilder()).toString(); + } + + private StringBuilder bitsToString(StringBuilder msg) { int lastBits = bitLength % Byte.SIZE; for (int i = 0; i < bitLength - lastBits; i += Byte.SIZE) { msg.append(byteToString(getByte(i))).append(", "); @@ -271,8 +281,7 @@ public String toString() { if (lastBits != 0) { msg.append(binaryToString(getBytePartial(bitLength - lastBits, lastBits), lastBits)); } - msg.append("]}"); - return msg.toString(); + return msg; } @@ -291,4 +300,12 @@ private static String binaryToString(int number, int i) { } return StringUtils.leftPad(str, i, '0'); } + + public int toInt() { + int bitLength = getBitLength(); + if (bitLength > Integer.SIZE) { + throw new IllegalArgumentException("Unable to get int from BitBuffer with " + bitLength + " bits"); + } + return getIntPartial(0, bitLength); + } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitOutputStream.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitOutputStream.java index 81cf64cc848..ac7edc09b6d 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitOutputStream.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/io/bit/BitOutputStream.java @@ -5,7 +5,7 @@ /** * Serialize streams of bits in a byte array. * - * + *
  *   os.write(ABC)
  *   os.write(123)
  *   os.write(xyz)
@@ -13,22 +13,33 @@
  *
  *   os.toByteArray() => [yz123ABC,
  *                        0004567x]
- * 
+ * 
* * @see BitInputStream */ public class BitOutputStream { - private final ByteArrayOutputStream os; + private final ExposedByteArrayOutputStream os; private int buffer = 0; // only one byte buffer. Use int to avoid casts. private byte bufferCapacity = Byte.SIZE; + private class ExposedByteArrayOutputStream extends ByteArrayOutputStream { + + ExposedByteArrayOutputStream(int size) { + super(size); + } + + byte[] getBuffer() { + return buf; + } + } + public BitOutputStream() { this(100); } - public BitOutputStream(int size) { - os = new ByteArrayOutputStream(size); + public BitOutputStream(int bytesSize) { + os = new ExposedByteArrayOutputStream(bytesSize); } /** @@ -53,9 +64,18 @@ public void write(int value, int bitsLength) { } } -// public void write(BitBuffer bitBuffer) { -// //TODO -// } + public void write(BitBuffer bitBuffer) { + int bitLength = bitBuffer.getBitLength(); + int offset = 0; + for (int i = 0; i < bitLength / Integer.SIZE; i++) { + write(bitBuffer.getInt(offset), Integer.SIZE); + offset += Integer.SIZE; + } + int extraBitLength = bitLength % Integer.SIZE; + if (extraBitLength > 0) { + write(bitBuffer.getIntPartial(offset, extraBitLength), extraBitLength); + } + } public byte[] toByteArray() { if (bufferCapacity != Byte.SIZE) { @@ -83,4 +103,14 @@ public BitBuffer toBitBuffer() { byte[] bytes = os.toByteArray(); return new BitBuffer(bytes, 0, (bytes.length) * Byte.SIZE - extraBitLength); } + + public boolean isEmpty() { + return os.size() == 0 & bufferCapacity == Byte.SIZE; + } + + public int getBitLength() { + int osBits = this.os.size() * Byte.SIZE; + int bufferBits = Byte.SIZE - bufferCapacity; + return osBits + bufferBits; + } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java index 46ab1537e42..c8f694290bf 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java @@ -6,7 +6,7 @@ import org.opencb.biodata.models.variant.avro.EvidenceEntry; import org.opencb.biodata.models.variant.avro.VariantClassification; import org.opencb.biodata.tools.commons.Converter; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; +import org.opencb.opencga.core.models.variant.VariantAnnotationConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java index aed6aa52bcf..7e194d13d1d 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java @@ -8,7 +8,7 @@ import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.biodata.models.variant.metadata.VariantFileHeaderComplexLine; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; +import org.opencb.opencga.core.models.variant.VariantAnnotationConstants; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java index c24aca007de..3254931e789 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java @@ -33,7 +33,7 @@ import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; +import org.opencb.opencga.core.models.variant.VariantAnnotationConstants; import org.opencb.opencga.storage.core.variant.query.projection.VariantQueryProjectionParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/CompoundHeterozygousQueryExecutor.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/CompoundHeterozygousQueryExecutor.java index 76f10531332..cd2edfbda18 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/CompoundHeterozygousQueryExecutor.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/CompoundHeterozygousQueryExecutor.java @@ -3,7 +3,7 @@ import com.google.common.collect.Iterators; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.tools.pedigree.ModeOfInheritance; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; +import org.opencb.opencga.core.models.variant.VariantAnnotationConstants; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java index abd383c0376..d3016d51db4 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/IndexUtils.java @@ -37,6 +37,10 @@ public static String shortToString(short s) { return binaryToString(s, Short.SIZE); } + public static String intToString(int i) { + return binaryToString(i, Integer.SIZE); + } + public static String binaryToString(int number, int bits) { String str = Integer.toBinaryString(number); if (str.length() > bits) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java index 4dbf88fc9e9..9df034dca17 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexVariantAggregationExecutor.java @@ -16,12 +16,11 @@ import org.opencb.opencga.storage.core.utils.iterators.CloseableIterator; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; -import org.opencb.opencga.storage.core.variant.query.VariantQueryParser; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; +import org.opencb.opencga.storage.core.variant.query.VariantQueryParser; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.core.variant.query.executors.VariantAggregationExecutor; import org.opencb.opencga.storage.core.variant.query.executors.accumulators.*; -import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexDBAdaptor; @@ -237,28 +236,33 @@ private FacetFieldAccumulator createAccumulator(Query q s -> Collections.singletonList(s.getGenotype()), fieldKey); break; case "consequenceType": - case "ct": + case "ct": { + IndexField> field = schema.getCtIndex().getField(); thisAccumulator = new CategoricalAccumulator<>( s -> s.getAnnotationIndexEntry() == null ? Collections.emptyList() - : AnnotationIndexConverter.getSoNamesFromMask(s.getAnnotationIndexEntry().getCtIndex()), + : field.decode(s.getAnnotationIndexEntry().getCtIndex()), fieldKey); break; + } case "bt": - case "biotype": + case "biotype": { + IndexField> field = schema.getBiotypeIndex().getField(); thisAccumulator = new CategoricalAccumulator<>( s -> s.getAnnotationIndexEntry() == null ? Collections.emptyList() - : AnnotationIndexConverter.getBiotypesFromMask(s.getAnnotationIndexEntry().getBtIndex()), + : field.decode(s.getAnnotationIndexEntry().getBtIndex()), fieldKey); break; + } case "clinicalSignificance": thisAccumulator = new CategoricalAccumulator<>( s -> { - if (s.getAnnotationIndexEntry() == null) { + if (s.getAnnotationIndexEntry() == null || !s.getAnnotationIndexEntry().hasClinical()) { return Collections.emptyList(); } - return AnnotationIndexConverter.getClinicalsFromMask(s.getAnnotationIndexEntry().getClinicalIndex()); + return schema.getClinicalIndexSchema().getClinicalSignificanceField() + .readAndDecode(s.getAnnotationIndexEntry().getClinicalIndex()); }, "clinicalSignificance"); break; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java index c54bfc2b828..92b1f918e7e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java @@ -1,27 +1,18 @@ package org.opencb.opencga.storage.hadoop.variant.index.annotation; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.tuple.Pair; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.util.Bytes; -import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.*; -import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; -import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory; -import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.util.*; import static org.opencb.biodata.models.variant.StudyEntry.DEFAULT_COHORT; -import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.*; -import static org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory.generateVariantRowKey; +import static org.opencb.opencga.core.models.variant.VariantAnnotationConstants.*; /** * Created by jacobo on 04/01/19. @@ -45,54 +36,7 @@ public class AnnotationIndexConverter { public static final byte CLINICAL_MASK = (byte) (1 << 6); public static final byte INTERGENIC_MASK = (byte) (1 << 7); // INTERGENIC (and maybe regulatory) - - public static final short CT_MISSENSE_VARIANT_MASK = (short) (1 << 0); - public static final short CT_FRAMESHIFT_VARIANT_MASK = (short) (1 << 1); - public static final short CT_INFRAME_DELETION_MASK = (short) (1 << 2); - public static final short CT_INFRAME_INSERTION_MASK = (short) (1 << 3); - public static final short CT_START_LOST_MASK = (short) (1 << 4); - public static final short CT_STOP_GAINED_MASK = (short) (1 << 5); - public static final short CT_STOP_LOST_MASK = (short) (1 << 6); - public static final short CT_SPLICE_ACCEPTOR_VARIANT_MASK = (short) (1 << 7); - public static final short CT_SPLICE_DONOR_VARIANT_MASK = (short) (1 << 8); - public static final short CT_TRANSCRIPT_ABLATION_MASK = (short) (1 << 9); - public static final short CT_TRANSCRIPT_AMPLIFICATION_MASK = (short) (1 << 10); - public static final short CT_INITIATOR_CODON_VARIANT_MASK = (short) (1 << 11); - public static final short CT_SPLICE_REGION_VARIANT_MASK = (short) (1 << 12); - public static final short CT_INCOMPLETE_TERMINAL_CODON_VARIANT_MASK = (short) (1 << 13); - public static final short CT_UTR_MASK = (short) (1 << 14); - public static final short CT_MIRNA_TFBS_MASK = (short) (1 << 15); - - - public static final byte BT_NONSENSE_MEDIATED_DECAY_MASK = (byte) (1 << 0); - public static final byte BT_LNCRNA_MASK = (byte) (1 << 1); - public static final byte BT_MIRNA_MASK = (byte) (1 << 2); - public static final byte BT_RETAINED_INTRON_MASK = (byte) (1 << 3); - public static final byte BT_SNRNA_MASK = (byte) (1 << 4); - public static final byte BT_SNORNA_MASK = (byte) (1 << 5); - public static final byte BT_OTHER_NON_PSEUDOGENE = (byte) (1 << 6); // -> Other, non_pseudogene - public static final byte BT_PROTEIN_CODING_MASK = (byte) (1 << 7); - - public static final byte CLINICAL_SOMATIC_MASK = (byte) (1 << 0); - public static final byte CLINICAL_BENIGN_LIKELY_BENIGN_MASK = (byte) (1 << 1); - public static final byte CLINICAL_UNCERTAIN_SIGNIFICANCE_MASK = (byte) (1 << 2); - public static final byte CLINICAL_LIKELY_PATHOGENIC_MASK = (byte) (1 << 3); - public static final byte CLINICAL_PATHOGENIC_MASK = (byte) (1 << 4); - public static final byte CLINICAL_TARGET_DRUG_MASK = (byte) (1 << 5); // TODO - public static final byte CLINICAL_PGX = (byte) (1 << 6); // TODO - public static final byte CLINICAL_8_UNUSED_MASK = (byte) (1 << 7); - - public static final byte[] COLUMN_FMAILY = Bytes.toBytes("0"); - public static final byte[] VALUE_COLUMN = Bytes.toBytes("v"); - public static final byte[] CT_VALUE_COLUMN = Bytes.toBytes("ct"); - public static final byte[] BT_VALUE_COLUMN = Bytes.toBytes("bt"); - public static final byte[] CT_BT_VALUE_COLUMN = Bytes.toBytes("cb"); - public static final byte[] CLINICAL_VALUE_COLUMN = Bytes.toBytes("cl"); - public static final byte[] POP_FREQ_VALUE_COLUMN = Bytes.toBytes("pf"); - public static final int VALUE_LENGTH = 1; public static final String TRANSCRIPT_FLAG_BASIC = "basic"; - public static final int POP_FREQ_SIZE = 2; - public static final String LNCRNA = "lncRNA"; static { BIOTYPE_SET = Collections.singleton(PROTEIN_CODING); @@ -116,90 +60,46 @@ public class AnnotationIndexConverter { } } - private PopulationFrequencyIndexSchema popFreqIndex; - - @Deprecated - private final Map populations; + private final SampleIndexSchema schema; public AnnotationIndexConverter(SampleIndexSchema schema) { - popFreqIndex = schema.getPopFreqIndex(); - this.populations = new HashMap<>(schema.getConfiguration().getPopulationRanges().size()); - int i = 0; - for (SampleIndexConfiguration.PopulationFrequencyRange population : schema.getConfiguration().getPopulationRanges()) { - if (this.populations.put(population.getKey(), i++) != null) { - throw new IllegalArgumentException("Duplicated population '" + population.getKey() + "' in " + populations); - } - } - } - - public static Pair getAnnotationIndexEntryPair(Result result) { - Variant variant = VariantPhoenixKeyFactory.extractVariantFromVariantRowKey(result.getRow()); - byte summary = 0; - short ct = 0; - byte bt = 0; - byte[] pf = null; - byte[] ctBtIndex = null; - byte clinical = 0; - - for (Cell cell : result.rawCells()) { - if (CellUtil.matchingQualifier(cell, VALUE_COLUMN)) { - summary = cell.getValueArray()[cell.getValueOffset()]; - } else if (CellUtil.matchingQualifier(cell, CT_VALUE_COLUMN)) { - ct = Bytes.toShort(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); - } else if (CellUtil.matchingQualifier(cell, BT_VALUE_COLUMN)) { - bt = cell.getValueArray()[cell.getValueOffset()]; - } else if (CellUtil.matchingQualifier(cell, CLINICAL_VALUE_COLUMN)) { - clinical = cell.getValueArray()[cell.getValueOffset()]; - } else if (CellUtil.matchingQualifier(cell, CT_BT_VALUE_COLUMN)) { - ctBtIndex = CellUtil.cloneValue(cell); - } else if (CellUtil.matchingQualifier(cell, POP_FREQ_VALUE_COLUMN)) { - pf = CellUtil.cloneValue(cell); - } - } - - return Pair.of(variant, - new AnnotationIndexEntry(summary, - IndexUtils.testIndex(summary, INTERGENIC_MASK, INTERGENIC_MASK), ct, bt, ctBtIndex, pf, - IndexUtils.testIndex(summary, CLINICAL_MASK, CLINICAL_MASK), clinical)); + this.schema = schema; } public AnnotationIndexEntry convert(VariantAnnotation variantAnnotation) { if (variantAnnotation == null) { - return AnnotationIndexEntry.empty(popFreqIndex.getFields().size()); + return AnnotationIndexEntry.empty(); } byte b = 0; - short ctIndex = 0; - byte btIndex = 0; - byte[] popFreqIndex = new byte[this.popFreqIndex.getFields().size()]; - boolean[][] ctBtcombinations = new boolean[16][8]; + BitBuffer ctIndex = new BitBuffer(schema.getCtIndex().getBitsLength()); + BitBuffer btIndex = new BitBuffer(schema.getBiotypeIndex().getBitsLength()); + BitBuffer clinicalIndex = new BitBuffer(schema.getClinicalIndexSchema().getBitsLength()); + BitBuffer popFreq = new BitBuffer(schema.getPopFreqIndex().getBitsLength()); boolean intergenic = false; - - byte clinicalIndex = 0; boolean clinical = false; + List> ctBtPair = new LinkedList<>(); + AnnotationIndexEntry.CtBtCombination ctBtCombination = null; if (variantAnnotation.getConsequenceTypes() != null) { + Set biotypes = new HashSet<>(); + Set cts = new HashSet<>(); for (ConsequenceType ct : variantAnnotation.getConsequenceTypes()) { - if (BIOTYPE_SET.contains(ct.getBiotype())) { + String biotype = ct.getBiotype(); + if (BIOTYPE_SET.contains(biotype)) { b |= PROTEIN_CODING_MASK; } - byte maskFromBiotype = getMaskFromBiotype(ct.getBiotype()); - btIndex |= maskFromBiotype; + biotypes.add(biotype); - boolean proteinCoding = PROTEIN_CODING.equals(ct.getBiotype()); + boolean proteinCoding = PROTEIN_CODING.equals(biotype); for (SequenceOntologyTerm sequenceOntologyTerm : ct.getSequenceOntologyTerms()) { String soName = sequenceOntologyTerm.getName(); if (!intergenic && INTERGENIC_VARIANT.equals(soName)) { intergenic = true; } - short maskFromSoName = getMaskFromSoName(soName); - if (maskFromSoName != 0) { - if (maskFromBiotype != 0) { - ctBtcombinations[maskPosition(maskFromSoName)][maskPosition(maskFromBiotype)] = true; - } - } - ctIndex |= maskFromSoName; + cts.add(soName); + ctBtPair.add(Pair.of(soName, biotype)); if (VariantQueryUtils.LOF_SET.contains(soName)) { b |= LOF_MASK; @@ -216,12 +116,14 @@ public AnnotationIndexEntry convert(VariantAnnotation variantAnnotation) { } } } + schema.getBiotypeIndex().getField().write(new ArrayList<>(biotypes), btIndex); + schema.getCtIndex().getField().write(new ArrayList<>(cts), ctIndex); + ctBtCombination = schema.getCtBtIndex().getField().getCtBtCombination(ctBtPair, ctIndex, btIndex); } if (intergenic) { b |= INTERGENIC_MASK; } - AnnotationIndexEntry.CtBtCombination ctBtCombination = getCtBtCombination(ctIndex, btIndex, ctBtcombinations); // By default, population frequency is 0. double minFreq = 0; @@ -229,7 +131,7 @@ public AnnotationIndexEntry convert(VariantAnnotation variantAnnotation) { double gnomadFreq = 0; double kgenomesFreq = 0; for (PopulationFrequency populationFrequency : variantAnnotation.getPopulationFrequencies()) { - addPopFreqIndex(popFreqIndex, populationFrequency); + addPopFreqIndex(popFreq, populationFrequency); if (populationFrequency.getPopulation().equals(DEFAULT_COHORT)) { if (populationFrequency.getStudy().equals(GNOMAD_GENOMES)) { gnomadFreq = populationFrequency.getAltAlleleFreq(); @@ -247,387 +149,32 @@ public AnnotationIndexEntry convert(VariantAnnotation variantAnnotation) { if (CollectionUtils.isNotEmpty(variantAnnotation.getTraitAssociation())) { b |= CLINICAL_MASK; clinical = true; + Set clinicalSignificances = new HashSet<>(); + Set clinicalSource = new HashSet<>(); for (EvidenceEntry evidenceEntry : variantAnnotation.getTraitAssociation()) { - if (evidenceEntry.getSomaticInformation() != null) { - clinicalIndex |= CLINICAL_SOMATIC_MASK; - } - if (evidenceEntry.getVariantClassification() != null - && evidenceEntry.getVariantClassification().getClinicalSignificance() != null) { - switch (evidenceEntry.getVariantClassification().getClinicalSignificance()) { - case likely_benign: - clinicalIndex |= CLINICAL_BENIGN_LIKELY_BENIGN_MASK; - break; - case uncertain_significance: - case VUS: - clinicalIndex |= CLINICAL_UNCERTAIN_SIGNIFICANCE_MASK; - break; - case likely_pathogenic: - clinicalIndex |= CLINICAL_LIKELY_PATHOGENIC_MASK; - break; - case pathogenic: - clinicalIndex |= CLINICAL_PATHOGENIC_MASK; - break; - case benign: - default: - // Nothing - break; - } + if (evidenceEntry.getSource() != null && StringUtils.isNotEmpty(evidenceEntry.getSource().getName())) { + clinicalSource.add(evidenceEntry.getSource().getName().toLowerCase()); } - } - } - return new AnnotationIndexEntry(b, intergenic, ctIndex, btIndex, ctBtCombination, popFreqIndex, clinical, clinicalIndex); - } - - private int maskPosition(byte b) { - return Integer.numberOfTrailingZeros(b); - } - - private int maskPosition(short s) { - return Integer.numberOfTrailingZeros(s); - } - - private AnnotationIndexEntry.CtBtCombination getCtBtCombination(short ctIndex, byte origBtIndex, boolean[][] ctBt) { - AnnotationIndexEntry.CtBtCombination ctBtCombination; - int numCt = Integer.bitCount(Short.toUnsignedInt(ctIndex)); - int numBt = Integer.bitCount(Byte.toUnsignedInt(origBtIndex)); - if (numBt > 0 && numCt > 0) { - byte[] ctBtIndex = new byte[numCt]; - - for (int ctIndexPos = 0; ctIndexPos < numCt; ctIndexPos++) { - // Get the first CT value from the right. - short ct = (short) Integer.lowestOneBit(ctIndex); - // Remove the CT value from the index, so the next iteration gets the next value - ctIndex &= ~ct; - byte btIndex = origBtIndex; - byte combinationValue = 0; - for (int btIndexPos = 0; btIndexPos < numBt; btIndexPos++) { - // As before, take the first BT value from the right. - byte bt = (byte) Integer.lowestOneBit(btIndex); - btIndex &= ~bt; - - // If the CT+BT combination is true, write a 1 - if (ctBt[maskPosition(ct)][maskPosition(bt)]) { - combinationValue |= 1 << btIndexPos; + if (evidenceEntry.getVariantClassification() != null) { + ClinicalSignificance clinicalSignificance = evidenceEntry.getVariantClassification().getClinicalSignificance(); + if (clinicalSignificance != null) { + if (clinicalSignificance.equals(ClinicalSignificance.VUS)) { + clinicalSignificance = ClinicalSignificance.uncertain_significance; + } + clinicalSignificances.add(clinicalSignificance.toString()); } } - ctBtIndex[ctIndexPos] = combinationValue; } - ctBtCombination = new AnnotationIndexEntry.CtBtCombination(ctBtIndex, numCt, numBt); - } else { - ctBtCombination = null; - } - return ctBtCombination; - } - - protected void addPopFreqIndex(byte[] popFreqIndex, PopulationFrequency populationFrequency) { - IndexField field = this.popFreqIndex.getField(populationFrequency.getStudy(), populationFrequency.getPopulation()); - Integer idx = populations.get(populationFrequency.getStudy() + ":" + populationFrequency.getPopulation()); - if (idx != null) { - byte popFreqInterval = RangeIndexField.getRangeCode(populationFrequency.getAltAlleleFreq(), - field.getConfiguration().getThresholds()); -// int byteIdx = (idx * POP_FREQ_SIZE) / Byte.SIZE; -// int bitIdx = (idx * POP_FREQ_SIZE) % Byte.SIZE; -// popFreqIndex[byteIdx] |= popFreqInterval << bitIdx; - popFreqIndex[idx] = popFreqInterval; - } - } - - public List convertToPut(List variantAnnotations) { - List puts = new ArrayList<>(variantAnnotations.size()); - for (VariantAnnotation variantAnnotation : variantAnnotations) { - puts.add(convertToPut(variantAnnotation)); + schema.getClinicalIndexSchema().getClinicalSignificanceField().write(new ArrayList<>(clinicalSignificances), clinicalIndex); + schema.getClinicalIndexSchema().getSourceField().write(new ArrayList<>(clinicalSource), clinicalIndex); } - return puts; + return new AnnotationIndexEntry(b, intergenic, ctIndex.toInt(), btIndex.toInt(), ctBtCombination, popFreq, clinical, clinicalIndex); } - - public Put convertToPut(VariantAnnotation variantAnnotation) { - byte[] bytesRowKey = generateVariantRowKey(variantAnnotation); - Put put = new Put(bytesRowKey); - AnnotationIndexEntry value = convert(variantAnnotation); - put.addColumn(COLUMN_FMAILY, VALUE_COLUMN, new byte[]{value.getSummaryIndex()}); - put.addColumn(COLUMN_FMAILY, CT_VALUE_COLUMN, Bytes.toBytes(value.getCtIndex())); - put.addColumn(COLUMN_FMAILY, BT_VALUE_COLUMN, new byte[]{value.getBtIndex()}); - put.addColumn(COLUMN_FMAILY, POP_FREQ_VALUE_COLUMN, value.getPopFreqIndex()); - return put; - } - - public static boolean isImpreciseCtMask(short ctMask) { - return IndexUtils.testIndexAny(ctMask, ((short) (CT_MIRNA_TFBS_MASK | CT_UTR_MASK))); - } - - public static short getMaskFromSoName(String soName) { - if (soName == null) { - return 0; - } - - switch (soName) { - // Coding - case MISSENSE_VARIANT: - return CT_MISSENSE_VARIANT_MASK; - case FRAMESHIFT_VARIANT: - return CT_FRAMESHIFT_VARIANT_MASK; - case INFRAME_DELETION: - return CT_INFRAME_DELETION_MASK; - case INFRAME_INSERTION: - return CT_INFRAME_INSERTION_MASK; - case START_LOST: - return CT_START_LOST_MASK; - case STOP_GAINED: - return CT_STOP_GAINED_MASK; - case STOP_LOST: - return CT_STOP_LOST_MASK; - case INITIATOR_CODON_VARIANT: - return CT_INITIATOR_CODON_VARIANT_MASK; - case SPLICE_REGION_VARIANT: - return CT_SPLICE_REGION_VARIANT_MASK; - case INCOMPLETE_TERMINAL_CODON_VARIANT: - return CT_INCOMPLETE_TERMINAL_CODON_VARIANT_MASK; - - // Splice - case SPLICE_ACCEPTOR_VARIANT: - return CT_SPLICE_ACCEPTOR_VARIANT_MASK; - case SPLICE_DONOR_VARIANT: - return CT_SPLICE_DONOR_VARIANT_MASK; - - case TRANSCRIPT_ABLATION: - return CT_TRANSCRIPT_ABLATION_MASK; - case TRANSCRIPT_AMPLIFICATION: - return CT_TRANSCRIPT_AMPLIFICATION_MASK; - - // Regulatory -// case "regulatory_region_ablation": -// case "regulatory_region_amplification": -// case REGULATORY_REGION_VARIANT: -// return CT_REGULATORY_MASK; - - case TF_BINDING_SITE_VARIANT: -// case "TFBS_ablation": -// case "TFBS_amplification": - case MATURE_MIRNA_VARIANT: - return CT_MIRNA_TFBS_MASK; - - // NonCoding - case THREE_PRIME_UTR_VARIANT: - case FIVE_PRIME_UTR_VARIANT: - return CT_UTR_MASK; - -// // Intergenic -// case UPSTREAM_GENE_VARIANT: -// case TWOKB_UPSTREAM_VARIANT: -// case "5KB_upstream_variant": -// -// case DOWNSTREAM_GENE_VARIANT: -// case TWOKB_DOWNSTREAM_VARIANT: -// case "5KB_downstream_variant": -// return CT_UPSTREAM_DOWNSTREAM_MASK; - - //case INTERGENIC_VARIANT: - //case CODING_SEQUENCE_VARIANT: - //case FEATURE_TRUNCATION: - //case INFRAME_VARIANT: - //case MISSENSE_VARIANT: - //case NMD_TRANSCRIPT_VARIANT: - //case STOP_RETAINED_VARIANT: - //case TERMINATOR_CODON_VARIANT: - //case "feature_elongation": - //case "protein_altering_variant": - //case SYNONYMOUS_VARIANT: - //case INTRON_VARIANT: - //case NON_CODING_TRANSCRIPT_EXON_VARIANT: - //case NON_CODING_TRANSCRIPT_VARIANT: - default: - return 0; - } - } - - public static List getSoNamesFromMask(short mask) { - if (mask == 0) { - return Collections.emptyList(); - } - - List names = new ArrayList<>(5); - for (int idx = Short.SIZE; idx > 0; idx--) { - short subMask = (short) (1 << idx); - if (IndexUtils.testIndexAny(subMask, mask)) { - String soName = getSoNameFromMask(subMask); - if (soName != null) { - names.add(soName); - } - } - } - return names; - } - - public static String getSoNameFromMask(short mask) { - if (mask == 0) { - return null; - } - - switch (mask) { - case CT_MISSENSE_VARIANT_MASK: - return MISSENSE_VARIANT; - case CT_FRAMESHIFT_VARIANT_MASK: - return FRAMESHIFT_VARIANT; - case CT_INFRAME_DELETION_MASK: - return INFRAME_DELETION; - case CT_INFRAME_INSERTION_MASK: - return INFRAME_INSERTION; - case CT_START_LOST_MASK: - return START_LOST; - case CT_STOP_GAINED_MASK: - return STOP_GAINED; - case CT_STOP_LOST_MASK: - return STOP_LOST; - case CT_SPLICE_ACCEPTOR_VARIANT_MASK: - return SPLICE_ACCEPTOR_VARIANT; - case CT_SPLICE_DONOR_VARIANT_MASK: - return SPLICE_DONOR_VARIANT; - case CT_TRANSCRIPT_ABLATION_MASK: - return TRANSCRIPT_ABLATION; - case CT_TRANSCRIPT_AMPLIFICATION_MASK: - return TRANSCRIPT_AMPLIFICATION; - case CT_INITIATOR_CODON_VARIANT_MASK: - return INITIATOR_CODON_VARIANT; - case CT_SPLICE_REGION_VARIANT_MASK: - return SPLICE_REGION_VARIANT; - case CT_INCOMPLETE_TERMINAL_CODON_VARIANT_MASK: - return INCOMPLETE_TERMINAL_CODON_VARIANT; - case CT_UTR_MASK: // imprecise - return "utr"; - case CT_MIRNA_TFBS_MASK: // imprecise - return "mirna_tfbs"; - default: - return "other"; - } - } - - public static List getBiotypesFromMask(byte mask) { - if (mask == 0) { - return Collections.emptyList(); - } - - List names = new ArrayList<>(5); - for (int idx = Byte.SIZE; idx > 0; idx--) { - byte subMask = (byte) (1 << idx); - if (IndexUtils.testIndexAny(subMask, mask)) { - String soName = getBiotypeFromMask(subMask); - if (soName != null) { - names.add(soName); - } - } - } - return names; - } - - public static String getBiotypeFromMask(byte btMask) { - - switch (btMask) { - case 0: - return null; - case BT_NONSENSE_MEDIATED_DECAY_MASK: - return NONSENSE_MEDIATED_DECAY; - case BT_MIRNA_MASK: - return MIRNA; - case BT_RETAINED_INTRON_MASK: - return RETAINED_INTRON; - case BT_SNRNA_MASK: - return SNRNA; - case BT_SNORNA_MASK: - return SNORNA; - case BT_PROTEIN_CODING_MASK: - return PROTEIN_CODING; - case BT_LNCRNA_MASK: // imprecise - return LNCRNA; - case BT_OTHER_NON_PSEUDOGENE: // imprecise - default: - return "other"; - } - - } - - public static boolean isImpreciseBtMask(byte btMask) { - return IndexUtils.testIndexAny(btMask, ((byte) (BT_LNCRNA_MASK | BT_OTHER_NON_PSEUDOGENE))); - } - - public static byte getMaskFromBiotype(String biotype) { - if (biotype == null) { - return 0; - } - - switch (biotype) { - case NONSENSE_MEDIATED_DECAY: - return BT_NONSENSE_MEDIATED_DECAY_MASK; - - // See http://www.ensembl.info/2019/05/20/whats-coming-in-ensembl-97-ensembl-genomes-44/ - case LNCRNA: - case NON_CODING: - case LINCRNA: - case "macro_lncRNA": - case ANTISENSE: - case SENSE_INTRONIC: - case SENSE_OVERLAPPING: - case THREEPRIME_OVERLAPPING_NCRNA: - case "bidirectional_promoter_lncRNA": - return BT_LNCRNA_MASK; - - - case MIRNA: - return BT_MIRNA_MASK; - case RETAINED_INTRON: - return BT_RETAINED_INTRON_MASK; - case SNRNA: - return BT_SNRNA_MASK; - case SNORNA: - return BT_SNORNA_MASK; - case NON_STOP_DECAY: - return BT_OTHER_NON_PSEUDOGENE; - case PROTEIN_CODING: - return BT_PROTEIN_CODING_MASK; - default: - if (biotype.contains("pseudogene")) { - return 0; - } else { - return BT_OTHER_NON_PSEUDOGENE; - } - } - } - - public static List getClinicalsFromMask(byte mask) { - if (mask == 0) { - return Collections.emptyList(); - } - - List names = new ArrayList<>(5); - for (int idx = Byte.SIZE; idx > 0; idx--) { - byte subMask = (byte) (1 << idx); - if (IndexUtils.testIndexAny(subMask, mask)) { - String cs = getClinicalFromMask(subMask); - if (cs != null) { - names.add(cs); - } - } - } - return names; - } - - public static String getClinicalFromMask(byte mask) { - switch (mask) { - case 0: - return null; - case CLINICAL_BENIGN_LIKELY_BENIGN_MASK: - return ClinicalSignificance.benign + "_" + ClinicalSignificance.likely_benign; - case CLINICAL_UNCERTAIN_SIGNIFICANCE_MASK: - return ClinicalSignificance.uncertain_significance.name(); - case CLINICAL_LIKELY_PATHOGENIC_MASK: - return ClinicalSignificance.likely_pathogenic.name(); - case CLINICAL_PATHOGENIC_MASK: - return ClinicalSignificance.pathogenic.name(); - case CLINICAL_SOMATIC_MASK: - case CLINICAL_TARGET_DRUG_MASK: - case CLINICAL_PGX: - case CLINICAL_8_UNUSED_MASK: - default: - return null; + protected void addPopFreqIndex(BitBuffer bitBuffer, PopulationFrequency populationFrequency) { + IndexField field = schema.getPopFreqIndex() + .getField(populationFrequency.getStudy(), populationFrequency.getPopulation()); + if (field != null) { + field.write(populationFrequency.getAltAlleleFreq().doubleValue(), bitBuffer); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java index 9e049ab1f47..7d0977acc78 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java @@ -1,5 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.annotation; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; public class AnnotationIndexEntry { @@ -8,47 +9,41 @@ public class AnnotationIndexEntry { private byte summaryIndex; private boolean intergenic; private boolean hasCtIndex; - private short ctIndex; + // should be a long? a BitBuffer? + private int ctIndex; private boolean hasBtIndex; - private byte btIndex; + // should be a long? a BitBuffer? + private int btIndex; private CtBtCombination ctBtCombination; - private boolean clinical; - private byte[] popFreqIndex; - private byte clinicalIndex; + private BitBuffer popFreqIndexBB; + private boolean hasClinical; + private BitBuffer clinicalIndex; public AnnotationIndexEntry() { } public AnnotationIndexEntry( - byte summaryIndex, boolean intergenic, short ctIndex, byte btIndex, byte[] ctBtCombination, byte[] popFreqIndex, - boolean clinical, byte clinicalIndex) { - this(summaryIndex, intergenic, ctIndex, btIndex, new CtBtCombination(ctBtCombination, - Integer.bitCount(Short.toUnsignedInt(ctIndex)), - Integer.bitCount(Byte.toUnsignedInt(btIndex))), popFreqIndex, - clinical, clinicalIndex); - } - - public AnnotationIndexEntry( - byte summaryIndex, boolean intergenic, short ctIndex, byte btIndex, CtBtCombination ctBtCombination, byte[] popFreqIndex, - boolean clinical, byte clinicalIndex) { + byte summaryIndex, boolean intergenic, int ctIndex, int btIndex, CtBtCombination ctBtCombination, BitBuffer popFreqIndex, + boolean hasClinical, BitBuffer clinicalIndex) { this.summaryIndex = summaryIndex; this.intergenic = intergenic; this.ctIndex = ctIndex; this.btIndex = btIndex; this.ctBtCombination = ctBtCombination == null ? CtBtCombination.empty() : ctBtCombination; - this.clinical = clinical; + this.hasClinical = hasClinical; this.clinicalIndex = clinicalIndex; - this.popFreqIndex = popFreqIndex; + this.popFreqIndexBB = popFreqIndex; } + /** * Matrix that contains the ConsequenceType and Biotype transcript combinations in one variant. * * Each non-intergenic variant has a set of pairs (CT, BT), which defines a list of CT and BT values. * This can be represented as a matrix where the rows are CT values in the variant, the columns are BT values, * and the intersection is a boolean representing if that specific combination occurs in the variant. - * + *
      *       +---------+---------+----+
      *       | bt1     | bt2     | ...|
      * +-----+---------+---------+----+
@@ -56,7 +51,8 @@ public AnnotationIndexEntry(
      * | ct2 | ct2+bt1 | ct2+bt2 |    |
      * | ... |         |         | ...|
      * +-----+---------+---------+----+
-
+     * 
+ * * In this class, the matrix is stored as an array of rows: ctBtMatrix = {ct1_row, ct2_row, ...} * As the max number of BTs is 8, we can use an array of bytes. * This matrix can be stored sequentially using {@link org.opencb.opencga.storage.core.io.bit.BitOutputStream}. @@ -67,22 +63,22 @@ public AnnotationIndexEntry( * */ public static class CtBtCombination { - public static final CtBtCombination EMPTY = new CtBtCombination(new byte[0], 0, 0); - private byte[] ctBtMatrix; + public static final CtBtCombination EMPTY = new CtBtCombination(new int[0], 0, 0); + private int[] ctBtMatrix; private int numCt; private int numBt; - public CtBtCombination(byte[] ctBtMatrix, int numCt, int numBt) { + public CtBtCombination(int[] ctBtMatrix, int numCt, int numBt) { this.ctBtMatrix = ctBtMatrix; this.numCt = numCt; this.numBt = numBt; } - public byte[] getCtBtMatrix() { + public int[] getCtBtMatrix() { return ctBtMatrix; } - public CtBtCombination setCtBtMatrix(byte[] ctBtMatrix) { + public CtBtCombination setCtBtMatrix(int[] ctBtMatrix) { this.ctBtMatrix = ctBtMatrix; return this; } @@ -110,8 +106,8 @@ public static CtBtCombination empty() { } } - public static AnnotationIndexEntry empty(int numPopFreq) { - return new AnnotationIndexEntry().setPopFreqIndex(new byte[numPopFreq]).setCtBtCombination(new CtBtCombination(new byte[0], 0, 0)); + public static AnnotationIndexEntry empty() { + return new AnnotationIndexEntry().setCtBtCombination(new CtBtCombination(new int[0], 0, 0)); } public boolean hasSummaryIndex() { @@ -151,11 +147,11 @@ public AnnotationIndexEntry setHasCtIndex(boolean hasCtIndex) { return this; } - public short getCtIndex() { + public int getCtIndex() { return ctIndex; } - public AnnotationIndexEntry setCtIndex(short ctIndex) { + public AnnotationIndexEntry setCtIndex(int ctIndex) { hasCtIndex = true; this.ctIndex = ctIndex; return this; @@ -170,11 +166,11 @@ public AnnotationIndexEntry setHasBtIndex(boolean hasBtIndex) { return this; } - public byte getBtIndex() { + public int getBtIndex() { return btIndex; } - public AnnotationIndexEntry setBtIndex(byte btIndex) { + public AnnotationIndexEntry setBtIndex(int btIndex) { setHasBtIndex(true); this.btIndex = btIndex; return this; @@ -189,47 +185,42 @@ public AnnotationIndexEntry setCtBtCombination(CtBtCombination ctBtCombination) return this; } - public byte[] getPopFreqIndex() { - return popFreqIndex; + public BitBuffer getPopFreqIndex() { + return popFreqIndexBB; } - public AnnotationIndexEntry setPopFreqIndex(byte[] popFreqIndex) { - this.popFreqIndex = popFreqIndex; + public AnnotationIndexEntry setPopFreqIndex(BitBuffer popFreqIndexBB) { + this.popFreqIndexBB = popFreqIndexBB; return this; } - public boolean isClinical() { - return clinical; + public boolean hasClinical() { + return hasClinical; } - public AnnotationIndexEntry setClinical(boolean clinical) { - this.clinical = clinical; + public AnnotationIndexEntry setHasClinical(boolean hasClinical) { + this.hasClinical = hasClinical; return this; } - public byte getClinicalIndex() { + public BitBuffer getClinicalIndex() { return clinicalIndex; } - public AnnotationIndexEntry setClinicalIndex(byte clinicalIndex) { + public AnnotationIndexEntry setClinicalIndex(BitBuffer clinicalIndex) { this.clinicalIndex = clinicalIndex; return this; } @Override public String toString() { - StringBuilder pf = new StringBuilder("["); - for (byte freqIndex : popFreqIndex) { - pf.append(IndexUtils.byteToString(freqIndex)).append(", "); - } - pf.append("]"); return "AnnotationIndexEntry{" + "summaryIndex=" + IndexUtils.byteToString(summaryIndex) + ", intergenic=" + intergenic + (intergenic ? "" - : (", ctIndex=" + IndexUtils.shortToString(ctIndex) + ", btIndex=" + IndexUtils.byteToString(btIndex))) - + ", popFreqIndex=" + pf + : (", ctIndex=" + IndexUtils.intToString(ctIndex) + ", btIndex=" + IndexUtils.intToString(btIndex))) + + ", popFreqIndex=" + popFreqIndexBB + '}'; } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexPutBuilder.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexPutBuilder.java index 991d33e8590..da731a98e9d 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexPutBuilder.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexPutBuilder.java @@ -1,9 +1,8 @@ package org.opencb.opencga.storage.hadoop.variant.index.annotation; import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.util.Bytes; -import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.core.io.bit.BitOutputStream; +import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.io.ByteArrayOutputStream; @@ -11,11 +10,12 @@ public class AnnotationIndexPutBuilder { private final ByteArrayOutputStream annotation; - private final ByteArrayOutputStream biotype; - private final ByteArrayOutputStream ct; + private final BitOutputStream biotype; + private final BitOutputStream ct; private final BitOutputStream ctBt; private final BitOutputStream popFreq; - private final ByteArrayOutputStream clinical; + private final BitOutputStream clinical; + private final SampleIndexSchema indexSchema = SampleIndexSchema.defaultSampleIndexSchema(); private int numVariants; public AnnotationIndexPutBuilder() { @@ -24,11 +24,11 @@ public AnnotationIndexPutBuilder() { public AnnotationIndexPutBuilder(int size) { this.annotation = new ByteArrayOutputStream(size); - this.biotype = new ByteArrayOutputStream(size / 4); - this.ct = new ByteArrayOutputStream(size / 2); + this.biotype = new BitOutputStream(size / 4); + this.ct = new BitOutputStream(size / 2); this.ctBt = new BitOutputStream(size / 4); this.popFreq = new BitOutputStream(size / 2); - this.clinical = new ByteArrayOutputStream(size / 5); + this.clinical = new BitOutputStream(size / 5); numVariants = 0; } @@ -37,18 +37,17 @@ public AnnotationIndexPutBuilder add(AnnotationIndexEntry indexEntry) { annotation.write(indexEntry.getSummaryIndex()); if (!indexEntry.isIntergenic()) { - ct.write(Bytes.toBytes(indexEntry.getCtIndex()), 0, Short.BYTES); - biotype.write(indexEntry.getBtIndex()); - } - for (byte popFreqIndex : indexEntry.getPopFreqIndex()) { - popFreq.write(popFreqIndex, AnnotationIndexConverter.POP_FREQ_SIZE); + ct.write(indexEntry.getCtIndex(), indexSchema.getCtIndex().getBitsLength()); + biotype.write(indexEntry.getBtIndex(), indexSchema.getBiotypeIndex().getBitsLength()); } - AnnotationIndexEntry.CtBtCombination ctBtCombination = indexEntry.getCtBtCombination(); - byte[] ctBtMatrix = ctBtCombination.getCtBtMatrix(); - for (int i = 0; i < ctBtCombination.getNumCt(); i++) { - ctBt.write(ctBtMatrix[i], ctBtCombination.getNumBt()); - } - if (indexEntry.isClinical()) { + popFreq.write(indexEntry.getPopFreqIndex()); + + ctBt.write(indexSchema.getCtBtIndex().getField().encode(indexEntry.getCtBtCombination())); +// byte[] ctBtMatrix = ctBtCombination.getCtBtMatrix(); +// for (int i = 0; i < ctBtCombination.getNumCt(); i++) { +// ctBt.write(ctBtMatrix[i], ctBtCombination.getNumBt()); +// } + if (indexEntry.hasClinical()) { clinical.write(indexEntry.getClinicalIndex()); } return this; @@ -65,7 +64,7 @@ public Put buildAndReset(Put put, String gt, byte[] family) { put.addColumn(family, SampleIndexSchema.toAnnotationIndexCountColumn(gt), IndexUtils.countPerBitToBytes(IndexUtils.countPerBit(annotationIndex))); - if (ct.size() > 0) { + if (!ct.isEmpty()) { put.addColumn(family, SampleIndexSchema.toAnnotationConsequenceTypeIndexColumn(gt), ct.toByteArray()); put.addColumn(family, SampleIndexSchema.toAnnotationBiotypeIndexColumn(gt), biotype.toByteArray()); } @@ -73,7 +72,7 @@ public Put buildAndReset(Put put, String gt, byte[] family) { put.addColumn(family, SampleIndexSchema.toAnnotationPopFreqIndexColumn(gt), popFreq.toByteArray()); - if (clinical.size() > 0) { + if (clinical.getBitLength() > 0) { put.addColumn(family, SampleIndexSchema.toAnnotationClinicalIndexColumn(gt), clinical.toByteArray()); } reset(); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationSummaryIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationSummaryIndexSchema.java new file mode 100644 index 00000000000..c5d31e54059 --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationSummaryIndexSchema.java @@ -0,0 +1,9 @@ +package org.opencb.opencga.storage.hadoop.variant.index.annotation; + +import org.opencb.opencga.storage.hadoop.variant.index.core.FixedSizeIndexSchema; + +public class AnnotationSummaryIndexSchema extends FixedSizeIndexSchema { + + + +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/BiotypeIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/BiotypeIndexSchema.java new file mode 100644 index 00000000000..e2d3600099a --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/BiotypeIndexSchema.java @@ -0,0 +1,15 @@ +package org.opencb.opencga.storage.hadoop.variant.index.annotation; + +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; +import org.opencb.opencga.storage.hadoop.variant.index.core.CategoricalMultiValuedIndexField; +import org.opencb.opencga.storage.hadoop.variant.index.core.SingleFieldIndexSchema; + +import java.util.List; + +public class BiotypeIndexSchema extends SingleFieldIndexSchema> { + + public BiotypeIndexSchema(IndexFieldConfiguration configuration) { + super(new CategoricalMultiValuedIndexField<>(configuration, 0, configuration.getValues(), configuration.getValuesMapping())); + } + +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/ClinicalIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/ClinicalIndexSchema.java new file mode 100644 index 00000000000..bd7e841f1f1 --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/ClinicalIndexSchema.java @@ -0,0 +1,29 @@ +package org.opencb.opencga.storage.hadoop.variant.index.annotation; + +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; +import org.opencb.opencga.storage.hadoop.variant.index.core.CategoricalMultiValuedIndexField; +import org.opencb.opencga.storage.hadoop.variant.index.core.FixedSizeIndexSchema; + +import java.util.Arrays; + +public class ClinicalIndexSchema extends FixedSizeIndexSchema { + + private final CategoricalMultiValuedIndexField clinicalSignificanceField; + private final CategoricalMultiValuedIndexField sourceField; + + public ClinicalIndexSchema(IndexFieldConfiguration sourceConfiguration, IndexFieldConfiguration clinicalConfiguration) { + sourceField = new CategoricalMultiValuedIndexField<>(sourceConfiguration, 0, sourceConfiguration.getValues()); + clinicalSignificanceField = new CategoricalMultiValuedIndexField<>( + clinicalConfiguration, sourceField.getBitLength(), clinicalConfiguration.getValues()); + fields = Arrays.asList(sourceField, clinicalSignificanceField); + updateIndexSizeBits(); + } + + public CategoricalMultiValuedIndexField getClinicalSignificanceField() { + return clinicalSignificanceField; + } + + public CategoricalMultiValuedIndexField getSourceField() { + return sourceField; + } +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/ConsequenceTypeIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/ConsequenceTypeIndexSchema.java new file mode 100644 index 00000000000..49ba46a9182 --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/ConsequenceTypeIndexSchema.java @@ -0,0 +1,14 @@ +package org.opencb.opencga.storage.hadoop.variant.index.annotation; + +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; +import org.opencb.opencga.storage.hadoop.variant.index.core.CategoricalMultiValuedIndexField; +import org.opencb.opencga.storage.hadoop.variant.index.core.SingleFieldIndexSchema; + +import java.util.List; + +public class ConsequenceTypeIndexSchema extends SingleFieldIndexSchema> { + + public ConsequenceTypeIndexSchema(IndexFieldConfiguration ctConfiguration) { + super(new CategoricalMultiValuedIndexField<>(ctConfiguration, 0, ctConfiguration.getValues(), ctConfiguration.getValuesMapping())); + } +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/CtBtCombinationIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/CtBtCombinationIndexSchema.java new file mode 100644 index 00000000000..974a3f18e21 --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/CtBtCombinationIndexSchema.java @@ -0,0 +1,248 @@ +package org.opencb.opencga.storage.hadoop.variant.index.annotation; + +import org.apache.commons.lang3.tuple.Pair; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; +import org.opencb.opencga.storage.core.io.bit.BitInputStream; +import org.opencb.opencga.storage.core.variant.query.OpValue; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; + +import java.util.*; + +public class CtBtCombinationIndexSchema /*extends DynamicIndexSchema*/ { + + private final Field field; + + public CtBtCombinationIndexSchema(ConsequenceTypeIndexSchema consequenceTypeIndexSchema, BiotypeIndexSchema biotypeIndexSchema) { + field = new Field(consequenceTypeIndexSchema, biotypeIndexSchema); + } + + public Field getField() { + return field; + } + + public class Field { + private final ConsequenceTypeIndexSchema ctIndexSchema; + private final BiotypeIndexSchema btIndexSchema; + private final int ctValues; + private final int btValues; + + public Field(ConsequenceTypeIndexSchema consequenceTypeIndexSchema, BiotypeIndexSchema biotypeIndexSchema) { + this.ctIndexSchema = consequenceTypeIndexSchema; + this.btIndexSchema = biotypeIndexSchema; + ctValues = consequenceTypeIndexSchema.getField().getConfiguration().getValues().length + 1; + btValues = biotypeIndexSchema.getField().getConfiguration().getValues().length + 1; + } + + public AnnotationIndexEntry.CtBtCombination read(BitInputStream ctBtIndex, int ctIndex, int btIndex) { + AnnotationIndexEntry.CtBtCombination ctBtCombination = new AnnotationIndexEntry.CtBtCombination(null, 0, 0); + read(ctBtIndex, ctIndex, btIndex, ctBtCombination); + return ctBtCombination; + } + + public void read(BitInputStream ctBtIndex, int ctIndex, int btIndex, + AnnotationIndexEntry.CtBtCombination ctBtCombination) { + int numCt = Integer.bitCount(ctIndex); + int numBt = Integer.bitCount(btIndex); + int[] ctBtMatrix = new int[numCt]; + for (int i = 0; i < numCt; i++) { + ctBtMatrix[i] = ctBtIndex.readIntPartial(numBt); + } + ctBtCombination + .setNumCt(numCt) + .setNumBt(numBt) + .setCtBtMatrix(ctBtMatrix); + } + + public BitBuffer write(List> ctBtPairs) { + Set cts = new HashSet<>(); + Set bts = new HashSet<>(); + + for (Pair ctBtPair : ctBtPairs) { + cts.add(ctBtPair.getKey()); + bts.add(ctBtPair.getValue()); + } + return encode(ctBtPairs, + ctIndexSchema.getField().write(new ArrayList<>(cts)), + btIndexSchema.getField().write(new ArrayList<>(bts))); + } + + public BitBuffer encode(List> ctBtPair, BitBuffer ctBuffer, BitBuffer btBuffer) { + return encode(getCtBtCombination(ctBtPair, ctBuffer, btBuffer)); + } + + public BitBuffer encode(AnnotationIndexEntry.CtBtCombination ctBtCombination) { + int numCt = ctBtCombination.getNumCt(); + int numBt = ctBtCombination.getNumBt(); + BitBuffer ctBtBuffer = new BitBuffer(numCt * numBt); + int offset = 0; + for (int i = 0; i < numCt; i++) { + ctBtBuffer.setIntPartial(ctBtCombination.getCtBtMatrix()[i], offset, numBt); + offset += numBt; + } + return ctBtBuffer; + } + + public AnnotationIndexEntry.CtBtCombination getCtBtCombination(List> ctBtPair, + BitBuffer ctBuffer, BitBuffer btBuffer) { + boolean[][] ctBt = new boolean[ctValues + 1][btValues + 1]; + for (Pair pair : ctBtPair) { + int ctEncode = ctIndexSchema.getField().encode(Collections.singletonList(pair.getKey())); + int btEncode = btIndexSchema.getField().encode(Collections.singletonList(pair.getValue())); + if (ctEncode == 0 || btEncode == 0) { + continue; + } + int ctPos = Integer.numberOfTrailingZeros(ctEncode); + int btPos = Integer.numberOfTrailingZeros(btEncode); + ctBt[ctPos][btPos] = true; + } + AnnotationIndexEntry.CtBtCombination ctBtCombination; + int ctIndex = ctBuffer.toInt(); + int numCt = Integer.bitCount(ctIndex); + int btIndex = btBuffer.toInt(); + int numBt = Integer.bitCount(btIndex); + if (numBt > 0 && numCt > 0) { + int[] ctBtMatrix = new int[numCt]; + + for (int ctPos = 0; ctPos < numCt; ctPos++) { + // Get the first CT value from the right. + short ct = (short) Integer.lowestOneBit(ctIndex); + // Remove the CT value from the index, so the next iteration gets the next value + ctIndex &= ~ct; + int btIndexAux = btIndex; + byte combinationValue = 0; + for (int btPos = 0; btPos < numBt; btPos++) { + // As before, take the first BT value from the right. + byte bt = (byte) Integer.lowestOneBit(btIndexAux); + btIndexAux &= ~bt; + + // If the CT+BT combination is true, write a 1 + if (ctBt[maskPosition(ct)][maskPosition(bt)]) { + combinationValue |= 1 << btPos; + } + } + ctBtMatrix[ctPos] = combinationValue; + } + + ctBtCombination = new AnnotationIndexEntry.CtBtCombination(ctBtMatrix, numCt, numBt); + } else { + ctBtCombination = null; + } + return ctBtCombination; + } + + private int maskPosition(int s) { + return Integer.numberOfTrailingZeros(s); + } + + public Filter buildFilter(List> value) { + Set cts = new HashSet<>(); + Set bts = new HashSet<>(); + + for (Pair ctBtPair : value) { + cts.add(ctBtPair.getKey()); + bts.add(ctBtPair.getValue()); + } + IndexFieldFilter ctFilter = ctIndexSchema.getField().buildFilter(new OpValue<>("=", new ArrayList<>(cts))); + IndexFieldFilter btFilter = btIndexSchema.getField().buildFilter(new OpValue<>("=", new ArrayList<>(bts))); + + return buildFilter(ctFilter, btFilter); + } + + public Filter buildFilter(IndexFieldFilter ctFilter, IndexFieldFilter btFilter) { + return new Filter(ctFilter, btFilter); + } + + public Filter noOpFilter() { + return new Filter(null, null) { + @Override + public boolean test(AnnotationIndexEntry annotationIndexEntry) { + return true; + } + + @Override + public boolean isExactFilter() { + return false; + } + + @Override + public boolean isNoOp() { + return true; + } + }; + } + + } + + public class Filter { + + private final IndexFieldFilter ctFilter; + private final IndexFieldFilter btFilter; + + public Filter(IndexFieldFilter ctFilter, IndexFieldFilter btFilter) { + this.ctFilter = ctFilter; + this.btFilter = btFilter; + } + + public boolean test(AnnotationIndexEntry annotationIndexEntry) { + AnnotationIndexEntry.CtBtCombination ctBtCombination = annotationIndexEntry.getCtBtCombination(); + // Check ct+bt combinations + int ctIndex = annotationIndexEntry.getCtIndex(); + int numCt = ctBtCombination.getNumCt(); + int numBt = ctBtCombination.getNumBt(); + // Pitfall! + // if (numCt == 1 || numBt == 1) { return true; } This may not be true. + // There could be missing rows/columns in the index + int[] ctBtMatrix = ctBtCombination.getCtBtMatrix(); + // Check if any combination matches que query filter. + // Walk through all values of CT and BT in this variant. + // 3 conditions must meet: + // - The CT is part of the query filter + // - The BT is part of the query filter + // - The variant had the combination of both + for (int ctIndexPos = 0; ctIndexPos < numCt; ctIndexPos++) { + // Get the first CT value from the right. + int ct = Integer.lowestOneBit(ctIndex); + // Remove the CT value from the index, so the next iteration gets the next value + ctIndex &= ~ct; + // Check if the CT is part of the query filter + if (ctFilter.test(ct)) { + // Iterate over the Biotype values + int btIndex = annotationIndexEntry.getBtIndex(); + for (int btIndexPos = 0; btIndexPos < numBt; btIndexPos++) { + // As before, take the first BT value from the right. + byte bt = (byte) Integer.lowestOneBit(btIndex); + btIndex &= ~bt; + // Check if the BT is part of the query filter + if (btFilter.test(bt)) { + // Check if this CT was together with this BT + if ((ctBtMatrix[ctIndexPos] & (1 << btIndexPos)) != 0) { + return true; + } + } + } + // assert btIndex == 0; // We should have removed all BT from the index + } + } + // assert ctIndex == 0; // We should have removed all CT from the index + + // could not find any valid combination + return false; + } + + public boolean isExactFilter() { + return ctFilter.isExactFilter() && btFilter.isExactFilter(); + } + + public boolean isNoOp() { + return false; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("CtBtCombinationFilter{"); + sb.append("exact=").append(isExactFilter()); + sb.append('}'); + return sb.toString(); + } + } +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java index 05fbedc951c..f8d9d048f03 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/PopulationFrequencyIndexSchema.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.annotation; -import org.opencb.opencga.storage.hadoop.variant.index.core.IndexSchema; +import org.opencb.opencga.storage.hadoop.variant.index.core.FixedSizeIndexSchema; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import org.opencb.opencga.core.config.storage.SampleIndexConfiguration.PopulationFrequencyRange; @@ -10,7 +10,7 @@ import java.util.List; import java.util.Map; -public class PopulationFrequencyIndexSchema extends IndexSchema { +public class PopulationFrequencyIndexSchema extends FixedSizeIndexSchema { private final Map> populations; @@ -36,6 +36,10 @@ public PopulationFrequencyIndexSchema(List populationR } public IndexField getField(String study, String population) { - return populations.get(study + ":" + population); + return getField(study + ":" + population); + } + + public IndexField getField(String studyPop) { + return populations.get(studyPop); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java index f2678311795..1ebc25bbe97 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalIndexField.java @@ -8,7 +8,10 @@ import org.opencb.opencga.storage.hadoop.variant.index.core.filters.MultiValueIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.SingleValueIndexFieldFilter; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -19,23 +22,26 @@ * Value "0" represents NA. */ public class CategoricalIndexField extends IndexField implements IndexCodec { - public static final int NA = 0; private final int numBits; private final IndexCodec codec; public static CategoricalIndexField create(IndexFieldConfiguration configuration, int bitOffset) { - return new CategoricalIndexField<>(configuration, bitOffset, configuration.getValues()); + return new CategoricalIndexField<>(configuration, bitOffset, configuration.getValues(), configuration.getValuesMapping()); } public CategoricalIndexField(IndexFieldConfiguration configuration, int bitOffset, T[] values) { + this(configuration, bitOffset, values, null); + } + + public CategoricalIndexField(IndexFieldConfiguration configuration, int bitOffset, T[] values, Map> valuesMapping) { super(configuration, bitOffset); int numValues; if (configuration.getNullable()) { numValues = values.length + 1; - codec = new BasicCodecWithNa<>(values); + codec = new BasicCodecWithNa<>(values, valuesMapping); } else { numValues = values.length; - codec = new BasicCodec<>(values); + codec = new BasicCodec<>(values, valuesMapping); } this.numBits = Math.max(1, IndexUtils.log2(numValues - 1) + 1); } @@ -76,13 +82,30 @@ protected void checkOperator(OpValue opValue) { private static class BasicCodec implements IndexCodec { private final T[] values; + private final Map valuesMappingRev; + private final boolean[] ambiguousValues; - BasicCodec(T[] values) { + BasicCodec(T[] values, Map> valuesMapping) { this.values = values; + if (valuesMapping == null) { + this.valuesMappingRev = Collections.emptyMap(); + } else { + this.valuesMappingRev = new HashMap<>(); + for (Map.Entry> entry : valuesMapping.entrySet()) { + for (T t : entry.getValue()) { + valuesMappingRev.put(t, entry.getKey()); + } + } + } + ambiguousValues = new boolean[values.length]; + for (T value : this.valuesMappingRev.values()) { + ambiguousValues[encode(value)] = true; + } } @Override public int encode(T value) { + value = valuesMappingRev.getOrDefault(value, value); for (int i = 0, valuesLength = values.length; i < valuesLength; i++) { T t = values[i]; if (t.equals(value)) { @@ -99,19 +122,38 @@ public T decode(int code) { @Override public boolean ambiguous(int code) { - return false; + return ambiguousValues[code]; } } private static class BasicCodecWithNa implements IndexCodec { + public static final int NA = 0; private final T[] values; + private final Map valuesMappingRev; + private final boolean[] ambiguousValues; - BasicCodecWithNa(T[] values) { + BasicCodecWithNa(T[] values, Map> valuesMapping) { this.values = values; + if (valuesMapping == null) { + this.valuesMappingRev = Collections.emptyMap(); + } else { + this.valuesMappingRev = new HashMap<>(); + for (Map.Entry> entry : valuesMapping.entrySet()) { + for (T t : entry.getValue()) { + valuesMappingRev.put(t, entry.getKey()); + } + } + } + ambiguousValues = new boolean[values.length + 1]; + ambiguousValues[NA] = true; + for (T value : this.valuesMappingRev.values()) { + ambiguousValues[encode(value)] = true; + } } @Override public int encode(T value) { + value = valuesMappingRev.getOrDefault(value, value); for (int i = 0, valuesLength = values.length; i < valuesLength; i++) { T t = values[i]; if (t.equals(value)) { @@ -134,7 +176,7 @@ public T decode(int code) { @Override public boolean ambiguous(int code) { - return code == NA; + return ambiguousValues[code]; } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java index d3f5bb314cc..732e1d00fe6 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/CategoricalMultiValuedIndexField.java @@ -5,9 +5,7 @@ import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.MaskIndexFieldFilter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -23,10 +21,25 @@ public class CategoricalMultiValuedIndexField extends CategoricalIndexField> { private final int numBits; + private boolean withOthers; - public CategoricalMultiValuedIndexField(IndexFieldConfiguration configuration, int bitOffset, T... values) { - super(configuration, bitOffset, values.length, new MaskValueCodec<>(values)); - numBits = values.length; + public static CategoricalMultiValuedIndexField createMultiValued(IndexFieldConfiguration configuration, int bitOffset) { + return new CategoricalMultiValuedIndexField<>( + configuration, + bitOffset, + configuration.getValues(), + configuration.getValuesMapping()); + } + + public CategoricalMultiValuedIndexField(IndexFieldConfiguration configuration, int bitOffset, T[] values) { + this(configuration, bitOffset, values, null); + } + + public CategoricalMultiValuedIndexField(IndexFieldConfiguration configuration, int bitOffset, T[] values, + Map> valuesMapping) { + super(configuration, bitOffset, values.length, new MaskValueCodec<>(values, valuesMapping, configuration.getNullable())); + withOthers = configuration.getNullable(); + numBits = values.length + (withOthers ? 1 : 0); } @Override @@ -53,11 +66,42 @@ public int getBitLength() { * @param Value type */ private static class MaskValueCodec implements IndexCodec> { - + public static final int NA = 0; private final T[] values; + private final Integer otherValuePosition; + private final Map valuesPosition; + private final int numBits; + private final int ambiguousValues; - MaskValueCodec(T[] values) { - this.values = values; + MaskValueCodec(T[] values, Map> valuesMapping, boolean withOther) { + if (withOther) { + numBits = values.length + 1; + this.values = Arrays.copyOf(values, values.length + 1); + this.values[values.length] = null; + this.otherValuePosition = numBits; + } else { + this.values = values; + numBits = values.length; + otherValuePosition = null; + } + if (valuesMapping == null) { + valuesMapping = Collections.emptyMap(); + } + valuesPosition = new HashMap<>(); + int ambiguousValues = 0; + for (int pos = 0; pos < values.length; pos++) { + T value = values[pos]; + valuesPosition.put(value, pos); + List alias = valuesMapping.getOrDefault(value, Collections.emptyList()); + if (alias.size() > 1 || alias.size() == 1 && alias.get(0).equals(value)) { + // Is ambiguous + ambiguousValues |= 1 << pos; + for (T valueAlias : alias) { + valuesPosition.put(valueAlias, pos); + } + } + } + this.ambiguousValues = ambiguousValues; if (values.length > Integer.SIZE) { throw new IllegalArgumentException("Unable to represent more than " + Integer.SIZE + " values in a " + CategoricalMultiValuedIndexField.class.getSimpleName()); @@ -65,12 +109,12 @@ private static class MaskValueCodec implements IndexCodec> { } @Override - public int encode(List value) { + public int encode(List valuesList) { int code = 0; - for (int i = 0, valuesLength = values.length; i < valuesLength; i++) { - T t = values[i]; - if (t.equals(value)) { - code |= 1 << i; + for (T value : valuesList) { + Integer pos = valuesPosition.getOrDefault(value, otherValuePosition); + if (pos != null) { + code |= 1 << pos; } } return code; @@ -81,8 +125,8 @@ public List decode(int code) { if (code == 0) { return Collections.emptyList(); } else { - List decode = new ArrayList<>(values.length); - for (int i = 0; i < values.length; i++) { + List decode = new ArrayList<>(numBits); + for (int i = 0; i < numBits; i++) { if ((code & 1) == 1) { decode.add(values[i]); } @@ -94,7 +138,7 @@ public List decode(int code) { @Override public boolean ambiguous(int code) { - return code == NA; + return code == NA || (code & ambiguousValues) != 0; } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndexSchema.java index fbf85fac089..a164c955775 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/DynamicIndexSchema.java @@ -1,10 +1,15 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; +import java.util.List; + public abstract class DynamicIndexSchema extends IndexSchema { public DynamicIndexSchema() { } - public abstract boolean hasMoreValues(); + public DynamicIndexSchema(List> fields) { + super(fields); + } + } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/FixedSizeIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/FixedSizeIndexSchema.java new file mode 100644 index 00000000000..4e2d0719260 --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/FixedSizeIndexSchema.java @@ -0,0 +1,45 @@ +package org.opencb.opencga.storage.hadoop.variant.index.core; + +import org.opencb.opencga.storage.core.io.bit.BitBuffer; +import org.opencb.opencga.storage.core.io.bit.BitInputStream; + +import java.util.List; + +public abstract class FixedSizeIndexSchema extends IndexSchema { + + private int indexSizeBits; + + protected FixedSizeIndexSchema() { + } + + public FixedSizeIndexSchema(List> fields) { + this.fields = fields; + updateIndexSizeBits(); + } + + protected void updateIndexSizeBits() { + int indexSizeBits = 0; + for (IndexField indexField : fields) { + indexSizeBits += indexField.getBitLength(); + } + this.indexSizeBits = indexSizeBits; + } + + public int getBitsLength() { + return indexSizeBits; + } + + /** + * Read index element from the bit input stream. + * @param stream Bit input stream + * @param i element position + * @return BitBuffer containing all fields from the index. + */ + public BitBuffer read(BitInputStream stream, int i) { + return stream.getBitBuffer(i * indexSizeBits, indexSizeBits); + } + + public int readValue(BitInputStream stream, int i) { + return stream.getIntPartial(i * indexSizeBits, indexSizeBits); + } +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java index 2226b1c08e1..c4d738afc37 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexField.java @@ -65,6 +65,12 @@ public T readAndDecode(BitBuffer bb) { return decode(read(bb)); } + public BitBuffer write(T value) { + BitBuffer bitBuffer = new BitBuffer(getBitLength()); + write(value, bitBuffer); + return bitBuffer; + } + public void write(T value, BitBuffer bitBuffer) { bitBuffer.setIntPartial(encode(value), getBitOffset(), getBitLength()); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java index 6d033308e5e..ef13b30b7ec 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/IndexSchema.java @@ -1,29 +1,21 @@ package org.opencb.opencga.storage.hadoop.variant.index.core; import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; +import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFilter; import java.util.List; public abstract class IndexSchema { protected List> fields; - private int indexSizeBits; protected IndexSchema() { - } public IndexSchema(List> fields) { this.fields = fields; - updateIndexSizeBits(); - } - - protected void updateIndexSizeBits() { - int indexSizeBits = 0; - for (IndexField indexField : fields) { - indexSizeBits += indexField.getBitLength(); - } - this.indexSizeBits = indexSizeBits; } public IndexField getField(IndexFieldConfiguration.Source source, String key) { @@ -34,7 +26,15 @@ public List> getFields() { return fields; } - public int getBitsLength() { - return indexSizeBits; + public IndexFilter buildFilter(List filters, VariantQueryUtils.QueryOperation operation) { + return IndexFilter.build(this, filters, operation); + } + + public IndexFilter buildFilter(IndexFieldFilter filter) { + return IndexFilter.build(this, filter); + } + + public IndexFilter noOpFilter() { + return IndexFilter.noOp(this); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/SingleFieldIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/SingleFieldIndexSchema.java new file mode 100644 index 00000000000..3493c16eebd --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/SingleFieldIndexSchema.java @@ -0,0 +1,24 @@ +package org.opencb.opencga.storage.hadoop.variant.index.core; + +import org.opencb.opencga.storage.core.io.bit.BitInputStream; + +import java.util.Collections; + +public abstract class SingleFieldIndexSchema extends FixedSizeIndexSchema { + + private final IndexField field; + + public SingleFieldIndexSchema(IndexField field) { + super(Collections.singletonList(field)); + this.field = field; + } + + public IndexField getField() { + return field; + } + + public int readFieldValue(BitInputStream stream, int i) { +// return getField().read(read(stream, i)); + return stream.getIntPartial(i * getBitsLength(), getBitsLength()); + } +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/IndexFieldFilter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/IndexFieldFilter.java index 224ac5dadee..d8dc693b189 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/IndexFieldFilter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/IndexFieldFilter.java @@ -28,4 +28,8 @@ public IndexField getIndex() { } public abstract boolean isExactFilter(); + + public boolean isNoOp() { + return false; + } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/IndexFilter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/IndexFilter.java new file mode 100644 index 00000000000..a6b343b9e79 --- /dev/null +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/IndexFilter.java @@ -0,0 +1,153 @@ +package org.opencb.opencga.storage.hadoop.variant.index.core.filters; + +import org.opencb.opencga.storage.core.io.bit.BitBuffer; +import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; +import org.opencb.opencga.storage.hadoop.variant.index.core.IndexSchema; + +import java.util.Collections; +import java.util.List; + +/** + * Multi field index filter. + */ +public abstract class IndexFilter { + + protected final IndexSchema index; + protected final List filters; + protected final VariantQueryUtils.QueryOperation op; + private final boolean exact; + + public static IndexFilter noOp(IndexSchema index) { + return build(index, Collections.emptyList(), VariantQueryUtils.QueryOperation.AND); + } + + public static IndexFilter build(IndexSchema index, IndexFieldFilter filter) { + return build(index, Collections.singletonList(filter), VariantQueryUtils.QueryOperation.AND); + } + + public static IndexFilter build(IndexSchema index, List filters, VariantQueryUtils.QueryOperation operation) { + if (filters == null || filters.isEmpty()) { + return new NoOpIndexFilter(index); + } else if (filters.size() == 1) { + return new SingleIndexFilter(index, filters.get(0)); + } else if (operation == VariantQueryUtils.QueryOperation.AND) { + return new AndIndexFilter(index, filters); + } else if (operation == VariantQueryUtils.QueryOperation.OR) { + return new OrIndexFilter(index, filters); + } else { + throw new IllegalArgumentException("Missing query operation"); + } + } + + protected IndexFilter(IndexSchema index, List filters, VariantQueryUtils.QueryOperation op) { + this.index = index; + this.filters = filters; + this.op = op; + exact = filters.stream().allMatch(IndexFieldFilter::isExactFilter); + } + + public abstract boolean test(BitBuffer bitBuffer); + + public IndexSchema getIndex() { + return index; + } + + public List getFilters() { + return filters; + } + + public VariantQueryUtils.QueryOperation getOp() { + return op; + } + + public boolean isExactFilter() { + return exact; + } + + public boolean isNoOp() { + return false; + } + + private static class OrIndexFilter extends IndexFilter { + OrIndexFilter(IndexSchema index, List filters) { + super(index, filters, VariantQueryUtils.QueryOperation.OR); + } + + @Override + public boolean test(BitBuffer bitBuffer) { + for (IndexFieldFilter filter : filters) { + if (filter.readAndTest(bitBuffer)) { + // Require ANY match + // If any match, SUCCESS + return true; + } + } + // NONE matches + return false; + } + } + + private static class AndIndexFilter extends IndexFilter { + + AndIndexFilter(IndexSchema index, List filters) { + super(index, filters, VariantQueryUtils.QueryOperation.AND); + } + + @Override + public boolean test(BitBuffer bitBuffer) { + for (IndexFieldFilter filter : filters) { + if (!filter.readAndTest(bitBuffer)) { + // Require ALL matches. + // If any fail, FAIL + return false; + } + } + // NONE fails + return true; + } + } + + private static class SingleIndexFilter extends IndexFilter { + private final IndexFieldFilter filter; + + SingleIndexFilter(IndexSchema index, IndexFieldFilter filter) { + super(index, Collections.singletonList(filter), null); + this.filter = filter; + } + + @Override + public boolean test(BitBuffer bitBuffer) { + return filter.readAndTest(bitBuffer); + } + } + + private static class NoOpIndexFilter extends IndexFilter { + NoOpIndexFilter(IndexSchema index) { + super(index, Collections.emptyList(), null); + } + + @Override + public boolean test(BitBuffer bitBuffer) { + return true; + } + + @Override + public boolean isExactFilter() { + return false; + } + + @Override + public boolean isNoOp() { + return true; + } + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("IndexFilter{"); + sb.append("op=").append(op).append(", "); + sb.append("filters=").append(filters); + sb.append('}'); + return sb.toString(); + } +} diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/MaskIndexFieldFilter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/MaskIndexFieldFilter.java index b16fa75398b..cbfacc38bc3 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/MaskIndexFieldFilter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/MaskIndexFieldFilter.java @@ -44,6 +44,7 @@ public boolean isExactFilter() { public String toString() { return getClass().getSimpleName() + "{" + getIndex().getId() + + " exact:" + isExactFilter() + " (offset=" + getIndex().getBitOffset() + ", length=" + getIndex().getBitLength() + ")" + " : [ " + IndexUtils.binaryToString(expectedMask, getIndex().getBitLength()) + " ] }"; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/NoOpIndexFieldFilter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/NoOpIndexFieldFilter.java index e44a7d8a13e..e7590c39337 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/NoOpIndexFieldFilter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/NoOpIndexFieldFilter.java @@ -22,4 +22,14 @@ public boolean test(int code) { public boolean isExactFilter() { return false; } + + @Override + public boolean isNoOp() { + return true; + } + + @Override + public String toString() { + return getClass().getSimpleName() + '{' + getIndex().getId() + '}'; + } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilter.java index 5a496177cdd..4626a1bb0d9 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/core/filters/RangeIndexFieldFilter.java @@ -47,7 +47,7 @@ public RangeIndexFieldFilter(RangeIndexField index, String op, double value) { this.maxValueExclusive = index.getMax(); break; default: - throw new VariantQueryException("Unknown query operator" + op); + throw new VariantQueryException("Unknown query operator '" + op + "'"); } this.minCodeInclusive = (byte) index.encode(minValueInclusive); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleAnnotationIndexQuery.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleAnnotationIndexQuery.java index a74f5b397a9..b532a510fb0 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleAnnotationIndexQuery.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleAnnotationIndexQuery.java @@ -1,93 +1,37 @@ package org.opencb.opencga.storage.hadoop.variant.index.query; -import org.apache.commons.collections4.CollectionUtils; -import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; - -import java.util.Collections; -import java.util.List; +import org.opencb.opencga.storage.hadoop.variant.index.annotation.CtBtCombinationIndexSchema; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFilter; +import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; public class SampleAnnotationIndexQuery { private final byte[] annotationIndexMask; // byte[] = {mask , index} - private final short consequenceTypeMask; - private final byte biotypeMask; - private final byte clinicalMask; - private final List populationFrequencyQueries; - private final VariantQueryUtils.QueryOperation populationFrequencyQueryOperator; - private final boolean populationFrequencyQueryPartial; - - public static class PopulationFrequencyQuery extends RangeQuery { - private final int position; - private final String study; - private final String population; - - public PopulationFrequencyQuery(RangeQuery rangeQuery, int position, String study, String population) { - super(rangeQuery.minValueInclusive, rangeQuery.maxValueExclusive, - rangeQuery.minCodeInclusive, rangeQuery.maxCodeExclusive, - rangeQuery.exactQuery); - this.position = position; - this.study = study; - this.population = population; - } - - public PopulationFrequencyQuery(int position, String study, String population, - double minFreqInclusive, double maxFreqExclusive, - byte minCodeInclusive, byte maxCodeExclusive) { - super(minFreqInclusive, maxFreqExclusive, minCodeInclusive, maxCodeExclusive); - this.position = position; - this.study = study; - this.population = population; - } - - public int getPosition() { - return position; - } - - public String getStudy() { - return study; - } - - public String getPopulation() { - return population; - } + private final IndexFieldFilter consequenceTypeFilter; + private final IndexFieldFilter biotypeFilter; + private final CtBtCombinationIndexSchema.Filter ctBtFilter; + private final IndexFilter clinicalFilter; + private final IndexFilter populationFrequencyFilter; - public String getStudyPopulation() { - return study + ":" + population; - } - - @Override - public String toString() { - return "PopulationFrequencyQuery{" - + "[" + position + "] population='" + study + ':' + population + '\'' - + ", query [" + minValueInclusive + ", " + maxValueExclusive + ")" - + ", code [" + minCodeInclusive + ", " + maxCodeExclusive + ")" - + ", exact: " + exactQuery - + '}'; - } - } - - - public SampleAnnotationIndexQuery() { + public SampleAnnotationIndexQuery(SampleIndexSchema schema) { this.annotationIndexMask = new byte[]{0, 0}; - this.consequenceTypeMask = 0; - this.biotypeMask = 0; - this.clinicalMask = 0; - this.populationFrequencyQueries = Collections.emptyList(); - this.populationFrequencyQueryOperator = VariantQueryUtils.QueryOperation.AND; - this.populationFrequencyQueryPartial = true; + this.consequenceTypeFilter = schema.getCtIndex().getField().noOpFilter(); + this.biotypeFilter = schema.getBiotypeIndex().getField().noOpFilter(); + this.ctBtFilter = schema.getCtBtIndex().getField().noOpFilter(); + this.clinicalFilter = schema.getClinicalIndexSchema().noOpFilter(); + this.populationFrequencyFilter = schema.getPopFreqIndex().noOpFilter(); } - public SampleAnnotationIndexQuery(byte[] annotationIndexMask, short consequenceTypeMask, byte biotypeMask, - byte clinicalMask, VariantQueryUtils.QueryOperation populationFrequencyQueryOperator, - List populationFrequencyQueries, - boolean populationFrequencyQueryPartial) { + public SampleAnnotationIndexQuery(byte[] annotationIndexMask, IndexFieldFilter consequenceTypeFilter, IndexFieldFilter biotypeFilter, + CtBtCombinationIndexSchema.Filter ctBtFilter, IndexFilter clinicalFilter, + IndexFilter populationFrequencyFilter) { this.annotationIndexMask = annotationIndexMask; - this.consequenceTypeMask = consequenceTypeMask; - this.biotypeMask = biotypeMask; - this.clinicalMask = clinicalMask; - this.populationFrequencyQueries = Collections.unmodifiableList(populationFrequencyQueries); - this.populationFrequencyQueryOperator = populationFrequencyQueryOperator; - this.populationFrequencyQueryPartial = populationFrequencyQueryPartial; + this.consequenceTypeFilter = consequenceTypeFilter; + this.biotypeFilter = biotypeFilter; + this.ctBtFilter = ctBtFilter; + this.clinicalFilter = clinicalFilter; + this.populationFrequencyFilter = populationFrequencyFilter; } public byte getAnnotationIndexMask() { @@ -98,34 +42,31 @@ public byte getAnnotationIndex() { return annotationIndexMask[1]; } - public short getConsequenceTypeMask() { - return consequenceTypeMask; - } - - public byte getBiotypeMask() { - return biotypeMask; + public IndexFieldFilter getConsequenceTypeFilter() { + return consequenceTypeFilter; } - public List getPopulationFrequencyQueries() { - return populationFrequencyQueries; + public IndexFieldFilter getBiotypeFilter() { + return biotypeFilter; } - public VariantQueryUtils.QueryOperation getPopulationFrequencyQueryOperator() { - return populationFrequencyQueryOperator; + public CtBtCombinationIndexSchema.Filter getCtBtFilter() { + return ctBtFilter; } - public boolean isPopulationFrequencyQueryPartial() { - return populationFrequencyQueryPartial; + public IndexFilter getPopulationFrequencyFilter() { + return populationFrequencyFilter; } - public byte getClinicalMask() { - return clinicalMask; + public IndexFilter getClinicalFilter() { + return clinicalFilter; } public boolean isEmpty() { return getAnnotationIndexMask() == IndexUtils.EMPTY_MASK - && biotypeMask == IndexUtils.EMPTY_MASK - && consequenceTypeMask == IndexUtils.EMPTY_MASK - && CollectionUtils.isEmpty(populationFrequencyQueries); + && biotypeFilter.isNoOp() + && consequenceTypeFilter.isNoOp() + && clinicalFilter.isNoOp() + && populationFrequencyFilter.isNoOp(); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java index b21dd88be1a..d1969c6c868 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java @@ -69,7 +69,7 @@ public SampleIndexQuery(SampleIndexSchema schema, Collection> regio List> samplesMap, QueryOperation queryOperation) { this(schema, regionGroups, null, study, samplesMap, Collections.emptySet(), null, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), - new SampleAnnotationIndexQuery(), Collections.emptySet(), false, queryOperation); + new SampleAnnotationIndexQuery(schema), Collections.emptySet(), false, queryOperation); } public SampleIndexQuery(SampleIndexSchema schema, Collection> regionGroups, Set variantTypes, String study, @@ -187,11 +187,11 @@ public boolean emptyFileIndex() { } public byte getAnnotationIndexMask() { - return annotationIndexQuery.getAnnotationIndexMask(); + return getAnnotationIndexQuery().getAnnotationIndexMask(); } public byte getAnnotationIndex() { - return annotationIndexQuery.getAnnotationIndex(); + return getAnnotationIndexQuery().getAnnotationIndex(); } public boolean emptyAnnotationIndex() { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java index b3a08ca1d9a..ca6e9ad7f8c 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java @@ -11,7 +11,6 @@ import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.family.MendelianErrorSampleIndexEntryIterator; -import org.opencb.opencga.storage.hadoop.variant.index.query.SampleAnnotationIndexQuery.PopulationFrequencyQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleFileIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SingleSampleIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexEntry.SampleIndexGtEntry; @@ -20,9 +19,9 @@ import java.util.*; -import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.QueryOperation.AND; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.QueryOperation.OR; -import static org.opencb.opencga.storage.hadoop.variant.index.IndexUtils.*; +import static org.opencb.opencga.storage.hadoop.variant.index.IndexUtils.testIndex; +import static org.opencb.opencga.storage.hadoop.variant.index.IndexUtils.testParentsGenotypeCode; /** * Converts SampleIndexEntry to collection of variants. @@ -324,40 +323,11 @@ public static boolean isClinical(byte summaryIndex) { } private boolean filterPopFreq(AnnotationIndexEntry annotationIndexEntry) { - if (query.getAnnotationIndexQuery().getPopulationFrequencyQueries().isEmpty() || annotationIndexEntry.getPopFreqIndex() == null) { - return true; - } - for (PopulationFrequencyQuery q : query.getAnnotationIndexQuery().getPopulationFrequencyQueries()) { - int code = annotationIndexEntry.getPopFreqIndex()[q.getPosition()]; - if (q.getMinCodeInclusive() <= code && code < q.getMaxCodeExclusive()) { - if (query.getAnnotationIndexQuery().getPopulationFrequencyQueryOperator().equals(OR)) { - // Require ANY match - // If any match, SUCCESS - return true; - } - } else { - if (query.getAnnotationIndexQuery().getPopulationFrequencyQueryOperator().equals(AND)) { - // Require ALL matches. - // If any fail, FAIL - return false; - } - } - } - - if (query.getAnnotationIndexQuery().getPopulationFrequencyQueryOperator().equals(AND)) { - // Require ALL matches. - // If no fails, SUCCESS - return true; - } else { - // Require ANY match. - // If no matches, and partial, UNKNOWN. If unknown, SUCCESS - // If no matches, and fully covered, FAIL - return query.getAnnotationIndexQuery().isPopulationFrequencyQueryPartial(); - } + return query.getAnnotationIndexQuery().getPopulationFrequencyFilter().test(annotationIndexEntry.getPopFreqIndex()); } private boolean filterClinicalFields(AnnotationIndexEntry annotationIndexEntry) { - if (query.getAnnotationIndexQuery().getClinicalMask() == EMPTY_MASK) { + if (query.getAnnotationIndexQuery().getClinicalFilter().isNoOp()) { // No filter required return true; } @@ -365,10 +335,11 @@ private boolean filterClinicalFields(AnnotationIndexEntry annotationIndexEntry) // unable to filter by this field return true; } - if (!annotationIndexEntry.isClinical()) { + if (!annotationIndexEntry.hasClinical()) { return false; } - return testIndexAny(annotationIndexEntry.getClinicalIndex(), query.getAnnotationIndexQuery().getClinicalMask()); + // FIXME + return query.getAnnotationIndexQuery().getClinicalFilter().test(annotationIndexEntry.getClinicalIndex()); } private boolean filterBtCtFields(AnnotationIndexEntry annotationIndexEntry) { @@ -380,59 +351,17 @@ private boolean filterBtCtFields(AnnotationIndexEntry annotationIndexEntry) { return true; } if (!annotationIndexEntry.hasBtIndex() - || testIndexAny(annotationIndexEntry.getBtIndex(), query.getAnnotationIndexQuery().getBiotypeMask())) { + || query.getAnnotationIndexQuery().getBiotypeFilter().test(annotationIndexEntry.getBtIndex())) { if (!annotationIndexEntry.hasCtIndex() - || testIndexAny(annotationIndexEntry.getCtIndex(), query.getAnnotationIndexQuery().getConsequenceTypeMask())) { + || query.getAnnotationIndexQuery().getConsequenceTypeFilter().test(annotationIndexEntry.getCtIndex())) { if (annotationIndexEntry.getCtBtCombination().getCtBtMatrix() == null - || query.getAnnotationIndexQuery().getConsequenceTypeMask() == 0 - || query.getAnnotationIndexQuery().getBiotypeMask() == 0) { + || query.getAnnotationIndexQuery().getConsequenceTypeFilter().isNoOp() + || query.getAnnotationIndexQuery().getBiotypeFilter().isNoOp()) { return true; } else { - AnnotationIndexEntry.CtBtCombination ctBtCombination = annotationIndexEntry.getCtBtCombination(); - // Check ct+bt combinations - short ctIndex = annotationIndexEntry.getCtIndex(); - int numCt = ctBtCombination.getNumCt(); - int numBt = ctBtCombination.getNumBt(); - // Pitfall! - // if (numCt == 1 || numBt == 1) { return true; } This may not be true. - // There could be missing rows/columns in the index - byte[] ctBtMatrix = ctBtCombination.getCtBtMatrix(); - // Check if any combination matches que query filter. - // Walk through all values of CT and BT in this variant. - // 3 conditions must meet: - // - The CT is part of the query filter - // - The BT is part of the query filter - // - The variant had the combination of both - for (int ctIndexPos = 0; ctIndexPos < numCt; ctIndexPos++) { - // Get the first CT value from the right. - short ct = (short) Integer.lowestOneBit(ctIndex); - // Remove the CT value from the index, so the next iteration gets the next value - ctIndex &= ~ct; - // Check if the CT is part of the query filter - if (IndexUtils.testIndexAny(ct, query.getAnnotationIndexQuery().getConsequenceTypeMask())) { - // Iterate over the Biotype values - byte btIndex = annotationIndexEntry.getBtIndex(); - for (int btIndexPos = 0; btIndexPos < numBt; btIndexPos++) { - // As before, take the first BT value from the right. - byte bt = (byte) Integer.lowestOneBit(btIndex); - btIndex &= ~bt; - // Check if the BT is part of the query filter - if (IndexUtils.testIndexAny(bt, query.getAnnotationIndexQuery().getBiotypeMask())) { - // Check if this CT was together with this BT - if ((ctBtMatrix[ctIndexPos] & (1 << btIndexPos)) != 0) { - return true; - } - } - } - // assert btIndex == 0; // We should have removed all BT from the index - } - } - // assert ctIndex == 0; // We should have removed all CT from the index - - // could not find any valid combination - return false; + return query.getAnnotationIndexQuery().getCtBtFilter().test(annotationIndexEntry); } } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java index b5a1218bca4..94fb4fce714 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/FileIndexSchema.java @@ -16,7 +16,7 @@ import java.util.stream.Collectors; -public class FileIndexSchema extends IndexSchema { +public class FileIndexSchema extends FixedSizeIndexSchema { private final List> fixedFields; private final List> customFields; @@ -100,8 +100,9 @@ public boolean isMultiFile(BitBuffer fileIndex) { return getMultiFileIndex().readAndDecode(fileIndex); } - public boolean isMultiFile(BitBuffer fileIndex, int bitOffset) { - int code = fileIndex.getIntPartial(bitOffset + getMultiFileIndex().getBitOffset(), getMultiFileIndex().getBitLength()); + public boolean isMultiFile(BitBuffer fileIndex, int elementIndex) { + int code = fileIndex.getIntPartial( + (elementIndex * getBitsLength()) + getMultiFileIndex().getBitOffset(), getMultiFileIndex().getBitLength()); return getMultiFileIndex().decode(code); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java index c73cc63a614..a8002155765 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexAnnotationLoader.java @@ -7,7 +7,6 @@ import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; @@ -324,8 +323,7 @@ private Put annotate(String chromosome, int start, Integer sampleId, restarted = true; } else { logger.error("Missing variant to annotate " + variantToAnnotate); - builder.add(AnnotationIndexEntry.empty( - SampleIndexConfiguration.PopulationFrequencyRange.DEFAULT_THRESHOLDS.length)); + builder.add(AnnotationIndexEntry.empty()); missingVariants++; break; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java index 90ef7e9a188..4fe7a23a331 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java @@ -32,7 +32,7 @@ import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; -import org.opencb.opencga.storage.hadoop.variant.index.query.SampleAnnotationIndexQuery.PopulationFrequencyQuery; +import org.opencb.opencga.storage.hadoop.variant.index.query.SampleAnnotationIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleFileIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SingleSampleIndexQuery; @@ -625,20 +625,20 @@ private Scan parse(SingleSampleIndexQuery query, List regions, boolean o scan.addColumn(family, SampleIndexSchema.toAnnotationIndexColumn(gt)); scan.addColumn(family, SampleIndexSchema.toAnnotationIndexCountColumn(gt)); } - if (includeAll || query.getAnnotationIndexQuery().getBiotypeMask() != EMPTY_MASK) { + if (includeAll || !query.getAnnotationIndexQuery().getBiotypeFilter().isNoOp()) { scan.addColumn(family, SampleIndexSchema.toAnnotationBiotypeIndexColumn(gt)); } - if (includeAll || query.getAnnotationIndexQuery().getConsequenceTypeMask() != EMPTY_MASK) { + if (includeAll || !query.getAnnotationIndexQuery().getConsequenceTypeFilter().isNoOp()) { scan.addColumn(family, SampleIndexSchema.toAnnotationConsequenceTypeIndexColumn(gt)); } - if (/*includeAll ||*/ query.getAnnotationIndexQuery().getBiotypeMask() != EMPTY_MASK - && query.getAnnotationIndexQuery().getConsequenceTypeMask() != EMPTY_MASK) { + if (/*includeAll ||*/ !query.getAnnotationIndexQuery().getBiotypeFilter().isNoOp() + && !query.getAnnotationIndexQuery().getConsequenceTypeFilter().isNoOp()) { scan.addColumn(family, SampleIndexSchema.toAnnotationCtBtIndexColumn(gt)); } - if (!/*includeAll ||*/ query.getAnnotationIndexQuery().getPopulationFrequencyQueries().isEmpty()) { + if (/*includeAll ||*/ !query.getAnnotationIndexQuery().getPopulationFrequencyFilter().isNoOp()) { scan.addColumn(family, SampleIndexSchema.toAnnotationPopFreqIndexColumn(gt)); } - if (includeAll || query.getAnnotationIndexQuery().getClinicalMask() != EMPTY_MASK) { + if (includeAll || !query.getAnnotationIndexQuery().getClinicalFilter().isNoOp()) { scan.addColumn(family, SampleIndexSchema.toAnnotationClinicalIndexColumn(gt)); } if (includeAll || !query.emptyFileIndex()) { @@ -679,20 +679,28 @@ private Scan parse(SingleSampleIndexQuery query, List regions, boolean o return scan; } - protected static void printQuery(SingleSampleIndexQuery query) { - logger.info("AnnotationIndex = " + IndexUtils.maskToString(query.getAnnotationIndexMask(), query.getAnnotationIndex())); - if (query.getAnnotationIndexQuery().getBiotypeMask() != EMPTY_MASK) { - logger.info("BiotypeIndex = " + IndexUtils.byteToString(query.getAnnotationIndexQuery().getBiotypeMask())); + public static void printQuery(SampleAnnotationIndexQuery annotationIndexQuery) { + logger.info("AnnotationIndex = " + IndexUtils.maskToString( + annotationIndexQuery.getAnnotationIndexMask(), annotationIndexQuery.getAnnotationIndex())); + if (!annotationIndexQuery.getBiotypeFilter().isNoOp()) { + logger.info("BiotypeIndex = " + annotationIndexQuery.getBiotypeFilter().toString()); } - if (query.getAnnotationIndexQuery().getConsequenceTypeMask() != EMPTY_MASK) { - logger.info("CTIndex = " + IndexUtils.shortToString(query.getAnnotationIndexQuery().getConsequenceTypeMask())); + if (!annotationIndexQuery.getConsequenceTypeFilter().isNoOp()) { + logger.info("CTIndex = " + annotationIndexQuery.getConsequenceTypeFilter().toString()); } - if (query.getAnnotationIndexQuery().getClinicalMask() != EMPTY_MASK) { - logger.info("ClinicalIndex = " + IndexUtils.byteToString(query.getAnnotationIndexQuery().getClinicalMask())); + if (!annotationIndexQuery.getCtBtFilter().isNoOp()) { + logger.info("CtBtIndex = " + annotationIndexQuery.getCtBtFilter().toString()); } - for (PopulationFrequencyQuery pf : query.getAnnotationIndexQuery().getPopulationFrequencyQueries()) { - logger.info("PopFreq = " + pf); + if (!annotationIndexQuery.getClinicalFilter().isNoOp()) { + logger.info("ClinicalIndex = " + annotationIndexQuery.getClinicalFilter()); } + if (!annotationIndexQuery.getPopulationFrequencyFilter().isNoOp()) { + logger.info("PopFreq = " + annotationIndexQuery.getPopulationFrequencyFilter()); + } + } + + public static void printQuery(SingleSampleIndexQuery query) { + printQuery(query.getAnnotationIndexQuery()); for (SampleFileIndexQuery sampleFileIndexQuery : query.getSampleFileIndexQuery()) { for (IndexFieldFilter filter : sampleFileIndexQuery.getFilters()) { logger.info("Filter = " + filter); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntry.java index 0a9fc63b2f2..67c07ae70fb 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntry.java @@ -2,6 +2,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.hadoop.hbase.util.Bytes; +import org.opencb.opencga.storage.core.io.bit.BitInputStream; import java.util.Arrays; import java.util.HashMap; @@ -260,6 +261,10 @@ public byte[] getFileIndex() { return fileIndex; } + public BitInputStream getFileIndexStream() { + return fileIndex == null ? null : new BitInputStream(fileIndex, fileIndexOffset, fileIndexLength); + } + public int getFileIndexOffset() { return fileIndexOffset; } @@ -311,8 +316,10 @@ public byte[] getConsequenceTypeIndex() { return consequenceTypeIndex; } - public short getConsequenceTypeIndex(int nonIntergenicIndex) { - return Bytes.toShort(consequenceTypeIndex, consequenceTypeIndexOffset + nonIntergenicIndex * Short.BYTES); + public BitInputStream getConsequenceTypeIndexStream() { + return consequenceTypeIndex == null + ? null + : new BitInputStream(consequenceTypeIndex, consequenceTypeIndexOffset, consequenceTypeIndexLength); } public SampleIndexGtEntry setConsequenceTypeIndex(byte[] consequenceTypeIndex) { @@ -330,8 +337,8 @@ public byte[] getBiotypeIndex() { return biotypeIndex; } - public byte getBiotypeIndex(int idx) { - return biotypeIndex[biotypeIndexOffset + idx]; + public BitInputStream getBiotypeIndexStream() { + return biotypeIndex == null ? null : new BitInputStream(biotypeIndex, biotypeIndexOffset, biotypeIndexLength); } public SampleIndexGtEntry setBiotypeIndex(byte[] biotypeIndex) { @@ -349,6 +356,10 @@ public byte[] getCtBtIndex() { return ctBtIndex; } + public BitInputStream getCtBtIndexStream() { + return ctBtIndex == null ? null : new BitInputStream(ctBtIndex, ctBtIndexOffset, ctBtIndexLength); + } + public int getCtBtIndexOffset() { return ctBtIndexOffset; } @@ -372,6 +383,12 @@ public byte[] getPopulationFrequencyIndex() { return populationFrequencyIndex; } + public BitInputStream getPopulationFrequencyIndexStream() { + return populationFrequencyIndex == null + ? null + : new BitInputStream(populationFrequencyIndex, populationFrequencyIndexOffset, populationFrequencyIndexLength); + } + public int getPopulationFrequencyIndexOffset() { return populationFrequencyIndexOffset; } @@ -395,6 +412,13 @@ public byte[] getClinicalIndex() { return clinicalIndex; } + public BitInputStream getClinicalIndexStream() { + return clinicalIndex == null + ? null + : new BitInputStream(clinicalIndex, clinicalIndexOffset, clinicalIndexLength); + } + + @Deprecated public byte getClinicalIndex(int idx) { return clinicalIndex[clinicalIndexOffset + idx]; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java index dec57f31e80..ac043e20cc1 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java @@ -4,9 +4,10 @@ import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; -import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.commons.datastore.core.Query; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; +import org.opencb.opencga.core.models.variant.VariantAnnotationConstants; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; import org.opencb.opencga.storage.core.metadata.models.StudyMetadata; @@ -16,19 +17,16 @@ import org.opencb.opencga.storage.core.variant.adaptors.GenotypeClass; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.opencga.storage.core.variant.query.*; -import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; +import org.opencb.opencga.storage.hadoop.variant.index.annotation.CtBtCombinationIndexSchema; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.NoOpIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.family.GenotypeCodec; import org.opencb.opencga.storage.hadoop.variant.index.query.*; -import org.opencb.opencga.storage.hadoop.variant.index.query.SampleAnnotationIndexQuery.PopulationFrequencyQuery; -import org.opencb.opencga.core.config.storage.SampleIndexConfiguration.PopulationFrequencyRange; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -799,9 +797,10 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query) { */ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, boolean completeIndex) { byte annotationIndex = 0; - byte biotypeMask = 0; - short consequenceTypeMask = 0; - byte clinicalMask = 0; + IndexFieldFilter biotypeFilter = schema.getBiotypeIndex().getField().noOpFilter(); + IndexFieldFilter consequenceTypeFilter = schema.getCtIndex().getField().noOpFilter(); + CtBtCombinationIndexSchema.Filter ctBtFilter = schema.getCtBtIndex().getField().noOpFilter(); + IndexFilter clinicalFilter = schema.getClinicalIndexSchema().noOpFilter(); Boolean intergenic = null; @@ -886,18 +885,8 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool boolean useCtIndexFilter = !ctFilterCoveredBySummary || (!ctBtCombinationCoveredBySummary && combination.isBiotype()); if (useCtIndexFilter) { ctCovered = completeIndex; - for (String soName : soNames) { - short mask = getMaskFromSoName(soName); - if (mask == IndexUtils.EMPTY_MASK) { - // If any element is not in the index, do not use this filter - consequenceTypeMask = IndexUtils.EMPTY_MASK; - ctCovered = false; - break; - } - consequenceTypeMask |= mask; - // Some CT filter values are not precise, so the query is not covered. - ctCovered &= !isImpreciseCtMask(mask); - } + consequenceTypeFilter = schema.getCtIndex().getField().buildFilter(new OpValue<>("=", soNames)); + ctCovered &= consequenceTypeFilter.isExactFilter(); // ConsequenceType filter is covered by index if (ctCovered) { if (!isValidParam(query, GENE) && simpleCombination(combination)) { @@ -927,18 +916,8 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool boolean useBtIndexFilter = !biotypeFilterCoveredBySummary || combination.isConsequenceType(); if (useBtIndexFilter) { btCovered = completeIndex; - for (String biotype : biotypes) { - byte mask = getMaskFromBiotype(biotype); - if (mask == IndexUtils.EMPTY_MASK) { - // If any element is not in the index, do not use this filter - biotypeMask = IndexUtils.EMPTY_MASK; - btCovered = false; - break; - } - biotypeMask |= mask; - // Some CT filter values are not precise, so the query is not covered. - btCovered &= !isImpreciseBtMask(mask); - } + biotypeFilter = schema.getBiotypeIndex().getField().buildFilter(new OpValue<>("=", biotypes)); + btCovered &= biotypeFilter.isExactFilter(); // Biotype filter is covered by index if (btCovered) { if (!isValidParam(query, GENE) && simpleCombination(combination)) { @@ -947,6 +926,10 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool } } } + + if (!consequenceTypeFilter.isNoOp() && !biotypeFilter.isNoOp()) { + ctBtFilter = schema.getCtBtIndex().getField().buildFilter(consequenceTypeFilter, biotypeFilter); + } if (completeIndex && btCovered && ctCovered && !isValidParam(query, GENE) && combination.equals(BiotypeConsquenceTypeFlagCombination.BIOTYPE_CT)) { query.remove(ANNOT_BIOTYPE.key()); @@ -963,45 +946,24 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool if (isValidParam(query, ANNOT_CLINICAL_SIGNIFICANCE)) { annotationIndex |= CLINICAL_MASK; - boolean clinicalCovered = true; - for (String clinical : query.getAsStringList(ANNOT_CLINICAL_SIGNIFICANCE.key())) { - switch (ClinicalSignificance.valueOf(clinical)) { - case likely_benign: - case benign: - // These two values are covered by the same bit, so, they are not covered. - clinicalCovered = false; - clinicalMask |= CLINICAL_BENIGN_LIKELY_BENIGN_MASK; - break; - case VUS: - case uncertain_significance: - // These two values are synonymous - clinicalMask |= CLINICAL_UNCERTAIN_SIGNIFICANCE_MASK; - break; - case likely_pathogenic: - clinicalMask |= CLINICAL_LIKELY_PATHOGENIC_MASK; - break; - case pathogenic: - clinicalMask |= CLINICAL_PATHOGENIC_MASK; - break; - default: - clinicalCovered = false; - break; - } + clinicalFilter = schema.getClinicalIndexSchema().buildFilter(schema.getClinicalIndexSchema().getClinicalSignificanceField() + .buildFilter(new OpValue<>("=", query.getAsStringList(ANNOT_CLINICAL_SIGNIFICANCE.key())))); + boolean clinicalCovered = clinicalFilter.isExactFilter(); + if (!clinicalCovered) { + // Not all values are covered by the index. Unable to filter using this index, as it may return less values than required. + clinicalFilter = schema.getClinicalIndexSchema().noOpFilter(); } if (completeIndex && clinicalCovered) { query.remove(ANNOT_CLINICAL_SIGNIFICANCE.key()); } - if (!clinicalCovered) { - // Not all values are covered by the index. Unable to filter using this index, as it may return less values than required. - clinicalMask = 0; - } } - List popFreqQuery = new ArrayList<>(); - QueryOperation popFreqOp = QueryOperation.AND; - boolean popFreqPartial = false; + IndexFilter populationFrequencyFilter = schema.getPopFreqIndex().noOpFilter(); // TODO: This will skip filters ANNOT_POPULATION_REFERENCE_FREQUENCY and ANNOT_POPULATION_MINNOR_ALLELE_FREQUENCY if (isValidParam(query, ANNOT_POPULATION_ALTERNATE_FREQUENCY)) { + List populationFrequencyFilters = new ArrayList<>(); + QueryOperation popFreqOp; + boolean popFreqPartial = false; ParsedQuery popFreqFilter = VariantQueryUtils.splitValue(query, VariantQueryParam.ANNOT_POPULATION_ALTERNATE_FREQUENCY); popFreqOp = popFreqFilter.getOperation(); @@ -1013,7 +975,7 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool KeyOpValue keyOpValue = VariantQueryUtils.parseKeyOpValue(popFreq); String studyPop = keyOpValue.getKey(); studyPops.add(studyPop); - double freqFilter = Double.valueOf(keyOpValue.getValue()); + double freqFilter = Double.parseDouble(keyOpValue.getValue()); if (keyOpValue.getOp().equals("<") || keyOpValue.getOp().equals("<<")) { if (freqFilter <= POP_FREQ_THRESHOLD_001) { popFreqLessThan001.add(studyPop); @@ -1022,19 +984,12 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool boolean populationInSampleIndex = false; boolean populationFilterFullyCovered = false; - int popFreqIdx = 0; - for (PopulationFrequencyRange populationRange : schema.getConfiguration().getPopulationRanges()) { - if (populationRange.getKey().equals(studyPop)) { - populationInSampleIndex = true; - RangeQuery rangeQuery = getRangeQuery(keyOpValue.getOp(), freqFilter, populationRange.getThresholds(), - 0, 1 + RangeIndexField.DELTA); - - popFreqQuery.add(new PopulationFrequencyQuery(rangeQuery, - popFreqIdx, populationRange.getStudy(), - populationRange.getPopulation())); - populationFilterFullyCovered |= rangeQuery.isExactQuery(); - } - popFreqIdx++; + IndexField popFreqField = schema.getPopFreqIndex().getField(studyPop); + if (popFreqField != null) { + populationInSampleIndex = true; + IndexFieldFilter fieldFilter = popFreqField.buildFilter(new OpValue<>(keyOpValue.getOp(), freqFilter)); + populationFrequencyFilters.add(fieldFilter); + populationFilterFullyCovered = fieldFilter.isExactFilter(); } if (!populationInSampleIndex) { @@ -1053,7 +1008,7 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool if (POP_FREQ_ANY_001_SET.size() == popFreqFilter.getValues().size()) { // Do not filter using the PopFreq index, as the summary bit covers the filter - popFreqQuery.clear(); + populationFrequencyFilters.clear(); // If the index is complete for all samples, remove the filter from main query if (completeIndex) { @@ -1063,7 +1018,7 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool } if (popFreqPartial) { // Can not use the index with partial OR queries. - popFreqQuery.clear(); + populationFrequencyFilters.clear(); } else if (filtersNotCoveredByPopFreqQuery.isEmpty()) { // If all filters are covered, remove filter form query. if (completeIndex) { @@ -1089,6 +1044,9 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool } } } + if (!populationFrequencyFilters.isEmpty()) { + populationFrequencyFilter = schema.getPopFreqIndex().buildFilter(populationFrequencyFilters, popFreqOp); + } } byte annotationIndexMask = annotationIndex; @@ -1101,13 +1059,12 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool if (intergenic == null || intergenic) { // If intergenic is undefined, or true, CT and BT filters can not be used. - consequenceTypeMask = IndexUtils.EMPTY_MASK; - biotypeMask = IndexUtils.EMPTY_MASK; + biotypeFilter = schema.getBiotypeIndex().getField().noOpFilter(); + consequenceTypeFilter = schema.getCtIndex().getField().noOpFilter(); } - - return new SampleAnnotationIndexQuery(new byte[]{annotationIndexMask, annotationIndex}, consequenceTypeMask, biotypeMask, - clinicalMask, popFreqOp, popFreqQuery, popFreqPartial); + return new SampleAnnotationIndexQuery(new byte[]{annotationIndexMask, annotationIndex}, + consequenceTypeFilter, biotypeFilter, ctBtFilter, clinicalFilter, populationFrequencyFilter); } private boolean simpleCombination(BiotypeConsquenceTypeFlagCombination combination) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java index 8b169e84dc3..e7d92afe722 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexSchema.java @@ -14,12 +14,11 @@ import org.opencb.opencga.storage.hadoop.utils.HBaseManager; import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageOptions; -import org.opencb.opencga.storage.hadoop.variant.index.annotation.PopulationFrequencyIndexSchema; +import org.opencb.opencga.storage.hadoop.variant.index.annotation.*; import java.io.IOException; import java.io.UncheckedIOException; -import java.util.ArrayList; -import java.util.Comparator; +import java.util.*; import static org.apache.hadoop.hbase.util.Bytes.SIZEOF_INT; @@ -97,11 +96,24 @@ public final class SampleIndexSchema { private final SampleIndexConfiguration configuration; private final FileIndexSchema fileIndex; private final PopulationFrequencyIndexSchema popFreqIndex; + private final ConsequenceTypeIndexSchema ctIndex; + private final BiotypeIndexSchema biotypeIndex; + private final CtBtCombinationIndexSchema ctBtIndex; + private final ClinicalIndexSchema clinicalIndexSchema; + private final AnnotationSummaryIndexSchema annotationSummaryIndexSchema; public SampleIndexSchema(SampleIndexConfiguration configuration) { this.configuration = configuration; fileIndex = new FileIndexSchema(configuration.getFileIndexConfiguration()); + annotationSummaryIndexSchema = new AnnotationSummaryIndexSchema(); + ctIndex = new ConsequenceTypeIndexSchema(configuration.getAnnotationIndexConfiguration().getConsequenceType()); + biotypeIndex = new BiotypeIndexSchema(configuration.getAnnotationIndexConfiguration().getBiotype()); + ctBtIndex = new CtBtCombinationIndexSchema(ctIndex, biotypeIndex); popFreqIndex = new PopulationFrequencyIndexSchema(configuration.getPopulationRanges()); + clinicalIndexSchema = new ClinicalIndexSchema( + configuration.getAnnotationIndexConfiguration().getClinicalSource(), + configuration.getAnnotationIndexConfiguration().getClinicalSignificance() + ); } /** @@ -118,10 +130,30 @@ public SampleIndexConfiguration getConfiguration() { return configuration; } + public AnnotationSummaryIndexSchema getAnnotationSummaryIndexSchema() { + return annotationSummaryIndexSchema; + } + + public ConsequenceTypeIndexSchema getCtIndex() { + return ctIndex; + } + + public BiotypeIndexSchema getBiotypeIndex() { + return biotypeIndex; + } + + public CtBtCombinationIndexSchema getCtBtIndex() { + return ctBtIndex; + } + public PopulationFrequencyIndexSchema getPopFreqIndex() { return popFreqIndex; } + public ClinicalIndexSchema getClinicalIndexSchema() { + return clinicalIndexSchema; + } + public FileIndexSchema getFileIndex() { return fileIndex; } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java index ab512927de4..d28f2bb3805 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexVariantBiConverter.java @@ -8,7 +8,6 @@ import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.core.io.bit.BitInputStream; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory; -import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; import org.opencb.opencga.storage.hadoop.variant.index.family.MendelianErrorSampleIndexEntryIterator; @@ -201,6 +200,8 @@ private abstract static class SampleIndexGtEntryIterator implements SampleIndexE protected SampleIndexEntry.SampleIndexGtEntry gtEntry; private final SampleIndexSchema schema; private BitInputStream popFreq; + private BitInputStream ctIndex; + private BitInputStream btIndex; private BitInputStream ctBtIndex; private int nonIntergenicCount; private int clinicalCount; @@ -211,36 +212,28 @@ private abstract static class SampleIndexGtEntryIterator implements SampleIndexE // Reuse the annotation index entry. Avoid create a new instance for each variant. private final AnnotationIndexEntry annotationIndexEntry; private int annotationIndexEntryIdx; - private int fileDataIndexesBitsLength; + private BitInputStream clinicalIndex; SampleIndexGtEntryIterator(SampleIndexSchema schema) { nonIntergenicCount = 0; clinicalCount = 0; annotationIndexEntry = new AnnotationIndexEntry(); - annotationIndexEntry.setCtBtCombination(new AnnotationIndexEntry.CtBtCombination(new byte[0], 0, 0)); + annotationIndexEntry.setCtBtCombination(new AnnotationIndexEntry.CtBtCombination(new int[0], 0, 0)); annotationIndexEntryIdx = -1; fileIndexIdx = 0; fileIndexCount = 0; this.schema = schema; - fileDataIndexesBitsLength = schema.getFileIndex().getBitsLength(); } SampleIndexGtEntryIterator(SampleIndexEntry.SampleIndexGtEntry gtEntry, SampleIndexSchema schema) { this(schema); this.gtEntry = gtEntry; - this.ctBtIndex = gtEntry.getCtBtIndex() == null - ? null - : new BitInputStream(gtEntry.getCtBtIndex(), gtEntry.getCtBtIndexOffset(), gtEntry.getCtBtIndexLength()); - this.popFreq = gtEntry.getPopulationFrequencyIndex() == null - ? null - : new BitInputStream(gtEntry.getPopulationFrequencyIndex(), - gtEntry.getPopulationFrequencyIndexOffset(), - gtEntry.getPopulationFrequencyIndexLength()); - this.fileIndex = gtEntry.getFileIndex() == null - ? null - : new BitInputStream(gtEntry.getFileIndex(), - gtEntry.getFileIndexOffset(), - gtEntry.getFileIndexLength()); + this.ctIndex = gtEntry.getConsequenceTypeIndexStream(); + this.btIndex = gtEntry.getBiotypeIndexStream(); + this.ctBtIndex = gtEntry.getCtBtIndexStream(); + this.popFreq = gtEntry.getPopulationFrequencyIndexStream(); + this.clinicalIndex = gtEntry.getClinicalIndexStream(); + this.fileIndex = gtEntry.getFileIndexStream(); } @Override @@ -260,7 +253,7 @@ public boolean isMultiFileIndex() { public boolean isMultiFileIndex(int i) { // configuration.getFileIndex().getMultiFileIndex().readAndDecode() - return schema.getFileIndex().isMultiFile(fileIndex, i * fileDataIndexesBitsLength); + return schema.getFileIndex().isMultiFile(fileIndex, i); } private int nextFileIndex() { @@ -291,7 +284,7 @@ public BitBuffer nextMultiFileIndexEntry() { } private BitBuffer getFileIndex(int i) { - return fileIndex.getBitBuffer(i * fileDataIndexesBitsLength, fileDataIndexesBitsLength); + return schema.getFileIndex().read(fileIndex, i); } @Override @@ -317,6 +310,7 @@ public AnnotationIndexEntry nextAnnotationIndexEntry() { annotationIndexEntry.setHasSummaryIndex(false); annotationIndexEntry.setHasCtIndex(false); annotationIndexEntry.setHasBtIndex(false); + annotationIndexEntry.setHasClinical(false); AnnotationIndexEntry.CtBtCombination ctBtCombination = annotationIndexEntry.getCtBtCombination(); ctBtCombination.setNumCt(0); ctBtCombination.setNumBt(0); @@ -328,38 +322,33 @@ public AnnotationIndexEntry nextAnnotationIndexEntry() { if (nonIntergenic) { int nextNonIntergenic = nextNonIntergenicIndex(); - if (gtEntry.getConsequenceTypeIndex() != null) { - annotationIndexEntry.setCtIndex(gtEntry.getConsequenceTypeIndex(nextNonIntergenic)); + if (ctIndex != null) { + annotationIndexEntry.setCtIndex(schema.getCtIndex().readFieldValue(ctIndex, nextNonIntergenic)); } - if (gtEntry.getBiotypeIndex() != null) { - annotationIndexEntry.setBtIndex(gtEntry.getBiotypeIndex(nextNonIntergenic)); + if (btIndex != null) { + annotationIndexEntry.setBtIndex(schema.getBiotypeIndex().readFieldValue(btIndex, nextNonIntergenic)); } if (ctBtIndex != null && annotationIndexEntry.getCtIndex() != 0 && annotationIndexEntry.getBtIndex() != 0) { - int numCt = Integer.bitCount(Short.toUnsignedInt(annotationIndexEntry.getCtIndex())); - int numBt = Integer.bitCount(Byte.toUnsignedInt(annotationIndexEntry.getBtIndex())); - ctBtCombination.setNumCt(numCt); - ctBtCombination.setNumBt(numBt); - ctBtCombination.setCtBtMatrix(ctBtIndex.readBytes(numCt, numBt)); + schema.getCtBtIndex().getField() + .read(ctBtIndex, annotationIndexEntry.getCtIndex(), annotationIndexEntry.getBtIndex(), ctBtCombination); } } } - byte[] popFreqIndex; if (popFreq != null) { - popFreqIndex = popFreq.readBytes(schema.getConfiguration().getPopulationRanges().size(), - AnnotationIndexConverter.POP_FREQ_SIZE); - } else { - popFreqIndex = null; + // TODO: Reuse BitBuffer + BitBuffer popFreqIndex = popFreq.readBitBuffer(schema.getPopFreqIndex().getBitsLength()); + annotationIndexEntry.setPopFreqIndex(popFreqIndex); } - annotationIndexEntry.setPopFreqIndex(popFreqIndex); if (gtEntry.getClinicalIndex() != null) { boolean clinical = AbstractSampleIndexEntryFilter.isClinical(annotationIndexEntry.getSummaryIndex()); - annotationIndexEntry.setClinical(clinical); + annotationIndexEntry.setHasClinical(clinical); if (clinical) { int nextClinical = nextClinicalIndex(); - annotationIndexEntry.setClinicalIndex(gtEntry.getClinicalIndex(nextClinical)); + // TODO: Reuse BitBuffer + annotationIndexEntry.setClinicalIndex(schema.getClinicalIndexSchema().read(clinicalIndex, nextClinical)); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java index c2c08c95671..4c3a3be162f 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverterTest.java @@ -7,13 +7,13 @@ import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; +import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; import java.util.Arrays; import java.util.Collections; import java.util.List; -import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter.*; @@ -26,6 +26,7 @@ public class AnnotationIndexConverterTest { private AnnotationIndexConverter converter; byte b; + private SampleIndexSchema schema; @Before public void setUp() throws Exception { @@ -37,10 +38,12 @@ public void setUp() throws Exception { "STUDY:POP_5", "STUDY:POP_6" ); - SampleIndexConfiguration configuration = new SampleIndexConfiguration(); + SampleIndexConfiguration configuration = SampleIndexConfiguration.defaultConfiguration(); + configuration.getPopulationRanges().clear(); populations.stream().map(SampleIndexConfiguration.PopulationFrequencyRange::new).forEach(configuration::addPopulationRange); - converter = new AnnotationIndexConverter(new SampleIndexSchema(configuration)); + schema = new SampleIndexSchema(configuration); + converter = new AnnotationIndexConverter(schema); } // @After @@ -88,7 +91,7 @@ public void testLofeProteinDifferentTranscript() { @Test public void testCtBtCombination() { AnnotationIndexEntry entry = converter.convert(annot(ct("missense_variant", "pseudogene"), ct("pseudogene", "protein_coding"))); - byte[] ctBtIndex = entry.getCtBtCombination().getCtBtMatrix(); + int[] ctBtIndex = entry.getCtBtCombination().getCtBtMatrix(); assertEquals(1, ctBtIndex.length); assertEquals(1, entry.getCtBtCombination().getNumCt()); assertEquals(1, entry.getCtBtCombination().getNumBt()); @@ -118,6 +121,7 @@ public void testCtBtCombination() { ct("stop_lost", "processed_transcript"), ct("stop_gained", "pseudogene"))); ctBtIndex = entry.getCtBtCombination().getCtBtMatrix(); + System.out.println("entry = " + entry); assertEquals(4, ctBtIndex.length); assertEquals(4, entry.getCtBtCombination().getNumCt()); assertEquals(2, entry.getCtBtCombination().getNumBt()); // protein_coding + processed_transcript. biotype "other" does not count @@ -173,19 +177,30 @@ public void testDuplicatedPopulations() { @Test public void testPopFreqMulti() { - assertArrayEquals(new byte[]{0b11, 0, 0, 0, 0, 0}, + assertEquals(getPopFreqBitBuffer(new byte[]{0b11, 0, 0, 0, 0, 0}), converter.convert(annot(pf("STUDY", "POP_1", 0.5))).getPopFreqIndex()); - assertArrayEquals(new byte[]{0b11, 0, 0, 0, 0, 0}, + assertEquals(getPopFreqBitBuffer(new byte[]{0b11, 0, 0, 0, 0, 0}), converter.convert(annot(pf("STUDY", "POP_1", 0.5), pf(K_GENOMES, "ALL", 0.3))).getPopFreqIndex()); - assertArrayEquals(new byte[]{0b11, 0, 0, 0, 0, 0}, + assertEquals(getPopFreqBitBuffer(new byte[]{0b11, 0, 0, 0, 0, 0}), converter.convert(annot(pf("STUDY", "POP_1", 0.5), pf("STUDY", "POP_2", 0))).getPopFreqIndex()); - assertArrayEquals(new byte[]{0b11, 0b10, 0, 0, 0, 0}, + assertEquals(getPopFreqBitBuffer(new byte[]{0b11, 0b10, 0, 0, 0, 0}), converter.convert(annot(pf("STUDY", "POP_1", 0.5), pf("STUDY", "POP_2", 0.00501))).getPopFreqIndex()); - assertArrayEquals(new byte[]{0b11, 0, 0, 0b01, 0b11, 0}, + assertEquals(getPopFreqBitBuffer(new byte[]{0b11, 0, 0, 0b01, 0b11, 0}), converter.convert(annot(pf("STUDY", "POP_1", 0.5), pf("STUDY", "POP_4", 0.001), pf("STUDY", "POP_5", 0.5))).getPopFreqIndex()); } + private BitBuffer getPopFreqBitBuffer(byte[] bytes) { + BitBuffer bitBuffer = new BitBuffer(schema.getPopFreqIndex().getBitsLength()); + int offset = 0; + int bitsLength = schema.getPopFreqIndex().getFields().get(0).getBitLength(); + for (byte b : bytes) { + bitBuffer.setBytePartial(b, offset, bitsLength); + offset += bitsLength; + } + return bitBuffer; + } + public static VariantAnnotation annot() { VariantAnnotation variantAnnotation = new VariantAnnotation(); variantAnnotation.setConsequenceTypes(Arrays.asList(ct("intergenic_variant"))); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexPutBuilderTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexPutBuilderTest.java deleted file mode 100644 index 5bc1b9fb776..00000000000 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexPutBuilderTest.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.opencb.opencga.storage.hadoop.variant.index.annotation; - -import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.util.Bytes; -import org.junit.Test; - -import java.util.Map; -import java.util.stream.Collectors; - -import static org.junit.Assert.assertEquals; - -public class AnnotationIndexPutBuilderTest { - - public static final byte[] FAMILY = {'0'}; - - @Test - public void testBuilder() { - AnnotationIndexPutBuilder builder = new AnnotationIndexPutBuilder(); - for (int i = 0; i < 256; i++) { - builder.add(new AnnotationIndexEntry( - (byte) i, - i % 2 == 0, - (short) i, - (byte) i, - new byte[Integer.bitCount((short) i)], - new byte[]{ - (byte) ((i & 0b1100) >> 2), - (byte) (i & 0b0011)}, - i % 2 == 0, (byte) i)); - } - - Put put = new Put(new byte[]{0}); - builder.buildAndReset(put, "0/1", FAMILY); - - Map map = put.getFamilyCellMap().get(FAMILY).stream() - .collect(Collectors.toMap(cell -> Bytes.toString(CellUtil.cloneQualifier(cell)), CellUtil::cloneValue)); - - byte[] a = map.get("_A_0/1"); - byte[] bt = map.get("_BT_0/1"); - byte[] ct = map.get("_CT_0/1"); - byte[] pf = map.get("_PF_0/1"); -// byte[] ac = map.get("_AC_0/1"); - -// for (Map.Entry entry : map.entrySet()) { -// System.out.println(entry.getKey()); -// for (byte b : entry.getValue()) { -// System.out.print(IndexUtils.byteToString(b)+", "); -// } -// System.out.println(""); -// } - - assertEquals(256, a.length); - assertEquals(256 / 2, pf.length); - assertEquals(256 / 2, bt.length); - assertEquals(256 / 2 * Short.BYTES, ct.length); - - - int genicCount = 0; - for (int i = 0; i < 256; i++) { - assertEquals((byte) i, a[i]); - if (i % 2 == 1) { - assertEquals((byte) i, bt[genicCount]); - assertEquals((short) i, Bytes.toShort(ct, genicCount * Short.BYTES, 2)); - genicCount++; - } - byte b = pf[i / 2]; -// System.out.println("-------"); -// System.out.println("i = " + i + ", " + IndexUtils.byteToString((byte) i)); -// System.out.println("b = " + b + ", " + IndexUtils.byteToString(b)); -// System.out.println("i%4 = " + i % 4); - - byte b1 = (byte) ((b >>> (i % 2 * 4 )) & 0b11); -// System.out.println("(b >>> (i % 2 * 4 )) & 0b11 = " + b + ", " + IndexUtils.byteToString(b1)); -// System.out.println("(b >>> ( " + (i % 2 * 4) + " )) & 0b11 = " + b + ", " + IndexUtils.byteToString(b1)); - - byte b2 = (byte) ((b >>> (i % 2 * 4 + 2)) & 0b11); -// System.out.println("(b >>> (i % 2 * 4 + 2)) & 0b11 = " + b + ", " + IndexUtils.byteToString(b2)); -// System.out.println("(b >>> ( " + (i % 2 * 4 + 2) + " )) & 0b11 = " + b + ", " + IndexUtils.byteToString(b2)); - -// System.out.println("(byte) (i & 0b1100) >> 2 " + IndexUtils.byteToString((byte) ((i & 0b1100) >> 2))); -// System.out.println("(byte) (i & 0b0011) " + IndexUtils.byteToString((byte) (i & 0b0011))); - assertEquals((byte) (i & 0b1100) >> 2, b1); - assertEquals((byte) (i & 0b0011), b2); - } - } - - @Test - public void testOddNumberOfPopFreq() { - int N = 3; - AnnotationIndexPutBuilder builder = new AnnotationIndexPutBuilder(); - int pfValue = 0; - for (int varIdx = 0; varIdx < 100; varIdx++) { - builder.add(new AnnotationIndexEntry( - (byte) 0, - false, - (short) 0, - (byte) 0, - new byte[0], - new byte[]{ - (byte) pfValue++, - (byte) pfValue++, - (byte) pfValue++}, - false, (byte) 0)); - } - - Put put = new Put(new byte[]{0}); - builder.buildAndReset(put, "0/1", FAMILY); - - byte[] pf = put.getFamilyCellMap().get(FAMILY).stream() - .collect(Collectors.toMap(cell -> Bytes.toString(CellUtil.cloneQualifier(cell)), CellUtil::cloneValue)).get("_PF_0/1"); - - pfValue = 0; - for (int varIdx = 0; varIdx < 100; varIdx++) { - for (int i = 0; i < N; i++) { - - int byteIdx = (varIdx * N + i) / 4; - byte b = pf[byteIdx]; - int bitIdx = (varIdx * N + i) % 4 * AnnotationIndexConverter.POP_FREQ_SIZE; - byte b1 = (byte) ((b >>> bitIdx) & 0b11); - assertEquals((byte) (pfValue++ & 0b11), b1); - } - } - - - } - -} \ No newline at end of file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexTest.java index b04a6d803ba..aea3c99d244 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexTest.java @@ -12,6 +12,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.response.VariantQueryResult; import org.opencb.opencga.storage.core.variant.VariantStorageBaseTest; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; @@ -83,7 +84,7 @@ public void before() throws Exception { public void testMendelianErrors() throws Exception { Set mendelianErrorVariants = new HashSet<>(); Set deNovoVariants = new HashSet<>(); - for (Variant variant : variantStorageEngine) { + for (Variant variant : variantStorageEngine.iterable(new Query(VariantQueryParam.INCLUDE_SAMPLE.key(), VariantQueryUtils.ALL), new QueryOptions())) { Genotype fatherGenotype = new Genotype(variant.getStudies().get(0).getSampleData(father, "GT")); Genotype motherGenotype = new Genotype(variant.getStudies().get(0).getSampleData(mother, "GT")); Genotype childGenotype = new Genotype(variant.getStudies().get(0).getSampleData(child, "GT")); @@ -142,7 +143,9 @@ public void testMendelianErrors() throws Exception { @Test public void testParentGtCode() { - VariantQueryResult all = variantStorageEngine.get(new Query(VariantQueryParam.INCLUDE_GENOTYPE.key(), true), new QueryOptions()); + VariantQueryResult all = variantStorageEngine.get(new Query() + .append(VariantQueryParam.INCLUDE_GENOTYPE.key(), true) + .append(VariantQueryParam.INCLUDE_SAMPLE.key(), VariantQueryUtils.ALL), new QueryOptions()); Query query = new Query() .append(VariantQueryParam.GENOTYPE.key(), child + ":0/1" @@ -170,7 +173,9 @@ public void testParentGtCode() { @Test public void testParentsGtCode() { - VariantQueryResult all = variantStorageEngine.get(new Query(VariantQueryParam.INCLUDE_GENOTYPE.key(), true), new QueryOptions()); + VariantQueryResult all = variantStorageEngine.get(new Query() + .append(VariantQueryParam.INCLUDE_GENOTYPE.key(), true) + .append(VariantQueryParam.INCLUDE_SAMPLE.key(), VariantQueryUtils.ALL), new QueryOptions()); Query query = new Query() .append(VariantQueryParam.GENOTYPE.key(), child + ":0/1" diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java index f95d91ecd01..ad5ef625383 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexEntryFilterTest.java @@ -9,20 +9,20 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.commons.datastore.core.Query; import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration.PopulationFrequencyRange; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; +import org.opencb.opencga.storage.core.variant.dummy.DummyVariantStorageMetadataDBAdaptorFactory; +import org.opencb.opencga.storage.core.variant.query.OpValue; import org.opencb.opencga.storage.core.variant.query.Values; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; -import org.opencb.opencga.storage.core.variant.dummy.DummyVariantStorageMetadataDBAdaptorFactory; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; -import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexPutBuilder; +import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleAnnotationIndexQuery; -import org.opencb.opencga.storage.hadoop.variant.index.query.SampleAnnotationIndexQuery.PopulationFrequencyQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleFileIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SampleIndexQuery; import org.opencb.opencga.storage.hadoop.variant.index.query.SingleSampleIndexQuery; -import org.opencb.opencga.core.config.storage.SampleIndexConfiguration.PopulationFrequencyRange; import java.util.Arrays; import java.util.Collections; @@ -30,8 +30,7 @@ import java.util.Map; import java.util.stream.Collectors; -import static org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverterTest.annot; -import static org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverterTest.ct; +import static org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverterTest.*; public class SampleIndexEntryFilterTest { @@ -39,7 +38,9 @@ public class SampleIndexEntryFilterTest { @Before public void setUp() throws Exception { - schema = new SampleIndexSchema(new SampleIndexConfiguration() + SampleIndexConfiguration configuration = SampleIndexConfiguration.defaultConfiguration(); + configuration.getPopulationRanges().clear(); + schema = new SampleIndexSchema(configuration .addPopulationRange(new PopulationFrequencyRange("s1", "ALL")) .addPopulationRange(new PopulationFrequencyRange("s2", "ALL")) .addPopulationRange(new PopulationFrequencyRange("s3", "ALL")) @@ -48,24 +49,32 @@ public void setUp() throws Exception { } @Test - public void testPopFreqQueryOR() { + public void testPopFreqQuery() { List result; SingleSampleIndexQuery query; - // Partial OR query should always return ALL values - query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.OR, true, buildPopulationFrequencyQuery("s2", 0, 1)); + query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.OR, + buildPopulationFrequencyQuery("s2", "<", 0.001)); result = new SampleIndexEntryFilter(query).filter(getSampleIndexEntry1()).stream().map(Variant::toString).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("1:10:A:T", "1:20:A:T", "1:30:A:T", "1:40:A:T", "1:50:A:T"), result); - Assert.assertEquals(5, new SampleIndexEntryFilter(query).filterAndCount(getSampleIndexEntry1())); + Assert.assertEquals(Arrays.asList("1:10:A:T", "1:50:A:T"), result); + Assert.assertEquals(2, new SampleIndexEntryFilter(query).filterAndCount(getSampleIndexEntry1())); - query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.OR, false, buildPopulationFrequencyQuery("s2", 0, 1)); + query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.OR, + buildPopulationFrequencyQuery("s3", "<", 0.01)); result = new SampleIndexEntryFilter(query).filter(getSampleIndexEntry1()).stream().map(Variant::toString).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("1:10:A:T"), result); + Assert.assertEquals(Arrays.asList("1:20:A:T", "1:30:A:T", "1:50:A:T"), result); + Assert.assertEquals(3, new SampleIndexEntryFilter(query).filterAndCount(getSampleIndexEntry1())); + + query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.AND, + buildPopulationFrequencyQuery("s2", "<", 0.001), + buildPopulationFrequencyQuery("s3", "<", 0.01)); + result = new SampleIndexEntryFilter(query).filter(getSampleIndexEntry1()).stream().map(Variant::toString).collect(Collectors.toList()); + Assert.assertEquals(Arrays.asList("1:50:A:T"), result); Assert.assertEquals(1, new SampleIndexEntryFilter(query).filterAndCount(getSampleIndexEntry1())); - query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.OR, false, - buildPopulationFrequencyQuery("s2", 0, 3), - buildPopulationFrequencyQuery("s3", 0, 3)); + query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.OR, + buildPopulationFrequencyQuery("s2", "<", 0.001), + buildPopulationFrequencyQuery("s3", "<", 0.01)); result = new SampleIndexEntryFilter(query).filter(getSampleIndexEntry1()).stream().map(Variant::toString).collect(Collectors.toList()); Assert.assertEquals(Arrays.asList("1:10:A:T", "1:20:A:T", "1:30:A:T", "1:50:A:T"), result); Assert.assertEquals(4, new SampleIndexEntryFilter(query).filterAndCount(getSampleIndexEntry1())); @@ -78,34 +87,6 @@ public void testPopFreqQueryOR() { Assert.assertEquals(4, new SampleIndexEntryFilter(query).filterAndCount(e)); } - @Test - public void testPopFreqQueryAND() { - SingleSampleIndexQuery query; - List result; - query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.AND, true, buildPopulationFrequencyQuery("s2", 0, 1)); - result = new SampleIndexEntryFilter(query).filter(getSampleIndexEntry1()).stream().map(Variant::toString).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("1:10:A:T"), result); - - - query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.AND, false, buildPopulationFrequencyQuery("s2", 0, 1)); - result = new SampleIndexEntryFilter(query).filter(getSampleIndexEntry1()).stream().map(Variant::toString).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("1:10:A:T"), result); - - - query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.AND, false, - buildPopulationFrequencyQuery("s2", 2, 4), - buildPopulationFrequencyQuery("s3", 2, 4)); - result = new SampleIndexEntryFilter(query).filter(getSampleIndexEntry1()).stream().map(Variant::toString).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("1:30:A:T", "1:40:A:T"), result); - - query = getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation.AND, false, - buildPopulationFrequencyQuery("s2", 0, 4), - buildPopulationFrequencyQuery("s3", 1, 4), - buildPopulationFrequencyQuery("s4", 2, 4)); - result = new SampleIndexEntryFilter(query).filter(getSampleIndexEntry1()).stream().map(Variant::toString).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("1:20:A:T", "1:40:A:T"), result); - } - @Test public void testCtBtCombinationFilter() { SingleSampleIndexQuery query; @@ -137,20 +118,70 @@ public void testCtBtCombinationFilter() { } private SampleIndexEntry getSampleIndexEntry1() { - byte[] pf = new AnnotationIndexPutBuilder() // s1 s2 s3 s4 s5 - .add(new AnnotationIndexEntry((byte) 0, false, (short) 0, (byte) 0, new byte[0], new byte[]{ 0, 0, 0, 0, 3 }, false, (byte) 0)) // 1:10:A:T - .add(new AnnotationIndexEntry((byte) 0, false, (short) 0, (byte) 0, new byte[0], new byte[]{ 0, 1, 2, 3, 3 }, false, (byte) 0)) // 1:20:A:T - .add(new AnnotationIndexEntry((byte) 0, false, (short) 0, (byte) 0, new byte[0], new byte[]{ 0, 2, 3, 1, 3 }, false, (byte) 0)) // 1:30:A:T - .add(new AnnotationIndexEntry((byte) 0, false, (short) 0, (byte) 0, new byte[0], new byte[]{ 0, 3, 3, 3, 3 }, false, (byte) 0)) // 1:40:A:T - .add(new AnnotationIndexEntry((byte) 0, false, (short) 0, (byte) 0, new byte[0], new byte[]{ 0, 1, 0, 3, 3 }, false, (byte) 0)) // 1:50:A:T + AnnotationIndexConverter converter = new AnnotationIndexConverter(schema); + //{0.001, 0.005, 0.01}; + Map map = new AnnotationIndexPutBuilder() + .add(converter.convert(annot( + pf("s1", "ALL", 0.0), + pf("s2", "ALL", 0.0), + pf("s3", "ALL", 0.1), + pf("s4", "ALL", 0.0), + pf("s5", "ALL", 0.5) + ))) + .add(converter.convert(annot( + pf("s1", "ALL", 0.0), + pf("s2", "ALL", 0.01), + pf("s3", "ALL", 0.005), + pf("s4", "ALL", 0.5), + pf("s5", "ALL", 0.5) + ))) + .add(converter.convert(annot( + pf("s1", "ALL", 0.0), + pf("s2", "ALL", 0.01), + pf("s3", "ALL", 0.005), + pf("s4", "ALL", 0.1), + pf("s5", "ALL", 0.1) + ))) + .add(converter.convert(annot( + pf("s1", "ALL", 0.0), + pf("s2", "ALL", 0.01), + pf("s3", "ALL", 0.1), + pf("s4", "ALL", 0.1), + pf("s5", "ALL", 0.1) + ))) + .add(converter.convert(annot( +// pf("s1", "ALL", 0.0), + pf("s2", "ALL", 0.0001), + pf("s3", "ALL", 0.005), + pf("s4", "ALL", 0.1), + pf("s5", "ALL", 0.1) + ))) .buildAndReset(new Put(new byte[1]), "0/1", new byte[1]) - .getFamilyCellMap().get(new byte[1]) + .getFamilyCellMap() + .get(new byte[1]) .stream() - .collect(Collectors.toMap(cell -> Bytes.toString(CellUtil.cloneQualifier(cell)), CellUtil::cloneValue)).get("_PF_0/1"); + .collect(Collectors.toMap(cell -> Bytes.toString(CellUtil.cloneQualifier(cell)), CellUtil::cloneValue)); + + + +// byte[] pf = new AnnotationIndexPutBuilder() // s1 s2 s3 s4 s5 +// .add(new AnnotationIndexEntry((byte) 0, false, 0, 0, null, new BitBuffer(new byte[]{ 0, 0, 0, 0, 3 }), false, null)) // 1:10:A:T +// .add(new AnnotationIndexEntry((byte) 0, false, 0, 0, null, new BitBuffer(new byte[]{ 0, 1, 2, 3, 3 }), false, null)) // 1:20:A:T +// .add(new AnnotationIndexEntry((byte) 0, false, 0, 0, null, new BitBuffer(new byte[]{ 0, 2, 3, 1, 3 }), false, null)) // 1:30:A:T +// .add(new AnnotationIndexEntry((byte) 0, false, 0, 0, null, new BitBuffer(new byte[]{ 0, 3, 3, 3, 3 }), false, null)) // 1:40:A:T +// .add(new AnnotationIndexEntry((byte) 0, false, 0, 0, null, new BitBuffer(new byte[]{ 0, 1, 0, 3, 3 }), false, null)) // 1:50:A:T +// .buildAndReset(new Put(new byte[1]), "0/1", new byte[1]) +// .getFamilyCellMap().get(new byte[1]) +// .stream() +// .collect(Collectors.toMap(cell -> Bytes.toString(CellUtil.cloneQualifier(cell)), CellUtil::cloneValue)).get("_PF_0/1"); SampleIndexEntry entry = new SampleIndexEntry(0, "1", 0); entry.getGtEntry("0/1") - .setPopulationFrequencyIndex(pf) +// .setAnnotationIndex(map.get("_A_0/1")) +// .setCtBtIndex(map.get("_CB_0/1")) +// .setConsequenceTypeIndex(map.get("_CT_0/1")) +// .setBiotypeIndex(map.get("_BT_0/1")) + .setPopulationFrequencyIndex(map.get("_PF_0/1")) .setCount(5) .setVariants(toBytes( "1:10:A:T", @@ -163,7 +194,7 @@ private SampleIndexEntry getSampleIndexEntry1() { } private SampleIndexEntry getSampleIndexEntry2() { - AnnotationIndexConverter converter = new AnnotationIndexConverter(SampleIndexSchema.defaultSampleIndexSchema()); + AnnotationIndexConverter converter = new AnnotationIndexConverter(schema); Map map = new AnnotationIndexPutBuilder() .add(converter.convert(annot( @@ -206,11 +237,8 @@ private byte[] toBytes(String... variants) { return new SampleIndexVariantBiConverter(schema).toBytes(Arrays.stream(variants).map(Variant::new).collect(Collectors.toList())); } - private PopulationFrequencyQuery buildPopulationFrequencyQuery(String study, int minFreqInclusive, int maxFreqExclusive) { - return new PopulationFrequencyQuery(Integer.valueOf(study.substring(1)) - 1, study, "ALL", - -1, -1, - (byte) minFreqInclusive, - (byte) maxFreqExclusive); + private RangeIndexFieldFilter buildPopulationFrequencyQuery(String study, String op, double value) { + return (RangeIndexFieldFilter) schema.getPopFreqIndex().getField(study, "ALL").buildFilter(new OpValue<>(op, value)); } private SingleSampleIndexQuery getSingleSampleIndexQuery(Query query) { @@ -221,13 +249,15 @@ private SingleSampleIndexQuery getSingleSampleIndexQuery(Query query) { return getSingleSampleIndexQuery(annotQuery); } - private SingleSampleIndexQuery getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation op, - boolean partial, - PopulationFrequencyQuery... frequencyQuery) { - SampleAnnotationIndexQuery annotationIndexQuery = new SampleAnnotationIndexQuery(new byte[2], (short) 0, (byte) 0, - (byte) 0, op, - Arrays.asList(frequencyQuery), - partial); + private SingleSampleIndexQuery getSingleSampleIndexQuery(VariantQueryUtils.QueryOperation op, RangeIndexFieldFilter... frequencyQuery) { + SampleAnnotationIndexQuery annotationIndexQuery = new SampleAnnotationIndexQuery( + new byte[2], + schema.getCtIndex().getField().noOpFilter(), + schema.getBiotypeIndex().getField().noOpFilter(), + schema.getCtBtIndex().getField().noOpFilter(), + schema.getClinicalIndexSchema().noOpFilter(), + schema.getPopFreqIndex().buildFilter(Arrays.asList(frequencyQuery), op)); + // TODO: what about Partial? return getSingleSampleIndexQuery(annotationIndexQuery); } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java index 352a71aafd9..fae085a068a 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java @@ -3,7 +3,6 @@ import htsjdk.variant.vcf.VCFConstants; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.Pair; -import org.hamcrest.CoreMatchers; import org.junit.Before; import org.junit.Test; import org.opencb.biodata.models.core.Region; @@ -12,18 +11,18 @@ import org.opencb.biodata.models.variant.metadata.VariantFileHeaderComplexLine; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.TaskMetadata; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; +import org.opencb.opencga.core.models.variant.VariantAnnotationConstants; import org.opencb.opencga.storage.core.variant.dummy.DummyVariantStorageMetadataDBAdaptorFactory; import org.opencb.opencga.storage.core.variant.query.Values; import org.opencb.opencga.storage.core.variant.query.VariantQueryParser; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter; import org.opencb.opencga.storage.hadoop.variant.index.core.IndexField; -import org.opencb.opencga.core.config.storage.IndexFieldConfiguration; import org.opencb.opencga.storage.hadoop.variant.index.core.RangeIndexField; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.IndexFieldFilter; import org.opencb.opencga.storage.hadoop.variant.index.core.filters.RangeIndexFieldFilter; @@ -39,8 +38,8 @@ import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; -import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.ANTISENSE; -import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.PROTEIN_CODING; +import static org.opencb.opencga.core.models.variant.VariantAnnotationConstants.ANTISENSE; +import static org.opencb.opencga.core.models.variant.VariantAnnotationConstants.PROTEIN_CODING; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.*; import static org.opencb.opencga.storage.hadoop.variant.index.IndexUtils.EMPTY_MASK; import static org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter.*; @@ -61,21 +60,24 @@ public class SampleIndexQueryParserTest { private FileIndexSchema fileIndex; private double[] qualThresholds; private double[] dpThresholds; + private SampleIndexConfiguration configuration; @Before public void setUp() throws Exception { - SampleIndexSchema configuration = new SampleIndexSchema(SampleIndexConfiguration.defaultConfiguration() + configuration = SampleIndexConfiguration.defaultConfiguration() .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s1", "ALL")) .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s2", "ALL")) .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s3", "ALL")) - .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s4", "ALL"))); - fileIndex = configuration.getFileIndex(); + .addPopulationRange(new SampleIndexConfiguration.PopulationFrequencyRange("s4", "ALL")); + + SampleIndexSchema schema = new SampleIndexSchema(configuration); + fileIndex = schema.getFileIndex(); qualThresholds = fileIndex.getCustomField(IndexFieldConfiguration.Source.FILE, StudyEntry.QUAL).getConfiguration().getThresholds(); dpThresholds = fileIndex.getCustomField(IndexFieldConfiguration.Source.SAMPLE, VCFConstants.DEPTH_KEY).getConfiguration().getThresholds(); DummyVariantStorageMetadataDBAdaptorFactory.clear(); mm = new VariantStorageMetadataManager(new DummyVariantStorageMetadataDBAdaptorFactory()); - sampleIndexQueryParser = new SampleIndexQueryParser(mm, configuration); + sampleIndexQueryParser = new SampleIndexQueryParser(mm, schema); studyId = mm.createStudy("study").getId(); mm.addIndexedFiles(studyId, Arrays.asList(mm.registerFile(studyId, "F1", Arrays.asList("S1", "S2", "S3")))); @@ -670,142 +672,149 @@ private void checkIntergenic(Boolean intergenic, Query query) { } } - @Test - public void parseConsequenceTypeMaskTest() { - assertEquals(EMPTY_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "synonymous_variant")).getConsequenceTypeMask()); - assertEquals(CT_MISSENSE_VARIANT_MASK | CT_START_LOST_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "missense_variant,start_lost")).getConsequenceTypeMask()); - assertEquals(CT_START_LOST_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "start_lost")).getConsequenceTypeMask()); - assertEquals(CT_STOP_GAINED_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_gained")).getConsequenceTypeMask()); - assertEquals(CT_STOP_LOST_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_lost")).getConsequenceTypeMask()); - assertEquals(CT_STOP_GAINED_MASK | CT_STOP_LOST_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_gained,stop_lost")).getConsequenceTypeMask()); - - assertEquals(CT_MISSENSE_VARIANT_MASK | CT_STOP_LOST_MASK | CT_UTR_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_lost,missense_variant,3_prime_UTR_variant")).getConsequenceTypeMask()); - assertEquals(INTERGENIC_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_lost,missense_variant,3_prime_UTR_variant")).getAnnotationIndexMask()); - - // CT Filter covered by summary - assertEquals(EMPTY_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "missense_variant")).getConsequenceTypeMask()); - assertEquals(((short) LOF_SET.stream().mapToInt(AnnotationIndexConverter::getMaskFromSoName).reduce((a, b) -> a | b).getAsInt()), - parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), LOF_SET)).getConsequenceTypeMask()); - assertEquals(EMPTY_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), LOF_EXTENDED_SET)).getConsequenceTypeMask()); - - } - - @Test - public void parseBiotypeTypeMaskTest() { - assertEquals(BT_OTHER_NON_PSEUDOGENE, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "other_biotype")).getBiotypeMask()); - assertEquals(BT_PROTEIN_CODING_MASK | BT_MIRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "protein_coding,miRNA")).getBiotypeMask()); - assertEquals(BT_MIRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "miRNA")).getBiotypeMask()); - assertEquals(BT_LNCRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "lncRNA")).getBiotypeMask()); - assertEquals(BT_LNCRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "lincRNA")).getBiotypeMask()); - assertEquals(BT_LNCRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "lncRNA,lincRNA")).getBiotypeMask()); - assertEquals(BT_OTHER_NON_PSEUDOGENE | BT_PROTEIN_CODING_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "other_biotype,protein_coding")).getBiotypeMask()); - assertEquals(0, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "other_biotype,protein_coding,pseudogene")).getBiotypeMask()); - - // Ensure PROTEIN_CODING_MASK is not added to the summary - assertEquals(INTERGENIC_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "protein_coding,miRNA")).getAnnotationIndexMask()); - assertEquals(BT_PROTEIN_CODING_MASK | BT_MIRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "protein_coding,miRNA")).getBiotypeMask()); - - // Biotype Filter covered by summary - assertEquals(EMPTY_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "protein_coding")).getBiotypeMask()); - } +// @Test +// public void parseConsequenceTypeMaskTest() { +// assertEquals(EMPTY_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "synonymous_variant")).getConsequenceTypeMask()); +// assertEquals(CT_MISSENSE_VARIANT_MASK | CT_START_LOST_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "missense_variant,start_lost")).getConsequenceTypeMask()); +// assertEquals(CT_START_LOST_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "start_lost")).getConsequenceTypeMask()); +// assertEquals(CT_STOP_GAINED_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_gained")).getConsequenceTypeMask()); +// assertEquals(CT_STOP_LOST_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_lost")).getConsequenceTypeMask()); +// assertEquals(CT_STOP_GAINED_MASK | CT_STOP_LOST_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_gained,stop_lost")).getConsequenceTypeMask()); +// +// assertEquals(CT_MISSENSE_VARIANT_MASK | CT_STOP_LOST_MASK | CT_UTR_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_lost,missense_variant,3_prime_UTR_variant")).getConsequenceTypeMask()); +// assertEquals(INTERGENIC_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "stop_lost,missense_variant,3_prime_UTR_variant")).getAnnotationIndexMask()); +// +// // CT Filter covered by summary +// assertEquals(EMPTY_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), "missense_variant")).getConsequenceTypeMask()); +// assertEquals(((short) LOF_SET.stream().mapToInt(AnnotationIndexConverter::getMaskFromSoName).reduce((a, b) -> a | b).getAsInt()), +// parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), LOF_SET)).getConsequenceTypeMask()); +// assertEquals(EMPTY_MASK, parseAnnotationIndexQuery(new Query(ANNOT_CONSEQUENCE_TYPE.key(), LOF_EXTENDED_SET)).getConsequenceTypeMask()); +// +// } +// +// @Test +// public void parseBiotypeTypeMaskTest() { +// assertEquals(BT_OTHER_NON_PSEUDOGENE, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "other_biotype")).getBiotypeMask()); +// assertEquals(BT_PROTEIN_CODING_MASK | BT_MIRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "protein_coding,miRNA")).getBiotypeMask()); +// assertEquals(BT_MIRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "miRNA")).getBiotypeMask()); +// assertEquals(BT_LNCRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "lncRNA")).getBiotypeMask()); +// assertEquals(BT_LNCRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "lincRNA")).getBiotypeMask()); +// assertEquals(BT_LNCRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "lncRNA,lincRNA")).getBiotypeMask()); +// assertEquals(BT_OTHER_NON_PSEUDOGENE | BT_PROTEIN_CODING_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "other_biotype,protein_coding")).getBiotypeMask()); +// assertEquals(0, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "other_biotype,protein_coding,pseudogene")).getBiotypeMask()); +// +// // Ensure PROTEIN_CODING_MASK is not added to the summary +// assertEquals(INTERGENIC_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "protein_coding,miRNA")).getAnnotationIndexMask()); +// assertEquals(BT_PROTEIN_CODING_MASK | BT_MIRNA_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "protein_coding,miRNA")).getBiotypeMask()); +// +// // Biotype Filter covered by summary +// assertEquals(EMPTY_MASK, parseAnnotationIndexQuery(new Query(ANNOT_BIOTYPE.key(), "protein_coding")).getBiotypeMask()); +// } @Test public void parsePopFreqQueryTest() { - double[] default_ranges = SampleIndexConfiguration.PopulationFrequencyRange.DEFAULT_THRESHOLDS; + double[] default_ranges = configuration.getAnnotationIndexConfiguration().getPopulationFrequency().get(0).getThresholds(); for (int i = 0; i < default_ranges.length; i++) { - SampleAnnotationIndexQuery.PopulationFrequencyQuery q; + RangeIndexFieldFilter q; double r = default_ranges[i]; // System.out.println("--------------"); // System.out.println(r); final double d = DELTA * 10; - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<" + (r - d))).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<" + (r - d))).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(0, q.getMinCodeInclusive()); assertEquals(i + 1, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<=" + (r - d))).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<=" + (r - d))).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(0, q.getMinCodeInclusive()); assertEquals(i + 1, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<" + r)).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<" + r)).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(0, q.getMinCodeInclusive()); assertEquals(i + 1, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<=" + r)).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<=" + r)).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(0, q.getMinCodeInclusive()); assertEquals(i + 2, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<" + (r + d))).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL<" + (r + d))).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(0, q.getMinCodeInclusive()); assertEquals(i + 2, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>=" + r)).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>=" + r)).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(i + 1, q.getMinCodeInclusive()); assertEquals(4, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>" + r)).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>" + r)).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(i + 1, q.getMinCodeInclusive()); assertEquals(4, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>" + (r + d))).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>" + (r + d))).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(i + 1, q.getMinCodeInclusive()); assertEquals(4, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>=" + (r + d))).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>=" + (r + d))).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(i + 1, q.getMinCodeInclusive()); assertEquals(4, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>" + (r - d))).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>" + (r - d))).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(i, q.getMinCodeInclusive()); assertEquals(4, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>=" + (r - d))).getPopulationFrequencyQueries().get(0); + q = (RangeIndexFieldFilter) parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s" + (i % 4 + 1) + ":ALL>=" + (r - d))).getPopulationFrequencyFilter().getFilters().get(0); // System.out.println(q); assertEquals(i, q.getMinCodeInclusive()); assertEquals(4, q.getMaxCodeExclusive()); - assertEquals(i % 4 + 1 + 1, q.getPosition()); +// assertEquals(i % 4 + 1 + 1, q.getPosition()); //FIXME _ 20210608 } SampleAnnotationIndexQuery q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s8:NONE>0.1")); - assertEquals(0, q.getPopulationFrequencyQueries().size()); + assertEquals(0, q.getPopulationFrequencyFilter().getFilters().size()); - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s2:ALL>0.1;s8:NONE>0.1")); - assertEquals(1, q.getPopulationFrequencyQueries().size()); - assertEquals(QueryOperation.AND, q.getPopulationFrequencyQueryOperator()); - assertEquals(true, q.isPopulationFrequencyQueryPartial()); + Query query = new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s2:ALL<0.01;s8:NONE<0.01"); + q = parseAnnotationIndexQuery(query, true); + assertEquals(1, q.getPopulationFrequencyFilter().getFilters().size()); + assertEquals(null, q.getPopulationFrequencyFilter().getOp()); + assertEquals(true, q.getPopulationFrequencyFilter().isExactFilter()); + assertEquals(false, query.isEmpty()); // Partial OR queries can not be used - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s2:ALL>0.1,s8:NONE>0.1")); - assertEquals(0, q.getPopulationFrequencyQueries().size()); - assertEquals(QueryOperation.OR, q.getPopulationFrequencyQueryOperator()); - assertEquals(true, q.isPopulationFrequencyQueryPartial()); - - q = parseAnnotationIndexQuery(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s2:ALL>0.1,s3:ALL>0.1")); - assertEquals(2, q.getPopulationFrequencyQueries().size()); - assertEquals(QueryOperation.OR, q.getPopulationFrequencyQueryOperator()); - assertEquals(false, q.isPopulationFrequencyQueryPartial()); + query = new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s2:ALL<0.01,s8:NONE<0.01"); + q = parseAnnotationIndexQuery(query, true); + assertEquals(0, q.getPopulationFrequencyFilter().getFilters().size()); + assertEquals(null, q.getPopulationFrequencyFilter().getOp()); + assertEquals(false, q.getPopulationFrequencyFilter().isExactFilter()); + assertEquals(false, query.isEmpty()); + + query = new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "s2:ALL<0.01,s3:ALL<0.01"); + q = parseAnnotationIndexQuery(query, true); + assertEquals(2, q.getPopulationFrequencyFilter().getFilters().size()); + assertEquals(QueryOperation.OR, q.getPopulationFrequencyFilter().getOp()); + assertEquals(true, q.getPopulationFrequencyFilter().isExactFilter()); + System.out.println("query.toJson() = " + query.toJson()); + assertEquals(true, query.isEmpty()); } @Test @@ -910,12 +919,12 @@ public void testCoveredQuery_ct() { query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), String.join(OR, VariantAnnotationConstants.STOP_LOST)); parseAnnotationIndexQuery(query, false); indexQuery = parseAnnotationIndexQuery(query, false); - assertNotEquals(EMPTY_MASK, indexQuery.getConsequenceTypeMask()); + assertFalse(indexQuery.getConsequenceTypeFilter().isNoOp()); assertFalse(query.isEmpty()); // Index not complete query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), String.join(OR, VariantAnnotationConstants.MATURE_MIRNA_VARIANT)); indexQuery = parseAnnotationIndexQuery(query, true); - assertNotEquals(EMPTY_MASK, indexQuery.getConsequenceTypeMask()); + assertFalse(indexQuery.getConsequenceTypeFilter().isNoOp()); assertFalse(query.isEmpty()); // Imprecise CT value } @@ -953,7 +962,8 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(0, indexQuery.getPopulationFrequencyQueries().size()); + assertEquals(0, indexQuery.getPopulationFrequencyFilter().getFilters().size()); + assertEquals(true, indexQuery.getPopulationFrequencyFilter().isNoOp()); assertTrue(query.isEmpty()); // Partial summary usage. Also use PopFreqIndex. Clear query @@ -961,7 +971,7 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(1, indexQuery.getPopulationFrequencyQueries().size()); + assertEquals(1, indexQuery.getPopulationFrequencyFilter().getFilters().size()); assertTrue(query.isEmpty()); // Partial summary usage, filter more restrictive. Also use PopFreqIndex. Clear query @@ -969,7 +979,7 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(1, indexQuery.getPopulationFrequencyQueries().size()); + assertEquals(1, indexQuery.getPopulationFrequencyFilter().getFilters().size()); assertFalse(query.isEmpty()); // Summary filter less restrictive. Do not use summary. Only use PopFreqIndex. Do not clear query @@ -977,7 +987,7 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(EMPTY_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(EMPTY_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(1, indexQuery.getPopulationFrequencyQueries().size()); + assertEquals(1, indexQuery.getPopulationFrequencyFilter().getFilters().size()); assertFalse(query.isEmpty()); // Summary index query plus a new filter. Use only popFreqIndex @@ -985,8 +995,8 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(EMPTY_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(EMPTY_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(QueryOperation.OR, indexQuery.getPopulationFrequencyQueryOperator()); - assertEquals(3, indexQuery.getPopulationFrequencyQueries().size()); + assertEquals(QueryOperation.OR, indexQuery.getPopulationFrequencyFilter().getOp()); + assertEquals(3, indexQuery.getPopulationFrequencyFilter().getFilters().size()); assertTrue(query.isEmpty()); // Summary index query with AND instead of OR filter. Use both, summary and popFreqIndex @@ -994,8 +1004,8 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(QueryOperation.AND, indexQuery.getPopulationFrequencyQueryOperator()); - assertEquals(2, indexQuery.getPopulationFrequencyQueries().size()); + assertEquals(QueryOperation.AND, indexQuery.getPopulationFrequencyFilter().getOp()); + assertEquals(2, indexQuery.getPopulationFrequencyFilter().getFilters().size()); assertTrue(query.isEmpty()); // Summary index query with AND instead of OR filter plus a new filter. Use both, summary and popFreqIndex. Leave eextra filter in query @@ -1003,8 +1013,8 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(QueryOperation.AND, indexQuery.getPopulationFrequencyQueryOperator()); - assertEquals(3, indexQuery.getPopulationFrequencyQueries().size()); + assertEquals(QueryOperation.AND, indexQuery.getPopulationFrequencyFilter().getOp()); + assertEquals(3, indexQuery.getPopulationFrequencyFilter().getFilters().size()); assertEquals("s1:ALL<0.05", query.getString(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key())); // Summary index query with AND instead of OR filter plus a new filter. Use both, summary and popFreqIndex. Clear covered query @@ -1012,8 +1022,8 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(QueryOperation.AND, indexQuery.getPopulationFrequencyQueryOperator()); - assertEquals(3, indexQuery.getPopulationFrequencyQueries().size()); + assertEquals(QueryOperation.AND, indexQuery.getPopulationFrequencyFilter().getOp()); + assertEquals(3, indexQuery.getPopulationFrequencyFilter().getFilters().size()); assertTrue(query.isEmpty()); // Intersect (AND) with an extra study not in index. Don't use summary, PopFreqIndex, and leave other filters in the query @@ -1021,9 +1031,9 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(EMPTY_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(EMPTY_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(QueryOperation.AND, indexQuery.getPopulationFrequencyQueryOperator()); - assertEquals(1, indexQuery.getPopulationFrequencyQueries().size()); - assertEquals("s1:ALL", indexQuery.getPopulationFrequencyQueries().get(0).getStudyPopulation()); + assertEquals(null, indexQuery.getPopulationFrequencyFilter().getOp()); + assertEquals(1, indexQuery.getPopulationFrequencyFilter().getFilters().size()); + assertEquals("s1:ALL", indexQuery.getPopulationFrequencyFilter().getFilters().get(0).getIndex().getConfiguration().getKey()); assertEquals("OtherStudy:ALL<0.8", query.getString(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key())); // Intersect (AND) with an extra study not in index. Use summary , PopFreqIndex, and leave other filters in the query @@ -1031,9 +1041,9 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(POP_FREQ_ANY_001_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(QueryOperation.AND, indexQuery.getPopulationFrequencyQueryOperator()); - assertEquals(1, indexQuery.getPopulationFrequencyQueries().size()); - assertEquals("GNOMAD_GENOMES:ALL", indexQuery.getPopulationFrequencyQueries().get(0).getStudyPopulation()); + assertEquals(null, indexQuery.getPopulationFrequencyFilter().getOp()); + assertEquals(1, indexQuery.getPopulationFrequencyFilter().getFilters().size()); + assertEquals("GNOMAD_GENOMES:ALL", indexQuery.getPopulationFrequencyFilter().getFilters().get(0).getIndex().getConfiguration().getKey()); assertEquals("OtherStudy:ALL<0.8", query.getString(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key())); // Union (OR) with an extra study not in index. Do not use index at all @@ -1041,8 +1051,8 @@ public void testCoveredQuery_popFreq() { indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(EMPTY_MASK, indexQuery.getAnnotationIndexMask() & POP_FREQ_ANY_001_MASK); assertEquals(EMPTY_MASK, indexQuery.getAnnotationIndex() & POP_FREQ_ANY_001_MASK); - assertEquals(QueryOperation.OR, indexQuery.getPopulationFrequencyQueryOperator()); - assertEquals(0, indexQuery.getPopulationFrequencyQueries().size()); + assertEquals(null, indexQuery.getPopulationFrequencyFilter().getOp()); + assertEquals(0, indexQuery.getPopulationFrequencyFilter().getFilters().size()); assertEquals("GNOMAD_GENOMES:ALL<" + POP_FREQ_THRESHOLD_001 + OR + "OtherStudy:ALL<0.8", query.getString(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key())); } @@ -1084,8 +1094,8 @@ public void testCoveredQuery_combined() { .append(ANNOT_BIOTYPE.key(), "protein_coding"); indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(LOFE_PROTEIN_CODING_MASK, indexQuery.getAnnotationIndex() & LOFE_PROTEIN_CODING_MASK); - assertNotEquals(EMPTY_MASK, indexQuery.getBiotypeMask()); - assertNotEquals(EMPTY_MASK, indexQuery.getConsequenceTypeMask()); + assertFalse(indexQuery.getBiotypeFilter().isNoOp()); + assertFalse(indexQuery.getConsequenceTypeFilter().isNoOp()); assertFalse(VariantQueryUtils.isValidParam(query, ANNOT_CONSEQUENCE_TYPE)); assertFalse(VariantQueryUtils.isValidParam(query, ANNOT_BIOTYPE)); @@ -1096,8 +1106,8 @@ public void testCoveredQuery_combined() { .append(ANNOT_BIOTYPE.key(), "protein_coding,miRNA"); indexQuery = parseAnnotationIndexQuery(query, true); assertEquals(EMPTY_MASK, indexQuery.getAnnotationIndex() & LOFE_PROTEIN_CODING_MASK); - assertNotEquals(EMPTY_MASK, indexQuery.getBiotypeMask()); - assertNotEquals(EMPTY_MASK, indexQuery.getConsequenceTypeMask()); + assertFalse(indexQuery.getBiotypeFilter().isNoOp()); + assertFalse(indexQuery.getConsequenceTypeFilter().isNoOp()); assertFalse(VariantQueryUtils.isValidParam(query, ANNOT_CONSEQUENCE_TYPE)); assertFalse(VariantQueryUtils.isValidParam(query, ANNOT_BIOTYPE)); @@ -1109,9 +1119,10 @@ public void testCoveredQuery_combined() { query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), VariantAnnotationConstants.FIVE_PRIME_UTR_VARIANT) .append(ANNOT_BIOTYPE.key(), "protein_coding,miRNA"); indexQuery = parseAnnotationIndexQuery(query, true); - assertNotEquals(EMPTY_MASK, indexQuery.getBiotypeMask()); - assertNotEquals(EMPTY_MASK, indexQuery.getConsequenceTypeMask()); - assertTrue(isImpreciseCtMask(indexQuery.getConsequenceTypeMask())); + SampleIndexDBAdaptor.printQuery(indexQuery); + assertFalse(indexQuery.getBiotypeFilter().isNoOp()); + assertFalse(indexQuery.getConsequenceTypeFilter().isNoOp()); + assertFalse(indexQuery.getConsequenceTypeFilter().isExactFilter()); assertTrue(VariantQueryUtils.isValidParam(query, ANNOT_CONSEQUENCE_TYPE)); assertTrue(VariantQueryUtils.isValidParam(query, ANNOT_BIOTYPE)); @@ -1123,9 +1134,9 @@ public void testCoveredQuery_combined() { query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), String.join(OR, VariantQueryUtils.LOF_EXTENDED_SET)) .append(ANNOT_BIOTYPE.key(), ANTISENSE + "," + PROTEIN_CODING); indexQuery = parseAnnotationIndexQuery(query, true); - assertNotEquals(EMPTY_MASK, indexQuery.getBiotypeMask()); - assertNotEquals(EMPTY_MASK, indexQuery.getConsequenceTypeMask()); - assertTrue(isImpreciseBtMask(indexQuery.getBiotypeMask())); + assertFalse(indexQuery.getBiotypeFilter().isNoOp()); + assertFalse(indexQuery.getConsequenceTypeFilter().isNoOp()); + assertFalse(indexQuery.getBiotypeFilter().isExactFilter()); assertTrue(VariantQueryUtils.isValidParam(query, ANNOT_CONSEQUENCE_TYPE)); assertTrue(VariantQueryUtils.isValidParam(query, ANNOT_BIOTYPE)); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java index b7242ee715f..76df76d5e79 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java @@ -32,7 +32,7 @@ import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.annotation.DefaultVariantAnnotationManager; -import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; +import org.opencb.opencga.core.models.variant.VariantAnnotationConstants; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; import org.opencb.opencga.storage.hadoop.variant.HadoopVariantStorageEngine; @@ -55,7 +55,7 @@ import static org.junit.Assert.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantMatchers.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; -import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.THREE_PRIME_UTR_VARIANT; +import static org.opencb.opencga.core.models.variant.VariantAnnotationConstants.THREE_PRIME_UTR_VARIANT; /** * Created on 12/04/19. @@ -180,10 +180,8 @@ public void checkLoadedData() throws Exception { } Assert.assertEquals(gt, expectedVariants, actualVariants); } - } } - } @Test @@ -370,6 +368,10 @@ public void testQueryAnnotationIndex() throws Exception { testQueryAnnotationIndex(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "1kG_phase3:ALL<0.001")); testQueryAnnotationIndex(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "1kG_phase3:ALL>0.005")); testQueryAnnotationIndex(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "1kG_phase3:ALL>0.008")); + testQueryAnnotationIndex(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "1kG_phase3:ALL>=0.005;GNOMAD_GENOMES:ALL>=0.005")); + + testQueryAnnotationIndex(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "1kG_phase3:ALL>=0.005,GNOMAD_GENOMES:ALL>=0.005")); + testQueryAnnotationIndex(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "1kG_phase3:ALL<0.005,GNOMAD_GENOMES:ALL<0.005")); testQueryAnnotationIndex(new Query(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key(), "1kG_phase3:ALL>0.005,GNOMAD_GENOMES:ALL>0.005")); testQueryAnnotationIndex(new Query(ANNOT_CLINICAL_SIGNIFICANCE.key(), "pathogenic")); testQueryAnnotationIndex(new Query(ANNOT_CLINICAL_SIGNIFICANCE.key(), "likely_benign")); @@ -397,7 +399,7 @@ public void testQueryAnnotationIndex(Query annotationQuery) throws Exception { SampleIndexQuery sampleIndexQuery = testQueryIndex(annotationQuery, new Query() .append(STUDY.key(), study) .append(SAMPLE.key(), sampleName)); - assertTrue(!sampleIndexQuery.emptyAnnotationIndex() || !sampleIndexQuery.getAnnotationIndexQuery().getPopulationFrequencyQueries().isEmpty()); + assertTrue(!sampleIndexQuery.emptyAnnotationIndex() || !sampleIndexQuery.getAnnotationIndexQuery().getPopulationFrequencyFilter().isNoOp()); } } } @@ -451,9 +453,10 @@ public SampleIndexQuery testQueryIndex(Query testQuery, Query query) throws Exce System.out.println("dbAdaptorQuery = " + sampleIndexVariantQuery.toJson()); System.out.println("Native dbAdaptor = " + VariantHBaseQueryParser.isSupportedQuery(sampleIndexVariantQuery) + " -> " + VariantHBaseQueryParser.unsupportedParamsFromQuery(sampleIndexVariantQuery)); System.out.println("annotationIndex = " + IndexUtils.maskToString(indexQuery.getAnnotationIndexMask(), indexQuery.getAnnotationIndex())); - System.out.println("biotypeMask = " + IndexUtils.byteToString(indexQuery.getAnnotationIndexQuery().getBiotypeMask())); - System.out.println("ctMask = " + IndexUtils.shortToString(indexQuery.getAnnotationIndexQuery().getConsequenceTypeMask())); - System.out.println("clinicalMask = " + IndexUtils.byteToString(indexQuery.getAnnotationIndexQuery().getClinicalMask())); + System.out.println("biotype = " + indexQuery.getAnnotationIndexQuery().getBiotypeFilter()); + System.out.println("ct = " + indexQuery.getAnnotationIndexQuery().getConsequenceTypeFilter()); + System.out.println("clinical = " + indexQuery.getAnnotationIndexQuery().getClinicalFilter()); + System.out.println("popFreq = " + indexQuery.getAnnotationIndexQuery().getPopulationFrequencyFilter()); for (String sample : indexQuery.getSamplesMap().keySet()) { if (indexQuery.forSample(sample).hasFatherFilter()) { System.out.println("FatherFilter = " + IndexUtils.parentFilterToString(indexQuery.forSample(sample).getFatherFilter())); @@ -620,6 +623,7 @@ private void testAggregation(SampleIndexVariantAggregationExecutor executor, Str @Test public void testSampleVariantStats() throws Exception { + HadoopVariantStorageEngine variantStorageEngine = getVariantStorageEngine(); for (String study : studies) { for (String sample : sampleNames.get(study)) { DataResult result = variantStorageEngine.sampleStatsQuery(study, sample, null); @@ -630,6 +634,7 @@ public void testSampleVariantStats() throws Exception { @Test public void testSampleVariantStatsFail() throws Exception { + HadoopVariantStorageEngine variantStorageEngine = getVariantStorageEngine(); for (String study : studies) { for (String sample : sampleNames.get(study)) { DataResult result = variantStorageEngine.sampleStatsQuery(study, sample, new Query(ANNOT_CONSEQUENCE_TYPE.key(), "synonymous_variant")); From e2bb77a42b146adf7bf10d2f43757c9bb359046f Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 11 Jun 2021 11:57:23 +0200 Subject: [PATCH 391/412] analysis: consider variants to get gene stats --- .../java/org/opencb/opencga/analysis/rga/RgaManager.java | 5 +++++ .../main/java/org/opencb/opencga/analysis/rga/RgaUtils.java | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 9e3d51278ee..7b6f0519038 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -1532,6 +1532,11 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection knockoutTypeCount.getNumDelOverlapIds()); knockoutByIndividualSummary.setVariantStats(variantStats); + // Use list of variants filtered matching all criteria + if (knockoutTypeCount.getNumIds() > 0) { + auxQuery.put(RgaQueryParams.VARIANTS.key(), new ArrayList<>(knockoutTypeCount.getIds())); + } + // 3. Get gene name list QueryOptions geneFacet = new QueryOptions() .append(QueryOptions.LIMIT, -1) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index 0a4fb3be2b7..058343dfb85 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -880,6 +880,10 @@ public void processFeature(RgaUtils.CodedFeature codedFeature) { } } + public Set getIds() { + return ids; + } + public int getNumIds() { return ids.size(); } From f33a1b63644fab81dea84f98edc450092e14e7c7 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 11 Jun 2021 14:53:19 +0200 Subject: [PATCH 392/412] catalog: use uidKey field to get the ldap uid --- .../catalog/auth/authentication/LDAPAuthenticationManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/LDAPAuthenticationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/LDAPAuthenticationManager.java index 66b8a468cac..c89677c6a90 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/LDAPAuthenticationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authentication/LDAPAuthenticationManager.java @@ -334,7 +334,7 @@ private List getUsersFromLDAPGroup(String host, String groupName, String } private List getUserInfoFromLDAP(String host, List userList, String userBase) throws NamingException { - return getUserInfoFromLDAP(host, userList, userBase, "uid"); + return getUserInfoFromLDAP(host, userList, userBase, this.uidKey); } private List getUserInfoFromLDAP(String host, List userList, String userBase, String key) throws NamingException { From b816156730a56d19b3d2e171721e31a00a7af2c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 11 Jun 2021 14:14:46 +0100 Subject: [PATCH 393/412] storage: Rename output-table parameter in SampleIndex Drivers --- .../index/annotation/mr/SampleIndexAnnotationLoaderDriver.java | 2 +- .../storage/hadoop/variant/index/family/FamilyIndexDriver.java | 2 +- .../storage/hadoop/variant/index/sample/SampleIndexDriver.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java index 2c2be153dc7..595c4c0da2e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/mr/SampleIndexAnnotationLoaderDriver.java @@ -36,7 +36,7 @@ public class SampleIndexAnnotationLoaderDriver extends AbstractVariantsTableDriver { private static final Logger LOGGER = LoggerFactory.getLogger(SampleIndexAnnotationLoaderDriver.class); - public static final String OUTPUT = "output"; + public static final String OUTPUT = "output-table"; public static final String SAMPLES = "samples"; public static final String SAMPLE_IDS = "sampleIds"; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java index 7e459506fec..f03eab78216 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java @@ -47,7 +47,7 @@ public class FamilyIndexDriver extends AbstractVariantsTableDriver { public static final String TRIOS_COHORT = "triosCohort"; public static final String TRIOS_COHORT_DELETE = "triosCohortDelete"; public static final String OVERWRITE = "overwrite"; - public static final String OUTPUT = "output"; + public static final String OUTPUT = "output-table"; private static final String TRIOS_LIST = "FamilyIndexDriver.trios_list"; // Samples where at least one parent is not in its file diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java index 641df445074..aba239f5ac9 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDriver.java @@ -69,7 +69,7 @@ public class SampleIndexDriver extends AbstractVariantsTableDriver { private static final Logger LOGGER = LoggerFactory.getLogger(SampleIndexDriver.class); public static final String SAMPLES = "samples"; public static final String SAMPLE_IDS = "sampleIds"; - public static final String OUTPUT = "output"; + public static final String OUTPUT = "output-table"; public static final String SECONDARY_ONLY = "secondary-only"; // public static final String MAIN_ONLY = "main-only"; public static final String PARTIAL_SCAN_SIZE = "partial-scan-size"; From e2f0381fbf916e266306374d3c5e410ece61fad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 11 Jun 2021 14:21:57 +0100 Subject: [PATCH 394/412] storage: Fix IllegalArgumentException parsing unknown genotypes at MendelianErrorQueryExecutor --- .../qc/MendelianInconsistenciesComputation.java | 1 + .../SampleIndexMendelianErrorQueryExecutor.java | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/MendelianInconsistenciesComputation.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/MendelianInconsistenciesComputation.java index 062c558ba7e..776b9fd2533 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/MendelianInconsistenciesComputation.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/MendelianInconsistenciesComputation.java @@ -105,6 +105,7 @@ public static MendelianErrorReport compute(String studyId, String familyId, Vari // Update quey to retrive mendelian error variants query.put(VariantCatalogQueryUtils.FAMILY.key(), familyId); query.put(VariantCatalogQueryUtils.FAMILY_SEGREGATION.key(), "MendelianError"); + query.put(VariantQueryParam.UNKNOWN_GENOTYPE.key(), "0/0"); // Create auxiliary map // sample chrom error count diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexMendelianErrorQueryExecutor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexMendelianErrorQueryExecutor.java index 0e6baf68ff1..3593ee4a34e 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexMendelianErrorQueryExecutor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/SampleIndexMendelianErrorQueryExecutor.java @@ -13,6 +13,7 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; import org.opencb.opencga.storage.core.metadata.models.Trio; +import org.opencb.opencga.storage.core.variant.adaptors.GenotypeClass; import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.adaptors.VariantHadoopDBAdaptor; @@ -83,12 +84,12 @@ private Variant addIssueEntries(Variant variant, String studyName, List tr Genotype motherGt = null; Genotype childGt; if (trio.getFather() != null) { - fatherGt = new Genotype(study.getSampleData(trio.getFather(), "GT")); + fatherGt = parseGenotype(study.getSampleData(trio.getFather(), "GT")); } if (trio.getMother() != null) { - motherGt = new Genotype(study.getSampleData(trio.getMother(), "GT")); + motherGt = parseGenotype(study.getSampleData(trio.getMother(), "GT")); } - childGt = new Genotype(study.getSampleData(trio.getChild(), "GT")); + childGt = parseGenotype(study.getSampleData(trio.getChild(), "GT")); int code = MendelianError.compute(fatherGt, motherGt, childGt, variant.getChromosome()); if (code != 0) { if (study.getIssues() == null) { @@ -108,4 +109,11 @@ private Variant addIssueEntries(Variant variant, String studyName, List tr } return variant; } + + private Genotype parseGenotype(String gt) { + if (gt.equals(GenotypeClass.UNKNOWN_GENOTYPE)) { + gt = "0/0"; + } + return new Genotype(gt); + } } From 35b3bd6b85264e1f0f00d928d2b8a61ab7519943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 11 Jun 2021 14:39:57 +0100 Subject: [PATCH 395/412] storage: Do not fail on unknown properties readign VairantAnnotation from HBase --- .../annotation/HBaseToVariantAnnotationConverter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java index 839915df63c..cc972742183 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java @@ -17,6 +17,7 @@ package org.opencb.opencga.storage.hadoop.variant.converters.annotation; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.introspect.Annotated; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; @@ -91,6 +92,7 @@ public HBaseToVariantAnnotationConverter(byte[] columnFamily, long ts) { this.ts = ts; objectMapper = new ObjectMapper(); objectMapper.addMixIn(VariantAnnotation.class, VariantAnnotationMixin.class); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); traitAssociationConverter = new VariantTraitAssociationToEvidenceEntryConverter(); } From e5fc86a519c865519db81c46dd7fc5b21bb52944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 11 Jun 2021 17:30:06 +0100 Subject: [PATCH 396/412] storage: Improve sample index backward compatibility --- .../storage/SampleIndexConfiguration.java | 39 ++++++++++++---- .../annotation/AnnotationIndexEntry.java | 27 +++++++++-- .../index/sample/SampleIndexDBAdaptor.java | 19 ++++++-- .../hadoop/variant/VariantHbaseTestUtils.java | 46 ++++++++++++++++++- 4 files changed, 111 insertions(+), 20 deletions(-) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java index a7da1b9408d..1ada2425e16 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/SampleIndexConfiguration.java @@ -66,7 +66,26 @@ public static SampleIndexConfiguration backwardCompatibleConfiguration() { THREEPRIME_OVERLAPPING_NCRNA, "bidirectional_promoter_lncRNA")); biotypeConfiguration.getValuesMapping().put("other_non_pseudo_gene", Arrays.asList( - PROCESSED_TRANSCRIPT + PROCESSED_TRANSCRIPT, + NON_STOP_DECAY, + MISC_RNA, + RRNA, + MT_RRNA, + MT_TRNA, + IG_C_GENE, + IG_D_GENE, + IG_J_GENE, + IG_V_GENE, + TR_C_GENE, + TR_D_GENE, + TR_J_GENE, + TR_V_GENE, + NMD_TRANSCRIPT_VARIANT, + TRANSCRIBED_UNPROCESSED_PSEUDGENE, + AMBIGUOUS_ORF, + KNOWN_NCRNA, + RETROTRANSPOSED, + LRG_GENE )); biotypeConfiguration.setNullable(false); @@ -76,22 +95,22 @@ public static SampleIndexConfiguration backwardCompatibleConfiguration() { "consequenceType", IndexFieldConfiguration.Type.CATEGORICAL_MULTI_VALUE) .setValues( - MISSENSE_VARIANT, - FRAMESHIFT_VARIANT, - INFRAME_DELETION, - INFRAME_INSERTION, - START_LOST, - STOP_GAINED, - STOP_LOST, - SPLICE_ACCEPTOR_VARIANT, SPLICE_DONOR_VARIANT, TRANSCRIPT_ABLATION, TRANSCRIPT_AMPLIFICATION, INITIATOR_CODON_VARIANT, SPLICE_REGION_VARIANT, INCOMPLETE_TERMINAL_CODON_VARIANT, + "utr", "mirna_tfbs", - "utr" + MISSENSE_VARIANT, + FRAMESHIFT_VARIANT, + INFRAME_DELETION, + INFRAME_INSERTION, + START_LOST, + STOP_GAINED, + STOP_LOST, + SPLICE_ACCEPTOR_VARIANT ).setValuesMapping(new HashMap<>()); consequenceType.getValuesMapping().put("mirna_tfbs", Arrays.asList( TF_BINDING_SITE_VARIANT, diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java index 7d0977acc78..a72465e18ef 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java @@ -3,6 +3,11 @@ import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; +import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + public class AnnotationIndexEntry { private boolean hasSummaryIndex; @@ -15,7 +20,7 @@ public class AnnotationIndexEntry { // should be a long? a BitBuffer? private int btIndex; private CtBtCombination ctBtCombination; - private BitBuffer popFreqIndexBB; + private BitBuffer popFreqIndex; private boolean hasClinical; private BitBuffer clinicalIndex; @@ -33,7 +38,7 @@ public AnnotationIndexEntry( this.ctBtCombination = ctBtCombination == null ? CtBtCombination.empty() : ctBtCombination; this.hasClinical = hasClinical; this.clinicalIndex = clinicalIndex; - this.popFreqIndexBB = popFreqIndex; + this.popFreqIndex = popFreqIndex; } @@ -104,6 +109,18 @@ public CtBtCombination setNumBt(int numBt) { public static CtBtCombination empty() { return EMPTY; } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("CtBtCombination{"); + sb.append("numCt=").append(numCt); + sb.append(", numBt=").append(numBt); + sb.append(", ctBtMatrix=").append(IntStream.of(ctBtMatrix) + .mapToObj(i -> IndexUtils.binaryToString(i, numBt)) + .collect(Collectors.joining(", ", "[", "]"))); + sb.append('}'); + return sb.toString(); + } } public static AnnotationIndexEntry empty() { @@ -186,11 +203,11 @@ public AnnotationIndexEntry setCtBtCombination(CtBtCombination ctBtCombination) } public BitBuffer getPopFreqIndex() { - return popFreqIndexBB; + return popFreqIndex; } public AnnotationIndexEntry setPopFreqIndex(BitBuffer popFreqIndexBB) { - this.popFreqIndexBB = popFreqIndexBB; + this.popFreqIndex = popFreqIndexBB; return this; } @@ -220,7 +237,7 @@ public String toString() { + (intergenic ? "" : (", ctIndex=" + IndexUtils.intToString(ctIndex) + ", btIndex=" + IndexUtils.intToString(btIndex))) - + ", popFreqIndex=" + popFreqIndexBB + + ", popFreqIndex=" + popFreqIndex + '}'; } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java index 4fe7a23a331..b578ffba7db 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexDBAdaptor.java @@ -23,6 +23,7 @@ import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.core.variant.adaptors.VariantIterable; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; +import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import org.opencb.opencga.storage.core.variant.adaptors.iterators.IntersectMultiVariantKeyIterator; import org.opencb.opencga.storage.core.variant.adaptors.iterators.UnionMultiVariantKeyIterator; import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator; @@ -304,6 +305,18 @@ public Iterator rawIterator(int study, int sample) throws IOEx }); } + /** + * Partially processed iterator. Internal usage only. + * + * @param study study + * @param sample sample + * @return SingleSampleIndexVariantDBIterator + */ + public RawSingleSampleIndexVariantDBIterator rawIterator(String study, String sample) { + Query query = new Query(VariantQueryParam.STUDY.key(), study).append(VariantQueryParam.SAMPLE.key(), sample); + return rawInternalIterator(parseSampleIndexQuery(query).forSample(sample)); + } + public CloseableIterator rawIterator(Query query) throws IOException { return rawIterator(parseSampleIndexQuery(query)); } @@ -631,11 +644,11 @@ private Scan parse(SingleSampleIndexQuery query, List regions, boolean o if (includeAll || !query.getAnnotationIndexQuery().getConsequenceTypeFilter().isNoOp()) { scan.addColumn(family, SampleIndexSchema.toAnnotationConsequenceTypeIndexColumn(gt)); } - if (/*includeAll ||*/ !query.getAnnotationIndexQuery().getBiotypeFilter().isNoOp() + if (includeAll || !query.getAnnotationIndexQuery().getBiotypeFilter().isNoOp() && !query.getAnnotationIndexQuery().getConsequenceTypeFilter().isNoOp()) { scan.addColumn(family, SampleIndexSchema.toAnnotationCtBtIndexColumn(gt)); } - if (/*includeAll ||*/ !query.getAnnotationIndexQuery().getPopulationFrequencyFilter().isNoOp()) { + if (includeAll || !query.getAnnotationIndexQuery().getPopulationFrequencyFilter().isNoOp()) { scan.addColumn(family, SampleIndexSchema.toAnnotationPopFreqIndexColumn(gt)); } if (includeAll || !query.getAnnotationIndexQuery().getClinicalFilter().isNoOp()) { @@ -644,7 +657,7 @@ private Scan parse(SingleSampleIndexQuery query, List regions, boolean o if (includeAll || !query.emptyFileIndex()) { scan.addColumn(family, SampleIndexSchema.toFileIndexColumn(gt)); } - if (/*includeAll ||*/ query.hasFatherFilter() || query.hasMotherFilter()) { + if (includeAll || query.hasFatherFilter() || query.hasMotherFilter()) { scan.addColumn(family, SampleIndexSchema.toParentsGTColumn(gt)); } } diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java index 39fedb544f3..24c8fbf1ae6 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHbaseTestUtils.java @@ -58,8 +58,7 @@ import org.opencb.opencga.storage.hadoop.variant.converters.HBaseToVariantConverter; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; import org.opencb.opencga.storage.hadoop.variant.index.family.MendelianErrorSampleIndexConverter; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexSchema; -import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexVariantBiConverter; +import org.opencb.opencga.storage.hadoop.variant.index.sample.*; import org.opencb.opencga.storage.hadoop.variant.utils.HBaseVariantTableNameGenerator; import java.io.*; @@ -420,9 +419,52 @@ public static void printSampleIndexTable(VariantHadoopDBAdaptor dbAdaptor, Path int version = dbAdaptor.getMetadataManager().getStudyMetadata(studyId).getSampleIndexConfigurationLatest().getVersion(); String sampleGtTableName = dbAdaptor.getTableNameGenerator().getSampleIndexTableName(studyId, version); if (printSampleIndexTable(dbAdaptor, outDir, studyId, sampleGtTableName)) return; + printSampleIndexTable2(dbAdaptor, outDir, studyId, sampleGtTableName); } } + public static boolean printSampleIndexTable2(VariantHadoopDBAdaptor dbAdaptor, Path outDir, int studyId, String sampleGtTableName) throws IOException { + if (!dbAdaptor.getHBaseManager().tableExists(sampleGtTableName)) { + // Skip table + return true; + } + Path fileName = outDir.resolve("sample." + sampleGtTableName + ".detailed.txt"); + try ( + FileOutputStream fos = new FileOutputStream(fileName.toFile()); PrintStream out = new PrintStream(fos) + ) { + SampleIndexDBAdaptor sampleIndexDBAdaptor = new SampleIndexDBAdaptor(dbAdaptor.getHBaseManager(), dbAdaptor.getTableNameGenerator(), dbAdaptor.getMetadataManager()); + SampleIndexSchema schema = sampleIndexDBAdaptor.getSchema(studyId); + for (Integer sampleId : dbAdaptor.getMetadataManager().getIndexedSamples(studyId)) { + String sampleName = dbAdaptor.getMetadataManager().getSampleName(studyId, sampleId); + RawSingleSampleIndexVariantDBIterator it = sampleIndexDBAdaptor.rawIterator(dbAdaptor.getMetadataManager().getStudyName(studyId), sampleName); + Map map = new TreeMap<>(); + + out.println(""); + out.println(""); + out.println(""); + out.println("SAMPLE: " + sampleName + " , " + sampleId); + while (it.hasNext()) { + map.clear(); + SampleVariantIndexEntry entry = it.next(); + + out.println("_______________________"); + out.println(entry.getVariant()); + out.println("gt: " + entry.getGenotype()); + out.println("file: " + entry.getFileIndex()); + out.println("ct: " + IndexUtils.binaryToString(entry.getAnnotationIndexEntry().getCtIndex(), schema.getCtIndex().getField().getBitLength()) + " : " + schema.getCtIndex().getField().decode(entry.getAnnotationIndexEntry().getCtIndex())); + out.println("bt: " + IndexUtils.binaryToString(entry.getAnnotationIndexEntry().getBtIndex(), schema.getBiotypeIndex().getField().getBitLength()) + " : " + schema.getBiotypeIndex().getField().decode(entry.getAnnotationIndexEntry().getBtIndex())); + out.println("ct_bt: " + schema.getCtBtIndex().getField().encode(entry.getAnnotationIndexEntry().getCtBtCombination()) + " : " + entry.getAnnotationIndexEntry().getCtBtCombination()); + + + for (Map.Entry e : map.entrySet()) { + out.println("\t" + e.getKey() + " = " + e.getValue()); + } + } + } + } + return false; + } + public static boolean printSampleIndexTable(VariantHadoopDBAdaptor dbAdaptor, Path outDir, int studyId, String sampleGtTableName) throws IOException { if (!dbAdaptor.getHBaseManager().tableExists(sampleGtTableName)) { From 13b8683816cd6308212b1d03e109bb54daf7de34 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 14 Jun 2021 10:33:40 +0200 Subject: [PATCH 397/412] analysis: limit rga variant filter --- .../java/org/opencb/opencga/analysis/rga/RgaManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 7b6f0519038..85af6c0b61e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -1532,8 +1532,9 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection knockoutTypeCount.getNumDelOverlapIds()); knockoutByIndividualSummary.setVariantStats(variantStats); - // Use list of variants filtered matching all criteria - if (knockoutTypeCount.getNumIds() > 0) { + // Use list of variants filtered matching all criteria if the number of variants is lower than 50. Otherwise, variants will not be + // used to get the list of genes. If we don't apply this limit, the url may be too long and fail. + if (knockoutTypeCount.getNumIds() > 0 && knockoutTypeCount.getNumIds() < 50) { auxQuery.put(RgaQueryParams.VARIANTS.key(), new ArrayList<>(knockoutTypeCount.getIds())); } From 96b0635c8d670e1372025a0e155d9ad9595a19bf Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Mon, 14 Jun 2021 08:59:41 +0000 Subject: [PATCH 398/412] GitBook: [develop] 2 pages modified --- docs/SUMMARY.md | 2 +- docs/manual/data-models/sample.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 854d4985689..fa4bc1b883d 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -69,7 +69,7 @@ * [Clinical Interpretation](manual/clinical-genomics/clinical-interpretation.md) * [Clinical Analysis](manual/clinical-genomics/clinical-analysis.md) * [Data Models](manual/data-models/README.md) - * [Sample](manual/data-models/sample.md) + * [Sample Model](manual/data-models/sample.md) * [Individual](manual/data-models/individual.md) * [File](manual/data-models/file.md) * [Family](manual/data-models/family.md) diff --git a/docs/manual/data-models/sample.md b/docs/manual/data-models/sample.md index bc241660faa..3984f5296ca 100644 --- a/docs/manual/data-models/sample.md +++ b/docs/manual/data-models/sample.md @@ -1,4 +1,4 @@ -# Sample +# Sample Model ## Overview From eacbf7110e1a3ddff1fb79265559bfb3d91676c5 Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Mon, 14 Jun 2021 09:01:01 +0000 Subject: [PATCH 399/412] GitBook: [develop] 4 pages modified --- docs/SUMMARY.md | 2 +- docs/manual/administrator/templates-manifest.md | 2 +- docs/manual/data-models/{sample.md => sample-model.md} | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) rename docs/manual/data-models/{sample.md => sample-model.md} (97%) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index fa4bc1b883d..84a854d740d 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -69,7 +69,7 @@ * [Clinical Interpretation](manual/clinical-genomics/clinical-interpretation.md) * [Clinical Analysis](manual/clinical-genomics/clinical-analysis.md) * [Data Models](manual/data-models/README.md) - * [Sample Model](manual/data-models/sample.md) + * [Sample Model](manual/data-models/sample-model.md) * [Individual](manual/data-models/individual.md) * [File](manual/data-models/file.md) * [Family](manual/data-models/family.md) diff --git a/docs/manual/administrator/templates-manifest.md b/docs/manual/administrator/templates-manifest.md index 90807289c49..64aa7fdb9f3 100644 --- a/docs/manual/administrator/templates-manifest.md +++ b/docs/manual/administrator/templates-manifest.md @@ -29,7 +29,7 @@ You might want to provide a single JSON or YAML file per entity. In the case of The following entities are supported. * For [Individual](../data-models/individual.md): `individuals.{json|yaml}` -* For [Sample](../data-models/sample.md): `samples.{json|yaml}` +* For [Sample](../data-models/sample-model.md): `samples.{json|yaml}` * For [File](../data-models/file.md): `files.{json|yaml}` * For [Family](../data-models/family.md): `families.{json|yaml}` * For [Cohort](../data-models/cohort.md): `cohorts.{json|yaml}` diff --git a/docs/manual/data-models/sample.md b/docs/manual/data-models/sample-model.md similarity index 97% rename from docs/manual/data-models/sample.md rename to docs/manual/data-models/sample-model.md index 3984f5296ca..874921bf38d 100644 --- a/docs/manual/data-models/sample.md +++ b/docs/manual/data-models/sample-model.md @@ -88,7 +88,7 @@ This is the main data model, it stores the most basic and important information.

processing

-

SampleProcessing +

SampleProcessing

An object describing how to sample was processed. @@ -97,7 +97,7 @@ This is the main data model, it stores the most basic and important information.

collection

-

SampleCollection +

SampleCollection

An object describing how the sample was collected. @@ -124,7 +124,7 @@ This is the main data model, it stores the most basic and important information.

qualityControl

-

SampleQualityControl +

SampleQualityControl

From d807c30d489d263c359efca4bd146f9d09e39f08 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 14 Jun 2021 14:46:19 +0200 Subject: [PATCH 400/412] app: avoid cursor timeout during 2.0.3 migration --- .../executors/MigrationCommandExecutor.java | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java index 5ad9d948e2a..b218ec57428 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java @@ -1,7 +1,7 @@ package org.opencb.opencga.app.cli.admin.executors; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.time.StopWatch; import org.bson.Document; import org.opencb.biodata.models.clinical.interpretation.Software; import org.opencb.commons.datastore.core.ObjectMap; @@ -25,12 +25,14 @@ import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.catalog.managers.FamilyManager; import org.opencb.opencga.catalog.utils.UuidUtils; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.models.common.CustomStatus; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.file.FileExperiment; import org.opencb.opencga.core.models.file.FileInternal; import org.opencb.opencga.core.models.job.Job; @@ -40,6 +42,7 @@ import org.opencb.opencga.core.models.study.VariableSet; import org.opencb.opencga.core.models.study.configuration.ClinicalAnalysisStudyConfiguration; import org.opencb.opencga.core.models.study.configuration.StudyConfiguration; +import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.migration.v2_0_0.VariantStorage200MigrationToolParams; import java.io.*; @@ -47,6 +50,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.concurrent.TimeUnit; import static org.opencb.opencga.core.api.ParamConstants.*; @@ -479,13 +483,44 @@ private void v2_0_3() throws CatalogException { logger.info("Starting Catalog migration for 2.0.3"); if (needsUpdate(1)) { + StopWatch stopWatch = new StopWatch(); // Add automatically roles to all the family members QueryOptions familyUpdateOptions = new QueryOptions(ParamConstants.FAMILY_UPDATE_ROLES_PARAM, true); + QueryOptions queryOptions = new QueryOptions(FamilyManager.INCLUDE_FAMILY_IDS) + .append(QueryOptions.LIMIT, 1000); for (Project project : catalogManager.getProjectManager().get(new Query(), new QueryOptions(), adminToken).getResults()) { if (project.getStudies() != null) { for (Study study : project.getStudies()) { - logger.info("Updating family roles from study {}", study.getFqn()); - catalogManager.getFamilyManager().update(study.getFqn(), new Query(), null, familyUpdateOptions, adminToken); + stopWatch.start(); + + int skip = 0; + boolean more = true; + do { + queryOptions.put(QueryOptions.SKIP, skip); + + OpenCGAResult search = catalogManager.getFamilyManager().search(study.getFqn(), new Query(), + queryOptions, adminToken); + if (search.getNumResults() < 1000) { + more = false; + } + skip += search.getNumResults(); + + for (Family family : search.getResults()) { + try { + catalogManager.getFamilyManager().update(study.getFqn(), family.getId(), null, familyUpdateOptions, + adminToken); + logger.info("Updated roles from family '{}' - '{}'", study.getFqn(), family.getId()); + } catch (CatalogException e) { + continue; + } + } + + logger.info("Updated {} families in study '{}' in {} seconds", skip, study.getFqn(), + stopWatch.getTime(TimeUnit.SECONDS)); + } while(more); + + stopWatch.stop(); + stopWatch.reset(); } } } From d7d4709b062f0245e305bc1fe56b156a2ea9ab0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Mon, 14 Jun 2021 14:30:09 +0100 Subject: [PATCH 401/412] storage: Add migration to add backward compatible SampleIndexConfiguration #1699 --- .../manager/VariantStorageManager.java | 11 ++++ .../v2_1_0/catalog/javascript/Migration1.java | 2 +- .../v2_1_0/catalog/javascript/Migration2.java | 2 +- .../v2_1_0/catalog/javascript/Migration3.java | 2 +- .../v2_1_0/catalog/javascript/Migration4.java | 2 +- .../DefaultSampleIndexConfiguration.java | 61 +++++++++++++++++++ .../catalog/migration/MigrationManager.java | 21 ++++--- .../catalog/migration/MigrationTool.java | 27 +++++--- .../migration/MigrationManagerTest.java | 2 +- .../VariantStorageMetadataManager.java | 4 ++ 10 files changed, 115 insertions(+), 19 deletions(-) create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/storage/DefaultSampleIndexConfiguration.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java index 3f918ba1b40..16851f5c5fe 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java @@ -967,6 +967,17 @@ public boolean synchronizeCatalogStudyFromStorage(String study, List fil }); } + public boolean exists(DataStore dataStore) throws StorageEngineException { + VariantStorageEngine engine = getVariantStorageEngine(dataStore); + return engine.getMetadataManager().exists(); + } + + public boolean exists(String study, String token) throws StorageEngineException, CatalogException { + String studyFqn = getStudyFqn(study, token); + VariantStorageEngine engine = getVariantStorageEngine(studyFqn, token); + return engine.getMetadataManager().studyExists(studyFqn); + } + // Permission related methods private interface VariantReadOperation { diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java index 4fda939b5ca..9f805fb7381 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration1.java @@ -13,7 +13,7 @@ public class Migration1 extends MigrationTool { @Override protected void run() throws MigrationException { - Path path = Paths.get(appHome).resolve("misc/migration/v2.1.0/migration1.js"); + Path path = appHome.resolve("misc/migration/v2.1.0/migration1.js"); runJavascript(path); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java index f7302b062bf..dd702ed901f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration2.java @@ -13,7 +13,7 @@ public class Migration2 extends MigrationTool { @Override protected void run() throws MigrationException { - Path path = Paths.get(appHome).resolve("misc/migration/v2.1.0/migration2.js"); + Path path = appHome.resolve("misc/migration/v2.1.0/migration2.js"); runJavascript(path); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java index 8ed04841eda..f03b02c63e3 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration3.java @@ -13,7 +13,7 @@ public class Migration3 extends MigrationTool { @Override protected void run() throws MigrationException { - Path path = Paths.get(appHome).resolve("misc/migration/v2.1.0/migration3.js"); + Path path = appHome.resolve("misc/migration/v2.1.0/migration3.js"); runJavascript(path); } } \ No newline at end of file diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java index 6c7a3cb8e14..c0578ce4873 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/javascript/Migration4.java @@ -13,7 +13,7 @@ public class Migration4 extends MigrationTool { @Override protected void run() throws MigrationException { - Path path = Paths.get(appHome).resolve("misc/migration/v2.1.0/migration4.js"); + Path path = appHome.resolve("misc/migration/v2.1.0/migration4.js"); runJavascript(path); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/storage/DefaultSampleIndexConfiguration.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/storage/DefaultSampleIndexConfiguration.java new file mode 100644 index 00000000000..13b3fa6d987 --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/storage/DefaultSampleIndexConfiguration.java @@ -0,0 +1,61 @@ +package org.opencb.opencga.app.migrations.v2_1_0.storage; + + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; +import org.opencb.opencga.catalog.migration.Migration; +import org.opencb.opencga.catalog.migration.MigrationTool; +import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; +import org.opencb.opencga.core.models.project.DataStore; +import org.opencb.opencga.core.models.study.Study; +import org.opencb.opencga.core.models.study.StudyVariantEngineConfiguration; +import org.opencb.opencga.storage.core.StorageEngineFactory; +import org.opencb.opencga.storage.core.metadata.models.StudyMetadata; +import org.opencb.opencga.storage.core.variant.VariantStorageEngine; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; + +@Migration(id="default_sample_index_configuration", description = "Add a default backward compatible sample index configuration", version = "2.1.0", + language = Migration.MigrationLanguage.JAVA, + domain = Migration.MigrationDomain.STORAGE, + patch = 1, + rank = 10) +public class DefaultSampleIndexConfiguration extends MigrationTool { + + @Override + protected void run() throws Exception { + StorageEngineFactory engineFactory = StorageEngineFactory.get(readStorageConfiguration()); + VariantStorageManager variantStorageManager = new VariantStorageManager(catalogManager, engineFactory); + + for (Study study : catalogManager.getStudyManager().search(new Query(), new QueryOptions(QueryOptions.INCLUDE, Arrays.asList("fqn", "internal")), token).getResults()) { + if (study.getInternal().getVariantEngineConfiguration() == null) { + study.getInternal().setVariantEngineConfiguration(new StudyVariantEngineConfiguration()); + } + if (study.getInternal().getVariantEngineConfiguration().getSampleIndex() != null) { + logger.info("Study {} already as a SampleIndex configuration", study.getFqn()); + } + if (variantStorageManager.exists(study.getFqn(), token)) { + DataStore dataStore = variantStorageManager.getDataStore(study.getFqn(), token); + VariantStorageEngine engine = engineFactory.getVariantStorageEngine(dataStore.getStorageEngine(), dataStore.getDbName()); + SampleIndexConfiguration sampleIndexConfiguration = SampleIndexConfiguration.backwardCompatibleConfiguration(); + sampleIndexConfiguration.validate(); + engine.getMetadataManager().updateStudyMetadata(study.getFqn(), studyMetadata -> { + if (CollectionUtils.isEmpty(studyMetadata.getSampleIndexConfigurations())) { + studyMetadata.setSampleIndexConfigurations(new ArrayList<>()); + studyMetadata.getSampleIndexConfigurations().add( + new StudyMetadata.SampleIndexConfigurationVersioned(sampleIndexConfiguration, 1, Date.from(Instant.now()))); + } + return studyMetadata; + }); + catalogManager.getStudyManager() + .setVariantEngineConfigurationSampleIndex(study.getFqn(), sampleIndexConfiguration, token); + } + } + } +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java index 7b1a57e2ace..d9ebf74a83b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java @@ -2,6 +2,7 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; +import org.opencb.commons.utils.FileUtils; import org.opencb.opencga.catalog.db.api.MigrationDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -18,7 +19,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; @@ -37,19 +41,22 @@ public MigrationManager(CatalogManager catalogManager, MigrationDBAdaptor migrat this.logger = LoggerFactory.getLogger(MigrationManager.class); } - public void runMigration(String version, String appHome, String token) throws CatalogException { + public void runMigration(String version, String appHome, String token) throws CatalogException, IOException { runMigration(version, Collections.emptySet(), Collections.emptySet(), appHome, new ObjectMap(), token); } public void runMigration(String version, Set domainsFilter, Set languageFilter, String appHome, String token) - throws CatalogException { + throws CatalogException, IOException { runMigration(version, domainsFilter, languageFilter, appHome, new ObjectMap(), token); } public void runMigration(String version, Set domainsFilter, Set languageFilter, String appHome, ObjectMap params, String token) - throws CatalogException { + throws CatalogException, IOException { + Path appHomePath = Paths.get(appHome); + FileUtils.checkDirectory(appHomePath); + validateAdmin(token); // Extend token life @@ -81,12 +88,12 @@ public void runMigration(String version, Set domainsF // 3. Execute pending migrations for (Class migration : pendingMigrations) { - run(migration, appHome, new ObjectMap(), token); + run(migration, appHomePath, new ObjectMap(), token); } // 4. Execute target migration for (Class migration : runnableMigrations) { - run(migration, appHome, params, token); + run(migration, appHomePath, params, token); } } @@ -282,7 +289,7 @@ private List> filterRunnableMigrations(String ver return filteredMigrations; } - private void run(Class runnableMigration, String appHome, ObjectMap params, String token) + private void run(Class runnableMigration, Path appHome, ObjectMap params, String token) throws MigrationException { Migration annotation = getMigrationAnnotation(runnableMigration); @@ -302,7 +309,7 @@ private void run(Class runnableMigration, String appHom try { migrationTool.execute(); migrationRun.setStatus(MigrationRun.MigrationStatus.DONE); - } catch (MigrationException e) { + } catch (MigrationException | RuntimeException e) { migrationRun.setStatus(MigrationRun.MigrationStatus.ERROR); migrationRun.setException(e.getMessage()); logger.error("Migration '{}' failed with message: {}", annotation.id(), e.getMessage(), e); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java index 044fbc3227a..fdcb61fc62c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java @@ -6,10 +6,12 @@ import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.file.Path; @@ -18,22 +20,25 @@ public abstract class MigrationTool { protected Configuration configuration; protected CatalogManager catalogManager; - protected String appHome; + protected Path appHome; protected String token; protected ObjectMap params; protected final Logger logger; + private final Logger privateLogger; public MigrationTool() { this.logger = LoggerFactory.getLogger(this.getClass()); + // Internal logger + this.privateLogger = LoggerFactory.getLogger(MigrationTool.class); } public final String getId() { return ""; } - public final void setup(Configuration configuration, CatalogManager catalogManager, String appHome, ObjectMap params, String token) { + public final void setup(Configuration configuration, CatalogManager catalogManager, Path appHome, ObjectMap params, String token) { this.configuration = configuration; this.catalogManager = catalogManager; this.appHome = appHome; @@ -47,11 +52,19 @@ public final void execute() throws MigrationException { } catch (MigrationException e) { throw e; } catch (Exception e) { - throw new MigrationException("Error running migration '" + getId() + "'"); + throw new MigrationException("Error running migration '" + getId() + "'", e); } } - protected abstract void run() throws CatalogException; + protected abstract void run() throws Exception; + + protected final StorageConfiguration readStorageConfiguration() throws MigrationException { + try(FileInputStream is = new FileInputStream(appHome.resolve("conf").resolve("storage-configuration.yml").toFile())) { + return StorageConfiguration.load(is); + } catch (IOException e) { + throw new MigrationException("Error reading \"storage-configuration.yml\"", e); + } + } protected final void runJavascript(Path file) throws MigrationException { String authentication = ""; @@ -88,7 +101,7 @@ protected final void runJavascript(Path file) throws MigrationException { + StringUtils.join(configuration.getCatalog().getDatabase().getHosts(), ",") + "/" + catalogManager.getCatalogDatabase() + " " + file.getFileName(); - logger.info("Running Javascript cli {} from {}", catalogCli, file.getParent()); + privateLogger.info("Running Javascript cli {} from {}", catalogCli, file.getParent()); ProcessBuilder processBuilder = new ProcessBuilder(catalogCli.split(" ")); processBuilder.directory(file.getParent().toFile()); Process p; @@ -97,7 +110,7 @@ protected final void runJavascript(Path file) throws MigrationException { BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = input.readLine()) != null) { - logger.info(line); + privateLogger.info(line); } p.waitFor(); input.close(); @@ -106,7 +119,7 @@ protected final void runJavascript(Path file) throws MigrationException { } if (p.exitValue() == 0) { - logger.info("Finished Javascript catalog migration"); + privateLogger.info("Finished Javascript catalog migration"); } else { throw new MigrationException("Error with Javascript catalog migrating!"); } diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/migration/MigrationManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/migration/MigrationManagerTest.java index 14b42947ad0..53d62122787 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/migration/MigrationManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/migration/MigrationManagerTest.java @@ -94,7 +94,7 @@ protected void run() throws MigrationException { } @Test - public void testMigration() throws MigrationException, CatalogException { + public void testMigration() throws Exception { MigrationManager migrationManager = catalogManager.getMigrationManager(); String token = catalogManager.getUserManager().loginAsAdmin("admin").getToken(); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantStorageMetadataManager.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantStorageMetadataManager.java index f518ba30927..7e555ee29b4 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantStorageMetadataManager.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/metadata/VariantStorageMetadataManager.java @@ -225,6 +225,10 @@ public StudyMetadata.SampleIndexConfigurationVersioned addSampleIndexConfigurati }).getSampleIndexConfigurationLatest(); } + public boolean studyExists(String studyName) { + return exists() && getStudyIdOrNull(studyName) != null; + } + public interface UpdateFunction { T update(T t) throws E; } From cfbfb69d56684318c7be642da1f82e5f451ce7df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Mon, 14 Jun 2021 18:14:10 +0100 Subject: [PATCH 402/412] catalog: Move file VariantSetStats from variable set to quality control. Add migration tool. --- .../VariantFileIndexerOperationManager.java | 23 +-- .../AbstractVariantOperationManagerTest.java | 7 +- ...ariantFileIndexerOperationManagerTest.java | 30 +-- .../java/VariantFileStatsRelocation.java | 62 ++++++ .../opencga/catalog/managers/FileManager.java | 13 +- .../catalog/migration/MigrationTool.java | 3 +- .../catalog/utils/FileMetadataReader.java | 1 - .../file-variant-stats-variableset.json | 195 ------------------ .../utils/AvroToAnnotationConverterTest.java | 24 --- .../annotation/AnnotationIndexEntry.java | 2 - 10 files changed, 94 insertions(+), 266 deletions(-) create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/java/VariantFileStatsRelocation.java delete mode 100644 opencga-catalog/src/main/resources/variablesets/file-variant-stats-variableset.json diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManager.java index c9365614430..2af0ef2e8ab 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManager.java @@ -32,18 +32,15 @@ import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.catalog.utils.AvroToAnnotationConverter; -import org.opencb.opencga.catalog.utils.Constants; -import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.cohort.CohortCreateParams; import org.opencb.opencga.core.models.cohort.CohortStatus; -import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.*; import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.models.study.Study; +import org.opencb.opencga.core.models.variant.VariantFileQualityControl; import org.opencb.opencga.storage.core.StoragePipelineResult; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.exceptions.StoragePipelineException; @@ -61,11 +58,9 @@ import java.util.*; import java.util.stream.Collectors; -import static org.opencb.opencga.catalog.db.api.FileDBAdaptor.QueryParams.ANNOTATION_SETS; import static org.opencb.opencga.catalog.db.api.FileDBAdaptor.QueryParams.UID; import static org.opencb.opencga.catalog.db.api.ProjectDBAdaptor.QueryParams.CURRENT_RELEASE; import static org.opencb.opencga.catalog.db.api.ProjectDBAdaptor.QueryParams.ORGANISM; -import static org.opencb.opencga.catalog.utils.FileMetadataReader.FILE_VARIANT_STATS_VARIABLE_SET; /** * Created by imedina on 17/08/16. @@ -502,19 +497,13 @@ private void updateVariantFileStats(String studyFqn, VariantReaderUtils variantR throw new CatalogException("Error reading file \"" + metaFile + "\"", e); } - try { - catalogManager.getStudyManager().getVariableSet(studyFqn, FILE_VARIANT_STATS_VARIABLE_SET, new QueryOptions(), token); - } catch (CatalogException e) { - // Variable set not found. Try to create - catalogManager.getStudyManager().createDefaultVariableSets(studyFqn, token); - } - - AnnotationSet annotationSet = AvroToAnnotationConverter.convertToAnnotationSet(stats, FILE_VARIANT_STATS_VARIABLE_SET); catalogManager.getFileManager() - .update(studyFqn, inputFile.getPath(), new FileUpdateParams().setAnnotationSets(Collections.singletonList(annotationSet)), - new QueryOptions(Constants.ACTIONS, Collections.singletonMap(ANNOTATION_SETS.key(), ParamUtils.BasicUpdateAction.SET)), + .update(studyFqn, inputFile.getPath(), + new FileUpdateParams().setQualityControl( + new FileQualityControl().setVariant( + new VariantFileQualityControl(stats))), + new QueryOptions(), token); - } private Cohort createDefaultCohortIfNeeded(String studyFqn, String sessionId) throws CatalogException { diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/AbstractVariantOperationManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/AbstractVariantOperationManagerTest.java index 1620fba0808..f15e80ffc41 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/AbstractVariantOperationManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/AbstractVariantOperationManagerTest.java @@ -38,6 +38,8 @@ import org.opencb.opencga.catalog.utils.FileMetadataReader; import org.opencb.opencga.catalog.utils.FileScanner; import org.opencb.opencga.core.config.DatabaseCredentials; +import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.core.config.storage.StorageEngineConfiguration; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.cohort.CohortStatus; import org.opencb.opencga.core.models.file.File; @@ -51,8 +53,6 @@ import org.opencb.opencga.core.tools.result.ExecutionResultManager; import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.StoragePipelineResult; -import org.opencb.opencga.core.config.storage.StorageConfiguration; -import org.opencb.opencga.core.config.storage.StorageEngineConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.storage.core.variant.dummy.DummyVariantDBAdaptor; @@ -79,7 +79,6 @@ import static org.mockito.Mockito.spy; import static org.opencb.biodata.models.variant.StudyEntry.DEFAULT_COHORT; import static org.opencb.opencga.analysis.variant.manager.operations.StatsVariantStorageTest.checkCalculatedStats; -import static org.opencb.opencga.catalog.utils.FileMetadataReader.FILE_VARIANT_STATS_VARIABLE_SET; import static org.opencb.opencga.storage.core.variant.VariantStorageBaseTest.DB_NAME; import static org.opencb.opencga.storage.core.variant.VariantStorageBaseTest.getResourceUri; @@ -256,7 +255,7 @@ protected File transformFile(File inputFile, QueryOptions queryOptions, String o } inputFile = catalogManager.getFileManager().get(studyId, inputFile.getId(), null, sessionId).first(); assertEquals(FileIndex.IndexStatus.TRANSFORMED, inputFile.getInternal().getIndex().getStatus().getName()); - assertEquals(FILE_VARIANT_STATS_VARIABLE_SET, inputFile.getAnnotationSets().get(0).getId()); + assertNotNull(inputFile.getQualityControl().getVariant().getVariantSetMetrics()); // Default cohort should not be modified assertEquals(String.valueOf(defaultCohort), String.valueOf(getDefaultCohort(studyId))); diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManagerTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManagerTest.java index 460bbf33f77..fc145e9a018 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManagerTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/manager/operations/VariantFileIndexerOperationManagerTest.java @@ -24,7 +24,10 @@ import org.mockito.Mockito; import org.opencb.biodata.models.variant.metadata.Aggregation; import org.opencb.biodata.models.variant.metadata.VariantSetStats; -import org.opencb.commons.datastore.core.*; +import org.opencb.commons.datastore.core.DataResult; +import org.opencb.commons.datastore.core.Event; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.tools.ToolRunner; import org.opencb.opencga.analysis.variant.operations.VariantIndexOperationTool; import org.opencb.opencga.catalog.db.api.CohortDBAdaptor; @@ -35,7 +38,6 @@ import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.models.cohort.CohortStatus; -import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.file.FileIndex; import org.opencb.opencga.core.models.study.Study; @@ -64,7 +66,6 @@ import static org.junit.Assert.*; import static org.opencb.biodata.models.variant.StudyEntry.DEFAULT_COHORT; import static org.opencb.opencga.analysis.variant.manager.operations.StatsVariantStorageTest.checkCalculatedStats; -import static org.opencb.opencga.catalog.utils.FileMetadataReader.FILE_VARIANT_STATS_VARIABLE_SET; /** * Created by hpccoll1 on 13/07/15. @@ -85,14 +86,13 @@ public void testIndexWithStats() throws Exception { variantManager.index(studyId, getFile(0).getId(), newTmpOutdir(), queryOptions, sessionId); assertEquals(500, getDefaultCohort(studyId).getSamples().size()); assertEquals(CohortStatus.NONE, getDefaultCohort(studyId).getInternal().getStatus().getName()); - AnnotationSet annotationSet = getAnnotationSet(getFile(0).getId()); - assertEquals(FILE_VARIANT_STATS_VARIABLE_SET, annotationSet.getId()); - assertNotEquals(0, annotationSet.to(VariantSetStats.class).getVariantCount().intValue()); + VariantSetStats stats = getVariantSetMetrics(getFile(0).getId()); + assertNotEquals(0, stats.getVariantCount().intValue()); variantManager.index(studyId, getFile(1).getId(), newTmpOutdir(), queryOptions, sessionId); assertEquals(1000, getDefaultCohort(studyId).getSamples().size()); assertEquals(CohortStatus.NONE, getDefaultCohort(studyId).getInternal().getStatus().getName()); - assertEquals(FILE_VARIANT_STATS_VARIABLE_SET, getAnnotationSet(getFile(1).getId()).getId()); + assertNotNull(getVariantSetMetrics(getFile(1).getId())); queryOptions.put(VariantStorageOptions.STATS_CALCULATE.key(), true); variantManager.index(studyId, getFile(2).getId(), newTmpOutdir(), queryOptions, sessionId); @@ -100,25 +100,25 @@ public void testIndexWithStats() throws Exception { assertEquals(CohortStatus.READY, getDefaultCohort(studyId).getInternal().getStatus().getName()); checkCalculatedStats(studyId, Collections.singletonMap(DEFAULT_COHORT, catalogManager.getCohortManager().search(studyId, new Query(CohortDBAdaptor.QueryParams.ID.key(), DEFAULT_COHORT), new QueryOptions(), sessionId).first()), catalogManager, dbName, sessionId); - assertEquals(FILE_VARIANT_STATS_VARIABLE_SET, getAnnotationSet(getFile(2).getId()).getId()); + assertNotNull(getVariantSetMetrics(getFile(2).getId())); queryOptions.put(VariantStorageOptions.STATS_CALCULATE.key(), false); variantManager.index(studyId, getFile(3).getId(), newTmpOutdir(), queryOptions, sessionId); assertEquals(2000, getDefaultCohort(studyId).getSamples().size()); assertEquals(CohortStatus.INVALID, getDefaultCohort(studyId).getInternal().getStatus().getName()); - assertEquals(FILE_VARIANT_STATS_VARIABLE_SET, getAnnotationSet(getFile(3).getId()).getId()); + assertNotNull(getVariantSetMetrics(getFile(3).getId())); queryOptions.put(VariantStorageOptions.STATS_CALCULATE.key(), true); variantManager.index(studyId, getFile(4).getId(), newTmpOutdir(), queryOptions, sessionId); assertEquals(2504, getDefaultCohort(studyId).getSamples().size()); assertEquals(CohortStatus.READY, getDefaultCohort(studyId).getInternal().getStatus().getName()); - assertEquals(FILE_VARIANT_STATS_VARIABLE_SET, getAnnotationSet(getFile(4).getId()).getId()); + assertNotNull(getVariantSetMetrics(getFile(4).getId())); checkCalculatedStats(studyId, Collections.singletonMap(DEFAULT_COHORT, catalogManager.getCohortManager().search(studyId, new Query(CohortDBAdaptor.QueryParams.ID.key(), DEFAULT_COHORT), new QueryOptions(), sessionId).first()), catalogManager, dbName, sessionId); } - private AnnotationSet getAnnotationSet(String fileId) throws CatalogException { - return catalogManager.getFileManager().get(studyId, fileId, null, sessionId).first().getAnnotationSets().get(0); + private VariantSetStats getVariantSetMetrics(String fileId) throws CatalogException { + return catalogManager.getFileManager().get(studyId, fileId, null, sessionId).first().getQualityControl().getVariant().getVariantSetMetrics(); } @Test @@ -131,7 +131,7 @@ public void testIndexWithStatsLowerCaseAggregationType() throws Exception { variantManager.index(studyId, getFile(0).getId(), newTmpOutdir(), queryOptions, sessionId); assertEquals(500, getDefaultCohort(studyId).getSamples().size()); assertEquals(CohortStatus.READY, getDefaultCohort(studyId).getInternal().getStatus().getName()); - assertEquals(FILE_VARIANT_STATS_VARIABLE_SET, getAnnotationSet(getFile(0).getId()).getId()); + assertNotNull(getVariantSetMetrics(getFile(0).getId())); } @@ -148,7 +148,7 @@ public void testIndexWithStatsWrongAggregationType() throws Exception { assertEquals(0, getDefaultCohort(studyId).getSamples().size()); assertEquals(CohortStatus.NONE, getDefaultCohort(studyId).getInternal().getStatus().getName()); assertEquals(FileIndex.IndexStatus.TRANSFORMED, catalogManager.getFileManager().get(studyId, getFile(0).getId(), null, sessionId).first().getInternal().getIndex().getStatus().getName()); - assertEquals(FILE_VARIANT_STATS_VARIABLE_SET, getAnnotationSet(getFile(0).getId()).getId()); + assertNotNull(getVariantSetMetrics(getFile(0).getId())); } queryOptions.put(VariantStorageOptions.STATS_AGGREGATION.key(), "none"); // File already transformed @@ -156,7 +156,7 @@ public void testIndexWithStatsWrongAggregationType() throws Exception { variantManager.index(studyId, getFile(0).getId(), newTmpOutdir(), queryOptions, sessionId); assertEquals(500, getDefaultCohort(studyId).getSamples().size()); assertEquals(CohortStatus.READY, getDefaultCohort(studyId).getInternal().getStatus().getName()); - assertEquals(FILE_VARIANT_STATS_VARIABLE_SET, getAnnotationSet(getFile(0).getId()).getId()); + assertNotNull(getVariantSetMetrics(getFile(0).getId())); } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/java/VariantFileStatsRelocation.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/java/VariantFileStatsRelocation.java new file mode 100644 index 00000000000..23b8046c27d --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/catalog/java/VariantFileStatsRelocation.java @@ -0,0 +1,62 @@ +package org.opencb.opencga.app.migrations.v2_1_0.catalog.java; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.opencb.biodata.models.variant.metadata.VariantSetStats; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.catalog.db.api.DBIterator; +import org.opencb.opencga.catalog.db.api.FileDBAdaptor; +import org.opencb.opencga.catalog.migration.Migration; +import org.opencb.opencga.catalog.migration.MigrationTool; +import org.opencb.opencga.core.models.common.AnnotationSet; +import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.file.FileQualityControl; +import org.opencb.opencga.core.models.file.FileUpdateParams; +import org.opencb.opencga.core.models.study.Study; +import org.opencb.opencga.core.models.variant.VariantFileQualityControl; + +@Migration(id="move_variant_file_stats_to_qc", description = "Move opencga_file_variant_stats annotation set from variable sets to FileQualityControl", version = "2.1.0", + language = Migration.MigrationLanguage.JAVA, + domain = Migration.MigrationDomain.STORAGE, + patch = 1, + rank = 9) +public class VariantFileStatsRelocation extends MigrationTool { + + private static final String FILE_VARIANT_STATS_VARIABLE_SET = "opencga_file_variant_stats"; + + @Override + protected void run() throws Exception { + for (Study study : catalogManager.getStudyManager().search(new Query(), new QueryOptions(), token).getResults()) { + Query query = new Query(FileDBAdaptor.QueryParams.FORMAT.key(), File.Format.VCF); + QueryOptions options = new QueryOptions(); + + ObjectMapper objectMapper = new ObjectMapper(new JsonFactory()); + logger.info("Updating files from study {}", study.getFqn()); + try (DBIterator it = catalogManager.getFileManager().iterator(study.getFqn(), query, options, token)) { + while (it.hasNext()) { + File file = it.next(); + if (file.getQualityControl() != null + && file.getQualityControl().getVariant() != null + && file.getQualityControl().getVariant().getVariantSetMetrics() != null) { + logger.info("Variant stats from file {} already relocated.", file.getId()); + continue; + } + VariantSetStats variantSetStats = null; + for (AnnotationSet annotationSet : file.getAnnotationSets()) { + if (annotationSet.getVariableSetId().equals(FILE_VARIANT_STATS_VARIABLE_SET)) { + variantSetStats = objectMapper.convertValue(annotationSet.getAnnotations(), VariantSetStats.class); + } + } + if (variantSetStats != null) { + logger.info("Relocating variant stats from file {}", file.getId()); + catalogManager.getFileManager().update(study.getFqn(), file.getId(), + new FileUpdateParams().setQualityControl( + new FileQualityControl().setVariant(new VariantFileQualityControl(variantSetStats))), + new QueryOptions(), token); + } + } + } + } + } +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java index 37e9ef3fe03..01d2145e751 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FileManager.java @@ -54,6 +54,7 @@ import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.study.StudyAclEntry; import org.opencb.opencga.core.models.study.VariableSet; +import org.opencb.opencga.core.models.variant.VariantFileQualityControl; import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,7 +76,6 @@ import java.util.stream.Collectors; import static org.opencb.opencga.catalog.auth.authorization.CatalogAuthorizationManager.checkPermissions; -import static org.opencb.opencga.catalog.utils.FileMetadataReader.FILE_VARIANT_STATS_VARIABLE_SET; import static org.opencb.opencga.core.common.JacksonUtils.getDefaultObjectMapper; import static org.opencb.opencga.core.common.JacksonUtils.getUpdateObjectMapper; @@ -399,12 +399,13 @@ public void matchUpVariantFiles(String studyStr, List transformedFiles, St VariantFileMetadata fileMetadata = getDefaultObjectMapper().readValue(is, VariantFileMetadata.class); VariantSetStats stats = fileMetadata.getStats(); - AnnotationSet annotationSet = AvroToAnnotationConverter.convertToAnnotationSet(stats, FILE_VARIANT_STATS_VARIABLE_SET); catalogManager.getFileManager() - .update(studyStr, vcf.getPath(), new FileUpdateParams().setAnnotationSets(Collections.singletonList(annotationSet)), - new QueryOptions(Constants.ACTIONS, - Collections.singletonMap(ANNOTATION_SETS, ParamUtils.CompleteUpdateAction.SET)), sessionId); - + .update(studyStr, vcf.getPath(), + new FileUpdateParams().setQualityControl( + new FileQualityControl().setVariant( + new VariantFileQualityControl(stats))), + new QueryOptions(), + sessionId); } catch (IOException e) { throw new CatalogException("Error reading file \"" + statsFile + "\"", e); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java index fdcb61fc62c..872f18a8634 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationTool.java @@ -3,7 +3,6 @@ import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.mongodb.MongoDBConfiguration; -import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; @@ -59,7 +58,7 @@ public final void execute() throws MigrationException { protected abstract void run() throws Exception; protected final StorageConfiguration readStorageConfiguration() throws MigrationException { - try(FileInputStream is = new FileInputStream(appHome.resolve("conf").resolve("storage-configuration.yml").toFile())) { + try (FileInputStream is = new FileInputStream(appHome.resolve("conf").resolve("storage-configuration.yml").toFile())) { return StorageConfiguration.load(is); } catch (IOException e) { throw new MigrationException("Error reading \"storage-configuration.yml\"", e); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/FileMetadataReader.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/FileMetadataReader.java index d18d0f6dcc4..4fdd3e486b2 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/FileMetadataReader.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/FileMetadataReader.java @@ -59,7 +59,6 @@ public class FileMetadataReader { public static final String VARIANT_SOURCE = "variantSource"; public static final String VARIANT_FILE_METADATA = "variantFileMetadata"; - public static final String FILE_VARIANT_STATS_VARIABLE_SET = "opencga_file_variant_stats"; private final CatalogManager catalogManager; protected static Logger logger = LoggerFactory.getLogger(FileMetadataReader.class); diff --git a/opencga-catalog/src/main/resources/variablesets/file-variant-stats-variableset.json b/opencga-catalog/src/main/resources/variablesets/file-variant-stats-variableset.json deleted file mode 100644 index 1e40f3a0b05..00000000000 --- a/opencga-catalog/src/main/resources/variablesets/file-variant-stats-variableset.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "uid" : 0, - "id" : "opencga_file_variant_stats", - "name" : "opencga_file_variant_stats", - "unique" : true, - "confidential" : false, - "internal": false, - "description" : "OpenCGA file variant stats", - "variables" : [ { - "id" : "variantCount", - "name" : "variantCount", - "category" : "", - "type" : "INTEGER", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 0, - "dependsOn" : null, - "description" : "Number of variants in the variant set", - "variableSet" : null, - "attributes" : null - }, { - "id" : "sampleCount", - "name" : "sampleCount", - "category" : "", - "type" : "INTEGER", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 1, - "dependsOn" : null, - "description" : "Number of samples in the variant set", - "variableSet" : null, - "attributes" : null - }, { - "id" : "filterCount", - "name" : "filterCount", - "category" : "", - "type" : "MAP_INTEGER", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 2, - "dependsOn" : null, - "description" : "The number of occurrences for each FILTER value in files from this set.. Each file can contain more than one filter value (usually separated by ';').. ", - "variableSet" : null, - "attributes" : null - }, { - "id" : "filesCount", - "name" : "filesCount", - "category" : "", - "type" : "INTEGER", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 3, - "dependsOn" : null, - "description" : "Number of files in the variant set", - "variableSet" : null, - "attributes" : null - }, { - "id" : "tiTvRatio", - "name" : "tiTvRatio", - "category" : "", - "type" : "DOUBLE", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 4, - "dependsOn" : null, - "description" : "TiTvRatio = num. transitions / num. transversions", - "variableSet" : null, - "attributes" : null - }, { - "id" : "qualityAvg", - "name" : "qualityAvg", - "category" : "", - "type" : "DOUBLE", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 5, - "dependsOn" : null, - "description" : "Mean Quality for all the variants with quality", - "variableSet" : null, - "attributes" : null - }, { - "id" : "qualityStdDev", - "name" : "qualityStdDev", - "category" : "", - "type" : "DOUBLE", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 6, - "dependsOn" : null, - "description" : "Standard Deviation of the quality", - "variableSet" : null, - "attributes" : null - }, { - "id" : "typeCount", - "name" : "typeCount", - "category" : "", - "type" : "MAP_INTEGER", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 7, - "dependsOn" : null, - "description" : "Variants count group by type. e.g. SNP, INDEL, MNP, SNV, ...", - "variableSet" : null, - "attributes" : null - }, { - "id" : "biotypeCount", - "name" : "biotypeCount", - "category" : "", - "type" : "MAP_INTEGER", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : [ "3prime_overlapping_ncrna", "3prime_overlapping_ncRNA", "ambiguous_orf", "antisense", "antisense_RNA", "bidirectional_promoter_lncRNA", "IG_C_gene", "IG_C_pseudogene", "IG_D_gene", "IG_J_gene", "IG_J_pseudogene", "IG_pseudogene", "IG_V_gene", "IG_V_pseudogene", "intergenic_variant", "known_ncrna", "lincRNA", "LRG_gene", "macro_lncRNA", "miRNA", "miRNA_pseudogene", "misc_RNA", "misc_RNA_pseudogene", "Mt_rRNA", "Mt_tRNA", "NMD_transcript_variant", "non_coding", "nonsense_mediated_decay", "non_stop_decay", "polymorphic_pseudogene", "processed_pseudogene", "processed_transcript", "protein_coding", "pseudogene", "retained_intron", "retrotransposed", "ribozyme", "rRNA", "rRNA_pseudogene", "scaRNA", "scRNA", "scRNA_pseudogene", "sense_intronic", "sense_overlapping", "snoRNA", "snoRNA_pseudogene", "snRNA", "snRNA_pseudogene", "sRNA", "TEC", "transcribed_processed_pseudogene", "transcribed_unitary_pseudogene", "transcribed_unprocessed_pseudogene", "translated_processed_pseudogene", "translated_unprocessed_pseudogene", "TR_C_gene", "TR_D_gene", "TR_J_gene", "TR_J_pseudogene", "tRNA_pseudogene", "TR_V_gene", "TR_V_pseudogene", "unitary_pseudogene", "unprocessed_pseudogene", "vaultRNA" ], - "rank" : 8, - "dependsOn" : null, - "description" : "Variants count group by biotype. e.g. protein-coding, miRNA, lncRNA, .... Each counter is increased at most one per variant. If multiple overlapping genes have the same biotypes, it will count as one.", - "variableSet" : null, - "attributes" : null - }, { - "id" : "consequenceTypeCount", - "name" : "consequenceTypeCount", - "category" : "", - "type" : "MAP_INTEGER", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : [ "start_retained_variant", "upstream_variant", "3_prime_UTR_variant", "splice_acceptor_variant", "transcript_amplification", "upstream_gene_variant", "RNA_polymerase_promoter", "non_coding_transcript_exon_variant", "non_coding_transcript_variant", "inframe_variant", "transcript_ablation", "splice_donor_variant", "synonymous_variant", "feature_elongation", "feature_truncation", "miRNA_target_site", "exon_variant", "downstream_gene_variant", "stop_retained_variant", "TF_binding_site_variant", "initiator_codon_variant", "coding_sequence_variant", "protein_altering_variant", "intergenic_variant", "terminator_codon_variant", "frameshift_variant", "DNAseI_hypersensitive_site", "feature_variant", "2KB_downstream_variant", "intron_variant", "splice_region_variant", "5_prime_UTR_variant", "SNP", "stop_gained", "regulatory_region_amplification", "2KB_upstream_variant", "miRNA", "lincRNA", "start_lost", "SNV", "CpG_island", "downstream_variant", "NMD_transcript_variant", "2KB_downstream_gene_variant", "TFBS_amplification", "missense_variant", "regulatory_region_ablation", "mature_miRNA_variant", "stop_lost", "structural_variant", "regulatory_region_variant", "TFBS_ablation", "copy_number_change", "2KB_upstream_gene_variant", "polypeptide_variation_site", "inframe_deletion", "inframe_insertion", "incomplete_terminal_codon_variant" ], - "rank" : 9, - "dependsOn" : null, - "description" : "Variants count group by consequence type. e.g. synonymous_variant, missense_variant, stop_lost, ...", - "variableSet" : null, - "attributes" : null - }, { - "id" : "chromosomeCount", - "name" : "chromosomeCount", - "category" : "", - "type" : "MAP_INTEGER", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 10, - "dependsOn" : null, - "description" : "Number of variants per chromosome", - "variableSet" : null, - "attributes" : null - }, { - "id" : "chromosomeDensity", - "name" : "chromosomeDensity", - "category" : "", - "type" : "MAP_DOUBLE", - "defaultValue" : null, - "required" : false, - "multiValue" : false, - "allowedValues" : null, - "allowedKeys" : null, - "rank" : 11, - "dependsOn" : null, - "description" : "Total density of variants within the chromosome. counts / chromosome.length", - "variableSet" : null, - "attributes" : null - } ], - "entities" : [ "FILE" ], - "release" : 0, - "attributes" : { - "avroClass" : "class org.opencb.biodata.models.variant.metadata.VariantSetStats" - } -} \ No newline at end of file diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/utils/AvroToAnnotationConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/utils/AvroToAnnotationConverterTest.java index a157ee2fc25..b80aececcfd 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/utils/AvroToAnnotationConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/utils/AvroToAnnotationConverterTest.java @@ -45,30 +45,6 @@ public void generateCohortVariantSetStats() throws IOException { serialize(variableSet, "cohort-variant-stats-variableset.json"); } - @Test - public void generateFileVariantSetStats() throws IOException { - List variables = AvroToAnnotationConverter.convertToVariableSet(VariantSetStats.getClassSchema()); - - Variable biotypeCount = variables.stream().filter(v -> v.getId().equals("biotypeCount")).findFirst().get(); - addBiotypeKeys(biotypeCount); - - Variable consequenceTypeCount = variables.stream().filter(v -> v.getId().equals("consequenceTypeCount")).findFirst().get(); - addConsequenceTypeKeys(consequenceTypeCount); - - VariableSet variableSet = new VariableSet() - .setId(FileMetadataReader.FILE_VARIANT_STATS_VARIABLE_SET) - .setName(FileMetadataReader.FILE_VARIANT_STATS_VARIABLE_SET) - .setDescription("OpenCGA file variant stats") - .setEntities(Collections.singletonList(VariableSet.AnnotableDataModels.FILE)) - .setUnique(true) - .setConfidential(false) - .setAttributes(Collections.singletonMap("avroClass", VariantSetStats.class.toString())) - .setVariables(new LinkedHashSet<>(variables)); - - - serialize(variableSet, "file-variant-stats-variableset.json"); - } - @Test public void generateSampleVariantStats() throws IOException { List variables = AvroToAnnotationConverter.convertToVariableSet(SampleVariantStats.getClassSchema()); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java index a72465e18ef..4784130f493 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexEntry.java @@ -3,10 +3,8 @@ import org.opencb.opencga.storage.core.io.bit.BitBuffer; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; -import java.util.Arrays; import java.util.stream.Collectors; import java.util.stream.IntStream; -import java.util.stream.Stream; public class AnnotationIndexEntry { From 2a56acb62b9ed84dc211e7a41e2ea73b37b6fd93 Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 15 Jun 2021 12:40:14 +0200 Subject: [PATCH 403/412] core: remove phenotypes and disorders from params, closes #1785 --- .../catalog/managers/FamilyManager.java | 31 +++------------ .../catalog/managers/FamilyManagerTest.java | 38 ------------------- .../models/family/FamilyCreateParams.java | 36 ++---------------- .../models/family/FamilyUpdateParams.java | 32 ++-------------- 4 files changed, 13 insertions(+), 124 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java index 23508c7c37e..a917a19f081 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.ClinicalProperty; import org.opencb.biodata.models.clinical.ClinicalProperty.Penetrance; @@ -30,7 +31,6 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; @@ -47,6 +47,7 @@ import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.CustomStatus; @@ -917,10 +918,9 @@ private OpenCGAResult update(Study study, Family family, FamilyUpdatePar boolean updateRoles = options.getBoolean(ParamConstants.FAMILY_UPDATE_ROLES_PARAM); - if (updateRoles || (updateParams != null && (ListUtils.isNotEmpty(updateParams.getPhenotypes()) - || ListUtils.isNotEmpty(updateParams.getMembers()) || ListUtils.isNotEmpty(updateParams.getDisorders())))) { + if (updateRoles || (updateParams != null && CollectionUtils.isNotEmpty(updateParams.getMembers()))) { Family tmpFamily = new Family(); - if (updateParams != null && ListUtils.isNotEmpty(updateParams.getMembers())) { + if (updateParams != null && CollectionUtils.isNotEmpty(updateParams.getMembers())) { // We obtain the members from catalog autoCompleteFamilyMembers(study, tmpFamily, updateParams.getMembers(), userId); } else { @@ -928,25 +928,6 @@ private OpenCGAResult update(Study study, Family family, FamilyUpdatePar tmpFamily.setMembers(family.getMembers()); } - if (updateParams != null && ListUtils.isNotEmpty(updateParams.getPhenotypes())) { - tmpFamily.setPhenotypes(updateParams.getPhenotypes()); - } else if (updateParams != null && ListUtils.isNotEmpty(updateParams.getMembers())) { - // Recalculate phenotypes if list of members has changed - tmpFamily.setPhenotypes(Collections.emptyList()); - parameters.put(FamilyDBAdaptor.QueryParams.PHENOTYPES.key(), tmpFamily.getPhenotypes()); - } else { - tmpFamily.setPhenotypes(family.getPhenotypes()); - } - if (updateParams != null && ListUtils.isNotEmpty(updateParams.getDisorders())) { - tmpFamily.setDisorders(updateParams.getDisorders()); - } else if (updateParams != null && ListUtils.isNotEmpty(updateParams.getMembers())) { - // Recalculate disorders if list of members has changed - tmpFamily.setDisorders(Collections.emptyList()); - parameters.put(FamilyDBAdaptor.QueryParams.DISORDERS.key(), tmpFamily.getDisorders()); - } else { - tmpFamily.setDisorders(family.getDisorders()); - } - validateFamily(tmpFamily); validatePhenotypes(tmpFamily); validateDisorders(tmpFamily); @@ -1471,11 +1452,11 @@ private void validateFamily(Family family) throws CatalogException { private void validatePhenotypes(Family family) throws CatalogException { if (family.getPhenotypes() == null || family.getPhenotypes().isEmpty()) { - if (ListUtils.isNotEmpty(family.getMembers())) { + if (CollectionUtils.isNotEmpty(family.getMembers())) { Map phenotypeMap = new HashMap<>(); for (Individual member : family.getMembers()) { - if (ListUtils.isNotEmpty(member.getPhenotypes())) { + if (CollectionUtils.isNotEmpty(member.getPhenotypes())) { for (Phenotype phenotype : member.getPhenotypes()) { phenotypeMap.put(phenotype.getId(), phenotype); } diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java index cde26cc3dd4..5e217daad94 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/FamilyManagerTest.java @@ -895,30 +895,6 @@ public void recalculateRoles() throws CatalogException { assertEquals(1, familyManager.update(STUDY, originalFamily.first().getId(), updateParams, options, sessionIdUser).getNumUpdated()); } - @Test - public void updateFamilyPhenotype() throws CatalogException { - DataResult originalFamily = createDummyFamily("Martinez-Martinez", true); - - Phenotype phenotype1 = new Phenotype("dis1", "New name", "New source"); - Phenotype phenotype2 = new Phenotype("dis2", "New name", "New source"); - Phenotype phenotype3 = new Phenotype("dis3", "New name", "New source"); - - FamilyUpdateParams updateParams = new FamilyUpdateParams().setPhenotypes(Arrays.asList(phenotype1, phenotype2, phenotype3)); - - DataResult updatedFamily = familyManager.update(STUDY, originalFamily.first().getId(), - updateParams, QueryOptions.empty(), sessionIdUser); - assertEquals(1, updatedFamily.getNumUpdated()); - - Family family = familyManager.get(STUDY, originalFamily.first().getId(), QueryOptions.empty(), sessionIdUser).first(); - assertEquals(3, family.getPhenotypes().size()); - - // Only one id should be the same as in originalFamilyIds (father id) - for (Phenotype phenotype : family.getPhenotypes()) { - assertEquals("New name", phenotype.getName()); - assertEquals("New source", phenotype.getSource()); - } - } - @Test public void updateFamilyQualityControl() throws CatalogException { DataResult originalFamily = createDummyFamily("Martinez-Martinez", true); @@ -941,18 +917,4 @@ public void updateFamilyQualityControl() throws CatalogException { assertEquals("date", updatedFamily.first().getQualityControl().getComments().get(0).getDate()); } - - @Test - public void updateFamilyMissingPhenotype() throws CatalogException { - DataResult originalFamily = createDummyFamily("Martinez-Martinez", true); - - Phenotype phenotype1 = new Phenotype("dis1", "New name", "New source"); - - FamilyUpdateParams updateParams = new FamilyUpdateParams().setPhenotypes(Collections.singletonList(phenotype1)); - - thrown.expect(CatalogException.class); - thrown.expectMessage("not present in any member of the family"); - familyManager.update(STUDY, originalFamily.first().getId(), updateParams, QueryOptions.empty(), sessionIdUser); - } - } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/family/FamilyCreateParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/family/FamilyCreateParams.java index e1993ed7025..6a758c785db 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/family/FamilyCreateParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/family/FamilyCreateParams.java @@ -17,8 +17,6 @@ package org.opencb.opencga.core.models.family; import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.models.clinical.Disorder; -import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.CustomStatusParams; import org.opencb.opencga.core.models.individual.Individual; @@ -35,8 +33,6 @@ public class FamilyCreateParams { private String name; private String description; - private List phenotypes; - private List disorders; private List members; private Integer expectedSize; @@ -48,14 +44,11 @@ public class FamilyCreateParams { public FamilyCreateParams() { } - public FamilyCreateParams(String id, String name, String description, List phenotypes, List disorders, - List members, Integer expectedSize, Map attributes, - List annotationSets, CustomStatusParams status) { + public FamilyCreateParams(String id, String name, String description, List members, Integer expectedSize, + Map attributes, List annotationSets, CustomStatusParams status) { this.id = id; this.name = name; this.description = description; - this.phenotypes = phenotypes; - this.disorders = disorders; this.members = members; this.expectedSize = expectedSize; this.attributes = attributes; @@ -64,8 +57,7 @@ public FamilyCreateParams(String id, String name, String description, List getPhenotypes() { - return phenotypes; - } - - public FamilyCreateParams setPhenotypes(List phenotypes) { - this.phenotypes = phenotypes; - return this; - } - - public List getDisorders() { - return disorders; - } - - public FamilyCreateParams setDisorders(List disorders) { - this.disorders = disorders; - return this; - } - public List getMembers() { return members; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/family/FamilyUpdateParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/family/FamilyUpdateParams.java index eec2040d640..6a857e0bb8e 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/family/FamilyUpdateParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/family/FamilyUpdateParams.java @@ -18,8 +18,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.core.JsonProcessingException; -import org.opencb.biodata.models.clinical.Disorder; -import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.CustomStatusParams; @@ -33,8 +31,6 @@ public class FamilyUpdateParams { private String id; private String name; private String description; - private List phenotypes; - private List disorders; private List members; private Integer expectedSize; private FamilyQualityControl qualityControl; @@ -45,14 +41,12 @@ public class FamilyUpdateParams { public FamilyUpdateParams() { } - public FamilyUpdateParams(String id, String name, String description, List phenotypes, List disorders, - List members, Integer expectedSize, CustomStatusParams status, FamilyQualityControl qualityControl, - List annotationSets, Map attributes) { + public FamilyUpdateParams(String id, String name, String description, List members, Integer expectedSize, + CustomStatusParams status, FamilyQualityControl qualityControl, List annotationSets, + Map attributes) { this.id = id; this.name = name; this.description = description; - this.phenotypes = phenotypes; - this.disorders = disorders; this.members = members; this.expectedSize = expectedSize; this.status = status; @@ -83,8 +77,6 @@ public String toString() { sb.append("id='").append(id).append('\''); sb.append(", name='").append(name).append('\''); sb.append(", description='").append(description).append('\''); - sb.append(", phenotypes=").append(phenotypes); - sb.append(", disorders=").append(disorders); sb.append(", members=").append(members); sb.append(", expectedSize=").append(expectedSize); sb.append(", status=").append(status); @@ -122,24 +114,6 @@ public FamilyUpdateParams setDescription(String description) { return this; } - public List getPhenotypes() { - return phenotypes; - } - - public FamilyUpdateParams setPhenotypes(List phenotypes) { - this.phenotypes = phenotypes; - return this; - } - - public List getDisorders() { - return disorders; - } - - public FamilyUpdateParams setDisorders(List disorders) { - this.disorders = disorders; - return this; - } - public List getMembers() { return members; } From 09aebc46d0dc7f01576ddf4309e8451ba4ea84da Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 15 Jun 2021 13:02:33 +0200 Subject: [PATCH 404/412] server: remove old refresh versioning parameters, closes #1786 --- .../db/mongodb/FamilyMongoDBAdaptor.java | 61 ------------------- .../db/mongodb/IndividualMongoDBAdaptor.java | 43 ------------- .../catalog/managers/FamilyManager.java | 3 +- .../catalog/managers/IndividualManager.java | 3 +- .../opencga/catalog/utils/Constants.java | 5 -- .../opencga/server/rest/FamilyWSServer.java | 14 ----- .../server/rest/IndividualWSServer.java | 12 ---- .../opencga/server/rest/OpenCGAWSServer.java | 3 - 8 files changed, 2 insertions(+), 142 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/FamilyMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/FamilyMongoDBAdaptor.java index 2910608d979..7fb2a37ac1c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/FamilyMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/FamilyMongoDBAdaptor.java @@ -24,8 +24,6 @@ import org.apache.commons.lang3.StringUtils; import org.bson.Document; import org.bson.conversions.Bson; -import org.opencb.biodata.models.clinical.Disorder; -import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.mongodb.MongoDBCollection; import org.opencb.commons.datastore.mongodb.MongoDBIterator; @@ -63,7 +61,6 @@ import java.util.*; import java.util.function.Consumer; import java.util.function.Function; -import java.util.stream.Collectors; import static org.opencb.opencga.catalog.db.mongodb.AuthorizationMongoDBUtils.filterAnnotationSets; import static org.opencb.opencga.catalog.db.mongodb.AuthorizationMongoDBUtils.getQueryForAuthorisedEntries; @@ -333,11 +330,6 @@ OpenCGAResult privateUpdate(ClientSession clientSession, Family family, .append(QueryParams.STUDY_UID.key(), family.getStudyUid()) .append(QueryParams.UID.key(), family.getUid()); - // TODO: This shouldn't be necessary now - if (queryOptions.getBoolean(Constants.REFRESH)) { - getLastVersionOfMembers(clientSession, tmpQuery, parameters); - } - if (queryOptions.getBoolean(Constants.INCREMENT_VERSION)) { createNewVersion(clientSession, family.getStudyUid(), family.getUid()); } else { @@ -456,59 +448,6 @@ private void checkInUseInLockedClinicalAnalysis(ClientSession clientSession, Fam } - private void getLastVersionOfMembers(ClientSession clientSession, Query query, ObjectMap parameters) - throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { - if (parameters.containsKey(QueryParams.MEMBERS.key())) { - throw new CatalogDBException("Invalid option: Cannot update to the last version of members and update to different members at " - + "the same time."); - } - - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, QueryParams.MEMBERS.key()); - OpenCGAResult queryResult = get(clientSession, query, options); - - if (queryResult.getNumResults() == 0) { - throw new CatalogDBException("Family not found."); - } - if (queryResult.getNumResults() > 1) { - throw new CatalogDBException("Update to the last version of members for multiple families at once is not supported."); - } - - Family family = queryResult.first(); - if (family.getMembers() == null || family.getMembers().isEmpty()) { - // Nothing to do - return; - } - - // If we update to the latest version, we will also need to fetch the disorders and phenotypes - List individualIds = family.getMembers().stream().map(Individual::getUid).collect(Collectors.toList()); - Query individualQuery = new Query() - .append(IndividualDBAdaptor.QueryParams.UID.key(), individualIds); - options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList( - IndividualDBAdaptor.QueryParams.UID.key(), IndividualDBAdaptor.QueryParams.VERSION.key(), - IndividualDBAdaptor.QueryParams.DISORDERS.key(), IndividualDBAdaptor.QueryParams.PHENOTYPES.key() - )); - OpenCGAResult individualDataResult = dbAdaptorFactory.getCatalogIndividualDBAdaptor() - .get(clientSession, individualQuery, options); - parameters.put(QueryParams.MEMBERS.key(), individualDataResult.getResults()); - - Map disorders = new HashMap<>(); - Map phenotypes = new HashMap<>(); - for (Individual individual : individualDataResult.getResults()) { - if (individual.getDisorders() != null) { - for (Disorder disorder : individual.getDisorders()) { - disorders.put(disorder.getId(), disorder); - } - } - if (individual.getPhenotypes() != null) { - for (Phenotype phenotype : individual.getPhenotypes()) { - phenotypes.put(phenotype.getId(), phenotype); - } - } - } - parameters.put(QueryParams.PHENOTYPES.key(), new ArrayList<>(phenotypes.values())); - parameters.put(QueryParams.DISORDERS.key(), new ArrayList<>(disorders.values())); - } - private void createNewVersion(ClientSession clientSession, long studyUid, long familyUid) throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { Query query = new Query() diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptor.java index 1383e571484..4d42f680c72 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptor.java @@ -364,12 +364,6 @@ OpenCGAResult privateUpdate(ClientSession clientSession, Individual indi .append(QueryParams.STUDY_UID.key(), individual.getStudyUid()) .append(QueryParams.UID.key(), individual.getUid()); - // TODO: This shouldn't be necessary now - if (queryOptions.getBoolean(Constants.REFRESH)) { - // Add the latest sample versions in the parameters object - updateToLastSampleVersions(clientSession, tmpQuery, parameters, queryOptions); - } - if (queryOptions.getBoolean(Constants.INCREMENT_VERSION)) { createNewVersion(clientSession, individual.getStudyUid(), individual.getUid()); } else { @@ -662,43 +656,6 @@ private void createNewVersion(ClientSession clientSession, long studyUid, long i createNewVersion(clientSession, individualCollection, queryResult.first()); } - private void updateToLastSampleVersions(ClientSession clientSession, Query query, ObjectMap parameters, QueryOptions queryOptions) - throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { - if (parameters.containsKey(QueryParams.SAMPLES.key())) { - throw new CatalogDBException("Invalid option: Cannot update to the last version of samples and update to different samples at " - + "the same time."); - } - - QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, QueryParams.SAMPLES.key()); - OpenCGAResult queryResult = get(query, options); - - if (queryResult.getNumResults() == 0) { - throw new CatalogDBException("Individual not found."); - } - if (queryResult.getNumResults() > 1) { - throw new CatalogDBException("Update to the last version of samples in multiple individuals at once not supported."); - } - - Individual individual = queryResult.first(); - if (individual.getSamples() == null || individual.getSamples().isEmpty()) { - // Nothing to do - return; - } - - List sampleIds = individual.getSamples().stream().map(Sample::getUid).collect(Collectors.toList()); - Query sampleQuery = new Query() - .append(SampleDBAdaptor.QueryParams.UID.key(), sampleIds); - options = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList( - SampleDBAdaptor.QueryParams.UID.key(), SampleDBAdaptor.QueryParams.VERSION.key() - )); - OpenCGAResult sampleDataResult = dbAdaptorFactory.getCatalogSampleDBAdaptor().get(clientSession, sampleQuery, options); - parameters.put(QueryParams.SAMPLES.key(), sampleDataResult.getResults()); - - // Add SET action for samples - queryOptions.putIfAbsent(Constants.ACTIONS, new HashMap<>()); - queryOptions.getMap(Constants.ACTIONS).put(QueryParams.SAMPLES.key(), SET); - } - UpdateDocument parseAndValidateUpdateParams(ClientSession clientSession, ObjectMap parameters, Query query, QueryOptions queryOptions) throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { UpdateDocument document = new UpdateDocument(); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java index a917a19f081..85b282f3ccb 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/FamilyManager.java @@ -883,8 +883,7 @@ private OpenCGAResult update(Study study, Family family, FamilyUpdatePar } // If there is nothing to update, we fail - if (parameters.isEmpty() && !options.getBoolean(Constants.REFRESH, false) - && !options.getBoolean(Constants.INCREMENT_VERSION, false) + if (parameters.isEmpty() && !options.getBoolean(Constants.INCREMENT_VERSION, false) && !options.getBoolean(ParamConstants.FAMILY_UPDATE_ROLES_PARAM, false)) { ParamUtils.checkUpdateParametersMap(parameters); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java index dd4a2c4f153..b0909f702ec 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java @@ -1285,8 +1285,7 @@ private OpenCGAResult update(Study study, Individual individual, IndividualUpdat options = ParamUtils.defaultObject(options, QueryOptions::new); - if (parameters.isEmpty() && !options.getBoolean(Constants.REFRESH, false) - && !options.getBoolean(Constants.INCREMENT_VERSION, false)) { + if (parameters.isEmpty() && !options.getBoolean(Constants.INCREMENT_VERSION, false)) { ParamUtils.checkUpdateParametersMap(parameters); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/Constants.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/Constants.java index db066672199..c9b2d92a2a5 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/Constants.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/utils/Constants.java @@ -64,11 +64,6 @@ public class Constants { */ public static final String INCREMENT_VERSION = "incVersion"; - /** - * Flag indicating to update the references from the document to point to their latest versions available. - */ - public static final String REFRESH = "refresh"; - /** * Numeric parameter containing the current release of the entries. */ diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/FamilyWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/FamilyWSServer.java index 84c46a1f84e..54eda1371c8 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/FamilyWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/FamilyWSServer.java @@ -218,8 +218,6 @@ public Response updateByQuery( @ApiParam(value = ParamConstants.ANNOTATION_DESCRIPTION) @QueryParam("annotation") String annotation, @QueryParam("release") String release, @ApiParam(value = "Create a new version of family", defaultValue = "false") @QueryParam(Constants.INCREMENT_VERSION) boolean incVersion, - @ApiParam(value = "Update all the individual references from the family to point to their latest versions", - defaultValue = "false") @QueryParam("updateIndividualVersion") boolean refresh, @ApiParam(value = "Action to be performed if the array of annotationSets is being updated.", allowableValues = "ADD,SET,REMOVE", defaultValue = "ADD") @QueryParam("annotationSetsAction") ParamUtils.BasicUpdateAction annotationSetsAction, @ApiParam(value = "body") FamilyUpdateParams parameters) { @@ -229,10 +227,6 @@ public Response updateByQuery( annotationSetsAction = ParamUtils.BasicUpdateAction.ADD; } - queryOptions.put(Constants.REFRESH, refresh); - queryOptions.remove("updateIndividualVersion"); - query.remove("updateIndividualVersion"); - Map actionMap = new HashMap<>(); actionMap.put(FamilyDBAdaptor.QueryParams.ANNOTATION_SETS.key(), annotationSetsAction); queryOptions.put(Constants.ACTIONS, actionMap); @@ -254,7 +248,6 @@ public Response updateByPost( @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String studyStr, @ApiParam(value = "Create a new version of family", defaultValue = "false") @QueryParam(Constants.INCREMENT_VERSION) boolean incVersion, @ApiParam(value = ParamConstants.FAMILY_UPDATE_ROLES_DESCRIPTION, defaultValue = "false") @QueryParam(ParamConstants.FAMILY_UPDATE_ROLES_PARAM) boolean updateRoles, - @ApiParam(value = "Update all the individual references from the family to point to their latest versions", defaultValue = "false") @QueryParam("updateIndividualVersion") boolean refresh, @ApiParam(value = "Action to be performed if the array of annotationSets is being updated.", allowableValues = "ADD,SET,REMOVE", defaultValue = "ADD") @QueryParam("annotationSetsAction") ParamUtils.BasicUpdateAction annotationSetsAction, @ApiParam(value = "body") FamilyUpdateParams parameters) { try { @@ -262,10 +255,6 @@ public Response updateByPost( annotationSetsAction = ParamUtils.BasicUpdateAction.ADD; } - queryOptions.put(Constants.REFRESH, refresh); - queryOptions.remove("updateIndividualVersion"); - query.remove("updateIndividualVersion"); - Map actionMap = new HashMap<>(); actionMap.put(FamilyDBAdaptor.QueryParams.ANNOTATION_SETS.key(), annotationSetsAction); queryOptions.put(Constants.ACTIONS, actionMap); @@ -316,14 +305,11 @@ public Response updateAnnotations( @QueryParam("action") ParamUtils.CompleteUpdateAction action, @ApiParam(value = "Create a new version of family", defaultValue = "false") @QueryParam(Constants.INCREMENT_VERSION) boolean incVersion, - @ApiParam(value = "Update all the individual references from the family to point to their latest versions", - defaultValue = "false") @QueryParam("updateSampleVersion") boolean refresh, @ApiParam(value = ParamConstants.ANNOTATION_SET_UPDATE_PARAMS_DESCRIPTION) Map updateParams) { try { if (action == null) { action = ParamUtils.CompleteUpdateAction.ADD; } - queryOptions.put(Constants.REFRESH, refresh); return createOkResponse(catalogManager.getFamilyManager().updateAnnotations(studyStr, familyStr, annotationSetId, updateParams, action, queryOptions, token)); diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/IndividualWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/IndividualWSServer.java index 6da8585ddeb..42e740b939a 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/IndividualWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/IndividualWSServer.java @@ -274,13 +274,9 @@ public Response updateByQuery( @QueryParam("annotationSetsAction") ParamUtils.BasicUpdateAction annotationSetsAction, @ApiParam(value = "Create a new version of individual", defaultValue = "false") @QueryParam(Constants.INCREMENT_VERSION) boolean incVersion, - @ApiParam(value = "Update all the sample references from the individual to point to their latest versions", - defaultValue = "false") @QueryParam("updateSampleVersion") boolean refresh, @ApiParam(value = ParamConstants.BODY_PARAM) IndividualUpdateParams updateParams) { try { query.remove(ParamConstants.STUDY_PARAM); - queryOptions.put(Constants.REFRESH, refresh); - queryOptions.remove("updateSampleVersion"); if (annotationSetsAction == null) { annotationSetsAction = ParamUtils.BasicUpdateAction.ADD; @@ -316,13 +312,8 @@ public Response updateByPost( @QueryParam("annotationSetsAction") ParamUtils.BasicUpdateAction annotationSetsAction, @ApiParam(value = "Create a new version of individual", defaultValue = "false") @QueryParam(Constants.INCREMENT_VERSION) boolean incVersion, - @ApiParam(value = "Update all the sample references from the individual to point to their latest versions", - defaultValue = "false") @QueryParam("updateSampleVersion") boolean refresh, @ApiParam(value = ParamConstants.BODY_PARAM) IndividualUpdateParams updateParams) { try { - queryOptions.put(Constants.REFRESH, refresh); - queryOptions.remove("updateSampleVersion"); - if (annotationSetsAction == null) { annotationSetsAction = ParamUtils.BasicUpdateAction.ADD; } @@ -381,14 +372,11 @@ public Response updateAnnotations( @ApiParam(value = ParamConstants.ANNOTATION_SET_UPDATE_ACTION_DESCRIPTION, allowableValues = "ADD,SET,REMOVE,RESET,REPLACE", defaultValue = "ADD") @QueryParam("action") ParamUtils.CompleteUpdateAction action, @ApiParam(value = "Create a new version of individual", defaultValue = "false") @QueryParam(Constants.INCREMENT_VERSION) boolean incVersion, - @ApiParam(value = "Update all the sample references from the individual to point to their latest versions", defaultValue = "false") - @QueryParam("updateSampleVersion") boolean refresh, @ApiParam(value = ParamConstants.ANNOTATION_SET_UPDATE_PARAMS_DESCRIPTION) Map updateParams) { try { if (action == null) { action = ParamUtils.CompleteUpdateAction.ADD; } - queryOptions.put(Constants.REFRESH, refresh); return createOkResponse(catalogManager.getIndividualManager().updateAnnotations(studyStr, individualStr, annotationSetId, updateParams, action, queryOptions, token)); diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java index d6007f20559..530f2a2397e 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java @@ -414,9 +414,6 @@ private void parseParams() throws VersionException { case Constants.INCREMENT_VERSION: queryOptions.put(Constants.INCREMENT_VERSION, Boolean.parseBoolean(value)); break; - case Constants.REFRESH: - queryOptions.put(Constants.REFRESH, Boolean.parseBoolean(value)); - break; case QueryOptions.COUNT: count = Boolean.parseBoolean(value); queryOptions.put(entry.getKey(), count); From fa71c21b3b75dc71203defe38d908ae88e22ccbb Mon Sep 17 00:00:00 2001 From: Antonio Altamura Date: Tue, 15 Jun 2021 14:27:36 +0000 Subject: [PATCH 405/412] GitBook: [develop] one page modified --- docs/using-opencga/client-libraries/javascript.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/using-opencga/client-libraries/javascript.md b/docs/using-opencga/client-libraries/javascript.md index faebd929371..8fc1dc77b10 100644 --- a/docs/using-opencga/client-libraries/javascript.md +++ b/docs/using-opencga/client-libraries/javascript.md @@ -1,6 +1,7 @@ # JavaScript -The OpenCGA JavaScript Client is provided as part of [JSorolla](https://github.com/opencb/jsorolla). +The OpenCGA JavaScript Client is provided as part of [JSorolla](https://github.com/opencb/jsorolla). +Some examples of basic usage can be found in [examples](https://github.com/opencb/jsorolla/tree/develop/src/core/clients/opencga/examples) directory. ### Example: @@ -35,7 +36,9 @@ const client = new OpenCGAClient({ })(); ``` -#### Fetching the first 10 variants of the Study of interest using OpenCGA credentials +#### Fetching the first 10 variants of the Study of interest using OpenCGA credentials. + +In this case an Opencga Session is created. The Opencga Study being used is the default one for the user. ```text import {OpenCGAClient} from "./opencga-client.js"; @@ -54,8 +57,9 @@ const client = new OpenCGAClient({ try { await client.login(USERNAME, PASSWORD) const session = await client.createSession(); - const restResponse = await session.opencgaClient.variants().query({"study": SUDY, limit: 10}); - console.log(restResponse.getResults()); + const restResponse = await session.opencgaClient.variants().query({limit:10, study: session.study.fqn}); + console.table(restResponse.getResults()); + } catch (e) { console.error(e) } From a91719d4621d99620e2ab0814486753b029230ed Mon Sep 17 00:00:00 2001 From: imedina Date: Wed, 16 Jun 2021 02:46:30 +0100 Subject: [PATCH 406/412] Prepare new release candidate 2.1.0-rc1 --- opencga-analysis/pom.xml | 4 ++-- opencga-app/pom.xml | 2 +- opencga-catalog/pom.xml | 2 +- opencga-client/pom.xml | 2 +- opencga-clinical/pom.xml | 2 +- opencga-core/pom.xml | 2 +- opencga-master/pom.xml | 2 +- opencga-server/pom.xml | 2 +- opencga-storage/opencga-storage-app/pom.xml | 2 +- opencga-storage/opencga-storage-benchmark/pom.xml | 2 +- opencga-storage/opencga-storage-core/pom.xml | 2 +- .../opencga-storage-hadoop-core/pom.xml | 2 +- .../opencga-storage-hadoop-deps-cdh5.13/pom.xml | 2 +- .../opencga-storage-hadoop-deps-emr5.31/pom.xml | 2 +- .../opencga-storage-hadoop-deps-emr5.8/pom.xml | 2 +- .../opencga-storage-hadoop-deps-emr6.1/pom.xml | 2 +- .../opencga-storage-hadoop-deps-hdp2.5/pom.xml | 2 +- .../opencga-storage-hadoop-deps-hdp2.6/pom.xml | 2 +- .../opencga-storage-hadoop-deps-hdp3.1/pom.xml | 2 +- .../opencga-storage-hadoop-deps/pom.xml | 4 ++-- opencga-storage/opencga-storage-hadoop/pom.xml | 4 ++-- opencga-storage/opencga-storage-mongodb/pom.xml | 2 +- opencga-storage/opencga-storage-server/pom.xml | 2 +- opencga-storage/pom.xml | 4 ++-- opencga-test/pom.xml | 2 +- pom.xml | 10 +++++----- 26 files changed, 34 insertions(+), 34 deletions(-) diff --git a/opencga-analysis/pom.xml b/opencga-analysis/pom.xml index 2bdd8da3ac0..48042291c0a 100644 --- a/opencga-analysis/pom.xml +++ b/opencga-analysis/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml @@ -119,7 +119,7 @@ org.opencb.opencga opencga-clinical - 2.1.0-SNAPSHOT + 2.1.0-rc1 compile diff --git a/opencga-app/pom.xml b/opencga-app/pom.xml index 66d48de242f..4d23898063b 100644 --- a/opencga-app/pom.xml +++ b/opencga-app/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-catalog/pom.xml b/opencga-catalog/pom.xml index f9c78121e69..2e7cca390f3 100644 --- a/opencga-catalog/pom.xml +++ b/opencga-catalog/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-client/pom.xml b/opencga-client/pom.xml index e084210ad06..9c5f9085284 100644 --- a/opencga-client/pom.xml +++ b/opencga-client/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-clinical/pom.xml b/opencga-clinical/pom.xml index 19e9ba77f94..fa001198f54 100644 --- a/opencga-clinical/pom.xml +++ b/opencga-clinical/pom.xml @@ -5,7 +5,7 @@ opencga org.opencb.opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml 4.0.0 diff --git a/opencga-core/pom.xml b/opencga-core/pom.xml index f1404591a20..1fac95fa15b 100644 --- a/opencga-core/pom.xml +++ b/opencga-core/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-master/pom.xml b/opencga-master/pom.xml index c175bad268f..7362bca3f4c 100644 --- a/opencga-master/pom.xml +++ b/opencga-master/pom.xml @@ -22,7 +22,7 @@ opencga org.opencb.opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 .. diff --git a/opencga-server/pom.xml b/opencga-server/pom.xml index 34a674f9a8c..ecf54ce9528 100644 --- a/opencga-server/pom.xml +++ b/opencga-server/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-app/pom.xml b/opencga-storage/opencga-storage-app/pom.xml index b198f84c7d1..f4e04fc8c2a 100644 --- a/opencga-storage/opencga-storage-app/pom.xml +++ b/opencga-storage/opencga-storage-app/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-benchmark/pom.xml b/opencga-storage/opencga-storage-benchmark/pom.xml index 7d3cc409cdc..cc7bf62bbab 100644 --- a/opencga-storage/opencga-storage-benchmark/pom.xml +++ b/opencga-storage/opencga-storage-benchmark/pom.xml @@ -21,7 +21,7 @@ opencga-storage org.opencb.opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 4.0.0 diff --git a/opencga-storage/opencga-storage-core/pom.xml b/opencga-storage/opencga-storage-core/pom.xml index afbd3801c06..4403e33a4a3 100644 --- a/opencga-storage/opencga-storage-core/pom.xml +++ b/opencga-storage/opencga-storage-core/pom.xml @@ -25,7 +25,7 @@ org.opencb.opencga opencga-storage - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml index 430aab9c9e5..cdcbeb6e64f 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml @@ -23,7 +23,7 @@ org.opencb.opencga opencga-storage-hadoop - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml index eb982a4a2d4..f5daa279bc4 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.31/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.31/pom.xml index 33dfe5b5f2b..67ad0fcc2b1 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.31/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.31/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml index 7829467b83a..ae90043ca1f 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr6.1/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr6.1/pom.xml index be921a84feb..20249b03072 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr6.1/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr6.1/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml index 9e5b5188d0f..a31f0998da2 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml index 08a09471e3b..54b46828776 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml index 7b3f5952caf..6350093a841 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml index 9331eb2ebaf..10c257d83d3 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml @@ -50,7 +50,7 @@ org.opencb.opencga opencga-storage-hadoop - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml @@ -66,7 +66,7 @@ opencga-storage-hadoop-deps - 2.1.0-SNAPSHOT + 2.1.0-rc1 pom diff --git a/opencga-storage/opencga-storage-hadoop/pom.xml b/opencga-storage/opencga-storage-hadoop/pom.xml index d82be628dcd..959d303948e 100644 --- a/opencga-storage/opencga-storage-hadoop/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/pom.xml @@ -30,12 +30,12 @@ org.opencb.opencga opencga-storage - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml opencga-storage-hadoop - 2.1.0-SNAPSHOT + 2.1.0-rc1 pom diff --git a/opencga-storage/opencga-storage-mongodb/pom.xml b/opencga-storage/opencga-storage-mongodb/pom.xml index 90ba7546bc0..dadaf3acb59 100644 --- a/opencga-storage/opencga-storage-mongodb/pom.xml +++ b/opencga-storage/opencga-storage-mongodb/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/opencga-storage-server/pom.xml b/opencga-storage/opencga-storage-server/pom.xml index 4971a6c67fb..1d763607171 100644 --- a/opencga-storage/opencga-storage-server/pom.xml +++ b/opencga-storage/opencga-storage-server/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml diff --git a/opencga-storage/pom.xml b/opencga-storage/pom.xml index adbe17a3fcc..c02713a7a5a 100644 --- a/opencga-storage/pom.xml +++ b/opencga-storage/pom.xml @@ -22,13 +22,13 @@ org.opencb.opencga opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 ../pom.xml opencga-storage - 2.1.0-SNAPSHOT + 2.1.0-rc1 pom diff --git a/opencga-test/pom.xml b/opencga-test/pom.xml index 5d6a63bfb71..632f547da73 100644 --- a/opencga-test/pom.xml +++ b/opencga-test/pom.xml @@ -24,7 +24,7 @@ org.opencb.opencga opencga-test - 2.1.0-SNAPSHOT + 2.1.0-rc1 pom diff --git a/pom.xml b/pom.xml index b7c5c95a2bd..abf6f9037e9 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.1.0-SNAPSHOT + 2.1.0-rc1 pom OpenCGA @@ -43,12 +43,12 @@ - 2.1.0-SNAPSHOT + 2.1.0-rc1 ${opencga.version} 2.1.0-beta - 5.0.0-SNAPSHOT - 2.1.0-SNAPSHOT - 4.1.0-SNAPSHOT + 5.0.0-rc + 2.1.0 + 4.1.0 0.2.0 2.10.1 From e55ea9ea2f414a6e8a8e4e9503973e65cf13f2c3 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 16 Jun 2021 10:01:33 +0200 Subject: [PATCH 407/412] catalog: check there are no duplicated variable sets --- .../opencga/catalog/db/api/StudyDBAdaptor.java | 14 +++++++------- .../catalog/db/mongodb/StudyMongoDBAdaptor.java | 2 +- .../catalog/managers/StudyManagerTest.java | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java index 2594cdf1d8a..35e723b7d88 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java @@ -344,8 +344,8 @@ OpenCGAResult markDeletedPermissionRule(long studyId, Enums.Enti */ Long variableSetExists(long variableSetId); - default Long variableSetExists(String variableSetName, long studyId) throws CatalogDBException { - Query query = new Query(QueryParams.VARIABLE_SET_NAME.key(), variableSetName).append(QueryParams.UID.key(), studyId); + default Long variableSetExists(String variableSetId, long studyId) throws CatalogDBException { + Query query = new Query(QueryParams.VARIABLE_SET_ID.key(), variableSetId).append(QueryParams.UID.key(), studyId); return count(query).getNumMatches(); } @@ -361,13 +361,13 @@ default void checkVariableSetExists(long variableSetId) throws CatalogDBExceptio } } - default void checkVariableSetExists(String variableSetName, long studyId) throws CatalogDBException { - Long count = variableSetExists(variableSetName, studyId); + default void checkVariableSetExists(String variableSetId, long studyId) throws CatalogDBException { + Long count = variableSetExists(variableSetId, studyId); if (count <= 0) { - throw CatalogDBException.newInstance("VariableSet name '{}' does not exist", variableSetName); + throw CatalogDBException.newInstance("VariableSet id '{}' does not exist", variableSetId); } else if (count > 1) { - throw CatalogDBException.newInstance("'{}' documents found with the VariableSet name '{}' in study '{}'", count, - variableSetName, studyId); + throw CatalogDBException.newInstance("'{}' documents found with the VariableSet id '{}' in study '{}'", count, + variableSetId, studyId); } } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java index 6c489f5ec2e..4dddf25ba4f 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java @@ -676,7 +676,7 @@ public Long variableSetExists(long variableSetId) { @Override public OpenCGAResult createVariableSet(long studyId, VariableSet variableSet) throws CatalogDBException { if (variableSetExists(variableSet.getId(), studyId) > 0) { - throw new CatalogDBException("VariableSet { name: '" + variableSet.getId() + "'} already exists."); + throw new CatalogDBException("VariableSet { id: '" + variableSet.getId() + "'} already exists."); } long variableSetId = getNewUid(); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/StudyManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/StudyManagerTest.java index 69d8bdcd887..eef9bd5976a 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/StudyManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/StudyManagerTest.java @@ -95,6 +95,22 @@ public void cleanVariable(Variable variable) { } } + @Test + public void testCreateDuplicatedVariableSets() throws Exception { + Study study = catalogManager.getStudyManager().get(studyFqn, null, token).first(); + + // Create a new variable set changing the id + study.getVariableSets().get(0).setId("newId"); + catalogManager.getStudyManager().createVariableSet(studyFqn, study.getVariableSets().get(0), token); + Study study2 = catalogManager.getStudyManager().get(studyFqn, null, token).first(); + assertEquals(study.getVariableSets().size() + 1, study2.getVariableSets().size()); + + // Replicate the first of the variable sets for creation + thrown.expect(CatalogException.class); + thrown.expectMessage("already exists"); + catalogManager.getStudyManager().createVariableSet(studyFqn, study.getVariableSets().get(0), token); + } + @Test public void internalVariableSetTest() throws CatalogException { Study study = catalogManager.getStudyManager().create(project1, "newStudy", "newStudy", "newStudy", null, null, From 626573e1b368973014795e5ba1d04d7fa5e18747 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 16 Jun 2021 10:14:11 +0200 Subject: [PATCH 408/412] catalog: add variable set duplication check in db as well --- .../opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java index 4dddf25ba4f..7d538377b11 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/StudyMongoDBAdaptor.java @@ -684,12 +684,15 @@ public OpenCGAResult createVariableSet(long studyId, VariableSet va Document object = getMongoDBDocument(variableSet, "VariableSet"); object.put(PRIVATE_UID, variableSetId); - Bson bsonQuery = Filters.eq(PRIVATE_UID, studyId); + Bson bsonQuery = Filters.and( + Filters.eq(PRIVATE_UID, studyId), + Filters.ne(QueryParams.VARIABLE_SET_ID.key(), variableSet.getId()) + ); Bson update = Updates.push("variableSets", object); DataResult result = studyCollection.update(bsonQuery, update, null); if (result.getNumUpdated() == 0) { - throw new CatalogDBException("createVariableSet: Could not create a new variable set in study " + studyId); + throw new CatalogDBException("CreateVariableSet: Could not create the VariableSet '" + variableSet.getId() + "'"); } return new OpenCGAResult<>(result); From 35dcf197e0e692c663b52bef0b82778bb5f08f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 16 Jun 2021 10:28:23 +0100 Subject: [PATCH 409/412] storage: Allow configure cellbase host at project level #1787 --- .../manager/VariantStorageManager.java | 105 ++++++++++++++---- .../docker/opencga-init/override_yaml.py | 2 +- .../opencga-init/test/test_override_yaml.py | 6 +- .../AddCellbaseConfigurationToProject.java | 31 ++++++ .../catalog/db/api/ProjectDBAdaptor.java | 1 + .../opencga/catalog/managers/JobManager.java | 20 +++- .../catalog/managers/ProjectManager.java | 62 +++++++++-- .../config/storage/CellBaseConfiguration.java | 42 +++++-- .../core/models/project/ProjectInternal.java | 17 +++ .../VariantOperationWebService.java | 12 ++ .../storage/core/StorageEngineFactory.java | 8 +- .../core/variant/VariantStorageEngine.java | 4 + .../CellBaseRestVariantAnnotator.java | 2 +- .../main/resources/storage-configuration.yml | 2 +- 14 files changed, 262 insertions(+), 52 deletions(-) create mode 100644 opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/storage/AddCellbaseConfigurationToProject.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java index 16851f5c5fe..eda4cc6711c 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java @@ -32,6 +32,8 @@ import org.opencb.biodata.tools.variant.converters.ga4gh.Ga4ghVariantConverter; import org.opencb.biodata.tools.variant.converters.ga4gh.factories.AvroGa4GhVariantFactory; import org.opencb.biodata.tools.variant.converters.ga4gh.factories.ProtoGa4GhVariantFactory; +import org.opencb.cellbase.core.config.SpeciesProperties; +import org.opencb.cellbase.core.result.CellBaseDataResponse; import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.datastore.solr.SolrManager; @@ -42,7 +44,6 @@ import org.opencb.opencga.analysis.variant.metadata.CatalogVariantMetadataFactory; import org.opencb.opencga.analysis.variant.operations.*; import org.opencb.opencga.analysis.variant.stats.VariantStatsAnalysis; -import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.db.api.*; import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogException; @@ -50,13 +51,17 @@ import org.opencb.opencga.catalog.managers.StudyManager; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.UriUtils; +import org.opencb.opencga.core.config.storage.CellBaseConfiguration; import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.job.Job; +import org.opencb.opencga.core.models.operations.variant.VariantAnnotationIndexParams; +import org.opencb.opencga.core.models.operations.variant.VariantAnnotationSaveParams; import org.opencb.opencga.core.models.operations.variant.VariantSampleIndexParams; import org.opencb.opencga.core.models.project.DataStore; import org.opencb.opencga.core.models.project.Project; @@ -96,11 +101,12 @@ import static org.opencb.commons.datastore.core.QueryOptions.*; import static org.opencb.opencga.analysis.variant.manager.operations.VariantFileIndexerOperationManager.FILE_GET_QUERY_OPTIONS; -import static org.opencb.opencga.core.api.ParamConstants.ACL_PARAM; -import static org.opencb.opencga.core.api.ParamConstants.STUDY_PARAM; +import static org.opencb.opencga.core.api.ParamConstants.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; -import static org.opencb.opencga.storage.core.variant.adaptors.sample.VariantSampleDataManager.*; -import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.*; +import static org.opencb.opencga.storage.core.variant.adaptors.sample.VariantSampleDataManager.SAMPLE_BATCH_SIZE; +import static org.opencb.opencga.storage.core.variant.adaptors.sample.VariantSampleDataManager.SAMPLE_BATCH_SIZE_DEFAULT; +import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.addDefaultSampleLimit; +import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.isValidParam; public class VariantStorageManager extends StorageManager implements AutoCloseable { @@ -440,8 +446,7 @@ public ObjectMap configureProject(String projectStr, ObjectMap params, String to dataStore.getConfiguration().putAll(params); catalogManager.getProjectManager() - .update(projectStr, new ObjectMap(ProjectDBAdaptor.QueryParams.INTERNAL_DATASTORES_VARIANT.key(), dataStore), - new QueryOptions(), token); + .setDatastoreVariant(projectStr, dataStore, token); return dataStore.getConfiguration(); }); } @@ -496,6 +501,62 @@ public OpenCGAResult configureSampleIndex(String studyStr, SampleIndexConfi }); } + /** + * Update Cellbase configuration. + * @param project Study identifier + * @param cellbaseConfiguration New cellbase configuration + * @param annotate Launch variant annotation if needed + * @param annotationSaveId Save previous variant annotation before annotating + * @param token User's token + * @return Result with VariantSampleIndexOperationTool job + * @throws CatalogException on catalog errors + * @throws StorageEngineException on storage engine errors + */ + public OpenCGAResult configureCellbase(String project, CellBaseConfiguration cellbaseConfiguration, boolean annotate, + String annotationSaveId, String token) + throws CatalogException, StorageEngineException { + StopWatch stopwatch = StopWatch.createStarted(); + return secureOperationByProject("configureCellbase", project, new ObjectMap(), token, engine -> { + OpenCGAResult result = new OpenCGAResult<>(); + result.setResults(new ArrayList<>()); + result.setEvents(new ArrayList<>()); + + engine.getConfiguration().setCellbase(cellbaseConfiguration); + engine.reloadCellbaseConfiguration(); + CellBaseDataResponse species = engine.getCellBaseUtils().getCellBaseClient().getMetaClient().species(); + if (species == null || species.firstResult() == null) { + throw new IllegalArgumentException("Unable to access cellbase url '" + cellbaseConfiguration.getUrl() + "'"); + } + + if (engine.getMetadataManager().exists()) { + List jobDependsOn = new ArrayList<>(1); + if (StringUtils.isNotEmpty(annotationSaveId)) { + VariantAnnotationSaveParams params = new VariantAnnotationSaveParams(annotationSaveId); + OpenCGAResult saveResult = catalogManager.getJobManager() + .submitProject(project, VariantAnnotationSaveOperationTool.ID, null, params.toParams(PROJECT_PARAM, project), + null, "Save variant annotation before changing cellbase configuration", null, null, token); + result.getResults().add(saveResult.first()); + if (saveResult.getEvents() != null) { + result.getEvents().addAll(saveResult.getEvents()); + } + jobDependsOn.add(saveResult.first().getUuid()); + } + if (annotate) { + VariantAnnotationIndexParams params = new VariantAnnotationIndexParams().setOverwriteAnnotations(true); + OpenCGAResult annotResult = catalogManager.getJobManager() + .submitProject(project, VariantAnnotationIndexOperationTool.ID, null, params.toParams(PROJECT_PARAM, project), + null, "Forced re-annotation after changing cellbase configuration", jobDependsOn, null, token); + result.getResults().add(annotResult.first()); + if (annotResult.getEvents() != null) { + result.getEvents().addAll(annotResult.getEvents()); + } + } + } + result.setTime((int) stopwatch.getTime(TimeUnit.MILLISECONDS)); + return result; + }); + } + // ---------------------// // Query methods // // ---------------------// @@ -841,6 +902,7 @@ protected VariantStorageEngine getVariantStorageEngineForStudyOperation(String s DataStore dataStore = getDataStore(study.getFqn(), token); VariantStorageEngine variantStorageEngine = storageEngineFactory .getVariantStorageEngine(dataStore.getStorageEngine(), dataStore.getDbName(), study.getFqn()); + configureCellbase(getProjectId(null, studyStr, token), variantStorageEngine, token); if (dataStore.getConfiguration() != null) { variantStorageEngine.getOptions().putAll(dataStore.getConfiguration()); } @@ -862,27 +924,33 @@ protected VariantStorageEngine getVariantStorageEngine(Query query, String token protected VariantStorageEngine getVariantStorageEngine(String study, String token) throws StorageEngineException, CatalogException { - DataStore dataStore = getDataStore(study, token); - return getVariantStorageEngine(dataStore); + return getVariantStorageEngineByProject(getProjectId(null, study, token), empty(), token); } protected VariantStorageEngine getVariantStorageEngineByProject(String project, ObjectMap params, String token) throws StorageEngineException, CatalogException { DataStore dataStore = getDataStoreByProjectId(project, token); - VariantStorageEngine variantStorageEngine = getVariantStorageEngine(dataStore); + VariantStorageEngine variantStorageEngine = storageEngineFactory + .getVariantStorageEngine(dataStore.getStorageEngine(), dataStore.getDbName()); + configureCellbase(project, variantStorageEngine, token); + if (dataStore.getConfiguration() != null) { + variantStorageEngine.getOptions().putAll(dataStore.getConfiguration()); + } if (params != null) { variantStorageEngine.getOptions().putAll(params); } return variantStorageEngine; } - private VariantStorageEngine getVariantStorageEngine(DataStore dataStore) throws StorageEngineException { - VariantStorageEngine variantStorageEngine = storageEngineFactory - .getVariantStorageEngine(dataStore.getStorageEngine(), dataStore.getDbName()); - if (dataStore.getConfiguration() != null) { - variantStorageEngine.getOptions().putAll(dataStore.getConfiguration()); + private void configureCellbase(String project, VariantStorageEngine engine, String token) + throws CatalogException { + CellBaseConfiguration cellbase = catalogManager.getProjectManager() + .get(project, new QueryOptions(INCLUDE, ProjectDBAdaptor.QueryParams.INTERNAL.key()), token) + .first().getInternal().getCellbase(); + if (cellbase != null) { + engine.getConfiguration().setCellbase(cellbase); + engine.reloadCellbaseConfiguration(); } - return variantStorageEngine; } public boolean isSolrAvailable() { @@ -967,11 +1035,6 @@ public boolean synchronizeCatalogStudyFromStorage(String study, List fil }); } - public boolean exists(DataStore dataStore) throws StorageEngineException { - VariantStorageEngine engine = getVariantStorageEngine(dataStore); - return engine.getMetadataManager().exists(); - } - public boolean exists(String study, String token) throws StorageEngineException, CatalogException { String studyFqn = getStudyFqn(study, token); VariantStorageEngine engine = getVariantStorageEngine(studyFqn, token); diff --git a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py index 7211e544ebe..c06322b37e5 100644 --- a/opencga-app/app/cloud/docker/opencga-init/override_yaml.py +++ b/opencga-app/app/cloud/docker/opencga-init/override_yaml.py @@ -76,7 +76,7 @@ # Inject cellbase rest host, if set if args.cellbase_rest_url is not None and args.cellbase_rest_url != "": cellbase_rest_url = args.cellbase_rest_url.replace('\"', '').replace('[','').replace(']','') - storage_config["cellbase"]["host"] = cellbase_rest_url + storage_config["cellbase"]["rest"] = cellbase_rest_url # set default engine storage_config["variant"]["defaultEngine"] = args.variant_default_engine diff --git a/opencga-app/app/cloud/docker/opencga-init/test/test_override_yaml.py b/opencga-app/app/cloud/docker/opencga-init/test/test_override_yaml.py index 4f9c2fa3c0d..9fe6a92a2eb 100644 --- a/opencga-app/app/cloud/docker/opencga-init/test/test_override_yaml.py +++ b/opencga-app/app/cloud/docker/opencga-init/test/test_override_yaml.py @@ -574,7 +574,7 @@ def test_cellbase_rest_set(self): "cellbase", ) self.assertEqual( - storage_config["cellbase"]["host"], "http://test-cellbase-server1:8080" + storage_config["cellbase"]["url"], "http://test-cellbase-server1:8080" ) def test_cellbase_rest_empty_set(self): @@ -659,7 +659,7 @@ def test_cellbase_rest_empty_set(self): "cellbase", ) self.assertEqual( - storage_config["cellbase"]["host"], + storage_config["cellbase"]["url"], "https://ws.opencb.org/cellbase/", ) @@ -743,7 +743,7 @@ def test_cellbase_rest_not_set(self): "cellbase", ) self.assertEqual( - storage_config["cellbase"]["host"], + storage_config["cellbase"]["url"], "https://ws.opencb.org/cellbase/", ) diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/storage/AddCellbaseConfigurationToProject.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/storage/AddCellbaseConfigurationToProject.java new file mode 100644 index 00000000000..8b680856819 --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v2_1_0/storage/AddCellbaseConfigurationToProject.java @@ -0,0 +1,31 @@ +package org.opencb.opencga.app.migrations.v2_1_0.storage; + + +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.catalog.migration.Migration; +import org.opencb.opencga.catalog.migration.MigrationTool; +import org.opencb.opencga.core.config.storage.StorageConfiguration; +import org.opencb.opencga.core.models.project.Project; + +@Migration(id="add_cellbase_configuration_to_project", description = "Add cellbase configuration from storage-configuration.yml to project.internal.cellbase", version = "2.1.0", + language = Migration.MigrationLanguage.JAVA, + domain = Migration.MigrationDomain.STORAGE, + patch = 1, + rank = 11) +public class AddCellbaseConfigurationToProject extends MigrationTool { + + @Override + protected void run() throws Exception { + StorageConfiguration storageConfiguration = readStorageConfiguration(); +// StorageEngineFactory engineFactory = StorageEngineFactory.get(storageConfiguration); +// VariantStorageManager variantStorageManager = new VariantStorageManager(catalogManager, engineFactory); + + for (Project project : catalogManager.getProjectManager().get(new Query(), new QueryOptions(), token).getResults()) { + if (project.getInternal() == null || project.getInternal().getCellbase() == null) { + catalogManager.getProjectManager() + .setInternalCellbaseConfiguration(project.getFqn(), storageConfiguration.getCellbase(), token); + } + } + } +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ProjectDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ProjectDBAdaptor.java index 84adfbd143b..8d9c5ec6737 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ProjectDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ProjectDBAdaptor.java @@ -60,6 +60,7 @@ enum QueryParams implements QueryParam { USER_ID("userId", TEXT, ""), INTERNAL_DATASTORES("internal.datastores", TEXT_ARRAY, ""), INTERNAL_DATASTORES_VARIANT("internal.datastores.variant", TEXT_ARRAY, ""), + INTERNAL_CELLBASE("internal.cellbase", TEXT_ARRAY, ""), INTERNAL("internal", TEXT_ARRAY, ""), ATTRIBUTES("attributes", TEXT, ""), // "Format: where is [<|<=|>|>=|==|!=|~|!~]" diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java index ff8b2f59eeb..1fd7230c3e7 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java @@ -23,7 +23,6 @@ import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; @@ -41,6 +40,7 @@ import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.AclParams; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.file.FileContent; @@ -425,6 +425,24 @@ public OpenCGAResult submit(String studyStr, String toolId, Enums.Priority return submit(studyStr, toolId, priority, params, null, null, null, null, token); } + public OpenCGAResult submitProject(String projectStr, String toolId, Enums.Priority priority, Map params, + String jobId, String jobDescription, List jobDependsOn, List jobTags, + String token) throws CatalogException { + // Project job + QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, StudyDBAdaptor.QueryParams.FQN.key()); + // Peek any study. The ExecutionDaemon will take care of filling up the rest of studies. + List studies = catalogManager.getStudyManager() + .search(projectStr, new Query(), options, token) + .getResults() + .stream() + .map(Study::getFqn) + .collect(Collectors.toList()); + if (studies.isEmpty()) { + throw new CatalogException("Project '" + projectStr + "' not found!"); + } + return submit(studies.get(0), toolId, priority, params, jobId, jobDescription, jobDependsOn, jobTags, token); + } + public OpenCGAResult submit(String studyStr, String toolId, Enums.Priority priority, Map params, String jobId, String jobDescription, List jobDependsOn, List jobTags, String token) throws CatalogException { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java index ba6dc21b777..44293d260ef 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ProjectManager.java @@ -24,7 +24,6 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.result.Error; import org.opencb.commons.utils.ListUtils; -import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.catalog.auth.authorization.AuthorizationManager; import org.opencb.opencga.catalog.db.DBAdaptorFactory; import org.opencb.opencga.catalog.db.api.*; @@ -35,14 +34,13 @@ import org.opencb.opencga.catalog.utils.UuidUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.config.storage.CellBaseConfiguration; +import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.individual.Individual; -import org.opencb.opencga.core.models.project.Datastores; -import org.opencb.opencga.core.models.project.Project; -import org.opencb.opencga.core.models.project.ProjectInternal; -import org.opencb.opencga.core.models.project.ProjectOrganism; +import org.opencb.opencga.core.models.project.*; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.models.user.Account; @@ -65,6 +63,21 @@ public class ProjectManager extends AbstractManager { private final CatalogIOManager catalogIOManager; + private static final Set UPDATABLE_FIELDS = new HashSet<>(Arrays.asList( + ProjectDBAdaptor.QueryParams.ID.key(), + ProjectDBAdaptor.QueryParams.NAME.key(), + ProjectDBAdaptor.QueryParams.DESCRIPTION.key(), + ProjectDBAdaptor.QueryParams.ORGANIZATION.key(), + ProjectDBAdaptor.QueryParams.ORGANISM_SCIENTIFIC_NAME.key(), + ProjectDBAdaptor.QueryParams.ORGANISM_COMMON_NAME.key(), + ProjectDBAdaptor.QueryParams.ORGANISM_ASSEMBLY.key(), + ProjectDBAdaptor.QueryParams.ATTRIBUTES.key() + )); + private static final Set PROTECTED_UPDATABLE_FIELDS = new HashSet<>(Arrays.asList( + ProjectDBAdaptor.QueryParams.INTERNAL_DATASTORES_VARIANT.key(), + ProjectDBAdaptor.QueryParams.INTERNAL_CELLBASE.key() + )); + ProjectManager(AuthorizationManager authorizationManager, AuditManager auditManager, CatalogManager catalogManager, DBAdaptorFactory catalogDBAdaptorFactory, CatalogIOManager catalogIOManager, Configuration configuration) { super(authorizationManager, auditManager, catalogManager, catalogDBAdaptorFactory, configuration); @@ -402,6 +415,23 @@ public OpenCGAResult get(Query query, QueryOptions options, String toke */ public OpenCGAResult update(String projectId, ObjectMap parameters, QueryOptions options, String token) throws CatalogException { + return update(projectId, parameters, options, false, token); + } + + /** + * Update metada from projects. + * + * @param projectId Project id or alias. + * @param parameters Parameters to change. + * @param options options + * @param allowProtectedUpdates Allow protected updates + * @param token sessionId + * @return The modified entry. + * @throws CatalogException CatalogException + */ + private OpenCGAResult update(String projectId, ObjectMap parameters, QueryOptions options, boolean allowProtectedUpdates, + String token) + throws CatalogException { String userId = this.catalogManager.getUserManager().getUserId(token); ObjectMap auditParams = new ObjectMap() @@ -426,12 +456,11 @@ public OpenCGAResult update(String projectId, ObjectMap parameters, Que authorizationManager.checkCanEditProject(projectUid, userId); for (String s : parameters.keySet()) { - if (!s.matches(ProjectDBAdaptor.QueryParams.ID.key() + "|name|description|organization|attributes|" - + ProjectDBAdaptor.QueryParams.ORGANISM_SCIENTIFIC_NAME.key() + "|" - + ProjectDBAdaptor.QueryParams.ORGANISM_COMMON_NAME.key() + "|" - + ProjectDBAdaptor.QueryParams.ORGANISM_ASSEMBLY.key() + "|" - + ProjectDBAdaptor.QueryParams.INTERNAL_DATASTORES.key() + "|" - + ProjectDBAdaptor.QueryParams.INTERNAL_DATASTORES_VARIANT.key())) { + if (UPDATABLE_FIELDS.contains(s)) { + continue; + } else if (allowProtectedUpdates && PROTECTED_UPDATABLE_FIELDS.contains(s)) { + logger.info("Updating protected field '{}' from project '{}'", s, project.getFqn()); + } else { throw new CatalogDBException("Parameter '" + s + "' can't be changed"); } } @@ -483,6 +512,17 @@ public OpenCGAResult update(String projectId, ObjectMap parameters, Que } } + public OpenCGAResult setDatastoreVariant(String projectStr, DataStore dataStore, String token) throws CatalogException { + return update(projectStr, + new ObjectMap(ProjectDBAdaptor.QueryParams.INTERNAL_DATASTORES_VARIANT.key(), dataStore), new QueryOptions(), true, token); + } + + public OpenCGAResult setInternalCellbaseConfiguration(String projectStr, CellBaseConfiguration configuration, String token) + throws CatalogException { + return update(projectStr, + new ObjectMap(ProjectDBAdaptor.QueryParams.INTERNAL_CELLBASE.key(), configuration), new QueryOptions(), true, token); + } + public Map facet(String projectStr, String fileFields, String sampleFields, String individualFields, String cohortFields, String familyFields, String jobFields, boolean defaultStats, String sessionId) throws CatalogException, IOException { diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CellBaseConfiguration.java b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CellBaseConfiguration.java index e95025247eb..6875f9f4931 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CellBaseConfiguration.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/config/storage/CellBaseConfiguration.java @@ -16,6 +16,7 @@ package org.opencb.opencga.core.config.storage; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import org.apache.commons.lang3.StringUtils; import org.opencb.cellbase.client.config.ClientConfiguration; import org.opencb.cellbase.client.config.RestConfig; @@ -27,11 +28,12 @@ /** * Created by imedina on 04/05/15. */ +@JsonIgnoreProperties(allowSetters = true, value = {"host", "preferred", "hosts", "database"}) public class CellBaseConfiguration { /* * URL to CellBase REST web services, by default official UCam installation is used */ - private String host; + private String url; /* * CellBase version to be used, by default the 'v4' stable @@ -45,43 +47,60 @@ public CellBaseConfiguration() { this(CELLBASE_HOST, CELLBASE_VERSION); } - public CellBaseConfiguration(String host, String version) { - this.host = host; + public CellBaseConfiguration(String url, String version) { + this.url = url; this.version = version; } @Override public String toString() { final StringBuilder sb = new StringBuilder("CellBaseConfiguration{"); - sb.append("host=").append(host); + sb.append("url=").append(url); sb.append(", version='").append(version).append('\''); sb.append('}'); return sb.toString(); } + public String getUrl() { + return url; + } + + public CellBaseConfiguration setUrl(String url) { + this.url = url; + return this; + } + + @Deprecated public String getHost() { - return host; + return url; } + @Deprecated public CellBaseConfiguration setHost(String host) { - this.host = host; + if (host != null) { + LoggerFactory.getLogger(CellBaseConfiguration.class).warn("Deprecated option 'cellbase.host'. Use 'cellbase.url'"); + } + url = host; return this; } @Deprecated public List getHosts() { - return Collections.singletonList(host); + return Collections.singletonList(url); } @Deprecated public void setHosts(List hosts) { + if (hosts != null) { + LoggerFactory.getLogger(CellBaseConfiguration.class).warn("Deprecated option 'cellbase.hosts'. Use 'cellbase.url'"); + } if (hosts == null || hosts.isEmpty()) { - host = null; + url = null; } else { if (hosts.size() != 1) { throw new IllegalArgumentException("Unsupported multiple cellbase hosts"); } - host = hosts.get(0); + url = hosts.get(0); } } @@ -89,8 +108,9 @@ public String getVersion() { return version; } - public void setVersion(String version) { + public CellBaseConfiguration setVersion(String version) { this.version = version; + return this; } @Deprecated @@ -122,7 +142,7 @@ public ClientConfiguration toClientConfiguration() { clientConfiguration.setVersion(this.getVersion()); clientConfiguration.setDefaultSpecies("hsapiens"); RestConfig rest = new RestConfig(); - rest.setHosts(Collections.singletonList(this.getHost().replace("/webservices/rest", ""))); + rest.setHosts(Collections.singletonList(this.getUrl().replace("/webservices/rest", ""))); clientConfiguration.setRest(rest); return clientConfiguration; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/project/ProjectInternal.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/project/ProjectInternal.java index 7fd3c81b2af..a9f2d20655a 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/project/ProjectInternal.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/project/ProjectInternal.java @@ -16,11 +16,13 @@ package org.opencb.opencga.core.models.project; +import org.opencb.opencga.core.config.storage.CellBaseConfiguration; import org.opencb.opencga.core.models.common.Status; public class ProjectInternal { private Datastores datastores; + private CellBaseConfiguration cellbase; private Status status; public ProjectInternal() { @@ -31,6 +33,12 @@ public ProjectInternal(Datastores datastores, Status status) { this.status = status; } + public ProjectInternal(Datastores datastores, CellBaseConfiguration cellbase, Status status) { + this.datastores = datastores; + this.cellbase = cellbase; + this.status = status; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("ProjectInternal{"); @@ -49,6 +57,15 @@ public ProjectInternal setDatastores(Datastores datastores) { return this; } + public CellBaseConfiguration getCellbase() { + return cellbase; + } + + public ProjectInternal setCellbase(CellBaseConfiguration cellbase) { + this.cellbase = cellbase; + return this; + } + public Status getStatus() { return status; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java index 1fdcbb89b2e..2995d9cce85 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/operations/VariantOperationWebService.java @@ -27,6 +27,7 @@ import org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils; import org.opencb.opencga.analysis.variant.operations.*; import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.config.storage.CellBaseConfiguration; import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.exceptions.VersionException; import org.opencb.opencga.core.models.job.Job; @@ -67,6 +68,17 @@ public VariantOperationWebService(String version, @Context UriInfo uriInfo, @Con super(version, uriInfo, httpServletRequest, httpHeaders); } + @POST + @Path("/cellbase/configure") + @ApiOperation(value = "Update Cellbase configuration", response = Job.class) + public Response cellbaseConfigure( + @ApiParam(value = ParamConstants.PROJECT_DESCRIPTION) @QueryParam(ParamConstants.PROJECT_PARAM) String project, + @ApiParam(value = VariantAnnotationIndexOperationTool.DESCRIPTION) @QueryParam("annotationUpdate") boolean annotate, + @ApiParam(value = VariantAnnotationSaveOperationTool.DESCRIPTION) @QueryParam("annotationSaveId") String annotationSaveId, + @ApiParam(value = "New cellbase configuration") CellBaseConfiguration configuration) { + return run(() -> variantManager.configureCellbase(project, configuration, annotate, annotationSaveId, token)); + } + @POST @Path("/variant/configure") @ApiOperation(value = "Update Variant Storage Engine configuration. Can be updated at Project or Study level", response = ObjectMap.class) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java index 1b121b65d0f..ae59533ab59 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/StorageEngineFactory.java @@ -16,7 +16,9 @@ package org.opencb.opencga.storage.core; +import com.fasterxml.jackson.databind.JsonMappingException; import org.apache.commons.lang3.StringUtils; +import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.storage.core.alignment.AlignmentStorageEngine; import org.opencb.opencga.storage.core.alignment.local.LocalAlignmentStorageEngine; import org.opencb.opencga.core.config.storage.StorageConfiguration; @@ -137,11 +139,13 @@ private synchronized T getStorageEngine(Type type, Str try { T storageEngine = Class.forName(clazz).asSubclass(superClass).newInstance(); - storageEngine.setConfiguration(this.storageConfiguration, storageEngineId, dbName); + StorageConfiguration storageConfiguration = JacksonUtils.getDefaultObjectMapper() + .updateValue(new StorageConfiguration(), this.storageConfiguration); + storageEngine.setConfiguration(storageConfiguration, storageEngineId, dbName); storageEnginesMap.put(key, storageEngine); return storageEngine; - } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) { + } catch (IllegalAccessException | InstantiationException | ClassNotFoundException | JsonMappingException e) { throw new StorageEngineException("Error instantiating StorageEngine '" + clazz + "'", e); } } else { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageEngine.java index e4727160faa..d509f1a073a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageEngine.java @@ -895,6 +895,10 @@ public abstract void loadVariantScore(URI scoreFile, String study, String scoreN @Override public abstract void testConnection() throws StorageEngineException; + public void reloadCellbaseConfiguration() { + cellBaseUtils = null; + } + public CellBaseUtils getCellBaseUtils() throws StorageEngineException { if (cellBaseUtils == null) { final ProjectMetadata metadata = getMetadataManager().getProjectMetadata(getOptions()); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java index 35bcb5f0eba..1bfaf9caafb 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java @@ -48,7 +48,7 @@ public CellBaseRestVariantAnnotator(StorageConfiguration storageConfiguration, P throws VariantAnnotatorException { super(storageConfiguration, projectMetadata, options); - String cellbaseRest = storageConfiguration.getCellbase().getHost(); + String cellbaseRest = storageConfiguration.getCellbase().getUrl(); if (StringUtils.isEmpty(cellbaseRest)) { throw new VariantAnnotatorException("Missing defaultValue \"CellBase Hosts\""); } diff --git a/opencga-storage/opencga-storage-core/src/main/resources/storage-configuration.yml b/opencga-storage/opencga-storage-core/src/main/resources/storage-configuration.yml index 967e2241cc5..2e74cb2d9b1 100644 --- a/opencga-storage/opencga-storage-core/src/main/resources/storage-configuration.yml +++ b/opencga-storage/opencga-storage-core/src/main/resources/storage-configuration.yml @@ -4,7 +4,7 @@ ## This can be set up using maven profiles in your .m2/settings.xml cellbase: ## URL host to annotate variants, for example: http://ws.opencb.org/cellbase/ - host: "${OPENCGA.CELLBASE.REST.HOST}" + url: "${OPENCGA.CELLBASE.REST.HOST}" version: "${OPENCGA.CELLBASE.VERSION}" ## Storage Query Server configuration. When CLI is launched in 'server' mode a RESTful web server From db56ecda95baae7dce9eaee2088d67446645d6a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Wed, 16 Jun 2021 10:33:20 +0100 Subject: [PATCH 410/412] client: Update rest clients --- .../client/rest/clients/AdminClient.java | 2 +- .../client/rest/clients/AlignmentClient.java | 13 +- .../client/rest/clients/ClinicalClient.java | 56 +++++++-- .../client/rest/clients/CohortClient.java | 2 +- .../rest/clients/DiseasePanelClient.java | 2 +- .../client/rest/clients/FamilyClient.java | 2 +- .../client/rest/clients/FileClient.java | 2 +- .../client/rest/clients/GA4GHClient.java | 2 +- .../client/rest/clients/IndividualClient.java | 2 +- .../client/rest/clients/JobClient.java | 2 +- .../client/rest/clients/MetaClient.java | 2 +- .../client/rest/clients/ProjectClient.java | 2 +- .../client/rest/clients/SampleClient.java | 2 +- .../client/rest/clients/StudyClient.java | 2 +- .../client/rest/clients/UserClient.java | 2 +- .../client/rest/clients/VariantClient.java | 118 +++++++++++------- .../rest/clients/VariantOperationClient.java | 19 ++- 17 files changed, 159 insertions(+), 73 deletions(-) diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java index 980589f900b..8db1013bd9b 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AdminClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java index 9b310d7d96e..6fb35d98320 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/AlignmentClient.java @@ -40,7 +40,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -178,7 +178,7 @@ public RestResponse statsCoverage(String file, String gene, O /** * Deeptools is a suite of python tools particularly developed for the efficient analysis of high-throughput sequencing data, such as * ChIP-seq, RNA-seq or MNase-seq. - * @param data Deeptools parameters. + * @param data Deeptools parameters. Supported Deeptools commands: bamCoverage, bamCompare. * @param params Map containing any of the following optional parameters. * study: study. * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. @@ -233,7 +233,7 @@ public RestResponse runIndex(AlignmentIndexParams data, ObjectMap params) t /** * Picard is a set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) data and formats such as * SAM/BAM/CRAM and VCF. Supported Picard commands: CollectHsMetrics, CollectWgsMetrics, BedToIntervalList. - * @param data Picard parameters. + * @param data Picard parameters. Supported Picard commands: CollectHsMetrics, CollectWgsMetrics, BedToIntervalList. * @param params Map containing any of the following optional parameters. * study: study. * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. @@ -252,8 +252,9 @@ public RestResponse runPicard(PicardWrapperParams data, ObjectMap params) t /** * Compute quality control (QC) metrics for a given alignment file (including samtools stats, samtools flag stats, FastQC and HS * metrics). - * @param data Alignment quality control (QC) parameters. The BAM file is mandatory ever but the BED file and the dictionary files are - * only mandatory for computing hybrid-selection (HS) metrics. + * @param data Alignment quality control (QC) parameters. It computes: stats, flag stats, fastqc and hybrid-selection metrics. The BAM + * file is mandatory ever but the BED fileand the dictionary files are only mandatory for computing hybrid-selection (HS) metrics. + * In order to skip some metrics, use the following keywords (separated by commas): stats, flagstats, fastqc and hsmetrics. * @param params Map containing any of the following optional parameters. * study: study. * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. @@ -304,7 +305,7 @@ public RestResponse query(String file, ObjectMap params) throws C /** * Samtools is a program for interacting with high-throughput sequencing data in SAM, BAM and CRAM formats. Supported Samtools * commands: sort, index, view, stats, flagstat, dict, faidx, depth, plot-bamstats. - * @param data Samtoolstools parameters. + * @param data Samtools parameters. Supported Samtools commands: sort, index, view, stats, flagstat, dict, faidx, depth, plot-bamstats. * @param params Map containing any of the following optional parameters. * study: study. * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java index 30c6ed60ac1..c52a41f7965 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ClinicalClient.java @@ -26,6 +26,7 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividualSummary; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariantSummary; import org.opencb.opencga.core.models.analysis.knockout.RgaKnockoutByGene; import org.opencb.opencga.core.models.clinical.CancerTieringInterpretationAnalysisParams; import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; @@ -48,7 +49,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -294,6 +295,7 @@ public RestResponse runInterpreterZetta(ZettaInterpretationAnalysisParams d * end: Filter by end position. * transcriptId: Filter by transcript id. * variants: Filter by variant id. + * dbSnps: Filter by DB_SNP id. * knockoutType: Filter by knockout type. * filter: Filter by filter (PASS, NOT_PASS). * type: Filter by variant type. @@ -334,6 +336,7 @@ public RestResponse aggregationStatsRga(String field, ObjectMap para * end: Filter by end position. * transcriptId: Filter by transcript id. * variants: Filter by variant id. + * dbSnps: Filter by DB_SNP id. * knockoutType: Filter by knockout type. * filter: Filter by filter (PASS, NOT_PASS). * type: Filter by variant type. @@ -355,9 +358,6 @@ public RestResponse queryRgaGene(ObjectMap params) throws Cli * limit: Number of results to be returned. * skip: Number of results to skip. * count: Get the total number of results matching the query. Deactivated by default. - * includeIndividual: Include only the comma separated list of individuals to the response. - * skipIndividual: Number of individuals to skip. - * limitIndividual: Limit number of individuals returned (default: 1000). * sampleId: Filter by sample id. * individualId: Filter by individual id. * sex: Filter by sex. @@ -371,6 +371,7 @@ public RestResponse queryRgaGene(ObjectMap params) throws Cli * end: Filter by end position. * transcriptId: Filter by transcript id. * variants: Filter by variant id. + * dbSnps: Filter by DB_SNP id. * knockoutType: Filter by knockout type. * filter: Filter by filter (PASS, NOT_PASS). * type: Filter by variant type. @@ -395,6 +396,7 @@ public RestResponse summaryRgaGene(ObjectMap params) thro * jobDescription: Job description. * jobDependsOn: Comma separated list of existing job IDs the job will depend on. * jobTags: Job tags. + * auxiliarIndex: Index auxiliar collection to improve performance assuming RGA is completely indexed. * @return a RestResponse object. * @throws ClientException ClientException if there is any server error. */ @@ -425,6 +427,7 @@ public RestResponse runRgaIndex(RgaAnalysisParams data, ObjectMap params) t * end: Filter by end position. * transcriptId: Filter by transcript id. * variants: Filter by variant id. + * dbSnps: Filter by DB_SNP id. * knockoutType: Filter by knockout type. * filter: Filter by filter (PASS, NOT_PASS). * type: Filter by variant type. @@ -459,6 +462,7 @@ public RestResponse queryRgaIndividual(ObjectMap params) t * end: Filter by end position. * transcriptId: Filter by transcript id. * variants: Filter by variant id. + * dbSnps: Filter by DB_SNP id. * knockoutType: Filter by knockout type. * filter: Filter by filter (PASS, NOT_PASS). * type: Filter by variant type. @@ -498,6 +502,7 @@ public RestResponse summaryRgaIndividual(ObjectMap * end: Filter by end position. * transcriptId: Filter by transcript id. * variants: Filter by variant id. + * dbSnps: Filter by DB_SNP id. * knockoutType: Filter by knockout type. * filter: Filter by filter (PASS, NOT_PASS). * type: Filter by variant type. @@ -513,6 +518,41 @@ public RestResponse queryRgaVariant(ObjectMap params) throws return execute("analysis", null, "clinical/rga/variant", null, "query", params, GET, KnockoutByVariant.class); } + /** + * RGA variant summary stats. + * @param params Map containing any of the following optional parameters. + * limit: Number of results to be returned. + * skip: Number of results to skip. + * count: Get the total number of results matching the query. Deactivated by default. + * sampleId: Filter by sample id. + * individualId: Filter by individual id. + * sex: Filter by sex. + * phenotypes: Filter by phenotypes. + * disorders: Filter by disorders. + * numParents: Filter by the number of parents registered. + * geneId: Filter by gene id. + * geneName: Filter by gene name. + * chromosome: Filter by chromosome. + * start: Filter by start position. + * end: Filter by end position. + * transcriptId: Filter by transcript id. + * variants: Filter by variant id. + * dbSnps: Filter by DB_SNP id. + * knockoutType: Filter by knockout type. + * filter: Filter by filter (PASS, NOT_PASS). + * type: Filter by variant type. + * clinicalSignificance: Filter by clinical significance. + * populationFrequency: Filter by population frequency. + * consequenceType: Filter by consequence type. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse summaryRgaVariant(ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + return execute("analysis", null, "clinical/rga/variant", null, "summary", params, GET, KnockoutByVariantSummary.class); + } + /** * Clinical analysis search. * @param params Map containing any of the following optional parameters. @@ -594,10 +634,10 @@ public RestResponse actionableVariant(ObjectMap params) throws * operators. e.g. HG0097:0/0;HG0098:0/1,1/1 . Unphased genotypes (e.g. 0/1, 1/1) will also include phased genotypes (e.g. * 0|1, 1|0, 1|1), but not vice versa. When filtering by multi-allelic genotypes, any secondary allele will match, * regardless of its position e.g. 1/2 will match with genotypes 1/2, 1/3, 1/4, .... Genotype aliases accepted: HOM_REF, - * HOM_ALT, HET, HET_REF, HET_ALT and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT . 3) Sample with segregation mode: - * {sample}:{segregation}. Only one sample accepted.Accepted segregation modes: [ autosomalDominant, autosomalRecessive, - * XLinkedDominant, XLinkedRecessive, YLinked, mitochondrial, deNovo, mendelianError, compoundHeterozygous ]. Value is case - * insensitive. e.g. HG0097:DeNovo Sample must have parents defined and indexed. . + * HOM_ALT, HET, HET_REF, HET_ALT, HET_MISS and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT . 3) Sample with + * segregation mode: {sample}:{segregation}. Only one sample accepted.Accepted segregation modes: [ autosomalDominant, + * autosomalRecessive, XLinkedDominant, XLinkedRecessive, YLinked, mitochondrial, deNovo, mendelianError, + * compoundHeterozygous ]. Value is case insensitive. e.g. HG0097:DeNovo Sample must have parents defined and indexed. . * sampleData: Filter by any SampleData field from samples. [{sample}:]{key}{op}{value}[,;]* . If no sample is specified, will * use all samples from "sample" or "genotype" filter. e.g. DP>200 or HG0097:DP>200,HG0098:DP<10 . Many FORMAT fields can be * combined. e.g. HG0097:DP>200;GT=1/1,0/1,HG0098:DP<10. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java index 490debadb43..3a53132a268 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/CohortClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java index e12aaa9f0ca..b5db306f267 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/DiseasePanelClient.java @@ -31,7 +31,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java index 19bfb865cd8..d5ab253fb24 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FamilyClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java index f34150e93b3..7d253e7c8e7 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/FileClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java index 2d1d45ff9ee..082d1bc8f68 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/GA4GHClient.java @@ -27,7 +27,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java index 94cf3f445a6..1984811e3f6 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/IndividualClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java index f3ed29d6896..9a5441af43f 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/JobClient.java @@ -35,7 +35,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java index e4495e6a3b9..bfe17ec23f5 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/MetaClient.java @@ -28,7 +28,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java index 3b90ad3afb5..884e7a44559 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/ProjectClient.java @@ -32,7 +32,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java index ae71ad3c475..b42b0ae7155 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/SampleClient.java @@ -34,7 +34,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java index a56cb8d99fc..65acf5ce92e 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/StudyClient.java @@ -41,7 +41,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java index d4eef6687d9..df6f0326d75 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/UserClient.java @@ -37,7 +37,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java index 1b52583b335..7c1aa5b9001 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantClient.java @@ -32,7 +32,27 @@ import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.VariantStatsExportParams; -import org.opencb.opencga.core.models.variant.*; +import org.opencb.opencga.core.models.variant.CircosAnalysisParams; +import org.opencb.opencga.core.models.variant.CohortVariantStatsAnalysisParams; +import org.opencb.opencga.core.models.variant.FamilyQcAnalysisParams; +import org.opencb.opencga.core.models.variant.GatkWrapperParams; +import org.opencb.opencga.core.models.variant.GenomePlotAnalysisParams; +import org.opencb.opencga.core.models.variant.GwasAnalysisParams; +import org.opencb.opencga.core.models.variant.IndividualQcAnalysisParams; +import org.opencb.opencga.core.models.variant.InferredSexAnalysisParams; +import org.opencb.opencga.core.models.variant.KnockoutAnalysisParams; +import org.opencb.opencga.core.models.variant.MendelianErrorAnalysisParams; +import org.opencb.opencga.core.models.variant.MutationalSignatureAnalysisParams; +import org.opencb.opencga.core.models.variant.PlinkWrapperParams; +import org.opencb.opencga.core.models.variant.RelatednessAnalysisParams; +import org.opencb.opencga.core.models.variant.RvtestsWrapperParams; +import org.opencb.opencga.core.models.variant.SampleEligibilityAnalysisParams; +import org.opencb.opencga.core.models.variant.SampleQcAnalysisParams; +import org.opencb.opencga.core.models.variant.SampleVariantFilterParams; +import org.opencb.opencga.core.models.variant.SampleVariantStatsAnalysisParams; +import org.opencb.opencga.core.models.variant.VariantExportParams; +import org.opencb.opencga.core.models.variant.VariantIndexParams; +import org.opencb.opencga.core.models.variant.VariantStatsAnalysisParams; import org.opencb.opencga.core.response.RestResponse; @@ -40,7 +60,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -143,22 +163,6 @@ public RestResponse queryAnnotation(ObjectMap params) throws return execute("analysis", null, "variant/annotation", null, "query", params, GET, VariantAnnotation.class); } - /** - * Generate a genome plot for a given sample. - * @param data Genome plot analysis params to customize the plot. The configuration file include the title, the plot density (i.e., - * the number of points to display), the general query and the list of tracks. Currently, the supported track types are: - * COPY-NUMBER, INDEL, REARRANGEMENT and SNV. In addition, each track can contain a specific query. - * @param params Map containing any of the following optional parameters. - * study: study. - * @return a RestResponse object. - * @throws ClientException ClientException if there is any server error. - */ - public RestResponse runGenomePlot(GenomePlotAnalysisParams data, ObjectMap params) throws ClientException { - params = params != null ? params : new ObjectMap(); - params.put("body", data); - return execute("analysis", null, "variant/genomePlot", null, "run", params, POST, Job.class); - } - /** * Generate a Circos plot for a given sample. * @param data Circos analysis params to customize the plot. These parameters include the title, the plot density (i.e., the number of @@ -297,8 +301,8 @@ public RestResponse deleteFile(ObjectMap params) throws ClientException { } /** - * GATK is a Genome Analysis Toolkit for variant discovery in high-throughput sequencing data. - * @param data gatk params. + * GATK is a Genome Analysis Toolkit for variant discovery in high-throughput sequencing data. Supported Gatk commands: HaplotypeCaller. + * @param data Gatk parameters. Supported Gatk commands: HaplotypeCaller. * @param params Map containing any of the following optional parameters. * study: study. * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. @@ -314,6 +318,26 @@ public RestResponse runGatk(GatkWrapperParams data, ObjectMap params) throw return execute("analysis", null, "variant/gatk", null, "run", params, POST, Job.class); } + /** + * Generate a genome plot for a given sample. + * @param data Genome plot analysis params to customize the plot. The configuration file includes the title, the plot density (i.e., + * the number of points to display), the general query and the list of tracks. Currently, the supported track types are: + * COPY-NUMBER, INDEL, REARRANGEMENT and SNV. In addition, each track can contain a specific query. + * @param params Map containing any of the following optional parameters. + * study: Study [[user@]project:]study where study and project can be either the ID or UUID. + * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. + * jobDescription: Job description. + * jobDependsOn: Comma separated list of existing job IDs the job will depend on. + * jobTags: Job tags. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse runGenomePlot(GenomePlotAnalysisParams data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("analysis", null, "variant/genomePlot", null, "run", params, POST, Job.class); + } + /** * Run a Genome Wide Association Study between two cohorts. * @param data Gwas analysis params. @@ -465,13 +489,15 @@ public RestResponse runMendelianError(MendelianErrorAnalysisParams data, Ob * operators. e.g. HG0097:0/0;HG0098:0/1,1/1 . Unphased genotypes (e.g. 0/1, 1/1) will also include phased genotypes (e.g. * 0|1, 1|0, 1|1), but not vice versa. When filtering by multi-allelic genotypes, any secondary allele will match, * regardless of its position e.g. 1/2 will match with genotypes 1/2, 1/3, 1/4, .... Genotype aliases accepted: HOM_REF, - * HOM_ALT, HET, HET_REF, HET_ALT and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT . 3) Sample with segregation mode: - * {sample}:{segregation}. Only one sample accepted.Accepted segregation modes: [ autosomalDominant, autosomalRecessive, - * XLinkedDominant, XLinkedRecessive, YLinked, mitochondrial, deNovo, mendelianError, compoundHeterozygous ]. Value is case - * insensitive. e.g. HG0097:DeNovo Sample must have parents defined and indexed. . + * HOM_ALT, HET, HET_REF, HET_ALT, HET_MISS and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT . 3) Sample with + * segregation mode: {sample}:{segregation}. Only one sample accepted.Accepted segregation modes: [ autosomalDominant, + * autosomalRecessive, XLinkedDominant, XLinkedRecessive, YLinked, mitochondrial, deNovo, mendelianError, + * compoundHeterozygous ]. Value is case insensitive. e.g. HG0097:DeNovo Sample must have parents defined and indexed. . * includeStudy: List of studies to include in the result. Accepts 'all' and 'none'. - * includeFile: List of files to be returned. Accepts 'all' and 'none'. - * includeSample: List of samples to be included in the result. Accepts 'all' and 'none'. + * includeFile: List of files to be returned. Accepts 'all' and 'none'. If undefined, automatically includes files used for + * filtering. If none, no file is included. + * includeSample: List of samples to be included in the result. Accepts 'all' and 'none'. If undefined, automatically includes + * samples used for filtering. If none, no sample is included. * include: Fields included in the response, whole JSON path must be provided. * exclude: Fields excluded in the response, whole JSON path must be provided. * @return a RestResponse object. @@ -582,16 +608,16 @@ public RestResponse runPlink(PlinkWrapperParams data, ObjectMap params) thr * operators. e.g. HG0097:0/0;HG0098:0/1,1/1 . Unphased genotypes (e.g. 0/1, 1/1) will also include phased genotypes (e.g. * 0|1, 1|0, 1|1), but not vice versa. When filtering by multi-allelic genotypes, any secondary allele will match, * regardless of its position e.g. 1/2 will match with genotypes 1/2, 1/3, 1/4, .... Genotype aliases accepted: HOM_REF, - * HOM_ALT, HET, HET_REF, HET_ALT and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT . 3) Sample with segregation mode: - * {sample}:{segregation}. Only one sample accepted.Accepted segregation modes: [ autosomalDominant, autosomalRecessive, - * XLinkedDominant, XLinkedRecessive, YLinked, mitochondrial, deNovo, mendelianError, compoundHeterozygous ]. Value is case - * insensitive. e.g. HG0097:DeNovo Sample must have parents defined and indexed. . + * HOM_ALT, HET, HET_REF, HET_ALT, HET_MISS and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT . 3) Sample with + * segregation mode: {sample}:{segregation}. Only one sample accepted.Accepted segregation modes: [ autosomalDominant, + * autosomalRecessive, XLinkedDominant, XLinkedRecessive, YLinked, mitochondrial, deNovo, mendelianError, + * compoundHeterozygous ]. Value is case insensitive. e.g. HG0097:DeNovo Sample must have parents defined and indexed. . * genotype: Samples with a specific genotype: {samp_1}:{gt_1}(,{gt_n})*(;{samp_n}:{gt_1}(,{gt_n})*)* e.g. * HG0097:0/0;HG0098:0/1,1/1. Unphased genotypes (e.g. 0/1, 1/1) will also include phased genotypes (e.g. 0|1, 1|0, 1|1), * but not vice versa. When filtering by multi-allelic genotypes, any secondary allele will match, regardless of its * position e.g. 1/2 will match with genotypes 1/2, 1/3, 1/4, .... Genotype aliases accepted: HOM_REF, HOM_ALT, HET, - * HET_REF, HET_ALT and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT. This will automatically set 'includeSample' - * parameter when not provided. + * HET_REF, HET_ALT, HET_MISS and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT. This will automatically set + * 'includeSample' parameter when not provided. * sampleData: Filter by any SampleData field from samples. [{sample}:]{key}{op}{value}[,;]* . If no sample is specified, will * use all samples from "sample" or "genotype" filter. e.g. DP>200 or HG0097:DP>200,HG0098:DP<10 . Many FORMAT fields can be * combined. e.g. HG0097:DP>200;GT=1/1,0/1,HG0098:DP<10. @@ -618,8 +644,10 @@ public RestResponse runPlink(PlinkWrapperParams data, ObjectMap params) thr * familyMembers: Sub set of the members of a given family. * familyProband: Specify the proband child to use for the family segregation. * includeStudy: List of studies to include in the result. Accepts 'all' and 'none'. - * includeFile: List of files to be returned. Accepts 'all' and 'none'. - * includeSample: List of samples to be included in the result. Accepts 'all' and 'none'. + * includeFile: List of files to be returned. Accepts 'all' and 'none'. If undefined, automatically includes files used for + * filtering. If none, no file is included. + * includeSample: List of samples to be included in the result. Accepts 'all' and 'none'. If undefined, automatically includes + * samples used for filtering. If none, no sample is included. * includeSampleData: List of Sample Data keys (i.e. FORMAT column from VCF file) from Sample Data to include in the output. e.g: * DP,AD. Accepts 'all' and 'none'. * includeGenotype: Include genotypes, apart of other formats defined with includeFormat. @@ -675,8 +703,8 @@ public RestResponse runRelatedness(RelatednessAnalysisParams data, ObjectMa } /** - * Rvtests is a flexible software package for genetic association studies. - * @param data rvtest params. + * Rvtests is a flexible software package for genetic association studies. Supported RvTests commands: rvtest, vcf2kinship. + * @param data RvTests parameters. Supported RvTests commands: rvtest, vcf2kinship. * @param params Map containing any of the following optional parameters. * study: study. * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. @@ -712,16 +740,16 @@ public RestResponse runRvtests(RvtestsWrapperParams data, ObjectMap params) * operators. e.g. HG0097:0/0;HG0098:0/1,1/1 . Unphased genotypes (e.g. 0/1, 1/1) will also include phased genotypes (e.g. * 0|1, 1|0, 1|1), but not vice versa. When filtering by multi-allelic genotypes, any secondary allele will match, * regardless of its position e.g. 1/2 will match with genotypes 1/2, 1/3, 1/4, .... Genotype aliases accepted: HOM_REF, - * HOM_ALT, HET, HET_REF, HET_ALT and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT . 3) Sample with segregation mode: - * {sample}:{segregation}. Only one sample accepted.Accepted segregation modes: [ autosomalDominant, autosomalRecessive, - * XLinkedDominant, XLinkedRecessive, YLinked, mitochondrial, deNovo, mendelianError, compoundHeterozygous ]. Value is case - * insensitive. e.g. HG0097:DeNovo Sample must have parents defined and indexed. . + * HOM_ALT, HET, HET_REF, HET_ALT, HET_MISS and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT . 3) Sample with + * segregation mode: {sample}:{segregation}. Only one sample accepted.Accepted segregation modes: [ autosomalDominant, + * autosomalRecessive, XLinkedDominant, XLinkedRecessive, YLinked, mitochondrial, deNovo, mendelianError, + * compoundHeterozygous ]. Value is case insensitive. e.g. HG0097:DeNovo Sample must have parents defined and indexed. . * genotype: Samples with a specific genotype: {samp_1}:{gt_1}(,{gt_n})*(;{samp_n}:{gt_1}(,{gt_n})*)* e.g. * HG0097:0/0;HG0098:0/1,1/1. Unphased genotypes (e.g. 0/1, 1/1) will also include phased genotypes (e.g. 0|1, 1|0, 1|1), * but not vice versa. When filtering by multi-allelic genotypes, any secondary allele will match, regardless of its * position e.g. 1/2 will match with genotypes 1/2, 1/3, 1/4, .... Genotype aliases accepted: HOM_REF, HOM_ALT, HET, - * HET_REF, HET_ALT and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT. This will automatically set 'includeSample' - * parameter when not provided. + * HET_REF, HET_ALT, HET_MISS and MISS e.g. HG0097:HOM_REF;HG0098:HET_REF,HOM_ALT. This will automatically set + * 'includeSample' parameter when not provided. * sampleAnnotation: Selects some samples using metadata information from Catalog. e.g. * age>20;phenotype=hpo:123,hpo:456;name=smith. * family: Filter variants where any of the samples from the given family contains the variant (HET or HOM_ALT). @@ -764,9 +792,9 @@ public RestResponse runSampleEligibility(SampleEligibilityAnalysisParams da } /** - * Run quality control (QC) for a given sample. It includes variant stats and gene coverage stats; and for somatic samples, mutational - * signature. - * @param data Sample QC analysis params. + * Run quality control (QC) for a given sample. It includes variant stats, and if the sample is somatic, mutational signature and + * genome plot are calculated. + * @param data Sample QC analysis params. Mutational signature and genome plot are calculated for somatic samples only. * @param params Map containing any of the following optional parameters. * study: Study [[user@]project:]study where study and project can be either the ID or UUID. * jobId: Job ID. It must be a unique string within the study. An ID will be autogenerated automatically if not provided. diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java index e0a2ca26ff1..22e6e8d7b25 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/clients/VariantOperationClient.java @@ -20,6 +20,7 @@ import org.opencb.opencga.client.config.ClientConfiguration; import org.opencb.opencga.client.exceptions.ClientException; import org.opencb.opencga.client.rest.AbstractParentClient; +import org.opencb.opencga.core.config.storage.CellBaseConfiguration; import org.opencb.opencga.core.config.storage.SampleIndexConfiguration; import org.opencb.opencga.core.models.job.Job; import org.opencb.opencga.core.models.operations.variant.JulieParams; @@ -42,7 +43,7 @@ * WARNING: AUTOGENERATED CODE * * This code was generated by a tool. -* Autogenerated on: 2021-04-28 17:47:26 +* Autogenerated on: 2021-06-16 10:32:12 * * Manual changes to this file may cause unexpected behavior in your application. * Manual changes to this file will be overwritten if the code is regenerated. @@ -60,6 +61,22 @@ public VariantOperationClient(String token, ClientConfiguration configuration) { super(token, configuration); } + /** + * Update Cellbase configuration. + * @param data New cellbase configuration. + * @param params Map containing any of the following optional parameters. + * project: Project [user@]project where project can be either the ID or the alias. + * annotationUpdate: Create and load variant annotations into the database. + * annotationSaveId: Save a copy of the current variant annotation at the database. + * @return a RestResponse object. + * @throws ClientException ClientException if there is any server error. + */ + public RestResponse configureCellbase(CellBaseConfiguration data, ObjectMap params) throws ClientException { + params = params != null ? params : new ObjectMap(); + params.put("body", data); + return execute("operation", null, "cellbase", null, "configure", params, POST, Job.class); + } + /** * Find variants where not all the samples are present, and fill the empty values, excluding HOM-REF (0/0) values. * @param data Variant aggregate params. From 4c42f40dd71ae36a0ca6c5ade98685b9aeb01ec0 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 16 Jun 2021 12:34:03 +0200 Subject: [PATCH 411/412] analysis: fix filters by individual attributes in RGA --- .../opencga/analysis/rga/RgaManager.java | 100 +++++++++++++++++- .../opencb/opencga/analysis/rga/RgaUtils.java | 21 ++-- 2 files changed, 110 insertions(+), 11 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 85af6c0b61e..2f07b5853e9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrServerException; @@ -12,7 +13,6 @@ import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.commons.datastore.core.*; -import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.analysis.rga.exceptions.RgaException; import org.opencb.opencga.analysis.rga.iterators.RgaIterator; import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; @@ -847,6 +847,9 @@ public OpenCGAResult variantQuery(String studyStr, Query quer int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); OpenCGAResult knockoutResult = new OpenCGAResult<>(time, Collections.emptyList(), knockoutResultList.size(), knockoutResultList, -1); + if (CollectionUtils.isNotEmpty(resourceIds.getEvents())) { + knockoutResult.setEvents(resourceIds.getEvents()); + } try { knockoutResult.setNumMatches(resourceIds.getNumMatchesFuture() != null ? resourceIds.getNumMatchesFuture().get() : -1); } catch (InterruptedException | ExecutionException e) { @@ -1152,8 +1155,12 @@ public OpenCGAResult variantSummary(String studyStr, Q int time = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); logger.info("Variant summary: {} milliseconds", time); - return new OpenCGAResult<>(time, Collections.emptyList(), knockoutByVariantSummaryList.size(), knockoutByVariantSummaryList, - numMatches); + OpenCGAResult result = new OpenCGAResult<>(time, Collections.emptyList(), + knockoutByVariantSummaryList.size(), knockoutByVariantSummaryList, numMatches); + if (CollectionUtils.isNotEmpty(resourceIds.getEvents())) { + result.setEvents(resourceIds.getEvents()); + } + return result; } public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) @@ -1211,9 +1218,72 @@ private List getGeneIds(String collection, Query query, QueryOptions opt */ private ResourceIds getVariantIds(String mainCollection, String auxCollection, Query query, QueryOptions options, ExecutorService executor) throws RgaException, IOException { - List ids; + if (isQueryingByIndividualFields(query)) { + return getVariantIdsFromMainCollection(mainCollection, query, options, executor); + } else { + return getVariantIdsJoiningCollections(mainCollection, auxCollection, query, options, executor); + } + } + + private ResourceIds getVariantIdsFromMainCollection(String mainCollection, Query query, QueryOptions options, ExecutorService executor) + throws RgaException, IOException { + boolean count = options.getBoolean(QueryOptions.COUNT); + int limit = options.getInt(QueryOptions.LIMIT, AbstractManager.DEFAULT_LIMIT); + int skip = options.getInt(QueryOptions.SKIP, 0); + + QueryOptions facetOptions = new QueryOptions() + .append(QueryOptions.FACET, RgaDataModel.VARIANT_SUMMARY) + .append(QueryOptions.LIMIT, -1); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(mainCollection, query, facetOptions); + if (facetFieldDataResult.getNumResults() == 0) { + throw RgaException.noResultsMatching(); + } + + List eventList = new ArrayList<>(); + Future numMatchesFuture = null; + KnockoutTypeCount knockoutTypeCount = new KnockoutTypeCount(query); + Set ids = new HashSet<>(); + Set skippedIds = new HashSet<>(); + List buckets = facetFieldDataResult.first().getBuckets(); + for (int i = 0; i < buckets.size(); i++) { + FacetField.Bucket bucket = buckets.get(i); + CodedVariant codedVariant = CodedVariant.parseEncodedId(bucket.getValue()); + if (knockoutTypeCount.passesFilter(codedVariant)) { + if (skip > skippedIds.size()) { + skippedIds.add(codedVariant.getId()); + } else if (limit > ids.size()) { + if (!skippedIds.contains(codedVariant.getId())) { + ids.add(codedVariant.getId()); + } + } else if (count) { + if (ids.size() + skippedIds.size() < 100) { + // Add up to 100 different ids to calculate an approximate count + if (!ids.contains(codedVariant.getId())) { + skippedIds.add(codedVariant.getId()); + } + } else { + int processedIds = i; + // Get approximate count and stop + numMatchesFuture = executor.submit( + () -> ((ids.size() + skippedIds.size()) * facetFieldDataResult.first().getBuckets().size()) / processedIds + ); + eventList.add(new Event(Event.Type.WARNING, "numMatches value is approximated.")); + break; + } + } else { + break; + } + } + } + return new ResourceIds(new ArrayList<>(ids), numMatchesFuture, eventList); + } + + private ResourceIds getVariantIdsJoiningCollections(String mainCollection, String auxCollection, Query query, QueryOptions options, + ExecutorService executor) throws RgaException, IOException { + Future numMatchesFuture = null; + List ids; Query mainCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), true); Query auxCollQuery = generateQuery(query, AuxiliarRgaDataModel.MAIN_TO_AUXILIAR_DATA_MODEL_MAP.keySet(), false); @@ -1248,6 +1318,12 @@ private ResourceIds getVariantIds(String mainCollection, String auxCollection, Q return new ResourceIds(ids, numMatchesFuture); } + private boolean isQueryingByIndividualFields(Query query) { + return query.containsKey(RgaQueryParams.INDIVIDUAL_ID.key()) || query.containsKey(RgaQueryParams.SAMPLE_ID.key()) + || query.containsKey(RgaQueryParams.PHENOTYPES.key()) || query.containsKey(RgaQueryParams.DISORDERS.key()) + || query.containsKey(RgaQueryParams.SEX.key()) || query.containsKey(RgaQueryParams.NUM_PARENTS.key()); + } + /** * Generate a new query based on the original query. * @@ -1743,6 +1819,7 @@ private boolean includeVariants(AbstractRgaConverter converter, QueryOptions que private class ResourceIds { private List ids; private Future numMatchesFuture; + private List events; public ResourceIds(List ids) { this.ids = ids; @@ -1753,6 +1830,12 @@ public ResourceIds(List ids, Future numMatchesFuture) { this.numMatchesFuture = numMatchesFuture; } + public ResourceIds(List ids, Future numMatchesFuture, List events) { + this.ids = ids; + this.numMatchesFuture = numMatchesFuture; + this.events = events; + } + public List getIds() { return ids; } @@ -1770,6 +1853,15 @@ public ResourceIds setNumMatchesFuture(Future numMatchesFuture) { this.numMatchesFuture = numMatchesFuture; return this; } + + public List getEvents() { + return events; + } + + public ResourceIds setEvents(List events) { + this.events = events; + return this; + } } private class Preprocess { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java index 058343dfb85..7a5c74e3c16 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaUtils.java @@ -822,38 +822,45 @@ public KnockoutTypeCount(Query query) throws RgaException { } } - public void processFeature(RgaUtils.CodedFeature codedFeature) { + public boolean passesFilter(RgaUtils.CodedFeature codedFeature) { if (codedFeature instanceof RgaUtils.CodedVariant) { // Special checks for CodedVariants RgaUtils.CodedVariant codedVariant = (CodedVariant) codedFeature; if (!variantIdQuery.isEmpty() && !variantIdQuery.contains(codedVariant.getId())) { - return; + return false; } if (!dbSnpQuery.isEmpty() && !dbSnpQuery.contains(codedVariant.getDbSnp())) { - return; + return false; } if (!clinicalSignificanceQuery.isEmpty() && codedVariant.getClinicalSignificances().stream().noneMatch((cs) -> clinicalSignificanceQuery.contains(cs))) { - return; + return false; } } // Common filters if (!knockoutTypeQuery.isEmpty() && !knockoutTypeQuery.contains(codedFeature.getKnockoutType())) { - return; + return false; } if (!popFreqQuery.isEmpty()) { for (Set popFreq : popFreqQuery) { if (codedFeature.getPopulationFrequencies().stream().noneMatch(popFreq::contains)) { - return; + return false; } } } if (!typeQuery.isEmpty() && !typeQuery.contains(codedFeature.getType())) { - return; + return false; } if (!consequenceTypeQuery.isEmpty() && codedFeature.getConsequenceType().stream().noneMatch((ct) -> consequenceTypeQuery.contains(ct))) { + return false; + } + return true; + } + + public void processFeature(RgaUtils.CodedFeature codedFeature) { + if (!passesFilter(codedFeature)) { return; } From cfb2a980ab5a964224af31d86c2f2b1aef303654 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 16 Jun 2021 13:09:04 +0200 Subject: [PATCH 412/412] analysis: increase number of processed variant ids --- .../org/opencb/opencga/analysis/rga/RgaManager.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index 2f07b5853e9..cebbebe2e44 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -1257,7 +1257,7 @@ private ResourceIds getVariantIdsFromMainCollection(String mainCollection, Query ids.add(codedVariant.getId()); } } else if (count) { - if (ids.size() + skippedIds.size() < 100) { + if (ids.size() + skippedIds.size() < 2000) { // Add up to 100 different ids to calculate an approximate count if (!ids.contains(codedVariant.getId())) { skippedIds.add(codedVariant.getId()); @@ -1276,6 +1276,10 @@ private ResourceIds getVariantIdsFromMainCollection(String mainCollection, Query } } } + if (count && numMatchesFuture == null) { + // We processed all the elements, so we simply sum up the number of different ids processed + numMatchesFuture = executor.submit(() -> (ids.size() + skippedIds.size())); + } return new ResourceIds(new ArrayList<>(ids), numMatchesFuture, eventList); } @@ -1608,9 +1612,9 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection knockoutTypeCount.getNumDelOverlapIds()); knockoutByIndividualSummary.setVariantStats(variantStats); - // Use list of variants filtered matching all criteria if the number of variants is lower than 50. Otherwise, variants will not be + // Use list of variants filtered matching all criteria if the number of variants is lower than 100. Otherwise, variants will not be // used to get the list of genes. If we don't apply this limit, the url may be too long and fail. - if (knockoutTypeCount.getNumIds() > 0 && knockoutTypeCount.getNumIds() < 50) { + if (knockoutTypeCount.getNumIds() > 0 && knockoutTypeCount.getNumIds() < 100) { auxQuery.put(RgaQueryParams.VARIANTS.key(), new ArrayList<>(knockoutTypeCount.getIds())); }

XYUJ|=arrI}JV-)!eK%|#>(BbLTIez*B7?5H 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 z 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 Date: Mon, 30 Nov 2020 01:56:49 +0000 Subject: [PATCH 008/412] GitBook: [develop] no pages and one asset modified --- .../.gitbook/assets/catalog_data_models_v13.png | Bin 0 -> 45044 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/.gitbook/assets/catalog_data_models_v13.png diff --git a/docs/.gitbook/assets/catalog_data_models_v13.png b/docs/.gitbook/assets/catalog_data_models_v13.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff5940015c068ef6ab1516d33775ae1741f242e GIT binary patch literal 45044 zcmce;2|Sf;yEeWw(wsCH616DFRGMTc6;`A|rYu83=FE|)C*`RqErk-2DVZuW8B$Rp znKM^1hs>G($E9b#``N$!?)~52_wBvCJ+E5pUiZ51>%Ok@JkH}d&g=R~W%=bxIF?W- zl;t#qBPtZi{BZm?%e)A$h_!r3z^?@+hmIejP@dmjI%TjB|7NmNk(Z?;e&p)HKX?ok zRE|?9F8maVrx%4XftNfxDHI1$3Z+}0LXilfP}W~~m~~1LZ!9{iD1U@9OaAvLC&nMI zuv}2kvZGKo1e5=mXbxBI;^P$Bkwa=1>wh%4oz!s%?H^c~UZ3N{+uS7Rc;mvMU^@Tv z+Hf1W}pP`|N2zd1+y<;CaKlh@hzIrTkUu~8yYUvyiS%BtR;p5&|@wwdDM;^!Rp<8_J(GcQ}^9&z!=`g-k+`)!ZN z-{N|n#YNr`@anPBub=sKdscJ){P`Hf!Esmh!1;KG=jtcc8>Yo2C3jzceU`Os?%+TF zPoMbxbl#MwPmk5r)p2lfJ+#07ISsGT~+OZ!k*|SA|F2Fk{Wokras*|Y-aextXfY^!mhNAvB@_4v6ncl zt!*~aM=m`-ev6lK`OlxvFt3gsJ2w3D^-4vCt(_eXTDxq~NZ9On7|!i7RJs=@9vKRo zZS1@@*?g(LYqY^ygH8|W%bRttv(U@=v3Mo7c-mrexpo_yY+|lqJz-+PrMkAZ*ecx|x8*WiE`KjH)M`OVU!T?5wQG-e zIk(q8I!Zoxfo~{{Z}`@MK0m74udm)V9bwXLE(PK-m9dG5!VV4&U0+^Z$r>o+Jgujf zlxkjExI;rl<#BU!b4L2no9nc4dTM_Rn*X6Z=J+L_>8dPmoD&%^&!g>@%)X9S+@?or zTR+ZzUFornX0v#itwe|mzG4JJ6B`+MHy>tQs5II<9<_Pfbn5 zj8Zi);58t@Eyx?^DlI8dqtV`b*-3hPdslz@^a!^>tGKaNkV?Z@Fh%iTccvL6*QHz> zI7_Q|eDtQzB_dgNu&K|u(dniBO zlWRqhPkLobi?vs|c@vqro>e=o&&Wn8h7YCZO($e!Wu=&ual4JynG9Z(d>S9GW^HY) zbTGBf!pzD_T~*b8=dN9+>2#s43jL!aBO_uBKYDunF;5tLio1e~O~j5Rr>x{R37DgyP~_xG3GBLS-Y zrgIbPlAcDpGO5DprR#+?=_~Lm#ebEo0gJXYp0DTl_5agg@;{k>R1sj~h36J3m#84` zaAT&OdjERXAK%~m7fxf1#}$+J{2sG%$o6!1Q)%8SHokDl^V2UMOG!*r-V?aZ%Anxw+DRY$hi(5BM4IX<+l6KZSKN^hey! zF0!??HFj9FS({{d&vBC)@BNr13+95oXQWn^@*EF;0<1{0=9(<7k>EgA*?3GXuBVMqJu1>>K`(Ty~7n>^gKj&S~k~QKF)&m9W}H0*f8q z8qK?$?-lU-$*RXOxr**bd~DH~+JTMlv%bmExexMn)ts?TbqU0K z6s0x1Y|-`43|{-RlRFFIWDXZyJBQqYTJYD?r%sjs?VWq2#;V7UmwI*W-n|=nNj;Ec z9Q}aRvIbcfo2-(m)~2VXo=!+eSQFj<`T3SUd-4tMZz`tb+uu<*QcHKDm!yc~O)&yU zLf7Xemz7*+v0X%DFLx3>JAgufW67EnFaFq*+ae8%ZpEgh)pV;|SdIysVpP0tKi7&l zMRJvldA#E9z5X%#=}TDOwb{l-L|hTY89beDuX=C}kHDAGZ7-4P)UPX~`|@-53(@%< zA44j`4|^kx^U;?)c5`!64t)fX{qNiB*JN^iYR1|u&;8SMn;MlGSZZc1X)(VBws6s-=8TM1ZY$Dp0*&Wu< z2;5`cyyJRtIo{WIkKhw$v02gCn0)r_lGd54OV`H>lc9UIjF(N6Nhl0|%?C=uuYV4( z*LC&x*CO@Y4G4%nx$QT6^AunX_k534yMk*US^VMQyuZVd(oyDxO8*Sj<*VuJohMqi zX?9?fxxW5EgdFLxvfmL(wVZWH&<=oxe_$rX|AW=Nqqey@adgx%u9)0`{vRpNpFbCi zyP3~tYHG@eY;M+VYj4+9m%nr=8<@#38p(sEVrm-u8@yc4eq-V2m`3gLKOs%~m3w6K zYWmBICwpI)U>n@JtNw5VVqx7kTsAh+Hv>pU7(!Gi>|<6!Tce47Ii!06c^w;#;8#I zpC%=RefndAC7+b-_dg#52gkfj04SoVxVTJsIcu0jy{vFiEw8OLndouc?bK-F&9%b2 z+KAj`z?X+7m5Q?*dd{Uc0M+?=YMwqF1t1Gt6Z`Dhr%uQ11V2oU^=r7h=MD}HrFzV| zFTC<9$kN!vq$qxkbFvq~5~mr%$)X=}F^T^qaSM zZ8mW1t&ifget8Pfo)LNN+M>)RtJIW~^T@~u9u;S-bNJF5+}>XPv%aAL*<%E&8#tQg zo~P%SO~<&1^@QxVle0=c!>|W@t?PBfhdY6ksyjQM0MhvgzdnBaczv2>aJ9&4e5YuC z`Ns8?6?miogA4|Pg?=vGs_7{`+mV(f&T}$l?cmh-P~nTQ7LPoutS4YIx9=UQ0jKkmh7g)+cGnndxDPx(^MQ@DHRE*6(a4X4HT(r zViNPmt1ppdWI^WZpkOh>-K|-~zhu#s7Y)4=!Fl7sEX6XvzFaAs20lGj;q}Zcx$gVG z#qVR2Yp);S_j$p2{YX_)lMrANo?k?TU z$B+YiyIjikT`k#v=@o@sKv2{`%D*H9ftjqSZ|%Bu z(dV9#+l;=k>V}rx?DUx6hGm5d3U--%e3G4gMmc7em0%B|$@jS;!%(=5JnMo2+1=ve zZ!B8+$BHaw$2-C_92`>D32Cz>H@$jwC{Az1VGI{R5DnMYY(*JKrCmOF(8$P0J&+mS zRKk(fdbZ|bj&2TSAK+zSW?1=UUrerViH6B_Rj7#Y(BJnu7R7I+6$gsk&Yos4SP2xx z^TpwE`AwL97-3Xd(R_*lPck#>x&x2y-@jk1$!g;YZ}kN2sF@k}Oda8c^GGd_)sDhe zU->Z~+nVp+zrSl8c(c)UTPUgdxNn;j*rUP#xIs{8y4dQg{o>qpoOxnmf`6HUc%6%4 zz>YiirjgC4L4@d8;(fMZZlm{6Rq_K_7Z%DH-UqyX`r<{!XXTxO+qQ{nA3i#UA}yoc4mKz+Za7TH%FT>+!m;( zoZ&^%x?lHsma9ex*TCUa8dkD;pg&t*W(W7*(t*N0*=;+9uzXF2+DjRcsEM@c$|{fA z*5LDY8(S_K++QoG{v?_!;w$E#rH{rmU5PT(;8(C`B!NCHOuC;5aN z@IOM>h#sP{KF=cSf=6JLtpBG>yAI%I7RSNwv{rXzK_m z9AZ&DNo75SygML$j8WXiApC?l83>g*f=hk<<)nWC84Qo{ij%|*Kz#5#f=~X#!;0q_ zHv71`dwME?&TMXNQz3;mW`0#|t^6Z$Yey8%SKK_ZIg1cAM*4GTS)6&bP&nQSD&7#i z>pfQKA7oW{?!VHPf#3g|Y}x-4R`wh(=@>dLkrWYe*fCqmxc=I5&U48FCL}mj-TMnG z=ewTP)O>P~M>NWaE*ywuQ9j-8!d?&QYV4Y*eYIs2l8J5t=IC)h=T0|R3!DpY)Z zeBSkp0O*}S(Who$5MJ>0S#>rEQEvcNb_@eb>r}o#Kp7t&*G@L}#b~Rkszw~-c@!ak zTRX=b2OiWRXH7#CUA}xd-R6FL{0`s*F=K7eMbxePZa#?EvyWNs3Dyy=y<4`6PZ#Em5 zEBE|2m-K5&?7dXE@3bf1A z)kzJ#I^8!8?A-ad!8(ub>+5TC#*M&L8FHQAE!1>%tt54`9eX3`HmavUB~X_yTh@7? zW&HPI%-?L+!6~ewy^XEnxnYsonKR}N0<_lN^cHmtY_*Y+A|`*DMcroa*J1{`Si#aW zzYH=2GDV-CCgfv4Psxs z*op8>V}Q$O&bgEdJ|(WWVA;b1PRgj8RYW(a@vJ(jrF9=uDqa{AmyElPReD3W zt=~b^0`)JQlLszNjT}Vzhx&kDY0M=Dx0syeN}+tib1nb++B-pbzJl}A!}-Pk3h;-@ zWRi@E1CE>KY&_t2zVyLv^}v-B&#%Y^>Hs>_*yqnr=}p$xf=sh?&^mZ5f{!iWdYaeh z=;-#ndu#F4`Xs9e)7Mvhy|9gK2|L}gEKDW|EG>qXGu*E3h0#NqB@~5Yn6&lTPDx~5 zxQ%#ldfrF5xzp=Yrll+M$hhm%Cr^Ux#|P+kOcVuv)L-c>?%5bI9pUv`^5@rjA~GqR zQdf^ADXXIaK@^}^Uj^vQV=~=CFtFIjr*EacG1z{kJ9qAoijtsv{lb|aWiurin^t&_ zGp!8@pFQhdu|js6bTK{dW=n2xWeez_iuP%~lTVl(sM_I zP-33|7&ry$3qS=}vZ|uuaduypBB2fgrr(OVhd+M2IZjd8Ogd~XZb4bdBD|sIJ7Wi? zgF7Yc+I?_-N$%UI8+^NfVk;*`dQzQ-j0yFNnw3GF9t_MwIRaj0yOdN@chiXs6t*{R zECEH_X|6ZH(4h7-gMLa* z?waz$ec`XYSN2@vw0brN9W=q*zrnShP{^{^ZEtI`iU9R&luYkdcxKr^fF?}^g9A*q zC!qtCn<@~Y^yH6SDE_-p0wB(2pAB&S@w|vi+j=6@=l;x1y(w8nibIcjoZbsTz;^9a zvwL&Z5)TW4(Y}hx%2Y6rG)7VDDdd3B{+6V~#6*^ayNZFr)u0)v^zOuL`>qNBnKD!+ z2<#}WMh1#DnS-|`9OdD|hf8cxJ78RYddv9S=eB%)d~}X3JVNHhkNQ*uE4thUOHU#ywq!c1 z$}%rZ%tvKVn@9%^Q1$Qt^v?r7Pmau+%+6E%Jk)4Yv{CGK>(viU*-nZK-Alc@X?hNC zeU(XBufi13I#2cP{rj;{BX;lI8~5nZLDYp=von*1+M*`i2oJZNCEY2TX%p>x^8`>B z)zqj6w&nEd-j-(bXR{UE7RD=m4;a|#MPpE*#?iUx}hNs z1>5xP*#Vgp^V-Cq@!sBEz<1CkYqCmLtXP5ArNL0s(u&0i4YjGP_eG!ifiI%b2>ixO zCl^L!gyN%?OYUoTBP8#?{dnU3~9dDx}03l z`SS`O*ZT8jbE}P*f{H2%@e?mRZ%8#|(#YC6X>}vxEhbD~R*!IN?O9ZswC=7hv1s6b zLuw;*z4QhleD&|LLW?Z!nxTu5IHcV0wv@4s>M)3hJN5!q>KYn~46$E+O;&-_tFH|V zGoSc!?tMB}FsWi*spqNr-_Tv^0Oq9s<Hq4IcyF6~u1EPtx&tmbsex7CFH&TptRmM0>44dYRw+9yvfBSY8 zr%>Lvo`{nue8rl~0)^>MQKA4Egdjo6%#N4&22|dbo_MEeh2@adpF25RuvDZIx&x^E zD%9GEh%!NKk00~eL)}!*Q`%+QlaSs`m_EpKK~6Vr-aM_L5rZV+hAMTd*Su%Tgux`Pb$YReUTfF88d;zT5nROhj z51HcXfeR=Khf-YUDJj?i9DUP5&4>j;sofQNhDjfail60|; zj}KC#>A7<#yl|X8D|Bkbmy>!ogzdXlaXGTZOh z*|A7PtHH$$k9o|FN!Wbzn)xO&Ba6D6TqA|DX0Y7KLrh%Im9rg+Bc>u;t+ zcXxK4)YT2ekfsnhN5#@IK`bF6;x)8ar2^yR*o+KKAX!y)^#JO7LeZ_G@Vx!Rx`gNJ z<~#2qhroQJv=Z%d)mHQTZjxL#+`4I26AXX`aM0#E%vaVjQKEfj#q?1qeiR_!XQ$sm zBopzzj_=>!loY>v7c`g|PGM-AI(5fpw&3bgu_oxI8LU~Y1v?Q@8Igy*S7?F%-7yhb zQ(avyF|Xv*l;wPi@eLry|FD4EhAO-D!oE2Y1FRVSV0mjuhOK&!^5I_|T`yVUNac$5AA-Zfz zctj2nBp!v5?#-T0u+~rm={RJ9siCPjIgNRhYa|_&m-puOn6e>{7YLrEDZTFL{->xI z2qFmem~jSQz~?%tamfwR%(oS4--gDakB1Kq+K#*CYQ-+~+zrK?O2fBL{k$uCu_bYN z(xwZ&owt@MB9I}nY+uE^VewEG*C#t$Th@t92ZuTCVHO1qI>vCmh}O1yS=)YW-40Ft zAFtKYHeElGa%s#8bLVMls>8AM55qq8>_TxN&+UA~($Z4ZWg`=+Tsb+pVZGTN52JIY z2ceN%b(IcVC#-|2P~SlSNAKL6R2z5W#tkp)OKEz+z&wqOjb7=ax_x)#xyxH-r(1du zw~|NUHK4{pt|E#$04iV>>c1?+aeGL0^Dv?w&r1i zpHZQ?-S>B^r6xKfR3&B|qoXTw)>Aysjh5^xQ>qv2!Xm!y{KGc$+f2(?Q@?v{P%dJd zkmj?4@S%8}EHTG8@%?bj2A5^zz+U^NXXN8C!7%ou;|>nHJ0hW$ukEQ#%4;{$NYpWH zEPMA3rDuS|fddK6yYp4%%1fSGi@7g;c@Vg<#b^v%WtvMmr5GU!HRHY|OP1Wdch8}^ z?Zsb}YUaTYzx^WqpL5+V$p$d}Ts!CE5xpL3|2{-HolcoMrM`+r4?|HyM}Go1pH&!k z7a^h23>t{U1}{?t<3E;j?oqm=>+GBf-F&N(UYdngV^_Xw!EO$H7Chm!w6q{o#LL2I zq-~@pi!)cUU3xhNM6D zj?!j_7E*Ysf0x^yzfk=hc{;mfUofvZrW_I~5MNpSC?>19#hzgB||xKCOZ_k8{3qXuTfZ|6UXW0HB}ieK%1 znvifB;S^QL_>1|G`)-xlEiE!B*)y?^N7LSn%9=hq)qfE!uy@*qWN{tka`2`X>hV-5uiFzSLSZ);EY2R zcx1PEM%ok$rISDmMmEys>rhANrH^xDiQhq-h-NrB+FR%bybbmU8IvR{3WXJ!mB$n_ zDyYb*#Vx&>4@-*Y)!YpDTT1^=YzCffn8M~v;j>@*ujiJ&kCeMA2_Y9Zg%marjU>j zBeGV{gAUed!6_b=PaD@$l&TsV&IXlytGm|t)KD2jDu>GBdj%kZA=|#?GKuK9 zJzIWZYPfjQ;wy(ToBA?}dXa4LL6pGT4;(l{K6v`{JzbYBzBs+JJYVsIqkpsqTL%#E z1Ofk?Tm$ohd03zKira|KhdFY#1;YaEj@V*o#H|ysL+f#Ow^>_9#|cgMmRz?9sPYgu zs8F3?io(lfA4EneekG{kS`-*481IILayzjHmqt7E)Cla_WmoVLGFmKZ3hvwTpzOtp zT2Yp~>mM^G8q`Z?yT;Z5HOq!HqL8V8m}+bt6>%R}N@fRO76iR)r~Ux@u8U<|oI&QD zY%BFYAj$en&cb3A`R&^`^ZMpbpZt)@PD2U86esi+=N^lb5b<9gFzF!jC>5oiJjg%> z730=~8n$r#Dp(tL^xI1i^Ax*YJnRlhFe&!v&5r1`y1$?2nb|$uRmq4%h2SLD3Ys>YiSi& z#J;W5d-KMR1C(?VAdujG|FRc!ocy~W6c8k*>H_Yc=~xc=^8ibn76umDo&vJkWo4xZ37Y zLz*RnXjTFnmLcM8kP#Qg9d-w@D*!xtnvN6fL(8g4aQs?ul{lT&aL7dnuZ$$rY}20O zDaCebDW`|P-rT&e3(xA%#q!5T!RHMwq_q2Y4*ZOfnKmsMhE6#?J%elNDD!CLZ28lf zDA_cX=2Z|?P)#F8`Qme2EUDG@Qo5JD+3hIannmgD#KvxHp}X0^Z=yNcqlV-QG|9vYUD21grwG@ z+i@>ms9;)h-}dIYvELg-M?Ij3{mj%j`*H`FmLu6$d^a_T*1uq%j+z!h`GFc_B59T* zxiKcpox>@+yw4<1W+kOWo{*s+d)BV-j&XGs?27Aq)|#M~r(2;hpZh3b`TGW2vpaGj zG&95vM8gM!o|Lbv8<08!R)Xl=RjMbtehsuT&OH=aQnD6teis9bC73RA3kxMZ*MX}j zz7t(8&5U=L4C{coNOf^CAzlZQve4a&lKq6~^Tj1t4Tq;5HCSaIuZR-iC>P;J@REQd zATsIW+8cyTNLzpX$Z*7_X@!b6BD*M}wV18dH8sbw#65LEOEnfp!y}9lD{mdRvqk>w zt)grMYH(X3SVaU|4F{RSty*2} zP<_V|*i}$au)3mRv%u)ZhhULVxk3;{cIhtUw5~D5aBG-ACf| z1h`fdw+_rvnE+Xi{mn#wCsab5Mp8|`$LysL35R2hVK9uE)2#DZ2qI!@ALP?Uj3?yA z^l*$!HRNQX52JFoE*SX%DwWtl*Xv$9gj)8~t1F9B;r0z`L)`<0c9=YBnD4rO{2+G7 zC-6GmDPO}>VoqX>dZJD&Ql;J|x8XY&0yQ0-`06-~xM$B!3aZEdIiANSB}GTrg{ZtH zZTG#_=k})G2WxdN9Y<=c&#;N8NjMV&8Uv|~rD3{dcG3gzmK0+o#t+wd=3xa^0KV$7>b3vv#qTS4r+l@ zc6V!g5SxPmgZ&-F>pFWlQP@R+-0iu%nET|RL$B7>`sTW$9-lIiT#S6D_#h{5Wy!5N z=|lrZ>V#YCFIOYr2@IWbU9ETPF5}mYre+jBRw$vwq!#ss1>T7P1mx&*%nOa@gZD56 z!1hZ?NC6}fT}=3nQXPr1H7M;fhCUtup(x(PXW%*hr?nRj$lvk4v^0uSSaijll=)x7 zKKR^!bB};$6u6pdKIki7e)-gaiS<)K+AwioQF!LR^#sQlN?54G`O9ovLoe-XH+QM%SC&t!{4-^FSN?!= z-yJPBjmt#=<8^_}pfXSvPpQ3QMwC!^&d*Qbyk0*`n&+d@*pZ!dpdd@O+wd zxIGj|5xl_!K1)>ZP?7^{dv-@(%F%@+7MGkn^pv*;P)?m^)h8%&q>@(}&-57d4^uML z-pO)R7C6MetfTVXJHi5j>Ue}g1Jr6?88>^pG9aM6X=FoQ#iLcnz5$dhX*7}R)wccV%4`_*0ZD5g*(gb zct!HA%7(Mc^xw;Bik1y*^yYTi);=&&t7lE*B_0+yx+sO$uf;euJ8w1C2MOrVefPOf zlht0i65kt6++Au)HEZ{7Kb`d*BdtR^cM9LXe}9L~<7aqh3h3NAi!>Hq2M``jqg!Rh zL8yWokj!eGm%k5sA+Q4CF(O+vhS#R+&c~0+h%9d&P6jcnc3A~4p%YCdkqolU56D<> z!2+SG{&vM7heiXaA_De5?ZMM*l`O}Q&{TAFbsO#ElgLHY^FgfTxkv8c+p~sV6vz@T z!%woZv-xNZ>DINQy$vz;%^fd{iWB$AY}xWU!(;IKdx2U9{C{K*BN#vcELoH5P^szz zc+K1Qf(B74uuAWFzcuV(c^0xCqG@Qw3z6Jk-|nVQe!D56?3``v|RXQnau2zS3s=-mGRR~1vgewkiLQPO!MVx#|YjOL;zx-BwZ=2*DhZt!SR2g zLF)h7@79dRf^#+CI!=wsL?%^fAQgyjtq6!R)DSwhjeE4 z)epkWBa1?@yUD4=H&!T12RzS*dxEL@ujb(cJp4YoxsB(_ICDg3xEdScdwzczkOWmqib{(@(@CWi%s5I&X`bw)Ee?D;B-Elq zl>p`;7z*r9bZP=B+9tQLCWdh86e>;5p=;N!4MXhdLD^Smw_qMqZ+)tuL75mQ=x?-8 zfrUXym(cIl4`~|RIxNMZG9J3n=Rn_Xa{YNZQjzW*^T9Z|O9XNXmFAc|{j}){9+Cs< zZPEFd7Kng|0WO2@w}PVO4KC$Rs)gMk3S+=OJg)0Ha1=~p>wXfkXQqlCJm5fo6P@J; zXUnf^)Gkswme_)(aZ=Ks3Y#7BICf)`IzneRnE}g=lxg{-?a=Lm=mkaeq^!u=v*`_} ze9lY@_m2i!pjJN1E&sahBBtw2XRe%@PMN9KGMYK?n&__sjQGOgv+`u%2~G}wG zzGXVH=fs!_we`&D7UzzQw2H9lx-h;U`{M`W^rpAB58xcs_Zu`jPoQ#dO&kNl)}%|o z!@`8cQQ`^F6!Wst+-e3mG$%4C>r0;QP&fmVk|L`a!XA& zhrZs9X(^ZfO@VrL!H>@UkwCnD)YieB6;W32084Gs1K(MFLKqz&58-fmKo;`f$nfwJ ztPb?U!8@P=o6qW1o1DL|rUeQgWnFR=GZSpdZi7n%>r=a~uGbB^kk}zL)@Z1+vJ#A4 za`LWr*Qz6u-lvi99pLSU_(K%n15SNv@OE2e_wIrDb#u0kFp;JR2-ir2ID8+onKgN% z_iGZC@eW+w{68d~;L@JYT^bb5CpMNJ+KL0s=OolMTb0j4&n&cEDK+eeIZ^%j^Ajj1 zkPKmvRh8>8B32>-qM?!k6^Ix&Ls%U_6~7H;GmHs}IE4};ebxc4U6^hEk_&7$ok-KE zLNXWMx9`br^P2N0<0rmcSvd@bt?1$6OWjohKqVZL6U2ScTIjnb&8hPfFQ7)*=oyGY ziHGVxfBqa)eUws(FMb# zRIy3FnyVXyDTrcFIjZY$7ANm zjhUQ*`^V|YZaS}jd~utvzq=vTdLCufayJb!!-Z3K&J3KZ6xPtuk?bi$@(~RtK^Q-C zUAX$!;Y9-C+TE9mwUXa>)Jcb;aMo@-#m)QmtMT*5VTS=W$>IOT6H0?+507U%iQHhz ziTQ?!hXv6lHX)%jBXlb&2AxCyQ%%4Bb2$wQJ%0h5Q)n1f4>ahW!HvH`@3N>Yz1!|bPcFr-$z_XjzH!pw3t7n z0lN$UCY3#GHRO@d&`{@*)@770tija_F<9vAizObt^k$bhxLbzN28Rw8^}UT3uAm0+ zZA)aUl8}%94`LWin7ch^&aP~MQbMwb{md_Cu$T&_deeF202kP&Q_;;p^n8t@ zN3TL^g)c;`CuuLEHdZyJ3eXDA-4tCfSQr|pIsw@MUhf3uEyg5}C$~IIbgJ`A+Rx8k zC7_r%2t=C7B!_(FT|U@2vdLp=AgD+CtRI*GKN4gIK8gG7Z^F?SY=;s%`Z`bP(zDtt26pOcKFO@BLmV@%~n+qCYWULK$Cd+wF# ztE;OwCc*~{ml76`Qj|lv&$@SUQr_%`HoQ0A9(G823&k@I`oclh3~dehWNn@#^~H3X zj&w+MZM)`CGRRse`2+D1k>x~CE|js1$|%Jx-pcLAhFE)#327mP(*b);HJ;{vdZuOaRf*#s$Og zwRuVtUzgyn*CoC6#~s6VLGJ2$ZT5I?}YCG)NMz&SM?O1>Hyjq7jBEmIyZ zw4Ji6Si3&(W-VXfzkcj_orPFL2YP^N80+2*&~3YJ+#C?L9)F3B;jSAH4|h(eGb!u` zh$Hp`0I=$)k}P-}&k)8eFdP6$_-jKvYHN7=zrzsKoFmwc0(f>@W>)^|h0on8j1L`Q z9#)NcU$1du6(+{!4v8oYLyRjZDw0y3(kYX zD{~*+MVx-F&Cy@b7%G8{1gedwA*imQ<8@tXnGEH2>ExYriLg?r3&}ZcoGA_xA;hz} zPDIzjK`ZDoY!6+Z!Vkkog~Ep5G}3%%#IAes>%!i~%*u;8XoKO3|7Tu+eF7MdcZy?}*F z3)DWy^5`$2FijiQD_jhfh7T?{S)vKw5E_+?Tnle=OPQhU^kYLtSCO?}_4wZlh_^s4 z%ymJaA3Z&btAy!*;}1W30Wbd7CR~(wIBfh>_AR#W(?VdHvwf%s8rn}9r)W?=0H|)I z0k9mqQMQkw37-q)+1<6ZheB>FT)GZKK|8Z{6%)@tv!DhH!MbZ^#-NUjjm?pQ8i`d1 z4aGdft8IryJkK@+NHVm}Il9v$db6oS3DKJw4AjnXNp&Ah4%4EOLx0PKjkd)?q(uPU zF;kzD6A0yyWdHH5MN4i|hIM)a0VWvBxMC!kgYz)qsmrsQxQBib`96z^!>Jqo|4J}~ zARISWMLuf;=z!D+7xK8PO$?|D9*4O_v~0zSr#U%vY-V7y$wPPe zJ?2Wrcqdt<)xvT;L}NTt~Oa| z*w_rL4a|g;TLtGJ*_NUBtvFhYo@?mQe!4%lPW_#_Z=<^yRNJYakY zF?Blr_#BRCr#JO&{h9!LO6Bn3E0KyF59Q1y?b?+ZIZ)k1>loUf(Fk@L?-{C46d^Z( zAF-sKUzTsrm`q)QWkN!Bn`jX92ATD~bhUkHN~wF@vhETyeKHYQXB4LJ{$O&Z4uD_`y~Hdq7#8=nuP!hK7$18g4P zpSV{-;wg9^RG&RR>XHX1r=f)=V?2Dy3Na_49k19V9sl;`dO?gF$@gH&eahP4aK-Kq zgbXD@2aOSmhBB67(hFK!8y6masAZxi-N%&s_E!EKP$ob0Iuh3r+4qIYzFT>ey$qX} zwDj+7zFpk1DX+!)<*o8s6G-NSWz+STcCc)IsfBbY=Ab*11!XixPQ#Gqf)2;6FJbzL zMZIbFhDfA}4A}2g`TtzDeEHi26-C^al%%Aj1XT0ZJ{B@9y1l9P^-7s|Of@L!p%qXw zwpzLs{2+806<#k#^)$DcDQ7r@d&mwAgcWtDXdC-c7l8rAecnk?2# z;YyQo9?qtfG?%t}8gpt2IKsUjD|sa0k+H_2?o}AxC9VIG?VgXvXI3_pwQmm!@P!4g05!$TbgrW z9BEEq{dZ)HD%5Z&@Ont2j{oJV{;?AhJNwQxF&Eu*4<~rcw^#uYt$R+Icf-?#{`Io5 zvU1CuTl)S_OY4TT(tYxujg!$60`G$|M<3E6P>fCJd1K>fjURVz&cfO@Mqw4AxtE z<*s!7D*OEFRU)L6TN@8VqpDV@h+2hCN)w&dmF_?1(^SyPV`EuLoZ%Ib^VxhoLL|9Q zD2>(LuhE3D&~0+GYkl6Yt3;>6NfA$ge`tY!xB_M&G~;Ns1TbT3~X(-neoB`yvVKb!o0lEJ0<$mFtuB6&a|DsC)NT#dUaD% z0(QxXVObgOpA%Ng>W;WVT6qzU@vX!t@RxEKodcio`G;57`@Qd+Uq8@w>kDU+98Ijl zs4&^IlAp9lB)uHGfonD!=K3=l@-0|&=wd6rNK&~TEAvc#y4B~6~X5~bD)R4hO zAnR^34pGZvTTaou+Lw{fbrxMypt#T(vwzLO)x?{@5OyfS@(H=nI`O!DvN&%_k*1fb zQnY5-A~eJ8Gx+rI2>LPaHd)oyC7Wz5xtVrSuI&2VNTM#1wh+j#K7EaqZA0T!x`cOf zY^*@LBRa8Z&*!sYY3VowBS*>k5^C^NYuMELFdc`c&haPE)yeA_T$|b>BG$>51>cJd z2nY}iZMl!FWa8IsJc1_IP&-+sIZJjs4=5F6RzS4PC`;po;ioDu4=>u};acBAY^B6W zTHUtwDg+x0KeP`L)Qyu(5%JKZPOf|8gJ9C9qo2;9`)Qv>a(K9b?A}r|7+cn-(7-f- z<$PGJjl62MAmaQ_())q{Gm21!G++(f2_}07Ff8rWCez^GUf!aa#Td! z(H(=JQYJmA1oTC^X$1_7i0Tc~ICeR2b@lbtAYms>=yNTT{?CFn9;4s0f7yzzF?t}Y3Rr=a3rt=Rfmj}y-R z-lUABA+fAOl`tX2#lChSjGT5gRyVf@cw$rBCLN`I=Fi9WD;eLi%4?I-(*tXA_iuwM zOvQG}jruKl4>H{>_B(qv%+&-WH(kDIx;#?mJLxq$G4uTdW5PQWq4D%-KA0j9h)+ml zsGs*;j$ z2{E7?90XAydVHtT*~e~F^of!!JAc2Ei;F3Tu1dw%R@_0#_si@zrQ*5xt|R-+3SK4pacZfersPb%e; z8X8+^684>b)lodJ9`~Dqo`%Duy6vad;ezQ-c^UZEbc9KPiXE7U3ppK1HgtAEAw z-a!&Xsm4bm_z4Z@2UTE=R$%#0cU+266gonbyb3CPA|5H|Sk|zX`R|?7NV)8D>lP`v zNJphuZ|J4I=W|tf&Df=Ro&x_tuK+e@f8|kGjIAX~ zTG1~=J?dmfL2Jx%rpRT#BRV>RNs|V6SL{k-j&X^>ol=i4?QDb9ifk~@4JXW}U1gG_ zT^e95u2}ZQ`wt%~AdIHM$iIj>&$AdsWF!|(w>8XF<!xCG)L$=jVuP}KRMJZ|x22CL6N=n+ zPuRIiGpw;qh;1fzSeol8)+h2~2@{w`vD*l{>T^3V{z=Tb`1y~wteh)qgEDJsYBDOF zP+&naKySid7ouRGo3yu&^l-s)e&+Yf=v60Y{O{ik^S`v{@Xh~*$^TF94I~Zu`QO{m z^Z)S{G=4{vd@h6JER1l!t8`0B`y5}+>1|C(7Q}82m|8B_^`yG8G9qsxE{{QlR@qV+ zaa;O>4RgMa%`k;>lNdU{xY=}o+;}4iZhO!rM?G*E&rvVga9RgFZcT9?8DS~XRGQKXlb(CW4gSoTr5;_^d9DNiJSxQkQVwmaq^V|AfV)LA! zB1m*u7YDw1wSn6PsuZG;(w)qA?2C6Fj>*D(TiGZ(($2oU!7jpy%{*6lZ*^Oy?>@I{ zfk?JZt6Xa?$drFHgHQzKzVWZU2~GzVgE2pJ=uk<@f4mXd-1Z7XFR-IS`vBx^%MmLk z1sk%+=Bb({1XN=+P zH_iSk!f;_*P$EI_(X4aFqhTJ;Kl|GZqCroLj=olI#WXkjXntE^``^k~s_$O+%-}FuQ#_9l?wgUJ64)5$P+JNU$zKfo0Se;?;?Ca>acbyVCOnT4 znEiV3aCHe>}w6%IpBs+blz)7yofahWPk4e#3lc3}r#sf2sHReAA0 zNatX(CBDEfO4B|%8fb%0Q6w{O{U81raOa8TYC!$mRXG_;uyGTSL6 zSCF2aMC7#Lf9dY;U*Sm|4C!~3hc{_WG?Ql?7M0(T$MgS0SHQ8XiPXuLy4Hd^~m zsoWeOqG$D^2ar@K$t3M>ttW4=Jp}O}qY^nk-tx|(QMmtBLuI9*vsAK;Aowbfoapd8 zJ5t1wPbG}3+%`59v|pp4Z*I4T{TXt|EyT4ow=ZS@Cp$aYDb~Kpq1F@)7FZ<6JM8#H zXi#Fth9BY}^fNR`>T`W$L5~Y2wvWg)Y&S|$3ktdf;ibDS^fm6^C}FPvHyk242ytX! z?5ta2cw2JtPt<}wMTFf0>tTrwsr>E=(dERb>poE#_7pW*MbxHj;xDzKtMa^${D-j; z%>LYdZ0L*ryS0*KcBOfmS*Xb0_HfhS5?dF$1;s?KqvAK~`86cq7qk;MDQ1e`3g&Cy z;pepnrA?~Fil_@8#*+>XK0?>#zvsCZm5jm+p~wKi!0rCaU|uJeKH3EH0&JN=k<41jvkV+_xETIQM*us_Iq zj!B0`j!qHkXY5o)rMui_rz}_C#zOUs>YQNKPm7F+IYXc4x$mDuY=tGzno-LzBC(wa z#7N>oA#;K~9-bTh6dj%s3NJZx4A5?d{nIVs~q_SqD44ifG) zQaone;g{vyi+vLk6NTdxgR6*z5zZD;QDF;ceGZ_&zsPNLKHyJpOP(HhPmYZnL(2CM zk0RK|GuUc|hlsTYx9|I1;o_+iKFinI^)OHju_R+>fzuFW(6L`j(MTi8 z5YTlqTGwE#z?$K#T)cQOXlSyb9Vx|N-vCK)o8>Ne<_{k~)+mbPkX?@BGF1Mk# z1~e@O7*#Ab$`K83u*Tzhk(`Xv@7}i$4fqL2FyQ`mb^|%jL1#4GqQ8Zl3s(3TE=T{P z0Gtrp|6$BzV*LhcxVx`U9W*)EHQ3pGosnSvBF<6V4|~f@y$afk)(!|3nDfMB0#Aj; zRIoIj9UAN)d|~SlY2HuDMwgJr!6y?o8m#$wt|5dY!}j_47rjpApUazU>W>$GrGh|( zNJv~)Dd$feTTn4PY)`sn7~j&QvGfG@?%ivQUGfN70e@p8rdgB6?6es+n*cv0V=xI~ zx)L;s1Ga!fulvF)hos=pB7LTOG^|WwBS&T1&cb9@8GW4iy1>-){-be7Z=l!&mPn9m zMA8RCg9a|L_W>FiF7e!fwqc zVPaVQF!;fP6v#4hdMXs!pZ2VBZ?+mjljI#ROn(tYb&DGd7<&?Jd|59@go)WILbl} z#9-qHBB+XW*rKxgYhP{b!3jM8^B@3w5fk#H4P!J?tT(gMxSs5Y9G`8~B!LR;Dd+;y z2gO#olXI%Ko0zE0la6ZJf`XB3=ZoDC_TCaAw}K|H5tKp7zk-{A-fS!gXGC7Zj^ih-(l5z1 zG(dW>k-QTLwGU6ebw5R465HqcH$pgIL}FVxn5{JF$`$NzT7l<9Do=z!tqj5_2(1c? zXd_`rSqK(;v<0)Xvr}=gh)~2-lCt8QvGG%EhxcpV9!W_qyS}zx>K`Wi^JMt#B+(lPo<%u{7)?>@RVXb2q+ zZhYswBJtWjASs9_yUdC%!zcw|p(r}{GYK9asF=gN@3YUQ6SEcv-*Lq8U)tEZAMyy7 zXeW@W$cP%tZB7<>>cSSDoUQpU|ObjvZ`=U6sa@zjnkZG&x&b+r+%iFbdx7qU z8+`02W8nF`!dBK8;2yQ@UI#lbRvr1?!!3rSYDCuVeROFuwGzuO%lUu)<9b!JkLOTV z)}BmrfKx!X7hM!|)Nmwj2lF`)A>Tl0pu?AUH3VV#5WV+{I1#g~Zh_r%qrU55Bc4 z%xPX|j>_5Q=4SnDy;c%}my60NF*skuAtYH|QvgDJz)vAvWqB{t&~6Bu`%A)x=l}{PVESh&kL(h-v$Q}0*`Uw#hufLs+{%&ZG$~pa{e6aS{^CXGXVgMn6 z08`elRi7J+$q)(=xP!Q!H}^L^vA@xU^r{TxLsBR~9}1=g7P9rlOP|r`1gQQKqF(mm zQIo~q>t8@g|9!!NV&Q2AuC^R`)z$CSmlb%s1pHdaIdPJl!EprtS$ckuJ_{F%j=BlO zD}O{xhn_1A9#(jHwnbmAt*tG$-?p(PC$BYp2Xt`cxrD~uzP^&ll8>>2nMZaNXq3>Z zCl@S=MmcvOGJ_eWA-+5G_P$_9&rC%P&aJu((7zoj%gvyVgh{A5x@DXQQ<@|GO{pE{ z2lvzW$i-B+(($+oe#wBFuR*EBN<58K$uFM`CA6Cgj z8WlLB)$HJNb6AGEx)fms=xrKJ4bHFZ_c{Lr8GQNZR5s^&@Qk3_90SBGE{IJl4Qfb^jhln zGliPJs6XlRfN`6+S={&lJI*_w!rSk$!(f3C`7yUgA0sX%``ki4F8)1r3PV=Ld&l$J zh`2=37uNIoZvEC2x)~h~EG%d;Nb_Q{a%W5Z4eEvkc&%hzFnhy>3h?j%uaNx)8CQ_g z3}iNAWOi z4ca*{SIz6>F93}AUJE~C5tS9p%b&*<*LinbM}0b@2%qKr*O@guJwpJwNf({Vw=Nb0 z=26uCC1NM&9)!D)!9@%dHg|J@BQTgVQ)@&Ic%!Gm%Xg;AHY3KkB>m+s_l03;9{0cT zTK%sOxL|WS=ryK0#t3yHu#-Q5BOHo`)&3R-zaciE2VB1m#CR~dwqea5nhh182lA+9 zf&nApK-#7L@9sAllwWbkco}m)U>YDq76oYDaPqyw`Ir;wH@^L!&NyccxPKtGhi`4j zz$OkBG0#ZC>O7h$@?lGGz`iQ*SF=($f>+!-GW>(0qg&foLo&=XVaTm3Siq2lnsyyR zHb4Yoses#2B{h!^uLQblirmq41DSrEeE4YVU8kvG*m3Br7|>eshp={>;$65}Z>#jpqd69}&B{}B-V>fx`ArguE9 zgVeF7X(d#r!hw_6#iM}=W1$AagNAQOzc#{XLEcPhFyW zJ;bI%Mngna@)*+73&jqB`eZM58>j{dv|= zH-al035g=v8e-&806%t~{6sJn9;oEQ#hF*YOUmIr;p6Y!gn5=0md#MKHtILPMY}r1 z#G2>FL2pFzh*w^HcEt&JkC~b68~rp9e(~}5q9gnqeZ&9%gQflzh*mcvPN)#BRE%QF z1G4FoVgt_OJ#Oflnu2f$WO|ypoWW({K{P%c$RGX%4`a(R>*q ze$(>Hu9VA>ud}=p-Jzax(un+Hiq+3ga-J5Yp)+JmnkjtzeW&IBf^E?c{4d)XW+XvG ztb*j0J9dFkLuoZdUuzX3z)S4H4;qT9Et&^7ZRvbGl(% zMBLX|V}a^7$LzrkdH)QIzGLLQ{kx^|;a`v!`OH-1B1IoMZ}lfjloA7yh6sK?|1i&;=Qn*h9}y__Ge5=VZ2 zUbQ8FaJuUAwj=e~+C3qn5;ZLPSj6cdCoU{ZP6C9Ju+R5?HtZaEOyYJvPz;fZZ7If= zz=VY;5B&Fk>n$9FHP5K47ftBc+C4d<5^)2Sd+&1pp5=o`GfCNs5ZuO_=c8ngtla-; z$qlpH<#g;`!f%`ZVC-F8Jmi1j#G~Mwo+D_pYga2mb?9qvKFc@|)6fW82>hHXXJ%V# zS^U;$MSFNx9kMr9dUa%F`%m|(1lXOUsepp&xh)0Ccfb4=@R$lZvT26a2Y}Hocaw}} zQ@;;m0!RrSz?45#9o&{_%Q)ur{ZV<(JMFVE!;i)@GH6Ys(QticrXhnXi*JwEhlLcu zyiqB%X5sjNnD^Rpqn$_g`}K>b;hVB&!54+wpZo8mdOpjmydRUczkc!5n7cP)+2o@O zCFt}-ochK8XfOz+zFxe;<&gdI+M8}@2eOvjNI&>3`EEtbL`DX!a5mFC>-9qShkf38 zxC|qRMQ|uG+2oX!N$&r0eC&H2eMNca9l?>!&3<+Rim$)Ms!Z1sm=I7~v}q!Pa}0%e zd1ms@CPU=23sa*nFys~S&No_HH^QLHQi*QhNn3l(-V^VuOl1+AcyYFtVW^(#nC13x zyyf`O{zC5VKekS090##!r`FBIOO_;2hr#&+U&MZZ=EM*Ks&s8bj60n9vT_1Vj7Gc6 zkHGucG1-u`kllU*%6K$8T$5uBilf1C$MQAVQIzub>r%*-ynC^gpz?%J$mTBQg2863 zdLT|@tYJg~i*1dr68{@Vd;1P!1Ox;^(7_Lws&x7a@r;M24>#Ic;U?O zQ^(hCK=ML{#wh18!)o<^X+|u|69kxs))yu2W+&XkT01*8gCIoyyPF%p|I37X8!{?0 zm(^iQT($ocvuNf3-!Br_3-%k7?|X^8k8KU84(Bmd5U}e5*F`BWY;^pIg@7e$)=^hJ z{;s`^|FGo-?S>$e{bm7%rmh>uZ7u$6#B#W>=`pxdswicsUu()?pXWpCzs*f zNM8$I;`$Kr4$2)#_FpETJf8J^MdE-1l}rVq#x6(gE<{%0{>LGgL)7PoDHpT= z>R?acjb$BvvFoQgf;ySZY_5j-uhN>|6bkG%FDavCfc85l9m z`-LkNDQ9ZV|A4P=jL}eFZ6rqH)w*sUQB#A_z;B3&ql)ue zIWu$*<7C=8$^Et&`QXxOLmec%cr{l77(T*AXj#O>2@?!e(?$=1*TVNadw)XA(-^^zvw$990R!H+oIf1HtKDB z37(KR*-XhOfn?R_VA46bci+BB&|%?uanmEW!laAy{(DO;hB->Hm(9KWauMt= zR{4BQgAT{%0-Wk$yOSR`b}2dUY$Ucl+VVP_5V;cdIJ96Sul%cs<9o}%sE8wgxfR7Z zT#3~!(2=Z%K?NKj_ul{J3^FF1+@f%GaO+^Uk@do!n>Rp@1;T>RNWL_%-DQy-bAA2! zH1{7gFs7jDj{6qZ&q0hcPd%OvfpeKy@Z)vC7IfILenTbv$)mzJ?;tlG2M^~7I6I+3 zXdB^FJ=-wmZ7>)<0Ev7a9x~4FIoB<0Q5hdSkK5J5x1^x5hDK-j#q2zb44`PN^TX`} zkfM|UTHV>__)bIxWnR&@a$HjQ&ja|#O6c|_uY^d*fB30BalQMsqX9|f^Y$LNuaOZZ zGF$2)fx=&=IIthR9*~y|H9T244^EbNrZytcE{9IR?iesjn#A|F6FCWF&JF4! z{-C{b!7Z~Jd8I9^!bn(#<}%($U&V!Cw^t?9H$t33yMHTGQW*b;b2$Z!FM7)yxhZqu zWyIVuIkYUm3+V&!7sA2|U}#o_fo?Fch8!VNU;oxe&uv#50rQ+&{IUw$-_~&D=|q z(+iEYNCnm(c*+xG(At?^{S7Ubxjoql2@hIhS5-B|wQSYe{`-=wU609xkX!+GSQUeW zl7o88{quWGYUk1jr5PDrSB{<6HihEZ%G|}prEV2Lup$HT?`)NxP3b}kj%OvxF2`e? zkIB5w6zQ)Zg>A}7hV;7e`!kR@H*kiVEQTL)FGNPJd#h3YZaO;F5t7kaTBpNuig zfE~`rziH{=ky)(z)1|!gt!X+bTm_;pbO@*3ls|uE(d;P+Wz}gVnoHac!1?Z20!H7Q6p8L5VeT$SlnC_7024?U4uYQniRNR;kxenBbp3h1&?a!nL>Rtfq z?(CJ(#$Du@v{TYxYgx%`)~lXvw8eHzHUXHb^>Te67K&8!A0Hbf3^d){`=b8&M*hIt zM2-ob@>0h~m_A5qr-a87WpcI>ZySdu4HQ6FpkRhH0nC%R;l;L#Lx)B4{Py&^$O|jn zm^ui-)11R|v9ub$uE2OG7=n{`IgU#1Dhzei73UV*NSLtbNMI?1MQxV*mnc^Fj5#WwXX6n@o5*spPU$q3rETCOaf_VcT%Oa|8jNq*??>D zZ523rcu+br1kMBrEw~9;y$*9bTV`kK7z(Diw6tKt4Zwzte0$smFSf-&mW0y+vmt=t zqG3_0nqqgPIh!HBzUfkWk<8D zv-&N^IxvKVP!D*Z9%kD880>SI_-Rg#Pi6V@1QJ@hB_Hc z8Q~HP6}W=rb`yl^>10hu&dhXOXkqLN>BWX@bX4x0@EQdPUdp@ea&+%d!-(I56Zn|vo^<*08>O(5w?w;cKWIfqPWPI<6KG-b!j;gfV7|6A z&LrP&P0@wb@DU|tQbIwsJap`W_LEg#^(EZvXvJ01tOq1+7%nK?yxbb1FktanAwTHg z@m%uiK`s(XJVs;`2Bkml>b%x!JU&|+Wz4jW7Y#SI50JhZ24c9{AGh@0MUH37IG;dc z+oJsKF~72vS@O4mPN1>?D5Zex!_Iw^*m2AaL4}4G2@e_=y!^WCxR2X6XevXJ2C&#& zCQdvatn^sayDT(6EMILi6pCfbdr))axV3SbVfgvc8bik5ZGDDyzyiw_e$t|ZspW?Y zrX(R%plSp7JBSygmpaz4U%ecyrlhKy1LqFZpJbxRSjt^D07aPCt@F?sU|->#^g-1r zS^|1sX<>QUjoIM4U@-vi1A}x85;?H4aL|OaJJCE=T6B7&3|Ym(H&ZlT*J;hvDc=|j zxi@T$HJib+0^6DO*gDt2SM>tRJyOB5E40X^>y;v2Xr7}OxI55IQUZ(&84eLhBw?F# zruVoE-L~z@p(6l%6_mwF?tslzs#(@)8geoPsvjUdXx!saIL#YE?^%Gr$l;j)0a$$X z=k60g^&Pjz&(&LsDR;9nR0apD*&pNMdZw;Ar%%%g>4zO06weQb6-x|%nm9i_ta_iu zzyP*UeW%gXkk`bh^ZB-)XdRfd$ImbOY2>K+!RhBB1O)^r27$_iKWN;8FA5sR{AU}6 zTGU2ND6Y^weTmy>Hh~646e}Hw@ z5XeaDQgpbbRo!~N!$F!}foJpJK^gYS16FUoB!(S|ZBw{1H^=i+rhS#R(7F2;!30=Q1m>g} zx3O=0sQFnqX^8fi%zrwxT!dV1?Cr0izDFa>QY?Iif0&x&9Q3D)mnd?7-= z@8IvilYhc`)#AkZWMpG9BS%4G$f5)z`qTV6;lGk_N z=US_Z-@1tlVjksMmo<}Gi$c?yHHYxOq+XvfHslzEW_%n-PLMe-V+ej4iQ{j35p*wd z@vA*cAx8p34u4#mOHV3r1B*5U1PS)fyzU@Y;$0>u4R*BntsR+Cb=Rlv41$K33XQUY ziY||E`&XwxMcfcP!uXb6JlAN2*xar2_dS#iO)UO(^IZiF?6H8-EI9AEc3Y}>71%6K z1!bF%FTd#gRcnTxlJ?%UZpvkT@}Lq`AcqM}R4i*+$Fs8{5)8M=y6euIP(@hy&fW-; z2m02S=s_e}tn9?I&yn#Psm{KF8QQIJ6xB}gwtLiiM^7Gy3o&d} zex2Jb_UiMn|MxouL(1&KHSP=C}BH#L?B@t8cSu?aMk z5Un+8q=Lm2dT)Z(Rm~qLxhAsF^N!Z)Gg%jOEZqES{Ooo@vN;njh=HCas^^OtPgebQ z;{&3EfaFgaS1M@z1Wpk;9CSFNA|t2w)Wc9M6~|o%;#eiD5~V`(Cpar~XhxQJx;pv8 zBA2tP@{u6Q5GOO`kw&%Q!k0CkTAXn664>7LSovxh*_k_YHd>BDnT4060>QB^drf2= z+ZpYTyutQs*7YADb&jnT|CDE*3SSZ8Tw+Z_5g76^b$2pJA|Ynx3aGwXB0U#{0y_M_ zOX4j`P*k&w?_Z}}1@I#JV&HRvcp^M|B$?<42ERD=hGTraA9nM!pCuM6fA*4d*m`uO@p>QIOam^pOrkGAszu>(-tX# zOO2hA)A9*2vBCBRy{|kwR9>UNZJoNRcUgRg=5{d*z?#1aQ^m9_UVsFPY3vU|YUIn! z>dVrld{iw;$G$~usLTwD64=hqmXV)~TLL$W<;o!mEzT>n^59B-6As|uL!ur^oU_b^ zD?WS-`KE)wc#F-Och$W>h>h=eVUl%i!adUsaMsS9`xt}{==`O^i>(#Zf)AMc16zXK zk{((Kh@jM20R7au`th@8N;`ev&<-KWBJjEht-p3R&0vEsA~v0qoA5*V(LFn6BGq;C~gXD(vcooGQJVhG@_pQs+O55s1^3nG|dmm4+gQ9ai1eP z;1YQ{%N6PO#Q4Hv3a!a9?*-q{>5fCMvYPLp+mr9=NgQAT>?pgCh8GR9?Rt+V z&GfSXRT_sk=p%=?haNiW=@+~D;1~ffYtFVY$~!&{2^IK+^o#5}@@3j{YGM6Fj5FGIhlidV*UKLf|XbMyboAgtRcC z;KKiYWOZVG#of(=q8Vcu5vvR@#jj?#*4Z&=IuHmiYim+1$YbXa$kkn4Ga&0%YXjrB zg5Da2)RAR8EQ&ZGvSv6w-d8);$EJe~kaK%fV@@*ErGc(MQcB03yEM=u5+?Q&DCf(hc%tQTlqM9nl zAxUTXXHN`d-49mo4@f_X_Op3DB5iF+7q+5xOk6SC^>*^+AjApi7-Aj(_Vt|R(wO=9 zJ1FWv=xp!(F&>FL@7N#7I2iYWIVH?{JHjex^*|>O&|7iPv*y3^!>y)A zf&wBD%`<$Bux5B^6j^Gb-UBSo8xVPJ^}*`S!f}?)XFDd&ifR zb2`S})hH9=(KaIFu`Tcs5Qx;8{=yVs<1Xv$UG7-75se(6C$;zntwXfFm^YEA!eYV> zH-T6`XcW3N7EQ@09K#3+;4MHctPuKs6tYFY-S~PCZk49l&X;QESqXLV z7Msmek;_R*XT82>4v+1g$qYA3$>)G3gG-2zJd<<+FjJdP1>y3CJl;U|pzN zH|_^?5kz~pK8>yN*fHyjucz=~gbYmE;O-_*9y0C1H7q{$gv`vDCjBq}`AZ$}OF?KW zz=MA(IDR_mtwA_Gzf@%nn&Ch>Pb;i=tN(jdfL3T!V7=^Tv3BHDgRoId!eAo*P`g(l zA0qK)$g+aW)LMU8#g>t%W{E!;y~{EQ_iWB#!WT<9M0Q%C)%tBc&_@2JuuiQ#ReB%am=1pjdlJ_c$`73&R(TN}n_}F7f{c zdsb>jJr&%&UN`#78lm6>4WY@`P7JF(Gf?=*j19bjR-U-HxJ{6CF!m$hT+CdHvRk2b zr~%fCjVuM)zEHzM?_(3h#}K|;z*4524Od-BesC_Tu^OFMsJypl2&V#j1sz^ThBJ>b&+~&A69;Jf?r0LOWF*0NfH-g5+pv)=*h}PR0 zAHJT0(hB|wzfo~&6Eu+<{DsBB#*6p>=!Y~Lqq8AN*#TN98JN^w;!6v_lSFlZsz!Le z$H-8@$emg%KBG9G(7HEcqQXC0xtTGgw2F^Zg?jWpY4xUQhO7_XXbEGJ8+kto+kC$@ zTliY~aK1oZ_0k-;emCwE2>1io=X26gdTvk6Reh}i=X~npk z34Zdd171ibSxyMP!snnp2MJ+EfuHZoM?GAX(GV>OX`T^O98A7*JAZzrnO|?l;D2~C z^zKFjI)h>BeEx;=ihUl!r;A&8L+mBt^3Ud=_}Zsrc=^ix7+&~iQ{uxs8KBR42CHza zB%B)x%7Ibp7ycL5PCvjhu#J;n#rxS~UTdcxS;q6N-Fg0n#=B0O^^5@S0)k1*N%Pv;z}R} z(}|2o?1+%IJjhDUmyZF3`r!_YeeHxq3IxDoL-okwt%&rdg9j@d)tBEoHY zBTg>}vtTsY3sK1#Ut3(*DPk@Gm$3=5^1?f{{1YNTFly>t@<6i#gSFVV8xEF4o4~n8 z4Au37agEKG3hH6Pd!DQTWb{(Ohvhopw2F8Fk6w`Z>|eH~R_7i(srSkl-3r{}9wUHv z;}Q>*DLl@5L!u>CYRl6zd-~_`F(TadDT(sij=@&EtKgg@eLKq@9-@p0U3%$Q8Clsm zH3xBVj{|Y%6ZvW5Mob?4l8lV-zkUgoB(z~xB}ikn#h8~MwgWI*c-rYzrtHW4U^Xtr z9uqj~HzvR?0lqkBrxuaOQtjJ)fHeAbu@S9qfAh`W|-gH1BoNr2<%R6g0TOEkj1GRwsv$Z6MBK# z3xG++y8GjH?b!ok8yTpt@!wx3(KtSIscnKFMNSmPCSxAKtm+LSDST3VH^a6UJa0W9 zzz8rwa#%@+iSTJ{ykS|5p#VqtymfAre;n6f2j4NuEZ;#U@$$L^3Ures zue_L8=}msB-+h~&%#8gohM_yXYp_sZvC)Z)Ul{T;XM1CXLughiI8W-uf6QWGsA+|V zj&-13Iz3iKfISI+WnlAdM%eo`KFeU_Z*iTc; zXb5>{XQx#vyu4dc#kNCo&jX%jY?zPpn*Wn`o=wn2;5jt64azZ_pfLz~t}Db!XT~zH z59RrQs9T$=&6pf|)nh3PVf}|&{9%(dD&=hHWz-wmRn0(E|^Atq2U1>oz%^w4FFgI*36IBY3^C5 zv`|U6qOAi!3~B<(vZw*aHbhJ3XOVBiU&TLk=+?J(U?ScAPpo+WN=GFDx#|4GXstfI?to%5bA5x z-K@tuQC#K&`BavU_}S>dXZ5@e-@6FF0y%1_swOu8+Yu);yBs_*Cl5q`kjW_jN3NvP#1ja~&?k0t00=l0ezZX$Y zfkVXqMHB&QqV~(w=}8)HAbsaZ!OYcO39EX zhwjE$LaM~l#zmJ%**T{i-7YcNdcTVepXHd33acE^R6Q9m7hT?|DxU&SyudM3_QLb% z2w~8C0d6OuHU@@C{-}^w40bvB+xNGLN@Eyw=dT=n)L=BHD5H?U*x(5bq}1_oZow`d ze3p~R8j_O$SP!dCxMcdN04>eP7nm2&iU5(3a8JaLxd04LTHFw^@-JV{kUtJl_)|my z=O*|xjTS|)g_HVm)620ELR~Ue()AJp(nrXt1hlkw*qQ2&=rGx%s7@XSP zJ7f76znDNN1m1WhFb%M3sGushtf)hQ4$^Wf;5pLPC90erg}Y$^0rhvR@80*wiGRB{ zhH>{jEp#z0kqBEEm`kFcjpD5h0}V(GO`;xP-yK-ugU}aCwxt?f5x71+M9|so+NBPg z-MioPyKi<2+yUeq^85^gc}P_@Epx2T^{VKU3`mbUf(ukQLG;i?Wlf{yZjEz_ovt~~|;)W4~sH`5NTtoe56EqIV z=8SXmE8jVD#e**+rwVuomZFYG?nN>)sMxQLU7I+Tjyyz0V>9e^OmCKpWsPMxPece6 zMv9fT0`nz35J{Qi@qHoxR$Nfn{F(pIh;j(_sT4+)9V0F%e|@8BQ4lW?azSci3xoz| z6M~tpGO}(&IwUUgR3U;mMv`zy0$+7H2L!?m1qbT^v+&Vk0_ic?1f%RDOnDgdJnHGY zjPd+{hd56@ZeF{$}+3h{HS@Rojwj1y~uDP=mK+{;%&&!9 zEii($_MN2=P!OU%aAW{tQnd<7=KK5sz+!M?K!=X6Vxy{1cr1B};FPin3Sd{idE@Z? z+^JK$JyrxrVJ(Gptd^Wf-$a>2GI|J1U=3%)Crg|3DqqJxpB8N#e|Ix1@<0Wddn-35 zCw6~Ol=e3r7365_ci&nrL^BaQ@F%129`knJP>5eKBT*|i-yy!OdqTpPC)zv97R+ED zSG{zF@}FNP>5xeW!eb(mnx3eok2QXq1}G7N)OsED9dgm5@J7I8T-VdHE0@{S(gc_< zqLYt(Ica-#3xnMVH3MN1s8G=}MrZV?Ab;fDrv0RHK=o{Vel%foBYV$sWNz8_CJak7 z%}-ATq!A~ra1(3W4iOjGm!k3vU3H3X{=;5RTbXaot#$%j*k$t*Fd5I#P4x7ACgJ&( zFQf4O3bS0#ld3I|Az!S-D=zy)1pX#VHIeiNV4U#EmSV#_1W>C@P$2tPo`)~fr9ggK z)KvSWcYNeEk=*Fm!Sf?p!MLz+$}RW0L0_!`>k#p#!q`$diAuZ}9VFaEW%f^C78DZ8 zXS@!ZpT${K;Se&lsW1l+8gF^&^txnR#H|+fUl#G^!A8}T;!+?KR9|fnxni?G=r|P! zNH5U#RZ=cxTRpVCU%516H^Tu^EJnmq8Z-K{^?QmIMhOL?S;c`-YYE$hyZj2V(?G#s z8ckznJywWKH=ISA36rhi&)JKZU`kvAAlapYdrZZQP-}p##GF!{ob$#JBV#qd4@b1H zk(j$E81yAvG(VO(lB}i5A$IP%NUPz2P>pFCz1T!FZQdIVd4eopycvzF}0_+yk zfB@2vS{eet^U(n29m%B8Zk;bIH}T3e^#(UPiK`JsB0Z}i2 zJOPai`?_S6B712}D@(IRv}?cRQeLRiwMJ7P=SSJyyLY*_l+oT#z9rf{%(w8OPt0M8 z&z1tnosb{Oh8MfO?xTh;xp^W>oIXgrK-|ss7<^;>$`R0L{42-YA&JN6{(yNx{2zR4 zqXk$&YcIXX9w7g-;~LUZTDlfdsg>%qPUI(yp2tY_vh=P3;a|um`(Ei@FPytoXoe~7 zc_x-I)ps+=w{ZTl%aH_9icDtjXPoj0ha_;n*_S9OP_m(acdj-lNLK6H`YF5zV@=aN z*&Oot&hDNnAb>6noqre!RP;rMxwKj2BZge z6b2(TN5X=Y4upPu4%TyeI?HhpGFLc3Yz2!9K-y7XM-@P>M7aPP4V!^-aik*3Ncfb+}C z>(GaQ&2c1?#~7=3a&n4Rcv-mwdm9pkLDco6Cx;0edGuVmbT2z5zY3tKJIGBSO4WAt zThU!70X_`Im-R14OPj_7+_`h`8aI49nQTTP+V8KR;@7qkpESySxOQezi28_|rWkXa^mOLn;RND9e7+zb<#O$vRHP zqFNh}DXI6^1pHF_BJmP1>!LbmCwRakLPVNYd;)P4YXmkM+$Jzf@rPtsPb7Ao;L7|2@@ zHnUrPi&UJC?u@3AS9Emvp+mY}WZ%&;s;E~$bleGW2Q;v1oX-l_!R$Nl^f6!!R-X;s z;dXupXqv4df+KUz@|ZH|%cDddWWh+t3msR*E2_^w{_%O6o5;`!!Iv<-4!Uk(W+qml zptQ>A1Gxca52-4?$)lTt7WtcY5OpwZ8bl@;j$^Ye~+tYt6(yiNk zD*SkykI5N__jedVsR$6-;d8fu+ef`1v=xX}496nJVjwDU0Ew&W>K3ulJ$V|~f79=W zH`Wq)%K_a-?50E=z7&o-M_qd$k5#(rtL3y)d+De}0j&QvbuAImuKZ*CF9`e-9-f&{ z*bVrh(|@HoLJM95H~R$wlAJ|;3KZbLN9@2e)6%Qj5&g zrsuX!m1Z#F-9Np($L~-8+SWe`r2Dpevp@*2J_km93|K47)l@K@{74v?V2+g%|v5*tmg38pJ@d?@oMjYC1aJ^hL)U5Ds?a>;Cz7_BX9B?XZo!uUs`r zGwFu#;1YASoMe>l$>;%mY`us*4_ZyM!iu<74Ygmc9Qv|b4_Uz#bh>D?W+hrISC%*U zxW1gq$BJB>)Zrttq9%77~t7Sh3^bb=L(XS0^gRC>`%2&SGn|&*WDH zwj+&;022qTDBu`0(ZwXg2CeYETQ?PPOK~n?dPn%msaWyYVw?mtAl=L^xZ}j&id3ez zc6H@h@3h>42ahtNi<`9_9lW-im!g)~|Hgl0_se~^qVlpC>Q@1-#G4;zT`^`E;J6oi zv?p#n-aqdkB;wZfG&ddnV`_dwE>Hr`XPhkvbf~%Spnyb!UHgX@nXv$)Ag%^1w6Fp( zNcPdo3kVp5o(!WYglct9%EBpOtt-p*zL5PIkw}+6LEtV*N0nOFKjAjYbNHZOq(u#8 zpG7c%o2pu4GD%A^>9AYdF-WpmmNxbAlb=E8Ru_ zp#b$UgyfVea*&MdKxG)LeeO5wz{OLSaL)FTO(|7(YM#Y-q^<{mII z(6uPz+ie@R;oDtjn^WO!1IbXYSc>7S19fZlRZ)A%s*S4h=O{4>NZ4j*xKr1Bs^qMu zu@zH{GLcCoEEgY2=c^b`pP)Q6Erm#k-^K*xPhc?Tj(!H6UFf4ba0F7`3k;S5LDp-% zrIQ)byr%l;S(C=$c_+amG&w748|rZszLa=A6`aB_6ym)~E)7P7)+I^+E zE9OQ`?ZAtaW+Q*r%P_#Z4KTr&4zwK?vayOdI2V+ex_?;8%Rp4chIC^K#$MFUlahK8 zq!_b9mB;dsT@0UmvNr%}AAexDuIYcDi8K^{+wBw1f$CmIeL(A78`JcCe~YAc*m|GB5fVm$=D{ zmPi8A;J5?iI-~IJ3TR_llgehq`!G}63{eFB%=Q0Ydr5zH=l@GDk{zSMS-I_AWxanl{>NA<&sx4%e&yn&D>t)PtClLPl9yj7FOUD$ k=B&f6`Oqv82X}o<(*OVf literal 0 HcmV?d00001 From cf391b3406fa4995fd86c8b75b2b0680b8f22a90 Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Mon, 30 Nov 2020 02:04:24 +0000 Subject: [PATCH 009/412] GitBook: [develop] 27 pages modified From 6a09c6b6799c742615ae3538caab7079ffbdde39 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 23 Dec 2020 15:16:58 +0100 Subject: [PATCH 010/412] analysis: first implementation of new Recessive Gene Analysis, #1693 --- .../analysis/clinical/rga/RgaManager.java | 14 + .../KnockoutLocalAnalysisExecutor.java | 20 +- .../analysis/knockout/KnockoutByGene.java | 7 + .../knockout/KnockoutByIndividual.java | 12 + .../analysis/knockout/KnockoutVariant.java | 14 +- .../rest/analysis/VariantWebService.java | 44 +- opencga-storage/opencga-storage-core/pom.xml | 1 + .../storage/core/exceptions/RgaException.java | 13 + .../storage/core/rga/GeneRgaConverter.java | 84 +++ .../core/rga/IndividualRgaConverter.java | 495 +++++++++++++++ .../storage/core/rga/RgaDataModel.java | 288 +++++++++ .../opencga/storage/core/rga/RgaEngine.java | 446 +++++++++++++ .../storage/core/rga/RgaQueryParams.java | 87 +++ .../storage/core/rga/RgaQueryParser.java | 318 ++++++++++ .../opencga/storage/core/rga/RgaUtils.java | 191 ++++++ .../src/main/resources/rga/managed-schema | 596 ++++++++++++++++++ .../core/rga/IndividualRgaConverterTest.java | 40 ++ .../storage/core/rga/RgaEngineTest.java | 183 ++++++ .../storage/core/rga/RgaQueryParserTest.java | 28 + .../core/rga/RgaSolrExtenalResource.java | 165 +++++ .../storage/core/rga/RgaUtilsTest.java | 79 +++ .../rgaCollection/lang/stopwords_en.txt | 54 ++ .../configsets/rgaCollection/params.json | 20 + .../configsets/rgaCollection/protwords.txt | 21 + .../configsets/rgaCollection/solrconfig.xml | 21 + .../configsets/rgaCollection/stopwords.txt | 14 + .../configsets/rgaCollection/synonyms.txt | 29 + 27 files changed, 3272 insertions(+), 12 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/exceptions/RgaException.java create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java create mode 100644 opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema create mode 100644 opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverterTest.java create mode 100644 opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java create mode 100644 opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java create mode 100644 opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java create mode 100644 opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java create mode 100644 opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/lang/stopwords_en.txt create mode 100644 opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/params.json create mode 100644 opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/protwords.txt create mode 100644 opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/solrconfig.xml create mode 100644 opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/stopwords.txt create mode 100644 opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/synonyms.txt diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java new file mode 100644 index 00000000000..affed513bd0 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java @@ -0,0 +1,14 @@ +package org.opencb.opencga.analysis.clinical.rga; + +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.response.OpenCGAResult; + +public class RgaManager { + + public OpenCGAResult individualQuery(String study, Query query, QueryOptions options, String token) { + xxxx + } + +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index a79c68a200b..6d40c841d29 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -267,7 +267,7 @@ protected void multiAllelicKnockouts(String sample, sampleEntry.getData().get(0), fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), - KnockoutVariant.KnockoutType.HET_ALT, null + KnockoutVariant.KnockoutType.HET_ALT, null, ); if (variants.put(variant.toString(), knockoutVariant) == null) { // Variant not seen @@ -467,7 +467,7 @@ private void knockoutGene(Query baseQuery, String gene, Predicate ctFilt fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), KnockoutVariant.KnockoutType.HOM_ALT, - ct.getSequenceOntologyTerms())); + , ct.getSequenceOntologyTerms(), )); } } else if (GenotypeClass.HET_REF.test(genotype)) { if (variant.getType().equals(VariantType.DELETION)) { @@ -537,7 +537,7 @@ private void compHetKnockout(Query baseQuery, KnockoutByGene knockoutByGene, Str fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), KnockoutVariant.KnockoutType.COMP_HET, - ct.getSequenceOntologyTerms())); + , ct.getSequenceOntologyTerms(), )); } } } @@ -565,8 +565,8 @@ private void multiAllelicKnockout(Query baseQuery, KnockoutByGene knockout, Stri variant.getStudies().get(0).getSampleData(0).get(0), fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), - KnockoutVariant.KnockoutType.HET_ALT, null - ); + KnockoutVariant.KnockoutType.HET_ALT, , null, + ); if (variants.put(variant.toString(), knockoutVariant) == null) { // Variant not seen if (variant.overlapWith(secVar, true)) { @@ -587,7 +587,7 @@ private void multiAllelicKnockout(Query baseQuery, KnockoutByGene knockout, Stri knockoutTranscript.addVariant(new KnockoutVariant( variant.toString(), gt, null, null, KnockoutVariant.KnockoutType.HET_ALT, - ct.getSequenceOntologyTerms())); + , ct.getSequenceOntologyTerms(), )); KnockoutVariant secKnockoutVar = variants.get(secVar.toString()); knockoutTranscript.addVariant(new KnockoutVariant( @@ -596,7 +596,7 @@ private void multiAllelicKnockout(Query baseQuery, KnockoutByGene knockout, Stri secKnockoutVar.getFilter(), secKnockoutVar.getQual(), KnockoutVariant.KnockoutType.HET_ALT, - ct.getSequenceOntologyTerms())); + , ct.getSequenceOntologyTerms(), )); } } } @@ -649,14 +649,14 @@ protected void structuralKnockouts(Query baseQuery, KnockoutByGene knockout, Str fileEntry.getData().get(StudyEntry.FILTER), fileEntry.getData().get(StudyEntry.QUAL), KnockoutVariant.KnockoutType.DELETION_OVERLAP, - ct.getSequenceOntologyTerms())); + , ct.getSequenceOntologyTerms(), )); knockoutTranscript.addVariant(new KnockoutVariant( svVariant.toString(), svSampleData.get(0), svFileEntry.getData().get(StudyEntry.FILTER), svFileEntry.getData().get(StudyEntry.QUAL), KnockoutVariant.KnockoutType.DELETION_OVERLAP, - ct.getSequenceOntologyTerms())); + , ct.getSequenceOntologyTerms(), )); } } } @@ -727,7 +727,7 @@ private void addGene(String variant, String gt, String filter, String qual, Cons if (StringUtils.isNotEmpty(consequenceType.getEnsemblTranscriptId())) { KnockoutTranscript t = gene.getTranscript(consequenceType.getEnsemblTranscriptId()); t.setBiotype(consequenceType.getBiotype()); - t.addVariant(new KnockoutVariant(variant, gt, filter, qual, knockoutType, consequenceType.getSequenceOntologyTerms())); + t.addVariant(new KnockoutVariant(variant, gt, filter, qual, knockoutType, , consequenceType.getSequenceOntologyTerms(), )); } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGene.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGene.java index e3bedc56238..c15f89429d6 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGene.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByGene.java @@ -177,6 +177,13 @@ public KnockoutIndividual setTranscripts(Collection transcri } return this; } + + public KnockoutIndividual addTranscripts(Collection transcripts) { + for (KnockoutTranscript transcript : transcripts) { + transcriptsMap.put(transcript.getId(), transcript); + } + return this; + } } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java index 84b9a4c4979..7974b965b97 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java @@ -93,6 +93,18 @@ public Collection getGenes() { return genesMap.values(); } + public KnockoutByIndividual addGene(KnockoutGene gene) { + genesMap.put(gene.getName(), gene); + return this; + } + + public KnockoutByIndividual addGenes(Collection genes) { + for (KnockoutGene gene : genes) { + genesMap.put(gene.getName(), gene); + } + return this; + } + public KnockoutGene getGene(String gene) { return genesMap.computeIfAbsent(gene, KnockoutGene::new); } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java index 7101790f6b9..a5cbacffa05 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java @@ -16,6 +16,7 @@ package org.opencb.opencga.core.models.analysis.knockout; +import org.opencb.biodata.models.variant.avro.PopulationFrequency; import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; import java.util.List; @@ -27,6 +28,7 @@ public class KnockoutVariant { private String filter; private String qual; private KnockoutType knockoutType; + private List populationFrequencies; private List sequenceOntologyTerms; public enum KnockoutType { @@ -40,12 +42,13 @@ public KnockoutVariant() { } public KnockoutVariant(String id, String genotype, String filter, String qual, KnockoutType knockoutType, - List sequenceOntologyTerms) { + List populationFrequencies, List sequenceOntologyTerms) { this.id = id; this.genotype = genotype; this.filter = filter; this.qual = qual; this.knockoutType = knockoutType; + this.populationFrequencies = populationFrequencies; this.sequenceOntologyTerms = sequenceOntologyTerms; } @@ -94,6 +97,15 @@ public KnockoutVariant setKnockoutType(KnockoutType knockoutType) { return this; } + public List getPopulationFrequencies() { + return populationFrequencies; + } + + public KnockoutVariant setPopulationFrequencies(List populationFrequencies) { + this.populationFrequencies = populationFrequencies; + return this; + } + public List getSequenceOntologyTerms() { return sequenceOntologyTerms; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 5d348282c40..f24f8b12440 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -80,13 +80,14 @@ import org.opencb.opencga.core.response.RestResponse; import org.opencb.opencga.server.WebServiceException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; +import org.opencb.opencga.storage.core.rga.RgaQueryParams; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationManager; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.*; import javax.ws.rs.QueryParam; +import javax.ws.rs.*; import javax.ws.rs.core.*; import java.io.File; import java.io.FileInputStream; @@ -98,6 +99,7 @@ import static org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils.SAVED_FILTER_DESCR; import static org.opencb.opencga.core.api.ParamConstants.JOB_DEPENDS_ON; import static org.opencb.opencga.core.common.JacksonUtils.getUpdateObjectMapper; +import static org.opencb.opencga.storage.core.rga.RgaQueryParams.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; /** @@ -169,6 +171,46 @@ public VariantWebService(String apiVersion, @Context UriInfo uriInfo, @Context H super(apiVersion, uriInfo, httpServletRequest, httpHeaders); } + @GET + @Path("/individualQuery") + @ApiOperation(value = "Individual RGA query", response = KnockoutByIndividual.class) + @ApiImplicitParams({ + @ApiImplicitParam(name = QueryOptions.INCLUDE, value = ParamConstants.INCLUDE_DESCRIPTION, example = "name,attributes", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.EXCLUDE, value = ParamConstants.EXCLUDE_DESCRIPTION, example = "id,status", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.SORT, value = "Sort the results", dataType = "boolean", paramType = "query"), + + // Rga params + @ApiImplicitParam(name = "sampleId", value = SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "individualId", value = INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "sex", value = SEX_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "phenotypes", value = PHENOTYPES_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "disorders", value = DISORDERS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneId", value = GENE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneName", value = GENE_NAME_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transcriptId", value = TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "biotype", value = BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "variants", value = VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "knockout", value = KNOCKOUT_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "populatioFrequency", value = POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "consequenceType", value = CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query"), + + // Study filters + @ApiImplicitParam(name = ParamConstants.STUDY_PARAM, value = STUDY_DESCR, dataType = "string", paramType = "query") + }) + public Response getIndividualRgaQuery() { + return run(() -> { + // Get all query options + QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); + Query query = getVariantQuery(queryOptions); + + return variantManager.get(query, queryOptions, token); + }); + } + @Deprecated @GET @Path("/index") diff --git a/opencga-storage/opencga-storage-core/pom.xml b/opencga-storage/opencga-storage-core/pom.xml index 0782d027a2c..114e167768d 100644 --- a/opencga-storage/opencga-storage-core/pom.xml +++ b/opencga-storage/opencga-storage-core/pom.xml @@ -133,6 +133,7 @@ ${storage.configuration.file} managed-schema + rga/managed-schema diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/exceptions/RgaException.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/exceptions/RgaException.java new file mode 100644 index 00000000000..be72d8306c2 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/exceptions/RgaException.java @@ -0,0 +1,13 @@ +package org.opencb.opencga.storage.core.exceptions; + +public class RgaException extends Exception { + + public RgaException(String message) { + super(message); + } + + public RgaException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java new file mode 100644 index 00000000000..d2d5ad613df --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java @@ -0,0 +1,84 @@ +package org.opencb.opencga.storage.core.rga; + +import com.fasterxml.jackson.core.JsonProcessingException; +import org.opencb.commons.datastore.core.ComplexTypeConverter; +import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +public class GeneRgaConverter implements ComplexTypeConverter, List> { + + private Logger logger; + + public GeneRgaConverter() { + this.logger = LoggerFactory.getLogger(GeneRgaConverter.class); + } + + @Override + public List convertToDataModelType(List rgaDataModelList) { + Map result = new HashMap<>(); + for (RgaDataModel rgaDataModel : rgaDataModelList) { + if (!result.containsKey(rgaDataModel.getGeneId())) { + KnockoutByGene knockoutByGene = new KnockoutByGene(); + knockoutByGene.setId(rgaDataModel.getGeneId()); + knockoutByGene.setName(rgaDataModel.getGeneName()); +// knockoutByGene.setChromosome(xxxxx); +// knockoutByGene.setStart(xxxx); +// knockoutByGene.setEnd(xxxx); +// knockoutByGene.setStrand(xxxx); +// knockoutByGene.setBiotype(xxxx); +// knockoutByGene.setAnnotation(xxxx); + + knockoutByGene.setIndividuals(new LinkedList<>()); + result.put(rgaDataModel.getGeneId(), knockoutByGene); + } + + KnockoutByGene knockoutByGene = result.get(rgaDataModel.getGeneId()); + KnockoutByGene.KnockoutIndividual knockoutIndividual = null; + for (KnockoutByGene.KnockoutIndividual individual : knockoutByGene.getIndividuals()) { + if (individual.getId().equals(rgaDataModel.getIndividualId())) { + knockoutIndividual = individual; + } + } + if (knockoutIndividual == null) { + knockoutIndividual = new KnockoutByGene.KnockoutIndividual(); + knockoutIndividual.setId(rgaDataModel.getIndividualId()); + knockoutIndividual.setSampleId(rgaDataModel.getSampleId()); + knockoutIndividual.setTranscripts(new LinkedList<>()); + + knockoutByGene.addIndividual(knockoutIndividual); + } + + // Add new transcript + KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId()); + knockoutTranscript.setBiotype(rgaDataModel.getBiotype()); + + knockoutIndividual.addTranscripts(Collections.singletonList(knockoutTranscript)); + + List knockoutVariantList = new LinkedList<>(); + for (String variantJson : rgaDataModel.getVariantJson()) { + try { + KnockoutVariant knockoutVariant = JacksonUtils.getDefaultObjectMapper().readValue(variantJson, + KnockoutVariant.class); + knockoutVariantList.add(knockoutVariant); + } catch (JsonProcessingException e) { + logger.warn("Could not parse KnockoutVariants: {}", e.getMessage(), e); + } + } + knockoutTranscript.setVariants(knockoutVariantList); + } + + return new ArrayList<>(result.values()); + } + + @Override + public List convertToStorageType(List object) { + return null; + } + +} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java new file mode 100644 index 00000000000..552e8033800 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -0,0 +1,495 @@ +package org.opencb.opencga.storage.core.rga; + +import com.fasterxml.jackson.core.JsonProcessingException; +import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.clinical.Disorder; +import org.opencb.biodata.models.clinical.Phenotype; +import org.opencb.biodata.models.pedigree.IndividualProperty; +import org.opencb.biodata.models.variant.avro.PopulationFrequency; +import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; +import org.opencb.commons.datastore.core.ComplexTypeConverter; +import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; +import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.stream.Collectors; + +public class IndividualRgaConverter implements ComplexTypeConverter, List> { + + private Logger logger; + + public IndividualRgaConverter() { + this.logger = LoggerFactory.getLogger(IndividualRgaConverter.class); + } + + @Override + public List convertToDataModelType(List rgaDataModelList) { + // In this list, we will store the keys of result in the order they have been processed so order is kept + List knockoutByIndividualOrder = new LinkedList<>(); + Map result = new HashMap<>(); + for (RgaDataModel rgaDataModel : rgaDataModelList) { + if (!result.containsKey(rgaDataModel.getIndividualId())) { + knockoutByIndividualOrder.add(rgaDataModel.getIndividualId()); + + KnockoutByIndividual knockoutByIndividual = new KnockoutByIndividual(); + knockoutByIndividual.setId(rgaDataModel.getIndividualId()); + knockoutByIndividual.setSampleId(rgaDataModel.getSampleId()); + knockoutByIndividual.setSex(IndividualProperty.Sex.valueOf(rgaDataModel.getSex())); + List phenotypes = new ArrayList<>(rgaDataModel.getPhenotypeJson().size()); + for (String phenotype : rgaDataModel.getPhenotypeJson()) { + try { + phenotypes.add(JacksonUtils.getDefaultObjectMapper().readValue(phenotype, Phenotype.class)); + } catch (JsonProcessingException e) { + logger.warn("Could not parse Phenotypes: {}", e.getMessage(), e); + } + } + knockoutByIndividual.setPhenotypes(phenotypes); + + List disorders = new ArrayList<>(rgaDataModel.getDisorderJson().size()); + for (String disorder : rgaDataModel.getDisorderJson()) { + try { + disorders.add(JacksonUtils.getDefaultObjectMapper().readValue(disorder, Disorder.class)); + } catch (JsonProcessingException e) { + logger.warn("Could not parse Disorders: {}", e.getMessage(), e); + } + } + knockoutByIndividual.setDisorders(disorders); + + List geneList = new LinkedList<>(); + KnockoutByIndividual.KnockoutGene knockoutGene = new KnockoutByIndividual.KnockoutGene(); + knockoutGene.setId(rgaDataModel.getGeneId()); + knockoutGene.setName(rgaDataModel.getGeneName()); + knockoutGene.setTranscripts(new LinkedList<>()); + geneList.add(knockoutGene); + + knockoutByIndividual.setGenes(geneList); + + result.put(rgaDataModel.getIndividualId(), knockoutByIndividual); + } + + KnockoutByIndividual knockoutByIndividual = result.get(rgaDataModel.getIndividualId()); + KnockoutByIndividual.KnockoutGene knockoutGene = null; + for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { + if (gene.getId().equals(rgaDataModel.getGeneId())) { + knockoutGene = gene; + } + } + if (knockoutGene == null) { + knockoutGene = new KnockoutByIndividual.KnockoutGene(); + knockoutGene.setId(rgaDataModel.getGeneId()); + knockoutGene.setName(rgaDataModel.getGeneName()); + knockoutGene.setTranscripts(new LinkedList<>()); + + knockoutByIndividual.addGene(knockoutGene); + } + + // Add new transcript + KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId()); + knockoutGene.addTranscripts(Collections.singletonList(knockoutTranscript)); + + knockoutTranscript.setBiotype(rgaDataModel.getBiotype()); + List knockoutVariantList = new LinkedList<>(); + for (String variantJson : rgaDataModel.getVariantJson()) { + try { + KnockoutVariant knockoutVariant = JacksonUtils.getDefaultObjectMapper().readValue(variantJson, + KnockoutVariant.class); + knockoutVariantList.add(knockoutVariant); + } catch (JsonProcessingException e) { + logger.warn("Could not parse KnockoutVariants: {}", e.getMessage(), e); + } + } + knockoutTranscript.setVariants(knockoutVariantList); + } + + List knockoutByIndividualList = new ArrayList<>(knockoutByIndividualOrder.size()); + for (String id : knockoutByIndividualOrder) { + knockoutByIndividualList.add(result.get(id)); + } + return knockoutByIndividualList; + } + + @Override + public List convertToStorageType(List knockoutByIndividualList) { + List result = new LinkedList<>(); + for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividualList) { + try { + result.addAll(convertToStorageType(knockoutByIndividual)); + } catch (RgaException | JsonProcessingException e) { + logger.warn("Could not parse KnockoutByIndividualList: {}", e.getMessage(), e); + } + } + return result; + } + + private List convertToStorageType(KnockoutByIndividual knockoutByIndividual) + throws RgaException, JsonProcessingException { + List result = new LinkedList<>(); + + if (knockoutByIndividual.getGenes() != null) { + for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { + for (KnockoutTranscript transcript : gene.getTranscripts()) { + List compoundFilters = processFilters(transcript); + List variantJson = new ArrayList<>(transcript.getVariants().size()); + for (KnockoutVariant variant : transcript.getVariants()) { + variantJson.add(JacksonUtils.getDefaultObjectMapper().writeValueAsString(variant)); + } + + List phenotypes = populatePhenotypes(knockoutByIndividual.getPhenotypes()); + List disorders = populateDisorders(knockoutByIndividual.getDisorders()); + List phenotypeJson = new ArrayList<>(knockoutByIndividual.getPhenotypes().size()); + for (Phenotype phenotype : knockoutByIndividual.getPhenotypes()) { + phenotypeJson.add(JacksonUtils.getDefaultObjectMapper().writeValueAsString(phenotype)); + } + List disorderJson = new ArrayList<>(knockoutByIndividual.getDisorders().size()); + for (Disorder disorder : knockoutByIndividual.getDisorders()) { + disorderJson.add(JacksonUtils.getDefaultObjectMapper().writeValueAsString(disorder)); + } + + List variantIds = transcript.getVariants().stream().map(KnockoutVariant::getId) + .collect(Collectors.toList()); + + List knockoutTypes = transcript.getVariants().stream() + .map(KnockoutVariant::getKnockoutType) + .map(Enum::name) + .distinct() + .collect(Collectors.toList()); + List consequenceTypes = transcript.getVariants().stream() + .flatMap(kv -> kv.getSequenceOntologyTerms().stream()) + .map(SequenceOntologyTerm::getAccession) + .distinct() + .collect(Collectors.toList()); + List filters = transcript.getVariants().stream() + .map(KnockoutVariant::getFilter) + .distinct().collect(Collectors.toList()); + Map> popFreqs = getPopulationFrequencies(transcript); + + String id = knockoutByIndividual.getId() + "_" + gene.getId() + "_" + transcript.getId(); + RgaDataModel model = new RgaDataModel(id, knockoutByIndividual.getSampleId(), knockoutByIndividual.getId(), + knockoutByIndividual.getSex().name(), phenotypes, disorders, gene.getId(), gene.getName(), transcript.getId(), + transcript.getBiotype(), variantIds, knockoutTypes, filters, consequenceTypes, popFreqs, compoundFilters, + phenotypeJson, disorderJson, variantJson); + result.add(model); + } + } + } + + return result; + } + + private Map> getPopulationFrequencies(KnockoutTranscript transcript) { + Map> popFreqs = new HashMap<>(); + + String thousandGenomeKey = "popFreqs" + RgaUtils.SEPARATOR + RgaUtils.THOUSAND_GENOMES_STUDY; + String gnomadGenomeKey = "popFreqs" + RgaUtils.SEPARATOR + RgaUtils.GNOMAD_GENOMES_STUDY; + + if (!transcript.getVariants().isEmpty()) { + popFreqs.put(thousandGenomeKey, new ArrayList<>(transcript.getVariants().size())); + popFreqs.put(gnomadGenomeKey, new ArrayList<>(transcript.getVariants().size())); + } + + for (KnockoutVariant variant : transcript.getVariants()) { + if (variant.getPopulationFrequencies() != null) { + boolean gnomad = false; + boolean thousandG = false; + for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { + if (populationFrequency.getPopulation().equals("ALL")) { + if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + popFreqs.get(thousandGenomeKey).add(populationFrequency.getAltAlleleFreq()); + thousandG = true; + } else if (RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + popFreqs.get(gnomadGenomeKey).add(populationFrequency.getAltAlleleFreq()); + gnomad = true; + } + } + } + if (!thousandG) { + popFreqs.get(thousandGenomeKey).add(0f); + } + if (!gnomad) { + popFreqs.get(gnomadGenomeKey).add(0f); + } + } + } + + return popFreqs; + } + + private List processFilters(KnockoutTranscript transcript) throws RgaException { + Set results = new HashSet<>(); + + List>> compoundHeterozygousVariantList = new LinkedList<>(); + for (KnockoutVariant variant : transcript.getVariants()) { + List> independentTerms = new LinkedList<>(); + + // KO - Knockout types + if (variant.getKnockoutType() != null) { + independentTerms.add(Collections.singletonList(RgaUtils.encode(variant.getKnockoutType().name()))); + } + // F - Filters + if (StringUtils.isNotEmpty(variant.getFilter())) { + independentTerms.add(Collections.singletonList(RgaUtils.encode(variant.getFilter()))); + } + // CT - Consequence types + if (variant.getSequenceOntologyTerms() != null) { + List ct = new ArrayList<>(variant.getSequenceOntologyTerms().size()); + for (SequenceOntologyTerm sequenceOntologyTerm : variant.getSequenceOntologyTerms()) { + ct.add(RgaUtils.encode(sequenceOntologyTerm.getName())); + } + independentTerms.add(ct); + } + // PF - Population frequencies + if (variant.getPopulationFrequencies() != null) { + List pf = new ArrayList<>(variant.getPopulationFrequencies().size()); + boolean gnomad = false; + boolean thousandG = false; + for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { + if (populationFrequency.getPopulation().equals("ALL")) { + if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + String populationFrequencyKey = RgaUtils.getPopulationFrequencyKey(populationFrequency.getAltAlleleFreq()); + pf.add(RgaUtils.encode(RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + + populationFrequencyKey)); + thousandG = true; + } else if (RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { + String populationFrequencyKey = RgaUtils.getPopulationFrequencyKey(populationFrequency.getAltAlleleFreq()); + pf.add(RgaUtils.encode(RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + + populationFrequencyKey)); + gnomad = true; + } + } + } + if (!thousandG) { + pf.add(RgaUtils.encode(RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0)); + } + if (!gnomad) { + pf.add(RgaUtils.encode(RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0)); + } + independentTerms.add(pf); + } + + if (variant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { + compoundHeterozygousVariantList.add(independentTerms); + } + + results.addAll(generateCombinations(independentTerms)); + } + + if (!compoundHeterozygousVariantList.isEmpty()) { + results.addAll(generateCompoundHeterozygousCombinations(compoundHeterozygousVariantList)); + } + + return new ArrayList<>(results); + } + + private Set generateCompoundHeterozygousCombinations(List>> compoundHeterozygousVariantList) + throws RgaException { + if (compoundHeterozygousVariantList.size() < 2) { + return Collections.emptySet(); + } + Set result = new HashSet<>(); + for (int i = 0; i < compoundHeterozygousVariantList.size() - 1; i++) { + for (int j = i + 1; j < compoundHeterozygousVariantList.size(); j++) { + result.addAll(generateCompoundHeterozygousPairCombination(compoundHeterozygousVariantList.get(i), + compoundHeterozygousVariantList.get(j))); + } + } + return result; + } + + private Set generateCompoundHeterozygousPairCombination(List> variant1, List> variant2) + throws RgaException { + List> result = new LinkedList<>(); + /* Compound heterozygous combinations: + * KO - F1 - F2 + * KO - F1 - F2 - CT1 - CT2 + * KO - F1 - F2 - CT1 - CT2 - PF1 - PF2 + * KO - F1 - F2 - PF' ; where PF' is equivalent to the highest PF of both variants (to easily respond to PF<=x) + */ + String knockout = RgaUtils.encode(KnockoutVariant.KnockoutType.COMP_HET.name()); + result.add(Collections.singletonList(knockout)); + + // Generate combinations: KO - F1 - F2; KO - F1 - F2 - CT1 - CT2; KO - F1 - F2 - CT1 - CT2 - PF1 - PF2 + List> previousIteration = result; + for (int i = 1; i < 4; i++) { + // The list will contain all Filter, CT or PF combinations between variant1 and variant2 in a sorted manner to reduce the + // number of terms + List> sortedCombinations = generateSortedCombinations(variant1.get(i), variant2.get(i)); + + List> newResults = new ArrayList<>(previousIteration.size() * sortedCombinations.size()); + for (List previousValues : previousIteration) { + for (List values : sortedCombinations) { + List newValues = new ArrayList<>(previousValues); + newValues.addAll(values); + newResults.add(newValues); + } + } + if (i == 1) { + // Remove single Knockout string list because there is already a filter just for that field + result.clear(); + } + result.addAll(newResults); + previousIteration = newResults; + } + + // Generate also combination: KO - F1 - F2 - PF' ; where PF' is equivalent to the highest PF of both variants + List> sortedFilterList = generateSortedCombinations(variant1.get(1), variant2.get(1)); + List simplifiedPopFreqList = generateSimplifiedPopulationFrequencyList(variant1.get(3), variant2.get(3)); + for (List filterList : sortedFilterList) { + for (String popFreq : simplifiedPopFreqList) { + List terms = new LinkedList<>(); + terms.add(knockout); + terms.addAll(filterList); + terms.add(popFreq); + result.add(terms); + } + } + + Set combinations = new HashSet<>(); + for (List strings : result) { + combinations.add(StringUtils.join(strings, RgaUtils.SEPARATOR)); + } + + return combinations; + } + + /** + * Given two lists containing frequencies for the same populations, it will return a unified frequency for each population containing + * the least restrictive value. Example: [P1-12, P2-6] - [P1-15, P2-2] will generate [P1-15, P2-6] + * + * @param list1 List containing the population frequencies of variant1. + * @param list2 List containing the population frequencies of variant2. + * @return A list containing the least restrictive population frequencies. + * @throws RgaException If there is an issue with the provided lists. + */ + private List generateSimplifiedPopulationFrequencyList(List list1, List list2) throws RgaException { + if (list1.size() != list2.size()) { + throw new RgaException("Both lists should be the same size and contain the same population frequency values"); + } + + Map map1 = new HashMap<>(); + Map map2 = new HashMap<>(); + + for (String terms : list1) { + String[] split = terms.split("-"); + map1.put(split[0], Integer.parseInt(split[1])); + } + for (String terms : list2) { + String[] split = terms.split("-"); + map2.put(split[0], Integer.parseInt(split[1])); + } + + List terms = new ArrayList<>(list1.size()); + for (String popFreqKey : map1.keySet()) { + if (map1.get(popFreqKey) > map2.get(popFreqKey)) { + terms.add(popFreqKey + "-" + map1.get(popFreqKey)); + } else { + terms.add(popFreqKey + "-" + map2.get(popFreqKey)); + } + } + + return terms; + } + + /** + * Given two lists it will return a list containing all possible combinations, but sorted. For instance: + * [A, D, F] - [B, G] will return [[A, B], [A, G], [B, D], [D, G], [B, F], [F, G]] + * + * @param list1 List 1. + * @param list2 List 2. + * @return A list containing list1-list2 sorted pairwise combinations. + */ + public static List> generateSortedCombinations(List list1, List list2) { + List> results = new ArrayList<>(list1.size() * list2.size()); + for (String v1Term : list1) { + for (String v2Term : list2) { + if (StringUtils.compare(v1Term, v2Term) <= 0) { + results.add(Arrays.asList(v1Term, v2Term)); + } else { + results.add(Arrays.asList(v2Term, v1Term)); + } + } + } + + return results; + } + + /** + * Given a list of [[KO], [FILTER1, FILTER2], [CTs], [PFs]], it will return all possible String combinations merging those values. + * [KO - FILTER1, KO - FILTER2] + * [KO - FILTER1 - CT', KO - FILTER2 - CT'] + * [KO - FILTER1 - CT' - PF', KO - FILTER2 - CT' - PF'] + * [KO - FILTER1 - PF', KO - FILTER2 - PF'] + * @param values List of size 4 containing values for the 4 filters. + * @return a list containing all possible merge combinations to store in the DB. + */ + private List generateCombinations(List> values) { + if (values.isEmpty()) { + return Collections.emptyList(); + } + List> result = new LinkedList<>(); + for (String value : values.get(0)) { + result.add(Collections.singletonList(value)); + } + + // Generate combinations: KO - F; KO - F - CT; KO -F - CT - PF + List> previousIteration = result; + for (int i = 1; i < values.size(); i++) { + List> newResults = new ArrayList<>(previousIteration.size() * values.get(i).size()); + for (List previousValues : previousIteration) { + for (String currentValue : values.get(i)) { + List newValues = new ArrayList<>(previousValues); + newValues.add(currentValue); + newResults.add(newValues); + } + } + if (i == 1) { + // Remove single Knockout string list because there is already a filter just for that field + result.clear(); + } + result.addAll(newResults); + previousIteration = newResults; + } + + // Generate also combination: KO - F - PF (no consequence type this time) + for (String ko : values.get(0)) { + for (String filter : values.get(1)) { + for (String popFreq : values.get(3)) { + result.add(Arrays.asList(ko, filter, popFreq)); + } + } + } + + List combinations = new ArrayList<>(result.size()); + for (List strings : result) { + combinations.add(StringUtils.join(strings, RgaUtils.SEPARATOR)); + } + + return combinations; + } + + private List populatePhenotypes(List phenotypes) { + Set phenotypesIds = new HashSet<>(); + if (phenotypes != null) { + for (Phenotype phenotype : phenotypes) { + phenotypesIds.add(phenotype.getId()); + phenotypesIds.add(phenotype.getName()); + } + } + return new ArrayList(phenotypesIds); + } + + private List populateDisorders(List disorders) { + Set disorderIds = new HashSet<>(); + if (disorders != null) { + for (Disorder disorder : disorders) { + disorderIds.add(disorder.getId()); + disorderIds.add(disorder.getName()); + } + } + return new ArrayList(disorderIds); + } +} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java new file mode 100644 index 00000000000..52373749df5 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java @@ -0,0 +1,288 @@ +package org.opencb.opencga.storage.core.rga; + +import org.apache.solr.client.solrj.beans.Field; + +import java.util.List; +import java.util.Map; + +public class RgaDataModel { + + @Field + private String id; + + @Field("indId") + private String individualId; + + @Field + private String sampleId; + + @Field + private String sex; + + @Field("pheno") + private List phenotypes; + + @Field("disor") + private List disorders; + + @Field + private String geneId; + + @Field + private String geneName; + + @Field("transcId") + private String transcriptId; + + @Field + private String biotype; + + @Field + private List variants; + + @Field("koTypes") + private List knockoutTypes; + + @Field + private List filters; + + @Field("ct") + private List consequenceTypes; + + @Field("popFreqs_*") + private Map> populationFrequencies; + + @Field("cFilters") + private List compoundFilters; + + @Field("pheJson") + private List phenotypeJson; + + @Field("disJson") + private List disorderJson; + + @Field("varJson") + private List variantJson; + + public RgaDataModel() { + } + + public RgaDataModel(String id, String sampleId, String individualId, String sex, List phenotypes, List disorders, + String geneId, String geneName, String transcriptId, String biotype, List variants, + List knockoutTypes, List filters, List consequenceTypes, + Map> populationFrequencies, List compoundFilters, List phenotypeJson, + List disorderJson, List variantJson) { + this.id = id; + this.sampleId = sampleId; + this.individualId = individualId; + this.sex = sex; + this.phenotypes = phenotypes; + this.disorders = disorders; + this.geneId = geneId; + this.geneName = geneName; + this.transcriptId = transcriptId; + this.biotype = biotype; + this.variants = variants; + this.knockoutTypes = knockoutTypes; + this.filters = filters; + this.consequenceTypes = consequenceTypes; + this.populationFrequencies = populationFrequencies; + this.compoundFilters = compoundFilters; + this.phenotypeJson = phenotypeJson; + this.disorderJson = disorderJson; + this.variantJson = variantJson; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("RgaDataModel{"); + sb.append("id='").append(id).append('\''); + sb.append(", individualId='").append(individualId).append('\''); + sb.append(", sampleId='").append(sampleId).append('\''); + sb.append(", sex='").append(sex).append('\''); + sb.append(", phenotypes=").append(phenotypes); + sb.append(", disorders=").append(disorders); + sb.append(", geneId='").append(geneId).append('\''); + sb.append(", geneName='").append(geneName).append('\''); + sb.append(", transcriptId='").append(transcriptId).append('\''); + sb.append(", biotype='").append(biotype).append('\''); + sb.append(", variants=").append(variants); + sb.append(", knockoutTypes=").append(knockoutTypes); + sb.append(", filters=").append(filters); + sb.append(", consequenceTypes=").append(consequenceTypes); + sb.append(", populationFrequencies=").append(populationFrequencies); + sb.append('}'); + return sb.toString(); + } + + public String getId() { + return id; + } + + public RgaDataModel setId(String id) { + this.id = id; + return this; + } + + public String getSampleId() { + return sampleId; + } + + public RgaDataModel setSampleId(String sampleId) { + this.sampleId = sampleId; + return this; + } + + public String getIndividualId() { + return individualId; + } + + public RgaDataModel setIndividualId(String individualId) { + this.individualId = individualId; + return this; + } + + public String getSex() { + return sex; + } + + public RgaDataModel setSex(String sex) { + this.sex = sex; + return this; + } + + public List getPhenotypes() { + return phenotypes; + } + + public RgaDataModel setPhenotypes(List phenotypes) { + this.phenotypes = phenotypes; + return this; + } + + public List getDisorders() { + return disorders; + } + + public RgaDataModel setDisorders(List disorders) { + this.disorders = disorders; + return this; + } + + public String getGeneId() { + return geneId; + } + + public RgaDataModel setGeneId(String geneId) { + this.geneId = geneId; + return this; + } + + public String getGeneName() { + return geneName; + } + + public RgaDataModel setGeneName(String geneName) { + this.geneName = geneName; + return this; + } + + public String getTranscriptId() { + return transcriptId; + } + + public RgaDataModel setTranscriptId(String transcriptId) { + this.transcriptId = transcriptId; + return this; + } + + public String getBiotype() { + return biotype; + } + + public RgaDataModel setBiotype(String biotype) { + this.biotype = biotype; + return this; + } + + public List getVariants() { + return variants; + } + + public RgaDataModel setVariants(List variants) { + this.variants = variants; + return this; + } + + public List getKnockoutTypes() { + return knockoutTypes; + } + + public RgaDataModel setKnockoutTypes(List knockoutTypes) { + this.knockoutTypes = knockoutTypes; + return this; + } + + public List getFilters() { + return filters; + } + + public RgaDataModel setFilters(List filters) { + this.filters = filters; + return this; + } + + public List getConsequenceTypes() { + return consequenceTypes; + } + + public RgaDataModel setConsequenceTypes(List consequenceTypes) { + this.consequenceTypes = consequenceTypes; + return this; + } + + public Map> getPopulationFrequencies() { + return populationFrequencies; + } + + public RgaDataModel setPopulationFrequencies(Map> populationFrequencies) { + this.populationFrequencies = populationFrequencies; + return this; + } + + public List getCompoundFilters() { + return compoundFilters; + } + + public RgaDataModel setCompoundFilters(List compoundFilters) { + this.compoundFilters = compoundFilters; + return this; + } + + public List getPhenotypeJson() { + return phenotypeJson; + } + + public RgaDataModel setPhenotypeJson(List phenotypeJson) { + this.phenotypeJson = phenotypeJson; + return this; + } + + public List getDisorderJson() { + return disorderJson; + } + + public RgaDataModel setDisorderJson(List disorderJson) { + this.disorderJson = disorderJson; + return this; + } + + public List getVariantJson() { + return variantJson; + } + + public RgaDataModel setVariantJson(List variantJson) { + this.variantJson = variantJson; + return this; + } +} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java new file mode 100644 index 00000000000..d829b53d6cf --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -0,0 +1,446 @@ +package org.opencb.opencga.storage.core.rga; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import org.apache.commons.lang.StringUtils; +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.response.UpdateResponse; +import org.apache.solr.common.SolrException; +import org.opencb.commons.datastore.core.DataResult; +import org.opencb.commons.datastore.core.FacetField; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.datastore.solr.FacetQueryParser; +import org.opencb.commons.datastore.solr.SolrCollection; +import org.opencb.commons.datastore.solr.SolrManager; +import org.opencb.commons.utils.CollectionUtils; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.storage.core.exceptions.VariantSearchException; +import org.opencb.opencga.storage.core.variant.search.solr.SolrNativeIterator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.Closeable; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +public class RgaEngine implements Closeable { + + private SolrManager solrManager; + private RgaQueryParser queryParser; + private IndividualRgaConverter individualRgaConverter; + private GeneRgaConverter geneConverter; + private StorageConfiguration storageConfiguration; + private int insertBatchSize; + + private Logger logger; + + public static final String USE_SEARCH_INDEX = "useSearchIndex"; + public static final int DEFAULT_INSERT_BATCH_SIZE = 10000; + + public RgaEngine(StorageConfiguration storageConfiguration) { + this.individualRgaConverter = new IndividualRgaConverter(); + this.geneConverter = new GeneRgaConverter(); + this.queryParser = new RgaQueryParser(); + this.storageConfiguration = storageConfiguration; + + this.solrManager = new SolrManager(storageConfiguration.getSearch().getHosts(), storageConfiguration.getSearch().getMode(), + storageConfiguration.getSearch().getTimeout()); + + // Set internal insert batch size from configuration and default value + insertBatchSize = storageConfiguration.getSearch().getInsertBatchSize() > 0 + ? storageConfiguration.getSearch().getInsertBatchSize() + : DEFAULT_INSERT_BATCH_SIZE; + + logger = LoggerFactory.getLogger(RgaEngine.class); + } + + public boolean isAlive(String collection) { + return solrManager.isAlive(collection); + } + + public void create(String dbName) throws VariantSearchException { + try { + solrManager.create(dbName, this.storageConfiguration.getSearch().getConfigSet()); + } catch (SolrException e) { + throw new VariantSearchException("Error creating Solr collection '" + dbName + "'", e); + } + } + + public void create(String dbName, String configSet) throws VariantSearchException { + try { + solrManager.create(dbName, configSet); + } catch (SolrException e) { + throw new VariantSearchException("Error creating Solr collection '" + dbName + "'", e); + } + } + + + public boolean exists(String dbName) throws VariantSearchException { + try { + return solrManager.exists(dbName); + } catch (SolrException e) { + throw new VariantSearchException("Error asking if Solr collection '" + dbName + "' exists", e); + } + } + + public boolean existsCore(String coreName) throws VariantSearchException { + try { + return solrManager.existsCore(coreName); + } catch (SolrException e) { + throw new VariantSearchException("Error asking if Solr core '" + coreName + "' exists", e); + } + } + + public boolean existsCollection(String collectionName) throws VariantSearchException { + try { + return solrManager.existsCollection(collectionName); + } catch (SolrException e) { + throw new VariantSearchException("Error asking if Solr collection '" + collectionName + "' exists", e); + } + } + + /** + * Insert a list of RGA models into the given Solr collection. + * + * @param collection Solr collection where to insert + * @param knockoutByIndividualList List of knockoutByIndividual to insert + * @throws IOException IOException + * @throws SolrServerException SolrServerException + */ + public void insert(String collection, List knockoutByIndividualList) throws IOException, SolrServerException { + if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { + List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); + + if (!rgaDataModelList.isEmpty()) { + UpdateResponse updateResponse; + updateResponse = solrManager.getSolrClient().addBeans(collection, rgaDataModelList); + if (updateResponse.getStatus() == 0) { + solrManager.getSolrClient().commit(collection); + } + } + } + } + + /** + * Load a Solr core/collection from a Avro or JSON file. + * + * @param collection Collection name + * @param path Path to the file to load + * @throws IOException IOException + * @throws RgaException RgaException + */ + public void load(String collection, Path path) throws IOException, RgaException { + String fileName = path.getFileName().toString(); + if (fileName.endsWith("json") || fileName.endsWith("json.gz")) { + try { + loadJson(collection, path); + } catch (SolrServerException e) { + throw new RgaException("Error loading KnockoutIndividual from JSON file.", e); + } + } else { + throw new RgaException("File format " + path + " not supported. Please, use JSON file format."); + } + } + + + /** + * Return the list of KnockoutByIndividual objects from a Solr core/collection given a query. + * + * @param collection Collection name + * @param query Query + * @param queryOptions Query options + * @return List of KnockoutByIndividual objects + * @throws RgaException RgaException + * @throws IOException IOException + */ + public OpenCGAResult individualQuery(String collection, Query query, QueryOptions queryOptions) + throws RgaException, IOException { + SolrQuery solrQuery = queryParser.parse(query, queryOptions); + SolrCollection solrCollection = solrManager.getCollection(collection); + DataResult queryResult; + try { + DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); + List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(result.getResults()); + queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByIndividuals.size(), knockoutByIndividuals, + result.getNumMatches()); + } catch (SolrServerException e) { + throw new RgaException("Error executing KnockoutByIndividual query", e); + } + + return new OpenCGAResult<>(queryResult); + } + + /** + * Return the list of KnockoutByGene objects from a Solr core/collection given a query. + * + * @param collection Collection name + * @param query Query + * @param queryOptions Query options + * @return List of KnockoutByGene objects + * @throws RgaException RgaException + * @throws IOException IOException + */ + public OpenCGAResult geneQuery(String collection, Query query, QueryOptions queryOptions) + throws RgaException, IOException { + SolrQuery solrQuery = queryParser.parse(query, queryOptions); + SolrCollection solrCollection = solrManager.getCollection(collection); + DataResult queryResult; + try { + DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); + List knockoutByGeneList = geneConverter.convertToDataModelType(result.getResults()); + queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByGeneList.size(), knockoutByGeneList, + result.getNumMatches()); + } catch (SolrServerException e) { + throw new RgaException("Error executing KnockoutByGene query", e); + } + + return new OpenCGAResult<>(queryResult); + } + + /** + * Return the list of RgaDataModel objects from a Solr core/collection given a query. + * + * @param collection Collection name + * @param query Query + * @param queryOptions Query options + * @return List of RgaDataModel objects + * @throws RgaException RgaException + * @throws IOException IOException + */ + public OpenCGAResult nativeQuery(String collection, Query query, QueryOptions queryOptions) + throws RgaException, IOException { + SolrQuery solrQuery = queryParser.parse(query, queryOptions); + SolrCollection solrCollection = solrManager.getCollection(collection); + DataResult queryResult; + try { + queryResult = solrCollection.query(solrQuery, RgaDataModel.class); + } catch (SolrServerException e) { + throw new RgaException("Error executing KnockoutByIndividual query (nativeQuery)", e); + } + + return new OpenCGAResult<>(queryResult); + } + +// /** +// * Return a Solr variant iterator to retrieve KnockoutByIndividual objects from a Solr core/collection given a query. +// * +// * @param collection Collection name +// * @param query Query +// * @param queryOptions Query options +// * @return Solr VariantSearch iterator +// * @throws VariantSearchException VariantSearchException +// * @throws IOException IOException +// */ +// public SolrVariantDBIterator iterator(String collection, Query query, QueryOptions queryOptions) +// throws VariantSearchException, IOException { +// try { +// SolrQuery solrQuery = solrQueryParser.parse(query, queryOptions); +// return new SolrVariantDBIterator(solrManager.getSolrClient(), collection, solrQuery, +// new VariantSearchToVariantConverter(VariantField.getIncludeFields(queryOptions))); +// } catch (SolrServerException e) { +// throw new VariantSearchException("Error getting variant iterator", e); +// } +// } + + /** + * Return a Solr KnockoutByIndividual iterator to retrieve RgaDataModel objects from a Solr core/collection given a query. + * + * @param collection Collection name + * @param query Query + * @param queryOptions Query options + * @return Solr SolrNativeIterator iterator + * @throws RgaException RgaException + */ + public SolrNativeIterator nativeIterator(String collection, Query query, QueryOptions queryOptions) + throws RgaException { + try { + SolrQuery solrQuery = queryParser.parse(query, queryOptions); + return new SolrNativeIterator(solrManager.getSolrClient(), collection, solrQuery); + } catch (SolrServerException e) { + throw new RgaException("Error getting KnockoutByIndividual iterator (native)", e); + } + } + + /** + * + * @param collection Collection name + * @param query Query + * @return Number of results + * @throws RgaException RgaException + * @throws IOException IOException + */ + public long count(String collection, Query query) throws RgaException, IOException { + SolrQuery solrQuery = queryParser.parse(query, QueryOptions.empty()); + SolrCollection solrCollection = solrManager.getCollection(collection); + + try { + return solrCollection.count(solrQuery).getResults().get(0); + } catch (SolrServerException e) { + throw new RgaException("Error executing count for a given query", e); + } + } + + /** + * Return faceted data from a Solr core/collection given a query. + * + * @param collection Collection name + * @param query Query + * @param queryOptions Query options (contains the facet and facetRange options) + * @return List of KnockoutByIndividual objects + * @throws RgaException RgaException + * @throws IOException IOException + */ + public DataResult facetedQuery(String collection, Query query, QueryOptions queryOptions) + throws RgaException, IOException { + // Pre-processing + // - As "genes" contains, for each gene: gene names, Ensembl gene ID and all its Ensembl transcript IDs, + // we do not have to repeat counts for all of them, by default, only for gene names + // - consequenceType is replaced by soAcc (i.e., by the field name in the Solr schema) + boolean replaceSoAcc = false; + boolean replaceGenes = false; + Map> includingValuesMap = new HashMap<>(); + if (queryOptions.containsKey(QueryOptions.FACET) && StringUtils.isNotEmpty(queryOptions.getString(QueryOptions.FACET))) { + String facetQuery = queryOptions.getString(QueryOptions.FACET); + +// // Gene management +// if (facetQuery.contains("genes[") +// && (facetQuery.contains("genes;") || facetQuery.contains("genes>>") || facetQuery.endsWith("genes"))) { +// throw new VariantSearchException("Invalid gene facet query: " + facetQuery); +// } + + try { + includingValuesMap = new FacetQueryParser().getIncludingValuesMap(facetQuery); + } catch (Exception e) { + throw new RgaException("Error parsing faceted query", e); + } + +// if (!facetQuery.contains("genes[") && facetQuery.contains("genes")) { +// // Force to query genes by prefix ENSG +// queryOptions.put(QueryOptions.FACET, facetQuery.replace("genes", "genes[ENSG0*]")); +// replaceGenes = true; +// } + + // Consequence type management +// facetQuery = queryOptions.getString(QueryOptions.FACET); +// if (facetQuery.contains("consequenceType")) { +// replaceSoAcc = true; +// +// facetQuery = facetQuery.replace("consequenceType", "soAcc"); +// queryOptions.put(QueryOptions.FACET, facetQuery); +// +// String[] split = facetQuery.split("soAcc\\["); +// if (split.length > 1 || facetQuery.startsWith("soAcc[")) { +// int start = 0; +// StringBuilder newFacetQuery = new StringBuilder(); +// if (!facetQuery.startsWith("soAcc[")) { +// newFacetQuery.append(split[0]); +// start = 1; +// } +// for (int i = start; i < split.length; i++) { +// newFacetQuery.append("soAcc"); +// +// // Manage values to include +// int index = split[i].indexOf("]"); +// String strValues = split[i].substring(0, index); +// String[] arrValues = strValues.split(","); +// List soAccs = new ArrayList<>(); +// for (String value: arrValues) { +// String val = value.replace("SO:", ""); +// try { +// // Try to get SO accession, and if it is a valid SO accession +// int soAcc = Integer.parseInt(val); +// if (ConsequenceTypeMappings.accessionToTerm.containsKey(soAcc)) { +// soAccs.add(String.valueOf(soAcc)); +// } +// } catch (NumberFormatException e) { +// // Otherwise, it is treated as a SO term, and check if it is a valid SO term +// if (ConsequenceTypeMappings.termToAccession.containsKey(val)) { +// soAccs.add(String.valueOf(ConsequenceTypeMappings.termToAccession.get(val))); +// } +// } +// } +// if (ListUtils.isNotEmpty(soAccs)) { +// newFacetQuery.append("[").append(StringUtils.join(soAccs, ",")).append("]"); +// } +// } +// queryOptions.put(QueryOptions.FACET, newFacetQuery.toString()); +// } +// } +// } + } + + // Query + SolrQuery solrQuery = queryParser.parse(query, queryOptions); + SolrCollection solrCollection = solrManager.getCollection(collection); + + DataResult facetResult; + try { + facetResult = solrCollection.facet(solrQuery, null); + } catch (SolrServerException e) { + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e.getMessage(), e); + } + + return facetResult; + } + + + @Override + public void close() throws IOException { + solrManager.close(); + } + + /*------------------------------------- + * P R I V A T E M E T H O D S + -------------------------------------*/ + + /** + * Load a JSON file into the Solr core/collection. + * + * @param path Path to the JSON file + * @throws IOException + * @throws SolrException + */ + private void loadJson(String collection, Path path) throws IOException, SolrServerException { + // This opens json and json.gz files automatically + try (BufferedReader bufferedReader = Files.newBufferedReader(path)) { + List knockoutByIndividualList = new ArrayList<>(insertBatchSize); + int count = 0; + String line; + ObjectReader objectReader = new ObjectMapper().readerFor(KnockoutByIndividual.class); + while ((line = bufferedReader.readLine()) != null) { + KnockoutByIndividual knockoutByIndividual = objectReader.readValue(line); + knockoutByIndividualList.add(knockoutByIndividual); + count++; + if (count % insertBatchSize == 0) { + logger.debug("Loading knockoutByIndividual from '{}', {} entries loaded", path, count); + insert(collection, knockoutByIndividualList); + knockoutByIndividualList.clear(); + } + } + + // Insert the remaining entries + if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { + logger.debug("Loading remaining knockoutByIndividual from '{}', {} entries loaded", path, count); + insert(collection, knockoutByIndividualList); + } + } + } + + public SolrManager getSolrManager() { + return solrManager; + } + + public RgaEngine setSolrManager(SolrManager solrManager) { + this.solrManager = solrManager; + return this; + } +} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java new file mode 100644 index 00000000000..f4a28383491 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java @@ -0,0 +1,87 @@ +package org.opencb.opencga.storage.core.rga; + +import org.opencb.commons.datastore.core.QueryParam; + +import java.util.HashMap; +import java.util.Map; + +public class RgaQueryParams implements QueryParam { + + private final String key; + private final Type type; + private final String description; + + private static final Map VALUES_MAP = new HashMap<>(); + + public static final String SAMPLE_ID_DESCR = "Filter by sample id."; + public static final RgaQueryParams SAMPLE_ID = new RgaQueryParams("sampleId", Type.TEXT, SAMPLE_ID_DESCR); + + public static final String INDIVIDUAL_ID_DESCR = "Filter by individual id."; + public static final RgaQueryParams INDIVIDUAL_ID = new RgaQueryParams("individualId", Type.TEXT, INDIVIDUAL_ID_DESCR); + + public static final String SEX_DESCR = "Filter by sex."; + public static final RgaQueryParams SEX = new RgaQueryParams("sex", Type.TEXT, SEX_DESCR); + + public static final String PHENOTYPES_DESCR = "Filter by phenotypes."; + public static final RgaQueryParams PHENOTYPES = new RgaQueryParams("phenotypes", Type.TEXT_ARRAY, PHENOTYPES_DESCR); + + public static final String DISORDERS_DESCR = "Filter by disorders."; + public static final RgaQueryParams DISORDERS = new RgaQueryParams("disorders", Type.TEXT_ARRAY, DISORDERS_DESCR); + + public static final String GENE_ID_DESCR = "Filter by gene id."; + public static final RgaQueryParams GENE_ID = new RgaQueryParams("geneId", Type.TEXT, GENE_ID_DESCR); + + public static final String GENE_NAME_DESCR = "Filter by gene name."; + public static final RgaQueryParams GENE_NAME = new RgaQueryParams("geneName", Type.TEXT, GENE_NAME_DESCR); + + public static final String TRANSCRIPT_ID_DESCR = "Filter by transcript id."; + public static final RgaQueryParams TRANSCRIPT_ID = new RgaQueryParams("transcriptId", Type.TEXT, TRANSCRIPT_ID_DESCR); + + public static final String BIOTYPE_DESCR = "Filter by biotype."; + public static final RgaQueryParams BIOTYPE = new RgaQueryParams("biotype", Type.TEXT, BIOTYPE_DESCR); + + public static final String VARIANTS_DESCR = "Filter by variant id."; + public static final RgaQueryParams VARIANTS = new RgaQueryParams("variants", Type.TEXT_ARRAY, VARIANTS_DESCR); + + public static final String KNOCKOUT_DESCR = "Filter by knockout type."; + public static final RgaQueryParams KNOCKOUT = new RgaQueryParams("knockout", Type.TEXT, KNOCKOUT_DESCR); + + public static final String FILTER_DESCR = "Filter by filter (PASS, NOT_PASS)."; + public static final RgaQueryParams FILTER = new RgaQueryParams("filter", Type.TEXT, FILTER_DESCR); + + public static final String POPULATION_FREQUENCY_DESCR = "Filter by population frequency."; + public static final RgaQueryParams POPULATION_FREQUENCY = new RgaQueryParams("populationFrequency", Type.TEXT, + POPULATION_FREQUENCY_DESCR); + + public static final String CONSEQUENCE_TYPE_DESCR = "Filter by consequence type."; + public static final RgaQueryParams CONSEQUENCE_TYPE = new RgaQueryParams("consequenceType", Type.TEXT, CONSEQUENCE_TYPE_DESCR); + + public RgaQueryParams(String key, Type type, String description) { + this.key = key; + this.type = type; + this.description = description; + + if (VALUES_MAP.put(key, this) != null) { + throw new IllegalStateException("Found two RgaQueryParams with same key '" + key + "'."); + } + } + + @Override + public String key() { + return key; + } + + @Override + public String description() { + return description; + } + + @Override + public Type type() { + return type; + } + + public static RgaQueryParams valueOf(String param) { + return VALUES_MAP.get(param); + } +} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java new file mode 100644 index 00000000000..4b47f8fc547 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java @@ -0,0 +1,318 @@ +package org.opencb.opencga.storage.core.rga; + +import org.apache.commons.lang3.StringUtils; +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.common.SolrException; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.datastore.solr.FacetQueryParser; +import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.regex.Pattern; + +import static org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant.KnockoutType.*; +import static org.opencb.opencga.storage.core.rga.RgaQueryParams.*; +import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.printQuery; + +public class RgaQueryParser { + + private static final Pattern FACET_RANGE_PATTERN = Pattern.compile("([_a-zA-Z]+)\\[([_a-zA-Z]+):([.a-zA-Z0-9]+)\\]:([.0-9]+)$"); + public static final String SEPARATOR = "__"; + + protected static Logger logger = LoggerFactory.getLogger(RgaQueryParser.class); + + /** + * Create a SolrQuery object from Query and QueryOptions. + * + * @param query Query + * @param queryOptions Query Options + * @return SolrQuery + * @throws RgaException RgaException. + */ + public SolrQuery parse(Query query, QueryOptions queryOptions) throws RgaException { + SolrQuery solrQuery = new SolrQuery(); + + List filterList = new ArrayList<>(); + + //------------------------------------- + // QueryOptions processing + //------------------------------------- + + // Facet management, (including facet ranges, nested facets and aggregation functions) + if (queryOptions.containsKey(QueryOptions.FACET) && StringUtils.isNotEmpty(queryOptions.getString(QueryOptions.FACET))) { + try { + FacetQueryParser facetQueryParser = new FacetQueryParser(); + + String facetQuery = parseFacet(queryOptions.getString(QueryOptions.FACET)); + String jsonFacet = facetQueryParser.parse(facetQuery); + + solrQuery.set("json.facet", jsonFacet); + solrQuery.setRows(0); + solrQuery.setStart(0); + solrQuery.setFields(); + + logger.debug(">>>>>> Solr Facet: " + solrQuery.toString()); + } catch (Exception e) { + throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Solr parse exception: " + e.getMessage(), e); + } + } else { + // If the query is not a facet we must set the proper include, limit, skip and sort + // Get the correct includes +// String[] includes; +// if (queryOptions.containsKey(QueryOptions.INCLUDE)) { +// includes = solrIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE)); +// } else { +// if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { +// includes = getSolrIncludeFromExclude(queryOptions.getAsStringList(QueryOptions.EXCLUDE)); +// } else { +// // We want all possible fields +// includes = getSolrIncludeFromExclude(Collections.emptyList()); +// } +// } +// includes = ArrayUtils.removeAllOccurences(includes, "release"); +// includes = includeFieldsWithMandatory(includes); +// solrQuery.setFields(includes); +// +// // Add Solr fields from the variant includes, i.e.: includeSample, includeFormat,... +// List solrFieldsToInclude = getSolrFieldsFromVariantIncludes(query, queryOptions); +// for (String solrField : solrFieldsToInclude) { +// solrQuery.addField(solrField); +// } + + if (queryOptions.containsKey(QueryOptions.INCLUDE)) { + for (String include : queryOptions.getAsStringList(QueryOptions.INCLUDE)) { + solrQuery.addField(include); + } + } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { +// includes = getSolrIncludeFromExclude(queryOptions.getAsStringList(QueryOptions.EXCLUDE)); + } + + if (queryOptions.containsKey(QueryOptions.LIMIT)) { + solrQuery.setRows(queryOptions.getInt(QueryOptions.LIMIT)); + } + + if (queryOptions.containsKey(QueryOptions.SKIP)) { + solrQuery.setStart(queryOptions.getInt(QueryOptions.SKIP)); + } + +// if (queryOptions.containsKey(QueryOptions.SORT)) { +// solrQuery.addSort(queryOptions.getString(QueryOptions.SORT), getSortOrder(queryOptions)); +// } + } + + //------------------------------------- + // Query processing + //------------------------------------- + + parseStringValue(query, SAMPLE_ID, SAMPLE_ID.key(), filterList); + parseStringValue(query, INDIVIDUAL_ID, "indId", filterList); + parseStringValue(query, SEX, SEX.key(), filterList); + parseStringValue(query, PHENOTYPES, "pheno", filterList); + parseStringValue(query, DISORDERS, "disor", filterList); + parseStringValue(query, GENE_ID, GENE_ID.key(), filterList); + parseStringValue(query, GENE_NAME, GENE_NAME.key(), filterList); + parseStringValue(query, TRANSCRIPT_ID, "transcId", filterList); + parseStringValue(query, BIOTYPE, "biotype", filterList); + parseStringValue(query, VARIANTS, "variants", filterList); + parseFilterValue(query, filterList); + + // Create Solr query, adding filter queries and fields to show + solrQuery.setQuery("*:*"); + filterList.forEach(solrQuery::addFilterQuery); + + logger.debug("----------------------"); + logger.debug("query : " + printQuery(query)); + logger.debug("solrQuery : " + solrQuery); + return solrQuery; + } + + private void parseFilterValue(Query query, List filterList) throws RgaException { + List knockoutValues = query.getAsStringList(KNOCKOUT.key()); + String filterValue = query.getString(FILTER.key()); + List ctValues = query.getAsStringList(CONSEQUENCE_TYPE.key()); + List popFreqValues = query.getAsStringList(POPULATION_FREQUENCY.key()); + + if (ctValues.isEmpty() && !popFreqValues.isEmpty()) { + throw new RgaException("Filtering by '" + CONSEQUENCE_TYPE.key() + "' is mandatory when filtering by '" + + POPULATION_FREQUENCY.key() + "'"); + } + + List> filters = new LinkedList<>(); + + // Pop. freq + List> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); + for (List sublist : popFreqQueryList) { + replicateFilters(filters, sublist.size()); + addFilterValues(filters, sublist); + } + + // CT + if (!ctValues.isEmpty()) { + List encodedCTValues = new ArrayList<>(ctValues.size()); + for (String ctValue : ctValues) { + String encodedValue = String.valueOf(VariantQueryUtils.parseConsequenceType(ctValue)); + encodedCTValues.add(encodedValue); + } + replicateFilters(filters, encodedCTValues.size()); + addFilterValues(filters, encodedCTValues); + } + + // Filter + List filterValues; + if (StringUtils.isNotEmpty(filterValue)) { + filterValues = Collections.singletonList(filterValue); + } else { + if (!filters.isEmpty()) { + filterValues = Arrays.asList("PASS", "NOT_PASS"); + } else { + filterValues = Collections.emptyList(); + } + } + filterValues = RgaUtils.parseFilterQuery(filterValues); + replicateFilters(filters, filterValues.size()); + addFilterValues(filters, filterValues); + + // KT + if (knockoutValues.isEmpty() && !filters.isEmpty()) { + knockoutValues = Arrays.asList(COMP_HET.name(), DELETION_OVERLAP.name(), HET_ALT.name(), HOM_ALT.name()); + } + knockoutValues = RgaUtils.parseKnockoutTypeQuery(knockoutValues); + replicateFilters(filters, knockoutValues.size()); + addFilterValues(filters, knockoutValues); + + if (!filters.isEmpty()) { + filterList.add("cFilters:" + parseQueryFilter(filters)); + } + } + + private void addFilterValues(List> filters, List values) { + int size = values.size(); + for (int i = 0; i < filters.size(); i += size) { + for (int j = 0; j < values.size(); j++) { + filters.get(i + j).add(0, values.get(j)); + } + } + } + + private void replicateFilters(List> filters, int size) { + if (filters.isEmpty()) { + if (size > 0) { + for (int i = 0; i < size; i++) { + filters.add(new LinkedList<>()); + } + } + } else { + if (size > 1) { + // Replicate filters as many times as new elements we will need to add + int numberOfCopies = size - 1; + + List> replicatedFilterList = new LinkedList<>(); + + for (int i = 0; i < numberOfCopies; i++) { + List> tmpFilters = new ArrayList<>(filters.size()); + for (List filter : filters) { + tmpFilters.add(new ArrayList<>(filter)); + } + + replicatedFilterList.addAll(tmpFilters); + } + + filters.addAll(replicatedFilterList); + } + } + } + + private void parseStringValue(Query query, RgaQueryParams queryParam, String storageKey, List filterList) { + if (StringUtils.isNotEmpty(query.getString(queryParam.key()))) { + filterList.add(storageKey + ":( " + StringUtils.join(query.getAsStringList(queryParam.key()), " || ") + " )"); + } + } + + private String parseFacet(String facetQuery) { + StringBuilder sb = new StringBuilder(); + String[] facets = facetQuery.split(FacetQueryParser.FACET_SEPARATOR); + + for (int i = 0; i < facets.length; i++) { + if (i > 0) { + sb.append(FacetQueryParser.FACET_SEPARATOR); + } + String[] nestedFacets = facets[i].split(FacetQueryParser.NESTED_FACET_SEPARATOR); + for (int j = 0; j < nestedFacets.length; j++) { + if (j > 0) { + sb.append(FacetQueryParser.NESTED_FACET_SEPARATOR); + } + String[] nestedSubfacets = nestedFacets[j].split(FacetQueryParser.NESTED_SUBFACET_SEPARATOR); + for (int k = 0; k < nestedSubfacets.length; k++) { + if (k > 0) { + sb.append(FacetQueryParser.NESTED_SUBFACET_SEPARATOR); + } + // Convert to Solr schema fields, if necessary + sb.append(toSolrSchemaFields(nestedSubfacets[k])); + } + } + } + + return sb.toString(); + } + + private String parseQueryFilter(List> filters) { + StringBuilder builder = new StringBuilder(); + if (filters.size() > 1) { + builder.append("( "); + } + for (int i = 0; i < filters.size(); i++) { + if (i != 0) { + builder.append("|| "); + } + List filter = filters.get(i); + builder.append(StringUtils.join(filter, SEPARATOR)).append(" "); + } + if (filters.size() > 1) { + builder.append(")"); + } + + return builder.toString(); + } + +// private String parseFacet(String facet, String categoryName) { +// if (facet.contains("(")) { +// // Aggregation function +// return facet.replace(categoryName, "").replace("[", "").replace("]", ""); +// } else if (facet.contains("..")) { +// // Range +// Matcher matcher = FACET_RANGE_PATTERN.matcher(facet); +// if (matcher.find()) { +// return matcher.group(2) + "[" + matcher.group(3) + "]:" + matcher.group(4); +// } else { +// throw VariantQueryException.malformedParam(categoryName, facet, "Invalid syntax for facet range."); +// } +// } +// // Nothing to do +// return facet; +// } + + private String toSolrSchemaFields(String facet) { +// if (facet.contains(CHROM_DENSITY)) { +// return parseChromDensity(facet); +// } else if (facet.contains(ANNOT_FUNCTIONAL_SCORE.key())) { +// return parseFacet(facet, ANNOT_FUNCTIONAL_SCORE.key()); +// } else if (facet.contains(ANNOT_CONSERVATION.key())) { +// return parseFacet(facet, ANNOT_CONSERVATION.key()); +// } else if (facet.contains(ANNOT_PROTEIN_SUBSTITUTION.key())) { +// return parseFacet(facet, ANNOT_PROTEIN_SUBSTITUTION.key()); +// } else if (facet.contains(ANNOT_POPULATION_ALTERNATE_FREQUENCY.key())) { +// return parseFacetWithStudy(facet, "popFreq"); +// } else if (facet.contains(STATS_ALT.key())) { +// return parseFacetWithStudy(facet, "altStats"); +// } else if (facet.contains(SCORE.key())) { +// return parseFacetWithStudy(facet, SCORE.key()); +// } else { + return facet; +// } + } + +} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java new file mode 100644 index 00000000000..a37c961607c --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java @@ -0,0 +1,191 @@ +package org.opencb.opencga.storage.core.rga; + +import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; +import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.storage.core.variant.query.KeyOpValue; +import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; + +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +class RgaUtils { + + private static final Pattern OPERATION_PATTERN = Pattern.compile("^([^=<>~!]*)(>?=?|!=?|!?=?~|==?)([^=<>~!]+.*)$"); + + static final String SEPARATOR = "__"; + + private static final Map ENCODE_MAP; + private static final Map DECODE_MAP; + + private static final List POP_FREQS; + private static final List POP_FREQ_STUDIES; + + public static final String THOUSAND_GENOMES_STUDY = "1kG_phase3"; + public static final String GNOMAD_GENOMES_STUDY = "GNOMAD_GENOMES"; + + static { + ENCODE_MAP = new HashMap<>(); + + // KNOCKOUT TYPE + ENCODE_MAP.put(KnockoutVariant.KnockoutType.COMP_HET.name(), "CH"); + ENCODE_MAP.put(KnockoutVariant.KnockoutType.HOM_ALT.name(), "HOA"); + ENCODE_MAP.put(KnockoutVariant.KnockoutType.HET_ALT.name(), "HEA"); + ENCODE_MAP.put(KnockoutVariant.KnockoutType.DELETION_OVERLAP.name(), "DO"); + + // FILTER + ENCODE_MAP.put("PASS", "P"); + ENCODE_MAP.put("NOT_PASS", "NP"); + + // CONSEQUENCE TYPE + List consequenceTypeList = Arrays.asList("start_retained_variant", "upstream_variant", "3_prime_UTR_variant", + "splice_acceptor_variant", "transcript_amplification", "upstream_gene_variant", "RNA_polymerase_promoter", + "non_coding_transcript_exon_variant", "non_coding_transcript_variant", "inframe_variant", "transcript_ablation", + "splice_donor_variant", "synonymous_variant", "feature_elongation", "feature_truncation", "miRNA_target_site", + "exon_variant", "downstream_gene_variant", "stop_retained_variant", "TF_binding_site_variant", "initiator_codon_variant", + "coding_sequence_variant", "protein_altering_variant", "intergenic_variant", "terminator_codon_variant", + "frameshift_variant", "DNAseI_hypersensitive_site", "feature_variant", "2KB_downstream_variant", "intron_variant", + "splice_region_variant", "5_prime_UTR_variant", "SNP", "stop_gained", "regulatory_region_amplification", + "2KB_upstream_variant", "miRNA", "lincRNA", "start_lost", "SNV", "CpG_island", "downstream_variant", + "NMD_transcript_variant", "2KB_downstream_gene_variant", "TFBS_amplification", "missense_variant", + "regulatory_region_ablation", "mature_miRNA_variant", "stop_lost", "structural_variant", "regulatory_region_variant", + "TFBS_ablation", "copy_number_change", "2KB_upstream_gene_variant", "polypeptide_variation_site", "inframe_deletion", + "inframe_insertion", "incomplete_terminal_codon_variant"); + for (String consequenceType : consequenceTypeList) { + ENCODE_MAP.put(consequenceType, String.valueOf(VariantQueryUtils.parseConsequenceType(consequenceType))); + } + + // POPULATION FREQUENCY + POP_FREQ_STUDIES = Arrays.asList(THOUSAND_GENOMES_STUDY, GNOMAD_GENOMES_STUDY); + POP_FREQS = Arrays.asList(0f, 0.00001f, 0.00002f, 0.00005f, 0.0001f, 0.0002f, 0.0005f, 0.001f, 0.002f, 0.005f, 0.01f, 0.02f, 0.05f, + 0.1f, 0.2f, 0.5f, 1f); + for (int i = 1; i <= POP_FREQ_STUDIES.size(); i++) { + String popFreqStudy = POP_FREQ_STUDIES.get(i - 1); + for (int j = 1; j <= POP_FREQS.size(); j++) { + Float popFreq = POP_FREQS.get(j - 1); + ENCODE_MAP.put(popFreqStudy.toUpperCase() + SEPARATOR + popFreq, "P" + i + "-" + j); + } + } + + // Generate decodeMap + DECODE_MAP = new HashMap<>(); + for (Map.Entry entry : ENCODE_MAP.entrySet()) { + DECODE_MAP.put(entry.getValue(), entry.getKey()); + } + } + + static String getPopulationFrequencyKey(Float popFreq) throws RgaException { + for (Float freq : POP_FREQS) { + if (popFreq < freq) { + return String.valueOf(freq); + } + } + throw new RgaException("Population frequency must be a value between 0 and 1. Passed '" + popFreq + "'."); + } + + static String encode(String value) throws RgaException { + if (ENCODE_MAP.containsKey(value)) { + return ENCODE_MAP.get(value); + } else { + throw new RgaException("Unknown filter value '" + value + "'"); + } + } + + static String decode(String value) throws RgaException { + if (DECODE_MAP.containsKey(value)) { + return DECODE_MAP.get(value); + } else { + throw new RgaException("Unknown filter value '" + value + "'"); + } + } + + /** Calculate the list of population frequency values to look for in the db. + * + * @param filters A list containing {study}[<|>|<=|>=]{number}. e.g. 1kG_phase3<0.01"; + * @return the list of population frequency values to look for in the db. + * @throws RgaException RgaException. + */ + static List> parsePopulationFrequencyQuery(List filters) throws RgaException { + List> result = new ArrayList<>(filters.size()); + for (String filter : filters) { + KeyOpValue keyOpValue = parseKeyOpValue(filter); + if (keyOpValue.getKey() == null) { + throw new RgaException("Unexpected operation '" + filter + "'"); + } + + List values = new LinkedList<>(); + float value = Float.parseFloat(keyOpValue.getValue()); + switch (keyOpValue.getOp()) { + case "<": + for (Float popFreq : POP_FREQS) { + if (popFreq < value) { + values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); + } + } + break; + case "<=": + for (Float popFreq : POP_FREQS) { + if (popFreq <= value) { + values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); + } + } + break; + case ">": + for (Float popFreq : POP_FREQS) { + if (popFreq > value) { + values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); + } + } + break; + case ">=": + for (Float popFreq : POP_FREQS) { + if (popFreq >= value) { + values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); + } + } + break; + default: + throw new RgaException("Unknown operator '" + keyOpValue.getOp() + "'"); + } + + result.add(values); + } + + return result; + } + + static List parseFilterQuery(List filters) throws RgaException { + List result = new ArrayList<>(filters.size()); + for (String filter : filters) { + result.add(encode(filter)); + } + return result; + } + + static List parseKnockoutTypeQuery(List knockoutValues) throws RgaException { + List result = new ArrayList<>(knockoutValues.size()); + for (String knockoutValue : knockoutValues) { + result.add(encode(knockoutValue.toUpperCase())); + } + return result; + } + + /** + * This method parses a typical key-op-value param such as 'ALL<=0.2' in an array ["ALL", "<=", "0.2"]. + * In case of not having a key, first element will be empty + * In case of not matching with {@link #OPERATION_PATTERN}, key will be null and will use the default operator "=" + * + * @param value The key-op-value parameter to be parsed + * @return KeyOpValue + */ + static KeyOpValue parseKeyOpValue(String value) { + Matcher matcher = OPERATION_PATTERN.matcher(value); + + if (matcher.find()) { + return new KeyOpValue<>(matcher.group(1).trim(), matcher.group(2).trim(), matcher.group(3).trim()); + } else { + return new KeyOpValue<>(null, "=", value.trim()); + } + } + +} diff --git a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema new file mode 100644 index 00000000000..50112866a76 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema @@ -0,0 +1,596 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverterTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverterTest.java new file mode 100644 index 00000000000..60b932d0d7e --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverterTest.java @@ -0,0 +1,40 @@ +package org.opencb.opencga.storage.core.rga; + +import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.Before; +import org.junit.Test; +import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.opencb.opencga.storage.core.rga.RgaUtilsTest.createKnockoutByIndividual; + +public class IndividualRgaConverterTest { + + private IndividualRgaConverter converter; + + @Before + public void setUp() throws Exception { + converter = new IndividualRgaConverter(); + } + + @Test + public void convertToDataModelType() throws JsonProcessingException { + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + List rgaDataModels = converter.convertToStorageType(knockoutByIndividualList); + List knockoutByIndividuals = converter.convertToDataModelType(rgaDataModels); + + assertEquals(knockoutByIndividualList.size(), knockoutByIndividuals.size()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertEquals(JacksonUtils.getDefaultObjectMapper().writeValueAsString(knockoutByIndividualList.get(i)), + JacksonUtils.getDefaultObjectMapper().writeValueAsString(knockoutByIndividuals.get(i))); + } + } + +} \ No newline at end of file diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java new file mode 100644 index 00000000000..0f5f3c3092f --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java @@ -0,0 +1,183 @@ +package org.opencb.opencga.storage.core.rga; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.opencb.commons.datastore.core.DataResult; +import org.opencb.commons.datastore.core.FacetField; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.core.common.GitRepositoryState; +import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.storage.core.config.StorageConfiguration; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.opencb.opencga.storage.core.rga.RgaUtilsTest.createKnockoutByIndividual; + +public class RgaEngineTest { + + private StorageConfiguration storageConfiguration; + + @Rule + public RgaSolrExtenalResource solr = new RgaSolrExtenalResource(); + + @Before + public void before() throws IOException { + try (InputStream is = RgaEngineTest.class.getClassLoader().getResourceAsStream("storage-configuration.yml")) { + storageConfiguration = StorageConfiguration.load(is); + storageConfiguration.getSearch().setConfigSet("opencga-rga-configset-" + GitRepositoryState.get().getBuildVersion()); + } + } + + @Test + public void testIndividualQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList); + OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); + + assertEquals(2, result.getNumResults()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertEquals(JacksonUtils.getDefaultObjectMapper().writeValueAsString(knockoutByIndividualList.get(i)), + JacksonUtils.getDefaultObjectMapper().writeValueAsString(result.getResults().get(i))); + } + + Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(1, result.getNumResults()); + assertEquals("id1", result.first().getId()); + + query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(1, result.getNumResults()); + assertEquals("id2", result.first().getId()); + + query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(0, result.getNumResults()); + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(0, result.getNumResults()); + + query = new Query() + .append(RgaQueryParams.DISORDERS.key(), "disorderId1") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(1, result.getNumResults()); + + query = new Query() + .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.individualQuery(collection, query, new QueryOptions()); + assertEquals(1, result.getNumResults()); + } + + @Test + public void testGeneQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList); + OpenCGAResult result = rgaEngine.geneQuery(collection, new Query(), new QueryOptions()); + + assertEquals(4, result.getNumResults()); + for (KnockoutByGene resultResult : result.getResults()) { + assertEquals(1, resultResult.getIndividuals().size()); + assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") + || resultResult.getIndividuals().get(0).getId().equals("id2")); + } + + Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + for (KnockoutByGene resultResult : result.getResults()) { + assertEquals(1, resultResult.getIndividuals().size()); + assertEquals("id1", resultResult.getIndividuals().get(0).getId()); + } + + query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId2"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + for (KnockoutByGene resultResult : result.getResults()) { + assertEquals(1, resultResult.getIndividuals().size()); + assertEquals("id2", resultResult.getIndividuals().get(0).getId()); + } + + query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId6"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(0, result.getNumResults()); + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(4, result.getNumResults()); + for (KnockoutByGene resultResult : result.getResults()) { + assertEquals(1, resultResult.getIndividuals().size()); + assertTrue(resultResult.getIndividuals().get(0).getId().equals("id1") + || resultResult.getIndividuals().get(0).getId().equals("id2")); + } + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001822"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(0, result.getNumResults()); + + query = new Query() + .append(RgaQueryParams.DISORDERS.key(), "disorderId1") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + + query = new Query() + .append(RgaQueryParams.DISORDERS.key(), "disorderId1,disorder") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891"); + result = rgaEngine.geneQuery(collection, query, new QueryOptions()); + assertEquals(2, result.getNumResults()); + } + + @Test + public void testFacet() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList); + + QueryOptions options = new QueryOptions(QueryOptions.FACET, RgaQueryParams.DISORDERS.key()); + DataResult facetFieldDataResult = rgaEngine.facetedQuery(collection, new Query(), options); + assertEquals(1, facetFieldDataResult.getNumResults()); + assertEquals("disorders", facetFieldDataResult.first().getName()); + assertEquals(4, facetFieldDataResult.first().getBuckets().size()); + } + +} diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java new file mode 100644 index 00000000000..80fcded90e1 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java @@ -0,0 +1,28 @@ +package org.opencb.opencga.storage.core.rga; + +import org.apache.solr.client.solrj.SolrQuery; +import org.junit.Before; +import org.junit.Test; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.storage.core.exceptions.RgaException; + +import static org.junit.Assert.*; + +public class RgaQueryParserTest { + + private RgaQueryParser parser; + + @Before + public void setUp() throws Exception { + parser = new RgaQueryParser(); + } + + @Test + public void parse() throws RgaException { + Query query = new Query(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001"); + SolrQuery parse = parser.parse(query, QueryOptions.empty()); + assertNotNull(parse); + + } +} \ No newline at end of file diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java new file mode 100644 index 00000000000..b0e1344bf55 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaSolrExtenalResource.java @@ -0,0 +1,165 @@ +package org.opencb.opencga.storage.core.rga; + +import org.apache.commons.io.FileUtils; +import org.apache.solr.client.solrj.SolrClient; +import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; +import org.apache.solr.core.NodeConfig; +import org.apache.solr.core.SolrResourceLoader; +import org.junit.rules.ExternalResource; +import org.opencb.commons.datastore.solr.SolrManager; +import org.opencb.opencga.core.common.GitRepositoryState; +import org.opencb.opencga.storage.core.config.StorageConfiguration; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static org.opencb.opencga.storage.core.variant.VariantStorageBaseTest.*; + +public class RgaSolrExtenalResource extends ExternalResource { + + public String coreName = "opencga_rga_test"; + + private SolrClient solrClient; + protected boolean embeded = true; + + public RgaSolrExtenalResource() { + this(true); + } + + public RgaSolrExtenalResource(boolean embeded) { + this.embeded = embeded; + } + + @Override + protected void before() throws Throwable { + super.before(); + + Path rootDir = getTmpRootDir(); + + String configSet = "opencga-rga-configset-" + GitRepositoryState.get().getBuildVersion(); + + // Copy configuration + getResourceUri("configsets/variantsCollection/solrconfig.xml", "configsets/" + configSet + "/solrconfig.xml"); + getResourceUri("rga/managed-schema", "configsets/" + configSet + "/managed-schema"); + getResourceUri("configsets/variantsCollection/params.json", "configsets/" + configSet + "/params.json"); + getResourceUri("configsets/variantsCollection/protwords.txt", "configsets/" + configSet + "/protwords.txt"); + getResourceUri("configsets/variantsCollection/stopwords.txt", "configsets/" + configSet + "/stopwords.txt"); + getResourceUri("configsets/variantsCollection/synonyms.txt", "configsets/" + configSet + "/synonyms.txt"); + getResourceUri("configsets/variantsCollection/lang/stopwords_en.txt", "configsets/" + configSet + "/lang/stopwords_en.txt"); + + String solrHome = rootDir.resolve("solr").toString(); + + if (embeded) { + solrClient = create(solrHome, rootDir.resolve("configsets").toString(), coreName); + } else { + String host = "http://localhost:8983/solr"; + int timeout = 5000; + + SolrManager solrManager = new SolrManager(host, "core", timeout); + if (!solrManager.existsCore(coreName)) { + solrManager.createCore(coreName, configSet); + } + + this.solrClient = solrManager.getSolrClient(); + } + } + + @Override + protected void after() { + super.after(); + try { + if (embeded) { + ((RgaSolrExtenalResource.MyEmbeddedSolrServer) solrClient).realClose(); + } else { + solrClient.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + solrClient = null; + } + } + + public RgaEngine configure(StorageConfiguration storageConfiguration) { + RgaEngine rgaEngine = new RgaEngine(storageConfiguration); + rgaEngine.setSolrManager(new SolrManager(solrClient, "localhost", "core")); + return rgaEngine; + } + + public SolrClient getSolrClient() { + return solrClient; + } + + /** + * Cleans the given solrHome directory and creates a new EmbeddedSolrServer. + * + * @param solrHome the Solr home directory to use + * @param configSetHome the directory containing config sets + * @param coreName the name of the core, must have a matching directory in configHome + * + * @return an EmbeddedSolrServer with a core created for the given coreName + * @throws IOException + */ + public static SolrClient create(final String solrHome, final String configSetHome, final String coreName) + throws IOException, SolrServerException { + return create(solrHome, configSetHome, coreName, true); + } + + /** + * @param solrHome the Solr home directory to use + * @param configSetHome the directory containing config sets + * @param coreName the name of the core, must have a matching directory in configHome + * @param cleanSolrHome if true the directory for solrHome will be deleted and re-created if it already exists + * + * @return an EmbeddedSolrServer with a core created for the given coreName + * @throws IOException + */ + public static SolrClient create(final String solrHome, final String configSetHome, final String coreName, final boolean cleanSolrHome) + throws IOException, SolrServerException { + + final File solrHomeDir = new File(solrHome); + if (solrHomeDir.exists()) { + if (cleanSolrHome) { + FileUtils.deleteDirectory(solrHomeDir); + solrHomeDir.mkdirs(); + } + } else { + solrHomeDir.mkdirs(); + } + + System.setProperty("solr.solr.home", solrHomeDir.toPath().toAbsolutePath().normalize().toString()); + + final SolrResourceLoader loader = new SolrResourceLoader(solrHomeDir.toPath()); + final Path configSetPath = Paths.get(configSetHome).toAbsolutePath(); + + final NodeConfig config = new NodeConfig.NodeConfigBuilder("embeddedSolrServerNode", loader) + .setConfigSetBaseDirectory(configSetPath.toString()) + .build(); + + final EmbeddedSolrServer embeddedSolrServer = new RgaSolrExtenalResource.MyEmbeddedSolrServer(config, coreName); + +// final CoreAdminRequest.Create createRequest = new CoreAdminRequest.Create(); +// createRequest.setCoreName(coreName); +// createRequest.setConfigSet(coreName); +// embeddedSolrServer.request(createRequest); + + return embeddedSolrServer; + } + + private static class MyEmbeddedSolrServer extends EmbeddedSolrServer { + public MyEmbeddedSolrServer(NodeConfig config, String coreName) { + super(config, coreName); + } + + @Override + public void close() throws IOException { + } + + private void realClose() throws IOException { + super.close(); + } + } +} diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java new file mode 100644 index 00000000000..ad81a3aa8e3 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaUtilsTest.java @@ -0,0 +1,79 @@ +package org.opencb.opencga.storage.core.rga; + +import org.opencb.biodata.models.clinical.Disorder; +import org.opencb.biodata.models.clinical.Phenotype; +import org.opencb.biodata.models.pedigree.IndividualProperty; +import org.opencb.biodata.models.variant.avro.PopulationFrequency; +import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class RgaUtilsTest { + + public static KnockoutByIndividual createKnockoutByIndividual(int count) { + KnockoutByIndividual knockoutByIndividual = new KnockoutByIndividual(); + knockoutByIndividual.setId("id" + count); + knockoutByIndividual.setSampleId("sample" + count); + knockoutByIndividual.setSex(IndividualProperty.Sex.MALE); + knockoutByIndividual.setDisorders(Collections.singletonList(new Disorder().setId("disorderId" + count).setName("disorderName" + count))); + knockoutByIndividual.setPhenotypes(Collections.singletonList(new Phenotype().setId("phenotypeId" + count).setName("phenotypeName" + count))); + + List knockoutGeneList = new ArrayList<>(2); + KnockoutByIndividual.KnockoutGene knockoutGene = new KnockoutByIndividual.KnockoutGene(); + knockoutGene.setId("geneId" + count); + knockoutGene.setName("geneName" + count); + + List knockoutTranscriptList = new ArrayList<>(2); + knockoutTranscriptList.add(createTranscript(1)); + knockoutTranscriptList.add(createTranscript(2)); + knockoutGene.setTranscripts(knockoutTranscriptList); + knockoutGeneList.add(knockoutGene); + + knockoutGene = new KnockoutByIndividual.KnockoutGene(); + knockoutGene.setId("geneId" + (count + 10)); + knockoutGene.setName("geneName" + (count + 10)); + + knockoutTranscriptList = new ArrayList<>(2); + knockoutTranscriptList.add(createTranscript(count)); + knockoutTranscriptList.add(createTranscript(count + 10)); + knockoutGene.setTranscripts(knockoutTranscriptList); + knockoutGeneList.add(knockoutGene); + + knockoutByIndividual.setGenes(knockoutGeneList); + return knockoutByIndividual; + } + + public static KnockoutTranscript createTranscript(int count) { + KnockoutTranscript knockoutTranscript = new KnockoutTranscript("transcriptId" + count); + knockoutTranscript.setBiotype("biotype" + count); + + List knockoutVariantList = new ArrayList<>(2); + List populationFrequencyList = new ArrayList<>(3); + populationFrequencyList.add(new PopulationFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, "ALL", "", "", 1f, 0.3f, 1f, 0.4f, 0.2f)); + populationFrequencyList.add(new PopulationFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, "ALL", "", "", 1f, 0.04f, 1f, 0.04f, 0.02f)); + populationFrequencyList.add(new PopulationFrequency("otherStudy", "ALL", "", "", 1f, 0.04f, 1f, 0.004f, 0.2f)); + + List sequenceOntologyTermList = new ArrayList<>(3); + sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0002019", "start_retained_variant")); + sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0001891", "regulatory_region_amplification")); + sequenceOntologyTermList.add(new SequenceOntologyTerm("SO:0000685", "DNAseI_hypersensitive_site")); + + knockoutVariantList.add(new KnockoutVariant("variant" + count, "Genotype", "PASS", "10", KnockoutVariant.KnockoutType.COMP_HET, + populationFrequencyList, sequenceOntologyTermList)); + + populationFrequencyList = new ArrayList<>(3); + populationFrequencyList.add(new PopulationFrequency(RgaUtils.GNOMAD_GENOMES_STUDY, "ALL", "", "", 1f, 0.2f, 1f, 0.04f, 0.02f)); + populationFrequencyList.add(new PopulationFrequency(RgaUtils.THOUSAND_GENOMES_STUDY, "ALL", "", "", 1f, 0.01f, 1f, 0.01f, 0.01f)); + populationFrequencyList.add(new PopulationFrequency("otherStudy", "ALL", "", "", 1f, 0.04f, 1f, 0.004f, 0.2f)); + knockoutVariantList.add(new KnockoutVariant("variant" + (count + 1), "Genotype", "NOT_PASS", "1", + KnockoutVariant.KnockoutType.COMP_HET, populationFrequencyList, sequenceOntologyTermList)); + knockoutTranscript.setVariants(knockoutVariantList); + return knockoutTranscript; + } + +} diff --git a/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/lang/stopwords_en.txt b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/lang/stopwords_en.txt new file mode 100644 index 00000000000..2c164c0b2a1 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/lang/stopwords_en.txt @@ -0,0 +1,54 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# a couple of test stopwords to test that the words are really being +# configured from this file: +stopworda +stopwordb + +# Standard english stop words taken from Lucene's StopAnalyzer +a +an +and +are +as +at +be +but +by +for +if +in +into +is +it +no +not +of +on +or +such +that +the +their +then +there +these +they +this +to +was +will +with diff --git a/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/params.json b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/params.json new file mode 100644 index 00000000000..06114ef2577 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/params.json @@ -0,0 +1,20 @@ +{"params":{ + "query":{ + "defType":"edismax", + "q.alt":"*:*", + "rows":"10", + "fl":"*,score", + "":{"v":0} + }, + "facets":{ + "facet":"on", + "facet.mincount": "1", + "":{"v":0} + }, + "velocity":{ + "wt": "velocity", + "v.template":"browse", + "v.layout": "layout", + "":{"v":0} + } +}} \ No newline at end of file diff --git a/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/protwords.txt b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/protwords.txt new file mode 100644 index 00000000000..1dfc0abecbf --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/protwords.txt @@ -0,0 +1,21 @@ +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#----------------------------------------------------------------------- +# Use a protected word file to protect against the stemmer reducing two +# unrelated words to the same base word. + +# Some non-words that normally won't be encountered, +# just to test that they won't be stemmed. +dontstems +zwhacky + diff --git a/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/solrconfig.xml b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/solrconfig.xml new file mode 100644 index 00000000000..f32e265b7cf --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/solrconfig.xml @@ -0,0 +1,21 @@ + + + 6.2.1 + + ${solr.data.dir:} + + + + + + single + + + + + + + + + + \ No newline at end of file diff --git a/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/stopwords.txt b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/stopwords.txt new file mode 100644 index 00000000000..ae1e83eeb3d --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/stopwords.txt @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/synonyms.txt b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/synonyms.txt new file mode 100644 index 00000000000..7f72128303b --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/test/resources/configsets/rgaCollection/synonyms.txt @@ -0,0 +1,29 @@ +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#----------------------------------------------------------------------- +#some test synonym mappings unlikely to appear in real input text +aaafoo => aaabar +bbbfoo => bbbfoo bbbbar +cccfoo => cccbar cccbaz +fooaaa,baraaa,bazaaa + +# Some synonym groups specific to this example +GB,gib,gigabyte,gigabytes +MB,mib,megabyte,megabytes +Television, Televisions, TV, TVs +#notice we use "gib" instead of "GiB" so any WordDelimiterFilter coming +#after us won't split it into two words. + +# Synonym mappings can be used for spelling correction too +pixima => pixma + From 719bdd6a91d13576ed4863e0953eb8d1f15793e4 Mon Sep 17 00:00:00 2001 From: imedina Date: Sun, 3 Jan 2021 02:12:21 +0000 Subject: [PATCH 011/412] Increase version to 2.1.0-SNAPSHOT --- opencga-analysis/pom.xml | 2 +- .../app/cloud/azure/arm-kubernetes/solr/solr-setup.sh | 2 +- .../charts/opencga/templates/rest-deployment.yaml | 2 +- opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml | 6 +++--- opencga-app/app/misc/demo/main.yml | 2 +- opencga-app/pom.xml | 2 +- opencga-catalog/pom.xml | 2 +- opencga-client/pom.xml | 2 +- opencga-core/pom.xml | 2 +- opencga-core/src/main/resources/configuration.yml | 2 +- opencga-master/pom.xml | 2 +- opencga-server/pom.xml | 2 +- .../java/org/opencb/opencga/server/rest/StudyWSServer.java | 2 +- opencga-storage/opencga-storage-app/pom.xml | 2 +- opencga-storage/opencga-storage-benchmark/pom.xml | 2 +- opencga-storage/opencga-storage-core/pom.xml | 2 +- .../opencga-storage-hadoop-core/pom.xml | 2 +- .../opencga-storage-hadoop-deps-cdh5.13/pom.xml | 2 +- .../opencga-storage-hadoop-deps-emr5.8/pom.xml | 2 +- .../opencga-storage-hadoop-deps-hdp2.5/pom.xml | 2 +- .../opencga-storage-hadoop-deps-hdp2.6/pom.xml | 2 +- .../opencga-storage-hadoop-deps-hdp3.1/pom.xml | 2 +- .../opencga-storage-hadoop-deps/pom.xml | 4 ++-- opencga-storage/opencga-storage-hadoop/pom.xml | 4 ++-- opencga-storage/opencga-storage-mongodb/pom.xml | 2 +- opencga-storage/opencga-storage-server/pom.xml | 2 +- opencga-storage/pom.xml | 4 ++-- opencga-test/pom.xml | 2 +- pom.xml | 4 ++-- 29 files changed, 35 insertions(+), 35 deletions(-) diff --git a/opencga-analysis/pom.xml b/opencga-analysis/pom.xml index 7f0417eeda3..f11deb6e7a4 100644 --- a/opencga-analysis/pom.xml +++ b/opencga-analysis/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-app/app/cloud/azure/arm-kubernetes/solr/solr-setup.sh b/opencga-app/app/cloud/azure/arm-kubernetes/solr/solr-setup.sh index b58c480a57f..8db62222c85 100644 --- a/opencga-app/app/cloud/azure/arm-kubernetes/solr/solr-setup.sh +++ b/opencga-app/app/cloud/azure/arm-kubernetes/solr/solr-setup.sh @@ -131,7 +131,7 @@ done # Add OpenCGA Configuration Sets # copy configset to volume ready to mount -docker run --rm -v ${SOLR_VOLUME}/solr/configsets:/target opencb/opencga-base:2.0.1-SNAPSHOT cp -r /opt/opencga/misc/solr/ /target/opencga/ +docker run --rm -v ${SOLR_VOLUME}/solr/configsets:/target opencb/opencga-base:2.1.0-SNAPSHOT cp -r /opt/opencga/misc/solr/ /target/opencga/ for i in `ls ${SOLR_VOLUME}/solr/configsets/opencga/ | grep "configset"` ; do echo "Install configset ${i}" diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml index 0a6e526a25e..86fa43de9b6 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/templates/rest-deployment.yaml @@ -81,7 +81,7 @@ spec: dockerd-entrypoint.sh & sleep 5 umount /tmp - docker pull opencb/opencga-r:2.0.1-SNAPSHOT + docker pull opencb/opencga-r:2.1.0-SNAPSHOT sleep infinity env: - name: DOCKER_TLS_CERTDIR diff --git a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml index d34191c311b..565e1a05cff 100644 --- a/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml +++ b/opencga-app/app/cloud/kubernetes/charts/opencga/values.yaml @@ -66,7 +66,7 @@ rest: image: # TODO: Currently building from dev image. Update once release available. - repository: opencb/opencga-base:2.0.1-SNAPSHOT-hdp3.1 + repository: opencb/opencga-base:2.1.0-SNAPSHOT-hdp3.1 pullPolicy: Always imagePullSecrets: [] @@ -140,7 +140,7 @@ master: image: # TODO: Currently building from dev image. Update once release available. - repository: opencb/opencga-base:2.0.1-SNAPSHOT-hdp3.1 + repository: opencb/opencga-base:2.1.0-SNAPSHOT-hdp3.1 pullPolicy: Always imagePullSecrets: [] @@ -190,7 +190,7 @@ init: name: init image: # TODO: Currently building from dev image. Update once release available. - repository: opencb/opencga-init:2.0.1-SNAPSHOT-hdp3.1 + repository: opencb/opencga-init:2.1.0-SNAPSHOT-hdp3.1 pullPolicy: Always podSecurityContext: {} diff --git a/opencga-app/app/misc/demo/main.yml b/opencga-app/app/misc/demo/main.yml index e27e81de621..a6aae9fac94 100644 --- a/opencga-app/app/misc/demo/main.yml +++ b/opencga-app/app/misc/demo/main.yml @@ -1,6 +1,6 @@ --- ## OpenCGA version -version: 2.0.1-SNAPSHOT +version: 2.1.0-SNAPSHOT ## URL to fetch data from. STUDY_ID will be replaced with the study.id baseUrl: http://resources.opencb.org/datasets/STUDY_ID/data/ diff --git a/opencga-app/pom.xml b/opencga-app/pom.xml index 1a2832f456c..f06f65697ee 100644 --- a/opencga-app/pom.xml +++ b/opencga-app/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-catalog/pom.xml b/opencga-catalog/pom.xml index 5418b18c4be..f9c78121e69 100644 --- a/opencga-catalog/pom.xml +++ b/opencga-catalog/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-client/pom.xml b/opencga-client/pom.xml index f29238c5b23..e084210ad06 100644 --- a/opencga-client/pom.xml +++ b/opencga-client/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-core/pom.xml b/opencga-core/pom.xml index 0dbc7d78569..32c55a3a5eb 100644 --- a/opencga-core/pom.xml +++ b/opencga-core/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-core/src/main/resources/configuration.yml b/opencga-core/src/main/resources/configuration.yml index 3779fe00473..5429ea6fd0f 100644 --- a/opencga-core/src/main/resources/configuration.yml +++ b/opencga-core/src/main/resources/configuration.yml @@ -150,7 +150,7 @@ analysis: ## Kubernetes executor configuration example # k8s.masterUrl: "https://192.168.99.100:8443/" # FOR Cluster Autoscaler and dedicated jobs agent pool: - k8s.imageName: "opencb/opencga-base:2.0.1-SNAPSHOT-hdp3.1s" + k8s.imageName: "opencb/opencga-base:2.1.0-SNAPSHOT-hdp3.1s" k8s.imagePullPolicy: "IfNotPresent" # k8s.imagePullSecrets: # name : "dockerhub-secrets-name" diff --git a/opencga-master/pom.xml b/opencga-master/pom.xml index bb8a33ab29c..c175bad268f 100644 --- a/opencga-master/pom.xml +++ b/opencga-master/pom.xml @@ -22,7 +22,7 @@ opencga org.opencb.opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT .. diff --git a/opencga-server/pom.xml b/opencga-server/pom.xml index fbbfd391c3f..34a674f9a8c 100644 --- a/opencga-server/pom.xml +++ b/opencga-server/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java index bc45b9764b3..b9dbf1bbe83 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/StudyWSServer.java @@ -406,7 +406,7 @@ public Response createOrRemoveVariableSets( DataResult queryResult; if (action == ParamUtils.AddRemoveAction.ADD) { // Fix variable set params to support 1.3.x - // TODO: Remove in version 2.0.1-SNAPSHOT + // TODO: Remove in version 2.1.0-SNAPSHOT params.setId(StringUtils.isNotEmpty(params.getId()) ? params.getId() : params.getName()); for (Variable variable : params.getVariables()) { fixVariable(variable); diff --git a/opencga-storage/opencga-storage-app/pom.xml b/opencga-storage/opencga-storage-app/pom.xml index aee092d369f..b198f84c7d1 100644 --- a/opencga-storage/opencga-storage-app/pom.xml +++ b/opencga-storage/opencga-storage-app/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-benchmark/pom.xml b/opencga-storage/opencga-storage-benchmark/pom.xml index fbd621588c6..7d3cc409cdc 100644 --- a/opencga-storage/opencga-storage-benchmark/pom.xml +++ b/opencga-storage/opencga-storage-benchmark/pom.xml @@ -21,7 +21,7 @@ opencga-storage org.opencb.opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT 4.0.0 diff --git a/opencga-storage/opencga-storage-core/pom.xml b/opencga-storage/opencga-storage-core/pom.xml index 8a858df2af0..5d86a1854ee 100644 --- a/opencga-storage/opencga-storage-core/pom.xml +++ b/opencga-storage/opencga-storage-core/pom.xml @@ -25,7 +25,7 @@ org.opencb.opencga opencga-storage - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml index e5082694d89..430aab9c9e5 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/pom.xml @@ -23,7 +23,7 @@ org.opencb.opencga opencga-storage-hadoop - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml index 4cc60d41e72..eb982a4a2d4 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-cdh5.13/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml index b0c2d6aff7c..7829467b83a 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-emr5.8/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml index 84201655338..9e5b5188d0f 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.5/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml index c521cca496e..08a09471e3b 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp2.6/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml index 214db52aaca..7b3f5952caf 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/opencga-storage-hadoop-deps-hdp3.1/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage-hadoop-deps - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml index 471ef0ef093..43e7354e134 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-deps/pom.xml @@ -50,7 +50,7 @@ org.opencb.opencga opencga-storage-hadoop - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml @@ -64,7 +64,7 @@ opencga-storage-hadoop-deps - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT pom diff --git a/opencga-storage/opencga-storage-hadoop/pom.xml b/opencga-storage/opencga-storage-hadoop/pom.xml index 3f5977f2ada..af0825e5c1b 100644 --- a/opencga-storage/opencga-storage-hadoop/pom.xml +++ b/opencga-storage/opencga-storage-hadoop/pom.xml @@ -30,12 +30,12 @@ org.opencb.opencga opencga-storage - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml opencga-storage-hadoop - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT pom diff --git a/opencga-storage/opencga-storage-mongodb/pom.xml b/opencga-storage/opencga-storage-mongodb/pom.xml index 023b38e459f..90ba7546bc0 100644 --- a/opencga-storage/opencga-storage-mongodb/pom.xml +++ b/opencga-storage/opencga-storage-mongodb/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/opencga-storage-server/pom.xml b/opencga-storage/opencga-storage-server/pom.xml index 271ae52a961..4971a6c67fb 100644 --- a/opencga-storage/opencga-storage-server/pom.xml +++ b/opencga-storage/opencga-storage-server/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga-storage - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml diff --git a/opencga-storage/pom.xml b/opencga-storage/pom.xml index a7f8ee15df1..adbe17a3fcc 100644 --- a/opencga-storage/pom.xml +++ b/opencga-storage/pom.xml @@ -22,13 +22,13 @@ org.opencb.opencga opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ../pom.xml opencga-storage - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT pom diff --git a/opencga-test/pom.xml b/opencga-test/pom.xml index 291359f9c8c..5d6a63bfb71 100644 --- a/opencga-test/pom.xml +++ b/opencga-test/pom.xml @@ -24,7 +24,7 @@ org.opencb.opencga opencga-test - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT pom diff --git a/pom.xml b/pom.xml index 08c0c3379c3..f765ca34d12 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.opencb.opencga opencga - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT pom OpenCGA @@ -41,7 +41,7 @@ - 2.0.1-SNAPSHOT + 2.1.0-SNAPSHOT ${opencga.version} 4.8.0 2.0.5-SNAPSHOT From 0afc9a58e497ab241958af8898c3f7399988dc4c Mon Sep 17 00:00:00 2001 From: imedina Date: Sat, 9 Jan 2021 03:00:03 +0000 Subject: [PATCH 012/412] pom: update apache commons lang and collections dependencies --- .../java/org/opencb/opencga/analysis/ResourceUtils.java | 2 +- .../opencga/analysis/alignment/AlignmentStorageManager.java | 4 ++-- .../analysis/clinical/ClinicalInterpretationManager.java | 6 +++--- .../org/opencb/opencga/analysis/clinical/ClinicalUtils.java | 4 ++-- .../clinical/InterpretationAnalysisConfiguration.java | 2 +- .../analysis/clinical/team/TeamInterpretationAnalysis.java | 2 +- .../clinical/team/TeamInterpretationAnalysisExecutor.java | 2 +- .../CancerTieringInterpretationAnalysisExecutor.java | 2 +- .../analysis/family/qc/FamilyQcLocalAnalysisExecutor.java | 2 +- .../opencga/analysis/file/PostLinkSampleAssociation.java | 2 +- .../analysis/individual/qc/IndividualQcAnalysis.java | 2 +- .../individual/qc/IndividualQcLocalAnalysisExecutor.java | 2 +- .../opencga/analysis/individual/qc/IndividualQcUtils.java | 2 +- .../opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java | 2 +- .../analysis/sample/qc/SampleQcLocalAnalysisExecutor.java | 2 +- .../opencb/opencga/analysis/tools/ToolExecutorFactory.java | 2 +- .../variant/circos/CircosLocalAnalysisExecutor.java | 4 ++-- .../analysis/variant/gwas/GwasLocalAnalysisExecutor.java | 2 +- .../opencb/opencga/analysis/variant/julie/JulieTool.java | 2 +- .../opencga/analysis/variant/knockout/KnockoutAnalysis.java | 2 +- .../analysis/variant/manager/VariantCatalogQueryUtils.java | 2 +- .../analysis/variant/manager/VariantStorageManager.java | 2 +- .../operations/VariantAnnotationOperationManager.java | 2 +- .../metadata/CatalogStorageMetadataSynchronizer.java | 2 +- .../mutationalSignature/MutationalSignatureAnalysis.java | 2 +- .../MutationalSignatureLocalAnalysisExecutor.java | 2 +- .../opencga/analysis/variant/operations/OperationTool.java | 2 +- .../variant/operations/VariantFamilyIndexOperationTool.java | 2 +- .../variant/operations/VariantFileIndexJobLauncherTool.java | 2 +- .../variant/operations/VariantSampleIndexOperationTool.java | 2 +- .../operations/VariantStorageMetadataRepairTool.java | 2 +- .../analysis/variant/stats/CohortVariantStatsAnalysis.java | 2 +- .../analysis/variant/stats/SampleVariantStatsAnalysis.java | 4 ++-- .../analysis/clinical/ClinicalAnalysisUtilsTest.java | 2 +- .../clinical/ClinicalInterpretationAnalysisTest.java | 2 +- .../app/cli/internal/executors/ClinicalCommandExecutor.java | 2 +- .../app/cli/internal/executors/ToolsCommandExecutor.java | 2 +- .../internal/executors/VariantInternalCommandExecutor.java | 2 +- .../org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java | 2 +- .../opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java | 2 +- .../org/opencb/opencga/catalog/db/api/FamilyDBAdaptor.java | 2 +- .../org/opencb/opencga/catalog/db/api/FileDBAdaptor.java | 2 +- .../opencb/opencga/catalog/db/api/IndividualDBAdaptor.java | 2 +- .../opencga/catalog/db/api/InterpretationDBAdaptor.java | 2 +- .../org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java | 2 +- .../org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java | 2 +- .../org/opencb/opencga/catalog/db/api/UserDBAdaptor.java | 2 +- .../catalog/db/mongodb/AnnotationMongoDBAdaptor.java | 4 ++-- .../opencga/catalog/managers/ClinicalAnalysisManager.java | 2 +- .../opencga/catalog/managers/InterpretationManager.java | 2 +- .../org/opencb/opencga/catalog/managers/SampleManager.java | 2 +- .../org/opencb/opencga/catalog/managers/StudyManager.java | 2 +- .../opencga/catalog/stats/solr/CatalogSolrQueryParser.java | 2 +- .../catalog/stats/solr/converters/SolrConverterUtil.java | 2 +- .../converters/CatalogSampleToSolrSampleConverterTest.java | 2 +- .../opencb/opencga/client/rest/AbstractParentClient.java | 2 +- .../org/opencb/opencga/client/template/TemplateManager.java | 2 +- opencga-core/pom.xml | 4 ++++ .../opencga/core/exceptions/ToolExecutorException.java | 2 +- .../org/opencb/opencga/core/models/study/StudyAclEntry.java | 2 +- .../opencga/core/models/variant/CircosAnalysisParams.java | 2 +- .../opencga/core/tools/result/ExecutionResultManager.java | 2 +- .../opencga/master/monitor/daemons/ExecutionDaemon.java | 2 +- .../opencga/server/rest/analysis/AlignmentWebService.java | 2 +- .../opencga/server/rest/analysis/VariantWebService.java | 2 +- .../app/cli/client/executors/VariantQueryCommandUtils.java | 2 +- .../storage/benchmark/variant/VariantBenchmarkRunner.java | 2 +- opencga-storage/opencga-storage-core/pom.xml | 1 + .../core/variant/annotation/VariantAnnotationManager.java | 2 +- .../annotation/annotators/VariantAnnotatorFactory.java | 2 +- .../VariantTraitAssociationToEvidenceEntryConverter.java | 3 ++- .../storage/core/variant/query/VariantQueryParser.java | 2 +- .../query/projection/VariantQueryProjectionParser.java | 2 +- .../variant/search/VariantSearchToVariantConverter.java | 4 ++-- .../storage/core/variant/search/solr/SolrQueryParser.java | 6 +++--- .../core/variant/search/solr/VariantSearchManager.java | 2 +- .../variant/stats/SampleVariantStatsAggregationQuery.java | 2 +- .../opencb/opencga/storage/core/io/bit/BitStreamTest.java | 6 +++--- .../storage/core/variant/adaptors/VariantDBAdaptorTest.java | 2 +- .../storage/core/variant/search/VariantSearchTest.java | 6 +++--- .../storage/hadoop/utils/AbstractHBaseDataWriter.java | 2 +- .../storage/hadoop/utils/DeleteHBaseColumnDriver.java | 2 +- .../variant/adaptors/phoenix/VariantSqlQueryParser.java | 2 +- .../hadoop/variant/analysis/gwas/FisherTestDriver.java | 2 +- .../annotation/HBaseToVariantAnnotationConverter.java | 2 +- .../annotation/VariantAnnotationToPhoenixConverter.java | 2 +- .../converters/study/HBaseToStudyEntryConverter.java | 2 +- .../variant/index/annotation/AnnotationIndexConverter.java | 2 +- .../hadoop/variant/index/family/FamilyIndexDriver.java | 2 +- .../family/MendelianErrorSampleIndexEntryIterator.java | 2 +- .../variant/index/query/SampleAnnotationIndexQuery.java | 2 +- .../hadoop/variant/index/query/SampleIndexQuery.java | 2 +- .../index/sample/AbstractSampleIndexEntryFilter.java | 2 +- .../hadoop/variant/index/sample/SampleIndexQueryParser.java | 2 +- .../variant/index/sample/SampleVariantIndexEntry.java | 2 +- .../hadoop/variant/metadata/HBaseVariantMetadataUtils.java | 2 +- .../hadoop/variant/stats/CheckVariantStatsDriver.java | 2 +- .../hadoop/variant/stats/SampleVariantStatsDriver.java | 2 +- .../storage/hadoop/variant/stats/SaturationStatsDriver.java | 2 +- .../variant/HadoopVariantStorageEngineSplitDataTest.java | 2 +- .../hadoop/variant/VariantHadoopMultiSampleTest.java | 2 +- .../variant/index/sample/SampleIndexQueryParserTest.java | 2 +- .../mongodb/variant/adaptors/VariantMongoDBQueryParser.java | 2 +- .../variant/stats/MongoDBVariantStatsCalculator.java | 2 +- pom.xml | 6 ++++++ 105 files changed, 128 insertions(+), 116 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ResourceUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ResourceUtils.java index f6a7711936f..abf9d47b71f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ResourceUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ResourceUtils.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java index 1b6e6a093b0..6db9684ca8c 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java @@ -16,8 +16,8 @@ package org.opencb.opencga.analysis.alignment; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.ga4gh.models.ReadAlignment; import org.opencb.biodata.formats.alignment.samtools.SamtoolsStats; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java index 570703bc1aa..f2f10cfa587 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java @@ -18,9 +18,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import htsjdk.variant.vcf.VCFConstants; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.time.StopWatch; import org.opencb.biodata.models.clinical.*; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalUtils.java index 2f8794e6f74..1c97cf153e7 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalUtils.java @@ -19,10 +19,10 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.ObjectWriter; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.io.LineIterator; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.interpretation.ClinicalVariant; import org.opencb.biodata.models.clinical.interpretation.DiseasePanel; import org.opencb.biodata.models.clinical.interpretation.Interpretation; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysisConfiguration.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysisConfiguration.java index 67823ae4dfb..b9326ed955e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysisConfiguration.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysisConfiguration.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.clinical; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import java.util.HashSet; import java.util.List; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/team/TeamInterpretationAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/team/TeamInterpretationAnalysis.java index 5f4e4481c09..2e796692da6 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/team/TeamInterpretationAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/team/TeamInterpretationAnalysis.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.clinical.team; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.ClinicalProperty; import org.opencb.biodata.models.clinical.interpretation.DiseasePanel; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/team/TeamInterpretationAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/team/TeamInterpretationAnalysisExecutor.java index d22bce1ad4c..f6dcf375482 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/team/TeamInterpretationAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/team/TeamInterpretationAnalysisExecutor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.clinical.team; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.ClinicalProperty; import org.opencb.biodata.models.clinical.interpretation.ClinicalVariant; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java index a363d71c317..8bdcfeb0944 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java @@ -17,7 +17,7 @@ package org.opencb.opencga.analysis.clinical.tiering; import htsjdk.variant.vcf.VCFConstants; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.ClinicalProperty; import org.opencb.biodata.models.clinical.Disorder; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyQcLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyQcLocalAnalysisExecutor.java index 66bf790e7f2..aa84e61185f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyQcLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyQcLocalAnalysisExecutor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.family.qc; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.biodata.models.clinical.qc.RelatednessReport; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociation.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociation.java index 658a7688492..780cc1fcad4 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociation.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociation.java @@ -1,6 +1,6 @@ package org.opencb.opencga.analysis.file; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java index 4faf2d2ccf5..8766cf9b525 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.individual.qc; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.qc.InferredSexReport; import org.opencb.commons.datastore.core.QueryOptions; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcLocalAnalysisExecutor.java index 840963e914e..5e450943d0b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcLocalAnalysisExecutor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.individual.qc; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.MapUtils; import org.opencb.biodata.models.clinical.qc.InferredSexReport; import org.opencb.biodata.models.clinical.qc.MendelianErrorReport; import org.opencb.opencga.analysis.AnalysisUtils; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java index 774b56e4b7a..aa235e68e46 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.individual.qc; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index ffb1abce2f1..9f92f1c13ee 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -281,7 +281,7 @@ private void runFastQc() throws ToolException { return; } - if (org.apache.commons.collections.CollectionUtils.isNotEmpty(fastQcJob.getOutput())) { + if (CollectionUtils.isNotEmpty(fastQcJob.getOutput())) { FastQc fastQc = null; // First, look for fastqc_data.txt to parse it diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java index ae3c709337d..9cd6445efb2 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcLocalAnalysisExecutor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.sample.qc; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.formats.alignment.picard.HsMetrics; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/ToolExecutorFactory.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/ToolExecutorFactory.java index 87c2e7b3605..82df6aeed61 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/ToolExecutorFactory.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/ToolExecutorFactory.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.tools; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.opencga.core.tools.annotations.ToolExecutor; import org.opencb.opencga.core.exceptions.ToolExecutorException; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java index 50d205720eb..5235186461a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/circos/CircosLocalAnalysisExecutor.java @@ -16,8 +16,8 @@ package org.opencb.opencga.analysis.variant.circos; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.opencb.biodata.models.variant.StudyEntry; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/gwas/GwasLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/gwas/GwasLocalAnalysisExecutor.java index dd55dfbc60c..fd709d6b801 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/gwas/GwasLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/gwas/GwasLocalAnalysisExecutor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.gwas; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.ConsequenceType; import org.opencb.biodata.models.variant.avro.VariantAnnotation; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/julie/JulieTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/julie/JulieTool.java index d095fefab15..dce39c7fde7 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/julie/JulieTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/julie/JulieTool.java @@ -1,6 +1,6 @@ package org.opencb.opencga.analysis.variant.julie; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.tools.OpenCgaTool; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index ce5fdda65c6..5cd419eceeb 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -19,7 +19,7 @@ import com.fasterxml.jackson.core.util.MinimalPrettyPrinter; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.SequenceWriter; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.RegexFileFilter; import org.apache.commons.lang3.StringUtils; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantCatalogQueryUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantCatalogQueryUtils.java index dcf346fb234..f5c5c6300eb 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantCatalogQueryUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantCatalogQueryUtils.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.manager; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.ClinicalProperty; import org.opencb.biodata.models.clinical.Disorder; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java index 435f9b0f5df..e5d724ffbf0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/VariantStorageManager.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.manager; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.opencb.biodata.models.core.Region; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantAnnotationOperationManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantAnnotationOperationManager.java index 702d9ceb617..9326325afff 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantAnnotationOperationManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/manager/operations/VariantAnnotationOperationManager.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.manager.operations; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.core.Region; import org.opencb.commons.datastore.core.ObjectMap; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/metadata/CatalogStorageMetadataSynchronizer.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/metadata/CatalogStorageMetadataSynchronizer.java index 7b24156db48..d2a43a83179 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/metadata/CatalogStorageMetadataSynchronizer.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/metadata/CatalogStorageMetadataSynchronizer.java @@ -20,7 +20,7 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.mongodb.MongoServerException; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.VariantFileMetadata; import org.opencb.commons.datastore.core.ObjectMap; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java index d7e91b0af6f..64c672fbe72 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.mutationalSignature; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.qc.Signature; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java index fd2d6ddcc3f..b2f7d95f04a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureLocalAnalysisExecutor.java @@ -20,7 +20,7 @@ import htsjdk.samtools.reference.FastaSequenceIndex; import htsjdk.samtools.reference.ReferenceSequence; import htsjdk.samtools.util.GZIIndex; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import org.opencb.biodata.models.clinical.qc.MutationalSignature; import org.opencb.biodata.models.clinical.qc.Signature; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/OperationTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/OperationTool.java index 07de48d5f76..c728f568445 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/OperationTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/OperationTool.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.operations; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.tools.OpenCgaTool; import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantFamilyIndexOperationTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantFamilyIndexOperationTool.java index 28dc86d2260..0fc66c8b055 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantFamilyIndexOperationTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantFamilyIndexOperationTool.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.operations; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.Event; import org.opencb.opencga.core.tools.annotations.Tool; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantFileIndexJobLauncherTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantFileIndexJobLauncherTool.java index 35672881a9d..bc04edb2a5a 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantFileIndexJobLauncherTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantFileIndexJobLauncherTool.java @@ -1,6 +1,6 @@ package org.opencb.opencga.analysis.variant.operations; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantSampleIndexOperationTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantSampleIndexOperationTool.java index f97314b7e9b..ff07c35fd8b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantSampleIndexOperationTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantSampleIndexOperationTool.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.operations; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.models.operations.variant.VariantSampleIndexParams; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantStorageMetadataRepairTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantStorageMetadataRepairTool.java index 131af4c1114..2516b7f66f9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantStorageMetadataRepairTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/operations/VariantStorageMetadataRepairTool.java @@ -1,6 +1,6 @@ package org.opencb.opencga.analysis.variant.operations; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.catalog.db.api.StudyDBAdaptor; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/CohortVariantStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/CohortVariantStatsAnalysis.java index 9770103b815..47fe618199e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/CohortVariantStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/CohortVariantStatsAnalysis.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.stats; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.metadata.VariantSetStats; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java index 6cf7f19f0c9..a339e36a5a2 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java @@ -18,8 +18,8 @@ import com.fasterxml.jackson.databind.MappingIterator; import com.fasterxml.jackson.databind.ObjectReader; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalAnalysisUtilsTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalAnalysisUtilsTest.java index f5e970c41f7..016ed11fb89 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalAnalysisUtilsTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalAnalysisUtilsTest.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.clinical; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.RandomStringUtils; import org.opencb.biodata.models.clinical.interpretation.ClinicalVariant; import org.opencb.biodata.models.clinical.interpretation.ClinicalVariantEvidence; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationAnalysisTest.java index 99f1592d1bd..1f4dcc4cb70 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationAnalysisTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationAnalysisTest.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.clinical; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.junit.*; import org.opencb.biodata.models.clinical.ClinicalProperty; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java index 5ccad23cb83..171a4f4b446 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java @@ -18,7 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.ClinicalProperty; import org.opencb.commons.datastore.core.ObjectMap; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ToolsCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ToolsCommandExecutor.java index 1a87f5d06f3..7a0f6b55a6f 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ToolsCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ToolsCommandExecutor.java @@ -1,6 +1,6 @@ package org.opencb.opencga.app.cli.internal.executors; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.analysis.tools.OpenCgaTool; import org.opencb.opencga.analysis.tools.ToolFactory; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java index e205b9ef056..4e5790aea49 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/VariantInternalCommandExecutor.java @@ -22,7 +22,7 @@ import com.fasterxml.jackson.databind.SequenceWriter; import com.fasterxml.jackson.databind.SerializationFeature; import org.apache.avro.generic.GenericRecord; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.commons.datastore.core.DataResult; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java index 3a3a4e04594..cc2abb2042d 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/AuditDBAdaptor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.api; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java index 64a9afa591c..d844699104c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.api; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.opencb.biodata.models.clinical.ClinicalAudit; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FamilyDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FamilyDBAdaptor.java index ba05795abc6..d188640a388 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FamilyDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FamilyDBAdaptor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.api; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FileDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FileDBAdaptor.java index 6182619ffd1..b58c145bc32 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FileDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/FileDBAdaptor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.api; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/IndividualDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/IndividualDBAdaptor.java index eb25f0490c8..1a93197c241 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/IndividualDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/IndividualDBAdaptor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.api; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/InterpretationDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/InterpretationDBAdaptor.java index fc433df538b..39be1ff1226 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/InterpretationDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/InterpretationDBAdaptor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.api; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.opencb.biodata.models.clinical.ClinicalAudit; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java index d124f179b24..9bbc41acc60 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.api; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java index a3e3dca1914..af510dc757e 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/StudyDBAdaptor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.api; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.apache.commons.lang3.NotImplementedException; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java index 9d99c064a19..ba096cd44f5 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/UserDBAdaptor.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.api; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AnnotationMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AnnotationMongoDBAdaptor.java index a551226f353..9d9fd93571a 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AnnotationMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/AnnotationMongoDBAdaptor.java @@ -21,8 +21,8 @@ import com.mongodb.client.model.Filters; import com.mongodb.client.model.Projections; import com.mongodb.client.model.Updates; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.map.LinkedMap; import org.apache.commons.lang3.StringUtils; import org.bson.Document; import org.bson.conversions.Bson; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java index 6c1d8bce18e..ac9fc446a13 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/ClinicalAnalysisManager.java @@ -17,7 +17,7 @@ package org.opencb.opencga.catalog.managers; import com.fasterxml.jackson.core.JsonProcessingException; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.ClinicalAnalyst; import org.opencb.biodata.models.clinical.ClinicalAudit; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java index 65662530a22..fd9c83fd2d8 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/InterpretationManager.java @@ -17,7 +17,7 @@ package org.opencb.opencga.catalog.managers; import com.fasterxml.jackson.core.JsonProcessingException; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.ClinicalAnalyst; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java index b22a45f96d3..46db34e3fa5 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java @@ -17,7 +17,7 @@ package org.opencb.opencga.catalog.managers; import com.fasterxml.jackson.core.JsonProcessingException; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.biodata.models.variant.StudyEntry; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java index 81b6135b4a5..7c44da628b4 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java @@ -17,7 +17,7 @@ package org.opencb.opencga.catalog.managers; import com.fasterxml.jackson.core.JsonProcessingException; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.Event; import org.opencb.commons.datastore.core.ObjectMap; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/CatalogSolrQueryParser.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/CatalogSolrQueryParser.java index 0a3cf855774..9e12c66623c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/CatalogSolrQueryParser.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/CatalogSolrQueryParser.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.stats.solr; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.common.params.CommonParams; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/converters/SolrConverterUtil.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/converters/SolrConverterUtil.java index 82525b61d35..df4c8350ff1 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/converters/SolrConverterUtil.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/converters/SolrConverterUtil.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.stats.solr.converters; -import org.apache.commons.collections.map.HashedMap; +import org.apache.commons.collections4.map.HashedMap; import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; import org.opencb.commons.datastore.core.QueryParam; diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java index dfc4281ea63..2e4b9e1a76b 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java @@ -16,7 +16,7 @@ package org.opencb.opencga.catalog.db.mongodb.converters; -import org.apache.commons.collections.map.HashedMap; +import org.apache.commons.collections4.map.HashedMap; import org.junit.Test; import org.opencb.biodata.models.pedigree.IndividualProperty; import org.opencb.opencga.catalog.stats.solr.SampleSolrModel; diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java b/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java index 6e4692ad5b1..f1ef3f0a219 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/rest/AbstractParentClient.java @@ -21,7 +21,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.media.multipart.FormDataMultiPart; diff --git a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java index 4c866e96e7f..d61abebc239 100644 --- a/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java +++ b/opencga-client/src/main/java/org/opencb/opencga/client/template/TemplateManager.java @@ -16,7 +16,7 @@ package org.opencb.opencga.client.template; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.metadata.Aggregation; diff --git a/opencga-core/pom.xml b/opencga-core/pom.xml index 32c55a3a5eb..f1404591a20 100644 --- a/opencga-core/pom.xml +++ b/opencga-core/pom.xml @@ -55,6 +55,10 @@ httpclient 4.5.6 + + org.apache.commons + commons-collections4 + com.fasterxml.jackson.dataformat jackson-dataformat-yaml diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/exceptions/ToolExecutorException.java b/opencga-core/src/main/java/org/opencb/opencga/core/exceptions/ToolExecutorException.java index 4d8e352b59e..6f5082031be 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/exceptions/ToolExecutorException.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/exceptions/ToolExecutorException.java @@ -16,7 +16,7 @@ package org.opencb.opencga.core.exceptions; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.opencga.core.tools.annotations.ToolExecutor; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyAclEntry.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyAclEntry.java index c58ac3efb49..d59bf45b5d7 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyAclEntry.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/study/StudyAclEntry.java @@ -16,7 +16,7 @@ package org.opencb.opencga.core.models.study; -import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.core.models.AbstractAclEntry; import org.opencb.opencga.core.models.clinical.ClinicalAnalysisAclEntry; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java index 6baecf8d89a..c535547f66a 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/variant/CircosAnalysisParams.java @@ -16,7 +16,7 @@ package org.opencb.opencga.core.models.variant; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.opencga.core.tools.ToolParams; import java.util.List; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/tools/result/ExecutionResultManager.java b/opencga-core/src/main/java/org/opencb/opencga/core/tools/result/ExecutionResultManager.java index cb16abe82cb..cb00f3157b3 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/tools/result/ExecutionResultManager.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/tools/result/ExecutionResultManager.java @@ -19,7 +19,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.ObjectWriter; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.Event; import org.opencb.commons.datastore.core.ObjectMap; diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index 2ee214c9e30..e8d628365ea 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -17,7 +17,7 @@ package org.opencb.opencga.master.monitor.daemons; import com.google.common.base.CaseFormat; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.glassfish.jersey.client.ClientProperties; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java index c417109ab2c..2f533640641 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/AlignmentWebService.java @@ -17,7 +17,7 @@ package org.opencb.opencga.server.rest.analysis; import io.swagger.annotations.*; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.ga4gh.models.ReadAlignment; diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 8d80bcf7bcc..e4caed1b709 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -17,7 +17,7 @@ package org.opencb.opencga.server.rest.analysis; import io.swagger.annotations.*; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; diff --git a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/client/executors/VariantQueryCommandUtils.java b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/client/executors/VariantQueryCommandUtils.java index 14c090b842f..b74fff0a701 100644 --- a/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/client/executors/VariantQueryCommandUtils.java +++ b/opencga-storage/opencga-storage-app/src/main/java/org/opencb/opencga/storage/app/cli/client/executors/VariantQueryCommandUtils.java @@ -16,7 +16,7 @@ package org.opencb.opencga.storage.app.cli.client.executors; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.core.Region; import org.opencb.commons.datastore.core.ObjectMap; diff --git a/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/variant/VariantBenchmarkRunner.java b/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/variant/VariantBenchmarkRunner.java index 3ea7730b164..d1445535332 100644 --- a/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/variant/VariantBenchmarkRunner.java +++ b/opencga-storage/opencga-storage-benchmark/src/main/java/org/opencb/opencga/storage/benchmark/variant/VariantBenchmarkRunner.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.google.common.base.Throwables; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.storage.benchmark.BenchmarkRunner; import org.opencb.opencga.storage.benchmark.variant.generators.FixedQueryGenerator; diff --git a/opencga-storage/opencga-storage-core/pom.xml b/opencga-storage/opencga-storage-core/pom.xml index 5d86a1854ee..2ccea8b974a 100644 --- a/opencga-storage/opencga-storage-core/pom.xml +++ b/opencga-storage/opencga-storage-core/pom.xml @@ -46,6 +46,7 @@ org.opencb.cellbase cellbase-client + com.google.protobuf protobuf-java diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationManager.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationManager.java index 70ee2f62480..92f8967e53e 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationManager.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationManager.java @@ -16,7 +16,7 @@ package org.opencb.opencga.storage.core.variant.annotation; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorFactory.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorFactory.java index c23726f6f67..56ae792480a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorFactory.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorFactory.java @@ -16,7 +16,7 @@ package org.opencb.opencga.storage.core.variant.annotation.annotators; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java index e88f6d64eb2..65bb29c52a8 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.avro.*; import org.opencb.biodata.tools.commons.Converter; @@ -19,6 +19,7 @@ * * @author Jacobo Coll <jacobo167@gmail.com> */ +@Deprecated public class VariantTraitAssociationToEvidenceEntryConverter implements Converter> { protected static Logger logger = LoggerFactory.getLogger(VariantTraitAssociationToEvidenceEntryConverter.class); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java index 6c49ca8da1b..6e42808fe9e 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.core.variant.query; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/projection/VariantQueryProjectionParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/projection/VariantQueryProjectionParser.java index 15921e9031a..00f7c95b28a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/projection/VariantQueryProjectionParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/projection/VariantQueryProjectionParser.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.core.variant.query.projection; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/VariantSearchToVariantConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/VariantSearchToVariantConverter.java index 5cdcf8ebea4..06301249343 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/VariantSearchToVariantConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/VariantSearchToVariantConverter.java @@ -21,8 +21,8 @@ import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.ObjectWriter; import htsjdk.variant.vcf.VCFConstants; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/SolrQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/SolrQueryParser.java index ae369f68ec7..0be9c89f00d 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/SolrQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/SolrQueryParser.java @@ -16,9 +16,9 @@ package org.opencb.opencga.storage.core.variant.search.solr; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang.math.NumberUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java index 2e1e7743eff..aacea1ca1fd 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java @@ -18,7 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.apache.solr.client.solrj.SolrClient; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java index 0e5cb7173e6..5945347e6f7 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/stats/SampleVariantStatsAggregationQuery.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.core.variant.stats; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.apache.commons.lang3.time.StopWatch; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/io/bit/BitStreamTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/io/bit/BitStreamTest.java index 9bcf7f22785..de457b85288 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/io/bit/BitStreamTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/io/bit/BitStreamTest.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.core.io.bit; -import org.apache.commons.lang.math.RandomUtils; +import org.apache.commons.lang3.RandomUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -24,12 +24,12 @@ public class BitStreamTest { @Before public void setUp() throws Exception { - Random random = new Random(2); +// Random random = new Random(2); bits = new byte[LENGTH * Byte.SIZE]; bytes = new byte[LENGTH]; for (int i = 0; i < bits.length; i++) { - bits[i] = (byte) (RandomUtils.nextBoolean(random) ? 1 : 0); + bits[i] = (byte) (RandomUtils.nextBoolean() ? 1 : 0); } for (int i = 0; i < LENGTH; i++) { for (int bit = 0; bit < Byte.SIZE; bit++) { diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/adaptors/VariantDBAdaptorTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/adaptors/VariantDBAdaptorTest.java index cee6ae05019..612231eea86 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/adaptors/VariantDBAdaptorTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/adaptors/VariantDBAdaptorTest.java @@ -20,7 +20,7 @@ import com.google.common.collect.HashMultiset; import com.google.common.collect.Multiset; import htsjdk.variant.variantcontext.VariantContext; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.hamcrest.CoreMatchers; import org.hamcrest.Matcher; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java index 64efea6190d..ab1d55773e4 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java @@ -1,9 +1,9 @@ package org.opencb.opencga.storage.core.variant.search; import htsjdk.variant.vcf.VCFHeader; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.Rule; import org.junit.Test; import org.opencb.biodata.models.variant.Variant; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/utils/AbstractHBaseDataWriter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/utils/AbstractHBaseDataWriter.java index aabde0d46e9..57a812fc707 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/utils/AbstractHBaseDataWriter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/utils/AbstractHBaseDataWriter.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.utils; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/utils/DeleteHBaseColumnDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/utils/DeleteHBaseColumnDriver.java index 0baaa615f30..8a697189f05 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/utils/DeleteHBaseColumnDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/utils/DeleteHBaseColumnDriver.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.utils; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/adaptors/phoenix/VariantSqlQueryParser.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/adaptors/phoenix/VariantSqlQueryParser.java index 566fe51679d..0bbf3513375 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/adaptors/phoenix/VariantSqlQueryParser.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/adaptors/phoenix/VariantSqlQueryParser.java @@ -17,7 +17,7 @@ package org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix; import htsjdk.variant.vcf.VCFConstants; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.tuple.Pair; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/gwas/FisherTestDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/gwas/FisherTestDriver.java index 7c26cc57880..f7ac87e5652 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/gwas/FisherTestDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/analysis/gwas/FisherTestDriver.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.analysis.gwas; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java index 839915df63c..d86a9d40f45 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.introspect.Annotated; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hbase.Cell; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/VariantAnnotationToPhoenixConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/VariantAnnotationToPhoenixConverter.java index 4795aefe293..6fd169736ae 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/VariantAnnotationToPhoenixConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/VariantAnnotationToPhoenixConverter.java @@ -16,7 +16,7 @@ package org.opencb.opencga.storage.hadoop.variant.converters.annotation; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.util.Bytes; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/study/HBaseToStudyEntryConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/study/HBaseToStudyEntryConverter.java index 68a567c309f..7d6744b07b7 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/study/HBaseToStudyEntryConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/study/HBaseToStudyEntryConverter.java @@ -17,7 +17,7 @@ package org.opencb.opencga.storage.hadoop.variant.converters.study; import htsjdk.variant.vcf.VCFConstants; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.hbase.client.Result; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java index 473da5ccf10..2a853ad5dc5 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.annotation; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java index fc245cdde2e..7d8fc6996e2 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/FamilyIndexDriver.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.family; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexEntryIterator.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexEntryIterator.java index a4360f01a65..a8704fb4361 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexEntryIterator.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/family/MendelianErrorSampleIndexEntryIterator.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.family; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.variant.Variant; import org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexEntry; import org.opencb.opencga.storage.hadoop.variant.index.sample.SampleIndexEntry; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleAnnotationIndexQuery.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleAnnotationIndexQuery.java index 39e6eaa57a7..28965943934 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleAnnotationIndexQuery.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleAnnotationIndexQuery.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.query; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java index 1bb69231ecc..864619aa714 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/query/SampleIndexQuery.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.query; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.opencga.storage.hadoop.variant.index.family.GenotypeCodec; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java index 383d7147af8..c98ef9ea8b8 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/AbstractSampleIndexEntryFilter.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.sample; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.mutable.MutableInt; import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.Variant; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java index 584f3936843..32b152c0889 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java @@ -1,7 +1,7 @@ package org.opencb.opencga.storage.hadoop.variant.index.sample; import htsjdk.variant.vcf.VCFConstants; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.StudyEntry; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java index d70c830d000..da5302eca80 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleVariantIndexEntry.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.sample; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAvro; import org.opencb.opencga.storage.hadoop.variant.index.IndexUtils; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/metadata/HBaseVariantMetadataUtils.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/metadata/HBaseVariantMetadataUtils.java index 3e667c11f57..39757175ff2 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/metadata/HBaseVariantMetadataUtils.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/metadata/HBaseVariantMetadataUtils.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.metadata; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.hbase.io.compress.Compression; import org.apache.hadoop.hbase.util.Bytes; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/CheckVariantStatsDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/CheckVariantStatsDriver.java index a51808f3524..091a93eef54 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/CheckVariantStatsDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/CheckVariantStatsDriver.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.stats; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/SampleVariantStatsDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/SampleVariantStatsDriver.java index 84d61458189..0ec14a848b0 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/SampleVariantStatsDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/SampleVariantStatsDriver.java @@ -1,7 +1,7 @@ package org.opencb.opencga.storage.hadoop.variant.stats; import htsjdk.variant.vcf.VCFConstants; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/SaturationStatsDriver.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/SaturationStatsDriver.java index 9c3a9a50922..100f1f7f73d 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/SaturationStatsDriver.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/stats/SaturationStatsDriver.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.stats; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.Cell; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngineSplitDataTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngineSplitDataTest.java index 24736ab2e4d..9cf9f09dcab 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngineSplitDataTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/HadoopVariantStorageEngineSplitDataTest.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.*; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHadoopMultiSampleTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHadoopMultiSampleTest.java index 85c41e0999a..9a29b595693 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHadoopMultiSampleTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/VariantHadoopMultiSampleTest.java @@ -17,7 +17,7 @@ package org.opencb.opencga.storage.hadoop.variant; import com.google.common.collect.Iterators; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java index 30c98e992c5..b88693bc7fd 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.hadoop.variant.index.sample; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.Pair; import org.junit.Before; import org.junit.Test; diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBQueryParser.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBQueryParser.java index b74c425a9ab..e00c0567801 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBQueryParser.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBQueryParser.java @@ -20,7 +20,7 @@ import com.mongodb.DBObject; import com.mongodb.QueryBuilder; import htsjdk.variant.vcf.VCFConstants; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/stats/MongoDBVariantStatsCalculator.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/stats/MongoDBVariantStatsCalculator.java index 8614109b3e1..aa949dfe55d 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/stats/MongoDBVariantStatsCalculator.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/stats/MongoDBVariantStatsCalculator.java @@ -1,6 +1,6 @@ package org.opencb.opencga.storage.mongodb.variant.stats; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bson.Document; import org.opencb.biodata.models.variant.Genotype; import org.opencb.biodata.models.variant.StudyEntry; diff --git a/pom.xml b/pom.xml index bafca7a3472..1e87911e38e 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,7 @@ 2.10.1 2.25.1 + 4.4 1.7.7 3.9.0 1.23.0 @@ -287,6 +288,11 @@ + + org.apache.commons + commons-collections4 + ${collections.version} + com.google.guava guava From 504d0b8c9c028d99ad633fa0df812eeb900072ea Mon Sep 17 00:00:00 2001 From: imedina Date: Sat, 9 Jan 2021 03:05:50 +0000 Subject: [PATCH 013/412] Fix CollectionUtils import --- .../opencga/analysis/clinical/InterpretationAnalysis.java | 2 +- .../clinical/zetta/ZettaInterpretationAnalysis.java | 6 +----- .../opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java | 2 +- .../analysis/variant/relatedness/RelatednessAnalysis.java | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java index 5c3697e46ea..4bdb6322baa 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.clinical; -import com.nimbusds.oauth2.sdk.util.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.opencb.biodata.models.clinical.ClinicalAnalyst; import org.opencb.biodata.models.clinical.interpretation.ClinicalVariant; import org.opencb.biodata.models.clinical.interpretation.DiseasePanel; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/zetta/ZettaInterpretationAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/zetta/ZettaInterpretationAnalysis.java index 1bf516c91c0..fb2dfe3b5c2 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/zetta/ZettaInterpretationAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/zetta/ZettaInterpretationAnalysis.java @@ -18,7 +18,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.nimbusds.oauth2.sdk.util.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.models.clinical.interpretation.DiseasePanel; import org.opencb.biodata.models.clinical.interpretation.InterpretationMethod; @@ -26,18 +25,15 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.clinical.InterpretationAnalysis; import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.core.models.clinical.Interpretation; -import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam; import java.io.FileInputStream; import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Collections; import java.util.List; import static org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils.FAMILY; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 9f92f1c13ee..24916d7f0d2 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.sample.qc; -import com.nimbusds.oauth2.sdk.util.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.biodata.formats.sequence.fastqc.FastQc; import org.opencb.biodata.formats.sequence.fastqc.io.FastQcParser; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/relatedness/RelatednessAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/relatedness/RelatednessAnalysis.java index c1c639b9996..3dadeea2fb0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/relatedness/RelatednessAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/relatedness/RelatednessAnalysis.java @@ -16,7 +16,7 @@ package org.opencb.opencga.analysis.variant.relatedness; -import com.nimbusds.oauth2.sdk.util.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.opencb.opencga.analysis.individual.qc.IndividualQcUtils; import org.opencb.opencga.analysis.tools.OpenCgaTool; From 95ea63dc475891ea4a9777e236c5cc0c63057eca Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 11 Jan 2021 16:40:45 +0100 Subject: [PATCH 014/412] storage: rga work in progress, #1693 --- .../rest/analysis/VariantWebService.java | 2 +- .../storage/core/rga/GeneRgaConverter.java | 2 +- .../core/rga/IndividualRgaConverter.java | 16 +- .../storage/core/rga/RgaDataModel.java | 211 +++++++++++--- .../opencga/storage/core/rga/RgaEngine.java | 18 ++ .../storage/core/rga/RgaQueryParams.java | 4 +- .../storage/core/rga/RgaQueryParser.java | 267 ++++++++++++++---- .../opencga/storage/core/rga/RgaUtils.java | 28 +- .../src/main/resources/rga/managed-schema | 37 +-- .../storage/core/rga/RgaEngineTest.java | 3 + .../storage/core/rga/RgaQueryParserTest.java | 71 ++++- 11 files changed, 521 insertions(+), 138 deletions(-) diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index f24f8b12440..6225535fb5c 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -191,7 +191,7 @@ public VariantWebService(String apiVersion, @Context UriInfo uriInfo, @Context H @ApiImplicitParam(name = "geneId", value = GENE_ID_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "geneName", value = GENE_NAME_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "transcriptId", value = TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), - @ApiImplicitParam(name = "biotype", value = BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "biotype", value = TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "variants", value = VARIANTS_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "knockout", value = KNOCKOUT_DESCR, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java index d2d5ad613df..7320d96cac4 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java @@ -56,7 +56,7 @@ public List convertToDataModelType(List rgaDataMod // Add new transcript KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId()); - knockoutTranscript.setBiotype(rgaDataModel.getBiotype()); + knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); knockoutIndividual.addTranscripts(Collections.singletonList(knockoutTranscript)); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index 552e8033800..8005f9831d9 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -92,7 +92,7 @@ public List convertToDataModelType(List rgaD KnockoutTranscript knockoutTranscript = new KnockoutTranscript(rgaDataModel.getTranscriptId()); knockoutGene.addTranscripts(Collections.singletonList(knockoutTranscript)); - knockoutTranscript.setBiotype(rgaDataModel.getBiotype()); + knockoutTranscript.setBiotype(rgaDataModel.getTranscriptBiotype()); List knockoutVariantList = new LinkedList<>(); for (String variantJson : rgaDataModel.getVariantJson()) { try { @@ -169,10 +169,10 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI Map> popFreqs = getPopulationFrequencies(transcript); String id = knockoutByIndividual.getId() + "_" + gene.getId() + "_" + transcript.getId(); - RgaDataModel model = new RgaDataModel(id, knockoutByIndividual.getSampleId(), knockoutByIndividual.getId(), - knockoutByIndividual.getSex().name(), phenotypes, disorders, gene.getId(), gene.getName(), transcript.getId(), - transcript.getBiotype(), variantIds, knockoutTypes, filters, consequenceTypes, popFreqs, compoundFilters, - phenotypeJson, disorderJson, variantJson); + RgaDataModel model = new RgaDataModel(id, knockoutByIndividual.getId(), knockoutByIndividual.getSampleId(), + knockoutByIndividual.getSex().name(), phenotypes, disorders, gene.getId(), gene.getName(), "", "", "", 0, 0, + transcript.getId(), transcript.getBiotype(), variantIds, knockoutTypes, filters, consequenceTypes, popFreqs, + compoundFilters, phenotypeJson, disorderJson, variantJson); result.add(model); } } @@ -184,8 +184,10 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI private Map> getPopulationFrequencies(KnockoutTranscript transcript) { Map> popFreqs = new HashMap<>(); - String thousandGenomeKey = "popFreqs" + RgaUtils.SEPARATOR + RgaUtils.THOUSAND_GENOMES_STUDY; - String gnomadGenomeKey = "popFreqs" + RgaUtils.SEPARATOR + RgaUtils.GNOMAD_GENOMES_STUDY; + String pfKey = RgaDataModel.POPULATION_FREQUENCIES.replace("*", ""); + + String thousandGenomeKey = pfKey + RgaUtils.THOUSAND_GENOMES_STUDY; + String gnomadGenomeKey = pfKey + RgaUtils.GNOMAD_GENOMES_STUDY; if (!transcript.getVariants().isEmpty()) { popFreqs.put(thousandGenomeKey, new ArrayList<>(transcript.getVariants().size())); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java index 52373749df5..d0a17a5e0eb 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java @@ -2,86 +2,163 @@ import org.apache.solr.client.solrj.beans.Field; +import java.util.HashMap; import java.util.List; import java.util.Map; public class RgaDataModel { - @Field + @Field(ID) private String id; - @Field("indId") + @Field(INDIVIDUAL_ID) private String individualId; - @Field + @Field(SAMPLE_ID) private String sampleId; - @Field + @Field(SEX) private String sex; - @Field("pheno") + @Field(PHENOTYPES) private List phenotypes; - @Field("disor") + @Field(DISORDERS) private List disorders; - @Field + @Field(GENE_ID) private String geneId; - @Field + @Field(GENE_NAME) private String geneName; - @Field("transcId") + @Field(GENE_BIOTYPE) + private String geneBiotype; + + @Field(CHROMOSOME) + private String chromosome; + + @Field(STRAND) + private String strand; + + @Field(START) + private int start; + + @Field(END) + private int end; + + @Field(TRANSCRIPT_ID) private String transcriptId; - @Field - private String biotype; + @Field(TRANSCRIPT_BIOTYPE) + private String transcriptBiotype; - @Field + @Field(VARIANTS) private List variants; - @Field("koTypes") + @Field(KNOCKOUT_TYPES) private List knockoutTypes; - @Field + @Field(FILTERS) private List filters; - @Field("ct") + @Field(CONSEQUENCE_TYPES) private List consequenceTypes; - @Field("popFreqs_*") + @Field(POPULATION_FREQUENCIES) private Map> populationFrequencies; - @Field("cFilters") + @Field(COMPOUND_FILTERS) private List compoundFilters; - @Field("pheJson") + @Field(PHENOTYPE_JSON) private List phenotypeJson; - @Field("disJson") + @Field(DISORDER_JSON) private List disorderJson; - @Field("varJson") + @Field(VARIANT_JSON) private List variantJson; + public static final String ID = "id"; + public static final String INDIVIDUAL_ID = "iId"; + public static final String SAMPLE_ID = "sId"; + public static final String SEX = "sex"; + public static final String PHENOTYPES = "pheno"; + public static final String DISORDERS = "dis"; + public static final String GENE_ID = "gId"; + public static final String GENE_NAME = "gName"; + public static final String GENE_BIOTYPE = "gBio"; + public static final String CHROMOSOME = "chr"; + public static final String STRAND = "str"; + public static final String START = "start"; + public static final String END = "end"; + public static final String TRANSCRIPT_ID = "tId"; + public static final String TRANSCRIPT_BIOTYPE = "tBio"; + public static final String VARIANTS = "var"; + public static final String KNOCKOUT_TYPES = "ko"; + public static final String FILTERS = "fl"; + public static final String CONSEQUENCE_TYPES = "ct"; + public static final String POPULATION_FREQUENCIES = "pf_*"; + public static final String COMPOUND_FILTERS = "cF"; + public static final String PHENOTYPE_JSON = "phenoJ"; + public static final String DISORDER_JSON = "disJ"; + public static final String VARIANT_JSON = "varJ"; + + public static final Map ABBREVIATIONS; + + static { + ABBREVIATIONS = new HashMap<>(); + + ABBREVIATIONS.put(ID, "id"); + ABBREVIATIONS.put(INDIVIDUAL_ID, "individualId"); + ABBREVIATIONS.put(SAMPLE_ID, "sampleId"); + ABBREVIATIONS.put(SEX, "sex"); + ABBREVIATIONS.put(PHENOTYPES, "phenotypes"); + ABBREVIATIONS.put(DISORDERS, "disorders"); + ABBREVIATIONS.put(GENE_ID, "geneId"); + ABBREVIATIONS.put(GENE_NAME, "geneName"); + ABBREVIATIONS.put(GENE_BIOTYPE, "geneBiotype"); + ABBREVIATIONS.put(CHROMOSOME, "chromosome"); + ABBREVIATIONS.put(STRAND, "strand"); + ABBREVIATIONS.put(START, "start"); + ABBREVIATIONS.put(END, "end"); + ABBREVIATIONS.put(TRANSCRIPT_ID, "transcriptId"); + ABBREVIATIONS.put(TRANSCRIPT_BIOTYPE, "tbiotype"); + ABBREVIATIONS.put(VARIANTS, "variants"); + ABBREVIATIONS.put(KNOCKOUT_TYPES, "knockoutTypes"); + ABBREVIATIONS.put(FILTERS, "filters"); + ABBREVIATIONS.put(CONSEQUENCE_TYPES, "consequenceTypes"); + ABBREVIATIONS.put(POPULATION_FREQUENCIES, "populationFrequencies"); + ABBREVIATIONS.put(COMPOUND_FILTERS, "compoundFilters"); + ABBREVIATIONS.put(PHENOTYPE_JSON, "phenotypeJson"); + ABBREVIATIONS.put(DISORDER_JSON, "disorderJson"); + ABBREVIATIONS.put(VARIANT_JSON, "variantJson"); + } + public RgaDataModel() { } - public RgaDataModel(String id, String sampleId, String individualId, String sex, List phenotypes, List disorders, - String geneId, String geneName, String transcriptId, String biotype, List variants, - List knockoutTypes, List filters, List consequenceTypes, - Map> populationFrequencies, List compoundFilters, List phenotypeJson, - List disorderJson, List variantJson) { + public RgaDataModel(String id, String individualId, String sampleId, String sex, List phenotypes, List disorders, + String geneId, String geneName, String geneBiotype, String chromosome, String strand, int start, int end, + String transcriptId, String transcriptBiotype, List variants, List knockoutTypes, + List filters, List consequenceTypes, Map> populationFrequencies, + List compoundFilters, List phenotypeJson, List disorderJson, List variantJson) { this.id = id; - this.sampleId = sampleId; this.individualId = individualId; + this.sampleId = sampleId; this.sex = sex; this.phenotypes = phenotypes; this.disorders = disorders; this.geneId = geneId; this.geneName = geneName; + this.geneBiotype = geneBiotype; + this.chromosome = chromosome; + this.strand = strand; + this.start = start; + this.end = end; this.transcriptId = transcriptId; - this.biotype = biotype; + this.transcriptBiotype = transcriptBiotype; this.variants = variants; this.knockoutTypes = knockoutTypes; this.filters = filters; @@ -104,13 +181,22 @@ public String toString() { sb.append(", disorders=").append(disorders); sb.append(", geneId='").append(geneId).append('\''); sb.append(", geneName='").append(geneName).append('\''); + sb.append(", geneBiotype='").append(geneBiotype).append('\''); + sb.append(", chromosome='").append(chromosome).append('\''); + sb.append(", strand='").append(strand).append('\''); + sb.append(", start=").append(start); + sb.append(", end=").append(end); sb.append(", transcriptId='").append(transcriptId).append('\''); - sb.append(", biotype='").append(biotype).append('\''); + sb.append(", transcriptBiotype='").append(transcriptBiotype).append('\''); sb.append(", variants=").append(variants); sb.append(", knockoutTypes=").append(knockoutTypes); sb.append(", filters=").append(filters); sb.append(", consequenceTypes=").append(consequenceTypes); sb.append(", populationFrequencies=").append(populationFrequencies); + sb.append(", compoundFilters=").append(compoundFilters); + sb.append(", phenotypeJson=").append(phenotypeJson); + sb.append(", disorderJson=").append(disorderJson); + sb.append(", variantJson=").append(variantJson); sb.append('}'); return sb.toString(); } @@ -124,21 +210,21 @@ public RgaDataModel setId(String id) { return this; } - public String getSampleId() { - return sampleId; + public String getIndividualId() { + return individualId; } - public RgaDataModel setSampleId(String sampleId) { - this.sampleId = sampleId; + public RgaDataModel setIndividualId(String individualId) { + this.individualId = individualId; return this; } - public String getIndividualId() { - return individualId; + public String getSampleId() { + return sampleId; } - public RgaDataModel setIndividualId(String individualId) { - this.individualId = individualId; + public RgaDataModel setSampleId(String sampleId) { + this.sampleId = sampleId; return this; } @@ -187,6 +273,51 @@ public RgaDataModel setGeneName(String geneName) { return this; } + public String getGeneBiotype() { + return geneBiotype; + } + + public RgaDataModel setGeneBiotype(String geneBiotype) { + this.geneBiotype = geneBiotype; + return this; + } + + public String getChromosome() { + return chromosome; + } + + public RgaDataModel setChromosome(String chromosome) { + this.chromosome = chromosome; + return this; + } + + public String getStrand() { + return strand; + } + + public RgaDataModel setStrand(String strand) { + this.strand = strand; + return this; + } + + public int getStart() { + return start; + } + + public RgaDataModel setStart(int start) { + this.start = start; + return this; + } + + public int getEnd() { + return end; + } + + public RgaDataModel setEnd(int end) { + this.end = end; + return this; + } + public String getTranscriptId() { return transcriptId; } @@ -196,12 +327,12 @@ public RgaDataModel setTranscriptId(String transcriptId) { return this; } - public String getBiotype() { - return biotype; + public String getTranscriptBiotype() { + return transcriptBiotype; } - public RgaDataModel setBiotype(String biotype) { - this.biotype = biotype; + public RgaDataModel setTranscriptBiotype(String transcriptBiotype) { + this.transcriptBiotype = transcriptBiotype; return this; } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index d829b53d6cf..552323ac37d 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -382,6 +382,24 @@ public DataResult facetedQuery(String collection, Query query, Query SolrQuery solrQuery = queryParser.parse(query, queryOptions); SolrCollection solrCollection = solrManager.getCollection(collection); + /* + * try { + FacetQueryParser facetQueryParser = new FacetQueryParser(); + + String facetQuery = parseFacet(queryOptions.getString(QueryOptions.FACET)); + String jsonFacet = facetQueryParser.parse(facetQuery); + + solrQuery.set("json.facet", jsonFacet); + solrQuery.setRows(0); + solrQuery.setStart(0); + solrQuery.setFields(); + + logger.debug(">>>>>> Solr Facet: " + solrQuery.toString()); + } catch (Exception e) { + throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Solr parse exception: " + e.getMessage(), e); + } + * */ + DataResult facetResult; try { facetResult = solrCollection.facet(solrQuery, null); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java index f4a28383491..a2ff0e896b8 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java @@ -37,8 +37,8 @@ public class RgaQueryParams implements QueryParam { public static final String TRANSCRIPT_ID_DESCR = "Filter by transcript id."; public static final RgaQueryParams TRANSCRIPT_ID = new RgaQueryParams("transcriptId", Type.TEXT, TRANSCRIPT_ID_DESCR); - public static final String BIOTYPE_DESCR = "Filter by biotype."; - public static final RgaQueryParams BIOTYPE = new RgaQueryParams("biotype", Type.TEXT, BIOTYPE_DESCR); + public static final String TRANSCRIPT_BIOTYPE_DESCR = "Filter by transcript biotype."; + public static final RgaQueryParams TRANSCRIPT_BIOTYPE = new RgaQueryParams("tbiotype", Type.TEXT, TRANSCRIPT_BIOTYPE_DESCR); public static final String VARIANTS_DESCR = "Filter by variant id."; public static final RgaQueryParams VARIANTS = new RgaQueryParams("variants", Type.TEXT_ARRAY, VARIANTS_DESCR); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java index 4b47f8fc547..947fc2c57d1 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java @@ -108,16 +108,16 @@ public SolrQuery parse(Query query, QueryOptions queryOptions) throws RgaExcepti // Query processing //------------------------------------- - parseStringValue(query, SAMPLE_ID, SAMPLE_ID.key(), filterList); - parseStringValue(query, INDIVIDUAL_ID, "indId", filterList); - parseStringValue(query, SEX, SEX.key(), filterList); - parseStringValue(query, PHENOTYPES, "pheno", filterList); - parseStringValue(query, DISORDERS, "disor", filterList); - parseStringValue(query, GENE_ID, GENE_ID.key(), filterList); - parseStringValue(query, GENE_NAME, GENE_NAME.key(), filterList); - parseStringValue(query, TRANSCRIPT_ID, "transcId", filterList); - parseStringValue(query, BIOTYPE, "biotype", filterList); - parseStringValue(query, VARIANTS, "variants", filterList); + parseStringValue(query, SAMPLE_ID, RgaDataModel.SAMPLE_ID, filterList); + parseStringValue(query, INDIVIDUAL_ID, RgaDataModel.INDIVIDUAL_ID, filterList); + parseStringValue(query, SEX, RgaDataModel.SEX, filterList); + parseStringValue(query, PHENOTYPES, RgaDataModel.PHENOTYPES, filterList); + parseStringValue(query, DISORDERS, RgaDataModel.DISORDERS, filterList); + parseStringValue(query, GENE_ID, RgaDataModel.GENE_ID, filterList); + parseStringValue(query, GENE_NAME, RgaDataModel.GENE_NAME, filterList); + parseStringValue(query, TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_ID, filterList); + parseStringValue(query, TRANSCRIPT_BIOTYPE, RgaDataModel.TRANSCRIPT_BIOTYPE, filterList); + parseStringValue(query, VARIANTS, RgaDataModel.VARIANTS, filterList); parseFilterValue(query, filterList); // Create Solr query, adding filter queries and fields to show @@ -134,61 +134,176 @@ private void parseFilterValue(Query query, List filterList) throws RgaEx List knockoutValues = query.getAsStringList(KNOCKOUT.key()); String filterValue = query.getString(FILTER.key()); List ctValues = query.getAsStringList(CONSEQUENCE_TYPE.key()); - List popFreqValues = query.getAsStringList(POPULATION_FREQUENCY.key()); - - if (ctValues.isEmpty() && !popFreqValues.isEmpty()) { - throw new RgaException("Filtering by '" + CONSEQUENCE_TYPE.key() + "' is mandatory when filtering by '" - + POPULATION_FREQUENCY.key() + "'"); - } - - List> filters = new LinkedList<>(); - - // Pop. freq - List> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); - for (List sublist : popFreqQueryList) { - replicateFilters(filters, sublist.size()); - addFilterValues(filters, sublist); + List popFreqValues = query.getAsStringList(POPULATION_FREQUENCY.key(), ";"); + + int count = 0; + count += knockoutValues.isEmpty() ? 0 : 1; + count += StringUtils.isEmpty(filterValue) ? 0 : 1; + count += ctValues.isEmpty() ? 0 : 1; + count += popFreqValues.isEmpty() ? 0 : 1; + + if (count == 1) { + // Simple filter + parseStringValue(query, KNOCKOUT, RgaDataModel.KNOCKOUT_TYPES, filterList); + parseStringValue(query, FILTER, RgaDataModel.FILTERS, filterList); + parseStringValue(query, CONSEQUENCE_TYPE, RgaDataModel.CONSEQUENCE_TYPES, filterList); + + if (!popFreqValues.isEmpty()) { + List> encodedPopFreqs = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); + + List popFreqList = new ArrayList<>(encodedPopFreqs.size()); + for (List encodedPopFreq : encodedPopFreqs) { + parseStringValue(encodedPopFreq, "", popFreqList, "||"); + } + // TODO: The pop freq key is dynamic + parseStringValue(popFreqList, RgaDataModel.POPULATION_FREQUENCIES, filterList, "&&"); + } + } else if (count > 1) { + // Complex filter + buildComplexQueryFilter(filterList, knockoutValues, filterValue, ctValues, popFreqValues); } + } - // CT - if (!ctValues.isEmpty()) { - List encodedCTValues = new ArrayList<>(ctValues.size()); - for (String ctValue : ctValues) { - String encodedValue = String.valueOf(VariantQueryUtils.parseConsequenceType(ctValue)); - encodedCTValues.add(encodedValue); - } - replicateFilters(filters, encodedCTValues.size()); - addFilterValues(filters, encodedCTValues); + private void buildComplexQueryFilter(List filterList, List knockoutList, String filterValue, List ctList, + List popFreqList) throws RgaException { + // KT + List koValues; + if (knockoutList.isEmpty()) { + koValues = Arrays.asList(COMP_HET.name(), DELETION_OVERLAP.name(), HET_ALT.name(), HOM_ALT.name()); + } else { + koValues = knockoutList; } + koValues = RgaUtils.parseKnockoutTypeQuery(koValues); // Filter List filterValues; - if (StringUtils.isNotEmpty(filterValue)) { - filterValues = Collections.singletonList(filterValue); + if (StringUtils.isEmpty(filterValue)) { + filterValues = Arrays.asList("PASS", "NOT_PASS"); } else { - if (!filters.isEmpty()) { - filterValues = Arrays.asList("PASS", "NOT_PASS"); - } else { - filterValues = Collections.emptyList(); - } + filterValues = Collections.singletonList(filterValue); } filterValues = RgaUtils.parseFilterQuery(filterValues); - replicateFilters(filters, filterValues.size()); - addFilterValues(filters, filterValues); - // KT - if (knockoutValues.isEmpty() && !filters.isEmpty()) { - knockoutValues = Arrays.asList(COMP_HET.name(), DELETION_OVERLAP.name(), HET_ALT.name(), HOM_ALT.name()); + // CT + List ctValues; + if (!ctList.isEmpty()) { + ctValues = new ArrayList<>(ctList.size()); + for (String ctValue : ctList) { + String encodedValue = String.valueOf(VariantQueryUtils.parseConsequenceType(ctValue)); + ctValues.add(encodedValue); + } + } else { + ctValues = Collections.emptyList(); } - knockoutValues = RgaUtils.parseKnockoutTypeQuery(knockoutValues); - replicateFilters(filters, knockoutValues.size()); - addFilterValues(filters, knockoutValues); - if (!filters.isEmpty()) { - filterList.add("cFilters:" + parseQueryFilter(filters)); + // Pop. freq + List> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqList); + + if (ctValues.isEmpty() && popFreqQueryList.isEmpty()) { + // KT + FILTER + List orFilterList = new LinkedList<>(); + for (String koValue : koValues) { + for (String filterVal : filterValues) { + orFilterList.add(koValue + SEPARATOR + filterVal); + } + } + parseStringValue(orFilterList, RgaDataModel.COMPOUND_FILTERS, filterList, "||"); + } else if (!ctValues.isEmpty() && !popFreqQueryList.isEmpty()) { + // KT + FILTER + CT + POP_FREQ + List andQueryList = new ArrayList<>(popFreqQueryList.size()); + for (List tmpPopFreqList : popFreqQueryList) { + List orQueryList = new LinkedList<>(); + for (String popFreq : tmpPopFreqList) { + for (String koValue : koValues) { + for (String filterVal : filterValues) { + for (String ctValue : ctValues) { + orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + ctValue + SEPARATOR + popFreq); + } + } + } + } + parseStringValue(orQueryList, "", andQueryList, "||"); + } + parseStringValue(andQueryList, RgaDataModel.COMPOUND_FILTERS, filterList, "&&"); + } else if (!ctValues.isEmpty()) { + // KT + FILTER + CT + List orFilterList = new LinkedList<>(); + for (String koValue : koValues) { + for (String filterVal : filterValues) { + for (String ctValue : ctValues) { + orFilterList.add(koValue + SEPARATOR + filterVal + SEPARATOR + ctValue); + } + } + } + parseStringValue(orFilterList, RgaDataModel.COMPOUND_FILTERS, filterList, "||"); + } else { // POP_FREQ not empty + // KT + FILTER + POP_FREQ + List andQueryList = new ArrayList<>(popFreqQueryList.size()); + for (List tmpPopFreqList : popFreqQueryList) { + List orQueryList = new LinkedList<>(); + for (String popFreq : tmpPopFreqList) { + for (String koValue : koValues) { + for (String filterVal : filterValues) { + orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + popFreq); + } + } + } + parseStringValue(orQueryList, "", andQueryList, "||"); + } + parseStringValue(andQueryList, RgaDataModel.COMPOUND_FILTERS, filterList, "&&"); } } +// private void buildComplexQueryFilter(List filterList, List knockoutValues, String filterValue, List ctValues, +// List popFreqValues) throws RgaException { +// List> filters = new LinkedList<>(); +// +// // Pop. freq +// List> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); +// for (List sublist : popFreqQueryList) { +// replicateFilters(filters, sublist.size()); +// addFilterValues(filters, sublist); +// } +// +// // CT +// if (!ctValues.isEmpty()) { +// List encodedCTValues = new ArrayList<>(ctValues.size()); +// for (String ctValue : ctValues) { +// String encodedValue = String.valueOf(VariantQueryUtils.parseConsequenceType(ctValue)); +// encodedCTValues.add(encodedValue); +// } +// replicateFilters(filters, encodedCTValues.size()); +// addFilterValues(filters, encodedCTValues); +// } +// +// // Filter +// List filterValues; +// if (StringUtils.isNotEmpty(filterValue)) { +// filterValues = Collections.singletonList(filterValue); +// } else { +// if (!filters.isEmpty()) { +// filterValues = Arrays.asList("PASS", "NOT_PASS"); +// } else { +// filterValues = Collections.emptyList(); +// } +// } +// filterValues = RgaUtils.parseFilterQuery(filterValues); +// replicateFilters(filters, filterValues.size()); +// addFilterValues(filters, filterValues); +// +// // KT +// if (knockoutValues.isEmpty() && !filters.isEmpty()) { +// knockoutValues = Arrays.asList(COMP_HET.name(), DELETION_OVERLAP.name(), HET_ALT.name(), HOM_ALT.name()); +// } +// knockoutValues = RgaUtils.parseKnockoutTypeQuery(knockoutValues); +// replicateFilters(filters, knockoutValues.size()); +// addFilterValues(filters, knockoutValues); +// +// if (!filters.isEmpty()) { +// filterList.add("cF:" + parseQueryFilter(filters)); +// } +// } + private void addFilterValues(List> filters, List values) { int size = values.size(); for (int i = 0; i < filters.size(); i += size) { @@ -227,11 +342,37 @@ private void replicateFilters(List> filters, int size) { } private void parseStringValue(Query query, RgaQueryParams queryParam, String storageKey, List filterList) { + parseStringValue(query, queryParam, storageKey, filterList, "||"); + } + + private void parseStringValue(Query query, RgaQueryParams queryParam, String storageKey, List filterList, String opSeparator) { if (StringUtils.isNotEmpty(query.getString(queryParam.key()))) { - filterList.add(storageKey + ":( " + StringUtils.join(query.getAsStringList(queryParam.key()), " || ") + " )"); + List escapedValues = escapeValues(query.getAsStringList(queryParam.key())); + parseStringValue(escapedValues, storageKey, filterList, opSeparator); } } + private void parseStringValue(List values, String storageKey, List filterList, String opSeparator) { + String separator = " " + opSeparator + " "; + + if (!values.isEmpty()) { + String value = values.size() == 1 ? values.get(0) : "( " + StringUtils.join(values, separator) + " )"; + if (StringUtils.isNotEmpty(storageKey)) { + filterList.add(storageKey + ":" + value); + } else { + filterList.add(value); + } + } + } + + private List escapeValues(List values) { + List result = new ArrayList<>(values.size()); + for (String value : values) { + result.add(value.replace(":", "\\:")); + } + return result; + } + private String parseFacet(String facetQuery) { StringBuilder sb = new StringBuilder(); String[] facets = facetQuery.split(FacetQueryParser.FACET_SEPARATOR); @@ -259,7 +400,7 @@ private String parseFacet(String facetQuery) { return sb.toString(); } - private String parseQueryFilter(List> filters) { + private String parseQueryFilter(List filters) { StringBuilder builder = new StringBuilder(); if (filters.size() > 1) { builder.append("( "); @@ -268,8 +409,7 @@ private String parseQueryFilter(List> filters) { if (i != 0) { builder.append("|| "); } - List filter = filters.get(i); - builder.append(StringUtils.join(filter, SEPARATOR)).append(" "); + builder.append(filters.get(i)).append(" "); } if (filters.size() > 1) { builder.append(")"); @@ -278,6 +418,25 @@ private String parseQueryFilter(List> filters) { return builder.toString(); } +// private String parseQueryFilter(List> filters) { +// StringBuilder builder = new StringBuilder(); +// if (filters.size() > 1) { +// builder.append("( "); +// } +// for (int i = 0; i < filters.size(); i++) { +// if (i != 0) { +// builder.append("|| "); +// } +// List filter = filters.get(i); +// builder.append(StringUtils.join(filter, SEPARATOR)).append(" "); +// } +// if (filters.size() > 1) { +// builder.append(")"); +// } +// +// return builder.toString(); +// } + // private String parseFacet(String facet, String categoryName) { // if (facet.contains("(")) { // // Aggregation function diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java index a37c961607c..ba7e4a9e1e4 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java @@ -117,31 +117,27 @@ static List> parsePopulationFrequencyQuery(List filters) th float value = Float.parseFloat(keyOpValue.getValue()); switch (keyOpValue.getOp()) { case "<": - for (Float popFreq : POP_FREQS) { - if (popFreq < value) { - values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); - } + for (int i = 0; POP_FREQS.get(i) < value; i++) { + Float popFreq = POP_FREQS.get(i); + values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); } break; case "<=": - for (Float popFreq : POP_FREQS) { - if (popFreq <= value) { - values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); - } + for (int i = 0; POP_FREQS.get(i) <= value; i++) { + Float popFreq = POP_FREQS.get(i); + values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); } break; case ">": - for (Float popFreq : POP_FREQS) { - if (popFreq > value) { - values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); - } + for (int i = POP_FREQS.size() - 1; POP_FREQS.get(i) > value; i--) { + Float popFreq = POP_FREQS.get(i); + values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); } break; case ">=": - for (Float popFreq : POP_FREQS) { - if (popFreq >= value) { - values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); - } + for (int i = POP_FREQS.size() - 1; POP_FREQS.get(i) >= value; i--) { + Float popFreq = POP_FREQS.get(i); + values.add(encode(keyOpValue.getKey().toUpperCase() + SEPARATOR + popFreq)); } break; default: diff --git a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema index 50112866a76..790a520ac07 100644 --- a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema +++ b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema @@ -568,29 +568,34 @@ - - + + - - - - - - - - + + + + + + + + + + + + + - - - - + + + + - + - + \ No newline at end of file diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java index 0f5f3c3092f..0705f79c811 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java @@ -58,6 +58,9 @@ public void testIndividualQuery() throws Exception { JacksonUtils.getDefaultObjectMapper().writeValueAsString(result.getResults().get(i))); } + result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); + assertEquals(2, result.getNumResults()); + Query query = new Query(RgaQueryParams.DISORDERS.key(), "disorderId1"); result = rgaEngine.individualQuery(collection, query, new QueryOptions()); assertEquals(1, result.getNumResults()); diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java index 80fcded90e1..f64380e39f0 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java @@ -5,6 +5,7 @@ import org.junit.Test; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.storage.core.exceptions.RgaException; import static org.junit.Assert.*; @@ -22,7 +23,75 @@ public void setUp() throws Exception { public void parse() throws RgaException { Query query = new Query(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001"); SolrQuery parse = parser.parse(query, QueryOptions.empty()); - assertNotNull(parse); + assertEquals(RgaDataModel.POPULATION_FREQUENCIES + ":( P1-1 || P1-2 || P1-3 || P1-4 || P1-5 || P1-6 || P1-7 )", parse.get("fq")); + query = new Query(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + + RgaUtils.GNOMAD_GENOMES_STUDY + ">0.5"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.POPULATION_FREQUENCIES + ":( ( P1-1 || P1-2 || P1-3 || P1-4 || P1-5 || P1-6 || P1-7 ) && P2-17 )", parse.get("fq")); + + query = new Query(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.5"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.POPULATION_FREQUENCIES + ":( ( P1-1 || P1-2 || P1-3 || P1-4 || P1-5 || P1-6 || P1-7 ) && ( P2-17 || P2-16 ) )", parse.get("fq")); + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.CONSEQUENCE_TYPES + ":( SO\\:0001891 || SO\\:0001822 )", parse.get("fq")); + + query = new Query(RgaQueryParams.FILTER.key(), "PASS"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.FILTERS + ":PASS", parse.get("fq")); + + query = new Query(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.KNOCKOUT_TYPES + ":( HOM_ALT || HET_ALT )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.5") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( CH__P__1891__P1-1 || CH__P__1822__P1-1 || CH__NP__1891__P1-1 || CH__NP__1822__P1-1 || DO__P__1891__P1-1 || DO__P__1822__P1-1 || DO__NP__1891__P1-1 || DO__NP__1822__P1-1 || HEA__P__1891__P1-1 || HEA__P__1822__P1-1 || HEA__NP__1891__P1-1 || HEA__NP__1822__P1-1 || HOA__P__1891__P1-1 || HOA__P__1822__P1-1 || HOA__NP__1891__P1-1 || HOA__NP__1822__P1-1 || CH__P__1891__P1-2 || CH__P__1822__P1-2 || CH__NP__1891__P1-2 || CH__NP__1822__P1-2 || DO__P__1891__P1-2 || DO__P__1822__P1-2 || DO__NP__1891__P1-2 || DO__NP__1822__P1-2 || HEA__P__1891__P1-2 || HEA__P__1822__P1-2 || HEA__NP__1891__P1-2 || HEA__NP__1822__P1-2 || HOA__P__1891__P1-2 || HOA__P__1822__P1-2 || HOA__NP__1891__P1-2 || HOA__NP__1822__P1-2 || CH__P__1891__P1-3 || CH__P__1822__P1-3 || CH__NP__1891__P1-3 || CH__NP__1822__P1-3 || DO__P__1891__P1-3 || DO__P__1822__P1-3 || DO__NP__1891__P1-3 || DO__NP__1822__P1-3 || HEA__P__1891__P1-3 || HEA__P__1822__P1-3 || HEA__NP__1891__P1-3 || HEA__NP__1822__P1-3 || HOA__P__1891__P1-3 || HOA__P__1822__P1-3 || HOA__NP__1891__P1-3 || HOA__NP__1822__P1-3 || CH__P__1891__P1-4 || CH__P__1822__P1-4 || CH__NP__1891__P1-4 || CH__NP__1822__P1-4 || DO__P__1891__P1-4 || DO__P__1822__P1-4 || DO__NP__1891__P1-4 || DO__NP__1822__P1-4 || HEA__P__1891__P1-4 || HEA__P__1822__P1-4 || HEA__NP__1891__P1-4 || HEA__NP__1822__P1-4 || HOA__P__1891__P1-4 || HOA__P__1822__P1-4 || HOA__NP__1891__P1-4 || HOA__NP__1822__P1-4 || CH__P__1891__P1-5 || CH__P__1822__P1-5 || CH__NP__1891__P1-5 || CH__NP__1822__P1-5 || DO__P__1891__P1-5 || DO__P__1822__P1-5 || DO__NP__1891__P1-5 || DO__NP__1822__P1-5 || HEA__P__1891__P1-5 || HEA__P__1822__P1-5 || HEA__NP__1891__P1-5 || HEA__NP__1822__P1-5 || HOA__P__1891__P1-5 || HOA__P__1822__P1-5 || HOA__NP__1891__P1-5 || HOA__NP__1822__P1-5 || CH__P__1891__P1-6 || CH__P__1822__P1-6 || CH__NP__1891__P1-6 || CH__NP__1822__P1-6 || DO__P__1891__P1-6 || DO__P__1822__P1-6 || DO__NP__1891__P1-6 || DO__NP__1822__P1-6 || HEA__P__1891__P1-6 || HEA__P__1822__P1-6 || HEA__NP__1891__P1-6 || HEA__NP__1822__P1-6 || HOA__P__1891__P1-6 || HOA__P__1822__P1-6 || HOA__NP__1891__P1-6 || HOA__NP__1822__P1-6 || CH__P__1891__P1-7 || CH__P__1822__P1-7 || CH__NP__1891__P1-7 || CH__NP__1822__P1-7 || DO__P__1891__P1-7 || DO__P__1822__P1-7 || DO__NP__1891__P1-7 || DO__NP__1822__P1-7 || HEA__P__1891__P1-7 || HEA__P__1822__P1-7 || HEA__NP__1891__P1-7 || HEA__NP__1822__P1-7 || HOA__P__1891__P1-7 || HOA__P__1822__P1-7 || HOA__NP__1891__P1-7 || HOA__NP__1822__P1-7 ) && ( CH__P__1891__P2-17 || CH__P__1822__P2-17 || CH__NP__1891__P2-17 || CH__NP__1822__P2-17 || DO__P__1891__P2-17 || DO__P__1822__P2-17 || DO__NP__1891__P2-17 || DO__NP__1822__P2-17 || HEA__P__1891__P2-17 || HEA__P__1822__P2-17 || HEA__NP__1891__P2-17 || HEA__NP__1822__P2-17 || HOA__P__1891__P2-17 || HOA__P__1822__P2-17 || HOA__NP__1891__P2-17 || HOA__NP__1822__P2-17 || CH__P__1891__P2-16 || CH__P__1822__P2-16 || CH__NP__1891__P2-16 || CH__NP__1822__P2-16 || DO__P__1891__P2-16 || DO__P__1822__P2-16 || DO__NP__1891__P2-16 || DO__NP__1822__P2-16 || HEA__P__1891__P2-16 || HEA__P__1822__P2-16 || HEA__NP__1891__P2-16 || HEA__NP__1822__P2-16 || HOA__P__1891__P2-16 || HOA__P__1822__P2-16 || HOA__NP__1891__P2-16 || HOA__NP__1822__P2-16 ) )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.5") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822") + .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( HOA__P__1891__P1-1 || HOA__P__1822__P1-1 || HOA__NP__1891__P1-1 || HOA__NP__1822__P1-1 || HEA__P__1891__P1-1 || HEA__P__1822__P1-1 || HEA__NP__1891__P1-1 || HEA__NP__1822__P1-1 || HOA__P__1891__P1-2 || HOA__P__1822__P1-2 || HOA__NP__1891__P1-2 || HOA__NP__1822__P1-2 || HEA__P__1891__P1-2 || HEA__P__1822__P1-2 || HEA__NP__1891__P1-2 || HEA__NP__1822__P1-2 || HOA__P__1891__P1-3 || HOA__P__1822__P1-3 || HOA__NP__1891__P1-3 || HOA__NP__1822__P1-3 || HEA__P__1891__P1-3 || HEA__P__1822__P1-3 || HEA__NP__1891__P1-3 || HEA__NP__1822__P1-3 || HOA__P__1891__P1-4 || HOA__P__1822__P1-4 || HOA__NP__1891__P1-4 || HOA__NP__1822__P1-4 || HEA__P__1891__P1-4 || HEA__P__1822__P1-4 || HEA__NP__1891__P1-4 || HEA__NP__1822__P1-4 || HOA__P__1891__P1-5 || HOA__P__1822__P1-5 || HOA__NP__1891__P1-5 || HOA__NP__1822__P1-5 || HEA__P__1891__P1-5 || HEA__P__1822__P1-5 || HEA__NP__1891__P1-5 || HEA__NP__1822__P1-5 || HOA__P__1891__P1-6 || HOA__P__1822__P1-6 || HOA__NP__1891__P1-6 || HOA__NP__1822__P1-6 || HEA__P__1891__P1-6 || HEA__P__1822__P1-6 || HEA__NP__1891__P1-6 || HEA__NP__1822__P1-6 || HOA__P__1891__P1-7 || HOA__P__1822__P1-7 || HOA__NP__1891__P1-7 || HOA__NP__1822__P1-7 || HEA__P__1891__P1-7 || HEA__P__1822__P1-7 || HEA__NP__1891__P1-7 || HEA__NP__1822__P1-7 ) && ( HOA__P__1891__P2-17 || HOA__P__1822__P2-17 || HOA__NP__1891__P2-17 || HOA__NP__1822__P2-17 || HEA__P__1891__P2-17 || HEA__P__1822__P2-17 || HEA__NP__1891__P2-17 || HEA__NP__1822__P2-17 || HOA__P__1891__P2-16 || HOA__P__1822__P2-16 || HOA__NP__1891__P2-16 || HOA__NP__1822__P2-16 || HEA__P__1891__P2-16 || HEA__P__1822__P2-16 || HEA__NP__1891__P2-16 || HEA__NP__1822__P2-16 ) )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.5") + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822") + .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT) + .append(RgaQueryParams.FILTER.key(), "PASS"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( HOA__P__1891__P1-1 || HOA__P__1822__P1-1 || HEA__P__1891__P1-1 || HEA__P__1822__P1-1 || HOA__P__1891__P1-2 || HOA__P__1822__P1-2 || HEA__P__1891__P1-2 || HEA__P__1822__P1-2 || HOA__P__1891__P1-3 || HOA__P__1822__P1-3 || HEA__P__1891__P1-3 || HEA__P__1822__P1-3 || HOA__P__1891__P1-4 || HOA__P__1822__P1-4 || HEA__P__1891__P1-4 || HEA__P__1822__P1-4 || HOA__P__1891__P1-5 || HOA__P__1822__P1-5 || HEA__P__1891__P1-5 || HEA__P__1822__P1-5 || HOA__P__1891__P1-6 || HOA__P__1822__P1-6 || HEA__P__1891__P1-6 || HEA__P__1822__P1-6 || HOA__P__1891__P1-7 || HOA__P__1822__P1-7 || HEA__P__1891__P1-7 || HEA__P__1822__P1-7 ) && ( HOA__P__1891__P2-17 || HOA__P__1822__P2-17 || HEA__P__1891__P2-17 || HEA__P__1822__P2-17 || HOA__P__1891__P2-16 || HOA__P__1822__P2-16 || HEA__P__1891__P2-16 || HEA__P__1822__P2-16 ) )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822") + .append(RgaQueryParams.FILTER.key(), "PASS"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( CH__P__1891 || CH__P__1822 || DO__P__1891 || DO__P__1822 || HEA__P__1891 || HEA__P__1822 || HOA__P__1891 || HOA__P__1822 )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822") + .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT) + .append(RgaQueryParams.FILTER.key(), "PASS"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( HOA__P__1891 || HOA__P__1822 || HEA__P__1891 || HEA__P__1822 )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.5") + .append(RgaQueryParams.FILTER.key(), "PASS"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( CH__P__P1-1 || DO__P__P1-1 || HEA__P__P1-1 || HOA__P__P1-1 || CH__P__P1-2 || DO__P__P1-2 || HEA__P__P1-2 || HOA__P__P1-2 || CH__P__P1-3 || DO__P__P1-3 || HEA__P__P1-3 || HOA__P__P1-3 || CH__P__P1-4 || DO__P__P1-4 || HEA__P__P1-4 || HOA__P__P1-4 || CH__P__P1-5 || DO__P__P1-5 || HEA__P__P1-5 || HOA__P__P1-5 || CH__P__P1-6 || DO__P__P1-6 || HEA__P__P1-6 || HOA__P__P1-6 || CH__P__P1-7 || DO__P__P1-7 || HEA__P__P1-7 || HOA__P__P1-7 ) && ( CH__P__P2-17 || DO__P__P2-17 || HEA__P__P2-17 || HOA__P__P2-17 || CH__P__P2-16 || DO__P__P2-16 || HEA__P__P2-16 || HOA__P__P2-16 ) )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.5") + .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT) + .append(RgaQueryParams.FILTER.key(), "PASS"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( HOA__P__P1-1 || HEA__P__P1-1 || HOA__P__P1-2 || HEA__P__P1-2 || HOA__P__P1-3 || HEA__P__P1-3 || HOA__P__P1-4 || HEA__P__P1-4 || HOA__P__P1-5 || HEA__P__P1-5 || HOA__P__P1-6 || HEA__P__P1-6 || HOA__P__P1-7 || HEA__P__P1-7 ) && ( HOA__P__P2-17 || HEA__P__P2-17 || HOA__P__P2-16 || HEA__P__P2-16 ) )", parse.get("fq")); } } \ No newline at end of file From 9da074b6255af5cbfbd0d8400d4091439e680415 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 13 Jan 2021 15:14:22 +0100 Subject: [PATCH 015/412] app: add new RGA index tool, #1693 --- .../analysis/clinical/rga/RgaAnalysis.java | 32 +++++ .../analysis/clinical/rga/RgaManager.java | 83 +++++++++++- .../app/misc/solr/prepare_configsets.sh | 4 +- .../internal/InternalCliOptionsParser.java | 2 + .../executors/ClinicalCommandExecutor.java | 15 +++ .../options/ClinicalCommandOptions.java | 21 ++++ .../rest/analysis/ClinicalWebService.java | 107 ++++++++++++++++ .../core/config/StorageConfiguration.java | 12 ++ .../core/rga/IndividualRgaConverter.java | 22 ++-- .../storage/core/rga/RgaDataModel.java | 118 +++++++----------- .../opencga/storage/core/rga/RgaEngine.java | 53 ++++---- .../storage/core/rga/RgaQueryParams.java | 28 ++++- .../opencga/storage/core/rga/RgaUtils.java | 5 +- .../src/main/resources/rga/managed-schema | 42 +++---- .../main/resources/storage-configuration.yml | 12 ++ .../storage/core/rga/RgaEngineTest.java | 16 ++- .../storage/core/rga/RgaQueryParserTest.java | 26 ++-- pom.xml | 3 + 18 files changed, 440 insertions(+), 161 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java new file mode 100644 index 00000000000..0ac4d5f8988 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java @@ -0,0 +1,32 @@ +package org.opencb.opencga.analysis.clinical.rga; + +import org.opencb.opencga.analysis.tools.OpenCgaTool; +import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.tools.annotations.Tool; + +@Tool(id = RgaAnalysis.ID, resource = Enums.Resource.CLINICAL, type = Tool.Type.OPERATION, description = "Index RGA study.") +public class RgaAnalysis extends OpenCgaTool { + + public final static String ID = "rga-index"; + public final static String DESCRIPTION = "Generate Recessive Gene Analysis secondary index"; + + public final static String STUDY_PARAM = "study"; + public final static String FILE_PARAM = "file"; + + private RgaManager rgaManager; + + private String study; + private String file; + + @Override + protected void check() throws Exception { + this.rgaManager = new RgaManager(configuration, storageConfiguration); + } + + @Override + protected void run() throws Exception { + // Get all the studies + this.rgaManager.index(study, file, token); + } + +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java index 1fc964e1017..ef80a8f46e6 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java @@ -2,13 +2,90 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.StorageManager; +import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.core.config.Catalog; +import org.opencb.opencga.core.config.Configuration; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; +import org.opencb.opencga.storage.core.StorageEngineFactory; +import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.storage.core.exceptions.RgaException; +import org.opencb.opencga.storage.core.exceptions.StorageEngineException; +import org.opencb.opencga.storage.core.exceptions.VariantSearchException; +import org.opencb.opencga.storage.core.rga.RgaEngine; -public class RgaManager { +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Iterator; - public OpenCGAResult individualQuery(String study, Query query, QueryOptions options, String token) { - return null; +public class RgaManager extends StorageManager { + + private final RgaEngine rgaEngine; + + public RgaManager(CatalogManager catalogManager, StorageEngineFactory storageEngineFactory) { + super(catalogManager, storageEngineFactory); + this.rgaEngine = new RgaEngine(getStorageConfiguration()); } + public RgaManager(Configuration configuration, StorageConfiguration storageConfiguration) throws CatalogException { + super(configuration, storageConfiguration); + this.rgaEngine = new RgaEngine(storageConfiguration); + } + + public OpenCGAResult individualQuery(String studyStr, Query query, QueryOptions options, String token) + throws CatalogException, IOException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + // TODO: Check Permissions + String collection = getCollectionName(study.getFqn()); + return rgaEngine.individualQuery(collection, query, options); + } + + public OpenCGAResult geneQuery(String studyStr, Query query, QueryOptions options, String token) + throws CatalogException, IOException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + // TODO: Check Permissions + String collection = getCollectionName(study.getFqn()); + return rgaEngine.geneQuery(collection, query, options); + } + + public void index(String studyStr, String path, String token) throws CatalogException, RgaException, IOException { + String userId = catalogManager.getUserManager().getUserId(token); + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + try { + catalogManager.getAuthorizationManager().isOwnerOrAdmin(study.getUid(), userId); + } catch (CatalogException e) { + logger.error(e.getMessage(), e); + throw new CatalogException("Only owners or admins can index", e.getCause()); + } + + String collectionName = getCollectionName(study.getFqn()); + index(collectionName, Paths.get(path)); + } + + void index(String collection, Path path) throws RgaException, IOException { + try { + if (!rgaEngine.exists(collection)) { + rgaEngine.create(collection); + } + } catch (RgaException e) { + logger.error("Could not perform RGA index in collection {}", collection, e); + throw new RgaException("Could not perform RGA index in collection '" + collection + "'."); + } + + rgaEngine.load(collection, path); + } + + @Override + public void testConnection() throws StorageEngineException { + rgaEngine.isAlive("test"); + } + + private String getCollectionName(String study) { + return catalogManager.getConfiguration().getDatabasePrefix() + "__" + study.replace("@", "_").replace(":", "_"); + } } diff --git a/opencga-app/app/misc/solr/prepare_configsets.sh b/opencga-app/app/misc/solr/prepare_configsets.sh index 1dbb71edd30..1f1a57e37f0 100755 --- a/opencga-app/app/misc/solr/prepare_configsets.sh +++ b/opencga-app/app/misc/solr/prepare_configsets.sh @@ -19,7 +19,7 @@ sed -i "s/REPLACEME_OPENCGA_VERSION/${VERSION}/g" "${SOLR_DIR}/INSTALL.md" sed -i "s/REPLACEME_OPENCGA_VERSION/${VERSION}/g" "${SOLR_DIR}/install.sh" # Iterate over the different config sets -for name in variant file sample individual family cohort job; do +for name in variant rga file sample individual family cohort job; do CONFIG_SET_NAME="opencga-$name-configset-$VERSION" CONFIG_SET_DIR="$SOLR_DIR/$CONFIG_SET_NAME" @@ -30,6 +30,8 @@ for name in variant file sample individual family cohort job; do if [ $name == "variant" ]; then cp -v $OPENCGA_HOME/opencga-storage/opencga-storage-core/target/classes/managed-schema $CONFIG_SET_DIR/conf + elif [ $name == "rga" ]; then + cp -v $OPENCGA_HOME/opencga-storage/opencga-storage-core/target/classes/rga/managed-schema $CONFIG_SET_DIR/conf else cp -v $OPENCGA_HOME/opencga-catalog/target/classes/solr/$name-managed-schema $CONFIG_SET_DIR/conf/managed-schema fi diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java index 5ec66ca3323..2c0d9664930 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/InternalCliOptionsParser.java @@ -33,6 +33,7 @@ import static org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions.FastqcCommandOptions.FASTQC_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions.PicardCommandOptions.PICARD_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.AlignmentCommandOptions.SamtoolsCommandOptions.SAMTOOLS_RUN_COMMAND; +import static org.opencb.opencga.app.cli.internal.options.ClinicalCommandOptions.RgaSecondaryIndexCommandOptions.RGA_INDEX_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.CohortVariantStatsCommandOptions.COHORT_VARIANT_STATS_RUN_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.CohortVariantStatsQueryCommandOptions.COHORT_VARIANT_STATS_QUERY_COMMAND; import static org.opencb.opencga.app.cli.internal.options.VariantCommandOptions.FamilyIndexCommandOptions.FAMILY_INDEX_COMMAND; @@ -208,6 +209,7 @@ public InternalCliOptionsParser() { clinicalSubCommands.addCommand(TEAM_RUN_COMMAND, clinicalCommandOptions.teamCommandOptions); clinicalSubCommands.addCommand(ZETTA_RUN_COMMAND, clinicalCommandOptions.zettaCommandOptions); clinicalSubCommands.addCommand(CANCER_TIERING_RUN_COMMAND, clinicalCommandOptions.cancerTieringCommandOptions); + clinicalSubCommands.addCommand(RGA_INDEX_RUN_COMMAND, clinicalCommandOptions.rgaSecondaryIndexCommandOptions); fileCommandOptions = new FileCommandOptions(commonCommandOptions, jCommander); jCommander.addCommand("files", fileCommandOptions); diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java index 171a4f4b446..01b1eab53c9 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java @@ -24,6 +24,7 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationConfiguration; import org.opencb.opencga.analysis.clinical.tiering.CancerTieringInterpretationAnalysis; @@ -41,6 +42,7 @@ import java.nio.file.Path; import java.nio.file.Paths; +import static org.opencb.opencga.app.cli.internal.options.ClinicalCommandOptions.RgaSecondaryIndexCommandOptions.RGA_INDEX_RUN_COMMAND; import static org.opencb.opencga.app.cli.main.options.ClinicalCommandOptions.InterpretationCancerTieringCommandOptions.CANCER_TIERING_RUN_COMMAND; import static org.opencb.opencga.app.cli.main.options.ClinicalCommandOptions.InterpretationTeamCommandOptions.TEAM_RUN_COMMAND; import static org.opencb.opencga.app.cli.main.options.ClinicalCommandOptions.InterpretationTieringCommandOptions.TIERING_RUN_COMMAND; @@ -84,6 +86,10 @@ public void execute() throws Exception { cancerTiering(); break; + case RGA_INDEX_RUN_COMMAND: + rgaIndex(); + break; + default: logger.error("Subcommand not valid"); break; @@ -91,6 +97,15 @@ public void execute() throws Exception { } } + private void rgaIndex() throws ToolException { + ClinicalCommandOptions.RgaSecondaryIndexCommandOptions options = clinicalCommandOptions.rgaSecondaryIndexCommandOptions; + Path outDir = Paths.get(options.outdir); + ObjectMap params = new ObjectMap() + .append(RgaAnalysis.STUDY_PARAM, options.study) + .append(RgaAnalysis.FILE_PARAM, options.file); + toolRunner.execute(RgaAnalysis.class, params, outDir, options.jobOptions.jobId, options.commonOptions.token); + } + private void tiering() throws Exception { ClinicalCommandOptions.TieringCommandOptions cliOptions = clinicalCommandOptions.tieringCommandOptions; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java index 131408bea6b..c658c07f92d 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java @@ -5,6 +5,7 @@ import com.beust.jcommander.Parameters; import com.beust.jcommander.ParametersDelegate; import org.opencb.biodata.models.clinical.ClinicalProperty; +import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.CancerTieringInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.TieringInterpretationAnalysis; @@ -30,6 +31,7 @@ public class ClinicalCommandOptions { public TeamCommandOptions teamCommandOptions; public ZettaCommandOptions zettaCommandOptions; public CancerTieringCommandOptions cancerTieringCommandOptions; + public RgaSecondaryIndexCommandOptions rgaSecondaryIndexCommandOptions; public JCommander jCommander; public GeneralCliOptions.CommonCommandOptions commonCommandOptions; @@ -48,6 +50,7 @@ public ClinicalCommandOptions(GeneralCliOptions.CommonCommandOptions commonComma this.teamCommandOptions = new TeamCommandOptions(); this.zettaCommandOptions = new ZettaCommandOptions(); this.cancerTieringCommandOptions = new CancerTieringCommandOptions(); + this.rgaSecondaryIndexCommandOptions = new RgaSecondaryIndexCommandOptions(); } @Parameters(commandNames = {InterpretationTieringCommandOptions.TIERING_RUN_COMMAND}, commandDescription = TieringInterpretationAnalysis.DESCRIPTION) @@ -246,4 +249,22 @@ public class CancerTieringCommandOptions extends GeneralCliOptions.StudyOption { @Parameter(names = {"-o", "--outdir"}, description = "Directory where output files will be saved", required = true, arity = 1) public String outdir; } + + @Parameters(commandNames = {RgaSecondaryIndexCommandOptions.RGA_INDEX_RUN_COMMAND}, commandDescription = RgaAnalysis.DESCRIPTION) + public class RgaSecondaryIndexCommandOptions extends GeneralCliOptions.StudyOption { + + public static final String RGA_INDEX_RUN_COMMAND = RgaAnalysis.ID + "-run"; + + @ParametersDelegate + public GeneralCliOptions.CommonCommandOptions commonOptions = commonCommandOptions; + + @ParametersDelegate + public InternalCliOptionsParser.JobOptions jobOptions = internalJobOptions; + + @Parameter(names = {"--" + RgaAnalysis.FILE_PARAM}, description = "Json file containing the KnockoutByIndividual information", required = true, arity = 1) + public String file; + + @Parameter(names = {"-o", "--outdir"}, description = "Directory where output files will be saved", required = true, arity = 1) + public String outdir; + } } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 0aced91768d..31237751600 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -25,6 +25,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.clinical.ClinicalInterpretationManager; +import org.opencb.opencga.analysis.clinical.rga.RgaManager; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.CancerTieringInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.TieringInterpretationAnalysis; @@ -40,8 +41,10 @@ import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.VersionException; import org.opencb.opencga.core.models.AclParams; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.clinical.*; import org.opencb.opencga.core.models.job.Job; +import org.opencb.opencga.storage.core.rga.RgaQueryParams; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.*; @@ -65,6 +68,7 @@ public class ClinicalWebService extends AnalysisWebService { private final ClinicalAnalysisManager clinicalManager; private final InterpretationManager catalogInterpretationManager; private final ClinicalInterpretationManager clinicalInterpretationManager; + private final RgaManager rgaManager; public ClinicalWebService(@Context UriInfo uriInfo, @Context HttpServletRequest httpServletRequest, @Context HttpHeaders httpHeaders) throws IOException, VersionException { @@ -73,6 +77,7 @@ public ClinicalWebService(@Context UriInfo uriInfo, @Context HttpServletRequest clinicalInterpretationManager = new ClinicalInterpretationManager(catalogManager, storageEngineFactory, opencgaHome); catalogInterpretationManager = catalogManager.getInterpretationManager(); clinicalManager = catalogManager.getClinicalAnalysisManager(); + rgaManager = new RgaManager(catalogManager, storageEngineFactory); } // public ClinicalWebService(String version, @Context UriInfo uriInfo, @Context HttpServletRequest httpServletRequest, @@ -615,6 +620,108 @@ public Response interpretationDistinct( } } + //------------------------------------------------------------------------- + // R E C E S S I V E G E N E A N A L Y S I S + //------------------------------------------------------------------------- + + @GET + @Path("/rga/individual/query") + @ApiOperation(value = "Query individual RGA", response = KnockoutByIndividual.class) + @ApiImplicitParams({ + // Query options + @ApiImplicitParam(name = QueryOptions.INCLUDE, value = ParamConstants.INCLUDE_DESCRIPTION, example = "name,attributes", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.EXCLUDE, value = ParamConstants.EXCLUDE_DESCRIPTION, example = "id,status", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query"), + + @ApiImplicitParam(name = "sampleId", value = RgaQueryParams.SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "individualId", value = RgaQueryParams.INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "sex", value = RgaQueryParams.SEX_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "phenotypes", value = RgaQueryParams.PHENOTYPES_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "disorders", value = RgaQueryParams.DISORDERS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneId", value = RgaQueryParams.GENE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneName", value = RgaQueryParams.GENE_NAME_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneBiotype", value = RgaQueryParams.GENE_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "chromosome", value = RgaQueryParams.CHROMOSOME_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "start", value = RgaQueryParams.START_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "end", value = RgaQueryParams.END_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "populationFrequency", value = RgaQueryParams.POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "consequenceType", value = RgaQueryParams.CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query") + }) + public Response rgaIndividualQuery( + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String studyStr + ) { + // Get all query options + return run(() -> { + QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); + Query query = RgaQueryParams.getQueryParams(queryOptions); + + return rgaManager.individualQuery(studyStr, query, queryOptions, token); + }); + } + + @GET + @Path("/rga/gene/query") + @ApiOperation(value = "Query gene RGA", response = KnockoutByIndividual.class) + @ApiImplicitParams({ + // Query options + @ApiImplicitParam(name = QueryOptions.INCLUDE, value = ParamConstants.INCLUDE_DESCRIPTION, example = "name,attributes", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.EXCLUDE, value = ParamConstants.EXCLUDE_DESCRIPTION, example = "id,status", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query"), + + @ApiImplicitParam(name = "sampleId", value = RgaQueryParams.SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "individualId", value = RgaQueryParams.INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "sex", value = RgaQueryParams.SEX_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "phenotypes", value = RgaQueryParams.PHENOTYPES_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "disorders", value = RgaQueryParams.DISORDERS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneId", value = RgaQueryParams.GENE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneName", value = RgaQueryParams.GENE_NAME_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneBiotype", value = RgaQueryParams.GENE_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "chromosome", value = RgaQueryParams.CHROMOSOME_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "start", value = RgaQueryParams.START_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "end", value = RgaQueryParams.END_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "populationFrequency", value = RgaQueryParams.POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "consequenceType", value = RgaQueryParams.CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query") + }) + public Response rgaGeneQuery( + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String studyStr + ) { + // Get all query options + return run(() -> { + QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); + Query query = RgaQueryParams.getQueryParams(queryOptions); + + return rgaManager.geneQuery(studyStr, query, queryOptions, token); + }); + } + + @POST + @Path("/rga/index/run") + @ApiOperation(value = TieringInterpretationAnalysis.DESCRIPTION, response = Job.class) + public Response rgaIndexRun( + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String file, + @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, + @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, + @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, + @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, + @ApiParam(value = TieringInterpretationAnalysisParams.DESCRIPTION, required = true) TieringInterpretationAnalysisParams params) { + return submitJob(TieringInterpretationAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + } + //------------------------------------------------------------------------- // C L I N I C A L V A R I A N T S //------------------------------------------------------------------------- diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageConfiguration.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageConfiguration.java index 5e767b880d7..976cb2823af 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageConfiguration.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/config/StorageConfiguration.java @@ -43,6 +43,7 @@ public class StorageConfiguration { private CacheConfiguration cache; private SearchConfiguration search; private SearchConfiguration clinical; + private SearchConfiguration rga; private ObjectMap alignment; private StorageEnginesConfiguration variant; private IOConfiguration io; @@ -60,6 +61,7 @@ public StorageConfiguration() { this.cache = new CacheConfiguration(); this.search = new SearchConfiguration(); this.clinical = new SearchConfiguration(); + this.rga = new SearchConfiguration(); } @@ -139,6 +141,7 @@ public String toString() { sb.append(", cache=").append(cache); sb.append(", search=").append(search); sb.append(", clinical=").append(clinical); + sb.append(", rga=").append(rga); sb.append(", benchmark=").append(benchmark); sb.append('}'); return sb.toString(); @@ -189,6 +192,15 @@ public StorageConfiguration setClinical(SearchConfiguration clinical) { return this; } + public SearchConfiguration getRga() { + return rga; + } + + public StorageConfiguration setRga(SearchConfiguration rga) { + this.rga = rga; + return this; + } + public IOConfiguration getIo() { return io; } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index 8005f9831d9..1670c136785 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -168,7 +168,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI .distinct().collect(Collectors.toList()); Map> popFreqs = getPopulationFrequencies(transcript); - String id = knockoutByIndividual.getId() + "_" + gene.getId() + "_" + transcript.getId(); + String id = knockoutByIndividual.getSampleId() + "_" + gene.getId() + "_" + transcript.getId(); RgaDataModel model = new RgaDataModel(id, knockoutByIndividual.getId(), knockoutByIndividual.getSampleId(), knockoutByIndividual.getSex().name(), phenotypes, disorders, gene.getId(), gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, knockoutTypes, filters, consequenceTypes, popFreqs, @@ -245,10 +245,10 @@ private List processFilters(KnockoutTranscript transcript) throws RgaExc independentTerms.add(ct); } // PF - Population frequencies + List pf = new LinkedList<>(); + boolean gnomad = false; + boolean thousandG = false; if (variant.getPopulationFrequencies() != null) { - List pf = new ArrayList<>(variant.getPopulationFrequencies().size()); - boolean gnomad = false; - boolean thousandG = false; for (PopulationFrequency populationFrequency : variant.getPopulationFrequencies()) { if (populationFrequency.getPopulation().equals("ALL")) { if (RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase().equals(populationFrequency.getStudy().toUpperCase())) { @@ -264,14 +264,14 @@ private List processFilters(KnockoutTranscript transcript) throws RgaExc } } } - if (!thousandG) { - pf.add(RgaUtils.encode(RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0)); - } - if (!gnomad) { - pf.add(RgaUtils.encode(RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0)); - } - independentTerms.add(pf); } + if (!thousandG) { + pf.add(RgaUtils.encode(RgaUtils.THOUSAND_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0f)); + } + if (!gnomad) { + pf.add(RgaUtils.encode(RgaUtils.GNOMAD_GENOMES_STUDY.toUpperCase() + RgaUtils.SEPARATOR + 0f)); + } + independentTerms.add(pf); if (variant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { compoundHeterozygousVariantList.add(independentTerms); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java index d0a17a5e0eb..b7fe07daeeb 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java @@ -2,139 +2,107 @@ import org.apache.solr.client.solrj.beans.Field; -import java.util.HashMap; import java.util.List; import java.util.Map; public class RgaDataModel { - @Field(ID) + @Field private String id; - @Field(INDIVIDUAL_ID) + @Field private String individualId; - @Field(SAMPLE_ID) + @Field private String sampleId; - @Field(SEX) + @Field private String sex; - @Field(PHENOTYPES) + @Field private List phenotypes; - @Field(DISORDERS) + @Field private List disorders; - @Field(GENE_ID) + @Field private String geneId; - @Field(GENE_NAME) + @Field private String geneName; - @Field(GENE_BIOTYPE) + @Field private String geneBiotype; - @Field(CHROMOSOME) + @Field private String chromosome; - @Field(STRAND) + @Field private String strand; - @Field(START) + @Field private int start; - @Field(END) + @Field private int end; - @Field(TRANSCRIPT_ID) + @Field private String transcriptId; - @Field(TRANSCRIPT_BIOTYPE) + @Field private String transcriptBiotype; - @Field(VARIANTS) + @Field private List variants; - @Field(KNOCKOUT_TYPES) + @Field private List knockoutTypes; - @Field(FILTERS) + @Field private List filters; - @Field(CONSEQUENCE_TYPES) + @Field private List consequenceTypes; @Field(POPULATION_FREQUENCIES) private Map> populationFrequencies; - @Field(COMPOUND_FILTERS) + @Field private List compoundFilters; - @Field(PHENOTYPE_JSON) + @Field private List phenotypeJson; - @Field(DISORDER_JSON) + @Field private List disorderJson; - @Field(VARIANT_JSON) + @Field private List variantJson; public static final String ID = "id"; - public static final String INDIVIDUAL_ID = "iId"; - public static final String SAMPLE_ID = "sId"; + public static final String INDIVIDUAL_ID = "individualId"; + public static final String SAMPLE_ID = "sampleId"; public static final String SEX = "sex"; - public static final String PHENOTYPES = "pheno"; - public static final String DISORDERS = "dis"; - public static final String GENE_ID = "gId"; - public static final String GENE_NAME = "gName"; - public static final String GENE_BIOTYPE = "gBio"; - public static final String CHROMOSOME = "chr"; - public static final String STRAND = "str"; + public static final String PHENOTYPES = "phenotypes"; + public static final String DISORDERS = "disorders"; + public static final String GENE_ID = "geneId"; + public static final String GENE_NAME = "geneName"; + public static final String GENE_BIOTYPE = "geneBiotype"; + public static final String CHROMOSOME = "chromosome"; + public static final String STRAND = "strand"; public static final String START = "start"; public static final String END = "end"; - public static final String TRANSCRIPT_ID = "tId"; - public static final String TRANSCRIPT_BIOTYPE = "tBio"; - public static final String VARIANTS = "var"; - public static final String KNOCKOUT_TYPES = "ko"; - public static final String FILTERS = "fl"; - public static final String CONSEQUENCE_TYPES = "ct"; - public static final String POPULATION_FREQUENCIES = "pf_*"; - public static final String COMPOUND_FILTERS = "cF"; - public static final String PHENOTYPE_JSON = "phenoJ"; - public static final String DISORDER_JSON = "disJ"; - public static final String VARIANT_JSON = "varJ"; - - public static final Map ABBREVIATIONS; - - static { - ABBREVIATIONS = new HashMap<>(); - - ABBREVIATIONS.put(ID, "id"); - ABBREVIATIONS.put(INDIVIDUAL_ID, "individualId"); - ABBREVIATIONS.put(SAMPLE_ID, "sampleId"); - ABBREVIATIONS.put(SEX, "sex"); - ABBREVIATIONS.put(PHENOTYPES, "phenotypes"); - ABBREVIATIONS.put(DISORDERS, "disorders"); - ABBREVIATIONS.put(GENE_ID, "geneId"); - ABBREVIATIONS.put(GENE_NAME, "geneName"); - ABBREVIATIONS.put(GENE_BIOTYPE, "geneBiotype"); - ABBREVIATIONS.put(CHROMOSOME, "chromosome"); - ABBREVIATIONS.put(STRAND, "strand"); - ABBREVIATIONS.put(START, "start"); - ABBREVIATIONS.put(END, "end"); - ABBREVIATIONS.put(TRANSCRIPT_ID, "transcriptId"); - ABBREVIATIONS.put(TRANSCRIPT_BIOTYPE, "tbiotype"); - ABBREVIATIONS.put(VARIANTS, "variants"); - ABBREVIATIONS.put(KNOCKOUT_TYPES, "knockoutTypes"); - ABBREVIATIONS.put(FILTERS, "filters"); - ABBREVIATIONS.put(CONSEQUENCE_TYPES, "consequenceTypes"); - ABBREVIATIONS.put(POPULATION_FREQUENCIES, "populationFrequencies"); - ABBREVIATIONS.put(COMPOUND_FILTERS, "compoundFilters"); - ABBREVIATIONS.put(PHENOTYPE_JSON, "phenotypeJson"); - ABBREVIATIONS.put(DISORDER_JSON, "disorderJson"); - ABBREVIATIONS.put(VARIANT_JSON, "variantJson"); - } + public static final String TRANSCRIPT_ID = "transcriptId"; + public static final String TRANSCRIPT_BIOTYPE = "transcriptBiotype"; + public static final String VARIANTS = "variants"; + public static final String KNOCKOUT_TYPES = "knockoutTypes"; + public static final String FILTERS = "filters"; + public static final String CONSEQUENCE_TYPES = "consequenceTypes"; + public static final String POPULATION_FREQUENCIES = "populationFrequencies_*"; + public static final String COMPOUND_FILTERS = "compoundFilters"; + public static final String PHENOTYPE_JSON = "phenotypeJson"; + public static final String DISORDER_JSON = "disorderJson"; + public static final String VARIANT_JSON = "variantJson"; public RgaDataModel() { } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index 552323ac37d..0c9a5904f8d 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -20,7 +20,6 @@ import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.RgaException; -import org.opencb.opencga.storage.core.exceptions.VariantSearchException; import org.opencb.opencga.storage.core.variant.search.solr.SolrNativeIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,12 +38,11 @@ public class RgaEngine implements Closeable { private IndividualRgaConverter individualRgaConverter; private GeneRgaConverter geneConverter; private StorageConfiguration storageConfiguration; - private int insertBatchSize; private Logger logger; public static final String USE_SEARCH_INDEX = "useSearchIndex"; - public static final int DEFAULT_INSERT_BATCH_SIZE = 10000; + private static final int KNOCKOUT_BATCH_SIZE = 25; public RgaEngine(StorageConfiguration storageConfiguration) { this.individualRgaConverter = new IndividualRgaConverter(); @@ -52,13 +50,8 @@ public RgaEngine(StorageConfiguration storageConfiguration) { this.queryParser = new RgaQueryParser(); this.storageConfiguration = storageConfiguration; - this.solrManager = new SolrManager(storageConfiguration.getSearch().getHosts(), storageConfiguration.getSearch().getMode(), - storageConfiguration.getSearch().getTimeout()); - - // Set internal insert batch size from configuration and default value - insertBatchSize = storageConfiguration.getSearch().getInsertBatchSize() > 0 - ? storageConfiguration.getSearch().getInsertBatchSize() - : DEFAULT_INSERT_BATCH_SIZE; + this.solrManager = new SolrManager(storageConfiguration.getRga().getHosts(), storageConfiguration.getRga().getMode(), + storageConfiguration.getRga().getTimeout()); logger = LoggerFactory.getLogger(RgaEngine.class); } @@ -67,44 +60,44 @@ public boolean isAlive(String collection) { return solrManager.isAlive(collection); } - public void create(String dbName) throws VariantSearchException { + public void create(String dbName) throws RgaException { try { - solrManager.create(dbName, this.storageConfiguration.getSearch().getConfigSet()); + solrManager.create(dbName, this.storageConfiguration.getRga().getConfigSet()); } catch (SolrException e) { - throw new VariantSearchException("Error creating Solr collection '" + dbName + "'", e); + throw new RgaException("Error creating Solr collection '" + dbName + "'", e); } } - public void create(String dbName, String configSet) throws VariantSearchException { + public void create(String dbName, String configSet) throws RgaException { try { solrManager.create(dbName, configSet); } catch (SolrException e) { - throw new VariantSearchException("Error creating Solr collection '" + dbName + "'", e); + throw new RgaException("Error creating Solr collection '" + dbName + "'", e); } } - public boolean exists(String dbName) throws VariantSearchException { + public boolean exists(String dbName) throws RgaException { try { return solrManager.exists(dbName); } catch (SolrException e) { - throw new VariantSearchException("Error asking if Solr collection '" + dbName + "' exists", e); + throw new RgaException("Error asking if Solr collection '" + dbName + "' exists", e); } } - public boolean existsCore(String coreName) throws VariantSearchException { + public boolean existsCore(String coreName) throws RgaException { try { return solrManager.existsCore(coreName); } catch (SolrException e) { - throw new VariantSearchException("Error asking if Solr core '" + coreName + "' exists", e); + throw new RgaException("Error asking if Solr core '" + coreName + "' exists", e); } } - public boolean existsCollection(String collectionName) throws VariantSearchException { + public boolean existsCollection(String collectionName) throws RgaException { try { - return solrManager.existsCollection(collectionName); + return solrManager.exists(collectionName); } catch (SolrException e) { - throw new VariantSearchException("Error asking if Solr collection '" + collectionName + "' exists", e); + throw new RgaException("Error asking if Solr collection '" + collectionName + "' exists", e); } } @@ -237,17 +230,17 @@ public OpenCGAResult nativeQuery(String collection, Query query, Q // * @param query Query // * @param queryOptions Query options // * @return Solr VariantSearch iterator -// * @throws VariantSearchException VariantSearchException +// * @throws RgaException RgaException // * @throws IOException IOException // */ // public SolrVariantDBIterator iterator(String collection, Query query, QueryOptions queryOptions) -// throws VariantSearchException, IOException { +// throws RgaException, IOException { // try { // SolrQuery solrQuery = solrQueryParser.parse(query, queryOptions); // return new SolrVariantDBIterator(solrManager.getSolrClient(), collection, solrQuery, // new VariantSearchToVariantConverter(VariantField.getIncludeFields(queryOptions))); // } catch (SolrServerException e) { -// throw new VariantSearchException("Error getting variant iterator", e); +// throw new RgaException("Error getting variant iterator", e); // } // } @@ -314,7 +307,7 @@ public DataResult facetedQuery(String collection, Query query, Query // // Gene management // if (facetQuery.contains("genes[") // && (facetQuery.contains("genes;") || facetQuery.contains("genes>>") || facetQuery.endsWith("genes"))) { -// throw new VariantSearchException("Invalid gene facet query: " + facetQuery); +// throw new RgaException("Invalid gene facet query: " + facetQuery); // } try { @@ -430,7 +423,7 @@ public void close() throws IOException { private void loadJson(String collection, Path path) throws IOException, SolrServerException { // This opens json and json.gz files automatically try (BufferedReader bufferedReader = Files.newBufferedReader(path)) { - List knockoutByIndividualList = new ArrayList<>(insertBatchSize); + List knockoutByIndividualList = new ArrayList<>(KNOCKOUT_BATCH_SIZE); int count = 0; String line; ObjectReader objectReader = new ObjectMapper().readerFor(KnockoutByIndividual.class); @@ -438,16 +431,16 @@ private void loadJson(String collection, Path path) throws IOException, SolrServ KnockoutByIndividual knockoutByIndividual = objectReader.readValue(line); knockoutByIndividualList.add(knockoutByIndividual); count++; - if (count % insertBatchSize == 0) { - logger.debug("Loading knockoutByIndividual from '{}', {} entries loaded", path, count); + if (count % KNOCKOUT_BATCH_SIZE == 0) { insert(collection, knockoutByIndividualList); + logger.info("Loaded {} knockoutByIndividual entries from '{}'", count, path); knockoutByIndividualList.clear(); } } // Insert the remaining entries if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { - logger.debug("Loading remaining knockoutByIndividual from '{}', {} entries loaded", path, count); + logger.info("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); insert(collection, knockoutByIndividualList); } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java index a2ff0e896b8..6e6052c01aa 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java @@ -1,5 +1,6 @@ package org.opencb.opencga.storage.core.rga; +import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryParam; import java.util.HashMap; @@ -34,17 +35,29 @@ public class RgaQueryParams implements QueryParam { public static final String GENE_NAME_DESCR = "Filter by gene name."; public static final RgaQueryParams GENE_NAME = new RgaQueryParams("geneName", Type.TEXT, GENE_NAME_DESCR); + public static final String GENE_BIOTYPE_DESCR = "Filter by gene biotype."; + public static final RgaQueryParams GENE_BIOTYPE = new RgaQueryParams("geneBiotype", Type.TEXT, GENE_BIOTYPE_DESCR); + + public static final String CHROMOSOME_DESCR = "Filter by chromosome."; + public static final RgaQueryParams CHROMOSOME = new RgaQueryParams("chromosome", Type.TEXT, CHROMOSOME_DESCR); + + public static final String START_DESCR = "Filter by start position."; + public static final RgaQueryParams START = new RgaQueryParams("start", Type.TEXT, START_DESCR); + + public static final String END_DESCR = "Filter by end position."; + public static final RgaQueryParams END = new RgaQueryParams("end", Type.TEXT, END_DESCR); + public static final String TRANSCRIPT_ID_DESCR = "Filter by transcript id."; public static final RgaQueryParams TRANSCRIPT_ID = new RgaQueryParams("transcriptId", Type.TEXT, TRANSCRIPT_ID_DESCR); public static final String TRANSCRIPT_BIOTYPE_DESCR = "Filter by transcript biotype."; - public static final RgaQueryParams TRANSCRIPT_BIOTYPE = new RgaQueryParams("tbiotype", Type.TEXT, TRANSCRIPT_BIOTYPE_DESCR); + public static final RgaQueryParams TRANSCRIPT_BIOTYPE = new RgaQueryParams("transcriptBiotype", Type.TEXT, TRANSCRIPT_BIOTYPE_DESCR); public static final String VARIANTS_DESCR = "Filter by variant id."; public static final RgaQueryParams VARIANTS = new RgaQueryParams("variants", Type.TEXT_ARRAY, VARIANTS_DESCR); public static final String KNOCKOUT_DESCR = "Filter by knockout type."; - public static final RgaQueryParams KNOCKOUT = new RgaQueryParams("knockout", Type.TEXT, KNOCKOUT_DESCR); + public static final RgaQueryParams KNOCKOUT = new RgaQueryParams("knockoutType", Type.TEXT, KNOCKOUT_DESCR); public static final String FILTER_DESCR = "Filter by filter (PASS, NOT_PASS)."; public static final RgaQueryParams FILTER = new RgaQueryParams("filter", Type.TEXT, FILTER_DESCR); @@ -84,4 +97,15 @@ public Type type() { public static RgaQueryParams valueOf(String param) { return VALUES_MAP.get(param); } + + public static Query getQueryParams(Map options) { + Query query = new Query(); + for (String key : options.keySet()) { + if (VALUES_MAP.containsKey(key)) { + query.put(key, options.get(key)); + options.remove(key); + } + } + return query; + } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java index ba7e4a9e1e4..e34b9629b76 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java @@ -57,8 +57,7 @@ class RgaUtils { // POPULATION FREQUENCY POP_FREQ_STUDIES = Arrays.asList(THOUSAND_GENOMES_STUDY, GNOMAD_GENOMES_STUDY); - POP_FREQS = Arrays.asList(0f, 0.00001f, 0.00002f, 0.00005f, 0.0001f, 0.0002f, 0.0005f, 0.001f, 0.002f, 0.005f, 0.01f, 0.02f, 0.05f, - 0.1f, 0.2f, 0.5f, 1f); + POP_FREQS = Arrays.asList(0f, 0.0001f, 0.0005f, 0.001f, 0.005f, 0.01f, 0.05f, 1f); for (int i = 1; i <= POP_FREQ_STUDIES.size(); i++) { String popFreqStudy = POP_FREQ_STUDIES.get(i - 1); for (int j = 1; j <= POP_FREQS.size(); j++) { @@ -76,7 +75,7 @@ class RgaUtils { static String getPopulationFrequencyKey(Float popFreq) throws RgaException { for (Float freq : POP_FREQS) { - if (popFreq < freq) { + if (popFreq <= freq) { return String.valueOf(freq); } } diff --git a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema index 790a520ac07..0a144c034ad 100644 --- a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema +++ b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema @@ -568,30 +568,30 @@ - - + + - - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + localhost:27017 From 8fc86d04f22053012b2ecfa65dbe52d1051e0b31 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 14 Jan 2021 10:19:59 +0100 Subject: [PATCH 016/412] app: implement rga index tool, #1693 --- .../analysis/clinical/rga/RgaAnalysis.java | 20 +++++------ .../analysis/clinical/rga/RgaManager.java | 12 ++++--- .../executors/ClinicalCommandExecutor.java | 7 ++-- .../options/ClinicalCommandOptions.java | 3 +- .../models/clinical/RgaAnalysisParams.java | 34 +++++++++++++++++++ .../monitor/daemons/ExecutionDaemon.java | 3 ++ .../rest/analysis/ClinicalWebService.java | 8 ++--- .../opencga/storage/core/rga/RgaEngine.java | 4 +-- 8 files changed, 67 insertions(+), 24 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/RgaAnalysisParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java index 0ac4d5f8988..5233bf451ff 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaAnalysis.java @@ -1,32 +1,32 @@ package org.opencb.opencga.analysis.clinical.rga; -import org.opencb.opencga.analysis.tools.OpenCgaTool; +import org.opencb.opencga.analysis.variant.operations.OperationTool; +import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.tools.annotations.Tool; @Tool(id = RgaAnalysis.ID, resource = Enums.Resource.CLINICAL, type = Tool.Type.OPERATION, description = "Index RGA study.") -public class RgaAnalysis extends OpenCgaTool { - +public class RgaAnalysis extends OperationTool { public final static String ID = "rga-index"; public final static String DESCRIPTION = "Generate Recessive Gene Analysis secondary index"; - public final static String STUDY_PARAM = "study"; - public final static String FILE_PARAM = "file"; - - private RgaManager rgaManager; - private String study; private String file; + private RgaManager rgaManager; + @Override protected void check() throws Exception { + super.check(); + this.rgaManager = new RgaManager(configuration, storageConfiguration); + study = getStudyFqn(); + file = params.getString(RgaAnalysisParams.FILE); } @Override protected void run() throws Exception { - // Get all the studies - this.rgaManager.index(study, file, token); + step(() -> this.rgaManager.index(study, file, token)); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java index ef80a8f46e6..4897f455005 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java @@ -5,10 +5,12 @@ import org.opencb.opencga.analysis.StorageManager; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.catalog.managers.FileManager; import org.opencb.opencga.core.config.Catalog; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.StorageEngineFactory; @@ -53,7 +55,7 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Que return rgaEngine.geneQuery(collection, query, options); } - public void index(String studyStr, String path, String token) throws CatalogException, RgaException, IOException { + public void index(String studyStr, String fileStr, String token) throws CatalogException, RgaException, IOException { String userId = catalogManager.getUserManager().getUserId(token); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); try { @@ -63,11 +65,13 @@ public void index(String studyStr, String path, String token) throws CatalogExce throw new CatalogException("Only owners or admins can index", e.getCause()); } + File file = catalogManager.getFileManager().get(studyStr, fileStr, FileManager.INCLUDE_FILE_URI_PATH, token).first(); + String collectionName = getCollectionName(study.getFqn()); - index(collectionName, Paths.get(path)); + index(collectionName, Paths.get(file.getUri())); } - void index(String collection, Path path) throws RgaException, IOException { + private void index(String collection, Path path) throws RgaException, IOException { try { if (!rgaEngine.exists(collection)) { rgaEngine.create(collection); @@ -86,6 +90,6 @@ public void testConnection() throws StorageEngineException { } private String getCollectionName(String study) { - return catalogManager.getConfiguration().getDatabasePrefix() + "__" + study.replace("@", "_").replace(":", "_"); + return catalogManager.getConfiguration().getDatabasePrefix() + "-rga-" + study.replace("@", "_").replace(":", "_"); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java index 01b1eab53c9..5538165e0b5 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/ClinicalCommandExecutor.java @@ -36,6 +36,7 @@ import org.opencb.opencga.app.cli.internal.options.ClinicalCommandOptions; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; import java.io.FileInputStream; import java.io.IOException; @@ -100,9 +101,9 @@ public void execute() throws Exception { private void rgaIndex() throws ToolException { ClinicalCommandOptions.RgaSecondaryIndexCommandOptions options = clinicalCommandOptions.rgaSecondaryIndexCommandOptions; Path outDir = Paths.get(options.outdir); - ObjectMap params = new ObjectMap() - .append(RgaAnalysis.STUDY_PARAM, options.study) - .append(RgaAnalysis.FILE_PARAM, options.file); + ObjectMap params = new RgaAnalysisParams(options.file) + .toObjectMap(options.commonOptions.params) + .append(ParamConstants.STUDY_PARAM, options.study); toolRunner.execute(RgaAnalysis.class, params, outDir, options.jobOptions.jobId, options.commonOptions.token); } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java index c658c07f92d..77b78484ddb 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/options/ClinicalCommandOptions.java @@ -13,6 +13,7 @@ import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.internal.InternalCliOptionsParser; import org.opencb.opencga.app.cli.main.options.ClinicalCommandOptions.InterpretationTieringCommandOptions; +import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; import org.opencb.opencga.storage.app.cli.client.options.StorageVariantCommandOptions.BasicVariantQueryOptions; import java.util.List; @@ -261,7 +262,7 @@ public class RgaSecondaryIndexCommandOptions extends GeneralCliOptions.StudyOpti @ParametersDelegate public InternalCliOptionsParser.JobOptions jobOptions = internalJobOptions; - @Parameter(names = {"--" + RgaAnalysis.FILE_PARAM}, description = "Json file containing the KnockoutByIndividual information", required = true, arity = 1) + @Parameter(names = {"--" + RgaAnalysisParams.FILE}, description = "Json file containing the KnockoutByIndividual information", required = true, arity = 1) public String file; @Parameter(names = {"-o", "--outdir"}, description = "Directory where output files will be saved", required = true, arity = 1) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/RgaAnalysisParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/RgaAnalysisParams.java new file mode 100644 index 00000000000..4892f84ea01 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/RgaAnalysisParams.java @@ -0,0 +1,34 @@ +package org.opencb.opencga.core.models.clinical; + +import org.opencb.opencga.core.tools.ToolParams; + +public class RgaAnalysisParams extends ToolParams { + public static final String DESCRIPTION = "Recessive Gene Analysis index params"; + public static final String FILE = "file"; + + private String file; + + public RgaAnalysisParams() { + } + + public RgaAnalysisParams(String file) { + this.file = file; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("RgaAnalysisParams{"); + sb.append(", file='").append(file).append('\''); + sb.append('}'); + return sb.toString(); + } + + public String getFile() { + return file; + } + + public RgaAnalysisParams setFile(String file) { + this.file = file; + return this; + } +} diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index e8d628365ea..e6af428096f 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -26,6 +26,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.utils.ListUtils; +import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.CancerTieringInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.TieringInterpretationAnalysis; @@ -223,6 +224,8 @@ public class ExecutionDaemon extends MonitorParentDaemon { put(ZettaInterpretationAnalysis.ID, "clinical " + ZettaInterpretationAnalysis.ID + "-run"); put(CancerTieringInterpretationAnalysis.ID, "clinical " + CancerTieringInterpretationAnalysis.ID + "-run"); + put(RgaAnalysis.ID, "clinical " + RgaAnalysis.ID + "-run"); + put(JulieTool.ID, "variant julie-run"); }}; } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 31237751600..82cbc00a32d 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -25,6 +25,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.clinical.ClinicalInterpretationManager; +import org.opencb.opencga.analysis.clinical.rga.RgaAnalysis; import org.opencb.opencga.analysis.clinical.rga.RgaManager; import org.opencb.opencga.analysis.clinical.team.TeamInterpretationAnalysis; import org.opencb.opencga.analysis.clinical.tiering.CancerTieringInterpretationAnalysis; @@ -710,16 +711,15 @@ public Response rgaGeneQuery( @POST @Path("/rga/index/run") - @ApiOperation(value = TieringInterpretationAnalysis.DESCRIPTION, response = Job.class) + @ApiOperation(value = RgaAnalysis.DESCRIPTION, response = Job.class) public Response rgaIndexRun( @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String study, - @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String file, @ApiParam(value = ParamConstants.JOB_ID_CREATION_DESCRIPTION) @QueryParam(ParamConstants.JOB_ID) String jobName, @ApiParam(value = ParamConstants.JOB_DESCRIPTION_DESCRIPTION) @QueryParam(ParamConstants.JOB_DESCRIPTION) String jobDescription, @ApiParam(value = ParamConstants.JOB_DEPENDS_ON_DESCRIPTION) @QueryParam(JOB_DEPENDS_ON) String dependsOn, @ApiParam(value = ParamConstants.JOB_TAGS_DESCRIPTION) @QueryParam(ParamConstants.JOB_TAGS) String jobTags, - @ApiParam(value = TieringInterpretationAnalysisParams.DESCRIPTION, required = true) TieringInterpretationAnalysisParams params) { - return submitJob(TieringInterpretationAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); + @ApiParam(value = RgaAnalysisParams.DESCRIPTION, required = true) RgaAnalysisParams params) { + return submitJob(RgaAnalysis.ID, study, params, jobName, jobDescription, dependsOn, jobTags); } //------------------------------------------------------------------------- diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index 0c9a5904f8d..9bfbb08b809 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -433,14 +433,14 @@ private void loadJson(String collection, Path path) throws IOException, SolrServ count++; if (count % KNOCKOUT_BATCH_SIZE == 0) { insert(collection, knockoutByIndividualList); - logger.info("Loaded {} knockoutByIndividual entries from '{}'", count, path); + logger.debug("Loaded {} knockoutByIndividual entries from '{}'", count, path); knockoutByIndividualList.clear(); } } // Insert the remaining entries if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { - logger.info("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); + logger.debug("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); insert(collection, knockoutByIndividualList); } } From bff37bca0a7ecdbc6a86f04ff7e33da6a15bf19e Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 14 Jan 2021 11:38:57 +0100 Subject: [PATCH 017/412] storage: fix converter npe, #1693 --- .../knockout/KnockoutByIndividual.java | 54 ++++++++++++++++++- .../analysis/knockout/KnockoutTranscript.java | 14 +++++ .../analysis/knockout/KnockoutVariant.java | 14 +++++ .../storage/core/rga/GeneRgaConverter.java | 9 ++-- .../core/rga/IndividualRgaConverter.java | 38 +++++++------ 5 files changed, 110 insertions(+), 19 deletions(-) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java index e6d138362e5..b59b4e0a202 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java @@ -24,7 +24,6 @@ public class KnockoutByIndividual { - private String id; private String sampleId; private Sex sex; @@ -35,6 +34,34 @@ public class KnockoutByIndividual { private Map genesMap = new HashMap<>(); + public KnockoutByIndividual() { + } + + public KnockoutByIndividual(String id, String sampleId, Sex sex, List phenotypes, List disorders, + GeneKnockoutByIndividualStats stats, Map genesMap) { + this.id = id; + this.sampleId = sampleId; + this.sex = sex; + this.phenotypes = phenotypes; + this.disorders = disorders; + this.stats = stats; + this.genesMap = genesMap; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("KnockoutByIndividual{"); + sb.append("id='").append(id).append('\''); + sb.append(", sampleId='").append(sampleId).append('\''); + sb.append(", sex=").append(sex); + sb.append(", phenotypes=").append(phenotypes); + sb.append(", disorders=").append(disorders); + sb.append(", stats=").append(stats); + sb.append(", genesMap=").append(genesMap); + sb.append('}'); + return sb.toString(); + } + public String getId() { return id; } @@ -130,6 +157,16 @@ public GeneKnockoutByIndividualStats() { byType = new EnumMap<>(KnockoutVariant.KnockoutType.class); } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("GeneKnockoutByIndividualStats{"); + sb.append("numGenes=").append(numGenes); + sb.append(", numTranscripts=").append(numTranscripts); + sb.append(", byType=").append(byType); + sb.append('}'); + return sb.toString(); + } + public int getNumGenes() { return numGenes; } @@ -175,6 +212,21 @@ public KnockoutGene(String name) { this.name = name; } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("KnockoutGene{"); + sb.append("id='").append(id).append('\''); + sb.append(", name='").append(name).append('\''); + sb.append(", chromosome='").append(chromosome).append('\''); + sb.append(", start=").append(start); + sb.append(", end=").append(end); + sb.append(", biotype='").append(biotype).append('\''); + sb.append(", strand='").append(strand).append('\''); + sb.append(", transcriptsMap=").append(transcriptsMap); + sb.append('}'); + return sb.toString(); + } + public String getId() { return id; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutTranscript.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutTranscript.java index bdac83261bf..2e5acf294c2 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutTranscript.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutTranscript.java @@ -37,6 +37,20 @@ public KnockoutTranscript(String id) { this.id = id; } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("KnockoutTranscript{"); + sb.append("id='").append(id).append('\''); + sb.append(", chromosome='").append(chromosome).append('\''); + sb.append(", start=").append(start); + sb.append(", end=").append(end); + sb.append(", biotype='").append(biotype).append('\''); + sb.append(", strand='").append(strand).append('\''); + sb.append(", variants=").append(variants); + sb.append('}'); + return sb.toString(); + } + public String getId() { return id; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java index 025ca550630..b27c1083b6a 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java @@ -53,6 +53,20 @@ public KnockoutVariant(String id, String genotype, String filter, String qual, K this.populationFrequencies = populationFrequencies; } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("KnockoutVariant{"); + sb.append("id='").append(id).append('\''); + sb.append(", genotype='").append(genotype).append('\''); + sb.append(", filter='").append(filter).append('\''); + sb.append(", qual='").append(qual).append('\''); + sb.append(", knockoutType=").append(knockoutType); + sb.append(", populationFrequencies=").append(populationFrequencies); + sb.append(", sequenceOntologyTerms=").append(sequenceOntologyTerms); + sb.append('}'); + return sb.toString(); + } + public String getId() { return id; } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java index 7320d96cac4..52a8281ccad 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/GeneRgaConverter.java @@ -1,6 +1,7 @@ package org.opencb.opencga.storage.core.rga; import com.fasterxml.jackson.core.JsonProcessingException; +import org.apache.commons.lang3.StringUtils; import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; @@ -40,9 +41,11 @@ public List convertToDataModelType(List rgaDataMod KnockoutByGene knockoutByGene = result.get(rgaDataModel.getGeneId()); KnockoutByGene.KnockoutIndividual knockoutIndividual = null; - for (KnockoutByGene.KnockoutIndividual individual : knockoutByGene.getIndividuals()) { - if (individual.getId().equals(rgaDataModel.getIndividualId())) { - knockoutIndividual = individual; + if (StringUtils.isNotEmpty(rgaDataModel.getIndividualId())) { + for (KnockoutByGene.KnockoutIndividual individual : knockoutByGene.getIndividuals()) { + if (rgaDataModel.getIndividualId().equals(individual.getId())) { + knockoutIndividual = individual; + } } } if (knockoutIndividual == null) { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index 1670c136785..b971c6d543e 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -40,25 +40,33 @@ public List convertToDataModelType(List rgaD knockoutByIndividual.setId(rgaDataModel.getIndividualId()); knockoutByIndividual.setSampleId(rgaDataModel.getSampleId()); knockoutByIndividual.setSex(IndividualProperty.Sex.valueOf(rgaDataModel.getSex())); - List phenotypes = new ArrayList<>(rgaDataModel.getPhenotypeJson().size()); - for (String phenotype : rgaDataModel.getPhenotypeJson()) { - try { - phenotypes.add(JacksonUtils.getDefaultObjectMapper().readValue(phenotype, Phenotype.class)); - } catch (JsonProcessingException e) { - logger.warn("Could not parse Phenotypes: {}", e.getMessage(), e); + if (rgaDataModel.getPhenotypeJson() != null) { + List phenotypes = new ArrayList<>(rgaDataModel.getPhenotypeJson().size()); + for (String phenotype : rgaDataModel.getPhenotypeJson()) { + try { + phenotypes.add(JacksonUtils.getDefaultObjectMapper().readValue(phenotype, Phenotype.class)); + } catch (JsonProcessingException e) { + logger.warn("Could not parse Phenotypes: {}", e.getMessage(), e); + } } + knockoutByIndividual.setPhenotypes(phenotypes); + } else { + knockoutByIndividual.setPhenotypes(Collections.emptyList()); } - knockoutByIndividual.setPhenotypes(phenotypes); - - List disorders = new ArrayList<>(rgaDataModel.getDisorderJson().size()); - for (String disorder : rgaDataModel.getDisorderJson()) { - try { - disorders.add(JacksonUtils.getDefaultObjectMapper().readValue(disorder, Disorder.class)); - } catch (JsonProcessingException e) { - logger.warn("Could not parse Disorders: {}", e.getMessage(), e); + + if (rgaDataModel.getDisorderJson() != null) { + List disorders = new ArrayList<>(rgaDataModel.getDisorderJson().size()); + for (String disorder : rgaDataModel.getDisorderJson()) { + try { + disorders.add(JacksonUtils.getDefaultObjectMapper().readValue(disorder, Disorder.class)); + } catch (JsonProcessingException e) { + logger.warn("Could not parse Disorders: {}", e.getMessage(), e); + } } + knockoutByIndividual.setDisorders(disorders); + } else { + knockoutByIndividual.setDisorders(Collections.emptyList()); } - knockoutByIndividual.setDisorders(disorders); List geneList = new LinkedList<>(); KnockoutByIndividual.KnockoutGene knockoutGene = new KnockoutByIndividual.KnockoutGene(); From 00008d3cadaeacc1978efc08c55f82aae4f58522 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 14 Jan 2021 15:51:03 +0100 Subject: [PATCH 018/412] storage: improve rga parser, #1693 --- .../analysis/knockout/KnockoutVariant.java | 1 - .../storage/core/rga/RgaQueryParser.java | 111 +++++++++++++++++- .../storage/core/rga/RgaEngineTest.java | 14 +-- .../storage/core/rga/RgaQueryParserTest.java | 20 ++++ 4 files changed, 131 insertions(+), 15 deletions(-) diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java index b27c1083b6a..38c4cc04d4b 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutVariant.java @@ -50,7 +50,6 @@ public KnockoutVariant(String id, String genotype, String filter, String qual, K this.knockoutType = knockoutType; this.populationFrequencies = populationFrequencies; this.sequenceOntologyTerms = sequenceOntologyTerms; - this.populationFrequencies = populationFrequencies; } @Override diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java index 947fc2c57d1..6ffec3e96e9 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java @@ -6,6 +6,7 @@ import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.solr.FacetQueryParser; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; import org.opencb.opencga.storage.core.exceptions.RgaException; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.slf4j.Logger; @@ -159,11 +160,98 @@ private void parseFilterValue(Query query, List filterList) throws RgaEx parseStringValue(popFreqList, RgaDataModel.POPULATION_FREQUENCIES, filterList, "&&"); } } else if (count > 1) { - // Complex filter - buildComplexQueryFilter(filterList, knockoutValues, filterValue, ctValues, popFreqValues); + if (knockoutValues.size() == 1 && KnockoutVariant.KnockoutType.COMP_HET.name().equals(knockoutValues.get(0).toUpperCase())) { + // COMP_HET complex filter + buildCompHetComplexQueryFilter(filterList, filterValue, ctValues, popFreqValues); + } else { + // Complex filter + buildComplexQueryFilter(filterList, knockoutValues, filterValue, ctValues, popFreqValues); + } } } + private void buildCompHetComplexQueryFilter(List filterList, String filterValue, List ctList, List popFreqList) + throws RgaException { + String koValue = RgaUtils.encode(COMP_HET.name()); + + // Filter + List filterValues; + if (StringUtils.isEmpty(filterValue)) { + filterValues = Arrays.asList("PASS", "NOT_PASS"); + } else { + filterValues = Collections.singletonList(filterValue); + } + filterValues = RgaUtils.parseFilterQuery(filterValues); + + // CT + List ctValues; + if (!ctList.isEmpty()) { + ctValues = new ArrayList<>(ctList.size()); + for (String ctValue : ctList) { + String encodedValue = String.valueOf(VariantQueryUtils.parseConsequenceType(ctValue)); + ctValues.add(encodedValue); + } + } else { + ctValues = Collections.emptyList(); + } + + // Pop. freq + List> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqList); + + buildComplexQuery(Collections.singletonList(koValue), generateSortedCombinations(filterValues), + generateSortedCombinations(ctValues), popFreqQueryList, filterList); + +// if (ctValues.isEmpty() && popFreqQueryList.isEmpty()) { +// // KT + FILTER +// List orFilterList = new LinkedList<>(); +// for (String filterVal : filterValues) { +// orFilterList.add(koValue + SEPARATOR + filterVal); +// } +// parseStringValue(orFilterList, RgaDataModel.COMPOUND_FILTERS, filterList, "||"); +// } else if (!ctValues.isEmpty() && !popFreqQueryList.isEmpty()) { +// // KT + FILTER + CT + POP_FREQ +// List andQueryList = new ArrayList<>(popFreqQueryList.size()); +// for (List tmpPopFreqList : popFreqQueryList) { +// List orQueryList = new LinkedList<>(); +// for (String popFreq : tmpPopFreqList) { +// for (String filterVal : generateSortedCombinations(filterValues)) { +// for (String ctValue : generateSortedCombinations(ctValues)) { +// orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + ctValue + SEPARATOR + popFreq); +// } +// } +// } +// parseStringValue(orQueryList, "", andQueryList, "||"); +// } +// parseStringValue(andQueryList, RgaDataModel.COMPOUND_FILTERS, filterList, "&&"); +// } else if (!ctValues.isEmpty()) { +// // KT + FILTER + CT +// List orFilterList = new LinkedList<>(); +// for (String koValue : koValues) { +// for (String filterVal : filterValues) { +// for (String ctValue : ctValues) { +// orFilterList.add(koValue + SEPARATOR + filterVal + SEPARATOR + ctValue); +// } +// } +// } +// parseStringValue(orFilterList, RgaDataModel.COMPOUND_FILTERS, filterList, "||"); +// } else { // POP_FREQ not empty +// // KT + FILTER + POP_FREQ +// List andQueryList = new ArrayList<>(popFreqQueryList.size()); +// for (List tmpPopFreqList : popFreqQueryList) { +// List orQueryList = new LinkedList<>(); +// for (String popFreq : tmpPopFreqList) { +// for (String koValue : koValues) { +// for (String filterVal : filterValues) { +// orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + popFreq); +// } +// } +// } +// parseStringValue(orQueryList, "", andQueryList, "||"); +// } +// parseStringValue(andQueryList, RgaDataModel.COMPOUND_FILTERS, filterList, "&&"); +// } + } + private void buildComplexQueryFilter(List filterList, List knockoutList, String filterValue, List ctList, List popFreqList) throws RgaException { // KT @@ -199,6 +287,11 @@ private void buildComplexQueryFilter(List filterList, List knock // Pop. freq List> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqList); + buildComplexQuery(koValues, filterValues, ctValues, popFreqQueryList, filterList); + } + + private void buildComplexQuery(List koValues, List filterValues, List ctValues, + List> popFreqQueryList, List filterList) { if (ctValues.isEmpty() && popFreqQueryList.isEmpty()) { // KT + FILTER List orFilterList = new LinkedList<>(); @@ -254,6 +347,20 @@ private void buildComplexQueryFilter(List filterList, List knock } } + public static List generateSortedCombinations(List list) { + Set results = new HashSet<>(); + for (String term1 : list) { + for (String term2 : list) { + if (StringUtils.compare(term1, term2) <= 0) { + results.add(term1 + SEPARATOR + term2); + } else { + results.add(term2 + SEPARATOR + term1); + } + } + } + return new ArrayList<>(results); + } + // private void buildComplexQueryFilter(List filterList, List knockoutValues, String filterValue, List ctValues, // List popFreqValues) throws RgaException { // List> filters = new LinkedList<>(); diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java index 14057f32f30..11ad2cc7bc6 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java @@ -11,8 +11,10 @@ import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.config.StorageConfiguration; +import org.opencb.opencga.storage.core.exceptions.RgaException; import java.io.IOException; import java.io.InputStream; @@ -38,18 +40,6 @@ public void before() throws IOException { } } -// @Test -// public void load1000g() throws Exception { -// System.out.println(storageConfiguration.getRga()); -// RgaEngine rgaEngine = new RgaEngine(storageConfiguration); -// -// if (!rgaEngine.exists("rga-short")) { -// rgaEngine.create("rga-short"); -// } -// rgaEngine.load("rga-short", Paths.get("/data/datasets/knockout/knockout.individuals.json")); -// } - - @Test public void testIndividualQuery() throws Exception { RgaEngine rgaEngine = solr.configure(storageConfiguration); diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java index f096a4b2e76..781a5e06893 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java @@ -93,5 +93,25 @@ public void parse() throws RgaException { .append(RgaQueryParams.FILTER.key(), "PASS"); parse = parser.parse(query, QueryOptions.empty()); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( HOA__P__P1-1 || HEA__P__P1-1 || HOA__P__P1-2 || HEA__P__P1-2 || HOA__P__P1-3 || HEA__P__P1-3 ) && ( HOA__P__P2-8 || HEA__P__P2-8 ) )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001") + .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( CH__P__P__P1-1 || CH__NP__NP__P1-1 || CH__NP__P__P1-1 || CH__P__P__P1-2 || CH__NP__NP__P1-2 || CH__NP__P__P1-2 || CH__P__P__P1-3 || CH__NP__NP__P1-3 || CH__NP__P__P1-3 )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001") + .append(RgaQueryParams.FILTER.key(), "PASS") + .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( CH__P__P__P1-1 || CH__P__P__P1-2 || CH__P__P__P1-3 )", parse.get("fq")); + + query = new Query() + .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<=0.001") + .append(RgaQueryParams.FILTER.key(), "PASS") + .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( CH__P__P__P1-1 || CH__P__P__P1-2 || CH__P__P__P1-3 || CH__P__P__P1-4 )", parse.get("fq")); } } \ No newline at end of file From a4f62b6930a12659ae1220e122b5cb0ff98387e4 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 15 Jan 2021 11:14:51 +0100 Subject: [PATCH 019/412] storage: improve consequence type query parser, #1693 --- .../storage/core/rga/RgaQueryParser.java | 31 +++++++++++++++++++ .../storage/core/rga/RgaQueryParserTest.java | 13 +++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java index 6ffec3e96e9..9e61ce67c08 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java @@ -3,6 +3,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.common.SolrException; +import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.solr.FacetQueryParser; @@ -108,6 +109,7 @@ public SolrQuery parse(Query query, QueryOptions queryOptions) throws RgaExcepti //------------------------------------- // Query processing //------------------------------------- + fixQuery(query); parseStringValue(query, SAMPLE_ID, RgaDataModel.SAMPLE_ID, filterList); parseStringValue(query, INDIVIDUAL_ID, RgaDataModel.INDIVIDUAL_ID, filterList); @@ -131,6 +133,35 @@ public SolrQuery parse(Query query, QueryOptions queryOptions) throws RgaExcepti return solrQuery; } + private void fixQuery(Query query) { + if (query.containsKey(CONSEQUENCE_TYPE.key())) { + // Convert CONSEQUENCE TYPES to full SO Terms so they can be successfully processed + List orConsequenceTypeList = query.getAsStringList(CONSEQUENCE_TYPE.key(), ","); + List andConsequenceTypeList = query.getAsStringList(CONSEQUENCE_TYPE.key(), ";"); + + List consequenceTypeList; + String separator; + if (orConsequenceTypeList.size() >= andConsequenceTypeList.size()) { + consequenceTypeList = orConsequenceTypeList; + separator = ","; + } else { + consequenceTypeList = andConsequenceTypeList; + separator = ";"; + } + + List result = new ArrayList<>(consequenceTypeList.size()); + for (String ct : consequenceTypeList) { + if (ct.startsWith("SO:")) { + result.add(ct); + } else { + result.add(ConsequenceTypeMappings.getSoAccessionString(ct)); + } + } + + query.put(CONSEQUENCE_TYPE.key(), StringUtils.join(result, separator)); + } + } + private void parseFilterValue(Query query, List filterList) throws RgaException { List knockoutValues = query.getAsStringList(KNOCKOUT.key()); String filterValue = query.getString(FILTER.key()); diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java index 781a5e06893..f9b33edc0c3 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java @@ -20,7 +20,7 @@ public void setUp() throws Exception { } @Test - public void parse() throws RgaException { + public void parseComplexFilters() throws RgaException { Query query = new Query(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001"); SolrQuery parse = parser.parse(query, QueryOptions.empty()); assertEquals(RgaDataModel.POPULATION_FREQUENCIES + ":( P1-1 || P1-2 || P1-3 )", parse.get("fq")); @@ -114,4 +114,15 @@ public void parse() throws RgaException { parse = parser.parse(query, QueryOptions.empty()); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( CH__P__P__P1-1 || CH__P__P__P1-2 || CH__P__P__P1-3 || CH__P__P__P1-4 )", parse.get("fq")); } + + @Test + public void consequenceTypeParserTest() throws RgaException { + Query query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822"); + SolrQuery parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.CONSEQUENCE_TYPES + ":( SO\\:0001891 || SO\\:0001822 )", parse.get("fq")); + + query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "regulatory_region_amplification,inframe_deletion"); + parse = parser.parse(query, QueryOptions.empty()); + assertEquals(RgaDataModel.CONSEQUENCE_TYPES + ":( SO\\:0001891 || SO\\:0001822 )", parse.get("fq")); + } } \ No newline at end of file From 49f6096670a5c51b4dd811ccb6526081639fbad1 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 18 Jan 2021 10:03:16 +0100 Subject: [PATCH 020/412] storage: support limit and skip in rga queries, #1693 --- .../core/rga/IndividualRgaConverter.java | 4 +- .../opencga/storage/core/rga/RgaEngine.java | 138 +++----- .../storage/core/rga/RgaQueryParser.java | 307 ++---------------- .../storage/core/rga/RgaEngineTest.java | 4 - .../storage/core/rga/RgaQueryParserTest.java | 36 +- 5 files changed, 94 insertions(+), 395 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index b971c6d543e..71763f14403 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -177,7 +177,9 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI Map> popFreqs = getPopulationFrequencies(transcript); String id = knockoutByIndividual.getSampleId() + "_" + gene.getId() + "_" + transcript.getId(); - RgaDataModel model = new RgaDataModel(id, knockoutByIndividual.getId(), knockoutByIndividual.getSampleId(), + String individualId = StringUtils.isNotEmpty(knockoutByIndividual.getId()) ? knockoutByIndividual.getId() + : knockoutByIndividual.getSampleId(); + RgaDataModel model = new RgaDataModel(id, individualId, knockoutByIndividual.getSampleId(), knockoutByIndividual.getSex().name(), phenotypes, disorders, gene.getId(), gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, knockoutTypes, filters, consequenceTypes, popFreqs, compoundFilters, phenotypeJson, disorderJson, variantJson); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index 9bfbb08b809..efd7628921b 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; -import org.apache.commons.lang.StringUtils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.UpdateResponse; @@ -29,12 +28,14 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; public class RgaEngine implements Closeable { private SolrManager solrManager; - private RgaQueryParser queryParser; + private RgaQueryParser parser; private IndividualRgaConverter individualRgaConverter; private GeneRgaConverter geneConverter; private StorageConfiguration storageConfiguration; @@ -47,7 +48,7 @@ public class RgaEngine implements Closeable { public RgaEngine(StorageConfiguration storageConfiguration) { this.individualRgaConverter = new IndividualRgaConverter(); this.geneConverter = new GeneRgaConverter(); - this.queryParser = new RgaQueryParser(); + this.parser = new RgaQueryParser(); this.storageConfiguration = storageConfiguration; this.solrManager = new SolrManager(storageConfiguration.getRga().getHosts(), storageConfiguration.getRga().getMode(), @@ -157,14 +158,15 @@ public void load(String collection, Path path) throws IOException, RgaException */ public OpenCGAResult individualQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { - SolrQuery solrQuery = queryParser.parse(query, queryOptions); + SolrQuery solrQuery = fixQuery(collection, query, queryOptions); + solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; try { DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(result.getResults()); queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByIndividuals.size(), knockoutByIndividuals, - result.getNumMatches()); + -1); } catch (SolrServerException e) { throw new RgaException("Error executing KnockoutByIndividual query", e); } @@ -172,6 +174,28 @@ public OpenCGAResult individualQuery(String collection, Qu return new OpenCGAResult<>(queryResult); } + private SolrQuery fixQuery(String collection, Query query, QueryOptions queryOptions) throws IOException, RgaException { + int limit = queryOptions.getInt(QueryOptions.LIMIT); + int skip = queryOptions.getInt(QueryOptions.SKIP); + if (limit > 0 || skip > 0) { + // Perform first a facet to obtain all the different sample ids there are available + QueryOptions facetOptions = new QueryOptions() + .append(QueryOptions.SKIP, skip) + .append(QueryOptions.LIMIT, limit) + .append(QueryOptions.FACET, RgaQueryParams.SAMPLE_ID.key()); + DataResult facetFieldDataResult = facetedQuery(collection, query, facetOptions); + + // Add only the samples obtained after the facet + List sampleIds = facetFieldDataResult.first().getBuckets().stream().map(FacetField.Bucket::getValue) + .collect(Collectors.toList()); + query.append(RgaQueryParams.SAMPLE_ID.key(), sampleIds); + } + + SolrQuery solrQuery = parser.parseQuery(query); + parser.parseOptions(queryOptions, solrQuery); + return solrQuery; + } + /** * Return the list of KnockoutByGene objects from a Solr core/collection given a query. * @@ -184,7 +208,8 @@ public OpenCGAResult individualQuery(String collection, Qu */ public OpenCGAResult geneQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { - SolrQuery solrQuery = queryParser.parse(query, queryOptions); + SolrQuery solrQuery = parser.parseQuery(query); + solrQuery = parser.parseOptions(queryOptions, solrQuery); SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; try { @@ -211,7 +236,8 @@ public OpenCGAResult geneQuery(String collection, Query query, Q */ public OpenCGAResult nativeQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { - SolrQuery solrQuery = queryParser.parse(query, queryOptions); + SolrQuery solrQuery = parser.parseQuery(query); + solrQuery = parser.parseOptions(queryOptions, solrQuery); SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; try { @@ -256,7 +282,8 @@ public OpenCGAResult nativeQuery(String collection, Query query, Q public SolrNativeIterator nativeIterator(String collection, Query query, QueryOptions queryOptions) throws RgaException { try { - SolrQuery solrQuery = queryParser.parse(query, queryOptions); + SolrQuery solrQuery = parser.parseQuery(query); + solrQuery = parser.parseOptions(queryOptions, solrQuery); return new SolrNativeIterator(solrManager.getSolrClient(), collection, solrQuery); } catch (SolrServerException e) { throw new RgaException("Error getting KnockoutByIndividual iterator (native)", e); @@ -272,7 +299,7 @@ public SolrNativeIterator nativeIterator(String collection, Query query, QueryOp * @throws IOException IOException */ public long count(String collection, Query query) throws RgaException, IOException { - SolrQuery solrQuery = queryParser.parse(query, QueryOptions.empty()); + SolrQuery solrQuery = parser.parseQuery(query); SolrCollection solrCollection = solrManager.getCollection(collection); try { @@ -294,93 +321,15 @@ public long count(String collection, Query query) throws RgaException, IOExcepti */ public DataResult facetedQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { - // Pre-processing - // - As "genes" contains, for each gene: gene names, Ensembl gene ID and all its Ensembl transcript IDs, - // we do not have to repeat counts for all of them, by default, only for gene names - // - consequenceType is replaced by soAcc (i.e., by the field name in the Solr schema) - boolean replaceSoAcc = false; - boolean replaceGenes = false; - Map> includingValuesMap = new HashMap<>(); - if (queryOptions.containsKey(QueryOptions.FACET) && StringUtils.isNotEmpty(queryOptions.getString(QueryOptions.FACET))) { - String facetQuery = queryOptions.getString(QueryOptions.FACET); - -// // Gene management -// if (facetQuery.contains("genes[") -// && (facetQuery.contains("genes;") || facetQuery.contains("genes>>") || facetQuery.endsWith("genes"))) { -// throw new RgaException("Invalid gene facet query: " + facetQuery); -// } + SolrQuery solrQuery = parser.parseQuery(query); + if (queryOptions.containsKey(QueryOptions.FACET) + && org.apache.commons.lang3.StringUtils.isNotEmpty(queryOptions.getString(QueryOptions.FACET))) { try { - includingValuesMap = new FacetQueryParser().getIncludingValuesMap(facetQuery); - } catch (Exception e) { - throw new RgaException("Error parsing faceted query", e); - } - -// if (!facetQuery.contains("genes[") && facetQuery.contains("genes")) { -// // Force to query genes by prefix ENSG -// queryOptions.put(QueryOptions.FACET, facetQuery.replace("genes", "genes[ENSG0*]")); -// replaceGenes = true; -// } - - // Consequence type management -// facetQuery = queryOptions.getString(QueryOptions.FACET); -// if (facetQuery.contains("consequenceType")) { -// replaceSoAcc = true; -// -// facetQuery = facetQuery.replace("consequenceType", "soAcc"); -// queryOptions.put(QueryOptions.FACET, facetQuery); -// -// String[] split = facetQuery.split("soAcc\\["); -// if (split.length > 1 || facetQuery.startsWith("soAcc[")) { -// int start = 0; -// StringBuilder newFacetQuery = new StringBuilder(); -// if (!facetQuery.startsWith("soAcc[")) { -// newFacetQuery.append(split[0]); -// start = 1; -// } -// for (int i = start; i < split.length; i++) { -// newFacetQuery.append("soAcc"); -// -// // Manage values to include -// int index = split[i].indexOf("]"); -// String strValues = split[i].substring(0, index); -// String[] arrValues = strValues.split(","); -// List soAccs = new ArrayList<>(); -// for (String value: arrValues) { -// String val = value.replace("SO:", ""); -// try { -// // Try to get SO accession, and if it is a valid SO accession -// int soAcc = Integer.parseInt(val); -// if (ConsequenceTypeMappings.accessionToTerm.containsKey(soAcc)) { -// soAccs.add(String.valueOf(soAcc)); -// } -// } catch (NumberFormatException e) { -// // Otherwise, it is treated as a SO term, and check if it is a valid SO term -// if (ConsequenceTypeMappings.termToAccession.containsKey(val)) { -// soAccs.add(String.valueOf(ConsequenceTypeMappings.termToAccession.get(val))); -// } -// } -// } -// if (ListUtils.isNotEmpty(soAccs)) { -// newFacetQuery.append("[").append(StringUtils.join(soAccs, ",")).append("]"); -// } -// } -// queryOptions.put(QueryOptions.FACET, newFacetQuery.toString()); -// } -// } -// } - } - - // Query - SolrQuery solrQuery = queryParser.parse(query, queryOptions); - SolrCollection solrCollection = solrManager.getCollection(collection); - - /* - * try { FacetQueryParser facetQueryParser = new FacetQueryParser(); - String facetQuery = parseFacet(queryOptions.getString(QueryOptions.FACET)); - String jsonFacet = facetQueryParser.parse(facetQuery); + String facetQuery = parser.parseFacet(queryOptions.getString(QueryOptions.FACET)); + String jsonFacet = facetQueryParser.parse(facetQuery, queryOptions); solrQuery.set("json.facet", jsonFacet); solrQuery.setRows(0); @@ -391,8 +340,9 @@ public DataResult facetedQuery(String collection, Query query, Query } catch (Exception e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Solr parse exception: " + e.getMessage(), e); } - * */ + } + SolrCollection solrCollection = solrManager.getCollection(collection); DataResult facetResult; try { facetResult = solrCollection.facet(solrQuery, null); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java index 9e61ce67c08..86aba6bbd18 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParser.java @@ -2,7 +2,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; -import org.apache.solr.common.SolrException; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -31,108 +30,50 @@ public class RgaQueryParser { * Create a SolrQuery object from Query and QueryOptions. * * @param query Query - * @param queryOptions Query Options * @return SolrQuery * @throws RgaException RgaException. */ - public SolrQuery parse(Query query, QueryOptions queryOptions) throws RgaException { + public SolrQuery parseQuery(Query query) throws RgaException { SolrQuery solrQuery = new SolrQuery(); - List filterList = new ArrayList<>(); - - //------------------------------------- - // QueryOptions processing - //------------------------------------- - - // Facet management, (including facet ranges, nested facets and aggregation functions) - if (queryOptions.containsKey(QueryOptions.FACET) && StringUtils.isNotEmpty(queryOptions.getString(QueryOptions.FACET))) { - try { - FacetQueryParser facetQueryParser = new FacetQueryParser(); - - String facetQuery = parseFacet(queryOptions.getString(QueryOptions.FACET)); - String jsonFacet = facetQueryParser.parse(facetQuery); - - solrQuery.set("json.facet", jsonFacet); - solrQuery.setRows(0); - solrQuery.setStart(0); - solrQuery.setFields(); - - logger.debug(">>>>>> Solr Facet: " + solrQuery.toString()); - } catch (Exception e) { - throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Solr parse exception: " + e.getMessage(), e); - } - } else { - // If the query is not a facet we must set the proper include, limit, skip and sort - // Get the correct includes -// String[] includes; -// if (queryOptions.containsKey(QueryOptions.INCLUDE)) { -// includes = solrIncludeFields(queryOptions.getAsStringList(QueryOptions.INCLUDE)); -// } else { -// if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { -// includes = getSolrIncludeFromExclude(queryOptions.getAsStringList(QueryOptions.EXCLUDE)); -// } else { -// // We want all possible fields -// includes = getSolrIncludeFromExclude(Collections.emptyList()); -// } -// } -// includes = ArrayUtils.removeAllOccurences(includes, "release"); -// includes = includeFieldsWithMandatory(includes); -// solrQuery.setFields(includes); -// -// // Add Solr fields from the variant includes, i.e.: includeSample, includeFormat,... -// List solrFieldsToInclude = getSolrFieldsFromVariantIncludes(query, queryOptions); -// for (String solrField : solrFieldsToInclude) { -// solrQuery.addField(solrField); -// } - - if (queryOptions.containsKey(QueryOptions.INCLUDE)) { - for (String include : queryOptions.getAsStringList(QueryOptions.INCLUDE)) { - solrQuery.addField(include); - } - } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { -// includes = getSolrIncludeFromExclude(queryOptions.getAsStringList(QueryOptions.EXCLUDE)); - } - - if (queryOptions.containsKey(QueryOptions.LIMIT)) { - solrQuery.setRows(queryOptions.getInt(QueryOptions.LIMIT)); - } - - if (queryOptions.containsKey(QueryOptions.SKIP)) { - solrQuery.setStart(queryOptions.getInt(QueryOptions.SKIP)); - } + Query finalQuery = new Query(query); + fixQuery(finalQuery); -// if (queryOptions.containsKey(QueryOptions.SORT)) { -// solrQuery.addSort(queryOptions.getString(QueryOptions.SORT), getSortOrder(queryOptions)); -// } - } - - //------------------------------------- - // Query processing - //------------------------------------- - fixQuery(query); - - parseStringValue(query, SAMPLE_ID, RgaDataModel.SAMPLE_ID, filterList); - parseStringValue(query, INDIVIDUAL_ID, RgaDataModel.INDIVIDUAL_ID, filterList); - parseStringValue(query, SEX, RgaDataModel.SEX, filterList); - parseStringValue(query, PHENOTYPES, RgaDataModel.PHENOTYPES, filterList); - parseStringValue(query, DISORDERS, RgaDataModel.DISORDERS, filterList); - parseStringValue(query, GENE_ID, RgaDataModel.GENE_ID, filterList); - parseStringValue(query, GENE_NAME, RgaDataModel.GENE_NAME, filterList); - parseStringValue(query, TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_ID, filterList); - parseStringValue(query, TRANSCRIPT_BIOTYPE, RgaDataModel.TRANSCRIPT_BIOTYPE, filterList); - parseStringValue(query, VARIANTS, RgaDataModel.VARIANTS, filterList); - parseFilterValue(query, filterList); + List filterList = new ArrayList<>(); + parseStringValue(finalQuery, SAMPLE_ID, RgaDataModel.SAMPLE_ID, filterList); + parseStringValue(finalQuery, INDIVIDUAL_ID, RgaDataModel.INDIVIDUAL_ID, filterList); + parseStringValue(finalQuery, SEX, RgaDataModel.SEX, filterList); + parseStringValue(finalQuery, PHENOTYPES, RgaDataModel.PHENOTYPES, filterList); + parseStringValue(finalQuery, DISORDERS, RgaDataModel.DISORDERS, filterList); + parseStringValue(finalQuery, GENE_ID, RgaDataModel.GENE_ID, filterList); + parseStringValue(finalQuery, GENE_NAME, RgaDataModel.GENE_NAME, filterList); + parseStringValue(finalQuery, TRANSCRIPT_ID, RgaDataModel.TRANSCRIPT_ID, filterList); + parseStringValue(finalQuery, TRANSCRIPT_BIOTYPE, RgaDataModel.TRANSCRIPT_BIOTYPE, filterList); + parseStringValue(finalQuery, VARIANTS, RgaDataModel.VARIANTS, filterList); + parseFilterValue(finalQuery, filterList); // Create Solr query, adding filter queries and fields to show solrQuery.setQuery("*:*"); filterList.forEach(solrQuery::addFilterQuery); logger.debug("----------------------"); - logger.debug("query : " + printQuery(query)); + logger.debug("query : " + printQuery(finalQuery)); logger.debug("solrQuery : " + solrQuery); return solrQuery; } + public SolrQuery parseOptions(QueryOptions queryOptions, SolrQuery solrQuery) { + if (queryOptions.containsKey(QueryOptions.INCLUDE)) { + for (String include : queryOptions.getAsStringList(QueryOptions.INCLUDE)) { + solrQuery.addField(include); + } + } else if (queryOptions.containsKey(QueryOptions.EXCLUDE)) { +// includes = getSolrIncludeFromExclude(queryOptions.getAsStringList(QueryOptions.EXCLUDE)); + } + + return solrQuery; + } + private void fixQuery(Query query) { if (query.containsKey(CONSEQUENCE_TYPE.key())) { // Convert CONSEQUENCE TYPES to full SO Terms so they can be successfully processed @@ -232,55 +173,6 @@ private void buildCompHetComplexQueryFilter(List filterList, String filt buildComplexQuery(Collections.singletonList(koValue), generateSortedCombinations(filterValues), generateSortedCombinations(ctValues), popFreqQueryList, filterList); -// if (ctValues.isEmpty() && popFreqQueryList.isEmpty()) { -// // KT + FILTER -// List orFilterList = new LinkedList<>(); -// for (String filterVal : filterValues) { -// orFilterList.add(koValue + SEPARATOR + filterVal); -// } -// parseStringValue(orFilterList, RgaDataModel.COMPOUND_FILTERS, filterList, "||"); -// } else if (!ctValues.isEmpty() && !popFreqQueryList.isEmpty()) { -// // KT + FILTER + CT + POP_FREQ -// List andQueryList = new ArrayList<>(popFreqQueryList.size()); -// for (List tmpPopFreqList : popFreqQueryList) { -// List orQueryList = new LinkedList<>(); -// for (String popFreq : tmpPopFreqList) { -// for (String filterVal : generateSortedCombinations(filterValues)) { -// for (String ctValue : generateSortedCombinations(ctValues)) { -// orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + ctValue + SEPARATOR + popFreq); -// } -// } -// } -// parseStringValue(orQueryList, "", andQueryList, "||"); -// } -// parseStringValue(andQueryList, RgaDataModel.COMPOUND_FILTERS, filterList, "&&"); -// } else if (!ctValues.isEmpty()) { -// // KT + FILTER + CT -// List orFilterList = new LinkedList<>(); -// for (String koValue : koValues) { -// for (String filterVal : filterValues) { -// for (String ctValue : ctValues) { -// orFilterList.add(koValue + SEPARATOR + filterVal + SEPARATOR + ctValue); -// } -// } -// } -// parseStringValue(orFilterList, RgaDataModel.COMPOUND_FILTERS, filterList, "||"); -// } else { // POP_FREQ not empty -// // KT + FILTER + POP_FREQ -// List andQueryList = new ArrayList<>(popFreqQueryList.size()); -// for (List tmpPopFreqList : popFreqQueryList) { -// List orQueryList = new LinkedList<>(); -// for (String popFreq : tmpPopFreqList) { -// for (String koValue : koValues) { -// for (String filterVal : filterValues) { -// orQueryList.add(koValue + SEPARATOR + filterVal + SEPARATOR + popFreq); -// } -// } -// } -// parseStringValue(orQueryList, "", andQueryList, "||"); -// } -// parseStringValue(andQueryList, RgaDataModel.COMPOUND_FILTERS, filterList, "&&"); -// } } private void buildComplexQueryFilter(List filterList, List knockoutList, String filterValue, List ctList, @@ -392,93 +284,6 @@ public static List generateSortedCombinations(List list) { return new ArrayList<>(results); } -// private void buildComplexQueryFilter(List filterList, List knockoutValues, String filterValue, List ctValues, -// List popFreqValues) throws RgaException { -// List> filters = new LinkedList<>(); -// -// // Pop. freq -// List> popFreqQueryList = RgaUtils.parsePopulationFrequencyQuery(popFreqValues); -// for (List sublist : popFreqQueryList) { -// replicateFilters(filters, sublist.size()); -// addFilterValues(filters, sublist); -// } -// -// // CT -// if (!ctValues.isEmpty()) { -// List encodedCTValues = new ArrayList<>(ctValues.size()); -// for (String ctValue : ctValues) { -// String encodedValue = String.valueOf(VariantQueryUtils.parseConsequenceType(ctValue)); -// encodedCTValues.add(encodedValue); -// } -// replicateFilters(filters, encodedCTValues.size()); -// addFilterValues(filters, encodedCTValues); -// } -// -// // Filter -// List filterValues; -// if (StringUtils.isNotEmpty(filterValue)) { -// filterValues = Collections.singletonList(filterValue); -// } else { -// if (!filters.isEmpty()) { -// filterValues = Arrays.asList("PASS", "NOT_PASS"); -// } else { -// filterValues = Collections.emptyList(); -// } -// } -// filterValues = RgaUtils.parseFilterQuery(filterValues); -// replicateFilters(filters, filterValues.size()); -// addFilterValues(filters, filterValues); -// -// // KT -// if (knockoutValues.isEmpty() && !filters.isEmpty()) { -// knockoutValues = Arrays.asList(COMP_HET.name(), DELETION_OVERLAP.name(), HET_ALT.name(), HOM_ALT.name()); -// } -// knockoutValues = RgaUtils.parseKnockoutTypeQuery(knockoutValues); -// replicateFilters(filters, knockoutValues.size()); -// addFilterValues(filters, knockoutValues); -// -// if (!filters.isEmpty()) { -// filterList.add("cF:" + parseQueryFilter(filters)); -// } -// } - - private void addFilterValues(List> filters, List values) { - int size = values.size(); - for (int i = 0; i < filters.size(); i += size) { - for (int j = 0; j < values.size(); j++) { - filters.get(i + j).add(0, values.get(j)); - } - } - } - - private void replicateFilters(List> filters, int size) { - if (filters.isEmpty()) { - if (size > 0) { - for (int i = 0; i < size; i++) { - filters.add(new LinkedList<>()); - } - } - } else { - if (size > 1) { - // Replicate filters as many times as new elements we will need to add - int numberOfCopies = size - 1; - - List> replicatedFilterList = new LinkedList<>(); - - for (int i = 0; i < numberOfCopies; i++) { - List> tmpFilters = new ArrayList<>(filters.size()); - for (List filter : filters) { - tmpFilters.add(new ArrayList<>(filter)); - } - - replicatedFilterList.addAll(tmpFilters); - } - - filters.addAll(replicatedFilterList); - } - } - } - private void parseStringValue(Query query, RgaQueryParams queryParam, String storageKey, List filterList) { parseStringValue(query, queryParam, storageKey, filterList, "||"); } @@ -511,7 +316,7 @@ private List escapeValues(List values) { return result; } - private String parseFacet(String facetQuery) { + public String parseFacet(String facetQuery) { StringBuilder sb = new StringBuilder(); String[] facets = facetQuery.split(FacetQueryParser.FACET_SEPARATOR); @@ -538,60 +343,6 @@ private String parseFacet(String facetQuery) { return sb.toString(); } - private String parseQueryFilter(List filters) { - StringBuilder builder = new StringBuilder(); - if (filters.size() > 1) { - builder.append("( "); - } - for (int i = 0; i < filters.size(); i++) { - if (i != 0) { - builder.append("|| "); - } - builder.append(filters.get(i)).append(" "); - } - if (filters.size() > 1) { - builder.append(")"); - } - - return builder.toString(); - } - -// private String parseQueryFilter(List> filters) { -// StringBuilder builder = new StringBuilder(); -// if (filters.size() > 1) { -// builder.append("( "); -// } -// for (int i = 0; i < filters.size(); i++) { -// if (i != 0) { -// builder.append("|| "); -// } -// List filter = filters.get(i); -// builder.append(StringUtils.join(filter, SEPARATOR)).append(" "); -// } -// if (filters.size() > 1) { -// builder.append(")"); -// } -// -// return builder.toString(); -// } - -// private String parseFacet(String facet, String categoryName) { -// if (facet.contains("(")) { -// // Aggregation function -// return facet.replace(categoryName, "").replace("[", "").replace("]", ""); -// } else if (facet.contains("..")) { -// // Range -// Matcher matcher = FACET_RANGE_PATTERN.matcher(facet); -// if (matcher.find()) { -// return matcher.group(2) + "[" + matcher.group(3) + "]:" + matcher.group(4); -// } else { -// throw VariantQueryException.malformedParam(categoryName, facet, "Invalid syntax for facet range."); -// } -// } -// // Nothing to do -// return facet; -// } - private String toSolrSchemaFields(String facet) { // if (facet.contains(CHROM_DENSITY)) { // return parseChromDensity(facet); diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java index 11ad2cc7bc6..733a5b7daa1 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java @@ -7,18 +7,14 @@ import org.opencb.commons.datastore.core.FacetField; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.opencga.core.common.GitRepositoryState; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; -import org.opencb.opencga.core.models.clinical.RgaAnalysisParams; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.config.StorageConfiguration; -import org.opencb.opencga.storage.core.exceptions.RgaException; import java.io.IOException; import java.io.InputStream; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java index f9b33edc0c3..c9d996c1ca1 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaQueryParserTest.java @@ -22,42 +22,42 @@ public void setUp() throws Exception { @Test public void parseComplexFilters() throws RgaException { Query query = new Query(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001"); - SolrQuery parse = parser.parse(query, QueryOptions.empty()); + SolrQuery parse = parser.parseQuery(query); assertEquals(RgaDataModel.POPULATION_FREQUENCIES + ":( P1-1 || P1-2 || P1-3 )", parse.get("fq")); query = new Query(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">0.05"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.POPULATION_FREQUENCIES + ":( ( P1-1 || P1-2 || P1-3 ) && P2-8 )", parse.get("fq")); query = new Query(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.05"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.POPULATION_FREQUENCIES + ":( ( P1-1 || P1-2 || P1-3 ) && ( P2-8 || P2-7 ) )", parse.get("fq")); query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.CONSEQUENCE_TYPES + ":( SO\\:0001891 || SO\\:0001822 )", parse.get("fq")); query = new Query(RgaQueryParams.FILTER.key(), "PASS"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.FILTERS + ":PASS", parse.get("fq")); query = new Query(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.KNOCKOUT_TYPES + ":( HOM_ALT || HET_ALT )", parse.get("fq")); query = new Query() .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.05") .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( CH__P__1891__P1-1 || CH__P__1822__P1-1 || CH__NP__1891__P1-1 || CH__NP__1822__P1-1 || DO__P__1891__P1-1 || DO__P__1822__P1-1 || DO__NP__1891__P1-1 || DO__NP__1822__P1-1 || HEA__P__1891__P1-1 || HEA__P__1822__P1-1 || HEA__NP__1891__P1-1 || HEA__NP__1822__P1-1 || HOA__P__1891__P1-1 || HOA__P__1822__P1-1 || HOA__NP__1891__P1-1 || HOA__NP__1822__P1-1 || CH__P__1891__P1-2 || CH__P__1822__P1-2 || CH__NP__1891__P1-2 || CH__NP__1822__P1-2 || DO__P__1891__P1-2 || DO__P__1822__P1-2 || DO__NP__1891__P1-2 || DO__NP__1822__P1-2 || HEA__P__1891__P1-2 || HEA__P__1822__P1-2 || HEA__NP__1891__P1-2 || HEA__NP__1822__P1-2 || HOA__P__1891__P1-2 || HOA__P__1822__P1-2 || HOA__NP__1891__P1-2 || HOA__NP__1822__P1-2 || CH__P__1891__P1-3 || CH__P__1822__P1-3 || CH__NP__1891__P1-3 || CH__NP__1822__P1-3 || DO__P__1891__P1-3 || DO__P__1822__P1-3 || DO__NP__1891__P1-3 || DO__NP__1822__P1-3 || HEA__P__1891__P1-3 || HEA__P__1822__P1-3 || HEA__NP__1891__P1-3 || HEA__NP__1822__P1-3 || HOA__P__1891__P1-3 || HOA__P__1822__P1-3 || HOA__NP__1891__P1-3 || HOA__NP__1822__P1-3 ) && ( CH__P__1891__P2-8 || CH__P__1822__P2-8 || CH__NP__1891__P2-8 || CH__NP__1822__P2-8 || DO__P__1891__P2-8 || DO__P__1822__P2-8 || DO__NP__1891__P2-8 || DO__NP__1822__P2-8 || HEA__P__1891__P2-8 || HEA__P__1822__P2-8 || HEA__NP__1891__P2-8 || HEA__NP__1822__P2-8 || HOA__P__1891__P2-8 || HOA__P__1822__P2-8 || HOA__NP__1891__P2-8 || HOA__NP__1822__P2-8 || CH__P__1891__P2-7 || CH__P__1822__P2-7 || CH__NP__1891__P2-7 || CH__NP__1822__P2-7 || DO__P__1891__P2-7 || DO__P__1822__P2-7 || DO__NP__1891__P2-7 || DO__NP__1822__P2-7 || HEA__P__1891__P2-7 || HEA__P__1822__P2-7 || HEA__NP__1891__P2-7 || HEA__NP__1822__P2-7 || HOA__P__1891__P2-7 || HOA__P__1822__P2-7 || HOA__NP__1891__P2-7 || HOA__NP__1822__P2-7 ) )", parse.get("fq")); query = new Query() .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.05") .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822") .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( HOA__P__1891__P1-1 || HOA__P__1822__P1-1 || HOA__NP__1891__P1-1 || HOA__NP__1822__P1-1 || HEA__P__1891__P1-1 || HEA__P__1822__P1-1 || HEA__NP__1891__P1-1 || HEA__NP__1822__P1-1 || HOA__P__1891__P1-2 || HOA__P__1822__P1-2 || HOA__NP__1891__P1-2 || HOA__NP__1822__P1-2 || HEA__P__1891__P1-2 || HEA__P__1822__P1-2 || HEA__NP__1891__P1-2 || HEA__NP__1822__P1-2 || HOA__P__1891__P1-3 || HOA__P__1822__P1-3 || HOA__NP__1891__P1-3 || HOA__NP__1822__P1-3 || HEA__P__1891__P1-3 || HEA__P__1822__P1-3 || HEA__NP__1891__P1-3 || HEA__NP__1822__P1-3 ) && ( HOA__P__1891__P2-8 || HOA__P__1822__P2-8 || HOA__NP__1891__P2-8 || HOA__NP__1822__P2-8 || HEA__P__1891__P2-8 || HEA__P__1822__P2-8 || HEA__NP__1891__P2-8 || HEA__NP__1822__P2-8 || HOA__P__1891__P2-7 || HOA__P__1822__P2-7 || HOA__NP__1891__P2-7 || HOA__NP__1822__P2-7 || HEA__P__1891__P2-7 || HEA__P__1822__P2-7 || HEA__NP__1891__P2-7 || HEA__NP__1822__P2-7 ) )", parse.get("fq")); query = new Query() @@ -65,64 +65,64 @@ public void parseComplexFilters() throws RgaException { .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822") .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT) .append(RgaQueryParams.FILTER.key(), "PASS"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( HOA__P__1891__P1-1 || HOA__P__1822__P1-1 || HEA__P__1891__P1-1 || HEA__P__1822__P1-1 || HOA__P__1891__P1-2 || HOA__P__1822__P1-2 || HEA__P__1891__P1-2 || HEA__P__1822__P1-2 || HOA__P__1891__P1-3 || HOA__P__1822__P1-3 || HEA__P__1891__P1-3 || HEA__P__1822__P1-3 ) && ( HOA__P__1891__P2-8 || HOA__P__1822__P2-8 || HEA__P__1891__P2-8 || HEA__P__1822__P2-8 || HOA__P__1891__P2-7 || HOA__P__1822__P2-7 || HEA__P__1891__P2-7 || HEA__P__1822__P2-7 ) )", parse.get("fq")); query = new Query() .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822") .append(RgaQueryParams.FILTER.key(), "PASS"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( CH__P__1891 || CH__P__1822 || DO__P__1891 || DO__P__1822 || HEA__P__1891 || HEA__P__1822 || HOA__P__1891 || HOA__P__1822 )", parse.get("fq")); query = new Query() .append(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822") .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT) .append(RgaQueryParams.FILTER.key(), "PASS"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( HOA__P__1891 || HOA__P__1822 || HEA__P__1891 || HEA__P__1822 )", parse.get("fq")); query = new Query() .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.5") .append(RgaQueryParams.FILTER.key(), "PASS"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( CH__P__P1-1 || DO__P__P1-1 || HEA__P__P1-1 || HOA__P__P1-1 || CH__P__P1-2 || DO__P__P1-2 || HEA__P__P1-2 || HOA__P__P1-2 || CH__P__P1-3 || DO__P__P1-3 || HEA__P__P1-3 || HOA__P__P1-3 ) && ( CH__P__P2-8 || DO__P__P2-8 || HEA__P__P2-8 || HOA__P__P2-8 ) )", parse.get("fq")); query = new Query() .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001;" + RgaUtils.GNOMAD_GENOMES_STUDY + ">=0.5") .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.HOM_ALT + "," + KnockoutVariant.KnockoutType.HET_ALT) .append(RgaQueryParams.FILTER.key(), "PASS"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( ( HOA__P__P1-1 || HEA__P__P1-1 || HOA__P__P1-2 || HEA__P__P1-2 || HOA__P__P1-3 || HEA__P__P1-3 ) && ( HOA__P__P2-8 || HEA__P__P2-8 ) )", parse.get("fq")); query = new Query() .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001") .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( CH__P__P__P1-1 || CH__NP__NP__P1-1 || CH__NP__P__P1-1 || CH__P__P__P1-2 || CH__NP__NP__P1-2 || CH__NP__P__P1-2 || CH__P__P__P1-3 || CH__NP__NP__P1-3 || CH__NP__P__P1-3 )", parse.get("fq")); query = new Query() .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<0.001") .append(RgaQueryParams.FILTER.key(), "PASS") .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( CH__P__P__P1-1 || CH__P__P__P1-2 || CH__P__P__P1-3 )", parse.get("fq")); query = new Query() .append(RgaQueryParams.POPULATION_FREQUENCY.key(), RgaUtils.THOUSAND_GENOMES_STUDY + "<=0.001") .append(RgaQueryParams.FILTER.key(), "PASS") .append(RgaQueryParams.KNOCKOUT.key(), KnockoutVariant.KnockoutType.COMP_HET); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.COMPOUND_FILTERS + ":( CH__P__P__P1-1 || CH__P__P__P1-2 || CH__P__P__P1-3 || CH__P__P__P1-4 )", parse.get("fq")); } @Test public void consequenceTypeParserTest() throws RgaException { Query query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "SO:0001891,SO:0001822"); - SolrQuery parse = parser.parse(query, QueryOptions.empty()); + SolrQuery parse = parser.parseQuery(query); assertEquals(RgaDataModel.CONSEQUENCE_TYPES + ":( SO\\:0001891 || SO\\:0001822 )", parse.get("fq")); query = new Query(RgaQueryParams.CONSEQUENCE_TYPE.key(), "regulatory_region_amplification,inframe_deletion"); - parse = parser.parse(query, QueryOptions.empty()); + parse = parser.parseQuery(query); assertEquals(RgaDataModel.CONSEQUENCE_TYPES + ":( SO\\:0001891 || SO\\:0001822 )", parse.get("fq")); } } \ No newline at end of file From 3fe9d00b3b7e131a5ae8ec0022ca3f06bedf9167 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 18 Jan 2021 16:47:25 +0100 Subject: [PATCH 021/412] storage: add limit and skip to rga gene query, #1693 --- opencga-app/app/misc/solr/INSTALL.md | 1 + opencga-app/app/misc/solr/install.sh | 1 + .../opencga/storage/core/rga/RgaEngine.java | 14 ++-- .../opencga/storage/core/rga/RgaUtils.java | 67 +++++++++++++++++++ .../storage/core/rga/RgaEngineTest.java | 32 ++++++++- 5 files changed, 106 insertions(+), 9 deletions(-) diff --git a/opencga-app/app/misc/solr/INSTALL.md b/opencga-app/app/misc/solr/INSTALL.md index 4b217fc5c8b..ec696372690 100644 --- a/opencga-app/app/misc/solr/INSTALL.md +++ b/opencga-app/app/misc/solr/INSTALL.md @@ -12,6 +12,7 @@ In order to upload all of them, you need to execute the following commands: ``` $ ./bin/solr zk upconfig -n opencga-variant-configset-REPLACEME_OPENCGA_VERSION -d ~/opencga/build/misc/solr/opencga-variant-configset-REPLACEME_OPENCGA_VERSION -z localhost:9983 +$ ./bin/solr zk upconfig -n opencga-rga-configset-REPLACEME_OPENCGA_VERSION -d ~/opencga/build/misc/solr/opencga-rga-configset-REPLACEME_OPENCGA_VERSION -z localhost:9983 $ ./bin/solr zk upconfig -n opencga-cohort-configset-REPLACEME_OPENCGA_VERSION -d ~/opencga/build/misc/solr/opencga-cohort-configset-REPLACEME_OPENCGA_VERSION -z localhost:9983 $ ./bin/solr zk upconfig -n opencga-family-configset-REPLACEME_OPENCGA_VERSION -d ~/opencga/build/misc/solr/opencga-family-configset-REPLACEME_OPENCGA_VERSION -z localhost:9983 $ ./bin/solr zk upconfig -n opencga-file-configset-REPLACEME_OPENCGA_VERSION -d ~/opencga/build/misc/solr/opencga-file-configset-REPLACEME_OPENCGA_VERSION -z localhost:9983 diff --git a/opencga-app/app/misc/solr/install.sh b/opencga-app/app/misc/solr/install.sh index 4594c105c47..0f62d3d03de 100755 --- a/opencga-app/app/misc/solr/install.sh +++ b/opencga-app/app/misc/solr/install.sh @@ -14,6 +14,7 @@ echo "SOLR_HOME=${SOLR_HOME}" cd ${OPENCGA_HOME}/misc/solr ${SOLR_HOME}/bin/solr zk upconfig -n opencga-variant-configset-${VERSION} -d ./opencga-variant-configset-${VERSION} -z ${ZK_HOST} +${SOLR_HOME}/bin/solr zk upconfig -n opencga-rga-configset-${VERSION} -d ./opencga-rga-configset-${VERSION} -z ${ZK_HOST} ${SOLR_HOME}/bin/solr zk upconfig -n opencga-cohort-configset-${VERSION} -d ./opencga-cohort-configset-${VERSION} -z ${ZK_HOST} ${SOLR_HOME}/bin/solr zk upconfig -n opencga-family-configset-${VERSION} -d ./opencga-family-configset-${VERSION} -z ${ZK_HOST} ${SOLR_HOME}/bin/solr zk upconfig -n opencga-file-configset-${VERSION} -d ./opencga-file-configset-${VERSION} -z ${ZK_HOST} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index efd7628921b..facd16209d0 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -208,8 +208,8 @@ private SolrQuery fixQuery(String collection, Query query, QueryOptions queryOpt */ public OpenCGAResult geneQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { - SolrQuery solrQuery = parser.parseQuery(query); - solrQuery = parser.parseOptions(queryOptions, solrQuery); + SolrQuery solrQuery = fixQuery(collection, query, queryOptions); + solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; try { @@ -236,8 +236,8 @@ public OpenCGAResult geneQuery(String collection, Query query, Q */ public OpenCGAResult nativeQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { - SolrQuery solrQuery = parser.parseQuery(query); - solrQuery = parser.parseOptions(queryOptions, solrQuery); + SolrQuery solrQuery = fixQuery(collection, query, queryOptions); + solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; try { @@ -282,10 +282,10 @@ public OpenCGAResult nativeQuery(String collection, Query query, Q public SolrNativeIterator nativeIterator(String collection, Query query, QueryOptions queryOptions) throws RgaException { try { - SolrQuery solrQuery = parser.parseQuery(query); - solrQuery = parser.parseOptions(queryOptions, solrQuery); + SolrQuery solrQuery = fixQuery(collection, query, queryOptions); + solrQuery.setRows(Integer.MAX_VALUE); return new SolrNativeIterator(solrManager.getSolrClient(), collection, solrQuery); - } catch (SolrServerException e) { + } catch (SolrServerException | IOException e) { throw new RgaException("Error getting KnockoutByIndividual iterator (native)", e); } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java index e34b9629b76..e150ad98ef0 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaUtils.java @@ -9,6 +9,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import static org.opencb.opencga.storage.core.rga.RgaDataModel.*; + class RgaUtils { private static final Pattern OPERATION_PATTERN = Pattern.compile("^([^=<>~!]*)(>?=?|!=?|!?=?~|==?)([^=<>~!]+.*)$"); @@ -24,6 +26,9 @@ class RgaUtils { public static final String THOUSAND_GENOMES_STUDY = "1kG_phase3"; public static final String GNOMAD_GENOMES_STUDY = "GNOMAD_GENOMES"; + public static final Set ALL_PARAMS; + public static final Map> PARAM_TYPES; + static { ENCODE_MAP = new HashMap<>(); @@ -71,6 +76,66 @@ class RgaUtils { for (Map.Entry entry : ENCODE_MAP.entrySet()) { DECODE_MAP.put(entry.getValue(), entry.getKey()); } + + // All params + ALL_PARAMS = new HashSet<>(); + ALL_PARAMS.add(RgaDataModel.ID); + ALL_PARAMS.add(RgaDataModel.INDIVIDUAL_ID); + ALL_PARAMS.add(RgaDataModel.SAMPLE_ID); + ALL_PARAMS.add(RgaDataModel.SEX); + ALL_PARAMS.add(RgaDataModel.PHENOTYPES); + ALL_PARAMS.add(RgaDataModel.DISORDERS); + ALL_PARAMS.add(RgaDataModel.GENE_ID); + ALL_PARAMS.add(RgaDataModel.GENE_NAME); + ALL_PARAMS.add(RgaDataModel.GENE_BIOTYPE); + ALL_PARAMS.add(RgaDataModel.CHROMOSOME); + ALL_PARAMS.add(RgaDataModel.STRAND); + ALL_PARAMS.add(RgaDataModel.START); + ALL_PARAMS.add(RgaDataModel.END); + ALL_PARAMS.add(RgaDataModel.TRANSCRIPT_ID); + ALL_PARAMS.add(RgaDataModel.TRANSCRIPT_BIOTYPE); + ALL_PARAMS.add(RgaDataModel.VARIANTS); + ALL_PARAMS.add(RgaDataModel.KNOCKOUT_TYPES); + ALL_PARAMS.add(RgaDataModel.FILTERS); + ALL_PARAMS.add(RgaDataModel.CONSEQUENCE_TYPES); + ALL_PARAMS.add(RgaDataModel.POPULATION_FREQUENCIES); + ALL_PARAMS.add(RgaDataModel.COMPOUND_FILTERS); + ALL_PARAMS.add(PHENOTYPE_JSON); + ALL_PARAMS.add(DISORDER_JSON); + ALL_PARAMS.add(VARIANT_JSON); + + PARAM_TYPES = new HashMap<>(); + // Variant params + Set params = new HashSet<>(); + params.add(VARIANTS); + params.add(KNOCKOUT_TYPES); + params.add(FILTERS); + params.add(CONSEQUENCE_TYPES); + params.add(POPULATION_FREQUENCIES); + params.add(COMPOUND_FILTERS); + params.add(PHENOTYPE_JSON); + params.add(DISORDER_JSON); + params.add(VARIANT_JSON); + PARAM_TYPES.put("variants", params); + + // Transcript params + params = new HashSet<>(); + params.add(TRANSCRIPT_ID); + params.add(TRANSCRIPT_BIOTYPE); + params.addAll(PARAM_TYPES.get("variants")); + PARAM_TYPES.put("transcripts", params); + + // Gene params + params = new HashSet<>(); + params.add(GENE_ID); + params.add(GENE_NAME); + params.add(GENE_BIOTYPE); + params.add(CHROMOSOME); + params.add(STRAND); + params.add(START); + params.add(END); + params.addAll(PARAM_TYPES.get("transcripts")); + PARAM_TYPES.put("genes", params); } static String getPopulationFrequencyKey(Float popFreq) throws RgaException { @@ -183,4 +248,6 @@ static KeyOpValue parseKeyOpValue(String value) { } } + + } diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java index 733a5b7daa1..6cfb8ade67c 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java @@ -18,8 +18,7 @@ import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import static org.opencb.opencga.storage.core.rga.RgaUtilsTest.createKnockoutByIndividual; public class RgaEngineTest { @@ -94,6 +93,35 @@ public void testIndividualQuery() throws Exception { assertEquals(1, result.getNumResults()); } + @Test + public void testLimitAndSkip() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList); + OpenCGAResult result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions()); + + assertEquals(2, result.getNumResults()); + for (int i = 0; i < knockoutByIndividualList.size(); i++) { + assertEquals(JacksonUtils.getDefaultObjectMapper().writeValueAsString(knockoutByIndividualList.get(i)), + JacksonUtils.getDefaultObjectMapper().writeValueAsString(result.getResults().get(i))); + } + + result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions(QueryOptions.LIMIT, 1)); + assertEquals(1, result.getNumResults()); + String individualId = result.first().getId(); + + result = rgaEngine.individualQuery(collection, new Query(), new QueryOptions(QueryOptions.LIMIT, 1).append(QueryOptions.SKIP, 1)); + assertEquals(1, result.getNumResults()); + assertNotEquals(individualId, result.first().getId()); + } + @Test public void testGeneQuery() throws Exception { RgaEngine rgaEngine = solr.configure(storageConfiguration); From e058a7d9cded4702f161d94a54bd3efc23826d6c Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 20 Jan 2021 10:16:12 +0100 Subject: [PATCH 022/412] storage: fix ConcurrentModificationException issue, #1693 --- .../opencb/opencga/storage/core/rga/RgaQueryParams.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java index 6e6052c01aa..4b9f75978e0 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaQueryParams.java @@ -103,9 +103,14 @@ public static Query getQueryParams(Map options) { for (String key : options.keySet()) { if (VALUES_MAP.containsKey(key)) { query.put(key, options.get(key)); - options.remove(key); } } + + // Remove from options the keys added to the query object + for (String key : query.keySet()) { + options.remove(key); + } + return query; } } From a40778bc53f6a0076f0f8126cae15f74d95f4ae0 Mon Sep 17 00:00:00 2001 From: pfurio Date: Thu, 21 Jan 2021 22:36:33 +0100 Subject: [PATCH 023/412] storage: add new rga variant query, #1693 --- .../analysis/clinical/rga/RgaManager.java | 9 ++ .../knockout/KnockoutByIndividual.java | 13 +- .../analysis/knockout/KnockoutByVariant.java | 44 ++++++ .../analysis/knockout/KnockoutTranscript.java | 11 ++ .../rest/analysis/ClinicalWebService.java | 42 ++++++ .../opencga/storage/core/rga/RgaEngine.java | 36 ++++- .../storage/core/rga/VariantRgaConverter.java | 135 ++++++++++++++++++ .../storage/core/rga/RgaEngineTest.java | 18 +++ 8 files changed, 305 insertions(+), 3 deletions(-) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java index 4897f455005..3dd20103f10 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java @@ -10,6 +10,7 @@ import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; @@ -55,6 +56,14 @@ public OpenCGAResult geneQuery(String studyStr, Query query, Que return rgaEngine.geneQuery(collection, query, options); } + public OpenCGAResult variantQuery(String studyStr, Query query, QueryOptions options, String token) + throws CatalogException, IOException, RgaException { + Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + // TODO: Check Permissions + String collection = getCollectionName(study.getFqn()); + return rgaEngine.variantQuery(collection, query, options); + } + public void index(String studyStr, String fileStr, String token) throws CatalogException, RgaException, IOException { String userId = catalogManager.getUserManager().getUserId(token); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java index b59b4e0a202..6c4bc6c71a3 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java @@ -38,14 +38,13 @@ public KnockoutByIndividual() { } public KnockoutByIndividual(String id, String sampleId, Sex sex, List phenotypes, List disorders, - GeneKnockoutByIndividualStats stats, Map genesMap) { + GeneKnockoutByIndividualStats stats) { this.id = id; this.sampleId = sampleId; this.sex = sex; this.phenotypes = phenotypes; this.disorders = disorders; this.stats = stats; - this.genesMap = genesMap; } @Override @@ -208,6 +207,16 @@ public static class KnockoutGene { public KnockoutGene() { } + public KnockoutGene(String id, String name, String chromosome, int start, int end, String biotype, String strand) { + this.id = id; + this.name = name; + this.chromosome = chromosome; + this.start = start; + this.end = end; + this.biotype = biotype; + this.strand = strand; + } + public KnockoutGene(String name) { this.name = name; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java new file mode 100644 index 00000000000..87424a48062 --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByVariant.java @@ -0,0 +1,44 @@ +package org.opencb.opencga.core.models.analysis.knockout; + +import java.util.List; + +public class KnockoutByVariant { + + private String id; + private List individuals; + + public KnockoutByVariant() { + } + + public KnockoutByVariant(String id, List individuals) { + this.id = id; + this.individuals = individuals; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("KnockoutByVariant{"); + sb.append("id='").append(id).append('\''); + sb.append(", individuals=").append(individuals); + sb.append('}'); + return sb.toString(); + } + + public String getId() { + return id; + } + + public KnockoutByVariant setId(String id) { + this.id = id; + return this; + } + + public List getIndividuals() { + return individuals; + } + + public KnockoutByVariant setIndividuals(List individuals) { + this.individuals = individuals; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutTranscript.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutTranscript.java index 2e5acf294c2..52ae584b4b3 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutTranscript.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutTranscript.java @@ -37,6 +37,17 @@ public KnockoutTranscript(String id) { this.id = id; } + public KnockoutTranscript(String id, String chromosome, int start, int end, String biotype, String strand, + List variants) { + this.id = id; + this.chromosome = chromosome; + this.start = start; + this.end = end; + this.biotype = biotype; + this.strand = strand; + this.variants = variants; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("KnockoutTranscript{"); diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 82cbc00a32d..80d2f7dd0b1 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -709,6 +709,48 @@ public Response rgaGeneQuery( }); } + @GET + @Path("/rga/variant/query") + @ApiOperation(value = "Query variant RGA", response = KnockoutByIndividual.class) + @ApiImplicitParams({ + // Query options + @ApiImplicitParam(name = QueryOptions.INCLUDE, value = ParamConstants.INCLUDE_DESCRIPTION, example = "name,attributes", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.EXCLUDE, value = ParamConstants.EXCLUDE_DESCRIPTION, example = "id,status", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.LIMIT, value = ParamConstants.LIMIT_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.SKIP, value = ParamConstants.SKIP_DESCRIPTION, dataType = "integer", paramType = "query"), + @ApiImplicitParam(name = QueryOptions.COUNT, value = ParamConstants.COUNT_DESCRIPTION, dataType = "boolean", paramType = "query"), + + @ApiImplicitParam(name = "sampleId", value = RgaQueryParams.SAMPLE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "individualId", value = RgaQueryParams.INDIVIDUAL_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "sex", value = RgaQueryParams.SEX_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "phenotypes", value = RgaQueryParams.PHENOTYPES_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "disorders", value = RgaQueryParams.DISORDERS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneId", value = RgaQueryParams.GENE_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneName", value = RgaQueryParams.GENE_NAME_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "geneBiotype", value = RgaQueryParams.GENE_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "chromosome", value = RgaQueryParams.CHROMOSOME_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "start", value = RgaQueryParams.START_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "end", value = RgaQueryParams.END_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transcriptId", value = RgaQueryParams.TRANSCRIPT_ID_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transcriptBiotype", value = RgaQueryParams.TRANSCRIPT_BIOTYPE_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "variants", value = RgaQueryParams.VARIANTS_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "knockoutType", value = RgaQueryParams.KNOCKOUT_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "filter", value = RgaQueryParams.FILTER_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "populationFrequency", value = RgaQueryParams.POPULATION_FREQUENCY_DESCR, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "consequenceType", value = RgaQueryParams.CONSEQUENCE_TYPE_DESCR, dataType = "string", paramType = "query") + }) + public Response rgaVariantQuery( + @ApiParam(value = ParamConstants.STUDY_DESCRIPTION) @QueryParam(ParamConstants.STUDY_PARAM) String studyStr + ) { + // Get all query options + return run(() -> { + QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); + Query query = RgaQueryParams.getQueryParams(queryOptions); + + return rgaManager.variantQuery(studyStr, query, queryOptions, token); + }); + } + @POST @Path("/rga/index/run") @ApiOperation(value = RgaAnalysis.DESCRIPTION, response = Job.class) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index facd16209d0..ad74d1b7bea 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -16,6 +16,7 @@ import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.RgaException; @@ -38,6 +39,7 @@ public class RgaEngine implements Closeable { private RgaQueryParser parser; private IndividualRgaConverter individualRgaConverter; private GeneRgaConverter geneConverter; + private VariantRgaConverter variantConverter; private StorageConfiguration storageConfiguration; private Logger logger; @@ -48,6 +50,7 @@ public class RgaEngine implements Closeable { public RgaEngine(StorageConfiguration storageConfiguration) { this.individualRgaConverter = new IndividualRgaConverter(); this.geneConverter = new GeneRgaConverter(); + this.variantConverter = new VariantRgaConverter(); this.parser = new RgaQueryParser(); this.storageConfiguration = storageConfiguration; @@ -208,7 +211,8 @@ private SolrQuery fixQuery(String collection, Query query, QueryOptions queryOpt */ public OpenCGAResult geneQuery(String collection, Query query, QueryOptions queryOptions) throws RgaException, IOException { - SolrQuery solrQuery = fixQuery(collection, query, queryOptions); + SolrQuery solrQuery = parser.parseQuery(query); + parser.parseOptions(queryOptions, solrQuery); solrQuery.setRows(Integer.MAX_VALUE); SolrCollection solrCollection = solrManager.getCollection(collection); DataResult queryResult; @@ -224,6 +228,36 @@ public OpenCGAResult geneQuery(String collection, Query query, Q return new OpenCGAResult<>(queryResult); } + /** + * Return the list of KnockoutByVariant objects from a Solr core/collection given a query. + * + * @param collection Collection name + * @param query Query + * @param queryOptions Query options + * @return List of KnockoutByVariant objects + * @throws RgaException RgaException + * @throws IOException IOException + */ + public OpenCGAResult variantQuery(String collection, Query query, QueryOptions queryOptions) + throws RgaException, IOException { + SolrQuery solrQuery = parser.parseQuery(query); + parser.parseOptions(queryOptions, solrQuery); + solrQuery.setRows(Integer.MAX_VALUE); + SolrCollection solrCollection = solrManager.getCollection(collection); + DataResult queryResult; + try { + DataResult result = solrCollection.query(solrQuery, RgaDataModel.class); + List knockoutByVariants = variantConverter.convertToDataModelType(result.getResults(), + query.getAsStringList(RgaQueryParams.VARIANTS.key())); + queryResult = new OpenCGAResult<>(result.getTime(), result.getEvents(), knockoutByVariants.size(), knockoutByVariants, + -1); + } catch (SolrServerException e) { + throw new RgaException("Error executing KnockoutByVariant query", e); + } + + return new OpenCGAResult<>(queryResult); + } + /** * Return the list of RgaDataModel objects from a Solr core/collection given a query. * diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java new file mode 100644 index 00000000000..e05f471f6a4 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/VariantRgaConverter.java @@ -0,0 +1,135 @@ +package org.opencb.opencga.storage.core.rga; + +import org.opencb.commons.datastore.core.ComplexTypeConverter; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +public class VariantRgaConverter implements ComplexTypeConverter, List> { + + private Logger logger; + private IndividualRgaConverter individualRgaConverter; + + public VariantRgaConverter() { + this.logger = LoggerFactory.getLogger(VariantRgaConverter.class); + this.individualRgaConverter = new IndividualRgaConverter(); + } + + @Override + public List convertToDataModelType(List rgaDataModelList) { + return convertToDataModelType(rgaDataModelList, Collections.emptyList()); + } + + public List convertToDataModelType(List rgaDataModelList, List variantList) { + Set variantIds = new HashSet<>(variantList); + + List knockoutByIndividuals = individualRgaConverter.convertToDataModelType(rgaDataModelList); + Map> variantMap = new HashMap<>(); + + // Extract variants to the root to generate the KnockoutByVariant data model + for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividuals) { + Set tmpVariantIds = new HashSet<>(); + Map>> transcriptVariantMapList = new HashMap<>(); + + for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { + for (KnockoutTranscript transcript : gene.getTranscripts()) { + Set passedVariants = new HashSet<>(); + Map tmpVariantMap = new HashMap<>(); + Set chVariants = new HashSet<>(); + + transcriptVariantMapList.put(transcript.getId(), new HashMap<>()); + + for (KnockoutVariant variant : transcript.getVariants()) { + tmpVariantMap.put(variant.getId(), variant); + + if (variant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET) { + chVariants.add(variant.getId()); + } + // Include variant only if the variant is in the query or if user did not filter by any variant + if (variantIds.isEmpty() || variantIds.contains(variant.getId())) { + passedVariants.add(variant.getId()); + } + } + + tmpVariantIds.addAll(passedVariants); + + // Generate variant groups according to the variantList list + for (String variantId : passedVariants) { + List tmpVariantList = new LinkedList<>(); + KnockoutVariant knockoutVariant = tmpVariantMap.get(variantId); + tmpVariantList.add(knockoutVariant); + + if (knockoutVariant.getKnockoutType() == KnockoutVariant.KnockoutType.COMP_HET && chVariants.size() > 1) { + // Add all CH variants except itself + for (String chVariant : chVariants) { + if (!chVariant.equals(variantId)) { + tmpVariantList.add(tmpVariantMap.get(chVariant)); + } + } + } + + transcriptVariantMapList.get(transcript.getId()).put(variantId, tmpVariantList); + } + } + } + + // For each of the variants that need to be in the root, we add the corresponding filtered KnockoutByIndividual objects + for (String variantId : tmpVariantIds) { + if (!variantMap.containsKey(variantId)) { + variantMap.put(variantId, new LinkedList<>()); + } + + KnockoutByIndividual tmpKnockoutByIndividual = getFilteredKnockoutByIndividual(knockoutByIndividual, + transcriptVariantMapList, variantId); + variantMap.get(variantId).add(tmpKnockoutByIndividual); + } + } + + List result = new ArrayList<>(variantMap.size()); + for (String variantId : variantMap.keySet()) { + result.add(new KnockoutByVariant(variantId, variantMap.get(variantId))); + } + + return result; + } + + private KnockoutByIndividual getFilteredKnockoutByIndividual(KnockoutByIndividual knockoutByIndividual, + Map>> transcriptVariantMapList, + String variantId) { + KnockoutByIndividual newKnockoutByIndividual = new KnockoutByIndividual(knockoutByIndividual.getId(), + knockoutByIndividual.getSampleId(), knockoutByIndividual.getSex(), knockoutByIndividual.getPhenotypes(), + knockoutByIndividual.getDisorders(), knockoutByIndividual.getStats()); + + List geneList = new ArrayList<>(knockoutByIndividual.getGenes().size()); + for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { + List transcriptList = new ArrayList<>(gene.getTranscripts().size()); + for (KnockoutTranscript transcript : gene.getTranscripts()) { + Map> variantMap = transcriptVariantMapList.get(transcript.getId()); + List knockoutVariantList = variantMap.get(variantId); + if (knockoutVariantList != null && !knockoutVariantList.isEmpty()) { + transcriptList.add(new KnockoutTranscript(transcript.getId(), transcript.getChromosome(), transcript.getStart(), + transcript.getEnd(), transcript.getBiotype(), transcript.getStrand(), knockoutVariantList)); + } + } + + if (!transcriptList.isEmpty()) { + geneList.add(new KnockoutByIndividual.KnockoutGene(gene.getId(), gene.getName(), gene.getChromosome(), gene.getStart(), + gene.getEnd(), gene.getBiotype(), gene.getStrand()).addTranscripts(transcriptList)); + } + } + + newKnockoutByIndividual.setGenes(geneList); + + return newKnockoutByIndividual; + } + + @Override + public List convertToStorageType(List knockoutByVariants) { + return null; + } +} diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java index 6cfb8ade67c..bddb90bf4df 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/rga/RgaEngineTest.java @@ -10,6 +10,7 @@ import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; +import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.config.StorageConfiguration; @@ -189,6 +190,23 @@ public void testGeneQuery() throws Exception { assertEquals(2, result.getNumResults()); } + @Test + public void testVariantQuery() throws Exception { + RgaEngine rgaEngine = solr.configure(storageConfiguration); + + String collection = solr.coreName; + rgaEngine.create(collection); + + List knockoutByIndividualList = new ArrayList<>(2); + knockoutByIndividualList.add(createKnockoutByIndividual(1)); + knockoutByIndividualList.add(createKnockoutByIndividual(2)); + + rgaEngine.insert(collection, knockoutByIndividualList); + OpenCGAResult result = rgaEngine.variantQuery(collection, new Query(), new QueryOptions()); + + assertEquals(6, result.getNumResults()); + } + @Test public void testFacet() throws Exception { RgaEngine rgaEngine = solr.configure(storageConfiguration); From f497aa515b2ed4f35327251dc18729854aa1c08d Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 26 Jan 2021 12:05:49 +0100 Subject: [PATCH 024/412] catalog: add new RgaIndex to Individual and Sample, #1693 --- .../models/IndividualPrivateUpdateParams.java | 48 +++++++++++++++++++ .../models/SamplePrivateUpdateParams.java | 42 ++++++++++++++++ .../catalog/db/api/IndividualDBAdaptor.java | 1 + .../catalog/db/api/SampleDBAdaptor.java | 1 + .../db/mongodb/IndividualMongoDBAdaptor.java | 7 +++ .../db/mongodb/SampleMongoDBAdaptor.java | 7 +++ .../catalog/managers/IndividualManager.java | 2 +- .../catalog/managers/SampleManager.java | 2 +- .../AuthorizationMongoDBAdaptorTest.java | 10 ++-- .../db/mongodb/FileMongoDBAdaptorTest.java | 12 ++--- .../mongodb/IndividualMongoDBAdaptorTest.java | 8 ++-- .../db/mongodb/SampleMongoDBAdaptorTest.java | 14 +++--- ...dividualToSolrIndividualConverterTest.java | 2 +- ...atalogSampleToSolrSampleConverterTest.java | 4 +- .../opencga/core/models/common/RgaIndex.java | 47 ++++++++++++++++++ .../core/models/individual/Individual.java | 5 +- .../models/individual/IndividualInternal.java | 19 +++++++- .../opencga/core/models/sample/Sample.java | 3 +- .../core/models/sample/SampleInternal.java | 19 +++++++- 19 files changed, 220 insertions(+), 33 deletions(-) create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java create mode 100644 opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/SamplePrivateUpdateParams.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/common/RgaIndex.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java new file mode 100644 index 00000000000..aa8db38c993 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/IndividualPrivateUpdateParams.java @@ -0,0 +1,48 @@ +package org.opencb.opencga.analysis.models; + +import org.opencb.biodata.models.clinical.Disorder; +import org.opencb.biodata.models.clinical.Phenotype; +import org.opencb.biodata.models.pedigree.IndividualProperty; +import org.opencb.opencga.core.models.common.AnnotationSet; +import org.opencb.opencga.core.models.common.CustomStatusParams; +import org.opencb.opencga.core.models.individual.*; + +import java.util.List; +import java.util.Map; + +public class IndividualPrivateUpdateParams extends IndividualUpdateParams { + + private IndividualInternal internal; + + public IndividualPrivateUpdateParams() { + } + + public IndividualPrivateUpdateParams(String id, String name, String father, String mother, Boolean parentalConsanguinity, + Location location, IndividualProperty.Sex sex, String ethnicity, IndividualPopulation population, + String dateOfBirth, IndividualProperty.KaryotypicSex karyotypicSex, + IndividualProperty.LifeStatus lifeStatus, IndividualProperty.AffectationStatus affectationStatus, + List samples, List annotationSets, List phenotypes, + List disorders, CustomStatusParams status, IndividualQualityControl qualityControl, + Map attributes, IndividualInternal internal) { + super(id, name, father, mother, parentalConsanguinity, location, sex, ethnicity, population, dateOfBirth, karyotypicSex, lifeStatus, + affectationStatus, samples, annotationSets, phenotypes, disorders, status, qualityControl, attributes); + this.internal = internal; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("IndividualPrivateUpdateParams{"); + sb.append("internal=").append(internal); + sb.append('}'); + return sb.toString(); + } + + public IndividualInternal getInternal() { + return internal; + } + + public IndividualPrivateUpdateParams setInternal(IndividualInternal internal) { + this.internal = internal; + return this; + } +} diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/SamplePrivateUpdateParams.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/SamplePrivateUpdateParams.java new file mode 100644 index 00000000000..d7a4dc23ba4 --- /dev/null +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/models/SamplePrivateUpdateParams.java @@ -0,0 +1,42 @@ +package org.opencb.opencga.analysis.models; + +import org.opencb.biodata.models.clinical.Phenotype; +import org.opencb.opencga.core.models.common.AnnotationSet; +import org.opencb.opencga.core.models.common.CustomStatusParams; +import org.opencb.opencga.core.models.sample.*; + +import java.util.List; +import java.util.Map; + +public class SamplePrivateUpdateParams extends SampleUpdateParams { + + private SampleInternal internal; + + public SamplePrivateUpdateParams() { + } + + public SamplePrivateUpdateParams(String id, String description, String individualId, SampleProcessing processing, + SampleCollection collection, SampleQualityControl qualityControl, Boolean somatic, + List phenotypes, List annotationSets, Map attributes, + CustomStatusParams status, SampleInternal internal) { + super(id, description, individualId, processing, collection, qualityControl, somatic, phenotypes, annotationSets, attributes, status); + this.internal = internal; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("SamplePrivateUpdateParams{"); + sb.append("internal=").append(internal); + sb.append('}'); + return sb.toString(); + } + + public SampleInternal getInternal() { + return internal; + } + + public SamplePrivateUpdateParams setInternal(SampleInternal internal) { + this.internal = internal; + return this; + } +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/IndividualDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/IndividualDBAdaptor.java index 1a93197c241..d512479e688 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/IndividualDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/IndividualDBAdaptor.java @@ -61,6 +61,7 @@ enum QueryParams implements QueryParam { INTERNAL_STATUS("internal.status", TEXT_ARRAY, ""), INTERNAL_STATUS_NAME("internal.status.name", TEXT, ""), INTERNAL_STATUS_DATE("internal.status.date", TEXT, ""), + INTERNAL_RGA("internal.rga", OBJECT, ""), POPULATION_NAME("population.name", TEXT, ""), POPULATION_SUBPOPULATION("population.subpopulation", TEXT, ""), POPULATION_DESCRIPTION("population.description", TEXT, ""), diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java index 9bbc41acc60..585e4f7d331 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/SampleDBAdaptor.java @@ -66,6 +66,7 @@ enum QueryParams implements QueryParam { INTERNAL_STATUS("internal.status", TEXT_ARRAY, ""), INTERNAL_STATUS_NAME("internal.status.name", TEXT, ""), INTERNAL_STATUS_DATE("internal.status.date", TEXT, ""), + INTERNAL_RGA("internal.rga", OBJECT, ""), RELEASE("release", INTEGER, ""), // Release where the sample was created SNAPSHOT("snapshot", INTEGER, ""), // Last version of sample at release = snapshot VERSION("version", INTEGER, ""), // Version of the sample diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptor.java index 1fe90591b44..fd643e93bd3 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptor.java @@ -46,6 +46,7 @@ import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.individual.Individual; @@ -746,6 +747,12 @@ UpdateDocument parseAndValidateUpdateParams(ClientSession clientSession, ObjectM document.getSet().put(QueryParams.INTERNAL_STATUS_DATE.key(), TimeUtils.getTime()); } + if (parameters.containsKey(QueryParams.INTERNAL_RGA.key())) { + RgaIndex rgaIndex = parameters.get(QueryParams.INTERNAL_RGA.key(), RgaIndex.class); + rgaIndex.setDate(TimeUtils.getTime()); + document.getSet().put(QueryParams.INTERNAL_RGA.key(), getMongoDBDocument(rgaIndex, "rga")); + } + //Check individualIds exist String[] individualIdParams = {QueryParams.FATHER_UID.key(), QueryParams.MOTHER_UID.key()}; for (String individualIdParam : individualIdParams) { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptor.java index 390a32b2fc6..db6f000fbb6 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptor.java @@ -45,6 +45,7 @@ import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.Enums; +import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.sample.Sample; @@ -568,6 +569,12 @@ UpdateDocument parseAndValidateUpdateParams(ClientSession clientSession, ObjectM document.getSet().put(QueryParams.INTERNAL_STATUS_DATE.key(), TimeUtils.getTime()); } + if (parameters.containsKey(QueryParams.INTERNAL_RGA.key())) { + RgaIndex rgaIndex = parameters.get(QueryParams.INTERNAL_RGA.key(), RgaIndex.class); + rgaIndex.setDate(TimeUtils.getTime()); + document.getSet().put(QueryParams.INTERNAL_RGA.key(), getMongoDBDocument(rgaIndex, "rga")); + } + if (parameters.containsKey(QueryParams.INDIVIDUAL_ID.key())) { String individualId = parameters.getString(QueryParams.INDIVIDUAL_ID.key()); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java index 3673d3aa6cf..cf31e47197a 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/IndividualManager.java @@ -221,7 +221,7 @@ void validateNewIndividual(Study study, Individual individual, List samp individual.setStatus(ParamUtils.defaultObject(individual.getStatus(), CustomStatus::new)); individual.setQualityControl(ParamUtils.defaultObject(individual.getQualityControl(), IndividualQualityControl::new)); - individual.setInternal(ParamUtils.defaultObject(individual.getInternal(), IndividualInternal::new)); + individual.setInternal(ParamUtils.defaultObject(individual.getInternal(), IndividualInternal::init)); individual.getInternal().setStatus(new Status()); individual.setCreationDate(TimeUtils.getTime()); individual.setModificationDate(TimeUtils.getTime()); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java index 46db34e3fa5..61e75aa50be 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/SampleManager.java @@ -189,7 +189,7 @@ void validateNewSample(Study study, Sample sample, String userId) throws Catalog sample.setFileIds(ParamUtils.defaultObject(sample.getFileIds(), Collections.emptyList())); sample.setStatus(ParamUtils.defaultObject(sample.getStatus(), CustomStatus::new)); - sample.setInternal(ParamUtils.defaultObject(sample.getInternal(), SampleInternal::new)); + sample.setInternal(ParamUtils.defaultObject(sample.getInternal(), SampleInternal::init)); sample.getInternal().setStatus(new Status()); sample.setAttributes(ParamUtils.defaultObject(sample.getAttributes(), Collections.emptyMap())); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/AuthorizationMongoDBAdaptorTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/AuthorizationMongoDBAdaptorTest.java index 0eb5e64d596..985e27f3d32 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/AuthorizationMongoDBAdaptorTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/AuthorizationMongoDBAdaptorTest.java @@ -16,7 +16,10 @@ package org.opencb.opencga.catalog.db.mongodb; -import org.junit.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; import org.junit.rules.ExpectedException; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.Query; @@ -31,7 +34,6 @@ import org.opencb.opencga.catalog.exceptions.CatalogParameterException; import org.opencb.opencga.core.models.common.CustomStatus; import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.sample.SampleInternal; @@ -77,7 +79,7 @@ public void before() throws IOException, CatalogException { studyId = user3.getProjects().get(0).getStudies().get(0).getUid(); dbAdaptorFactory.getCatalogSampleDBAdaptor().insert(studyId, new Sample("s1", null, null, null, 1, 1, "", false, - Collections.emptyList(), new ArrayList<>(), new CustomStatus(), new SampleInternal(new Status()), Collections.emptyMap()), + Collections.emptyList(), new ArrayList<>(), new CustomStatus(), SampleInternal.init(), Collections.emptyMap()), Collections.emptyList(), QueryOptions.empty()); s1 = getSample(studyId, "s1"); acls = new HashMap<>(); @@ -232,7 +234,7 @@ public void setSampleAclOverride() throws Exception { public void testPermissionRulesPlusManualPermissions() throws CatalogException { // We create a new sample s2 dbAdaptorFactory.getCatalogSampleDBAdaptor().insert(studyId, new Sample("s2", null, null, null, 1, 1, "", false, - Collections.emptyList(), new ArrayList<>(), new CustomStatus(), new SampleInternal(new Status()), Collections.emptyMap()), + Collections.emptyList(), new ArrayList<>(), new CustomStatus(), SampleInternal.init(), Collections.emptyMap()), Collections.emptyList(), QueryOptions.empty()); Sample s2 = getSample(studyId, "s2"); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptorTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptorTest.java index 4cb425d249b..918b14b9e61 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptorTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/FileMongoDBAdaptorTest.java @@ -332,11 +332,11 @@ public void testGroupBy1() throws Exception { public void testAddSamples() throws Exception { long studyUid = user3.getProjects().get(0).getStudies().get(0).getUid(); new Status(); - catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample1").setInternal(new SampleInternal(new Status())), + catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample1").setInternal(SampleInternal.init()), Collections.emptyList(), QueryOptions.empty()); Sample sample1 = getSample(studyUid, "sample1"); new Status(); - catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample2").setInternal(new SampleInternal(new Status())), + catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample2").setInternal(SampleInternal.init()), Collections.emptyList(), QueryOptions.empty()); Sample sample2 = getSample(studyUid, "sample2"); @@ -351,7 +351,7 @@ public void testAddSamples() throws Exception { assertEquals(2, fileDataResult.first().getSampleIds().size()); assertTrue(Arrays.asList(sample1.getId(), sample2.getId()).containsAll(fileDataResult.first().getSampleIds())); - catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample3").setInternal(new SampleInternal(new Status())), + catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample3").setInternal(SampleInternal.init()), Collections.emptyList(), QueryOptions.empty()); Sample sample3 = getSample(studyUid, "sample3"); // Test we avoid duplicities @@ -366,15 +366,15 @@ public void testAddSamples() throws Exception { public void testRemoveSamples() throws Exception { long studyUid = user3.getProjects().get(0).getStudies().get(0).getUid(); new Status(); - catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample1").setInternal(new SampleInternal(new Status())), + catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample1").setInternal(SampleInternal.init()), Collections.emptyList(), QueryOptions.empty()); Sample sample1 = getSample(studyUid, "sample1"); new Status(); - catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample2").setInternal(new SampleInternal(new Status())), + catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample2").setInternal(SampleInternal.init()), Collections.emptyList(), QueryOptions.empty()); Sample sample2 = getSample(studyUid, "sample2"); new Status(); - catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample3").setInternal(new SampleInternal(new Status())), + catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyUid, new Sample().setId("sample3").setInternal(SampleInternal.init()), Collections.emptyList(), QueryOptions.empty()); Sample sample3 = getSample(studyUid, "sample3"); List files = user3.getProjects().get(0).getStudies().get(0).getFiles(); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptorTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptorTest.java index dc7340871d7..69d558de584 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptorTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/IndividualMongoDBAdaptorTest.java @@ -205,17 +205,17 @@ public void testModifyIndividualExistingName() throws Exception { public void testAvoidDuplicatedSamples() throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { long studyId = user3.getProjects().get(0).getStudies().get(0).getUid(); new Status(); - catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyId, new Sample().setId("sample1").setInternal(new SampleInternal(new Status())), + catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyId, new Sample().setId("sample1").setInternal(SampleInternal.init()), Collections.emptyList(), QueryOptions.empty()); Sample sample1 = getSample(studyId, "sample1"); new Status(); - catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyId, new Sample().setId("sample2").setInternal(new SampleInternal(new Status())), + catalogDBAdaptor.getCatalogSampleDBAdaptor().insert(studyId, new Sample().setId("sample2").setInternal(SampleInternal.init()), Collections.emptyList(), QueryOptions.empty()); Sample sample2 = getSample(studyId, "sample2"); Individual individual = new Individual() .setId("in2") - .setInternal(new IndividualInternal(new Status())) + .setInternal(IndividualInternal.init()) .setSamples(Arrays.asList(sample1, sample1, sample2)); catalogIndividualDBAdaptor.insert(studyId, individual, Collections.emptyList(), null); Individual individualStored = getIndividual(studyId, "in2"); @@ -315,7 +315,7 @@ public void testAvoidDuplicatedSamples() throws CatalogDBException, CatalogParam @Test public void testGetStudyIdByIndividualId() throws Exception { long studyId = user3.getProjects().get(0).getStudies().get(0).getUid(); - catalogIndividualDBAdaptor.insert(studyId, new Individual().setId("individual").setInternal(new IndividualInternal(new Status())), + catalogIndividualDBAdaptor.insert(studyId, new Individual().setId("individual").setInternal(IndividualInternal.init()), Collections.emptyList(), null); long individualUid = getIndividual(studyId, "individual").getUid(); long studyIdByIndividualId = catalogIndividualDBAdaptor.getStudyId(individualUid); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptorTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptorTest.java index 617998f50b2..50acfe04b9e 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptorTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/SampleMongoDBAdaptorTest.java @@ -88,9 +88,9 @@ public void before() throws IOException, CatalogException { studyId = user3.getProjects().get(0).getStudies().get(0).getUid(); catalogSampleDBAdaptor.insert(studyId, new Sample("s1", null, null, null, 1, 1, "", false, - Collections.emptyList(), new ArrayList<>(), new CustomStatus(), new SampleInternal(new Status()), Collections.emptyMap()), Collections.emptyList(), null); + Collections.emptyList(), new ArrayList<>(), new CustomStatus(), SampleInternal.init(), Collections.emptyMap()), Collections.emptyList(), null); catalogSampleDBAdaptor.insert(studyId, new Sample("s2", null, null, null, 1, 1, "", false, - Collections.emptyList(), new ArrayList<>(), new CustomStatus(), new SampleInternal(new Status()), Collections.emptyMap()), Collections.emptyList(), null); + Collections.emptyList(), new ArrayList<>(), new CustomStatus(), SampleInternal.init(), Collections.emptyMap()), Collections.emptyList(), null); } DataResult getSample(long studyUid, String sampleId, QueryOptions options) throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { @@ -223,7 +223,7 @@ public void searchByOntology() throws CatalogDBException, CatalogParameterExcept new Phenotype("go:123", "My go term", "go", Phenotype.Status.UNKNOWN) ); new Status(); - Sample sample1 = new Sample().setId("sample1").setPhenotypes(ontologyList).setInternal(new SampleInternal(new Status())); + Sample sample1 = new Sample().setId("sample1").setPhenotypes(ontologyList).setInternal(SampleInternal.init()); ontologyList = Arrays.asList( new Phenotype("hpo:789", "One hpo term", "hpo", Phenotype.Status.UNKNOWN), @@ -232,7 +232,7 @@ public void searchByOntology() throws CatalogDBException, CatalogParameterExcept new Phenotype("go:yyy", "My go term", "go", Phenotype.Status.UNKNOWN) ); new Status(); - Sample sample2 = new Sample().setId("sample2").setPhenotypes(ontologyList).setInternal(new SampleInternal(new Status())); + Sample sample2 = new Sample().setId("sample2").setPhenotypes(ontologyList).setInternal(SampleInternal.init()); catalogSampleDBAdaptor.insert(studyId, sample1, Collections.emptyList(), new QueryOptions()); catalogSampleDBAdaptor.insert(studyId, sample2, Collections.emptyList(), new QueryOptions()); @@ -341,7 +341,7 @@ public void getSampleWithIndividual() throws CatalogDBException, CatalogParamete // We create a new sample with the individual new Status(); - Sample sample = new Sample().setId("sample1").setInternal(new SampleInternal(new Status())); + Sample sample = new Sample().setId("sample1").setInternal(SampleInternal.init()); catalogSampleDBAdaptor.insert(studyId, sample, Collections.emptyList(), queryOptions); long sampleId = getSample(studyId, "sample1", queryOptions).first().getUid(); @@ -350,8 +350,8 @@ public void getSampleWithIndividual() throws CatalogDBException, CatalogParamete new Status(); Individual individual = new Individual() .setId(individualName) - .setInternal(new IndividualInternal(new Status())) - .setSamples(Arrays.asList(new Sample().setUid(sampleId).setVersion(1).setInternal(new SampleInternal(new Status())))); + .setInternal(IndividualInternal.init()) + .setSamples(Arrays.asList(new Sample().setUid(sampleId).setVersion(1).setInternal(SampleInternal.init()))); dbAdaptorFactory.getCatalogIndividualDBAdaptor().insert(studyId, individual, null, queryOptions); // Get the sample diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogIndividualToSolrIndividualConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogIndividualToSolrIndividualConverterTest.java index 362ee8b26d9..949a9db3b3a 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogIndividualToSolrIndividualConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogIndividualToSolrIndividualConverterTest.java @@ -52,7 +52,7 @@ public void IndividualToSolrTest() { new IndividualPopulation("valencian", "", ""), 2, AnnotationHelper.createAnnotation(), null); individual.setUid(300) - .setKaryotypicSex(IndividualProperty.KaryotypicSex.XX).setVersion(4).setInternal(new IndividualInternal(new Status("READY"))) + .setKaryotypicSex(IndividualProperty.KaryotypicSex.XX).setVersion(4).setInternal(IndividualInternal.init()) .setLifeStatus(IndividualProperty.LifeStatus.ABORTED) .setSamples(Arrays.asList(new Sample().setId("1"), new Sample().setId("2"))).setParentalConsanguinity(true); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java index 2e4b9e1a76b..f9c8615ecb7 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java @@ -22,10 +22,10 @@ import org.opencb.opencga.catalog.stats.solr.SampleSolrModel; import org.opencb.opencga.catalog.stats.solr.converters.CatalogSampleToSolrSampleConverter; import org.opencb.opencga.core.common.TimeUtils; +import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.individual.IndividualPopulation; import org.opencb.opencga.core.models.sample.Sample; -import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.sample.SampleInternal; import org.opencb.opencga.core.models.study.Study; @@ -53,7 +53,7 @@ public void SampleToSolrTest() { Sample sample = new Sample(); new Status("READY"); - sample.setUid(500).setRelease(3).setVersion(2).setInternal(new SampleInternal(new Status())) + sample.setUid(500).setRelease(3).setVersion(2).setInternal(SampleInternal.init()) .setSomatic(true).setCreationDate(TimeUtils.getTime()) .setAnnotationSets(AnnotationHelper.createAnnotation()); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/RgaIndex.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/RgaIndex.java new file mode 100644 index 00000000000..f0eccba59af --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/RgaIndex.java @@ -0,0 +1,47 @@ +package org.opencb.opencga.core.models.common; + +import org.opencb.opencga.core.common.TimeUtils; + +public class RgaIndex { + + private Status status; + private String date; + + public enum Status { + NOT_INDEXED, + INDEXED, + INVALID_PERMISSIONS, + INVALID_METADATA, + INVALID + } + + public RgaIndex() { + } + + public RgaIndex(Status status, String date) { + this.status = status; + this.date = date; + } + + public static RgaIndex init() { + return new RgaIndex(Status.NOT_INDEXED, TimeUtils.getTime()); + } + + public Status getStatus() { + return status; + } + + public RgaIndex setStatus(Status status) { + this.status = status; + return this; + } + + public String getDate() { + return date; + } + + public RgaIndex setDate(String date) { + this.date = date; + return this; + } +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/Individual.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/Individual.java index 87283794d77..b922b46d138 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/Individual.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/Individual.java @@ -26,7 +26,6 @@ import org.opencb.opencga.core.models.common.Annotable; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.CustomStatus; -import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.sample.Sample; import java.util.*; @@ -73,7 +72,7 @@ public Individual(String id, String name, Sex sex, String ethnicity, IndividualP List annotationSets, Map attributes) { this(id, name, new Individual(), new Individual(), new Location(), sex, null, ethnicity, population, "", release, 1, TimeUtils.getTime(), LifeStatus.UNKNOWN, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), - false, annotationSets, new CustomStatus(), new IndividualInternal(new Status()), attributes); + false, annotationSets, new CustomStatus(), null, attributes); } public Individual(String id, String name, Individual father, Individual mother, Location location, Sex sex, @@ -82,7 +81,7 @@ public Individual(String id, String name, Individual father, Individual mother, List annotationSets, List phenotypeList, List disorders) { this(id, name, father, mother, location, sex, karyotypicSex, ethnicity, population, dateOfBirth, release, 1, TimeUtils.getTime(), lifeStatus, phenotypeList, disorders, samples, parentalConsanguinity, - annotationSets, new CustomStatus(), new IndividualInternal(new Status()), Collections.emptyMap()); + annotationSets, new CustomStatus(), null, Collections.emptyMap()); } public Individual(String id, String name, Individual father, Individual mother, Location location, Sex sex, diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java index b1166cd728b..8f82ad4da3f 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/individual/IndividualInternal.java @@ -16,23 +16,31 @@ package org.opencb.opencga.core.models.individual; +import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.common.Status; public class IndividualInternal { private Status status; + private RgaIndex rga; public IndividualInternal() { } - public IndividualInternal(Status status) { + public IndividualInternal(Status status, RgaIndex rga) { this.status = status; + this.rga = rga; + } + + public static IndividualInternal init() { + return new IndividualInternal(new Status(Status.READY), RgaIndex.init()); } @Override public String toString() { final StringBuilder sb = new StringBuilder("IndividualInternal{"); sb.append("status=").append(status); + sb.append(", rga=").append(rga); sb.append('}'); return sb.toString(); } @@ -45,4 +53,13 @@ public IndividualInternal setStatus(Status status) { this.status = status; return this; } + + public RgaIndex getRga() { + return rga; + } + + public IndividualInternal setRga(RgaIndex rga) { + this.rga = rga; + return this; + } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/Sample.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/Sample.java index ace7a2879a6..207415885e6 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/Sample.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/Sample.java @@ -22,7 +22,6 @@ import org.opencb.opencga.core.models.common.Annotable; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.CustomStatus; -import org.opencb.opencga.core.models.common.Status; import java.util.HashMap; import java.util.LinkedList; @@ -64,7 +63,7 @@ public Sample() { public Sample(String id, String individualId, String description, int release) { this(id, null, new SampleProcessing("", "", "", "", "", "", new HashMap<>()), new SampleCollection("", "", "", "", "", new HashMap<>()), release, 1, "", "", description, false, new LinkedList<>(), individualId, new LinkedList<>(), - new CustomStatus(), new SampleInternal(new Status()), new LinkedList<>(), new HashMap<>()); + new CustomStatus(), null, new LinkedList<>(), new HashMap<>()); } public Sample(String id, String individualId, SampleProcessing processing, SampleCollection collection, int release, int version, diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleInternal.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleInternal.java index 79c783daef5..f21961b5901 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleInternal.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/sample/SampleInternal.java @@ -16,23 +16,31 @@ package org.opencb.opencga.core.models.sample; +import org.opencb.opencga.core.models.common.RgaIndex; import org.opencb.opencga.core.models.common.Status; public class SampleInternal { private Status status; + private RgaIndex rga; public SampleInternal() { } - public SampleInternal(Status status) { + public SampleInternal(Status status, RgaIndex rga) { this.status = status; + this.rga = rga; + } + + public static SampleInternal init() { + return new SampleInternal(new Status(Status.READY), RgaIndex.init()); } @Override public String toString() { final StringBuilder sb = new StringBuilder("SampleInternal{"); sb.append("status=").append(status); + sb.append(", rga=").append(rga); sb.append('}'); return sb.toString(); } @@ -45,4 +53,13 @@ public SampleInternal setStatus(Status status) { this.status = status; return this; } + + public RgaIndex getRga() { + return rga; + } + + public SampleInternal setRga(RgaIndex rga) { + this.rga = rga; + return this; + } } From 31fb92924de85e11b048f32833c3893d949fde44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 26 Jan 2021 12:15:07 +0000 Subject: [PATCH 025/412] storage: Update cellbase to 5.0.0-SNAPSHOT and biodata to 2.1.0-SNAPSHOT #1700 --- .../alignment/AlignmentStorageManager.java | 13 +- ...TieringInterpretationAnalysisExecutor.java | 64 +++-- .../individual/qc/IndividualQcAnalysis.java | 4 - .../individual/qc/IndividualQcUtils.java | 2 +- .../variant/knockout/KnockoutAnalysis.java | 17 +- .../KnockoutLocalAnalysisExecutor.java | 10 +- .../analysis/variant/VariantAnalysisTest.java | 4 +- .../utils/AvroToAnnotationConverterTest.java | 154 +++++----- .../knockout/KnockoutByIndividual.java | 2 +- .../local/LocalAlignmentDBAdaptor.java | 2 +- .../storage/core/utils/CellBaseUtils.java | 50 ++-- .../VariantAnnotationConstants.java | 182 ++++++++++++ .../AbstractCellBaseVariantAnnotator.java | 16 +- .../CellBaseRestVariantAnnotator.java | 13 +- ...itAssociationToEvidenceEntryConverter.java | 264 +++++++++--------- .../core/variant/io/VariantVcfDataWriter.java | 48 ++-- .../variant/query/VariantQueryParser.java | 6 +- .../core/variant/query/VariantQueryUtils.java | 30 +- .../CompoundHeterozygousQueryExecutor.java | 24 +- .../VariantSearchToVariantConverter.java | 78 +++--- .../search/solr/VariantSearchManager.java | 10 +- .../adaptors/VariantDBAdaptorTest.java | 8 +- .../annotators/VariantAnnotatorTest.java | 14 +- .../variant/search/VariantSearchTest.java | 5 +- .../HBaseToVariantAnnotationConverter.java | 11 - .../VariantAnnotationToPhoenixConverter.java | 26 +- .../annotation/AnnotationIndexConverter.java | 2 +- .../index/sample/SampleIndexQueryParser.java | 14 +- .../sample/SampleIndexQueryParserTest.java | 22 +- .../variant/index/sample/SampleIndexTest.java | 8 +- .../adaptors/VariantMongoDBAdaptor.java | 5 +- .../adaptors/VariantMongoDBQueryParser.java | 14 +- .../DocumentToVariantAnnotationConverter.java | 111 +++----- ...umentToVariantAnnotationConverterTest.java | 106 +++---- pom.xml | 4 +- 35 files changed, 732 insertions(+), 611 deletions(-) create mode 100644 opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationConstants.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java index 6db9684ca8c..8ad29b949ea 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/AlignmentStorageManager.java @@ -32,7 +32,6 @@ import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.commons.datastore.core.QueryResponse; import org.opencb.commons.utils.FileUtils; import org.opencb.opencga.analysis.StorageManager; import org.opencb.opencga.analysis.models.FileInfo; @@ -278,8 +277,7 @@ public OpenCGAResult coverageStats(String studyIdStr, String CellBaseClient cellBaseClient = new CellBaseClient(storageEngineFactory.getVariantStorageEngine().getConfiguration().getCellbase() .toClientConfiguration()); GeneClient geneClient = new GeneClient(species, assembly, cellBaseClient.getClientConfiguration()); - QueryResponse response = geneClient.get(Collections.singletonList(geneName), QueryOptions.empty()); - Gene gene = response.firstResult(); + Gene gene = geneClient.get(Collections.singletonList(geneName), QueryOptions.empty()).firstResult(); if (gene != null) { List transcriptCoverageStatsList = new ArrayList<>(); // Create region from gene coordinates @@ -476,9 +474,9 @@ public List mergeRegions(List regions, List genes, boole CellBaseClient cellBaseClient = new CellBaseClient(storageEngineFactory.getVariantStorageEngine().getConfiguration().getCellbase() .toClientConfiguration()); GeneClient geneClient = new GeneClient(species, assembly, cellBaseClient.getClientConfiguration()); - QueryResponse response = geneClient.get(genes, QueryOptions.empty()); - if (CollectionUtils.isNotEmpty(response.allResults())) { - for (Gene gene : response.allResults()) { + List response = geneClient.get(genes, QueryOptions.empty()).allResults(); + if (CollectionUtils.isNotEmpty(response)) { + for (Gene gene : response) { // Create region from gene coordinates Region region = null; if (onlyExons) { @@ -537,8 +535,7 @@ public Map> getExonRegionsPerTranscript(String geneName, St CellBaseClient cellBaseClient = new CellBaseClient(storageEngineFactory.getVariantStorageEngine().getConfiguration().getCellbase() .toClientConfiguration()); GeneClient geneClient = new GeneClient(species, assembly, cellBaseClient.getClientConfiguration()); - QueryResponse response = geneClient.get(Collections.singletonList(geneName), QueryOptions.empty()); - Gene gene = response.firstResult(); + Gene gene = geneClient.get(Collections.singletonList(geneName), QueryOptions.empty()).firstResult(); if (gene != null) { // Create region from gene coordinates if (CollectionUtils.isNotEmpty(gene.getTranscripts())) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java index 8bdcfeb0944..24bed60d0e1 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/tiering/CancerTieringInterpretationAnalysisExecutor.java @@ -22,11 +22,11 @@ import org.opencb.biodata.models.clinical.ClinicalProperty; import org.opencb.biodata.models.clinical.Disorder; import org.opencb.biodata.models.clinical.Phenotype; +import org.opencb.biodata.models.clinical.interpretation.GenomicFeature; +import org.opencb.biodata.models.clinical.interpretation.VariantClassification; import org.opencb.biodata.models.clinical.interpretation.*; import org.opencb.biodata.models.variant.Variant; -import org.opencb.biodata.models.variant.avro.ClinVar; -import org.opencb.biodata.models.variant.avro.ConsequenceType; -import org.opencb.biodata.models.variant.avro.SequenceOntologyTerm; +import org.opencb.biodata.models.variant.avro.*; import org.opencb.biodata.models.variant.stats.VariantStats; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -291,7 +291,7 @@ private List getGermlineVariants(Individual proband, List clinicalVariantIdSet = new HashSet<>(); for (Variant variant : variants) { List clinicalVariantEvidences = new ArrayList<>(); - List clinVars = getClinVars(variant); + List clinVars = getClinVars(variant); List varDiseasePanels = getDiseasePanels(variant, panels); if (CollectionUtils.isNotEmpty(varDiseasePanels)) { @@ -362,7 +362,7 @@ private List getGermlineVariants(Individual proband, List clinicalVariantEvidences = new ArrayList<>(); - List clinVars = getClinVars(variant); + List clinVars = getClinVars(variant); List varDiseasePanels = getDiseasePanels(variant, panels); if (CollectionUtils.isNotEmpty(varDiseasePanels)) { @@ -455,11 +455,12 @@ private String computeBiallelicTiering(DiseasePanel.GenePanel panelGene, Variant } } - private boolean isPathogenic(List clinVar) { - for (ClinVar cv : clinVar) { - String clinicalSignificance = cv.getClinicalSignificance(); - String reviewStatus = cv.getReviewStatus(); - if (("Pathogenic".equals(clinicalSignificance) || "Likely Pathogenic".equals(clinicalSignificance)) + private boolean isPathogenic(List clinVar) { + for (EvidenceEntry cv : clinVar) { + ClinicalSignificance clinicalSignificance = cv.getVariantClassification().getClinicalSignificance(); + String reviewStatus = getReviewStatus(cv);; + if ((ClinicalSignificance.pathogenic.equals(clinicalSignificance) + || ClinicalSignificance.likely_pathogenic.equals(clinicalSignificance)) && (PRACTICE_GUIDELINE.name().equals(reviewStatus) || REVIEWED_BY_EXPERT_PANEL.name().equals(reviewStatus) || CRITERIA_PROVIDED_MULTIPLE_SUBMITTERS_NO_CONFLICTS.name().equals(reviewStatus))) { @@ -469,11 +470,12 @@ private boolean isPathogenic(List clinVar) { return false; } - private boolean isBenign(List clinVar) { - for (ClinVar cv : clinVar) { - String clinicalSignificance = cv.getClinicalSignificance(); - String reviewStatus = cv.getReviewStatus(); - if (("Benign".equals(clinicalSignificance) || "Likely Benign".equals(clinicalSignificance)) + private boolean isBenign(List clinVar) { + for (EvidenceEntry cv : clinVar) { + ClinicalSignificance clinicalSignificance = cv.getVariantClassification().getClinicalSignificance(); + String reviewStatus = getReviewStatus(cv); + if ((ClinicalSignificance.benign.equals(clinicalSignificance) + || ClinicalSignificance.likely_benign.equals(clinicalSignificance)) && (PRACTICE_GUIDELINE.name().equals(reviewStatus) || REVIEWED_BY_EXPERT_PANEL.name().equals(reviewStatus) || CRITERIA_PROVIDED_MULTIPLE_SUBMITTERS_NO_CONFLICTS.name().equals(reviewStatus))) { @@ -483,6 +485,19 @@ private boolean isBenign(List clinVar) { return false; } + private String getReviewStatus(EvidenceEntry cv) { + String reviewStatus = null; + if (cv.getAdditionalProperties() != null) { + for (Property additionalProperty : cv.getAdditionalProperties()) { + if (additionalProperty.getName().equals("ReviewStatus_in_source_file")) { + reviewStatus = additionalProperty.getValue(); + break; + } + } + } + return reviewStatus; + } + private boolean isLoF(DiseasePanel.GenePanel panelGene) { // TODO: GenePanel class needs a new attribute in order to know if that gene is LoF return true; @@ -574,7 +589,7 @@ private List getTier3GenePanels(Individual proband, List p } private void addPanels(Query query, List panels) throws CatalogException { - if (query.containsKey(PANEL)) { + if (query.containsKey(PANEL.key())) { List panelsIds = query.getAsStringList(PANEL.key()); OpenCGAResult panelQueryResult = clinicalInterpretationManager.getCatalogManager().getPanelManager().get(studyId, panelsIds, QueryOptions.empty(), sessionId); @@ -625,11 +640,20 @@ private List filterVariants(List input, List samples) return variants; } - private List getClinVars(Variant variant) { + private List getClinVars(Variant variant) { // Get ClinVar object for a given variant - if (variant.getAnnotation() != null && variant.getAnnotation().getVariantTraitAssociation() != null - && CollectionUtils.isNotEmpty(variant.getAnnotation().getVariantTraitAssociation().getClinvar())) { - return variant.getAnnotation().getVariantTraitAssociation().getClinvar(); + if (variant.getAnnotation() != null && variant.getAnnotation().getTraitAssociation() != null) { + List clinvar = new LinkedList<>(); + for (EvidenceEntry evidenceEntry : variant.getAnnotation().getTraitAssociation()) { + if (evidenceEntry.getSource().getName().equals("clinvar")) { + clinvar.add(evidenceEntry); + } + } + if (clinvar.isEmpty()) { + return null; + } else { + return clinvar; + } } return null; } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java index 8766cf9b525..3d56527e2ae 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java @@ -23,24 +23,20 @@ import org.opencb.opencga.analysis.AnalysisUtils; import org.opencb.opencga.analysis.tools.OpenCgaTool; import org.opencb.opencga.catalog.exceptions.CatalogException; -import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.individual.Individual; -import org.opencb.opencga.core.models.individual.IndividualAclEntry; import org.opencb.opencga.core.models.individual.IndividualQualityControl; import org.opencb.opencga.core.models.individual.IndividualUpdateParams; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.study.Study; -import org.opencb.opencga.core.models.study.StudyAclEntry; import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.tools.variant.IndividualQcAnalysisExecutor; import java.io.IOException; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Arrays; import java.util.List; import java.util.Map; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java index aa235e68e46..3b3fc14530c 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcUtils.java @@ -137,7 +137,7 @@ public static String getAssembly(String study, CatalogManager catalogManager, St if (CollectionUtils.isNotEmpty(projectQueryResult.getResults())) { assembly = projectQueryResult.first().getOrganism().getAssembly(); } - if (org.apache.commons.lang.StringUtils.isNotEmpty(assembly)) { + if (StringUtils.isNotEmpty(assembly)) { assembly = assembly.toLowerCase(); } return assembly; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java index 5cd419eceeb..e7467ac9931 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutAnalysis.java @@ -26,8 +26,7 @@ import org.opencb.biodata.models.clinical.interpretation.DiseasePanel; import org.opencb.biodata.models.core.Gene; import org.opencb.biodata.models.core.Transcript; -import org.opencb.cellbase.core.api.GeneDBAdaptor; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; @@ -85,7 +84,7 @@ protected void check() throws Exception { if (StringUtils.isEmpty(analysisParams.getBiotype())) { if (CollectionUtils.isEmpty(analysisParams.getGene()) && CollectionUtils.isEmpty(analysisParams.getPanel())) { - analysisParams.setBiotype(VariantAnnotationUtils.PROTEIN_CODING); + analysisParams.setBiotype(VariantAnnotationConstants.PROTEIN_CODING); } } @@ -111,13 +110,13 @@ protected void run() throws Exception { // No genes or panel given. // Get genes by biotype List biotypes = new ArrayList<>(Arrays.asList(analysisParams.getBiotype().split(","))); - if (biotypes.contains(VariantAnnotationUtils.PROTEIN_CODING)) { + if (biotypes.contains(VariantAnnotationConstants.PROTEIN_CODING)) { allProteinCoding = true; proteinCodingGenes.add(VariantQueryUtils.ALL); - biotypes.remove(VariantAnnotationUtils.PROTEIN_CODING); + biotypes.remove(VariantAnnotationConstants.PROTEIN_CODING); } if (!biotypes.isEmpty()) { - Query query = new Query(GeneDBAdaptor.QueryParams.TRANSCRIPT_BIOTYPE.key(), String.join(",", biotypes)); + Query query = new Query(org.opencb.cellbase.core.ParamConstants.TRANSCRIPT_BIOTYPES_PARAM, String.join(",", biotypes)); for (Gene gene : cellBaseUtils.getCellBaseClient().getGeneClient().search(query, queryOptions).allResults()) { otherGenes.add(gene.getName()); } @@ -149,10 +148,10 @@ protected void run() throws Exception { .map(Transcript::getBiotype) .filter(biotypeFilter) .collect(Collectors.toSet()); - if (biotypes.contains(VariantAnnotationUtils.PROTEIN_CODING)) { + if (biotypes.contains(VariantAnnotationConstants.PROTEIN_CODING)) { proteinCodingGenes.add(gene.getName()); } - if (biotypes.size() == 1 && !biotypes.contains(VariantAnnotationUtils.PROTEIN_CODING) || biotypes.size() > 1) { + if (biotypes.size() == 1 && !biotypes.contains(VariantAnnotationConstants.PROTEIN_CODING) || biotypes.size() > 1) { otherGenes.add(gene.getName()); } } @@ -271,7 +270,7 @@ protected void run() throws Exception { KnockoutByGene knockoutByGene = reader.readValue(org.opencb.commons.utils.FileUtils.newBufferedReader(file.toPath())); QueryOptions queryOptions = new QueryOptions(QueryOptions.EXCLUDE, "transcripts,annotation.expression"); Gene gene = cellBaseUtils.getCellBaseClient().getGeneClient() - .search(new Query(GeneDBAdaptor.QueryParams.NAME.key(), knockoutByGene.getName()), queryOptions).firstResult(); + .search(new Query("name", knockoutByGene.getName()), queryOptions).firstResult(); knockoutByGene.setId(gene.getId()); knockoutByGene.setName(gene.getName()); knockoutByGene.setChromosome(gene.getChromosome()); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java index 1858c81de93..4d8394d760e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/knockout/KnockoutLocalAnalysisExecutor.java @@ -27,15 +27,15 @@ import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils; +import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; +import org.opencb.opencga.analysis.variant.manager.VariantStorageToolExecutor; +import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual.KnockoutGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutTranscript; import org.opencb.opencga.core.models.analysis.knockout.KnockoutVariant; -import org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils; -import org.opencb.opencga.analysis.variant.manager.VariantStorageManager; -import org.opencb.opencga.analysis.variant.manager.VariantStorageToolExecutor; -import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.tools.annotations.ToolExecutor; import org.opencb.opencga.storage.core.metadata.models.Trio; import org.opencb.opencga.storage.core.variant.adaptors.GenotypeClass; @@ -53,7 +53,7 @@ import java.util.function.Predicate; import static org.opencb.biodata.models.clinical.ClinicalProperty.ModeOfInheritance.COMPOUND_HETEROZYGOUS; -import static org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils.PROTEIN_CODING; +import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.PROTEIN_CODING; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.ALL; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.IS; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java index de134e2faa5..7aa7acb7d17 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/VariantAnalysisTest.java @@ -29,7 +29,7 @@ import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -580,7 +580,7 @@ public void testKnockoutGenesSpecificGenesAndBiotypeProteinCoding() throws Excep KnockoutAnalysisParams params = new KnockoutAnalysisParams(); params.setSample(file.getSampleIds()); params.setGene(Arrays.asList("MIR1909", "DZIP3", "BTN3A2", "ITIH5")); - params.setBiotype(VariantAnnotationUtils.PROTEIN_CODING); + params.setBiotype(VariantAnnotationConstants.PROTEIN_CODING); ExecutionResult er = toolRunner.execute(KnockoutAnalysis.class, params.toObjectMap(), outDir, null, token); checkExecutionResult(er, false); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/utils/AvroToAnnotationConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/utils/AvroToAnnotationConverterTest.java index ccbb856350e..a157ee2fc25 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/utils/AvroToAnnotationConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/utils/AvroToAnnotationConverterTest.java @@ -6,7 +6,6 @@ import org.opencb.biodata.models.variant.metadata.SampleVariantStats; import org.opencb.biodata.models.variant.metadata.VariantFileMetadata; import org.opencb.biodata.models.variant.metadata.VariantSetStats; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.models.study.Variable; import org.opencb.opencga.core.models.study.VariableSet; @@ -15,7 +14,10 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; public class AvroToAnnotationConverterTest { @@ -125,79 +127,79 @@ private void addConsequenceTypeKeys(Variable consequenceTypeCount) { } private void addBiotypeKeys(Variable biotypeCount) { - biotypeCount.setAllowedKeys(Arrays.asList( - VariantAnnotationUtils.THREEPRIME_OVERLAPPING_NCRNA, - "3prime_overlapping_ncRNA", - VariantAnnotationUtils.AMBIGUOUS_ORF, - VariantAnnotationUtils.ANTISENSE, - "antisense_RNA", - "bidirectional_promoter_lncRNA", - VariantAnnotationUtils.IG_C_GENE, - VariantAnnotationUtils.IG_C_PSEUDOGENE, - VariantAnnotationUtils.IG_D_GENE, - VariantAnnotationUtils.IG_J_GENE, - VariantAnnotationUtils.IG_J_PSEUDOGENE, - "IG_pseudogene", - VariantAnnotationUtils.IG_V_GENE, - VariantAnnotationUtils.IG_V_PSEUDOGENE, - - VariantAnnotationUtils.INTERGENIC_VARIANT, - - VariantAnnotationUtils.KNOWN_NCRNA, - VariantAnnotationUtils.LINCRNA, - VariantAnnotationUtils.LRG_GENE, - - "macro_lncRNA", - VariantAnnotationUtils.MIRNA, - VariantAnnotationUtils.MIRNA_PSEUDOGENE, - VariantAnnotationUtils.MISC_RNA, - VariantAnnotationUtils.MISC_RNA_PSEUDOGENE, - VariantAnnotationUtils.MT_RRNA, - VariantAnnotationUtils.MT_TRNA, - VariantAnnotationUtils.NMD_TRANSCRIPT_VARIANT, - VariantAnnotationUtils.NON_CODING, - VariantAnnotationUtils.NONSENSE_MEDIATED_DECAY, - VariantAnnotationUtils.NON_STOP_DECAY, - - VariantAnnotationUtils.POLYMORPHIC_PSEUDOGENE, - VariantAnnotationUtils.PROCESSED_PSEUDOGENE, - VariantAnnotationUtils.PROCESSED_TRANSCRIPT, - VariantAnnotationUtils.PROTEIN_CODING, - VariantAnnotationUtils.PSEUDOGENE, - - VariantAnnotationUtils.RETAINED_INTRON, - VariantAnnotationUtils.RETROTRANSPOSED, - "ribozyme", - VariantAnnotationUtils.RRNA, - VariantAnnotationUtils.RRNA_PSEUDOGENE, - - "scaRNA", - "scRNA", - VariantAnnotationUtils.SCRNA_PSEUDOGENE, - VariantAnnotationUtils.SENSE_INTRONIC, - VariantAnnotationUtils.SENSE_OVERLAPPING, - VariantAnnotationUtils.SNORNA, - VariantAnnotationUtils.SNORNA_PSEUDOGENE, - VariantAnnotationUtils.SNRNA, - VariantAnnotationUtils.SNRNA_PSEUDOGENE, - "sRNA", - - "TEC", - VariantAnnotationUtils.TRANSCRIBED_PROCESSED_PSEUDOGENE, - VariantAnnotationUtils.TRANSCRIBED_UNITARY_PSEUDOGENE, - VariantAnnotationUtils.TRANSCRIBED_UNPROCESSED_PSEUDGENE, - VariantAnnotationUtils.TRANSLATED_PROCESSED_PSEUDOGENE, - VariantAnnotationUtils.TRANSLATED_UNPROCESSED_PSEUDOGENE, - VariantAnnotationUtils.TR_C_GENE, - VariantAnnotationUtils.TR_D_GENE, - VariantAnnotationUtils.TR_J_GENE, - VariantAnnotationUtils.TR_J_PSEUDOGENE, - VariantAnnotationUtils.TRNA_PSEUDOGENE, - VariantAnnotationUtils.TR_V_GENE, - VariantAnnotationUtils.TR_V_PSEUDOGENE, - VariantAnnotationUtils.UNITARY_PSEUDOGENE, - VariantAnnotationUtils.UNPROCESSED_PSEUDOGENE, - "vaultRNA" - )); +// biotypeCount.setAllowedKeys(Arrays.asList( +// VariantAnnotationUtils.THREEPRIME_OVERLAPPING_NCRNA, +// "3prime_overlapping_ncRNA", +// VariantAnnotationUtils.AMBIGUOUS_ORF, +// VariantAnnotationUtils.ANTISENSE, +// "antisense_RNA", +// "bidirectional_promoter_lncRNA", +// VariantAnnotationUtils.IG_C_GENE, +// VariantAnnotationUtils.IG_C_PSEUDOGENE, +// VariantAnnotationUtils.IG_D_GENE, +// VariantAnnotationUtils.IG_J_GENE, +// VariantAnnotationUtils.IG_J_PSEUDOGENE, +// "IG_pseudogene", +// VariantAnnotationUtils.IG_V_GENE, +// VariantAnnotationUtils.IG_V_PSEUDOGENE, +// +// VariantAnnotationUtils.INTERGENIC_VARIANT, +// +// VariantAnnotationUtils.KNOWN_NCRNA, +// VariantAnnotationUtils.LINCRNA, +// VariantAnnotationUtils.LRG_GENE, +// +// "macro_lncRNA", +// VariantAnnotationUtils.MIRNA, +// VariantAnnotationUtils.MIRNA_PSEUDOGENE, +// VariantAnnotationUtils.MISC_RNA, +// VariantAnnotationUtils.MISC_RNA_PSEUDOGENE, +// VariantAnnotationUtils.MT_RRNA, +// VariantAnnotationUtils.MT_TRNA, +// VariantAnnotationUtils.NMD_TRANSCRIPT_VARIANT, +// VariantAnnotationUtils.NON_CODING, +// VariantAnnotationUtils.NONSENSE_MEDIATED_DECAY, +// VariantAnnotationUtils.NON_STOP_DECAY, +// +// VariantAnnotationUtils.POLYMORPHIC_PSEUDOGENE, +// VariantAnnotationUtils.PROCESSED_PSEUDOGENE, +// VariantAnnotationUtils.PROCESSED_TRANSCRIPT, +// VariantAnnotationUtils.PROTEIN_CODING, +// VariantAnnotationUtils.PSEUDOGENE, +// +// VariantAnnotationUtils.RETAINED_INTRON, +// VariantAnnotationUtils.RETROTRANSPOSED, +// "ribozyme", +// VariantAnnotationUtils.RRNA, +// VariantAnnotationUtils.RRNA_PSEUDOGENE, +// +// "scaRNA", +// "scRNA", +// VariantAnnotationUtils.SCRNA_PSEUDOGENE, +// VariantAnnotationUtils.SENSE_INTRONIC, +// VariantAnnotationUtils.SENSE_OVERLAPPING, +// VariantAnnotationUtils.SNORNA, +// VariantAnnotationUtils.SNORNA_PSEUDOGENE, +// VariantAnnotationUtils.SNRNA, +// VariantAnnotationUtils.SNRNA_PSEUDOGENE, +// "sRNA", +// +// "TEC", +// VariantAnnotationUtils.TRANSCRIBED_PROCESSED_PSEUDOGENE, +// VariantAnnotationUtils.TRANSCRIBED_UNITARY_PSEUDOGENE, +// VariantAnnotationUtils.TRANSCRIBED_UNPROCESSED_PSEUDGENE, +// VariantAnnotationUtils.TRANSLATED_PROCESSED_PSEUDOGENE, +// VariantAnnotationUtils.TRANSLATED_UNPROCESSED_PSEUDOGENE, +// VariantAnnotationUtils.TR_C_GENE, +// VariantAnnotationUtils.TR_D_GENE, +// VariantAnnotationUtils.TR_J_GENE, +// VariantAnnotationUtils.TR_J_PSEUDOGENE, +// VariantAnnotationUtils.TRNA_PSEUDOGENE, +// VariantAnnotationUtils.TR_V_GENE, +// VariantAnnotationUtils.TR_V_PSEUDOGENE, +// VariantAnnotationUtils.UNITARY_PSEUDOGENE, +// VariantAnnotationUtils.UNPROCESSED_PSEUDOGENE, +// "vaultRNA" +// )); } } \ No newline at end of file diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java index d1902adb53e..51608e3c679 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/analysis/knockout/KnockoutByIndividual.java @@ -27,12 +27,12 @@ public class KnockoutByIndividual { private String id; private String sampleId; + // father / mother private Sex sex; private List phenotypes; private List disorders; private GeneKnockoutByIndividualStats stats; - private Map genesMap = new HashMap<>(); public String getId() { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/local/LocalAlignmentDBAdaptor.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/local/LocalAlignmentDBAdaptor.java index 5e6598b5bf7..c76678d6383 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/local/LocalAlignmentDBAdaptor.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/alignment/local/LocalAlignmentDBAdaptor.java @@ -250,7 +250,7 @@ public OpenCGAResult statsInfo(Path path) throws ToolException { watch.stop(); return new OpenCGAResult<>((int) watch.getTime(), Collections.emptyList(), 1, - Arrays.asList(org.apache.commons.lang.StringUtils.join(lines, "\n")), 1); + Arrays.asList(StringUtils.join(lines, "\n")), 1); } //------------------------------------------------------------------------- diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/utils/CellBaseUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/utils/CellBaseUtils.java index c9d8c38e5fa..63479690a21 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/utils/CellBaseUtils.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/utils/CellBaseUtils.java @@ -22,11 +22,11 @@ import org.opencb.biodata.models.variant.exceptions.NonStandardCompliantSampleField; import org.opencb.biodata.tools.variant.VariantNormalizer; import org.opencb.cellbase.client.rest.CellBaseClient; -import org.opencb.cellbase.core.api.GeneDBAdaptor; +import org.opencb.cellbase.core.CellBaseDataResponse; +import org.opencb.cellbase.core.ParamConstants; +import org.opencb.cellbase.core.result.CellBaseDataResult; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.commons.datastore.core.QueryResponse; -import org.opencb.commons.datastore.core.QueryResult; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; import org.slf4j.Logger; @@ -84,17 +84,17 @@ public List getGeneRegion(List geneStrs, boolean skipMissing) { try { long ts = System.currentTimeMillis(); QueryOptions options = new QueryOptions(GENE_QUERY_OPTIONS); // Copy options. DO NOT REUSE QUERY OPTIONS - QueryResponse response = cellBaseClient.getGeneClient().get(geneStrs, options); + CellBaseDataResponse response = cellBaseClient.getGeneClient().get(geneStrs, options); logger.info("Query genes from CellBase " + cellBaseClient.getSpecies() + ":" + assembly + " " + geneStrs + " -> " + (System.currentTimeMillis() - ts) / 1000.0 + "s "); List missingGenes = null; - for (QueryResult result : response.getResponse()) { + for (CellBaseDataResult result : response.getResponses()) { Gene gene = null; String geneStr = result.getId(); // It may happen that CellBase returns more than 1 result for the same gene name. // Pick the gene where the given geneStr matches with the name,id,transcript.id,transcript.name or transcript.proteinId - if (result.getResult().size() > 1) { - for (Gene aGene : result.getResult()) { + if (result.getResults().size() > 1) { + for (Gene aGene : result.getResults()) { if (geneStr.equals(aGene.getName()) || geneStr.equals(aGene.getId()) || aGene.getTranscripts().stream().anyMatch(t -> geneStr.equals(t.getName())) @@ -122,7 +122,7 @@ public List getGeneRegion(List geneStrs, boolean skipMissing) { } else { query.put("name", geneStr); } - gene = cellBaseClient.getGeneClient().search(query, options).getResponse().get(0).first(); + gene = cellBaseClient.getGeneClient().search(query, options).firstResult(); } if (gene == null) { if (missingGenes == null) { @@ -152,10 +152,10 @@ public Set getGenesByGo(List goValues) { Set genes = new HashSet<>(); QueryOptions params = new QueryOptions(QueryOptions.INCLUDE, "name,chromosome,start,end"); try { - List> responses = cellBaseClient.getGeneClient().get(goValues, params) - .getResponse(); - for (QueryResult response : responses) { - for (Gene gene : response.getResult()) { + List> responses = cellBaseClient.getGeneClient().get(goValues, params) + .getResponses(); + for (CellBaseDataResult response : responses) { + for (Gene gene : response.getResults()) { genes.add(gene.getName()); } } @@ -175,12 +175,12 @@ public Set getGenesByExpression(List expressionValues) { String[] split = expressionValue.split(":"); expressionValue = split[0]; Query cellbaseQuery = new Query(2) - .append(GeneDBAdaptor.QueryParams.ANNOTATION_EXPRESSION_TISSUE.key(), expressionValue) - .append(GeneDBAdaptor.QueryParams.ANNOTATION_EXPRESSION_VALUE.key(), "UP"); - List> responses = cellBaseClient.getGeneClient().search(cellbaseQuery, params) - .getResponse(); - for (QueryResult response : responses) { - for (Gene gene : response.getResult()) { + .append(ParamConstants.ANNOTATION_EXPRESSION_TISSUE_PARAM, expressionValue) + .append(ParamConstants.ANNOTATION_EXPRESSION_VALUE_PARAM, "UP"); + List> responses = cellBaseClient.getGeneClient().search(cellbaseQuery, params) + .getResponses(); + for (CellBaseDataResult response : responses) { + for (Gene gene : response.getResults()) { genes.add(gene.getName()); } } @@ -201,9 +201,9 @@ public Variant getVariant(String variantStr) { public List getVariants(List variantsStr) { List variants = new ArrayList<>(variantsStr.size()); - List> response = null; + List> response = null; try { - response = cellBaseClient.getVariationClient().get(variantsStr, + response = cellBaseClient.getVariantClient().get(variantsStr, new QueryOptions(QueryOptions.INCLUDE, VariantField.CHROMOSOME.fieldName() + "," + VariantField.START.fieldName() + "," @@ -211,20 +211,20 @@ public List getVariants(List variantsStr) { + VariantField.TYPE.fieldName() + "," + VariantField.REFERENCE.fieldName() + "," + VariantField.ALTERNATE.fieldName() - )).getResponse(); + )).getResponses(); } catch (IOException e) { throw VariantQueryException.internalException(e); } VariantNormalizer variantNormalizer = new VariantNormalizer(); - for (QueryResult result : response) { - if (result.getResult().size() == 1) { - Variant variant = result.getResult().get(0); + for (CellBaseDataResult result : response) { + if (result.getResults().size() == 1) { + Variant variant = result.getResults().get(0); try { variants.add(variantNormalizer.normalize(Collections.singletonList(variant), true).get(0)); } catch (NonStandardCompliantSampleField e) { throw VariantQueryException.internalException(e); } - } else if (result.getResult().isEmpty()) { + } else if (result.getResults().isEmpty()) { throw new VariantQueryException("Unknown variant '" + result.getId() + "'"); } else { throw new VariantQueryException("Not unique variant identifier '" + result.getId() + "'." diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationConstants.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationConstants.java new file mode 100644 index 00000000000..61e9aeb7118 --- /dev/null +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/VariantAnnotationConstants.java @@ -0,0 +1,182 @@ +package org.opencb.opencga.storage.core.variant.annotation; + +import org.opencb.biodata.models.variant.avro.ClinicalSignificance; +import org.opencb.biodata.models.variant.avro.DrugResponseClassification; +import org.opencb.biodata.models.variant.avro.TraitAssociation; + +import java.util.HashMap; +import java.util.Map; + +public class VariantAnnotationConstants { + + public static final String THREEPRIME_OVERLAPPING_NCRNA = "3prime_overlapping_ncrna"; + // BioUtils.Biotype.IG_C_GENE; + public static final String IG_C_GENE = "IG_C_gene"; + // BioUtils.Biotype.IG_C_PSEUDOGENE; + public static final String IG_C_PSEUDOGENE = "IG_C_pseudogene"; + // BioUtils.Biotype.IG_D_GENE; + public static final String IG_D_GENE = "IG_D_gene"; + // BioUtils.Biotype.IG_J_GENE; + public static final String IG_J_GENE = "IG_J_gene"; + // BioUtils.Biotype.IG_J_PSEUDOGENE; + public static final String IG_J_PSEUDOGENE = "IG_J_pseudogene"; + // BioUtils.Biotype.IG_V_GENE; + public static final String IG_V_GENE = "IG_V_gene"; + // BioUtils.Biotype.IG_V_PSEUDOGENE; + public static final String IG_V_PSEUDOGENE = "IG_V_pseudogene"; + // BioUtils.Biotype.MT_RRNA; + public static final String MT_RRNA = "Mt_rRNA"; + // BioUtils.Biotype.MT_TRNA; + public static final String MT_TRNA = "Mt_tRNA"; + // BioUtils.Biotype.TR_C_GENE; + public static final String TR_C_GENE = "TR_C_gene"; + // BioUtils.Biotype.TR_D_GENE; + public static final String TR_D_GENE = "TR_D_gene"; + // BioUtils.Biotype.TR_J_GENE; + public static final String TR_J_GENE = "TR_J_gene"; + // BioUtils.Biotype.TR_J_PSEUDOGENE; + public static final String TR_J_PSEUDOGENE = "TR_J_pseudogene"; + // BioUtils.Biotype.TR_V_GENE; + public static final String TR_V_GENE = "TR_V_gene"; + // BioUtils.Biotype.TR_V_PSEUDOGENE; + public static final String TR_V_PSEUDOGENE = "TR_V_pseudogene"; + public static final String ANTISENSE = "antisense"; + // BioUtils.Biotype.LINCRNA; + public static final String LINCRNA = "lincRNA"; + // BioUtils.Biotype.MIRNA; + public static final String MIRNA = "miRNA"; + // BioUtils.Biotype.MISC_RNA; + public static final String MISC_RNA = "misc_RNA"; + // BioUtils.Biotype.POLYMORPHIC_PSEUDOGENE; + public static final String POLYMORPHIC_PSEUDOGENE = "polymorphic_pseudogene"; + // BioUtils.Biotype.PROCESSED_PSEUDOGENE; + public static final String PROCESSED_PSEUDOGENE = "processed_pseudogene"; + // BioUtils.Biotype.PROCESSED_TRANSCRIPT; + public static final String PROCESSED_TRANSCRIPT = "processed_transcript"; + // BioUtils.Biotype.PROTEIN_CODING; + public static final String PROTEIN_CODING = "protein_coding"; + // BioUtils.Biotype.PSEUDOGENE; + public static final String PSEUDOGENE = "pseudogene"; + // BioUtils.Biotype.RRNA; + public static final String RRNA = "rRNA"; + // BioUtils.Biotype.SENSE_INTRONIC; + public static final String SENSE_INTRONIC = "sense_intronic"; + // BioUtils.Biotype.SENSE_OVERLAPPING; + public static final String SENSE_OVERLAPPING = "sense_overlapping"; + // BioUtils.Biotype.SNRNA; + public static final String SNRNA = "snRNA"; + // BioUtils.Biotype.SNORNA; + public static final String SNORNA = "snoRNA"; + // BioUtils.Biotype.NONSENSE_MEDIATED_DECAY; + public static final String NONSENSE_MEDIATED_DECAY = "nonsense_mediated_decay"; + public static final String NMD_TRANSCRIPT_VARIANT = "NMD_transcript_variant"; + // BioUtils.Biotype.UNPROCESSED_PSEUDOGENE; + public static final String UNPROCESSED_PSEUDOGENE = "unprocessed_pseudogene"; + public static final String TRANSCRIBED_UNPROCESSED_PSEUDGENE = "transcribed_unprocessed_pseudogene"; + // BioUtils.Biotype.RETAINED_INTRON; + public static final String RETAINED_INTRON = "retained_intron"; + // BioUtils.Biotype.NON_STOP_DECAY; + public static final String NON_STOP_DECAY = "non_stop_decay"; + // BioUtils.Biotype.UNITARY_PSEUDOGENE; + public static final String UNITARY_PSEUDOGENE = "unitary_pseudogene"; + // BioUtils.Biotype.TRANSLATED_PROCESSED_PSEUDOGENE; + public static final String TRANSLATED_PROCESSED_PSEUDOGENE = "translated_processed_pseudogene"; + // BioUtils.Biotype.TRANSCRIBED_PROCESSED_PSEUDOGENE; + public static final String TRANSCRIBED_PROCESSED_PSEUDOGENE = "transcribed_processed_pseudogene"; + // BioUtils.Biotype.TRNA_PSEUDOGENE; + public static final String TRNA_PSEUDOGENE = "tRNA_pseudogene"; + // BioUtils.Biotype.SNORNA_PSEUDOGENE; + public static final String SNORNA_PSEUDOGENE = "snoRNA_pseudogene"; + // BioUtils.Biotype.SNRNA_PSEUDOGENE; + public static final String SNRNA_PSEUDOGENE = "snRNA_pseudogene"; + // BioUtils.Biotype.SCRNA_PSEUDOGENE; + public static final String SCRNA_PSEUDOGENE = "scRNA_pseudogene"; + // BioUtils.Biotype.RRNA_PSEUDOGENE; + public static final String RRNA_PSEUDOGENE = "rRNA_pseudogene"; + // BioUtils.Biotype.MISC_RNA_PSEUDOGENE; + public static final String MISC_RNA_PSEUDOGENE = "misc_RNA_pseudogene"; + // BioUtils.Biotype.MIRNA_PSEUDOGENE; + public static final String MIRNA_PSEUDOGENE = "miRNA_pseudogene"; + // BioUtils.Biotype.NON_CODING; + public static final String NON_CODING = "non_coding"; + // BioUtils.Biotype.AMBIGUOUS_ORF; + public static final String AMBIGUOUS_ORF = "ambiguous_orf"; + // BioUtils.Biotype.KNOWN_NCRNA; + public static final String KNOWN_NCRNA = "known_ncrna"; + // BioUtils.Biotype.RETROTRANSPOSED; + public static final String RETROTRANSPOSED = "retrotransposed"; + // BioUtils.Biotype.TRANSCRIBED_UNITARY_PSEUDOGENE; + public static final String TRANSCRIBED_UNITARY_PSEUDOGENE = "transcribed_unitary_pseudogene"; + // BioUtils.Biotype.TRANSLATED_UNPROCESSED_PSEUDOGENE; + public static final String TRANSLATED_UNPROCESSED_PSEUDOGENE = "translated_unprocessed_pseudogene"; + public static final String LRG_GENE = "LRG_gene"; + + public static final String INTERGENIC_VARIANT = "intergenic_variant"; + public static final String REGULATORY_REGION_VARIANT = "regulatory_region_variant"; + public static final String TF_BINDING_SITE_VARIANT = "TF_binding_site_variant"; + public static final String UPSTREAM_GENE_VARIANT = "upstream_gene_variant"; + public static final String TWOKB_UPSTREAM_VARIANT = "2KB_upstream_variant"; + public static final String DOWNSTREAM_GENE_VARIANT = "downstream_gene_variant"; + public static final String TWOKB_DOWNSTREAM_VARIANT = "2KB_downstream_variant"; + public static final String SPLICE_DONOR_VARIANT = "splice_donor_variant"; + public static final String SPLICE_ACCEPTOR_VARIANT = "splice_acceptor_variant"; + public static final String INTRON_VARIANT = "intron_variant"; + public static final String SPLICE_REGION_VARIANT = "splice_region_variant"; + public static final String FIVE_PRIME_UTR_VARIANT = "5_prime_UTR_variant"; + public static final String THREE_PRIME_UTR_VARIANT = "3_prime_UTR_variant"; + public static final String INCOMPLETE_TERMINAL_CODON_VARIANT = "incomplete_terminal_codon_variant"; + public static final String STOP_RETAINED_VARIANT = "stop_retained_variant"; + public static final String START_RETAINED_VARIANT = "start_retained_variant"; + public static final String SYNONYMOUS_VARIANT = "synonymous_variant"; + public static final String INITIATOR_CODON_VARIANT = "initiator_codon_variant"; + public static final String START_LOST = "start_lost"; + public static final String STOP_GAINED = "stop_gained"; + public static final String STOP_LOST = "stop_lost"; + public static final String MISSENSE_VARIANT = "missense_variant"; + public static final String MATURE_MIRNA_VARIANT = "mature_miRNA_variant"; + public static final String NON_CODING_TRANSCRIPT_EXON_VARIANT = "non_coding_transcript_exon_variant"; + public static final String NON_CODING_TRANSCRIPT_VARIANT = "non_coding_transcript_variant"; + public static final String INFRAME_INSERTION = "inframe_insertion"; + public static final String INFRAME_VARIANT = "inframe_variant"; + public static final String FRAMESHIFT_VARIANT = "frameshift_variant"; + public static final String CODING_SEQUENCE_VARIANT = "coding_sequence_variant"; + public static final String TRANSCRIPT_ABLATION = "transcript_ablation"; + public static final String TRANSCRIPT_AMPLIFICATION = "transcript_amplification"; + public static final String COPY_NUMBER_CHANGE = "copy_number_change"; + public static final String TERMINATOR_CODON_VARIANT = "terminator_codon_variant"; + public static final String FEATURE_TRUNCATION = "feature_truncation"; + public static final String FEATURE_VARIANT = "feature_variant"; + public static final String STRUCTURAL_VARIANT = "structural_variant"; + public static final String INFRAME_DELETION = "inframe_deletion"; + + + public static final Map COMPLEMENTARY_NT = new HashMap<>(); + public static final Map CLINVAR_CLINSIG_TO_ACMG = new HashMap<>(); + public static final Map CLINVAR_CLINSIG_TO_TRAIT_ASSOCIATION = new HashMap<>(); + // Currently left empty since the only item within DrugResponseClassification that seemed to match any clinvar + // tag ("responsive") was removed at some point from the model + public static final Map CLINVAR_CLINSIG_TO_DRUG_RESPONSE = new HashMap<>(); + + static { + + CLINVAR_CLINSIG_TO_ACMG.put("benign", ClinicalSignificance.benign); + CLINVAR_CLINSIG_TO_ACMG.put("likely benign", ClinicalSignificance.likely_benign); + CLINVAR_CLINSIG_TO_ACMG.put("conflicting interpretations of pathogenicity", ClinicalSignificance.uncertain_significance); + CLINVAR_CLINSIG_TO_ACMG.put("likely pathogenic", ClinicalSignificance.likely_pathogenic); + CLINVAR_CLINSIG_TO_ACMG.put("pathogenic", ClinicalSignificance.pathogenic); + CLINVAR_CLINSIG_TO_ACMG.put("uncertain significance", ClinicalSignificance.uncertain_significance); + CLINVAR_CLINSIG_TO_ACMG.put("conflicting data from submitters", ClinicalSignificance.uncertain_significance); + + CLINVAR_CLINSIG_TO_TRAIT_ASSOCIATION.put("risk factor", TraitAssociation.established_risk_allele); + CLINVAR_CLINSIG_TO_TRAIT_ASSOCIATION.put("protective", TraitAssociation.protective); + + + COMPLEMENTARY_NT.put('A', 'T'); + COMPLEMENTARY_NT.put('C', 'G'); + COMPLEMENTARY_NT.put('G', 'C'); + COMPLEMENTARY_NT.put('T', 'A'); + COMPLEMENTARY_NT.put('N', 'N'); + + } + +} diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java index eb211873ddd..fae739767a6 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/AbstractCellBaseVariantAnnotator.java @@ -22,9 +22,9 @@ import org.opencb.biodata.models.variant.VariantBuilder; import org.opencb.biodata.models.variant.avro.AdditionalAttribute; import org.opencb.biodata.models.variant.avro.VariantAnnotation; +import org.opencb.cellbase.core.result.CellBaseDataResult; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.QueryOptions; -import org.opencb.commons.datastore.core.QueryResult; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; @@ -120,7 +120,7 @@ public static String toCellBaseSpeciesName(String scientificName) { public final List annotate(List variants) throws VariantAnnotatorException { List filteredVariants = filterVariants(variants); StopWatch stopWatch = StopWatch.createStarted(); - List> queryResults = annotateFiltered(filteredVariants); + List> queryResults = annotateFiltered(filteredVariants); stopWatch.stop(); if (stopWatch.getTime(TimeUnit.SECONDS) > SLOW_CELLBASE_SECONDS) { logger.warn("Slow annotation from CellBase." @@ -129,7 +129,8 @@ public final List annotate(List variants) throws Var return getVariantAnnotationList(filteredVariants, queryResults); } - protected abstract List> annotateFiltered(List variants) throws VariantAnnotatorException; + protected abstract List> annotateFiltered(List variants) + throws VariantAnnotatorException; private List filterVariants(List variants) { List nonStructuralVariants = new ArrayList<>(variants.size()); @@ -159,14 +160,15 @@ private List filterVariants(List variants) { return nonStructuralVariants; } - protected List getVariantAnnotationList(List variants, List> queryResults) { + protected List getVariantAnnotationList(List variants, + List> queryResults) { List variantAnnotationList = new ArrayList<>(variants.size()); Iterator iterator = variants.iterator(); if (queryResults != null) { - for (QueryResult queryResult : queryResults) { + for (CellBaseDataResult queryResult : queryResults) { // If the QueryResult is empty, assume that the variant was skipped // Check that the skipped variant matches with the expected variant - if (queryResult.getResult().isEmpty()) { + if (queryResult.getResults().isEmpty()) { Variant variant = iterator.next(); if (variantSerializer.apply(variant).equals(queryResult.getId()) || variant.toString().equals(queryResult.getId()) @@ -184,7 +186,7 @@ protected List getVariantAnnotationList(List variant } } } - for (VariantAnnotation variantAnnotation : queryResult.getResult()) { + for (VariantAnnotation variantAnnotation : queryResult.getResults()) { Variant variant = iterator.next(); String annotationAlternate = variantAnnotation.getAlternate(); if (annotationAlternate.equals(VariantBuilder.DUP_ALT) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java index 91d73f341b2..c4ba64e2e5e 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java @@ -21,9 +21,9 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.cellbase.client.config.ClientConfiguration; import org.opencb.cellbase.client.rest.CellBaseClient; +import org.opencb.cellbase.core.CellBaseDataResponse; +import org.opencb.cellbase.core.result.CellBaseDataResult; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.datastore.core.QueryResponse; -import org.opencb.commons.datastore.core.QueryResult; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotatorException; @@ -64,14 +64,14 @@ public CellBaseRestVariantAnnotator(StorageConfiguration storageConfiguration, P } @Override - protected List> annotateFiltered(List variants) throws VariantAnnotatorException { + protected List> annotateFiltered(List variants) throws VariantAnnotatorException { if (variants.isEmpty()) { return Collections.emptyList(); } try { - QueryResponse queryResponse = cellBaseClient.getVariantClient() + CellBaseDataResponse response = cellBaseClient.getVariantClient() .getAnnotationByVariantIds(variants.stream().map(variantSerializer).collect(Collectors.toList()), queryOptions, true); - return queryResponse.getResponse(); + return response.getResponses(); } catch (IOException e) { throw new VariantAnnotatorException("Error fetching variants from Client"); } @@ -79,7 +79,8 @@ protected List> annotateFiltered(List va @Override public ProjectMetadata.VariantAnnotatorProgram getVariantAnnotatorProgram() throws IOException { - ObjectMap about = cellBaseClient.getMetaClient().about().firstResult(); + CellBaseDataResponse response = cellBaseClient.getMetaClient().about(); + ObjectMap about = response.firstResult(); if (about == null) { throw new IOException("Error fetching CellBase program information from meta/about"); } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java index 65bb29c52a8..46ab1537e42 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/converters/VariantTraitAssociationToEvidenceEntryConverter.java @@ -1,18 +1,18 @@ package org.opencb.opencga.storage.core.variant.annotation.converters; -import com.fasterxml.jackson.core.JsonProcessingException; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.models.variant.avro.*; +import org.opencb.biodata.models.variant.annotation.VariantTraitAssociation; +import org.opencb.biodata.models.variant.avro.ClinicalSignificance; +import org.opencb.biodata.models.variant.avro.EvidenceEntry; +import org.opencb.biodata.models.variant.avro.VariantClassification; import org.opencb.biodata.tools.commons.Converter; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; -import org.opencb.opencga.core.common.JacksonUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; -import java.util.stream.Collectors; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Created on 11/09/17. @@ -20,7 +20,7 @@ * @author Jacobo Coll <jacobo167@gmail.com> */ @Deprecated -public class VariantTraitAssociationToEvidenceEntryConverter implements Converter> { +public abstract class VariantTraitAssociationToEvidenceEntryConverter implements Converter> { protected static Logger logger = LoggerFactory.getLogger(VariantTraitAssociationToEvidenceEntryConverter.class); @@ -33,7 +33,7 @@ public class VariantTraitAssociationToEvidenceEntryConverter implements Converte private static final Map CLINVAR_CLINSIG_TO_ACMG_WITH_ENUM; static { - CLINVAR_CLINSIG_TO_ACMG_WITH_ENUM = new HashMap<>(VariantAnnotationUtils.CLINVAR_CLINSIG_TO_ACMG); + CLINVAR_CLINSIG_TO_ACMG_WITH_ENUM = new HashMap<>(VariantAnnotationConstants.CLINVAR_CLINSIG_TO_ACMG); for (ClinicalSignificance value : ClinicalSignificance.values()) { CLINVAR_CLINSIG_TO_ACMG_WITH_ENUM.put(value.name(), value); CLINVAR_CLINSIG_TO_ACMG_WITH_ENUM.put(value.name().toLowerCase(), value); @@ -41,122 +41,122 @@ public class VariantTraitAssociationToEvidenceEntryConverter implements Converte } - @Override - public List convert(VariantTraitAssociation variantTraitAssociation) { - - if (variantTraitAssociation == null) { - return null; - } else { - List evidenceEntries = new ArrayList<>(); - if (variantTraitAssociation.getClinvar() != null) { - for (ClinVar clinVar : variantTraitAssociation.getClinvar()) { - EvidenceEntry evidenceEntry = fromClinVar(clinVar); - evidenceEntries.add(evidenceEntry); - } - } - - if (variantTraitAssociation.getCosmic() != null) { - for (Cosmic cosmic : variantTraitAssociation.getCosmic()) { - EvidenceEntry evidenceEntry = fromCosmic(cosmic); - evidenceEntries.add(evidenceEntry); - } - } - - return evidenceEntries; - } - } - - public EvidenceEntry fromClinVar(ClinVar clinVar) { - EvidenceSource evidenceSource = new EvidenceSource(CLINVAR, null, null); - String url = clinVar.getAccession().startsWith("RCV") - ? "https://www.ncbi.nlm.nih.gov/clinvar/" + clinVar.getAccession() - : null; - List heritableTraits = null; - if (CollectionUtils.isNotEmpty(clinVar.getTraits())) { - heritableTraits = clinVar.getTraits() - .stream() - .map(trait -> { - if (trait.startsWith("{")) { - try { - return JacksonUtils.getDefaultObjectMapper().readValue(trait, HeritableTrait.class); - } catch (JsonProcessingException ignore) { - logger.debug("Error parsing trait", ignore); - } - } - return new HeritableTrait(trait, ModeOfInheritance.NA); - }) - .collect(Collectors.toList()); - } - List genomicFeatures; - if (CollectionUtils.isNotEmpty(clinVar.getGeneNames())) { - genomicFeatures = clinVar.getGeneNames() - .stream() - .map(geneName -> new GenomicFeature(FeatureTypes.gene, null, Collections.singletonMap(SYMBOL, geneName))) - .collect(Collectors.toList()); - } else { - genomicFeatures = null; - } - List additionalProperties = new ArrayList<>(2); - if (StringUtils.isNotEmpty(clinVar.getReviewStatus())) { - additionalProperties.add( - new Property(null, REVIEW_STATUS_IN_SOURCE_FILE, clinVar.getReviewStatus())); - } - if (StringUtils.isNotEmpty(clinVar.getClinicalSignificance())) { - additionalProperties.add( - new Property(null, CLINICAL_SIGNIFICANCE_IN_SOURCE_FILE, clinVar.getClinicalSignificance())); - } - VariantClassification variantClassification = getVariantClassification(clinVar.getClinicalSignificance().toLowerCase()); - ConsistencyStatus consistencyStatus = getConsistencyStatus(clinVar.getReviewStatus().toLowerCase()); - return new EvidenceEntry( - evidenceSource, Collections.emptyList(), null, url, - clinVar.getAccession(), null, null, - heritableTraits, genomicFeatures, - variantClassification, null, null, - consistencyStatus, - EthnicCategory.Z, null, null, null, - additionalProperties, Collections.emptyList()); - } - - public EvidenceEntry fromCosmic(Cosmic cosmic) { - EvidenceSource evidenceSource = new EvidenceSource(COSMIC, null, null); - List genomicFeatures; - if (cosmic.getGeneName() != null) { - genomicFeatures = Collections.singletonList( - new GenomicFeature(FeatureTypes.gene, null, Collections.singletonMap(SYMBOL, cosmic.getGeneName()))); - } else { - genomicFeatures = null; - } - SomaticInformation somaticInformation = new SomaticInformation( - cosmic.getPrimarySite(), - cosmic.getSiteSubtype(), - cosmic.getPrimaryHistology(), - cosmic.getHistologySubtype(), - cosmic.getTumourOrigin(), - cosmic.getSampleSource()); - List additionalProperties = null; - if (StringUtils.isNotEmpty(cosmic.getMutationSomaticStatus())) { - additionalProperties = Collections.singletonList( - new Property(null, MUTATION_SOMATIC_STATUS_IN_SOURCE_FILE, cosmic.getMutationSomaticStatus())); - } - return new EvidenceEntry( - evidenceSource, Collections.emptyList(), - somaticInformation, null, - cosmic.getMutationId(), null, null, Collections.emptyList(), - genomicFeatures, null, null, null, null, EthnicCategory.Z, null, null, null, - additionalProperties, Collections.emptyList()); - } - - private ConsistencyStatus getConsistencyStatus(String lineField) { - for (String value : lineField.split("[,/;]")) { - value = value.toLowerCase().trim(); - if (VariantAnnotationUtils.CLINVAR_REVIEW_TO_CONSISTENCY_STATUS.containsKey(value)) { - return VariantAnnotationUtils.CLINVAR_REVIEW_TO_CONSISTENCY_STATUS.get(value); - } - } - return null; - } - - private VariantClassification getVariantClassification(String lineField) { +// @Override +// public List convert(VariantTraitAssociation variantTraitAssociation) { +// +// if (variantTraitAssociation == null) { +// return null; +// } else { +// List evidenceEntries = new ArrayList<>(); +// if (variantTraitAssociation.getClinvar() != null) { +// for (ClinVar clinVar : variantTraitAssociation.getClinvar()) { +// EvidenceEntry evidenceEntry = fromClinVar(clinVar); +// evidenceEntries.add(evidenceEntry); +// } +// } +// +// if (variantTraitAssociation.getCosmic() != null) { +// for (Cosmic cosmic : variantTraitAssociation.getCosmic()) { +// EvidenceEntry evidenceEntry = fromCosmic(cosmic); +// evidenceEntries.add(evidenceEntry); +// } +// } +// +// return evidenceEntries; +// } +// } +// +// public EvidenceEntry fromClinVar(ClinVar clinVar) { +// EvidenceSource evidenceSource = new EvidenceSource(CLINVAR, null, null); +// String url = clinVar.getAccession().startsWith("RCV") +// ? "https://www.ncbi.nlm.nih.gov/clinvar/" + clinVar.getAccession() +// : null; +// List heritableTraits = null; +// if (CollectionUtils.isNotEmpty(clinVar.getTraits())) { +// heritableTraits = clinVar.getTraits() +// .stream() +// .map(trait -> { +// if (trait.startsWith("{")) { +// try { +// return JacksonUtils.getDefaultObjectMapper().readValue(trait, HeritableTrait.class); +// } catch (JsonProcessingException ignore) { +// logger.debug("Error parsing trait", ignore); +// } +// } +// return new HeritableTrait(trait, ModeOfInheritance.NA); +// }) +// .collect(Collectors.toList()); +// } +// List genomicFeatures; +// if (CollectionUtils.isNotEmpty(clinVar.getGeneNames())) { +// genomicFeatures = clinVar.getGeneNames() +// .stream() +// .map(geneName -> new GenomicFeature(FeatureTypes.gene, null, Collections.singletonMap(SYMBOL, geneName))) +// .collect(Collectors.toList()); +// } else { +// genomicFeatures = null; +// } +// List additionalProperties = new ArrayList<>(2); +// if (StringUtils.isNotEmpty(clinVar.getReviewStatus())) { +// additionalProperties.add( +// new Property(null, REVIEW_STATUS_IN_SOURCE_FILE, clinVar.getReviewStatus())); +// } +// if (StringUtils.isNotEmpty(clinVar.getClinicalSignificance())) { +// additionalProperties.add( +// new Property(null, CLINICAL_SIGNIFICANCE_IN_SOURCE_FILE, clinVar.getClinicalSignificance())); +// } +// VariantClassification variantClassification = getVariantClassification(clinVar.getClinicalSignificance().toLowerCase()); +// ConsistencyStatus consistencyStatus = getConsistencyStatus(clinVar.getReviewStatus().toLowerCase()); +// return new EvidenceEntry( +// evidenceSource, Collections.emptyList(), null, url, +// clinVar.getAccession(), null, null, +// heritableTraits, genomicFeatures, +// variantClassification, null, null, +// consistencyStatus, +// EthnicCategory.Z, null, null, null, +// additionalProperties, Collections.emptyList()); +// } +// +// public EvidenceEntry fromCosmic(Cosmic cosmic) { +// EvidenceSource evidenceSource = new EvidenceSource(COSMIC, null, null); +// List genomicFeatures; +// if (cosmic.getGeneName() != null) { +// genomicFeatures = Collections.singletonList( +// new GenomicFeature(FeatureTypes.gene, null, Collections.singletonMap(SYMBOL, cosmic.getGeneName()))); +// } else { +// genomicFeatures = null; +// } +// SomaticInformation somaticInformation = new SomaticInformation( +// cosmic.getPrimarySite(), +// cosmic.getSiteSubtype(), +// cosmic.getPrimaryHistology(), +// cosmic.getHistologySubtype(), +// cosmic.getTumourOrigin(), +// cosmic.getSampleSource()); +// List additionalProperties = null; +// if (StringUtils.isNotEmpty(cosmic.getMutationSomaticStatus())) { +// additionalProperties = Collections.singletonList( +// new Property(null, MUTATION_SOMATIC_STATUS_IN_SOURCE_FILE, cosmic.getMutationSomaticStatus())); +// } +// return new EvidenceEntry( +// evidenceSource, Collections.emptyList(), +// somaticInformation, null, +// cosmic.getMutationId(), null, null, Collections.emptyList(), +// genomicFeatures, null, null, null, null, EthnicCategory.Z, null, null, null, +// additionalProperties, Collections.emptyList()); +// } +// +// private ConsistencyStatus getConsistencyStatus(String lineField) { +// for (String value : lineField.split("[,/;]")) { +// value = value.toLowerCase().trim(); +// if (VariantAnnotationUtils.CLINVAR_REVIEW_TO_CONSISTENCY_STATUS.containsKey(value)) { +// return VariantAnnotationUtils.CLINVAR_REVIEW_TO_CONSISTENCY_STATUS.get(value); +// } +// } +// return null; +// } +// + public static VariantClassification getVariantClassification(String lineField) { VariantClassification variantClassification = new VariantClassification(); for (String value : lineField.split("[,/;]")) { value = value.toLowerCase().trim(); @@ -171,10 +171,10 @@ && isPathogenic(variantClassification.getClinicalSignificance())) { logger.warn("Will set uncertain_significance instead"); variantClassification.setClinicalSignificance(ClinicalSignificance.uncertain_significance); } - } else if (VariantAnnotationUtils.CLINVAR_CLINSIG_TO_TRAIT_ASSOCIATION.containsKey(value)) { - variantClassification.setTraitAssociation(VariantAnnotationUtils.CLINVAR_CLINSIG_TO_TRAIT_ASSOCIATION.get(value)); - } else if (VariantAnnotationUtils.CLINVAR_CLINSIG_TO_DRUG_RESPONSE.containsKey(value)) { - variantClassification.setDrugResponseClassification(VariantAnnotationUtils.CLINVAR_CLINSIG_TO_DRUG_RESPONSE.get(value)); + } else if (VariantAnnotationConstants.CLINVAR_CLINSIG_TO_TRAIT_ASSOCIATION.containsKey(value)) { + variantClassification.setTraitAssociation(VariantAnnotationConstants.CLINVAR_CLINSIG_TO_TRAIT_ASSOCIATION.get(value)); + } else if (VariantAnnotationConstants.CLINVAR_CLINSIG_TO_DRUG_RESPONSE.containsKey(value)) { + variantClassification.setDrugResponseClassification(VariantAnnotationConstants.CLINVAR_CLINSIG_TO_DRUG_RESPONSE.get(value)); } else if (!value.equals("not provided")) { logger.debug("No mapping found for referenceClinVarAssertion.clinicalSignificance '{}'", value); logger.debug("No value will be set at EvidenceEntry.variantClassification for this term"); @@ -183,12 +183,12 @@ && isPathogenic(variantClassification.getClinicalSignificance())) { return variantClassification; } - private boolean isPathogenic(ClinicalSignificance clinicalSignificance) { + private static boolean isPathogenic(ClinicalSignificance clinicalSignificance) { return ClinicalSignificance.pathogenic.equals(clinicalSignificance) || ClinicalSignificance.likely_pathogenic.equals(clinicalSignificance); } - private boolean isBenign(ClinicalSignificance clinicalSignificance) { + private static boolean isBenign(ClinicalSignificance clinicalSignificance) { return ClinicalSignificance.benign.equals(clinicalSignificance) || ClinicalSignificance.likely_benign.equals(clinicalSignificance); } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/VariantVcfDataWriter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/VariantVcfDataWriter.java index 7c2ecfd6ab3..67e6fe292aa 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/VariantVcfDataWriter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/io/VariantVcfDataWriter.java @@ -729,30 +729,30 @@ private Map addAnnotations(Variant variant, List annotat } } break; - case "clinvar": - if (variant.getAnnotation().getVariantTraitAssociation() != null - && variant.getAnnotation().getVariantTraitAssociation().getClinvar() != null) { - stringBuilder.append(variant.getAnnotation().getVariantTraitAssociation().getClinvar().stream() - .map(ClinVar::getTraits).flatMap(Collection::stream) - .collect(Collectors.joining(","))); - } - break; - case "cosmic": - if (variant.getAnnotation().getVariantTraitAssociation() != null - && variant.getAnnotation().getVariantTraitAssociation().getCosmic() != null) { - stringBuilder.append(variant.getAnnotation().getVariantTraitAssociation().getCosmic().stream() - .map(Cosmic::getPrimarySite) - .collect(Collectors.joining(","))); - } - break; - case "gwas": - if (variant.getAnnotation().getVariantTraitAssociation() != null - && variant.getAnnotation().getVariantTraitAssociation().getGwas() != null) { - stringBuilder.append(variant.getAnnotation().getVariantTraitAssociation().getGwas().stream() - .map(Gwas::getTraits).flatMap(Collection::stream) - .collect(Collectors.joining(","))); - } - break; +// case "clinvar": +// if (variant.getAnnotation().getVariantTraitAssociation() != null +// && variant.getAnnotation().getVariantTraitAssociation().getClinvar() != null) { +// stringBuilder.append(variant.getAnnotation().getVariantTraitAssociation().getClinvar().stream() +// .map(ClinVar::getTraits).flatMap(Collection::stream) +// .collect(Collectors.joining(","))); +// } +// break; +// case "cosmic": +// if (variant.getAnnotation().getVariantTraitAssociation() != null +// && variant.getAnnotation().getVariantTraitAssociation().getCosmic() != null) { +// stringBuilder.append(variant.getAnnotation().getVariantTraitAssociation().getCosmic().stream() +// .map(Cosmic::getPrimarySite) +// .collect(Collectors.joining(","))); +// } +// break; +// case "gwas": +// if (variant.getAnnotation().getVariantTraitAssociation() != null +// && variant.getAnnotation().getVariantTraitAssociation().getGwas() != null) { +// stringBuilder.append(variant.getAnnotation().getVariantTraitAssociation().getGwas().stream() +// .map(Gwas::getTraits).flatMap(Collection::stream) +// .collect(Collectors.joining(","))); +// } +// break; case "drugInteraction": stringBuilder.append(variant.getAnnotation().getGeneDrugInteraction().stream() .map(GeneDrugInteraction::getDrugName).collect(Collectors.joining(","))); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java index 41111099068..600a81b50f5 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryParser.java @@ -9,7 +9,7 @@ import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.biodata.models.variant.metadata.VariantFileHeaderComplexLine; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryParam; @@ -210,9 +210,9 @@ protected void preProcessAnnotationParams(Query query) { } if (enumValue == null) { String key = clinicalSignificance.toLowerCase(); - if (VariantAnnotationUtils.CLINVAR_CLINSIG_TO_ACMG.containsKey(key)) { + if (VariantAnnotationConstants.CLINVAR_CLINSIG_TO_ACMG.containsKey(key)) { // No value set - enumValue = VariantAnnotationUtils.CLINVAR_CLINSIG_TO_ACMG.get(key); + enumValue = VariantAnnotationConstants.CLINVAR_CLINSIG_TO_ACMG.get(key); } } if (enumValue != null) { diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java index 73dfb2d3d01..1892011efeb 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/VariantQueryUtils.java @@ -24,7 +24,7 @@ import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.*; import org.opencb.commons.utils.ListUtils; import org.opencb.opencga.core.api.ParamConstants; @@ -98,24 +98,24 @@ public final class VariantQueryUtils { public static final String LOF = "lof"; // LOF does not include missense_variant public static final Set LOF_SET = Collections.unmodifiableSet(new HashSet<>(Arrays.asList( - VariantAnnotationUtils.FRAMESHIFT_VARIANT, - VariantAnnotationUtils.INFRAME_DELETION, - VariantAnnotationUtils.INFRAME_INSERTION, - VariantAnnotationUtils.START_LOST, - VariantAnnotationUtils.STOP_GAINED, - VariantAnnotationUtils.STOP_LOST, - VariantAnnotationUtils.SPLICE_ACCEPTOR_VARIANT, - VariantAnnotationUtils.SPLICE_DONOR_VARIANT, - VariantAnnotationUtils.TRANSCRIPT_ABLATION, - VariantAnnotationUtils.TRANSCRIPT_AMPLIFICATION, - VariantAnnotationUtils.INITIATOR_CODON_VARIANT, - VariantAnnotationUtils.SPLICE_REGION_VARIANT, - VariantAnnotationUtils.INCOMPLETE_TERMINAL_CODON_VARIANT + VariantAnnotationConstants.FRAMESHIFT_VARIANT, + VariantAnnotationConstants.INFRAME_DELETION, + VariantAnnotationConstants.INFRAME_INSERTION, + VariantAnnotationConstants.START_LOST, + VariantAnnotationConstants.STOP_GAINED, + VariantAnnotationConstants.STOP_LOST, + VariantAnnotationConstants.SPLICE_ACCEPTOR_VARIANT, + VariantAnnotationConstants.SPLICE_DONOR_VARIANT, + VariantAnnotationConstants.TRANSCRIPT_ABLATION, + VariantAnnotationConstants.TRANSCRIPT_AMPLIFICATION, + VariantAnnotationConstants.INITIATOR_CODON_VARIANT, + VariantAnnotationConstants.SPLICE_REGION_VARIANT, + VariantAnnotationConstants.INCOMPLETE_TERMINAL_CODON_VARIANT ))); public static final Set LOF_EXTENDED_SET = Collections.unmodifiableSet(new HashSet<>( ListUtils.concat( new ArrayList<>(LOF_SET), - Arrays.asList(VariantAnnotationUtils.MISSENSE_VARIANT)))); + Arrays.asList(VariantAnnotationConstants.MISSENSE_VARIANT)))); public static final Set MODIFIER_QUERY_PARAMS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList( INCLUDE_STUDY, diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/CompoundHeterozygousQueryExecutor.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/CompoundHeterozygousQueryExecutor.java index 5c37a6c8ebd..4dc9f475a2d 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/CompoundHeterozygousQueryExecutor.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/query/executors/CompoundHeterozygousQueryExecutor.java @@ -3,7 +3,7 @@ import com.google.common.collect.Iterators; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.tools.pedigree.ModeOfInheritance; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; @@ -36,17 +36,17 @@ public class CompoundHeterozygousQueryExecutor extends AbstractTwoPhasedVariantQ public static final String REF = "0/0,0|0,0"; public static final String MISSING_SAMPLE = "-"; public static final HashSet DEFAULT_BIOTYPES = new HashSet<>(Arrays.asList( - VariantAnnotationUtils.IG_C_GENE, - VariantAnnotationUtils.IG_D_GENE, - VariantAnnotationUtils.IG_J_GENE, - VariantAnnotationUtils.IG_V_GENE, - VariantAnnotationUtils.PROTEIN_CODING, - VariantAnnotationUtils.NONSENSE_MEDIATED_DECAY, - VariantAnnotationUtils.NON_STOP_DECAY, - VariantAnnotationUtils.TR_C_GENE, - VariantAnnotationUtils.TR_D_GENE, - VariantAnnotationUtils.TR_J_GENE, - VariantAnnotationUtils.TR_V_GENE + VariantAnnotationConstants.IG_C_GENE, + VariantAnnotationConstants.IG_D_GENE, + VariantAnnotationConstants.IG_J_GENE, + VariantAnnotationConstants.IG_V_GENE, + VariantAnnotationConstants.PROTEIN_CODING, + VariantAnnotationConstants.NONSENSE_MEDIATED_DECAY, + VariantAnnotationConstants.NON_STOP_DECAY, + VariantAnnotationConstants.TR_C_GENE, + VariantAnnotationConstants.TR_D_GENE, + VariantAnnotationConstants.TR_J_GENE, + VariantAnnotationConstants.TR_V_GENE )); public static final int DEFAULT_SAMPLING_SIZE = 200; private final VariantIterable iterable; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/VariantSearchToVariantConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/VariantSearchToVariantConverter.java index 06301249343..4600f3ad30f 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/VariantSearchToVariantConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/VariantSearchToVariantConverter.java @@ -31,6 +31,7 @@ import org.opencb.biodata.models.variant.stats.VariantStats; import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.commons.utils.ListUtils; +import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.annotation.converters.VariantTraitAssociationToEvidenceEntryConverter; import org.slf4j.Logger; @@ -43,7 +44,6 @@ import static org.opencb.opencga.storage.core.variant.adaptors.VariantField.AdditionalAttributes.RELEASE; import static org.opencb.opencga.storage.core.variant.search.VariantSearchUtils.FIELD_SEPARATOR; -//import org.opencb.opencga.core.common.ArrayUtils; /** * Created by imedina on 14/11/16. @@ -55,7 +55,6 @@ public class VariantSearchToVariantConverter implements ComplexTypeConverter includeFields; private Map studyEntryMap; @@ -63,7 +62,6 @@ public class VariantSearchToVariantConverter implements ComplexTypeConverter other = new ArrayList<>(); public VariantSearchToVariantConverter() { - evidenceEntryConverter = new VariantTraitAssociationToEvidenceEntryConverter(); } public VariantSearchToVariantConverter(Set includeFields) { @@ -533,9 +531,8 @@ public VariantAnnotation getVariantAnnotation(VariantSearchModel variantSearchMo // set HPO, ClinVar and Cosmic if (variantSearchModel.getTraits() != null) { - Map clinVarMap = new HashMap<>(); - List clinVarList = new ArrayList<>(); - List cosmicList = new ArrayList<>(); + Map clinVarMap = new HashMap<>(); + List evidenceEntries = new ArrayList<>(); List geneTraitAssociationList = new ArrayList<>(); for (String trait : variantSearchModel.getTraits()) { @@ -551,24 +548,47 @@ public VariantAnnotation getVariantAnnotation(VariantSearchModel variantSearchMo break; case "CV": // Variant trait: CV -- accession -- trait -- clinicalSignificance - if (!clinVarMap.containsKey(fields[1])) { - String clinicalSignificance = ""; + String accession = fields[1]; + String clinvarTrait = fields[2]; + EvidenceEntry clinVar = clinVarMap.get(accession); + if (clinVar == null) { + clinVar = new EvidenceEntry(); + clinVar.setId(accession); + clinVar.setSource(new EvidenceSource("clinvar", null, null)); + clinVar.setUrl(accession.startsWith("RCV") + ? "https://www.ncbi.nlm.nih.gov/clinvar/" + accession + : null); if (fields.length > 3 && StringUtils.isNotEmpty(fields[3])) { - clinicalSignificance = fields[3]; + String clinicalSignificance = fields[3]; + clinVar.setVariantClassification( + VariantTraitAssociationToEvidenceEntryConverter.getVariantClassification(clinicalSignificance)); + } + clinVar.setHeritableTraits(new LinkedList<>()); + evidenceEntries.add(clinVar); + clinVarMap.put(accession, clinVar); + } + if (StringUtils.isNotEmpty(clinvarTrait)) { + if (clinvarTrait.startsWith("{")) { + try { + clinVar.getHeritableTraits() + .add(JacksonUtils.getDefaultObjectMapper().readValue(trait, HeritableTrait.class)); + } catch (JsonProcessingException ignore) { + logger.debug("Error parsing trait", ignore); + } } - ClinVar clinVar = new ClinVar(fields[1], clinicalSignificance, new ArrayList<>(), new ArrayList<>(), ""); - clinVarMap.put(fields[1], clinVar); - clinVarList.add(clinVar); + clinVar.getHeritableTraits().add(new HeritableTrait(clinvarTrait, ModeOfInheritance.NA)); } - clinVarMap.get(fields[1]).getTraits().add(fields[2]); break; case "CM": // Variant trait: CM -- mutation id -- primary histology -- histology subtype - Cosmic cosmic = new Cosmic(); - cosmic.setMutationId(fields[1]); - cosmic.setPrimaryHistology(fields[2]); - cosmic.setHistologySubtype(fields[3]); - cosmicList.add(cosmic); + EvidenceEntry cosmic = new EvidenceEntry(); + cosmic.setSource(new EvidenceSource("cosmic", null, null)); + String mutationId = fields[1]; + String primaryHistology = fields[2]; + String histologySubtype = fields[3]; + cosmic.setId(mutationId); + cosmic.setSomaticInformation(new SomaticInformation(null, null, primaryHistology, histologySubtype, null, null)); + evidenceEntries.add(cosmic); break; case "KW": case "PD": @@ -580,28 +600,6 @@ public VariantAnnotation getVariantAnnotation(VariantSearchModel variantSearchMo } } } - - // TODO to be removed in next versions - VariantTraitAssociation variantTraitAssociation = new VariantTraitAssociation(); - // This fills the old data model: variantTraitAssociation - if (CollectionUtils.isNotEmpty(clinVarList)) { - variantTraitAssociation.setClinvar(clinVarList); - } - if (CollectionUtils.isNotEmpty(cosmicList)) { - variantTraitAssociation.setCosmic(cosmicList); - } - variantAnnotation.setVariantTraitAssociation(variantTraitAssociation); - - // This fills the new data model: traitAssociation - List evidenceEntries = new ArrayList<>(); - // Clinvar -> traitAssociation - for (ClinVar clinvar: clinVarList) { - evidenceEntries.add(evidenceEntryConverter.fromClinVar(clinvar)); - } - // Cosmic -> traitAssociation - for (Cosmic cosmic: cosmicList) { - evidenceEntries.add(evidenceEntryConverter.fromCosmic(cosmic)); - } variantAnnotation.setTraitAssociation(evidenceEntries); // Set the gene disease annotation diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java index aacea1ca1fd..805ea86f73f 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java @@ -32,8 +32,12 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; import org.opencb.cellbase.client.rest.CellBaseClient; +import org.opencb.cellbase.core.CellBaseDataResponse; import org.opencb.commons.ProgressLogger; -import org.opencb.commons.datastore.core.*; +import org.opencb.commons.datastore.core.DataResult; +import org.opencb.commons.datastore.core.FacetField; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.solr.FacetQueryParser; import org.opencb.commons.datastore.solr.SolrCollection; import org.opencb.commons.datastore.solr.SolrManager; @@ -531,9 +535,9 @@ public DataResult facetedQuery(String collection, Query query, Query Map ensemblGeneIdToGeneName = null; if (replaceGenes) { List ensemblGeneIds = getEnsemblGeneIds(facetResult.getResults()); - QueryResponse geneQueryResponse = cellBaseClient.getGeneClient().get(ensemblGeneIds, QueryOptions.empty()); + CellBaseDataResponse geneCellBaseDataResponse = cellBaseClient.getGeneClient().get(ensemblGeneIds, QueryOptions.empty()); ensemblGeneIdToGeneName = new HashMap<>(); - for (Gene gene: geneQueryResponse.allResults()) { + for (Gene gene: geneCellBaseDataResponse.allResults()) { ensemblGeneIdToGeneName.put(gene.getId(), gene.getName()); } } diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/adaptors/VariantDBAdaptorTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/adaptors/VariantDBAdaptorTest.java index 612231eea86..c4101d73557 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/adaptors/VariantDBAdaptorTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/adaptors/VariantDBAdaptorTest.java @@ -571,10 +571,10 @@ public void testGetAllVariants_xref() { hasAnnotation(with("ConsequenceType", VariantAnnotation::getConsequenceTypes, hasItem(with("EnsemblGene", ConsequenceType::getEnsemblGeneId, is("ENSG00000250026"))))), hasAnnotation(with("ConsequenceType", VariantAnnotation::getConsequenceTypes, - hasItem(with("GeneName", ConsequenceType::getGeneName, is("TMPRSS11B"))))), - hasAnnotation(with("VariantTraitAssociation", VariantAnnotation::getVariantTraitAssociation, - with("Cosmic", VariantTraitAssociation::getCosmic, - hasItem(with("MutationId", Cosmic::getMutationId, is("COSM1421316")))))) + hasItem(with("GeneName", ConsequenceType::getGeneName, is("TMPRSS11B"))))) +// hasAnnotation(with("VariantTraitAssociation", VariantAnnotation::getVariantTraitAssociation, +// with("Cosmic", VariantTraitAssociation::getCosmic, +// hasItem(with("MutationId", Cosmic::getMutationId, is("COSM1421316")))))) ))); } diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorTest.java index cdfaddd1324..571e5af81b2 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/annotation/annotators/VariantAnnotatorTest.java @@ -6,8 +6,8 @@ import org.junit.rules.ExpectedException; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantAnnotation; +import org.opencb.cellbase.core.result.CellBaseDataResult; import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.datastore.core.QueryResult; import org.opencb.opencga.storage.core.StorageEngine; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.metadata.models.ProjectMetadata; @@ -128,13 +128,13 @@ public TestCellBaseRestVariantAnnotator remove(String variant) { } @Override - protected List> annotateFiltered(List variants) throws VariantAnnotatorException { - List> queryResults = super.annotateFiltered(variants); - for (Iterator> iterator = queryResults.iterator(); iterator.hasNext(); ) { - QueryResult queryResult = iterator.next(); - assertEquals(1, queryResult.getResult().size()); + protected List> annotateFiltered(List variants) throws VariantAnnotatorException { + List> queryResults = super.annotateFiltered(variants); + for (Iterator> iterator = queryResults.iterator(); iterator.hasNext(); ) { + CellBaseDataResult queryResult = iterator.next(); + assertEquals(1, queryResult.getResults().size()); if (skipvariants.contains(queryResult.getId())) { - queryResult.setResult(Collections.emptyList()); + queryResult.setResults(Collections.emptyList()); queryResult.setNumResults(0); } else if (removevariants.contains(queryResult.getId())) { iterator.remove(); diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java index ab1d55773e4..412b33aa7e7 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java @@ -12,6 +12,7 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.biodata.tools.variant.VariantVcfHtsjdkReader; import org.opencb.cellbase.client.rest.CellBaseClient; +import org.opencb.cellbase.core.CellBaseDataResponse; import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.solr.FacetQueryParser; import org.opencb.commons.utils.ListUtils; @@ -321,11 +322,11 @@ private List annotatedVariants(List variants) throws IOExcepti private List annotatedVariants(List variants, String studyId) throws IOException { CellBaseClient cellBaseClient = new CellBaseClient(variantStorageEngine.getConfiguration().getCellbase().toClientConfiguration()); - QueryResponse queryResponse = cellBaseClient.getVariantClient().getAnnotationByVariantIds(variants.stream().map(Variant::toString).collect(Collectors.toList()), QueryOptions.empty()); + CellBaseDataResponse queryResponse = cellBaseClient.getVariantClient().getAnnotationByVariantIds(variants.stream().map(Variant::toString).collect(Collectors.toList()), QueryOptions.empty()); // Set annotations for (int i = 0; i < variants.size(); i++) { - variants.get(i).setAnnotation(queryResponse.getResponse().get(i).first()); + variants.get(i).setAnnotation(queryResponse.getResponses().get(i).first()); variants.get(i).getStudies().get(0).setStudyId(studyId); } return variants; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java index d86a9d40f45..a1e2ace9b3c 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/HBaseToVariantAnnotationConverter.java @@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.introspect.Annotated; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hbase.Cell; @@ -40,7 +39,6 @@ import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryException; import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationManager; -import org.opencb.opencga.storage.core.variant.annotation.converters.VariantTraitAssociationToEvidenceEntryConverter; import org.opencb.opencga.storage.core.variant.io.json.mixin.VariantAnnotationMixin; import org.opencb.opencga.storage.hadoop.variant.GenomeHelper; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixSchema; @@ -70,7 +68,6 @@ public class HBaseToVariantAnnotationConverter extends AbstractPhoenixConverter private final ObjectMapper objectMapper; private final byte[] columnFamily; private final long ts; - private final VariantTraitAssociationToEvidenceEntryConverter traitAssociationConverter; private byte[] annotationColumn = VariantPhoenixSchema.VariantColumn.FULL_ANNOTATION.bytes(); private String annotationColumnStr = Bytes.toString(annotationColumn); private String defaultAnnotationId = null; @@ -91,7 +88,6 @@ public HBaseToVariantAnnotationConverter(byte[] columnFamily, long ts) { this.ts = ts; objectMapper = new ObjectMapper(); objectMapper.addMixIn(VariantAnnotation.class, VariantAnnotationMixin.class); - traitAssociationConverter = new VariantTraitAssociationToEvidenceEntryConverter(); } public HBaseToVariantAnnotationConverter setAnnotationColumn(byte[] annotationColumn, String name) { @@ -377,13 +373,6 @@ private VariantAnnotation post(VariantAnnotation variantAnnotation, List evidenceEntries = traitAssociationConverter.convert(variantAnnotation.getVariantTraitAssociation()); - variantAnnotation.setTraitAssociation(evidenceEntries); - } - AdditionalAttribute additionalAttribute = null; if (hasAnnotationId || hasRelease || hasIndex) { if (variantAnnotation.getAdditionalAttributes() == null) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/VariantAnnotationToPhoenixConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/VariantAnnotationToPhoenixConverter.java index 6fd169736ae..a6caf2d8cc3 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/VariantAnnotationToPhoenixConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/converters/annotation/VariantAnnotationToPhoenixConverter.java @@ -24,7 +24,6 @@ import org.opencb.biodata.models.variant.avro.*; import org.opencb.biodata.tools.commons.Converter; import org.opencb.commons.utils.CompressionUtils; -import org.opencb.opencga.storage.core.variant.annotation.converters.VariantTraitAssociationToEvidenceEntryConverter; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.PhoenixHelper; import org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixSchema; import org.opencb.opencga.storage.hadoop.variant.converters.AbstractPhoenixConverter; @@ -37,9 +36,9 @@ import java.util.stream.Collectors; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.parseConsequenceType; +import static org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory.generateVariantRowKey; import static org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixSchema.DEFAULT_HUMAN_POPULATION_FREQUENCIES_COLUMNS; import static org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixSchema.VariantColumn.*; -import static org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory.generateVariantRowKey; /** * Created on 01/12/15. @@ -62,8 +61,6 @@ public class VariantAnnotationToPhoenixConverter extends AbstractPhoenixConverte DEFAULT_POP_FREQ = Collections.unmodifiableMap(map); } - private VariantTraitAssociationToEvidenceEntryConverter evidenceEntryConverter; - private int annotationId; @Deprecated @@ -73,7 +70,6 @@ public VariantAnnotationToPhoenixConverter(byte[] columnFamily) { public VariantAnnotationToPhoenixConverter(byte[] columnFamily, int annotationId) { super(columnFamily); - evidenceEntryConverter = new VariantTraitAssociationToEvidenceEntryConverter(); this.annotationId = annotationId; } @@ -84,12 +80,6 @@ public VariantAnnotationToPhoenixConverter(byte[] columnFamily, int annotationId HashMap map = new HashMap<>(); - // If there are VariantTraitAssociation, and there are none TraitAssociations (EvidenceEntry), convert - if (variantAnnotation.getVariantTraitAssociation() != null && CollectionUtils.isEmpty(variantAnnotation.getTraitAssociation())) { - List evidenceEntries = evidenceEntryConverter.convert(variantAnnotation.getVariantTraitAssociation()); - variantAnnotation.setTraitAssociation(evidenceEntries); - } - String json = variantAnnotation.toString(); if (json.length() > COMPRESS_THRESHOLD) { try { @@ -209,21 +199,9 @@ public VariantAnnotationToPhoenixConverter(byte[] columnFamily, int annotationId } } - if (variantAnnotation.getVariantTraitAssociation() != null) { - if (variantAnnotation.getVariantTraitAssociation().getCosmic() != null) { - for (Cosmic cosmic : variantAnnotation.getVariantTraitAssociation().getCosmic()) { - addNotNull(xrefs, cosmic.getMutationId()); - } - } - if (variantAnnotation.getVariantTraitAssociation().getClinvar() != null) { - for (ClinVar clinVar : variantAnnotation.getVariantTraitAssociation().getClinvar()) { - addNotNull(xrefs, clinVar.getAccession()); - } - } - } - if (CollectionUtils.isNotEmpty(variantAnnotation.getTraitAssociation())) { for (EvidenceEntry evidenceEntry : variantAnnotation.getTraitAssociation()) { + addNotNull(xrefs, evidenceEntry.getId()); if (evidenceEntry.getVariantClassification() != null) { ClinicalSignificance clinicalSignificance = evidenceEntry.getVariantClassification().getClinicalSignificance(); if (clinicalSignificance != null) { diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java index 2a853ad5dc5..4f6cdf33fa2 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/annotation/AnnotationIndexConverter.java @@ -17,7 +17,7 @@ import java.util.*; import static org.opencb.biodata.models.variant.StudyEntry.DEFAULT_COHORT; -import static org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils.*; +import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.*; import static org.opencb.opencga.storage.hadoop.variant.adaptors.phoenix.VariantPhoenixKeyFactory.generateVariantRowKey; /** diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java index 230c4614396..65ac46484af 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/main/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParser.java @@ -7,7 +7,7 @@ import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; import org.opencb.biodata.models.variant.avro.ClinicalSignificance; import org.opencb.biodata.models.variant.avro.VariantType; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.Query; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; import org.opencb.opencga.storage.core.metadata.models.SampleMetadata; @@ -897,12 +897,12 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool soNames = soNames.stream() .map(ct -> ConsequenceTypeMappings.accessionToTerm.get(VariantQueryUtils.parseConsequenceType(ct))) .collect(Collectors.toList()); - if (!soNames.contains(VariantAnnotationUtils.INTERGENIC_VARIANT) - && !soNames.contains(VariantAnnotationUtils.REGULATORY_REGION_VARIANT) - && !soNames.contains(VariantAnnotationUtils.TF_BINDING_SITE_VARIANT)) { + if (!soNames.contains(VariantAnnotationConstants.INTERGENIC_VARIANT) + && !soNames.contains(VariantAnnotationConstants.REGULATORY_REGION_VARIANT) + && !soNames.contains(VariantAnnotationConstants.TF_BINDING_SITE_VARIANT)) { // All ct values but "intergenic_variant" and "regulatory_region_variant" are in genes (i.e. non-intergenic) intergenic = false; - } else if (soNames.size() == 1 && soNames.contains(VariantAnnotationUtils.INTERGENIC_VARIANT)) { + } else if (soNames.size() == 1 && soNames.contains(VariantAnnotationConstants.INTERGENIC_VARIANT)) { intergenic = true; } boolean ctFilterCoveredBySummary = false; @@ -919,7 +919,7 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool } } if (LOF_EXTENDED_SET.containsAll(soNames)) { - boolean proteinCodingOnly = query.getString(ANNOT_BIOTYPE.key()).equals(VariantAnnotationUtils.PROTEIN_CODING); + boolean proteinCodingOnly = query.getString(ANNOT_BIOTYPE.key()).equals(VariantAnnotationConstants.PROTEIN_CODING); ctFilterCoveredBySummary = soNames.size() == LOF_EXTENDED_SET.size(); annotationIndex |= LOF_EXTENDED_MASK; // If all present, remove consequenceType filter @@ -939,7 +939,7 @@ protected SampleAnnotationIndexQuery parseAnnotationIndexQuery(Query query, bool annotationIndex |= LOFE_PROTEIN_CODING_MASK; } } - if (soNames.size() == 1 && soNames.get(0).equals(VariantAnnotationUtils.MISSENSE_VARIANT)) { + if (soNames.size() == 1 && soNames.get(0).equals(VariantAnnotationConstants.MISSENSE_VARIANT)) { ctFilterCoveredBySummary = true; ctCovered = true; annotationIndex |= MISSENSE_VARIANT_MASK; diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java index 961a6cfcf47..a7d9c8ba32d 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexQueryParserTest.java @@ -7,7 +7,7 @@ import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.biodata.models.variant.metadata.VariantFileHeaderComplexLine; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; @@ -29,9 +29,9 @@ import java.util.function.Function; import static org.junit.Assert.*; -import static org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils.ANTISENSE; -import static org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils.PROTEIN_CODING; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; +import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.ANTISENSE; +import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.PROTEIN_CODING; import static org.opencb.opencga.storage.core.variant.query.VariantQueryUtils.*; import static org.opencb.opencga.storage.hadoop.variant.index.IndexUtils.*; import static org.opencb.opencga.storage.hadoop.variant.index.annotation.AnnotationIndexConverter.*; @@ -905,7 +905,7 @@ public void testCoveredQuery_ct() { assertFalse(query.isEmpty()); // Not all samples annotated // Use CT column - query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), String.join(OR, VariantAnnotationUtils.STOP_LOST)); + query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), String.join(OR, VariantAnnotationConstants.STOP_LOST)); parseAnnotationIndexQuery(query, true); assertTrue(query.isEmpty()); @@ -913,13 +913,13 @@ public void testCoveredQuery_ct() { parseAnnotationIndexQuery(query, true); assertTrue(query.isEmpty()); - query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), String.join(OR, VariantAnnotationUtils.STOP_LOST)); + query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), String.join(OR, VariantAnnotationConstants.STOP_LOST)); parseAnnotationIndexQuery(query, false); indexQuery = parseAnnotationIndexQuery(query, false); assertNotEquals(EMPTY_MASK, indexQuery.getConsequenceTypeMask()); assertFalse(query.isEmpty()); // Index not complete - query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), String.join(OR, VariantAnnotationUtils.MATURE_MIRNA_VARIANT)); + query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), String.join(OR, VariantAnnotationConstants.MATURE_MIRNA_VARIANT)); indexQuery = parseAnnotationIndexQuery(query, true); assertNotEquals(EMPTY_MASK, indexQuery.getConsequenceTypeMask()); assertFalse(query.isEmpty()); // Imprecise CT value @@ -932,19 +932,19 @@ public void testCoveredQuery_biotype() { Query query; SampleAnnotationIndexQuery indexQuery; - query = new Query().append(ANNOT_BIOTYPE.key(), VariantAnnotationUtils.PROTEIN_CODING); + query = new Query().append(ANNOT_BIOTYPE.key(), PROTEIN_CODING); parseAnnotationIndexQuery(query, true); assertTrue(query.isEmpty()); - query = new Query().append(ANNOT_BIOTYPE.key(), VariantAnnotationUtils.PROTEIN_CODING + "," + VariantAnnotationUtils.MIRNA); + query = new Query().append(ANNOT_BIOTYPE.key(), PROTEIN_CODING + "," + VariantAnnotationConstants.MIRNA); parseAnnotationIndexQuery(query, true); assertTrue(query.isEmpty()); - query = new Query().append(ANNOT_BIOTYPE.key(), VariantAnnotationUtils.PROTEIN_CODING + "," + VariantAnnotationUtils.MIRNA); + query = new Query().append(ANNOT_BIOTYPE.key(), PROTEIN_CODING + "," + VariantAnnotationConstants.MIRNA); parseAnnotationIndexQuery(query, false); assertFalse(query.isEmpty()); // Index not complete - query = new Query().append(ANNOT_BIOTYPE.key(), VariantAnnotationUtils.LINCRNA); + query = new Query().append(ANNOT_BIOTYPE.key(), VariantAnnotationConstants.LINCRNA); parseAnnotationIndexQuery(query, true); assertFalse(query.isEmpty()); // Imprecise BT value } @@ -1112,7 +1112,7 @@ public void testCoveredQuery_combined() { // The combination is covered // The params can not be removed from the query, as the CT is filter is only an approximation // BT has to remain to check the combination. - query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), VariantAnnotationUtils.FIVE_PRIME_UTR_VARIANT) + query = new Query().append(ANNOT_CONSEQUENCE_TYPE.key(), VariantAnnotationConstants.FIVE_PRIME_UTR_VARIANT) .append(ANNOT_BIOTYPE.key(), "protein_coding,miRNA"); indexQuery = parseAnnotationIndexQuery(query, true); assertNotEquals(EMPTY_MASK, indexQuery.getBiotypeMask()); diff --git a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java index 19f00c05f90..c517bb3302a 100644 --- a/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java +++ b/opencga-storage/opencga-storage-hadoop/opencga-storage-hadoop-core/src/test/java/org/opencb/opencga/storage/hadoop/variant/index/sample/SampleIndexTest.java @@ -19,7 +19,7 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.biodata.models.variant.metadata.SampleVariantStats; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; +import org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants; import org.opencb.commons.datastore.core.*; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.response.VariantQueryResult; @@ -51,9 +51,9 @@ import static java.util.stream.Collectors.*; import static org.junit.Assert.*; -import static org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils.THREE_PRIME_UTR_VARIANT; import static org.opencb.opencga.storage.core.variant.adaptors.VariantMatchers.*; import static org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam.*; +import static org.opencb.opencga.storage.core.variant.annotation.VariantAnnotationConstants.THREE_PRIME_UTR_VARIANT; /** * Created on 12/04/19. @@ -474,12 +474,12 @@ public void testSampleIndexSkipIntersect() throws StorageEngineException { assertEquals("sample_index_table", result.getSource()); query.append(VariantQueryParam.ANNOT_CONSEQUENCE_TYPE.key(), String.join(",", new ArrayList<>(VariantQueryUtils.LOF_EXTENDED_SET).subList(2, 4))) - .append(ANNOT_BIOTYPE.key(), VariantAnnotationUtils.PROTEIN_CODING); + .append(ANNOT_BIOTYPE.key(), VariantAnnotationConstants.PROTEIN_CODING); result = variantStorageEngine.get(query, new QueryOptions(QueryOptions.INCLUDE, VariantField.ID).append(QueryOptions.LIMIT, 1)); assertEquals("sample_index_table", result.getSource()); query.append(VariantQueryParam.ANNOT_CONSEQUENCE_TYPE.key(), String.join(",", new ArrayList<>(VariantQueryUtils.LOF_EXTENDED_SET).subList(2, 4)) + "," + THREE_PRIME_UTR_VARIANT) - .append(ANNOT_BIOTYPE.key(), VariantAnnotationUtils.PROTEIN_CODING); + .append(ANNOT_BIOTYPE.key(), VariantAnnotationConstants.PROTEIN_CODING); result = variantStorageEngine.get(query, new QueryOptions(QueryOptions.INCLUDE, VariantField.ID).append(QueryOptions.LIMIT, 1)); assertNotEquals("sample_index_table", result.getSource()); } diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBAdaptor.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBAdaptor.java index bc10d23a594..32e33081898 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBAdaptor.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBAdaptor.java @@ -1224,9 +1224,8 @@ public static void createIndexes(QueryOptions options, MongoDBCollection variant variantsCollection.createIndex(new Document() .append(DocumentToVariantConverter.ANNOTATION_FIELD + '.' + DocumentToVariantAnnotationConverter.CLINICAL_DATA_FIELD - + '.' + DocumentToVariantAnnotationConverter.CLINICAL_CLINVAR_FIELD - + ".clinicalSignificance", 1), - new ObjectMap(onBackgroundSparse).append(NAME, "clinvar")); + + ".variantClassification.clinicalSignificance", 1), + new ObjectMap(onBackgroundSparse).append(NAME, "clinical")); // Conserved region score (phastCons, phylop, gerp) variantsCollection.createIndex(new Document(DocumentToVariantConverter.ANNOTATION_FIELD diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBQueryParser.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBQueryParser.java index e00c0567801..bf4d5d2cd1f 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBQueryParser.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/adaptors/VariantMongoDBQueryParser.java @@ -31,7 +31,6 @@ import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.ClinicalSignificance; -import org.opencb.cellbase.core.variant.annotation.VariantAnnotationUtils; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.storage.core.metadata.VariantStorageMetadataManager; @@ -336,22 +335,13 @@ private void parseAnnotationQueryParams(Query query, QueryBuilder builder) { if (isValidParam(query, ANNOT_CLINICAL_SIGNIFICANCE)) { String key = DocumentToVariantConverter.ANNOTATION_FIELD + '.' + DocumentToVariantAnnotationConverter.CLINICAL_DATA_FIELD - + '.' + DocumentToVariantAnnotationConverter.CLINICAL_CLINVAR_FIELD + + '.' + "variantClassification" + '.' + "clinicalSignificance"; ParsedQuery values = splitValue(query, ANNOT_CLINICAL_SIGNIFICANCE); List list = new ArrayList<>(values.getValues().size()); for (String clinicalSignificance : values) { ClinicalSignificance enumValue = EnumUtils.getEnum(ClinicalSignificance.class, clinicalSignificance); - if (enumValue != null) { - for (Map.Entry entry : VariantAnnotationUtils.CLINVAR_CLINSIG_TO_ACMG.entrySet()) { - if (entry.getValue() == enumValue) { - clinicalSignificance = entry.getKey(); - break; - } - } - } - list.add(new QueryBuilder().and(key).regex(Pattern.compile("^" - + clinicalSignificance, Pattern.CASE_INSENSITIVE)).get()); + list.add(new QueryBuilder().and(key).is(enumValue.toString()).get()); } if (QueryOperation.OR.equals(values.getOperation())) { builder.or(list.toArray(new DBObject[0])); diff --git a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java index 43d6e68ce69..0bd508ae9f2 100644 --- a/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java +++ b/opencga-storage/opencga-storage-mongodb/src/main/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverter.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.SerializationFeature; import org.apache.avro.generic.GenericRecord; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.bson.Document; import org.opencb.biodata.models.variant.Variant; @@ -29,13 +30,12 @@ import org.opencb.biodata.models.variant.avro.*; import org.opencb.commons.datastore.core.ComplexTypeConverter; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; -import org.opencb.opencga.storage.core.variant.annotation.converters.VariantTraitAssociationToEvidenceEntryConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; -import static org.opencb.opencga.storage.mongodb.variant.converters.DocumentToVariantConverter.*; +import static org.opencb.opencga.storage.mongodb.variant.converters.DocumentToVariantConverter.ANNOTATION_FIELD; /** * Created by jacobo on 13/01/15. @@ -133,9 +133,9 @@ public class DocumentToVariantAnnotationConverter public static final String SCORE_DESCRIPTION_FIELD = "desc"; public static final String CLINICAL_DATA_FIELD = "clinical"; - public static final String CLINICAL_COSMIC_FIELD = "cosmic"; - public static final String CLINICAL_GWAS_FIELD = "gwas"; - public static final String CLINICAL_CLINVAR_FIELD = "clinvar"; +// public static final String CLINICAL_COSMIC_FIELD = "cosmic"; +// public static final String CLINICAL_GWAS_FIELD = "gwas"; +// public static final String CLINICAL_CLINVAR_FIELD = "clinvar"; public static final String FUNCTIONAL_SCORE = "fn_score"; public static final String FUNCTIONAL_CADD_RAW_FIELD = "fn_cadd_r"; @@ -188,8 +188,6 @@ public class DocumentToVariantAnnotationConverter SCORE_FIELD_MAP = Collections.unmodifiableMap(scoreFieldMap); } - private final VariantTraitAssociationToEvidenceEntryConverter traitAssociationConverter - = new VariantTraitAssociationToEvidenceEntryConverter(); private Integer annotationId = null; private Map annotationIds = Collections.emptyMap(); @@ -249,7 +247,7 @@ public VariantAnnotation convertToDataModelType(Document object, Document custom soAccessionNames.add(ConsequenceTypeMappings.accessionToTerm.get(so)); } } else { - soAccessionNames.add(ConsequenceTypeMappings.accessionToTerm.get(ct.get(CT_SO_ACCESSION_FIELD))); + soAccessionNames.add(ConsequenceTypeMappings.accessionToTerm.get(ct.getInteger(CT_SO_ACCESSION_FIELD))); } } @@ -430,8 +428,7 @@ public VariantAnnotation convertToDataModelType(Document object, Document custom //Clinical Data if (object.containsKey(CLINICAL_DATA_FIELD)) { - va.setVariantTraitAssociation(parseClinicalData((Document) object.get(CLINICAL_DATA_FIELD))); - va.setTraitAssociation(traitAssociationConverter.convert(va.getVariantTraitAssociation())); + va.setTraitAssociation(parseClinicalData(object.get(CLINICAL_DATA_FIELD))); } if (customAnnotation != null) { @@ -526,8 +523,9 @@ private ConsequenceType buildConsequenceType(String geneName, String ensemblGene exonOverlapList.add(e); } - return new ConsequenceType(geneName, ensemblGeneId, ensemblTranscriptId, strand, biotype, exonOverlapList, - transcriptAnnotationFlags, cDnaPosition, cdsPosition, codon, proteinVariantAnnotation, soTerms); + return new ConsequenceType(geneName, ensemblGeneId, ensemblTranscriptId, ensemblGeneId, ensemblTranscriptId, strand, biotype, null, + exonOverlapList, transcriptAnnotationFlags, transcriptAnnotationFlags, cDnaPosition, cdsPosition, codon, + proteinVariantAnnotation, soTerms); } private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAccession, String uniprotName, int aaPosition, @@ -543,52 +541,29 @@ private ProteinVariantAnnotation buildProteinVariantAnnotation(String uniprotAcc } } - private VariantTraitAssociation parseClinicalData(Document clinicalData) { - if (clinicalData != null) { - int size = 0; - VariantTraitAssociation variantTraitAssociation = new VariantTraitAssociation(); - List cosmicDBList = (List) clinicalData.get(CLINICAL_COSMIC_FIELD); - if (cosmicDBList != null) { - List cosmicList = new ArrayList<>(cosmicDBList.size()); - for (Object object : cosmicDBList) { - Cosmic cosmic = jsonObjectMapper.convertValue(object, Cosmic.class); - for (int i = 0; i < cosmic.getSchema().getFields().size(); i++) { - if (cosmic.get(i) == null) { - cosmic.put(i, ""); - } - } - cosmicList.add(cosmic); - } - size += cosmicList.size(); - variantTraitAssociation.setCosmic(cosmicList); - } - List gwasDBList = (List) clinicalData.get(CLINICAL_GWAS_FIELD); - if (gwasDBList != null) { - List gwasList = new ArrayList<>(gwasDBList.size()); - for (Object object : gwasDBList) { - gwasList.add(jsonObjectMapper.convertValue(object, Gwas.class)); - } - size += gwasList.size(); - variantTraitAssociation.setGwas(gwasList); - } - List clinvarDBList = (List) clinicalData.get(CLINICAL_CLINVAR_FIELD); - if (clinvarDBList != null) { - List clinvarList = new ArrayList<>(clinvarDBList.size()); - for (Object object : clinvarDBList) { - clinvarList.add(jsonObjectMapper.convertValue(object, ClinVar.class)); + private List parseClinicalData(Object clinicalData) { + if (clinicalData instanceof List) { + List documents = (List) clinicalData; + List evidenceEntries = new ArrayList<>(documents.size()); + for (Object object : documents) { + try { + EvidenceEntry evidenceEntry = jsonObjectMapper.convertValue(object, EvidenceEntry.class); +// for (int i = 0; i < evidenceEntry.getSchema().getFields().size(); i++) { +// if (evidenceEntry.get(i) == null) { +// evidenceEntry.put(i, ""); +// } +// } + evidenceEntries.add(evidenceEntry); + } catch (Exception e) { + logger.warn("Error parsing evidence entry: " + e.getMessage()); + logger.debug("Error parsing evidence entry", e); } - size += clinvarList.size(); - variantTraitAssociation.setClinvar(clinvarList); } - if (size > 0) { - return variantTraitAssociation; - } else { - return null; + if (!evidenceEntries.isEmpty()) { + return evidenceEntries; } } - return null; - } public Map convertAdditionalAttributesToDataModelType(Document customAnnotation) { @@ -862,32 +837,16 @@ public Document convertToStorageType(VariantAnnotation variantAnnotation) { } //Clinical Data - Document clinicalDocument = new Document(); - if (variantAnnotation.getVariantTraitAssociation() != null) { - putNotNull(clinicalDocument, CLINICAL_COSMIC_FIELD, - generateClinicalDBList(variantAnnotation.getVariantTraitAssociation().getCosmic())); - if (variantAnnotation.getVariantTraitAssociation().getCosmic() != null) { - variantAnnotation.getVariantTraitAssociation().getCosmic() - .stream() - .map(Cosmic::getMutationId) - .filter(StringUtils::isNotEmpty) - .forEach(mutationId -> xrefs.add(convertXrefToStorage(mutationId, "COSMIC"))); - } - putNotNull(clinicalDocument, CLINICAL_GWAS_FIELD, - generateClinicalDBList(variantAnnotation.getVariantTraitAssociation().getGwas())); - putNotNull(clinicalDocument, CLINICAL_CLINVAR_FIELD, - generateClinicalDBList(variantAnnotation.getVariantTraitAssociation().getClinvar())); - if (variantAnnotation.getVariantTraitAssociation().getClinvar() != null) { - variantAnnotation.getVariantTraitAssociation().getClinvar() + if (CollectionUtils.isNotEmpty(variantAnnotation.getTraitAssociation())) { + document.put(CLINICAL_DATA_FIELD, generateClinicalDBList(variantAnnotation.getTraitAssociation())); + + if (variantAnnotation.getTraitAssociation() != null) { + variantAnnotation.getTraitAssociation() .stream() - .map(ClinVar::getAccession) - .filter(StringUtils::isNotEmpty) - .forEach(accession -> xrefs.add(convertXrefToStorage(accession, "ClinVar"))); + .filter(e -> StringUtils.isNotEmpty(e.getId())) + .forEach(e -> xrefs.add(convertXrefToStorage(e.getId(), e.getSource() != null ? e.getSource().getName() : null))); } } - if (!clinicalDocument.isEmpty()) { - document.put(CLINICAL_DATA_FIELD, clinicalDocument); - } if (variantAnnotation.getRepeat() != null && !variantAnnotation.getRepeat().isEmpty()) { List repeats = new ArrayList<>(variantAnnotation.getRepeat().size()); diff --git a/opencga-storage/opencga-storage-mongodb/src/test/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverterTest.java b/opencga-storage/opencga-storage-mongodb/src/test/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverterTest.java index 48ddb06d337..8b41cdf5bda 100644 --- a/opencga-storage/opencga-storage-mongodb/src/test/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverterTest.java +++ b/opencga-storage/opencga-storage-mongodb/src/test/java/org/opencb/opencga/storage/mongodb/variant/converters/DocumentToVariantAnnotationConverterTest.java @@ -210,56 +210,56 @@ public void setUp() throws JsonProcessingException { )) .append(CONSERVED_REGION_PHASTCONS_FIELD, new Document(SCORE_SCORE_FIELD, 0.11100000143051147)) .append(CONSERVED_REGION_PHYLOP_FIELD, new Document(SCORE_SCORE_FIELD, 0.5609999895095825)) - .append(CLINICAL_DATA_FIELD, new Document() - .append(CLINICAL_COSMIC_FIELD, asList( - new Document() - .append("mutationId", "3749517") - .append("primarySite", "large_intestine") - .append("siteSubtype", "rectum") - .append("primaryHistology", "carcinoma") - .append("histologySubtype", "adenocarcinoma") - .append("sampleSource", "NS") - .append("tumourOrigin", "primary") - .append("geneName", "APOE") - .append("mutationSomaticStatus", "Confirmed somatic variant"))) - .append(CLINICAL_GWAS_FIELD, asList( - new Document() - .append("snpIdCurrent", "429358") - .append("traits", asList("Alzheimer's disease biomarkers")) - .append("riskAlleleFrequency", 0.28) - .append("reportedGenes", "APOE"))) - .append(CLINICAL_CLINVAR_FIELD, asList( - new Document() - .append("accession", "RCV000019456") - .append("clinicalSignificance", "Pathogenic") - .append("traits", singletonList("APOE4(-)-FREIBURG")) - .append("geneNames", singletonList("APOE")) - .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER"), - new Document() - .append("accession", "RCV000019455") - .append("clinicalSignificance", "Pathogenic") - .append("traits", singletonList("Familial type 3 hyperlipoproteinemia")) - .append("geneNames", singletonList("APOE")) - .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER"), - new Document() - .append("accession", "RCV000019438") - .append("clinicalSignificance", "Pathogenic") - .append("traits", singletonList("Familial type 3 hyperlipoproteinemia")) - .append("geneNames", singletonList("APOE")) - .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER"), - new Document() - .append("accession", "RCV000019448") - .append("clinicalSignificance", "Pathogenic") - .append("traits", singletonList("ALZHEIMER DISEASE 2, DUE TO APOE4 ISOFORM")) - .append("geneNames", singletonList("APOE")) - .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER"), - new Document() - .append("accession", "RCV000019458") - .append("clinicalSignificance", "Pathogenic") - .append("traits", singletonList("APOE4 VARIANT")) - .append("geneNames", singletonList("APOE")) - .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER") - ))) +// .append(CLINICAL_DATA_FIELD, new Document() +// .append(CLINICAL_COSMIC_FIELD, asList( +// new Document() +// .append("mutationId", "3749517") +// .append("primarySite", "large_intestine") +// .append("siteSubtype", "rectum") +// .append("primaryHistology", "carcinoma") +// .append("histologySubtype", "adenocarcinoma") +// .append("sampleSource", "NS") +// .append("tumourOrigin", "primary") +// .append("geneName", "APOE") +// .append("mutationSomaticStatus", "Confirmed somatic variant"))) +// .append(CLINICAL_GWAS_FIELD, asList( +// new Document() +// .append("snpIdCurrent", "429358") +// .append("traits", asList("Alzheimer's disease biomarkers")) +// .append("riskAlleleFrequency", 0.28) +// .append("reportedGenes", "APOE"))) +// .append(CLINICAL_CLINVAR_FIELD, asList( +// new Document() +// .append("accession", "RCV000019456") +// .append("clinicalSignificance", "Pathogenic") +// .append("traits", singletonList("APOE4(-)-FREIBURG")) +// .append("geneNames", singletonList("APOE")) +// .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER"), +// new Document() +// .append("accession", "RCV000019455") +// .append("clinicalSignificance", "Pathogenic") +// .append("traits", singletonList("Familial type 3 hyperlipoproteinemia")) +// .append("geneNames", singletonList("APOE")) +// .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER"), +// new Document() +// .append("accession", "RCV000019438") +// .append("clinicalSignificance", "Pathogenic") +// .append("traits", singletonList("Familial type 3 hyperlipoproteinemia")) +// .append("geneNames", singletonList("APOE")) +// .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER"), +// new Document() +// .append("accession", "RCV000019448") +// .append("clinicalSignificance", "Pathogenic") +// .append("traits", singletonList("ALZHEIMER DISEASE 2, DUE TO APOE4 ISOFORM")) +// .append("geneNames", singletonList("APOE")) +// .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER"), +// new Document() +// .append("accession", "RCV000019458") +// .append("clinicalSignificance", "Pathogenic") +// .append("traits", singletonList("APOE4 VARIANT")) +// .append("geneNames", singletonList("APOE")) +// .append("reviewStatus", "CLASSIFIED_BY_SINGLE_SUBMITTER") +// ))) .append(XREFS_FIELD, ANY_LIST) .append(POPULATION_FREQUENCIES_FIELD, ANY_LIST) .append(GENE_SO_FIELD, ANY_LIST); @@ -279,7 +279,7 @@ public void testConvertToDataModelType() throws Exception { DocumentToVariantAnnotationConverter documentToVariantAnnotationConverter = new DocumentToVariantAnnotationConverter(); VariantAnnotation convertedVariantAnnotation = documentToVariantAnnotationConverter.convertToDataModelType(dbObject); assertEquals(convertedVariantAnnotation.getConsequenceTypes().get(2).getProteinVariantAnnotation().getReference(), "CYS"); - assertEquals(convertedVariantAnnotation.getVariantTraitAssociation().getCosmic().get(0).getPrimarySite(), "large_intestine"); +// assertEquals(convertedVariantAnnotation.getVariantTraitAssociation().getCosmic().get(0).getPrimarySite(), "large_intestine"); } @@ -289,8 +289,8 @@ public void testConvertToStorageType() throws Exception { Document convertedDBObject = documentToVariantAnnotationConverter.convertToStorageType(variantAnnotation); assertEquals(130, (int) ((Document) ((List) convertedDBObject.get(CONSEQUENCE_TYPE_FIELD)).get(2)).get(CT_AA_POSITION_FIELD)); assertEquals(0.5609999895095825, ((Document) convertedDBObject.get(CONSERVED_REGION_PHYLOP_FIELD)).getDouble(SCORE_SCORE_FIELD), 0.0001); - assertEquals("RCV000019456", ((Document) convertedDBObject.get(CLINICAL_DATA_FIELD, Document.class) - .get(CLINICAL_CLINVAR_FIELD, List.class).get(0)).get("accession", String.class)); +// assertEquals("RCV000019456", ((Document) convertedDBObject.get(CLINICAL_DATA_FIELD, Document.class) +// .get(CLINICAL_CLINVAR_FIELD, List.class).get(0)).get("accession", String.class)); // System.out.println("convertedDBObject = " + convertedDBObject.toJson(new JsonWriterSettings(JsonMode.SHELL, true))); checkEqualDocuments(dbObject, convertedDBObject); diff --git a/pom.xml b/pom.xml index 1e87911e38e..32eec6bb30a 100644 --- a/pom.xml +++ b/pom.xml @@ -44,8 +44,8 @@ 2.1.0-SNAPSHOT ${opencga.version} 2.1.0-beta - 4.8.0 - 2.0.5-SNAPSHOT + 5.0.0-SNAPSHOT + 2.1.0-SNAPSHOT 4.0.5-SNAPSHOT 0.2.0 From d216b952718910a8726b06b9cade9be9536bd3cc Mon Sep 17 00:00:00 2001 From: pfurio Date: Tue, 26 Jan 2021 15:02:17 +0100 Subject: [PATCH 026/412] app: add rga mongo indexes, #1693 --- opencga-app/app/misc/migration/v2.1.0/catalog/migration.js | 6 ++++++ opencga-catalog/src/main/resources/catalog-indexes.txt | 2 ++ 2 files changed, 8 insertions(+) create mode 100644 opencga-app/app/misc/migration/v2.1.0/catalog/migration.js diff --git a/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js b/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js new file mode 100644 index 00000000000..67c993eb9d5 --- /dev/null +++ b/opencga-app/app/misc/migration/v2.1.0/catalog/migration.js @@ -0,0 +1,6 @@ +if (versionNeedsUpdate(20100, 1)) { + runUpdate(function () { + db.individual.createIndex({"internal.rga.status": 1, "studyUid": 1}, {"background": true}); + db.sample.createIndex({"internal.rga.status": 1, "studyUid": 1}, {"background": true}); + }); +} \ No newline at end of file diff --git a/opencga-catalog/src/main/resources/catalog-indexes.txt b/opencga-catalog/src/main/resources/catalog-indexes.txt index baa2e2febe8..14f5f565c71 100644 --- a/opencga-catalog/src/main/resources/catalog-indexes.txt +++ b/opencga-catalog/src/main/resources/catalog-indexes.txt @@ -84,6 +84,7 @@ {"collection": "sample", "fields": {"customInternalAnnotationSets.id": 1, "customInternalAnnotationSets.value": 1}, "options": {"background": true}} {"collection": "sample", "fields": {"internal.status.name": 1, "studyUid": 1}, "options": {"background": true}} +{"collection": "sample", "fields": {"internal.rga.status": 1, "studyUid": 1}, "options": {"background": true}} {"collection": "individual", "fields": {"uuid": 1, "version": 1}, "options": {"unique": true, "background": true}} {"collection": "individual", "fields": {"uid": 1, "version": 1}, "options": {"unique": true, "background": true}} @@ -111,6 +112,7 @@ {"collection": "individual", "fields": {"customInternalAnnotationSets.id": 1, "customInternalAnnotationSets.value": 1}, "options": {"background": true}} {"collection": "individual", "fields": {"internal.status.name": 1, "studyUid": 1}, "options": {"background": true}} +{"collection": "individual", "fields": {"internal.rga.status": 1, "studyUid": 1}, "options": {"background": true}} {"collection": "cohort", "fields": {"uuid": 1}, "options": {"unique": true, "background": true}} {"collection": "cohort", "fields": {"uid": 1}, "options": {"unique": true, "background": true}} From cf46109f8c84560e3722390a077a136ef1f3237f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Tue, 26 Jan 2021 14:24:46 +0000 Subject: [PATCH 027/412] storage: Enable VairantNormalizeExtensions #1701 --- .../core/variant/VariantStorageOptions.java | 2 + .../core/variant/VariantStoragePipeline.java | 80 ++++++++++++++----- .../transform/VariantTransformTask.java | 48 ++++------- .../main/resources/storage-configuration.yml | 5 ++ .../VariantStoragePipelineTransformTest.java | 37 +++++++++ 5 files changed, 118 insertions(+), 54 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageOptions.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageOptions.java index 4b9ea65dadd..00e8b11e2cc 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageOptions.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStorageOptions.java @@ -1,6 +1,7 @@ package org.opencb.opencga.storage.core.variant; import org.opencb.biodata.models.variant.metadata.Aggregation; +import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.YesNoAuto; import org.opencb.opencga.storage.core.config.ConfigurationOption; @@ -25,6 +26,7 @@ public enum VariantStorageOptions implements ConfigurationOption { TRANSFORM_ISOLATE("transform.isolate", false), // Do not store file in metadata NORMALIZATION_SKIP("normalization.skip", false), // Do not run normalization NORMALIZATION_REFERENCE_GENOME("normalization.referenceGenome"), + NORMALIZATION_EXTENSIONS("normalization.extensions", ParamConstants.NONE), DEDUPLICATION_POLICY("deduplication.policy", "maxQual"), DEDUPLICATION_BUFFER_SIZE("deduplication.bufferSize", 100), diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java index aecbc342385..9c4cc1d3744 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/VariantStoragePipeline.java @@ -22,6 +22,7 @@ import htsjdk.variant.vcf.VCFHeaderLineType; import htsjdk.variant.vcf.VCFHeaderVersion; import org.apache.avro.generic.GenericRecord; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; @@ -34,7 +35,10 @@ import org.opencb.biodata.models.variant.avro.VariantAvro; import org.opencb.biodata.models.variant.metadata.VariantFileHeaderComplexLine; import org.opencb.biodata.tools.variant.VariantNormalizer; +import org.opencb.biodata.tools.variant.VariantReferenceBlockCreatorTask; +import org.opencb.biodata.tools.variant.VariantSorterTask; import org.opencb.biodata.tools.variant.merge.VariantMerger; +import org.opencb.biodata.tools.variant.normalizer.extensions.VariantNormalizerExtensionFactory; import org.opencb.biodata.tools.variant.stats.VariantSetStatsCalculator; import org.opencb.commons.ProgressLogger; import org.opencb.commons.datastore.core.ObjectMap; @@ -44,9 +48,11 @@ import org.opencb.commons.io.avro.AvroFileWriter; import org.opencb.commons.run.ParallelTaskRunner; import org.opencb.commons.run.Task; +import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.common.YesNoAuto; +import org.opencb.opencga.core.models.common.GenericRecordAvroJsonMixin; import org.opencb.opencga.storage.core.StoragePipeline; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; @@ -57,7 +63,6 @@ import org.opencb.opencga.storage.core.metadata.models.StudyMetadata; import org.opencb.opencga.storage.core.variant.adaptors.VariantDBAdaptor; import org.opencb.opencga.storage.core.variant.io.VariantReaderUtils; -import org.opencb.opencga.core.models.common.GenericRecordAvroJsonMixin; import org.opencb.opencga.storage.core.variant.query.VariantQueryUtils; import org.opencb.opencga.storage.core.variant.transform.MalformedVariantHandler; import org.opencb.opencga.storage.core.variant.transform.VariantTransformTask; @@ -214,9 +219,6 @@ public URI transform(URI input, URI pedigree, URI output) throws StorageEngineEx String fileName = UriUtils.fileName(input); String studyId = String.valueOf(getStudyId()); - boolean generateReferenceBlocks = options.getBoolean(VariantStorageOptions.GVCF.key(), false); - // Do not run parallelParse when generating reference blocks, as the task is stateful - boolean parallelParse = !generateReferenceBlocks; int batchSize = options.getInt( VariantStorageOptions.TRANSFORM_BATCH_SIZE.key(), @@ -285,28 +287,19 @@ public URI transform(URI input, URI pedigree, URI output) throws StorageEngineEx logger.info("Using HTSJDK to read variants."); Pair header = variantReaderUtils.readHtsHeader(input, stdin); - VariantNormalizer.VariantNormalizerConfig normalizerConfig; + boolean parallelParse = true; + Task normalizer; if (getOptions().getBoolean(NORMALIZATION_SKIP.key())) { - normalizerConfig = null; + normalizer = null; } else { - normalizerConfig = new VariantNormalizer.VariantNormalizerConfig() - .setReuseVariants(true) - .setNormalizeAlleles(true) - .setDecomposeMNVs(false) - .setGenerateReferenceBlocks(generateReferenceBlocks); - String referenceGenome = getOptions().getString(NORMALIZATION_REFERENCE_GENOME.key()); - if (StringUtils.isNotEmpty(referenceGenome)) { - try { - logger.info("Enable left alignment with reference genome file '{}'", referenceGenome); - normalizerConfig.enableLeftAlign(referenceGenome); - } catch (IOException e) { - throw StorageEngineException.ioException(e); - } - } + boolean generateReferenceBlocks = options.getBoolean(VariantStorageOptions.GVCF.key(), false); + // Do not run parallelParse when generating reference blocks, as the task is stateful + parallelParse = !generateReferenceBlocks; + normalizer = initNormalizer(metadata); } + Supplier> task = () -> - new VariantTransformTask(header.getKey(), header.getValue(), studyId, metadata, statsCalculator, generateReferenceBlocks, - normalizerConfig) + new VariantTransformTask(header.getKey(), header.getValue(), studyId, metadata, statsCalculator, normalizer) .setFailOnError(failOnError) .addMalformedErrorHandler(malformedHandler) .setIncludeSrc(false); @@ -381,6 +374,49 @@ public URI transform(URI input, URI pedigree, URI output) throws StorageEngineEx return outputVariantsFile; } + protected Task initNormalizer(VariantFileMetadata metadata) throws StorageEngineException { + boolean generateReferenceBlocks = options.getBoolean(GVCF.key(), false); + Collection enabledExtensions = getOptions() + .getAsStringList(NORMALIZATION_EXTENSIONS.key(), + NORMALIZATION_EXTENSIONS.defaultValue()); + VariantNormalizer.VariantNormalizerConfig normalizerConfig = new VariantNormalizer.VariantNormalizerConfig() + .setReuseVariants(true) + .setNormalizeAlleles(true) + .setDecomposeMNVs(false) + .setGenerateReferenceBlocks(generateReferenceBlocks); + String referenceGenome = getOptions().getString(NORMALIZATION_REFERENCE_GENOME.key()); + if (StringUtils.isNotEmpty(referenceGenome)) { + try { + logger.info("Enable left alignment with reference genome file '{}'", referenceGenome); + normalizerConfig.enableLeftAlign(referenceGenome); + } catch (IOException e) { + throw StorageEngineException.ioException(e); + } + } + + Task normalizer = new VariantNormalizer(normalizerConfig) + .configure(metadata.getHeader()); + if (generateReferenceBlocks) { + normalizer = normalizer + .then(new VariantSorterTask(100)) // Sort before generating reference blocks + .then(new VariantReferenceBlockCreatorTask(metadata.getHeader())); + } + if (CollectionUtils.isNotEmpty(enabledExtensions)) { + VariantNormalizerExtensionFactory extensionFactory; + if (enabledExtensions.size() == 1 && enabledExtensions.contains(ParamConstants.ALL)) { + extensionFactory = new VariantNormalizerExtensionFactory(); + } else { + extensionFactory = new VariantNormalizerExtensionFactory(new HashSet<>(enabledExtensions)); + } + Task extension = extensionFactory.buildExtensions(metadata); + if (extension != null) { + normalizer = normalizer.then(extension); + } + } + + return normalizer; + } + protected ParallelTaskRunner buildTransformPtr(boolean parallelParse, DataReader stringReader, Supplier> task, diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/transform/VariantTransformTask.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/transform/VariantTransformTask.java index 1bf21432f77..e69f6d7c290 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/transform/VariantTransformTask.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/transform/VariantTransformTask.java @@ -31,21 +31,20 @@ import org.opencb.biodata.models.variant.avro.FileEntry; import org.opencb.biodata.models.variant.exceptions.NotAVariantException; import org.opencb.biodata.models.variant.metadata.VariantStudyMetadata; -import org.opencb.biodata.tools.variant.VariantNormalizer; -import org.opencb.biodata.tools.variant.VariantReferenceBlockCreatorTask; -import org.opencb.biodata.tools.variant.VariantSorterTask; import org.opencb.biodata.tools.variant.converters.avro.VariantContextToVariantConverter; import org.opencb.biodata.tools.variant.stats.VariantSetStatsCalculator; import org.opencb.commons.run.Task; -import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.opencb.opencga.core.models.common.GenericRecordAvroJsonMixin; +import org.opencb.opencga.storage.core.variant.VariantStorageOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.OutputStream; import java.io.UncheckedIOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.concurrent.atomic.AtomicLong; import java.util.function.BiConsumer; @@ -74,8 +73,7 @@ public class VariantTransformTask implements Task { public VariantTransformTask(VariantFactory factory, String studyId, VariantFileMetadata fileMetadata, - VariantSetStatsCalculator variantStatsTask, - boolean generateReferenceBlocks, VariantNormalizer.VariantNormalizerConfig normalizerConfig) { + VariantSetStatsCalculator variantStatsTask, Task normalizer) { this.factory = factory; this.fileMetadata = fileMetadata; this.metadata = fileMetadata.toVariantStudyMetadata(studyId); @@ -83,14 +81,12 @@ public VariantTransformTask(VariantFactory factory, this.vcfCodec = null; this.converter = null; - this.normalizer = initNormalizer(fileMetadata, generateReferenceBlocks, normalizerConfig); - + this.normalizer = normalizer; } public VariantTransformTask(VCFHeader header, VCFHeaderVersion version, String studyId, VariantFileMetadata fileMetadata, - VariantSetStatsCalculator variantStatsTask, - boolean generateReferenceBlocks, VariantNormalizer.VariantNormalizerConfig normalizerConfig) { + VariantSetStatsCalculator variantStatsTask, Task normalizer) { this.variantStatsTask = variantStatsTask; this.factory = null; this.fileMetadata = fileMetadata; @@ -99,32 +95,17 @@ public VariantTransformTask(VCFHeader header, VCFHeaderVersion version, this.vcfCodec = new FullVcfCodec(); this.vcfCodec.setVCFHeader(header, version); this.converter = new VariantContextToVariantConverter(studyId, fileMetadata.getId(), fileMetadata.getSampleIds()); - this.normalizer = initNormalizer(fileMetadata, generateReferenceBlocks, normalizerConfig); - } - - private Task initNormalizer(VariantFileMetadata fileMetadata, boolean generateReferenceBlocks, - VariantNormalizer.VariantNormalizerConfig normalizerConfig) { - Task normalizer; - if (normalizerConfig == null) { - // Do not normalize - normalizer = t -> t; - } else { - normalizer = new VariantNormalizer(normalizerConfig) - .configure(fileMetadata.getHeader()); - } - if (generateReferenceBlocks) { - normalizer = normalizer - .then(new VariantSorterTask(100)) // Sort before generating reference blocks - .then(new VariantReferenceBlockCreatorTask(fileMetadata.getHeader())); - } - return normalizer; + this.normalizer = normalizer; } @Override - public void pre() { + public void pre() throws Exception { synchronized (variantStatsTask) { variantStatsTask.pre(); } + if (normalizer != null) { + normalizer.pre(); + } } @Override @@ -235,10 +216,13 @@ public List drain() throws Exception { } @Override - public void post() { + public void post() throws Exception { synchronized (variantStatsTask) { variantStatsTask.post(); } + if (normalizer != null) { + normalizer.post(); + } logger.debug("Time txt2hts: " + this.htsConvertTime.get()); logger.debug("Time hts2biodata: " + this.biodataConvertTime.get()); logger.debug("Time normalization: " + this.normTime.get()); diff --git a/opencga-storage/opencga-storage-core/src/main/resources/storage-configuration.yml b/opencga-storage/opencga-storage-core/src/main/resources/storage-configuration.yml index 8326723b476..e01b3b31c42 100644 --- a/opencga-storage/opencga-storage-core/src/main/resources/storage-configuration.yml +++ b/opencga-storage/opencga-storage-core/src/main/resources/storage-configuration.yml @@ -70,6 +70,11 @@ variant: transform.compression: "gzip" transform.failOnMalformed: true + normalization.skip: false # Skip normalization + normalization.referenceGenome: "" # Reference genome localization for improved normalization + normalization.extensions: [] # Enable VariantNormalizerExtensions + # - "VAF" # Compute EXT_VAF for each sample. Variant Allele Fraction (VAF), several variant callers supported + load.batchSize: 100 load.numThreads: 6 diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/transform/VariantStoragePipelineTransformTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/transform/VariantStoragePipelineTransformTest.java index 94a57eb5127..a42746feaa3 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/transform/VariantStoragePipelineTransformTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/transform/VariantStoragePipelineTransformTest.java @@ -16,11 +16,17 @@ package org.opencb.opencga.storage.core.variant.transform; +import org.hamcrest.CoreMatchers; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; +import org.opencb.biodata.models.variant.VariantFileMetadata; import org.opencb.biodata.models.variant.avro.VariantAvro; +import org.opencb.biodata.models.variant.avro.VariantType; +import org.opencb.biodata.models.variant.metadata.VariantFileHeaderComplexLine; +import org.opencb.biodata.tools.variant.normalizer.extensions.VafVariantNormalizerExtension; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.io.avro.AvroDataReader; import org.opencb.commons.utils.FileUtils; @@ -215,6 +221,37 @@ public void transformGvcf() throws Exception { assertEquals("1:31001-54321:N:.", list.get(1).toString()); } + @Test + public void transformNormalizeExtensions() throws Exception { + URI outputUri = newOutputUri(); + + VariantStorageEngine variantStorageManager = getVariantStorageEngine(); + variantStorageManager.getOptions().put(VariantStorageOptions.NORMALIZATION_EXTENSIONS.key(), "VAF"); + variantStorageManager.getOptions().put(VariantStorageOptions.STUDY.key(), "study1"); + + URI platinumFile = getPlatinumFile(0); + + StoragePipelineResult result = variantStorageManager.index(Collections.singletonList(platinumFile), outputUri, true, true, true).get(0); + List list = variantStorageManager.getVariantReaderUtils().getVariantReader(result.getTransformResult(), null) + .stream() + .filter(v -> !v.getType().equals(VariantType.NO_VARIATION)) + .collect(Collectors.toList()); + for (Variant variant : list) { + StudyEntry studyEntry = variant.getStudies().get(0); +// System.out.println(variant + " = " + variant.toJson()); + assertThat(studyEntry.getSampleDataKeys(), CoreMatchers.hasItem(VafVariantNormalizerExtension.EXT_VAF)); + int idx = studyEntry.getSampleDataKeys().indexOf(VafVariantNormalizerExtension.EXT_VAF); + assertNotNull(studyEntry.getSample(0).getData().get(idx)); + assertNotEquals("", studyEntry.getSample(0).getData().get(idx)); + } + + VariantFileMetadata variantFileMetadata = variantStorageManager.getVariantReaderUtils().readVariantFileMetadata(result.getTransformResult()); + List header = variantFileMetadata.getHeader().getComplexLines().stream() + .filter(f -> f.getKey().equals("FORMAT") && f.getId().equals(VafVariantNormalizerExtension.EXT_VAF)) + .collect(Collectors.toList()); + assertEquals(1, header.size()); + } + public int countLines(File outputFile) throws IOException { int numLines = 0; try (DataInputStream is = new DataInputStream(new FileInputStream(outputFile))) { From 5028cd54159a2f20c707ebc118639673cee0d1a6 Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 27 Jan 2021 14:11:26 +0100 Subject: [PATCH 028/412] storage: add permissions to RGA in solr, #1693 --- .../analysis/clinical/rga/RgaManager.java | 209 +++++++++++++++++- .../solr/converters/SolrConverterUtil.java | 20 ++ ...atalogSampleToSolrSampleConverterTest.java | 31 ++- .../core/rga/IndividualRgaConverter.java | 18 +- .../storage/core/rga/RgaDataModel.java | 33 ++- .../opencga/storage/core/rga/RgaEngine.java | 76 +------ .../src/main/resources/rga/managed-schema | 2 + .../storage/core/rga/RgaEngineTest.java | 11 +- 8 files changed, 307 insertions(+), 93 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java index 3dd20103f10..982f029809b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java @@ -1,17 +1,30 @@ package org.opencb.opencga.analysis.clinical.rga; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.common.SolrException; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.utils.CollectionUtils; import org.opencb.opencga.analysis.StorageManager; +import org.opencb.opencga.catalog.db.api.DBAdaptor; +import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.managers.FileManager; +import org.opencb.opencga.catalog.managers.IndividualManager; +import org.opencb.opencga.catalog.managers.SampleManager; import org.opencb.opencga.core.config.Catalog; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByVariant; import org.opencb.opencga.core.models.file.File; +import org.opencb.opencga.core.models.individual.Individual; +import org.opencb.opencga.core.models.individual.IndividualAclEntry; +import org.opencb.opencga.core.models.sample.Sample; +import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.storage.core.StorageEngineFactory; @@ -19,17 +32,23 @@ import org.opencb.opencga.storage.core.exceptions.RgaException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.exceptions.VariantSearchException; +import org.opencb.opencga.storage.core.io.managers.IOConnectorProvider; import org.opencb.opencga.storage.core.rga.RgaEngine; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Iterator; +import java.util.*; public class RgaManager extends StorageManager { private final RgaEngine rgaEngine; + private static final int KNOCKOUT_INSERT_BATCH_SIZE = 25; + public RgaManager(CatalogManager catalogManager, StorageEngineFactory storageEngineFactory) { super(catalogManager, storageEngineFactory); this.rgaEngine = new RgaEngine(getStorageConfiguration()); @@ -76,21 +95,191 @@ public void index(String studyStr, String fileStr, String token) throws CatalogE File file = catalogManager.getFileManager().get(studyStr, fileStr, FileManager.INCLUDE_FILE_URI_PATH, token).first(); - String collectionName = getCollectionName(study.getFqn()); - index(collectionName, Paths.get(file.getUri())); + load(study.getFqn(), Paths.get(file.getUri()), token); + } + + /** + * Load a multi KnockoutByIndividual JSON file into the Solr core/collection. + * + * @param path Path to the JSON file + * @param path Path to the JSON file + * @param path Path to the JSON file + * @param path Path to the JSON file + * @throws IOException + * @throws SolrException + */ + private void load(String study, Path path, String token) throws IOException, RgaException { + String fileName = path.getFileName().toString(); + if (fileName.endsWith("json") || fileName.endsWith("json.gz")) { + String collection = getCollectionName(study); + + try { + if (!rgaEngine.exists(collection)) { + rgaEngine.create(collection); + } + } catch (RgaException e) { + logger.error("Could not perform RGA index in collection {}", collection, e); + throw new RgaException("Could not perform RGA index in collection '" + collection + "'."); + } + + try { + IOConnectorProvider ioConnectorProvider = new IOConnectorProvider(storageConfiguration); + + // This opens json and json.gz files automatically + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( + ioConnectorProvider.newInputStream(path.toUri())))) { + Map> grantedPermissionMemberList = new HashMap<>(); + Map> deniedPermissionMemberList = new HashMap<>(); + + List knockoutByIndividualList = new ArrayList<>(KNOCKOUT_INSERT_BATCH_SIZE); + int count = 0; + String line; + ObjectReader objectReader = new ObjectMapper().readerFor(KnockoutByIndividual.class); + while ((line = bufferedReader.readLine()) != null) { + KnockoutByIndividual knockoutByIndividual = objectReader.readValue(line); + knockoutByIndividualList.add(knockoutByIndividual); + count++; + if (count % KNOCKOUT_INSERT_BATCH_SIZE == 0) { + checkMemberPermissions(knockoutByIndividualList, grantedPermissionMemberList, deniedPermissionMemberList, study, + token); + rgaEngine.insert(collection, knockoutByIndividualList, grantedPermissionMemberList, deniedPermissionMemberList); + logger.debug("Loaded {} knockoutByIndividual entries from '{}'", count, path); + knockoutByIndividualList.clear(); + } + } + + // Insert the remaining entries + if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { + checkMemberPermissions(knockoutByIndividualList, grantedPermissionMemberList, deniedPermissionMemberList, study, + token); + rgaEngine.insert(collection, knockoutByIndividualList, grantedPermissionMemberList, deniedPermissionMemberList); + logger.debug("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); + } + } + } catch (SolrServerException e) { + throw new RgaException("Error loading KnockoutIndividual from JSON file.", e); + } + } else { + throw new RgaException("File format " + path + " not supported. Please, use JSON file format."); + } } - private void index(String collection, Path path) throws RgaException, IOException { + /** + * Check VIEW_SAMPLE, VIEW_VARIANT and VIEW_INDIVIDUAL permissions for each individual/sample of the KnockoutByIndividual objects. + * If a member has all 3 permissions, it will be added to the grantedPermissionMemberList. + * If a member has some permissions set but missing any of the 3, it will be added to the deniedPermissionMemberList. + * + * @param knockoutByIndividualList List of KnockoutByIndividual objects. + * @param grantedPermissionMemberList Map containing the list of members for which permissions are satisfied. + * @param deniedPermissionMemberList Map containing the list of members for which permissions are revoked. + * @param study Study id. + * @param token Must be a valid 'opencga' administrator token. + * @throws RgaException if there is any problem retrieving the list of permissions from Catalog. + */ + private void checkMemberPermissions(List knockoutByIndividualList, + Map> grantedPermissionMemberList, + Map> deniedPermissionMemberList, String study, String token) + throws RgaException { + // Fetch all individual and sample ids + List individualIds = new ArrayList<>(knockoutByIndividualList.size()); + List sampleIds = new ArrayList<>(knockoutByIndividualList.size()); + for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividualList) { + individualIds.add(knockoutByIndividual.getId()); + sampleIds.add(knockoutByIndividual.getSampleId()); + } + + // Retrieve permissions for each individual/sample + QueryOptions options = new QueryOptions(SampleManager.INCLUDE_SAMPLE_IDS) + .append(DBAdaptor.INCLUDE_ACLS, true); + OpenCGAResult sampleResult; + try { + sampleResult = catalogManager.getSampleManager().get(study, sampleIds, options, token); + } catch (CatalogAuthorizationException e) { + throw new RgaException("Missing permissions to retrieve list of sample permissions", e.getCause()); + } catch (CatalogException e) { + throw new RgaException("Some samples were not found in catalog", e.getCause()); + } + + options = new QueryOptions(IndividualManager.INCLUDE_INDIVIDUAL_IDS) + .append(DBAdaptor.INCLUDE_ACLS, true); + OpenCGAResult individualResult; try { - if (!rgaEngine.exists(collection)) { - rgaEngine.create(collection); + individualResult = catalogManager.getIndividualManager().get(study, individualIds, options, token); + } catch (CatalogAuthorizationException e) { + throw new RgaException("Missing permissions to retrieve list of individual permissions", e.getCause()); + } catch (CatalogException e) { + throw new RgaException("Some individuals were not found in catalog", e.getCause()); + } + + // Set that will contain all member ids that were granted specific permissions + Set memberIds = new HashSet<>(); + + // Generate a map permissions>> + Map>> samplePermissions = new HashMap<>(); + Map>> individualPermissions = new HashMap<>(); + + for (Sample sample : sampleResult.getResults()) { + generateIntermediatePermissionMap(sample.getId(), sample.getAttributes(), samplePermissions, memberIds); + } + for (Individual individual : individualResult.getResults()) { + generateIntermediatePermissionMap(individual.getId(), individual.getAttributes(), individualPermissions, memberIds); + } + + if (!memberIds.isEmpty()) { + // Check permissions + for (int i = 0; i < individualIds.size(); i++) { + String individualId = individualIds.get(i); + String sampleId = sampleIds.get(i); + + Map> auxSamplePermissions = samplePermissions.get(sampleId); + Map> auxIndividualPermissions = individualPermissions.get(individualId); + for (String memberId : memberIds) { + Set individualAcls = auxIndividualPermissions.get(memberId); + Set sampleAcls = auxSamplePermissions.get(memberId); + + if (individualAcls != null && sampleAcls != null) { + // Only grant permissions at the document level if it has been granted all 3 permissions + if (individualAcls.contains(IndividualAclEntry.IndividualPermissions.VIEW.name()) + && sampleAcls.contains(SampleAclEntry.SamplePermissions.VIEW.name()) + && sampleAcls.contains(SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name())) { + addMemberToAclList(individualId, memberId, grantedPermissionMemberList); + } else { + addMemberToAclList(individualId, memberId, deniedPermissionMemberList); + } + } else if (individualAcls != null) { + // If VIEW_INDIVIDUAL permission is not granted, we will add this member to the list of revoked users + if (!individualAcls.contains(IndividualAclEntry.IndividualPermissions.VIEW.name())) { + addMemberToAclList(individualId, memberId, deniedPermissionMemberList); + } + } else if (sampleAcls != null) { + // If VIEW_SAMPLE or VIEW_VARIANTS permissions are not granted, we will add this member to the list of revoked users + if (!sampleAcls.contains(SampleAclEntry.SamplePermissions.VIEW.name()) + || !sampleAcls.contains(SampleAclEntry.SamplePermissions.VIEW_VARIANTS.name())) { + addMemberToAclList(individualId, memberId, deniedPermissionMemberList); + } + } + } } - } catch (RgaException e) { - logger.error("Could not perform RGA index in collection {}", collection, e); - throw new RgaException("Could not perform RGA index in collection '" + collection + "'."); } + } + + private void addMemberToAclList(String entryId, String memberId, Map> entryMemberListMap) { + if (!entryMemberListMap.containsKey(entryId)) { + entryMemberListMap.put(entryId, new LinkedList<>()); + } + entryMemberListMap.get(entryId).add(memberId); + } - rgaEngine.load(collection, path); + private void generateIntermediatePermissionMap(String id, Map attributes, + Map>> permissionMap, Set memberIds) { + Map> permissions = new HashMap<>(); + List> aclEntries = (List>) attributes.get("OPENCGA_ACL"); + for (Map entry : aclEntries) { + String memberId = (String) entry.get("member"); + permissions.put(memberId, new HashSet<>((List) entry.get("permissions"))); + memberIds.add(memberId); + } + permissionMap.put(id, permissions); } @Override diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/converters/SolrConverterUtil.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/converters/SolrConverterUtil.java index df4c8350ff1..3eda19dc793 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/converters/SolrConverterUtil.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/stats/solr/converters/SolrConverterUtil.java @@ -106,6 +106,15 @@ public static String type(QueryParam.Type type) { } } + /** + * Parse internal OpenCGA ACLs. + * + * Given a List> in the form [{member: user1, permissions: [VIEW, UPDATE]}, {member: user2, permissions: [DELETE]}], + * return a Map> containing {user1: [VIEW, UPDATE], user2: [DELETE]} + * + * @param internalPermissions List containing the permissions for each member. + * @return a map of permissions per member. + */ public static Map> parseInternalOpenCGAAcls(List> internalPermissions) { if (internalPermissions == null) { return new HashMap<>(); @@ -119,6 +128,17 @@ public static Map> parseInternalOpenCGAAcls(List getEffectivePermissions(Map> studyPermissions, Map> entityPermissions, String entity) { if (studyPermissions == null) { diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java index f9c8615ecb7..5d15bec20f9 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/db/mongodb/converters/CatalogSampleToSolrSampleConverterTest.java @@ -16,23 +16,26 @@ package org.opencb.opencga.catalog.db.mongodb.converters; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.collections4.map.HashedMap; import org.junit.Test; import org.opencb.biodata.models.pedigree.IndividualProperty; import org.opencb.opencga.catalog.stats.solr.SampleSolrModel; import org.opencb.opencga.catalog.stats.solr.converters.CatalogSampleToSolrSampleConverter; +import org.opencb.opencga.catalog.stats.solr.converters.SolrConverterUtil; +import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.models.common.Status; import org.opencb.opencga.core.models.individual.Individual; import org.opencb.opencga.core.models.individual.IndividualPopulation; import org.opencb.opencga.core.models.sample.Sample; +import org.opencb.opencga.core.models.sample.SampleAclEntry; import org.opencb.opencga.core.models.sample.SampleInternal; import org.opencb.opencga.core.models.study.Study; +import org.opencb.opencga.core.models.study.StudyAclEntry; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -43,10 +46,21 @@ public class CatalogSampleToSolrSampleConverterTest { @Test - public void SampleToSolrTest() { + public void SampleToSolrTest() throws JsonProcessingException { + ObjectMapper objectMapper = JacksonUtils.getDefaultObjectMapper(); Study study = new Study().setFqn("user@project:study").setAttributes(new HashMap<>()) .setVariableSets(Collections.singletonList(AnnotationHelper.createVariableSet())); + List> studyAclEntry = Arrays.asList( + objectMapper.readValue(objectMapper.writeValueAsString(new StudyAclEntry("user1", EnumSet.noneOf(StudyAclEntry.StudyPermissions.class))), Map.class), + objectMapper.readValue(objectMapper.writeValueAsString(new StudyAclEntry("user2", EnumSet.allOf(StudyAclEntry.StudyPermissions.class))), Map.class), + objectMapper.readValue(objectMapper.writeValueAsString(new StudyAclEntry("user3", EnumSet.allOf(StudyAclEntry.StudyPermissions.class))), Map.class), + objectMapper.readValue(objectMapper.writeValueAsString(new StudyAclEntry("user4", EnumSet.noneOf(StudyAclEntry.StudyPermissions.class))), Map.class) + ); + Map attributes = new HashMap<>(); + attributes.put("OPENCGA_ACL", SolrConverterUtil.parseInternalOpenCGAAcls(studyAclEntry)); + study.setAttributes(attributes); + Individual individual = new Individual(); individual.setUuid("uuid").setEthnicity("spanish").setKaryotypicSex(IndividualProperty.KaryotypicSex.XX). setPopulation(new IndividualPopulation("valencian", "", "")); @@ -57,7 +71,12 @@ public void SampleToSolrTest() { .setSomatic(true).setCreationDate(TimeUtils.getTime()) .setAnnotationSets(AnnotationHelper.createAnnotation()); - Map attributes = new HashedMap(); + List sampleAclEntry = Arrays.asList( + objectMapper.readValue(objectMapper.writeValueAsString(new SampleAclEntry("user1", EnumSet.of(SampleAclEntry.SamplePermissions.VIEW, SampleAclEntry.SamplePermissions.UPDATE))), Map.class), + objectMapper.readValue(objectMapper.writeValueAsString(new SampleAclEntry("user2", EnumSet.noneOf(SampleAclEntry.SamplePermissions.class))), Map.class) + ); + attributes = new HashMap<>(); + attributes.put("OPENCGA_ACL", sampleAclEntry); attributes.put("individual", individual); sample.setAttributes(attributes); diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java index 71763f14403..06fe6fda9f0 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/IndividualRgaConverter.java @@ -123,10 +123,18 @@ public List convertToDataModelType(List rgaD @Override public List convertToStorageType(List knockoutByIndividualList) { + throw new UnsupportedOperationException("Must call to overloaded method passing map of permissions"); + } + + public List convertToStorageType(List knockoutByIndividualList, + Map> grantedPermissionMemberList, + Map> deniedPermissionMemberList) { List result = new LinkedList<>(); for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividualList) { + String id = knockoutByIndividual.getId(); try { - result.addAll(convertToStorageType(knockoutByIndividual)); + result.addAll(convertToStorageType(knockoutByIndividual, grantedPermissionMemberList.get(id), + deniedPermissionMemberList.get(id))); } catch (RgaException | JsonProcessingException e) { logger.warn("Could not parse KnockoutByIndividualList: {}", e.getMessage(), e); } @@ -134,10 +142,14 @@ public List convertToStorageType(List knocko return result; } - private List convertToStorageType(KnockoutByIndividual knockoutByIndividual) + private List convertToStorageType(KnockoutByIndividual knockoutByIndividual, List authorisedMembers, + List unauthorisedMembers) throws RgaException, JsonProcessingException { List result = new LinkedList<>(); + List authorisedList = authorisedMembers != null ? authorisedMembers : Collections.emptyList(); + List unauthorisedList = unauthorisedMembers != null ? unauthorisedMembers : Collections.emptyList(); + if (knockoutByIndividual.getGenes() != null) { for (KnockoutByIndividual.KnockoutGene gene : knockoutByIndividual.getGenes()) { for (KnockoutTranscript transcript : gene.getTranscripts()) { @@ -182,7 +194,7 @@ private List convertToStorageType(KnockoutByIndividual knockoutByI RgaDataModel model = new RgaDataModel(id, individualId, knockoutByIndividual.getSampleId(), knockoutByIndividual.getSex().name(), phenotypes, disorders, gene.getId(), gene.getName(), "", "", "", 0, 0, transcript.getId(), transcript.getBiotype(), variantIds, knockoutTypes, filters, consequenceTypes, popFreqs, - compoundFilters, phenotypeJson, disorderJson, variantJson); + compoundFilters, phenotypeJson, disorderJson, variantJson, authorisedList, unauthorisedList); result.add(model); } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java index b7fe07daeeb..6df15d8692a 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaDataModel.java @@ -79,6 +79,12 @@ public class RgaDataModel { @Field private List variantJson; + @Field + private List authorised; + + @Field + private List unauthorised; + public static final String ID = "id"; public static final String INDIVIDUAL_ID = "individualId"; public static final String SAMPLE_ID = "sampleId"; @@ -103,6 +109,8 @@ public class RgaDataModel { public static final String PHENOTYPE_JSON = "phenotypeJson"; public static final String DISORDER_JSON = "disorderJson"; public static final String VARIANT_JSON = "variantJson"; + public static final String AUTHORISED = "authorised"; + public static final String UNAUTHORISED = "unauthorised"; public RgaDataModel() { } @@ -111,7 +119,8 @@ public RgaDataModel(String id, String individualId, String sampleId, String sex, String geneId, String geneName, String geneBiotype, String chromosome, String strand, int start, int end, String transcriptId, String transcriptBiotype, List variants, List knockoutTypes, List filters, List consequenceTypes, Map> populationFrequencies, - List compoundFilters, List phenotypeJson, List disorderJson, List variantJson) { + List compoundFilters, List phenotypeJson, List disorderJson, List variantJson, + List authorised, List unauthorised) { this.id = id; this.individualId = individualId; this.sampleId = sampleId; @@ -136,6 +145,8 @@ public RgaDataModel(String id, String individualId, String sampleId, String sex, this.phenotypeJson = phenotypeJson; this.disorderJson = disorderJson; this.variantJson = variantJson; + this.authorised = authorised; + this.unauthorised = unauthorised; } @Override @@ -165,6 +176,8 @@ public String toString() { sb.append(", phenotypeJson=").append(phenotypeJson); sb.append(", disorderJson=").append(disorderJson); sb.append(", variantJson=").append(variantJson); + sb.append(", authorised=").append(authorised); + sb.append(", unauthorised=").append(unauthorised); sb.append('}'); return sb.toString(); } @@ -384,4 +397,22 @@ public RgaDataModel setVariantJson(List variantJson) { this.variantJson = variantJson; return this; } + + public List getAuthorised() { + return authorised; + } + + public RgaDataModel setAuthorised(List authorised) { + this.authorised = authorised; + return this; + } + + public List getUnauthorised() { + return unauthorised; + } + + public RgaDataModel setUnauthorised(List unauthorised) { + this.unauthorised = unauthorised; + return this; + } } diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java index ad74d1b7bea..b8d5d3ac6a4 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/rga/RgaEngine.java @@ -1,7 +1,5 @@ package org.opencb.opencga.storage.core.rga; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.UpdateResponse; @@ -24,13 +22,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class RgaEngine implements Closeable { @@ -45,7 +40,6 @@ public class RgaEngine implements Closeable { private Logger logger; public static final String USE_SEARCH_INDEX = "useSearchIndex"; - private static final int KNOCKOUT_BATCH_SIZE = 25; public RgaEngine(StorageConfiguration storageConfiguration) { this.individualRgaConverter = new IndividualRgaConverter(); @@ -110,12 +104,17 @@ public boolean existsCollection(String collectionName) throws RgaException { * * @param collection Solr collection where to insert * @param knockoutByIndividualList List of knockoutByIndividual to insert + * @param grantedPermissionMemberList Map containing the list of members for which permissions are satisfied. + * @param deniedPermissionMemberList Map containing the list of members for which permissions are revoked. * @throws IOException IOException * @throws SolrServerException SolrServerException */ - public void insert(String collection, List knockoutByIndividualList) throws IOException, SolrServerException { + public void insert(String collection, List knockoutByIndividualList, + Map> grantedPermissionMemberList, Map> deniedPermissionMemberList) + throws IOException, SolrServerException { if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { - List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList); + List rgaDataModelList = individualRgaConverter.convertToStorageType(knockoutByIndividualList, + grantedPermissionMemberList, deniedPermissionMemberList); if (!rgaDataModelList.isEmpty()) { UpdateResponse updateResponse; @@ -127,28 +126,6 @@ public void insert(String collection, List knockoutByIndiv } } - /** - * Load a Solr core/collection from a Avro or JSON file. - * - * @param collection Collection name - * @param path Path to the file to load - * @throws IOException IOException - * @throws RgaException RgaException - */ - public void load(String collection, Path path) throws IOException, RgaException { - String fileName = path.getFileName().toString(); - if (fileName.endsWith("json") || fileName.endsWith("json.gz")) { - try { - loadJson(collection, path); - } catch (SolrServerException e) { - throw new RgaException("Error loading KnockoutIndividual from JSON file.", e); - } - } else { - throw new RgaException("File format " + path + " not supported. Please, use JSON file format."); - } - } - - /** * Return the list of KnockoutByIndividual objects from a Solr core/collection given a query. * @@ -393,43 +370,6 @@ public void close() throws IOException { solrManager.close(); } - /*------------------------------------- - * P R I V A T E M E T H O D S - -------------------------------------*/ - - /** - * Load a JSON file into the Solr core/collection. - * - * @param path Path to the JSON file - * @throws IOException - * @throws SolrException - */ - private void loadJson(String collection, Path path) throws IOException, SolrServerException { - // This opens json and json.gz files automatically - try (BufferedReader bufferedReader = Files.newBufferedReader(path)) { - List knockoutByIndividualList = new ArrayList<>(KNOCKOUT_BATCH_SIZE); - int count = 0; - String line; - ObjectReader objectReader = new ObjectMapper().readerFor(KnockoutByIndividual.class); - while ((line = bufferedReader.readLine()) != null) { - KnockoutByIndividual knockoutByIndividual = objectReader.readValue(line); - knockoutByIndividualList.add(knockoutByIndividual); - count++; - if (count % KNOCKOUT_BATCH_SIZE == 0) { - insert(collection, knockoutByIndividualList); - logger.debug("Loaded {} knockoutByIndividual entries from '{}'", count, path); - knockoutByIndividualList.clear(); - } - } - - // Insert the remaining entries - if (CollectionUtils.isNotEmpty(knockoutByIndividualList)) { - logger.debug("Loaded remaining {} knockoutByIndividual entries from '{}'", count, path); - insert(collection, knockoutByIndividualList); - } - } - } - public SolrManager getSolrManager() { return solrManager; } diff --git a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema index 0a144c034ad..2417593ac56 100644 --- a/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema +++ b/opencga-storage/opencga-storage-core/src/main/resources/rga/managed-schema @@ -590,6 +590,8 @@ + + 2.10.1 From fa20467eff2b273dc0d383ce93be5569c5c2f82a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Coll=20Morag=C3=B3n?= Date: Fri, 29 Jan 2021 11:15:17 +0000 Subject: [PATCH 030/412] server: Reuse RgaManager for different queries. Lazy initialize. Close on shutdown. --- .../analysis/clinical/rga/RgaManager.java | 10 ++++---- .../opencga/server/rest/OpenCGAWSServer.java | 9 +++++++ .../rest/analysis/ClinicalWebService.java | 24 +++++++++++++++---- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java index 3dd20103f10..25ee2c83978 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/rga/RgaManager.java @@ -6,7 +6,6 @@ import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.managers.FileManager; -import org.opencb.opencga.core.config.Catalog; import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByGene; import org.opencb.opencga.core.models.analysis.knockout.KnockoutByIndividual; @@ -18,15 +17,13 @@ import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.exceptions.RgaException; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; -import org.opencb.opencga.storage.core.exceptions.VariantSearchException; import org.opencb.opencga.storage.core.rga.RgaEngine; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Iterator; -public class RgaManager extends StorageManager { +public class RgaManager extends StorageManager implements AutoCloseable { private final RgaEngine rgaEngine; @@ -101,4 +98,9 @@ public void testConnection() throws StorageEngineException { private String getCollectionName(String study) { return catalogManager.getConfiguration().getDatabasePrefix() + "-rga-" + study.replace("@", "_").replace(":", "_"); } + + @Override + public void close() throws Exception { + rgaEngine.close(); + } } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java index bcb2e54ab5a..acbceb3fc1d 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java @@ -53,6 +53,7 @@ import org.opencb.opencga.core.response.RestResponse; import org.opencb.opencga.core.tools.ToolParams; import org.opencb.opencga.server.WebServiceException; +import org.opencb.opencga.server.rest.analysis.ClinicalWebService; import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.variant.io.json.mixin.GenotypeJsonMixin; @@ -354,6 +355,14 @@ static void shutdown() { } catch (Exception e) { logger.error("Error closing CatalogManager", e); } + try { + if (ClinicalWebService.rgaManagerAtomicRef.get() != null) { + logger.info("| * Closing RgaManager"); + ClinicalWebService.rgaManagerAtomicRef.get().close(); + } + } catch (Exception e) { + logger.error("Error closing RgaManager", e); + } logger.info("| OpenCGA destroyed"); logger.info("========================================================================\n"); } diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java index 80d2f7dd0b1..9c642c244a4 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/ClinicalWebService.java @@ -55,6 +55,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import static org.opencb.opencga.analysis.variant.manager.VariantCatalogQueryUtils.SAVED_FILTER_DESCR; import static org.opencb.opencga.core.api.ParamConstants.JOB_DEPENDS_ON; @@ -69,7 +70,7 @@ public class ClinicalWebService extends AnalysisWebService { private final ClinicalAnalysisManager clinicalManager; private final InterpretationManager catalogInterpretationManager; private final ClinicalInterpretationManager clinicalInterpretationManager; - private final RgaManager rgaManager; + public static final AtomicReference rgaManagerAtomicRef = new AtomicReference<>(); public ClinicalWebService(@Context UriInfo uriInfo, @Context HttpServletRequest httpServletRequest, @Context HttpHeaders httpHeaders) throws IOException, VersionException { @@ -78,7 +79,20 @@ public ClinicalWebService(@Context UriInfo uriInfo, @Context HttpServletRequest clinicalInterpretationManager = new ClinicalInterpretationManager(catalogManager, storageEngineFactory, opencgaHome); catalogInterpretationManager = catalogManager.getInterpretationManager(); clinicalManager = catalogManager.getClinicalAnalysisManager(); - rgaManager = new RgaManager(catalogManager, storageEngineFactory); + } + + private RgaManager getRgaManager() { + RgaManager rgaManager = rgaManagerAtomicRef.get(); + if (rgaManager == null) { + synchronized (rgaManagerAtomicRef) { + rgaManager = rgaManagerAtomicRef.get(); + if (rgaManager == null) { + rgaManager = new RgaManager(catalogManager, storageEngineFactory); + rgaManagerAtomicRef.set(rgaManager); + } + } + } + return rgaManager; } // public ClinicalWebService(String version, @Context UriInfo uriInfo, @Context HttpServletRequest httpServletRequest, @@ -663,7 +677,7 @@ public Response rgaIndividualQuery( QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); Query query = RgaQueryParams.getQueryParams(queryOptions); - return rgaManager.individualQuery(studyStr, query, queryOptions, token); + return getRgaManager().individualQuery(studyStr, query, queryOptions, token); }); } @@ -705,7 +719,7 @@ public Response rgaGeneQuery( QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); Query query = RgaQueryParams.getQueryParams(queryOptions); - return rgaManager.geneQuery(studyStr, query, queryOptions, token); + return getRgaManager().geneQuery(studyStr, query, queryOptions, token); }); } @@ -747,7 +761,7 @@ public Response rgaVariantQuery( QueryOptions queryOptions = new QueryOptions(uriInfo.getQueryParameters(), true); Query query = RgaQueryParams.getQueryParams(queryOptions); - return rgaManager.variantQuery(studyStr, query, queryOptions, token); + return getRgaManager().variantQuery(studyStr, query, queryOptions, token); }); } From 91bebaefb61e8fcd36300f56fba19901dd033b45 Mon Sep 17 00:00:00 2001 From: imedina Date: Wed, 3 Feb 2021 16:53:59 +0100 Subject: [PATCH 031/412] Fix CellBase compilation issue --- .../opencb/opencga/storage/core/utils/CellBaseUtils.java | 2 +- .../annotators/CellBaseRestVariantAnnotator.java | 2 +- .../core/variant/search/solr/VariantSearchManager.java | 2 +- .../storage/core/variant/search/VariantSearchTest.java | 7 +++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/utils/CellBaseUtils.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/utils/CellBaseUtils.java index 63479690a21..e2185703357 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/utils/CellBaseUtils.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/utils/CellBaseUtils.java @@ -22,8 +22,8 @@ import org.opencb.biodata.models.variant.exceptions.NonStandardCompliantSampleField; import org.opencb.biodata.tools.variant.VariantNormalizer; import org.opencb.cellbase.client.rest.CellBaseClient; -import org.opencb.cellbase.core.CellBaseDataResponse; import org.opencb.cellbase.core.ParamConstants; +import org.opencb.cellbase.core.result.CellBaseDataResponse; import org.opencb.cellbase.core.result.CellBaseDataResult; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java index c4ba64e2e5e..d24de1463e7 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/annotation/annotators/CellBaseRestVariantAnnotator.java @@ -21,7 +21,7 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.cellbase.client.config.ClientConfiguration; import org.opencb.cellbase.client.rest.CellBaseClient; -import org.opencb.cellbase.core.CellBaseDataResponse; +import org.opencb.cellbase.core.result.CellBaseDataResponse; import org.opencb.cellbase.core.result.CellBaseDataResult; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.opencga.storage.core.config.StorageConfiguration; diff --git a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java index 805ea86f73f..cfc2b48e126 100644 --- a/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java +++ b/opencga-storage/opencga-storage-core/src/main/java/org/opencb/opencga/storage/core/variant/search/solr/VariantSearchManager.java @@ -32,7 +32,7 @@ import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; import org.opencb.cellbase.client.rest.CellBaseClient; -import org.opencb.cellbase.core.CellBaseDataResponse; +import org.opencb.cellbase.core.result.CellBaseDataResponse; import org.opencb.commons.ProgressLogger; import org.opencb.commons.datastore.core.DataResult; import org.opencb.commons.datastore.core.FacetField; diff --git a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java index 412b33aa7e7..47f62fc8deb 100644 --- a/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java +++ b/opencga-storage/opencga-storage-core/src/test/java/org/opencb/opencga/storage/core/variant/search/VariantSearchTest.java @@ -12,8 +12,11 @@ import org.opencb.biodata.models.variant.avro.VariantAnnotation; import org.opencb.biodata.tools.variant.VariantVcfHtsjdkReader; import org.opencb.cellbase.client.rest.CellBaseClient; -import org.opencb.cellbase.core.CellBaseDataResponse; -import org.opencb.commons.datastore.core.*; +import org.opencb.cellbase.core.result.CellBaseDataResponse; +import org.opencb.commons.datastore.core.DataResult; +import org.opencb.commons.datastore.core.FacetField; +import org.opencb.commons.datastore.core.Query; +import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.solr.FacetQueryParser; import org.opencb.commons.utils.ListUtils; import org.opencb.opencga.core.common.JacksonUtils; From 92bc509e9d621696eae1582f5896fe9af9a94e50 Mon Sep 17 00:00:00 2001 From: Ignacio Medina Date: Thu, 4 Feb 2021 00:17:15 +0000 Subject: [PATCH 032/412] GitBook: [develop] 20 pages and 2 assets modified --- ...nalysis.alignment.webservices (1) (1).png} | Bin docs/about/contributing.md | 4 - docs/about/release-notes.md | 84 +-- docs/about/roadmap.md | 8 +- docs/case-studies/README.md | 2 - .../case-studies/genomics-england-research.md | 8 +- docs/installation/README.md | 8 - docs/installation/compute-cluster/README.md | 2 +- .../compute-cluster/building-from-source.md | 551 +++++++++--------- .../compute-cluster/configuration.md | 4 - .../compute-cluster/server-configuration.md | 27 +- docs/installation/docker.md | 6 +- docs/overview/data-management.md | 2 - docs/overview/data-models/README.md | 8 - docs/overview/data-models/sample.md | 6 +- docs/overview/features.md | 66 +-- docs/using-opencga/README.md | 4 - docs/using-opencga/client-libraries/README.md | 2 +- docs/using-opencga/iva-web-app.md | 6 - docs/using-opencga/public-demo.md | 6 +- docs/using-opencga/restful-web-service-api.md | 12 +- 21 files changed, 383 insertions(+), 433 deletions(-) rename docs/.gitbook/assets/{analysis.alignment.webservices (1) (1) (1).png => analysis.alignment.webservices (1) (1).png} (100%) diff --git a/docs/.gitbook/assets/analysis.alignment.webservices (1) (1) (1).png b/docs/.gitbook/assets/analysis.alignment.webservices (1) (1).png similarity index 100% rename from docs/.gitbook/assets/analysis.alignment.webservices (1) (1) (1).png rename to docs/.gitbook/assets/analysis.alignment.webservices (1) (1).png diff --git a/docs/about/contributing.md b/docs/about/contributing.md index 637b4921e9d..18dc48cd076 100644 --- a/docs/about/contributing.md +++ b/docs/about/contributing.md @@ -2,9 +2,5 @@ ## Source Code - - ## Contributing - - diff --git a/docs/about/release-notes.md b/docs/about/release-notes.md index 2ebdb5b99f1..78a2b945651 100644 --- a/docs/about/release-notes.md +++ b/docs/about/release-notes.md @@ -4,7 +4,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 2.0.0-RC1 \(June 2020\) -#### Catalog +### Catalog * \[**FEATURE**\] Improve audit \([\#1322](https://github.com/opencb/opencga/issues/1322), [\#1483](https://github.com/opencb/opencga/issues/1483)\) * \[**FEATURE**\] Allow queries based on permissions \([\#1486](https://github.com/opencb/opencga/issues/1486)\) @@ -48,7 +48,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * \[BUGFIX\] Unable to update "relatedFiles" list \([\#1451](https://github.com/opencb/opencga/issues/1451)\) * \[PERFORMANCE\] Move deleted documents to different collection \([\#1369](https://github.com/opencb/opencga/issues/1369)\) -#### Analysis +### Analysis * \[CLINICAL\] Tiering interpretation analysis for cancer \([\#1300](https://github.com/opencb/opencga/issues/1300)\) * \[VARIANT\] Implement Fisher Test Analysis MapReduce \([\#1361](https://github.com/opencb/opencga/issues/1361)\) @@ -62,7 +62,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * \[CLINICAL\] Implement the relatedness analysis based on IBD/IBS \([\#1521](https://github.com/opencb/opencga/issues/1521)\) * \[CLINICAL\] Implement genetic checks to compare with the reported results \([\#1522](https://github.com/opencb/opencga/issues/1522)\) -#### Variant Storage +### Variant Storage * \[**FEATURE**\] Support Hadoop3.x and HBase2.x \([\#925](https://github.com/opencb/opencga/issues/925)\) * \[**FEATURE**\] Divide opencga-storage-hadoop-deps in submodules \([\#1333](https://github.com/opencb/opencga/issues/1333)\) @@ -90,7 +90,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.4.2 \(June 2019\) -#### Catalog +### Catalog * \[CHANGE\] Rename web services from _/stats_ to _/aggregationStats_ \([\#1253](https://github.com/opencb/opencga/issues/1253)\) * \[BUGFIX\] Index fails when passing ":" instead of "/" \([\#1241](https://github.com/opencb/opencga/issues/1241)\) @@ -123,7 +123,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope -#### Variant Storage +### Variant Storage * \[CHANGE\] Rename filter "`transcriptionFlag`" to "`transcriptFlag`" \([\#1256](https://github.com/opencb/opencga/issues/1256)\) * \[BUGFIX\] HashMap$Node cannot be cast to java.util.HashMap$TreeNode \([\#1323](https://github.com/opencb/opencga/issues/1323)\) @@ -155,7 +155,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.4.0-rc1 \(August 2018\) -#### **Catalog** +### **Catalog** * \[IMPROVEMENT\] Recognise bigwig files automatically. \([\#283](https://github.com/opencb/opencga/issues#283)\) * \[IMPROVEMENT\] **Major improvements in annotationSets** \([\#635](https://github.com/opencb/opencga/issues#635), [\#772](https://github.com/opencb/opencga/issues#772), [\#849](https://github.com/opencb/opencga/issues#849)\): @@ -180,7 +180,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * Add new inmutable _**uuid**_ field to all entries. * \[FEATURE\] Create catalog solr sync mechanism and enable facet queries [\#875](https://github.com/opencb/opencga/issues#875) -#### Variant Storage +### Variant Storage * \[FEATURE\] Aggregate operation for all samples from a study in the Variant \([\#757](https://github.com/opencb/opencga/issues/757)\) * \[IMPROVEMENT\] Move HBase write step to a separated MR for fill-missing operation \([\#815](https://github.com/opencb/opencga/issues/815)\) @@ -225,7 +225,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.3.11 \(August 2019\) -#### **Catalog** +### **Catalog** * \[FEATURE\] Support "application users" \([\#1268](https://github.com/opencb/opencga/issues/1268)\) \(**migration required**\) → [https://github.com/opencb/opencga/blob/develop/opencga-app/app/migration/v1.4.2/catalog/migration.js\#L24](https://github.com/opencb/opencga/blob/develop/opencga-app/app/migration/v1.4.2/catalog/migration.js#L24) * \[FEATURE\] Add CRAM support \([\#1301](https://github.com/opencb/opencga/issues/1301)\) @@ -235,52 +235,52 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.3.10 \(February 2019\) -#### **Catalog** +### **Catalog** * \[FIX\] Remove base64 conversion of the secret key. * \[FIX\] Update pom dependencies to avoid conflicts. ## 1.3.9 \(January 2019\) -#### **Catalog** +### **Catalog** * \[FEATURE\] Support Azure AD authentication. * \[CHANGE\] Add _id_ to Group data model \(**migration required**\) → [https://github.com/opencb/opencga/blob/v.1.3.9/opencga-app/app/migration/v1.3.0/catalog/10\_add\_group-id.js](https://github.com/opencb/opencga/blob/v.1.3.9/opencga-app/app/migration/v1.3.0/catalog/10_add_group-id.js) ## 1.3.8 \(August 2018\) -#### **Catalog** +### **Catalog** * \[FIX\] Fix permission issue affecting users and groups with the "\_" symbol \([\#881](https://github.com/opencb/opencga/issues#881)\) ## 1.3.7 \(July 2018\) -#### **Catalog** +### **Catalog** * \[ENHANCEMENT\] Add new _tags_ field to the File data model \([\#855](https://github.com/opencb/opencga/issues#855)\) * \[CHANGE\] Configuration change. Add hooks to configuration file \([\#856](https://github.com/opencb/opencga/issues#856)\) ## 1.3.6 \(May 2018\) -#### **Catalog** +### **Catalog** * \[FIX\] Improve performance of sample queries filtering by individual \([\#843](https://github.com/opencb/opencga/issues#843)\) ## 1.3.5 \(May 2018\) -#### **Catalog** +### **Catalog** * \[FIX\] Fix issue when assigning permissions given the id\(s\) of different entities \([\#836](https://github.com/opencb/opencga/issues#836)\) ## 1.3.4 \(April 2018\) -#### **Catalog** +### **Catalog** * \[ENHANCEMENT\] Performance improvement when assigning permissions \([\#829](https://github.com/opencb/opencga/issues#829)\) ## 1.3.3 \(March 2018\) -#### **Catalog** +### **Catalog** * \[ENHANCEMENT\] Remove old deprecated fields from Family data model \([\#810](https://github.com/opencb/opencga/issues#810)\) * \[ENHANCEMENT\] Allow looking for Individuals and Families by a new sample field \([\#811](https://github.com/opencb/opencga/issues#811)\) @@ -290,14 +290,14 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.3.2 \(February 2018\) -#### **Catalog** +### **Catalog** * \[FIX\] Add missing individual-sample indexes \([\#790](https://github.com/opencb/opencga/issues#790)\) * \[FIX\] Fix smart name resolution \([\#791](https://github.com/opencb/opencga/issues#791)\) ## 1.3.1 \(February 2018\) -#### **Catalog** +### **Catalog** * \[FIX\] Propagation of permissions sample-individual not working \([\#780](https://github.com/opencb/opencga/issues#780)\) * \[ENHANCEMENT\] Ask for admin password automatically when using admin command line \([\#785](https://github.com/opencb/opencga/issues#785)\) @@ -305,12 +305,12 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.3.0 \(January 2018\) -#### General +### General * \[FEATURE\] Admin migration command line \([\#690](https://github.com/opencb/opencga/issues#690)\) * \[FEATURE\] Implement AutoComplete for CLI \([\#714](https://github.com/opencb/opencga/issues#714)\) -#### **Catalog** +### **Catalog** * \[REMOVE\] Remove ACL from data models. \([\#666](https://github.com/opencb/opencga/issues/666)\) * \[ENHANCEMENT\] Clean old code and refactoring. \([\#667](https://github.com/opencb/opencga/issues/667), [\#668](https://github.com/opencb/opencga/issues/668), [\#669](https://github.com/opencb/opencga/issues/669), [\#670](https://github.com/opencb/opencga/issues/670)\) @@ -332,7 +332,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * \[ENHANCEMENT\] Support a list of ids in all GET webservices \([\#727](https://github.com/opencb/opencga/issues/727)\) * \[CHANGE\] Internal modification: Change ACL delimiter used \([\#740](https://github.com/opencb/opencga/issues/740)\) -#### Variant Storage +### Variant Storage * \[FEATURE\] Make use of the new VariantMetadata model from Biodata \([\#673](https://github.com/opencb/opencga/issues#673)\) * \[FEATURE\] Major support of Symbolic variants in Variants Storage \([\#695](https://github.com/opencb/opencga/issues#695)\) @@ -353,7 +353,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.2.0 \(September 2017\) -#### **Catalog** +### **Catalog** * \[FIX\] Fix job search by input and output files. \([\#533](https://github.com/opencb/opencga/issues/533)\) * \[ENHANCEMENT\] Hide deprecated webservices. \([\#599](https://github.com/opencb/opencga/issues/599)\) @@ -374,7 +374,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * \[FEATURE\] Propagate permissions from samples to individuals. \([\#657](https://github.com/opencb/opencga/issues/657)\) * \[ENHANCEMENT\] Return HTTP 401 error code when user is not successfully logged in or the token is invalid. \([\#658](https://github.com/opencb/opencga/issues/658)\) -#### Variant Storage +### Variant Storage * \[FEATURE\] Improve Solr integration with VariantStorage when querying \([\#638](https://github.com/opencb/opencga/issues/638)\) * \[ENHANCEMENT\] Improve Solr variant iterator by using Solr cursors \([\#640](https://github.com/opencb/opencga/issues/)\) @@ -394,7 +394,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * \[FIX\] Avoid OutOfMemoryError updating storage metadata from catalog \([\#645](https://github.com/opencb/opencga/issues/645)\) * \[FIX\] Error indexing vcf files containing "variants" in the file name\([\#691](https://github.com/opencb/opencga/issues/691)\) -#### Relevant changes +### Relevant changes * CLI install changed and need two additional parameters 1: secretKey, algorithm * Configuration file has changed and need to be adopted on all opencga installation @@ -407,7 +407,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.1.0 \(June 2017\) -#### Catalog +### Catalog * \[ENHANCEMENT\] Support integers and floats type for variables. \([\#545](https://github.com/opencb/opencga/issues/545)\) * \[BUG\] Fix link race condition. \([\#551](https://github.com/opencb/opencga/issues/551)\) @@ -428,7 +428,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * \[ENHANCEMENT\] Add support to change _public/private_ User registration \([\#594](https://github.com/opencb/opencga/issues/594)\) * \[DEPRECATE\] Deprecate all _xx/create_ and _xx/update_ GET webservices. \([\#598](https://github.com/opencb/opencga/issues/598)\) -#### Variant Storage +### Variant Storage * \[FEATURE\] Make optional to merge non same overlapping variants in MongoDB \([\#574](https://github.com/opencb/opencga/issues/574)\) * \[FEATURE\] Implement a benchmark framework for OpenCGA Storage \([\#248](https://github.com/opencb/opencga/issues/248)\) @@ -438,7 +438,7 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * \[BUGFIX\] Fix ArrayIndexOutOfBounds when loading variants data \([\#597](https://github.com/opencb/opencga/issues/597)\) * \[FEATURE\] Add VCF export to gRPC command line \([\#606](https://github.com/opencb/opencga/issues/606)\) -#### Relevant changes - migration +### Relevant changes - migration * Add new permissions to admin user in the general configuration file. To add: VIEW\_STUDY, UPDATE\_STUDY and SHARE\_STUDY * Added sampleIds parameter in each individual entry. @@ -447,18 +447,18 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.0.2 -#### General +### General * \[BUGFIX\] Fix VCF output format \([\#584](https://github.com/opencb/opencga/issues/584)\) -#### Catalog +### Catalog * \[ENHANCEMENT\] New _dateOfBirth_ field added to Individual \([\#580](https://github.com/opencb/opencga/issues/580)\) and _somatic_ field to Sample \([\#576](https://github.com/opencb/opencga/issues/576)\) * \[ENHANCEMENT\] Performance improvement when annotating new variants \([\#575](https://github.com/opencb/opencga/issues/575)\) ## 1.0.0 \(February 2017\) -#### Catalog +### Catalog * \[FIX\] Authenticated users can now see public data \([\#501](https://github.com/opencb/opencga/issues/501)\) * Permissions assigned to _individuals_ are directly propagated to _samples_ \([\#509](https://github.com/opencb/opencga/issues/509)\) @@ -466,16 +466,16 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * \[CHANGED\] Permissions given to folders are now propagated in the database \([\#505](https://github.com/opencb/opencga/issues/505)\), this increase significantly the performance of the ACL resolution * \[CHANGED\] Changes in session data model \([\#479](https://github.com/opencb/opencga/issues/479)\) -#### Storage +### Storage * Complete the implementation of _exclude_ and _include_ of fields for Variant queries \([\#515](https://github.com/opencb/opencga/issues/515)\) -#### Clients +### Clients * \[Python\] new Python client implemented following the same architecture than Java and Javascript clients \([https://github.com/opencb/opencga/pull/516](https://github.com/opencb/opencga/pull/516)\). This improves the quality significantly and add many new features, thanks [Antonio Rueda](http://docs.opencb.org/display/~aruemar)! * Java and Javascript client libs use always POST when available -#### Server +### Server * \[REST\] Add new _files/create using_ POST to create new folders and files with some content \([\#514](https://github.com/opencb/opencga/issues/514)\) * \[REST\] Rename parameters from _acl/update_ \([2617993](https://github.com/opencb/opencga/commit/2617993fef6aefe06802da5d6dc590f7d099687a)\) @@ -487,19 +487,19 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope ## 1.0.0-rc3 \(January 2017\) -#### General +### General * Major changes in maven properties and configuration files. \([\#480](https://github.com/opencb/opencga/issues/480)\) * catalog-configuration.yml and configuration.yml have been merged. \([\#476](https://github.com/opencb/opencga/issues/476)\) -#### Catalog +### Catalog * Added support to fetch shared projects and studies. * Added organism information to the project data model. \([\#455](https://github.com/opencb/opencga/issues/455)\) * Renamed diskUsage and diskQuota for size and quota respectively in all data models were present. * Closed sessions are now removed from the array of sessions \(but they can still be found in the audit collection\). \([\#475](https://github.com/opencb/opencga/issues/475)\) -#### Storage +### Storage * Improve error handling for storage operations \([\#447](https://github.com/opencb/opencga/issues/447), [\#463](https://github.com/opencb/opencga/issues/463), [\#465](https://github.com/opencb/opencga/issues/465)\) * Add param --resume to opencga-analysis.sh and opencga-storage.sh command line \([\#465](https://github.com/opencb/opencga/issues/465)\) @@ -508,11 +508,11 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope * New top layer StorageManager connecting catalog with storage \([\#486](https://github.com/opencb/opencga/issues/486)\) * Shade proto and guava dependencies for Hadoop \([\#440](https://github.com/opencb/opencga/issues/440)\) -#### Server +### Server * Create and update webservices have been all implemented via POST. -#### Known issues +### Known issues * OpenCGA storage hadoop is not available in this version. To compile use this line: @@ -524,11 +524,11 @@ You can find more detailed information at [GitHub Issues](https://github.com/ope This release constitutes the first release candidate \(RC1\). This is the biggest release ever with more than **1,400 commits**, special mention to [**j-coll**](https://github.com/j-coll) and [**pfurio**](https://github.com/pfurio) for their contribution in Catalog, Storage and Server components. -#### General +### General * New command line interfaces \(CLI\) for users \(_opencga.sh_\), admins \(_opencga-admin.sh_\) and analysis \(_opencga-analysis.sh_\) -#### Catalog +### Catalog * New catalog configuration file using YAML. * New authorisation method. A big list of permission have been defined. @@ -537,13 +537,13 @@ This release constitutes the first release candidate \(RC1\). This is the bigges * New javascript, java and R client implementations. * Support for annotations in cohorts. -#### Storage +### Storage * Many performance improvements and fixes in MongoBD storage engine, the most notable include a new load strategy to improve file merging scalability * New storage engine based on **Apache HBase**, this is completely functional but is tagged as _beta_ until more tests are done. * New custom variant annotation implemented -#### Server +### Server * An experimental gRPC server implemented diff --git a/docs/about/roadmap.md b/docs/about/roadmap.md index c471e39fe38..f3e0d201bdf 100644 --- a/docs/about/roadmap.md +++ b/docs/about/roadmap.md @@ -5,7 +5,7 @@ In this section, you can find only the main top-level features planned for major ## OpenCGA 2.x Releases {% hint style="info" %} -From OpenCGA version 2.0.0 we follow **time-based releases**, two minor releases a year will be scheduled in April and October. +From OpenCGA version 2.0.0 we follow **time-based releases**, two minor releases a year will be scheduled in April and October. {% endhint %} ### 2.1.0 \(Apr 2021\) @@ -14,7 +14,7 @@ You can track GitHub issues at [GitHub Issues 2.1.0](https://github.com/opencb/o #### General -* Implement a **Centralised Log** analytic solution, we are planning to use Kibana **** +* Implement a **Centralised Log** analytic solution, we are planning to use Kibana _\*\*_ #### Catalog @@ -30,12 +30,8 @@ You can track GitHub issues at [GitHub Issues 2.1.0](https://github.com/opencb/o #### Clinical - - #### Analysis Framework - - #### Others * Implement **FIHR Genomics** API, this will allow FIHR applications to query genomic variants in OpenCGA diff --git a/docs/case-studies/README.md b/docs/case-studies/README.md index d0f7f42ecb7..449d8c7ce82 100644 --- a/docs/case-studies/README.md +++ b/docs/case-studies/README.md @@ -10,5 +10,3 @@ A total of 64,078 genomes were loaded into a small Hadoop cluster GEL Research. ### Microsoft Azure - - diff --git a/docs/case-studies/genomics-england-research.md b/docs/case-studies/genomics-england-research.md index 5d48afb9740..12bb6639abf 100644 --- a/docs/case-studies/genomics-england-research.md +++ b/docs/case-studies/genomics-england-research.md @@ -125,7 +125,7 @@ The loading performance always depend on the number of variants and concurrent f #### Saturation Study -As part of the data loading process we decided to study the number of unique variants added in each batch of 500 samples. We generated this saturation plot for RD38: +As part of the data loading process we decided to study the number of unique variants added in each batch of 500 samples. We generated this saturation plot for RD38: ![](http://docs.opencb.org/download/attachments/15598206/image.png?version=1&modificationDate=1560250247113&api=v2) @@ -249,7 +249,7 @@ To study the performance we used **RD38** which the largest study with 438 milli -As can be observed most queries run below 1 second, you can combine as many filters as wanted. +As can be observed most queries run below 1 second, you can combine as many filters as wanted. ### Clinical Analysis @@ -306,7 +306,7 @@ We also use here **RD38** which is the largest study. Clinical queries, or sampl -